При выполнении программы, написанной на языке Турбо Паскаль, установлены следующие правила обработки ошибочных ситуаций, связанных с вводом и выводом. По умолчанию при выполнении любой такой операции автоматически производится проверка на возникновение ошибки. При обнаружении ошибки выполнение программы прекращается, на экран выводится диагностическое сообщение с условным номером ошибки.
Можно предусмотреть в самой программе реакцию на ошибочные ситуации. Для этого используется директива компилятора . В этом случае возникновение ошибки не будет приводить к немедленному завершению программы, а код этой ошибки будет запомнен в качестве значения стандартной функции IOResult без параметров. При отсутствии ошибок значение этой функции равно нулю. Например:
Writeln (‘ Введите имя файла’);
If Code <> 0 Then Begin
Write (‘Ошибка при открытии файла ‘,
2: Writeln (‘файл не найден’);
3: Writeln (‘путь к файлу не найден’);
4: Writeln (‘слишком много открытых файлов’);
Ошибка ввода/вывода на устройстве
5: Writeln (‘доступ закрыт’);
6: Writeln (‘нарушена информация в полях файла или системных областях’);
8: Writeln (‘недостаточно памяти’);
10: Writeln (‘несовместимые параметры окружения’);
11: Writeln (‘нераспознанный формат диска’);
При использовании функции IOResult, если отключен режим автоматического контроля, то после возникновения ошибки все последующие операции с любым файлом будут игнорироваться, пока не произойдет обращение к функции IOResult. Поэтому рекомендуется вызывать эту функцию сразу после выполнения операции, связанной с файлом. Кроме этого, обращение к функции обнуляет код ошибки, поэтому повторное обращение будет давать нулевой результат.
Специальные операции
Эта группа операций предназначена для действий с элементами файловой системы ОС – каталогами и файлами. К ней относятся следующие процедуры:
· удаление файла на диске
· установка текущего каталога
ChDir;
· создание нового каталога
· удаление пустого подкаталога
Перечисленные средства работы с файлами являются стандартными, при использовании модуля DOS возможно применение дополнительных процедур и функций.
Дата добавления: 2016-06-29 ; просмотров: 1803 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ
Источник: poznayka.org
8. Директивы компилятора и обработка ошибок ввода
Компилятор Паскаля – сложное приложение, имеющее множество настроек. При написании учебных программ большинство этих настроек не имеют значения, но некоторые из них окажутся нам полезны.
Для управления компилятором существует 2 основных возможности: настройка режимов работы с помощью верхнего меню OptionsоболочкиTurboPascalи настройка конкретной программы с помощьюдиректив компилятора, которую мы кратко рассмотрим. В общем виде директива компилятора представляет собой конструкцию видаили,гдеX– латинская буква. Вариант со знаком «+» включает некоторый режим работы компилятора (например, строгий контроль программой соответствия типов данных, вывод системных диагностических сообщений и т.д.), а вариант со знаком «-» выключает его. Расположение директив, в общем, произвольно, однако, директивы, влияющие на всю программу, принято располагать в самом начале файла с исходным текстом. Фигурные скобки комментария< … >необходимы, чтобы скрыть действие директив от старых версий компилятора, которые не умели их распознавать.
Ошибка ввода вывода на устройстве — как исправить для HDD, флешки, SSD
Подробную информацию о назначении всех директив можно получить в справочной системе оболочки. Основные директивы компилятора также кратко описаны в Приложении 2.
Наиболее полезной для нас выглядит директива /, соответственно, выключающая и включающая автоматический контроль программой результатов операций ввода/вывода (в/в). К операциям в/в относятся, в числе прочего, ввод данных пользователем, вывод строки на принтер, открытие файла для получения или вывода данных и т.п.
Понятно, что даже несложная учебная программа выглядит лучше, если она умеет реагировать на неправильные действия пользователя или возникающие ошибки не просто выводом маловразумительного системного сообщения на английском языке, а доступным неискушенному пользователю текстом. По умолчанию контроль в/в включен и системные сообщения об ошибках генерируются автоматически. Все они кратко приведены в Приложении 3. Для замены системной диагностики своей собственной следует, во-первых, отключить директиву контроля оператором, а во-вторых, сразу же после оператора, который мог породить ошибку, проверить значение, возвращаемое системной функциейIoResult. Эта функция возвращаетноль, если последняя операция в/в прошлауспешно, в противном случае возвращается ненулевое значение. После завершения «критического» оператора директиву следует включить снова, чтобы не создавать потенциально опасных ситуаций в коде, который будет писаться далее! Приведем один пример, написав «расширенную» программу решения квадратного уравнения, корректно реагирующую на возникающие ошибки:
writeln (‘Введите 3 вещественных числа:’);
if IoResult<>0 then begin
Writeln (‘Вы не ввели 3 числа, это что-то другое!’);
Writeln (‘Ошибка при вычислении корней — дискриминант<0’);
writeln (lst,’x1=’,x1:8:2,’ x2=’,x2:8:2);
if IoResult<>0 then Writeln (‘Не удалось вывести на принтер’)
else Writeln (‘Результаты напечатаны’);
Специальной директивы для контроля математических ошибок в Паскале не предусмотрено, но это почти всегда можно сделать обычными проверками корректности данных. Обратите внимание на альтернативное решение проблемы «двух readln» в этом коде, а также на новый операторHaltи способ контроля того, удалось ли вывести строку на принтер.
В дальнейшем мы не всегда будем выполнять подобные проверки, однако, их никогда не помешает делать, если Вы хотите создать удобные для пользователя и понятные для разработчика программы.
Для работы с вещественными числами с двойной точностью (тип double) может также понадобиться указать перед программой директиву, позволяющую сгенерировать код для аппаратной обработки таких чисел.
Источник: studfile.net
Ошибка ввода программа завершена паскаль
Очевидно, что будут выполнятся только ветка » if (x > -5) or (x <> 0) then».
А сообщения «»*Ошибка ввода. Программа завершена (Program3.pas, строка 6)» — не было.
Что вы вводите?
64270 / 47569 / 32739
Нужно условие задачи глянуть, тут лажа написана…
8276 / 4180 / 1595
Записей в блоге: 3
64270 / 47569 / 32739
Сообщение было отмечено Памирыч как решение
Решение
Если как написано на картинке, то так.
1 2 3 4 5 6 7 8 9 10 11
function y(x:real):real; begin if x-10 then y:=x*x else if(x>-5)and(x<>0)then y:=1/x else y:=sqrt(abs(x)+1); end; begin writeln(‘При х=-18.75 y=’,y(-18.75):0:2); writeln(‘При х=-3.57 y=’,y(-3.57):0:2); writeln(‘При х=-7.15 y=’,y(-7.15):0:2); end.
8276 / 4180 / 1595
Записей в блоге: 3
И ещё — в ветках if достаточно вычислять. Вывод writeln — можно сделать после вычисления перед последним end. Как это показано у Puporev.
Неописанная переменная
begin S := 1; // Неизвестное имя S end.
Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).
Отсутствующая ;
begin var S: integer S := 1; // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка! end.
begin var S := 1 S := S + 1 // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end. end.
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.
Несовместимость типов при присваивании
begin var S: integer := 1.3; // Нельзя преобразовать тип real к integer end.
Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку.
Обратные преобразования не допускаются.
Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:
begin var S := 1.3; // Тип real будет выведен компилятором автоматически end.
Отсутствие закрывающего апострофа литеральной строки
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln(‘Результат сложения равен =, x + y); // Не хватает закрывающего апострофа end.
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф
Ошибки расстановки запятых и апострофов при выводе строк и выражений
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln(x, ‘+,’ y, ‘=’, x+y); // Неверная расстановка запятых и апострофов end.
Слишком много запятых и апострофов рядом, потому начинающие часто путаются
Надо уяснить правила:
- запятые разделяют разные элементы вывода
- все, что находится в апострофах, будет выведено на экран без изменений
Ошибка ввода
begin var x: integer; read(x); // введите блаблабла и посмотрите, что получится end.
Это — ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой.
Аналогичный фрагмент в более современном и предпочтительном синтаксисе:
begin var x := ReadInteger; end.
Ошибка неинициализированной переменной
begin var x: integer; // Забыли инициализировать или ввести x var r := x * x; // r получает тип integer writeln(‘Квадрат числа ‘, x, ‘ = ‘, r); end.
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Деление на 0
begin var x := 0; var c := 666 div x; // Здесь происходит деление на 0 end.
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.
Корень из отрицательного числа
begin writeln(sqrt(-1)); // Корень из отрицательного числа end.
В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN — Not a Number
Ссылки
- Программы для начинающих
- Сайт PascalABC.NET: Программы и алгоритмы для начинающих
Компилятор Паскаля – сложное приложение,
имеющее множество настроек. При написании
учебных программ большинство этих
настроек не имеют значения, но некоторые
из них окажутся нам полезны. Для управления
компилятором существует 2 основных
возможности: настройка режимов работы
с помощью верхнего меню OptionsоболочкиTurboPascalи настройка конкретной программы с
помощьюдиректив компилятора,
которую мы кратко рассмотрим. В общем
виде директива компилятора представляет
собой конструкцию видаили,гдеX– латинская буква. Вариант со знаком
«+»
включает некоторый режим работы
компилятора (например, строгий контроль
программой соответствия типов данных,
вывод системных диагностических
сообщений и т.д.), а вариант со знаком
«-»
выключает его. Расположение директив,
в общем, произвольно, однако, директивы,
влияющие на всю программу, принято
располагать в самом начале файла с
исходным текстом. Фигурные скобки
комментария … >необходимы, чтобы скрыть
действие директив от старых версий
компилятора, которые не умели их
распознавать.
Подробную информацию о назначении всех
директив можно получить в справочной
системе оболочки. Основные директивы
компилятора также кратко описаны в
Приложении 2.
Наиболее полезной для нас выглядит
директива /,
соответственно, выключающая и включающая
автоматический контроль программой
результатов операций ввода/вывода
(в/в). К операциям в/в относятся, в числе
прочего, ввод данных пользователем,
вывод строки на принтер, открытие файла
для получения или вывода данных и т.п.
Понятно, что даже несложная учебная
программа выглядит лучше, если она умеет
реагировать на неправильные действия
пользователя или возникающие ошибки
не просто выводом маловразумительного
системного сообщения на английском
языке, а доступным неискушенному
пользователю текстом. По умолчанию
контроль в/в включен и системные сообщения
об ошибках генерируются автоматически.
Все они кратко приведены в Приложении
3. Для замены системной диагностики
своей собственной следует, во-первых,
отключить директиву контроля оператором,
а во-вторых, сразу же после оператора,
который мог породить ошибку, проверить
значение, возвращаемое системной
функциейIoResult.
Эта функция возвращаетноль, если
последняя операция в/в прошлауспешно,
в противном случае возвращается ненулевое
значение. После завершения «критического»
оператора директиву следует включить
снова, чтобы не создавать потенциально
опасных ситуаций в коде, который будет
писаться далее! Приведем один пример,
написав «расширенную» программу
решения квадратного уравнения, корректно
реагирующую на возникающие ошибки:
writeln (‘Введите 3
вещественных числа:’);
if
IoResult<>0 then begin ошибка!>
Источник: oshibkam.ru