3

我是 Ada 的新手,目前正在尝试编写一个涉及 if-else if 语句的简单程序。代码如下:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Year_Codes is

  Year : String(1..9) := "         ";
  CharsRead : Natural;

  function YearCode(Name : in String) return Integer is
  begin
    if(Name = "freshman")then
      return 1;
    elsif(Name = "sophomore")then
      return 2;
    elsif(Name = "junior")then
      return 3;
    elsif(Name = "senior")then
      return 4;
    else
      return 0;
    end if;
  end YearCode;


begin
  Put("Enter your academic year: ");           -- Prompt for input
  Get_Line(Year, CharsRead);                   -- Input
  Put( YearCode(Year) );                       -- Convert and output
  New_Line;
end Year_Codes;

每个答案我都得到 0。关于我做错了什么的任何意见?

4

3 回答 3

7

对字符串的"="操作比较整个字符串。如果用户的输入是"freshman",则 的值为,Name"freshman "不是"freshman"。阅读该Get_Line过程的文档。

您可能应该传递字符串YearCode的一部分,而不是整个字符串;告诉你那个切片应该是什么。YearCharsRead

具体来说,调用应该是:

Put( YearCode(Year(Year'First..CharsRead)) );
于 2013-02-06T22:05:27.517 回答
3

这是使用属性的不区分大小写的版本:

function YearCode(Name : in String) return Integer is
    Type Class is (Freshman, Sophmore, Junior, Senior);
begin
    Return 1 + Class'Pos(Class'Value(Name));  
exception
    When CONSTRAINT_ERROR => Return 0;
end YearCode;
于 2013-02-07T07:37:26.467 回答
2

有了缓冲区中的额外字符,在我看来,您正在考虑 C 语言中的字符串。你需要阻止它。在语言中的所有内容中,字符串处理是 Ada 和 C 之间最大的不同。

虽然 C 字符串以 null 结尾,但 Ada 字符串不是. 相反,Ada 字符串被假定为字符串数组对象的大小。这是一个简单的区别,但它对您处理字符串的方式产生了巨大的影响。

我在回答如何从 Ada 中的其他字符串构建字符串?基本要点是,在 Ada 中,您总是尝试动态构建完美大小的字符串对象。

遗憾的是,Text_IO 输入是传统上很难做到这一点的地方,因为它是基于字符串缓冲区的输入。在这种情况下,您被迫使用过大的字符串对象作为缓冲区,并使用返回的值作为缓冲区定义区域的结尾,如 Keith 所示。

但是,如果您有新版本的编译器,您可以使用 Get_Line 的函数版本来修复它。只需将中间两行更改为:

Put( YearCode(Get_Line) );                       
于 2013-02-08T09:50:49.183 回答