Практические приемы программирования

Содержание |  Назад  |  Вперед

В этом разделе обсуждаются разнообразные, важные в практическом отношении, примемы программирования.

1. Обработка ошибок ввода-вывода

В одном из предыдущих разделов был рассмотрен фрагмент программы, демонстрирующий контроль за вводимой информацией и не допускающий ввод некорректных данных. Повторим здесь этот фрагмент:

PROGRAM CheckInputData_1;
USES CRT;
VAR
  x : Real;
BEGIN
  ClrScr;
  REPEAT
    Write('Введите число в интервале от 0 до 100: ');
    Read(x);
    if not((x>=0)and(x<=100))
      then writeln('Ошибка при вводе числа!');
  UNTIL (x>=0)and(x<=100);
  ...
  ...
END.

Приведенная программа не допускает ввода числа меньше нуля или больше ста. А что произойдет, если вместо числа ввести (случайно) какой-либо иной символ? Скорее всего это приведет к возникновению фатальной (т.е. ведущий к прекращению работы программы) ошибки ввода-вывода: Error 106: Invalid numeric format. Этого можно избежать, если воспользоваться приемом, описанным ниже.

Сначала немного теории. Компилятор языка Турбо Паскаль позволяет генерировать выполнимый (машинный) код в дух режимах: с проверкой корректности ввода-вывода и без нее. В среде программирования этот режим включается в меню Options – Compiler – I/O Checking. Режимом компиляции можно управлять непосредственно в тексте программы с помощью ключа компиляции $I

{$I+} – режим проверки включен;
{$I-} – режим отключен.

По умолчанию, как правило, действует режим $I+. Этот ключ компиляции имеет локальную сферу влияния. Можно многократно включать и выключать режим, вставляя в текст программы конструкции {$I+} и {$I-}, тем самым создавая области с контролем ввода-вывода и без него.

При включенном режиме проверки любая ошибка ввода-вывода будет фатальной: программа прервется, выдав номер ошибки. Если отключить режим проверки, то при возникновении ошибки ввода-вывода программа уже не будет прерываться, а продолжит работу со следующего оператора. Результат операции ввода-вывода, вызвавший ошибку, будет неопределен. При этом код ошибки будет сохранен и в последствии его можно узнать с помощью специальной функции IOResult. Эта функция возвращает целое число, соответствующее коду последней ошибки ввода-вывода. Если же операция ввода-вывода прошла без сбоев, то функция вернет значение 0. Опросить функцию IOResult можно только один раз, ибо она обнуляет свое значение при каждом вызове. Обычно это обходят запоминанием значения функции в какой-либо переменной.

Итак, для того чтобы рассмотренная выше программа не давала сбоев при вводе, необходимо отключить режим проверки ошибок ввода-вывода на время работы процедуры Read, а затем проанализировать значение функции IOResult:

PROGRAM CheckInputData_2;
USES CRT;
VAR
    x : Real;

  err : Integer;
BEGIN
  ClrScr;
  REPEAT
  Write('Введите число в интервале от 0 до 100: ');

  {$I-}
    Read(x);

  {$I+}
  err := IOResult;
  if not((x>=0) and (x<=100)) or (err<>0)
    then writeln('Ошибка при вводе числа!');
  UNTIL (x>=0) and (x<=100) and (err=0);
  ...
  ...
END.

Возможность управлять режимом обработки ошибок и наличие функции IOResult позволяет писать программы, никогда не дающие сбоев при вводе или выводе данных и при работе с файлами.

2. Управление программой с помощью меню

При написании больших и не очень больших программ, выполняющих различные действия, полезно сделать так, чтобы у пользователя была возможность выбрать тот или иной режим работы с программой. Например, если программа направлена на решение некоторой физической задачи, то она может иметь по крайней мере три режима работы: 1) ввод и модификация параметров задачи; 2) собственно вычисления; 3) представление результатов (например, построение графиков рассчитанных зависимостей). Организация выбора режимов работы может быть сделана с помощью меню. Меню, в данном случае, - это перечень команд или режимов работы, которые можно выбрать тем или иным способом. В простейшем случае, меню может быть представлено на экране нумерованным списком. Выбор того или иного пункта меню осуществляется вводом числа, соответствующего номеру пункта. В более сложных случаях выбор пункта меню может осуществляться перемещением (с помощью клавиатуры или “мыши”) курсора-подсветки, а активизация выбранного пункта – нажатием на клавишу “Enter” или щелчком кнопки мыши.

Рассмотрим в качестве примера структуру программы, содержащей простейшее меню в виде нумерованного списка.

PROGRAM Example_of_Menu;
USES CRT;
VAR Ch : Char;

PROCEDURE ChangeParam;
BEGIN
END;


PROCEDURE Calculation;
BEGIN
END;


PROCEDURE ShowGraphic;
BEGIN
END;

BEGIN
  repeat
    ClrScr;
    GotoXY(30,2);
    Write(‘НАЗВАНИЕ ПРОГРАММЫ’);
    GotoXY(28,6);
    Write(‘- Меню режимов работы -’);
    GotoXY(20,8);  Write(‘1 - Ввод и изменение параметров’);
    GotoXY(20,10); Write(‘2 - Вычисление’);
    GotoXY(20,12); Write(‘3 - Построение графика’);
    GotoXY(20,14); Write(‘4 - Завершение работы’);
    GotoXY(15,18);
    Write(‘Для выбора режима работы нажмите клавишу [1..4]: ’);
    repeat
      Ch := ReadKey;
    until Ch in [’1’,’2’,’3’,’4’];
    case Ch of
     ‘1’ : ChangeParam;
     ‘2’ : Calculation;
     ’3’ : ShowGraphic;
     ’4’ : Halt;

    end; {case}
  until false;

END.

 

 

Содержание |  Назад  |  Вперед