2013-02-06 59 views
2

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

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

您的E-lisp程序应该在单独的问题中。我已经回答了你的Ada问题。该答案与您的E-lisp程序无关。 –

+0

我想如果我问两个我会被大喊,但我会把它拿出来:对不起 – ola

+0

我编辑了你的Ada代码来纠正缩进并添加'with'和'use'子句。我还冒着更新你的标题和标签的自由(真正的问题是字符串比较,而不是'if'语句)。 –

回答

6

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

您应该通过YearCode a 切片Year字符串,而不是整个字符串; CharsRead告诉你该切片应该是什么。

具体来说,调用应该是:

Put(YearCode(Year(Year'First..CharsRead))); 
+0

非常感谢你为新生工作,但其他人以后仍然注册0.我的ifels陈述有问题吗? – ola

+0

@ user1998581:我自己试了一下,它可以工作;我输入'senior'并打印'4'。 –

+0

了解它:)非常感谢你! – ola

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; 
+1

大+1。这是我处理用户输入时针对固定的一组允许的命令字的首选方法。有了更多的工作,你可以想出一个版本,根据请求自动打印允许的命令(例如在contraint_error处理程序中)。早在那一天,我甚至用过一些很好的通用代码,它们会自动为使用DEC SMG $调用的给定枚举类型创建菜单和处理菜单输入。 –

2

在你的缓冲区额外的字符,它看起来像你对我所想用C语言表示的字符串。你需要停止。 在语言的一切,字符串处理是艾达和C.

虽然C字符串是空终止之间的差异最大,阿达字符串。相反,Ada字符串被假定为字符串数组对象的大小。它有一个简单的区别,但它对于如何处理字符串有巨大的影响。

在我对How to I build a string from other strings in Ada?的回答中,我对此有所了解基本要点是,在Ada中,您总是尝试在飞行中构建完美大小的字符串对象。

不幸的是,由于其基于字符串缓冲区的输入,Text_IO输入是传统上很难实现的一个地方。在这种情况下,您不得不使用过大的字符串对象作为缓冲区,并使用返回的值作为缓冲区的已定义区域的末尾,如Keith所示。

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

Put(YearCode(Get_Line));      
+0

Ada 2012赢得胜利! –