Как перебрать несколько наборов данных из стандартного ввода

Я читаю из стандартного ввода (текстовый файл и делаю расчеты с данными, которые выстроены так:

 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" больше данных.

2 ответа

Я думаю, что эта программа будет соответствовать вашим требованиям, без необходимости преждевременного выхода из циклов:

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;

Тем не менее, это не нужно 0 разделитель между наборами; 0 просто означает "это набор без элементов, игнорируйте его".

Теперь, если это уменьшенный пример из проблемы, где вам нужно проверить согласованность данных (т.е. если вы обещали 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

Напишите свой цикл, используя метки:

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;
Другие вопросы по тегам