Как перебрать несколько наборов данных из стандартного ввода
Я читаю из стандартного ввода (текстовый файл и делаю расчеты с данными, которые выстроены так:
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;