String Ada字符串比较
我是Ada的新手,目前正在尝试编写一个包含if-else-if语句的简单程序。代码如下:String Ada字符串比较,string,ada,string-comparison,String,Ada,String Comparison,我是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 St
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分。关于我做错了什么的任何输入?对字符串的“=”
操作会比较整个字符串。如果用户输入的是“freshman”
,名称的值将是“freshman”
,而不是“freshman”
。阅读Get\u Line
程序的文档
您可能应该传递YearCode
一段Year
字符串,而不是整个字符串CharsRead
告诉您该切片应该是什么
具体而言,电话应为:
Put( YearCode(Year(Year'First..CharsRead)) );
下面是一个使用属性的不区分大小写的版本:
函数YearCode(名称:字符串形式)返回整数为
班级类型为(大一、大二、大三、大四);
开始
返回1+Class'Pos(Class'Value(Name));
例外
当CONSTRAINT_ERROR=>返回0时;
年底代码;
在缓冲区中有了这个额外的字符,我觉得您好像在用C语言思考字符串。你需要停止在语言中,Ada和C之间的字符串处理最为不同。
当C字符串以null结尾时,Ada字符串是而不是。相反,假设Ada字符串是字符串数组对象的大小。这只是一个简单的区别,但它在处理字符串的方式上有着巨大的影响
我在回答基本要点时对此进行了一些探讨,在Ada中,您总是试图动态地构建大小完美的字符串对象
遗憾的是,由于基于字符串缓冲区的输入,文本IO输入是一个传统上很难实现的地方。在这种情况下,您必须使用一个过大的string对象作为缓冲区,并使用返回值作为缓冲区定义区域的结尾,如Keith所示
但是,如果您有新版本的编译器,则可以使用Get_Line的函数版本来修复该问题。只需将中间两行更改为:
Put( YearCode(Get_Line) );
感谢您为新生工作,但之后的其他人仍在注册0。我的ifels语句有什么问题吗?@user1998581:我自己也试过,效果不错;我输入senior
,它会打印4
。请注意,CharsRead
的名称在这里有点误导。Im RM,称为Last
:此变量包含写入输入缓冲区的最后一个字符,而不是写入的字符数。当Year'First
大于1时,差异变得(尤其明显):正确的片段仍然是Year(Year'First..Last)
而且我注意到他的缓冲区只有9个字符长。这是可行的,但如果用户错误地输入了10个或更多的字符串,可能会表现出奇怪的行为。最好将缓冲区设置得不合理地大(例如:256,1K,诸如此类)。您的E-lisp程序应该有一个单独的问题。我已经回答了你的问题;这个答案与你的E-lisp程序无关。我想如果我问两个问题,我会被骂,但我会把它拿出来:|很抱歉,我已经编辑了你的Ada代码来更正缩进,并添加了和使用子句。我还冒昧地更新了您的标题和标签(真正的问题是字符串比较,而不是if
语句)。非常感谢。你帮了大忙。这里是大+1。这是我首选的方法,用于根据一组固定的允许命令字处理用户输入。再多做一点工作,您就可以得到一个版本,根据请求自动打印允许的命令(例如在contraint_错误处理程序中)。回到那一天,我甚至有一些很好的通用代码,可以使用DEC-SMG$调用自动创建菜单并处理给定枚举类型的菜单输入。