Программа переходит в рекурсию,но не могу выявить где

Выводит:(Среднее значение компани 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 шт):

Автор решения: Zhihar

сравните

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.

совет - форматируйте свой код, разбивая его пробелами/табуляциями и пустыми строками на логические блоки, это позволит допускать меньше ошибок и быстрее их замечать

→ Ссылка