Песни о Паскале | страница 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) не должен выполняться ни разу, – так оно и происходит. Так вот где собака порылась, – мы застряли в конце первой строки!