Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Директивы компилятора и обработка ошибок ввода

Часть 1. Основы языка Паскаль | Формы записи алгоритма | Этапы разработки программы | Данные в языке Паскаль | Переменные и типы переменных | Арифметические выражения | Структура простой программы на Паскале | Компилятор и оболочка Turbo Pascal | Логические операции | Составной условный оператор |


Читайте также:
  1. Cамых распространенных ошибок Продавцов
  2. II. Сбор и обработка персональных данных субъектов персональных данных
  3. Автомат ввода резерва
  4. Автоматизированная обработка снимков
  5. Анализ ошибок, возникающих в системе идентификации
  6. Базисные средства ввода-вывода
  7. В случае, если формат ввода номера билета был нарушен.

 

Компилятор Паскаля -- сложное приложение, имеющее множество настроек. При написании учебных программ большинство этих настроек не имеют значения, но некоторые из них окажутся нам полезны. Для управления компилятором существует 2 основных возможности: настройка режимов работы с помощью верхнего меню Options оболочки Turbo Pascal и настройка конкретной программы с помощью директив компилятора, которую мы кратко рассмотрим. В общем виде директива компилятора представляет собой конструкцию вида {$X+} или {$X-}, где X -- латинская буква. Вариант со знаком "+" включает некоторый режим работы компилятора (например, строгий контроль программой соответствия типов данных, вывод системных диагностических сообщений и т. д.), а вариант со знаком "-" выключает его. Расположение директив, в общем, произвольно, однако, директивы, влияющие на всю программу, принято располагать в самом начале файла с исходным текстом. Фигурные скобки комментария {... } необходимы как часть синтаксиса директивы.

Подробную информацию о назначении всех директив можно получить в справочной системе оболочки. Основные директивы компилятора также кратко описаны в Приложении 2.

Наиболее полезной для нас выглядит директива {$I-}/{$I+}, соответственно, выключающая и включающая автоматический контроль программой результатов операций ввода/вывода (в/в). К операциям в/в относятся, в числе прочего, ввод данных пользователем, вывод строки на принтер, открытие файла для получения или вывода данных и т. п. Понятно, что даже несложная учебная программа выглядит лучше, если она умеет реагировать на неправильные действия пользователя или возникающие ошибки не просто выводом маловразумительного системного сообщения на английском языке, а доступным неискушенному пользователю текстом. По умолчанию контроль в/в включен и системные сообщения об ошибках генерируются автоматически. Все они кратко приведены в Приложении 3. Для замены системной диагностики своей собственной следует, во-первых, отключить директиву контроля оператором {$I-}, а во-вторых, сразу же после оператора, который мог породить ошибку, проверить значение, возвращаемое системной функцией IoResult. Эта функция возвращает ноль, если последняя операция в/в прошла успешно, в противном случае возвращается ненулевое значение. После завершения "критического" оператора директиву следует включить снова, чтобы не создавать потенциально опасных ситуаций в коде, который будет писаться далее. Приведем пример, написав "расширенную" программу решения квадратного уравнения, корректно реагирующую на возникающие ошибки:

uses printer;

var a,b,c,d,x1,x2:real;

begin

writeln;

writeln ('Введите коэффициенты a,b,c:');

{$I-} read (a,b,c); {$I+}

if IoResult<>0 then begin

{Возникла ошибка!}

writeln ('Вы не ввели 3 числа, ',

'это что-то другое!');

reset (input); {очищаем стандартный

поток ввода перед ожиданием нажатия Enter}

readln;

halt; {а этим оператором можно

аварийно завершить программу}

end;

d:=sqr(b)-4*a*c;

if d<0 then begin

writeln ('Ошибка - дискриминант<0');

reset (input); readln; halt;

end;

x1:=(-b+sqrt(d))/(2*a);

x2:=(-b-sqrt(d))/(2*a);

{$I-}

writeln (lst,'x1=',x1:8:2,' x2=',x2:8:2);

{$I+}

if IoResult<>0 then

writeln ('Не удалось напечатать')

else writeln ('Результаты напечатаны');

reset (input); readln; halt;

end.

Специальной директивы для контроля математических ошибок в Паскале не предусмотрено, но это почти всегда можно сделать обычными проверками корректности данных. Обратите внимание на альтернативное решение проблемы "двух readln" в этом коде, а также на новый оператор halt и способ контроля того, удалось ли вывести строку на принтер.

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

Для работы с вещественными числами с двойной точностью (тип double) может также понадобиться указать перед программой директиву {$N+}, позволяющую сгенерировать код для аппаратной обработки таких чисел.


 


Дата добавления: 2015-11-16; просмотров: 90 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Примеры программ с условным оператором| Оператор цикла. Циклы с предусловием и постусловием

mybiblioteka.su - 2015-2024 год. (0.01 сек.)