3

私はAdaを初めて使用し、現在、if-elseifステートメントを含む単純なプログラムを作成しようとしています。コードは次のとおりです。

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 文字列は文字列配列オブジェクトのサイズであると見なされます。単純な違いですが、文字列の処理方法に大きな影響を与えます。

How to I build a string from other strings in Ada? への回答で、これについて少し説明します。基本的な要点は、Ada では常に完璧なサイズの文字列オブジェクトをその場で構築しようとすることです。

悲しいことに、Text_IO 入力は、文字列バッファーベースの入力のために、これまで非常に困難だった場所の 1 つです。その場合、キースが示したように、過度に大きな文字列オブジェクトをバッファーとして使用し、戻り値をバッファーの定義済み領域の最後として使用する必要があります。

ただし、新しいバージョンのコンパイラを使用している場合は、関数バージョンの Get_Line を使用して修正できます。真ん中の 2 行を次のように変更するだけです。

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