2011-05-15 45 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;