0

私の目標は、標準入力から方程式を受け取り、それを後で使用/再印刷するために配列に保存してから、方程式全体と答えを出力する行を出力することです。

入力: 2+3=

出力: 2 + 3 = 5

Ada では動的文字列などを使用できないため、これを行う方法について非常に混乱しています。

これは、私が疑似コードで持っている大まかなアイデアです..

 Until_loop:                 
       loop 

         get(INT_VAR);
         --store the int in the array?
         get(OPERATOR_VAR);
         --store the operator in the following index of that array? and
         --repeat until we hit the equal sign, signaling end of the equation

         get(CHECK_FOR_EQUALSIGN);
     exit Until_loop when CHECK_FOR_EQUALSIGN = "=";

     end loop Until_loop;

 --now that the array is filled up with the equation, go through it and do the math
 --AND print out the equation itself with the answer

配列は次のようになるはずだと思います。

[2][+][5][=][7]

私もAdaの初心者なので、理解するのはさらに難しく、Javaはとても得意ですが、強く型付けされた構文に慣れることができません。さらに情報が必要な場合はお尋ねください。

4

3 に答える 3

3

Ada は、Unbounded_String や Containers、割り当てやポインターに頼ることなく、動的固定文字列を使用できますが、これらはオプションです。

これを可能にする洞察は、文字列が宣言されたときに初期化式からそのサイズを取得できるということですが、その宣言はループ内にある可能性があるため、ループを回すたびに新たに実行されます。これが理にかなっているようなプログラムを常に構築できるとは限りませんが、驚くほど頻繁に、少し考えれば可能です。

もう 1 つの特徴は、後でこれらの「宣言」ブロックが、プロシージャーへの非常に簡単なリファクタリングの優れた候補になることです。

with Ada.Text_IO; use Ada.Text_IO;

procedure Calculator is
begin
   loop
      Put("Enter expression: ");
      declare
         Expression : String := Get_Line;
      begin
         exit when Expression = "Done";
         -- here you can parse the string character by character
         for i in Expression'range loop
            put(Expression(i));
         end loop;
         New_Line;
      end;
   end Loop;
end Calculator;

あなたは得るべきです

brian@Gannet:~/Ada/Play$ gnatmake calculator.adb
gcc-4.9 -c calculator.adb
gnatbind -x calculator.ali
gnatlink calculator.ali
brian@Gannet:~/Ada/Play$ ./calculator
Enter expression: hello
hello
Enter expression: 2 + 2 =
2 + 2 =
Enter expression: Done
brian@Gannet:~/Ada/Play$ 

あなたはまだ電卓を書かなければなりません...

于 2015-03-01T11:13:19.367 に答える
1

可変長文字列を入力するだけの場合は、文字列を解析して評価するエバリュエーターに送信し、計算された値とともにそれを反映させます。動的文字列処理には、単純にUnbounded_Stringsを使用できます。 Unbounded_IO :

with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO;
use Ada.Text_IO;

procedure Evaluate_Expression is

   function Evaluate (E : Unbounded_String) return Unbounded_String is
   begin
      ...
   end Evaluate;

   Expression : Unbounded_String;

begin
   Put("Input: ");
   Get_Line(Expression);  -- This is Unbounded_IO.Get_Line.
   Put_Line(To_Unbounded_String("Output: ")
            & Expression
            & To_Unbounded_String(" = ")
            & Evaluate(Expression));
end Evaluate_Expression;
于 2015-03-01T00:30:37.947 に答える