Программа переходит в рекурсию,но не могу выявить где
Выводит:(Среднее значение компани third ,> среднего значения) происходит бесконечно
Документ:
first 10 1
second 200 5
third 1000 15введите сюда код
Код:
var
i,p,u,sum,num,midle1,midle2:integer;
a:text;
en3:=Encoding.GetEncoding(65001);
s:string;
x:array of string;
begin
assign(a, 'C:\Users\Артём\OneDrive\Рабочий стол\проги и отчёты паскаль\for pasc.txt');
reset(a, en3);
while not EOF(a) do
begin
readln(a, s);
x := s.Split(' ');
val(x[1], i, p);
sum := sum + i;
val(x[2], u, p);
num := num + u;
end;
midle1 := round(sum / num);
writeln('Среднее значение по городу: ', midle1);
close(a);
reset(a, en3);
while not EOF(a) do
begin
x := s.Split(' ');
val(x[1], i, p);
val(x[2], u, p);
midle2 := round(i / u);
if midle2 >= midle1 then
writeln('Среднее значение компани ', x[0], ' ,> среднего значения')
else
writeln('Среднее значение компани ', x[0], ' ,< среднего значения')
end;
end.
Задание:в документе расположены 1-название компании,2-кол\во расходуемого топлива,3-кол\во машин.Нужно найти средние значения расхода по городу и относительно кажной машины и сравнить как значение компании-общее значение. Спасибо за ответ)
Ответы (1 шт):
сравните
while not EOF(a) do
begin
readln(a, s);
x := s.Split(' ');
val(x[1], i, p);
sum := sum + i;
val(x[2], u, p);
num := num + u;
end;
и
while not EOF(a) do
begin
x := s.Split(' ');
val(x[1], i, p);
val(x[2], u, p);
midle2 := round(i / u);
if midle2 >= midle1 then
writeln('Среднее значение компани ', x[0], ' ,> среднего значения')
else
writeln('Среднее значение компани ', x[0], ' ,< среднего значения')
end;
во втором случае не достигается конец файла, потому что вы из файла ничего не вычитываете
где у вас:
readln(a, s);
в итоге вы работаете со старым значением s, которое осталось от прошлой работы с файлом и содержит в себе последнюю строку
P.S.
ну и входит программа не в рекурсию, а просто в бесконечный цикл
P.P.S.
совет - форматируйте свой код, разбивая его пробелами/табуляциями и пустыми строками на логические блоки, это позволит допускать меньше ошибок и быстрее их замечать