0

標準入力 (テキスト ファイル) から読み取り、次のように並べられたデータを使用して計算を行っています。

 2 --This states the amount of following sets of info
 150 -- this is the first set of data
 250 -- this is the second set of data
 0 -- this is supposed to tell my program that this is the end of the two sets but
      keep looping because there might be multiple sets in here, seperated by "0"'s. 

私のADAプログラムの基本的な概要:

procedure test is

begin 

  while not end_of_file loop
  ......//my whole program executes


  end loop;
end test; 

読み取るものがなくなるまでループし続けるようにプログラムに指示する方法を知りたいのですが、ゼロがデータセットを分離し、各「0」の後にさらにデータがある場合はループし続けることに注意してください。

4

2 に答える 2

3

このプログラムは、ループを途中で終了する必要がなく、要件を満たすと思います。

with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
with Ada.Text_Io; use Ada.Text_Io;

procedure Reading_Data is
begin
   while not End_Of_File loop
      declare
         Number_Of_Sets : Natural;
      begin
         Get (Number_Of_Sets);
         if Number_Of_Sets > 0 then
            declare
               Sum : Integer := 0;
            begin
               for J in 1 .. Number_Of_Sets loop
                  declare
                     Tmp : Integer;
                  begin
                     Get (Tmp);
                     Sum := Sum + Tmp;
                  end;
               end loop;
               Put ("sum of");
               Put (Number_Of_Sets);
               Put (" elements is ");
               Put (Sum);
               New_Line;
            end;
         end if;
      end;
   end loop;
end Reading_Data;

ただし、セット間のセパレーターは必要ありません。ただ「これは要素のないセットです。無視してください」という意味です。00

さて、これがデータの一貫性をチェックする必要がある問題からの縮小された例である場合 (つまり、2 つの要素を約束した場合、2 つの要素を読み取った後、ファイルの最後にあるか、 がある場合0)、この解決策は正しくありません。declare(そして、変数の範囲を最小化するためにブロックを使いすぎたと思うかもしれません...)

入力あり:

1
10
0
2
20 30
3 40 50 60

プログラムは出力を提供します:

sum of          1 elements is          10
sum of          2 elements is          50
sum of          3 elements is         150
于 2015-02-14T15:04:59.227 に答える
1

ラベルを使用してループを記述します。

Until_Loop :
   While not end_of_file loop

      X := X + 1;
      ......//my whole program executes;

      exit Until_Loop when X > 5;//change criteria to something 
                                 //relating to no more files 
                                 //(whatever that will be)
   end loop Until_Loop;  

編集- コメント内のネストされたループに関する質問:

例: ここから

Named_Loop:
   for Height in TWO..FOUR loop
      for Width in THREE..5 loop
         if Height * Width = 12 then
            exit Named_Loop;
         end if;
         Put("Now we are in the nested loop and area is");
         Put(Height*Width, 5);
         New_Line;
      end loop;
   end loop Named_Loop;
于 2015-02-12T22:25:57.070 に答える