我是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。关于我做错了什么的任何输入?
答案 0 :(得分:6)
字符串上的"="
操作会比较整个字符串。如果用户的输入为"freshman"
,则Name
的值为"freshman "
,而不是"freshman"
。阅读Get_Line
程序的文档。
你应该传递YearCode
字符串的Year
slice ,而不是整个字符串; CharsRead
告诉你切片应该是什么。
具体来说,呼叫应该是:
Put( YearCode(Year(Year'First..CharsRead)) );
答案 1 :(得分: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;
答案 2 :(得分:2)
在你的缓冲区中有了这个额外的字符,我觉得你在想C语言中的字符串。你需要阻止它。 在语言的所有内容中,字符串处理在Ada和C之间是最不同的。
当C字符串以空值终止时,Ada字符串不。相反,Ada字符串被假定为字符串数组对象的大小。它只是一个简单的区别,但它对你处理字符串的方式产生了巨大的影响。
我在回答How to I build a string from other strings in Ada?时对此有所了解。基本的要点是,在Ada中,你总是尝试在运行中构建完美大小的字符串对象。
可悲的是,由于基于字符串缓冲区的输入,Text_IO输入传统上非常难以实现。在这种情况下,你被迫使用一个过大的字符串对象作为缓冲区,并使用返回的值作为缓冲区定义区域的末尾,正如Keith所示。
但是,如果您有新版本的编译器,则可以使用Get_Line的函数版本来修复它。只需将您的中间两行更改为:
Put( YearCode(Get_Line) );