Песни о Паскале | страница 111
> Writeln(OutFile, Counter, Cnt, Sum, Rating);
> end
> else { а если оценок не было }
> Writeln(OutFile, Counter, ' Ученик не аттестован');
>end;
> {----- Главная программа -----}
>begin
> Counter:= 0; { обнуляем счетчик строк }
> { открываем входной файл }
> Assign(InFile,'P_30_1.in'); Reset(InFile);
> { создаем выходной файл }
> Assign(OutFile,' P_30_1.out'); Rewrite(OutFile);
> { выводим шапку таблицы }
> Writeln(OutFile, 'Номер Количество Сумма Средний');
> Writeln(OutFile, 'ученика оценок баллов балл');
> { пока не конец входного файла… }
> while not Eof(InFile) do begin
> Counter:= Counter+1; { наращиваем счетчик строк }
> HandleString; { обрабатываем строку }
> end;
> { закрываем оба файла }
> Close(InFile); Close(OutFile);
>end.
Скомпилировали программу? Тогда подготовьте входной файл с оценками учеников (без фамилий). Назовите его «P_30_1.in» и сохраните, как обычно, в рабочем каталоге. Можно запускать? В общем-то, да. Но будьте настороже, – ошибки караулят нас на каждом шагу! Возьмите за правило первый прогон своих программ выполнять в пошаговом режиме. Поступим так и в этот раз.
Переключитесь в окно программы и для исполнения одного шага нажмите клавишу F7. Продолжайте нажимать её, наблюдая за ходом выполнения операторов. При желании добавьте в окно обзора переменных «Watch» глобальную переменную Counter.
После нескольких шагов вы попадете внутрь процедуры HandleString и благополучно пройдете по ней. На следующем цикле главной программы вновь войдете туда же, но теперь вас ждут «чудеса». Во-первых, цикл
> while not Eoln(InFile)
уже не выполняется ни разу, и в выходной файл пишется «Ученик не аттестован». Ещё загадочней другой фокус: не выполняется условие выхода из цикла в главной программе.
> while not Eof(InFile)
Обработав несколько строк, программа почему-то продолжает фанатично работать и дальше; она, как говорится, зациклилась. Если бы мы запустили её сразу в непрерывном режиме, то захламили бы выходным файлом весь диск! Пришлось бы аварийно снимать программу диспетчером задач. Ясно, что где-то притаилась ошибка, и надо прервать выполнение программы. Сделать это в пошаговом режиме несложно, – нажмите комбинацию Ctrl+F2.
Теперь сядем на пенёк и поразмыслим, в чем дело? Ведь первый вход в процедуру отработан верно. Вспомните наше исследование функции Eoln: чтение последнего числа в строке устанавливает признак конца строки в TRUE. Значит, при повторном входе в процедуру обработки строки цикл while not Eoln(InFile) не должен выполняться ни разу, – так оно и происходит. Так вот где собака порылась, – мы застряли в конце первой строки!