Практические приемы программирования |
Содержание | Назад | Вперед |
В этом разделе обсуждаются разнообразные, важные в практическом отношении, примемы программирования.
В одном из предыдущих разделов был рассмотрен фрагмент программы, демонстрирующий контроль за вводимой информацией и не допускающий ввод некорректных данных. Повторим здесь этот фрагмент:
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 позволяет писать программы, никогда не дающие сбоев при вводе или выводе данных и при работе с файлами.При написании больших и не очень больших программ, выполняющих различные действия, полезно сделать так, чтобы у пользователя была возможность выбрать тот или иной режим работы с программой. Например, если программа направлена на решение некоторой физической задачи, то она может иметь по крайней мере три режима работы: 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.
Содержание | Назад | Вперед |
Права на материал принадлежат их авторам