2016-02-21 46 views
1

我想了解結構。這是我的東西Inderminate長度的結構

Structure Tbook 
    Dim ISBN As String 
    Dim Title As String 
    Dim Price As Double 
    Dim YearOfPub As Integer 
End Structure 
Dim books(2) As Tbook 

看起來很簡單。然後我嘗試填充它。但是,我使用了While循環,因爲我不需要填充3條記錄。相反,我想選擇何時終止數據輸入。讓我假裝我添加1條記錄不是3

Sub myStructure() 
    Dim answer As Char 
    Dim i As Integer = 0 
    While i < 2 
     Console.WriteLine("Enter details") 
     Console.WriteLine("ISBN : ") 
     books(i).ISBN = Console.ReadLine() 
     Console.WriteLine("Title : ") 
     books(i).Title = Console.ReadLine() 
     Console.WriteLine("Price : ") 
     books(i).Price = Console.ReadLine() 
     Console.WriteLine("Year of Publication : ") 
     books(i).YearOfPub = Console.ReadLine() 
     i = i + 1 
     If i < 2 Then 
      Console.WriteLine("Add another book? Y/N") 
      answer = Console.ReadLine().ToUpper 
      If answer = "N" Then 
       i = 3 
      End If 
     End If 
    End While 

最後,我想打印出我有什麼。我在這裏使用了一個For Loop,這顯然是錯誤的。這個代碼將打印出3條記錄,但在我的例子中 - 只有其中的一條將有數據。

For i = 0 To 2 
     Console.WriteLine("==================================") 
     Console.WriteLine("ISBN : " & books(i).ISBN) 
     Console.WriteLine("Title : " & books(i).Title) 
     Console.WriteLine("Price : " & books(i).Price) 
     Console.WriteLine("Year of Publication : " & books(i).YearOfPub) 
     Console.WriteLine("==================================") 
     Console.WriteLine("") 
Next 
Console.ReadKey() 

小罐與周圍像這樣的代碼給我留下了可以幫助別人

一)是否有可能產生不確定的大小結構的幾個問題嗎?

B)如果不是老要「補」與記錄

C)的結構。如果你可以「部分填充」之一,你怎麼只打印這些記錄

非常感謝的人有耐心解釋這對我(和希望其他人)

+1

你需要看看[清單(中T)(https://msdn.microsoft.com/en-us/ library/6sh2ey19(v = vs.110).aspx) – Steve

+1

如果不是數組,你使用了'List(of TBook)',你的代碼只能添加完整/整本書。您可能想要閱讀[在類和結構之間選擇](https://msdn.microsoft.com/en-us/library/ms229017.aspx)。如果您想在List控件(或DGV)中顯示這些項目,則帶有字段的結構將需要大量額外的工作。 BTW neihter不確定長度的結構或數組re - 你可能沒有任何數據在某些元素 – Plutonix

回答

1

這是你的代碼重寫,使用一個通用List(Of TBook)

' This should be declared at the global level if you want to use' 
' it everywhere in this class or module.' 
Dim books As List(Of Tbook) = new List(Of Tbook) 

Sub myStructure() 
    Dim answer As Char 
    Dim i As Integer = 0 
    While True 
     Dim book As Tbook 
     Console.WriteLine("Enter details") 
     Console.WriteLine("ISBN : ") 
     book.ISBN = Console.ReadLine() 
     Console.WriteLine("Title : ") 
     book.Title = Console.ReadLine() 
     Console.WriteLine("Price : ") 
     Dim input = Console.ReadLine() 
     Double.TryParse(input, book.Price) 
     Console.WriteLine("Year of Publication : ") 
     book.YearOfPub = Console.ReadLine() 
     books.Add(book) 
     Console.WriteLine("Add another book? Y/N") 
     answer = Console.ReadLine().ToUpper 
     If answer = "N" Then 
      Exit While 
     End If 
    End While 
End Sub 

這裏,而不是爲h如果有一個固定大小的數組,您有一個類型爲List(Of TBook)的變量,您可以在循環中添加一個TBook,直到您停止輸入循環。

請注意,當您在每個循環中都不需要分配新元素時,您可以直接將它添加到列表中,因爲它是TBook。最後關注價格字段的輸入。它是一個double,並直接從ReadLine中分配,返回一個字符串是需要避免的。您有Option Strict設置爲關閉,否則此代碼無法編譯。

當然從列表(中TBook)讀的是

For Each book In books 
    Console.WriteLine("==================================") 
    Console.WriteLine("ISBN : " & book.ISBN) 
    Console.WriteLine("Title : " & book.Title) 
    Console.WriteLine("Price : " & book.Price) 
    Console.WriteLine("Year of Publication : " & book.YearOfPub) 
    Console.WriteLine("==================================") 
    Console.WriteLine("") 
Next 
+0

謝謝。對不起,我花了一段時間來回應 - 我想了解你的迴應,並在List(Of T)上閱讀。這給了我很多思考和進一步學習的極好跳板。非常感謝! – MissDizy

+0

@史蒂夫史蒂夫,史蒂夫,我似乎執行您的建議有問題。我將我在代碼頂部的結構保留下來,然後用你非常友善的新代碼取代我的結構。但是,VB在任何包含'books.Add(book)'和'For Each book in Books'的行中都有問題。錯誤顯示'書籍未被聲明'。我一定在做一些相當愚蠢的事情。 – MissDizy

+0

缺少書籍宣言。立即修復 – Steve