2011-05-15 65 views
2

我創建了一個將在GNAT Gcc編譯器中編譯的Ada程序4.3.0 我創建了一個由姓名,電話,地址和生日組成的記錄。 姓名,電話和地址將以無限字符串格式生成另一條記錄。這裏的目的是使一個地址簿管理系統。(很簡單的)Ada 05問題:搜索記錄向量中的特定元素?

type birthday is record 
    year : Positive; 
    month : Positive; 
    day : positive; 
end record; 

type contact_type is record 
    name : unbounded_string; 
    phone : unbounded_string; 
    address : unbounded_string; 
    bday : birthday; 
end record; 

我已經做插件(使用append),並刪除和列表功能。我需要搜索和排序功能才能完成。

事情是我做這個記錄(contact_type記錄)成一個向量。 現在我想從矢量中搜索其中一個元素/子類(無論你是否正確調用它)。

例如搜索名稱...或者地址等 但是,使用向量的find_index方法,我需要插入contact_type類型的另一個記錄,並且只有完全相同的元素纔會返回結果。

但我想要的是,如果我搜索一個名字,所有的名字元件,返回......

而且,纔有可能以「通用排序」的載體,姓名,地址,BDAY方面(所以我有三種不同的排序選項)

PS。 我正在寫的第一個Ada程序是一個通訊簿管理器... 我是一個完整的新手,我只有在C和Java的經驗,所以它會有點粗糙... (花了我很長一段時間找出如何標準輸入和輸出哈哈)

回答

2

如何簡單循環瀏覽內容?

function Find_Name (V : Vector; Name : String) return Contact_Type is 
    Position : Cursor := V.First; 
begin 
    while Position /= No_Element loop 
     if Element (Position).Name = Name then 
     return Element (Position); 
     end if; 
     Next (Position); 
    end loop; 
    return Empty_Contact; 
end Find_Name; 
+0

是的,這就是我實際上做的^^ – Heartinpiece 2011-05-16 13:56:55

2

而不是Find_Index,使用Iterate並傳遞一個子程序,檢查每個訪問記錄。

package Container is new Containers.Vectors (Natural, Contact_Type); 
List : Container.Vector; 
... 
procedure Visit (Position : Container.Cursor) is 
    C : Contact_Type := Container.Element(Position); 
begin 
    -- examine C 
end Visit; 
... 
List.Iterate (Visit'Access); 

您可以使用類似的模式來構造排序鍵。另見A.18.16 Array Sorting

附錄:由於@Simon Wright評論,在Containers.Vectors是一個更好的選擇。

+2

順便說一句,這種類型的處理是會得到更少的笨重在2012年與艾達加入「[別名參數(https://groups.google.com/group/ comp.lang.ada/MSG/f3cf2127fba052b9)」。 – 2011-05-15 17:17:02

+1

我認爲,而不是數組排序你應該看看[Ada.Containers中的包Generic_Sorting。Vectors](http://www.adaic.org/resources/add_content/standards/05rm/html/RM-A-18-2.html) – 2011-05-16 10:08:26

+0

@Simon Wright:好點。謝謝! – trashgod 2011-05-16 13:05:47

5

當我開始學習Ada時,我寫了一篇比較冗長的關於Ada.Containers.Vectors的Wiki文章。它幫助我記住了使用此軟件包時可以使用的所有選項。在這篇文章中有一些關於如何迭代矢量,如何搜索以及如何對它進行排序的例子。

http://wiki.ada-dk.org/index.php/Ada.Containers.Vectors

Enjoy! :o)

+0

神聖莫里!我真的依靠那個頁面來獲得我的基本代碼... – Heartinpiece 2011-05-16 05:56:28

+0

我希望如果那篇文章有更多的例子搜索記錄 – Heartinpiece 2011-05-16 05:57:27

1

@ oenone的答案很好,只要只有一個匹配元素。否則,可能會嘗試像

function Find_Name (V : Vector; Name : String) return Vector is 
    Position : Cursor := V.First; 
    Result : Vector; 
begin 
    while Position /= No_Element loop 
     if Element (Position).Name = Name then 
     Append (Result, Element (Position)); 
     end if; 
     Next (Position); 
    end loop; 
    return Result; 
end Find_Name;