|
Midass 0 / 0 / 0 Регистрация: 10.09.2015 Сообщений: 34 |
||||
|
1 |
||||
Ошибка ввода — программа завершена15.09.2015, 19:58. Показов 4790. Ответов 6 Метки нет (Все метки)
Пишет: »*Ошибка ввода. Программа завершена (Program3.pas, строка 6)
__________________
0 |
|
ФедосеевПавел Модератор
8276 / 4180 / 1595 Регистрация: 01.02.2015 Сообщений: 12,994 Записей в блоге: 3 |
||||
|
15.09.2015, 21:25 |
2 |
|||
|
Ваш отформатированный код
Очевидно, что будут выполнятся только ветка » if (x > -5) or (x <> 0) then».
1 |
|
Почетный модератор 64270 / 47569 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
|
15.09.2015, 21:30 |
3 |
|
Что вы вводите? Нужно условие задачи глянуть, тут лажа написана…
1 |
|
0 / 0 / 0 Регистрация: 10.09.2015 Сообщений: 34 |
|
|
15.09.2015, 21:41 [ТС] |
4 |
|
Вот условие: Виды функций: Исходные данные: X=-18.76; X=-3.57; X=-7.15.
0 |
|
Модератор
8276 / 4180 / 1595 Регистрация: 01.02.2015 Сообщений: 12,994 Записей в блоге: 3 |
|
|
15.09.2015, 21:50 |
5 |
|
if (x > -5)
and (x <> 0) then
1 |
|
Puporev Почетный модератор 64270 / 47569 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
|
15.09.2015, 21:50 |
6 |
|||
|
РешениеЕсли как написано на картинке, то так.
1 |
|
Модератор
8276 / 4180 / 1595 Регистрация: 01.02.2015 Сообщений: 12,994 Записей в блоге: 3 |
|
|
15.09.2015, 21:51 |
7 |
|
И ещё — в ветках if достаточно вычислять. Вывод writeln — можно сделать после вычисления перед последним end. Как это показано у Puporev.
1 |
Компилятор Паскаля – сложное приложение,
имеющее множество настроек. При написании
учебных программ большинство этих
настроек не имеют значения, но некоторые
из них окажутся нам полезны. Для управления
компилятором существует 2 основных
возможности: настройка режимов работы
с помощью верхнего меню OptionsоболочкиTurboPascalи настройка конкретной программы с
помощьюдиректив компилятора,
которую мы кратко рассмотрим. В общем
виде директива компилятора представляет
собой конструкцию вида{$X+}или{$X-},гдеX– латинская буква. Вариант со знаком
«+»
включает некоторый режим работы
компилятора (например, строгий контроль
программой соответствия типов данных,
вывод системных диагностических
сообщений и т.д.), а вариант со знаком
«-»
выключает его. Расположение директив,
в общем, произвольно, однако, директивы,
влияющие на всю программу, принято
располагать в самом начале файла с
исходным текстом. Фигурные скобки
комментария{
… }необходимы, чтобы скрыть
действие директив от старых версий
компилятора, которые не умели их
распознавать.
Подробную информацию о назначении всех
директив можно получить в справочной
системе оболочки. Основные директивы
компилятора также кратко описаны в
Приложении 2.
Наиболее полезной для нас выглядит
директива {$I-}/{$I+},
соответственно, выключающая и включающая
автоматический контроль программой
результатов операций ввода/вывода
(в/в). К операциям в/в относятся, в числе
прочего, ввод данных пользователем,
вывод строки на принтер, открытие файла
для получения или вывода данных и т.п.
Понятно, что даже несложная учебная
программа выглядит лучше, если она умеет
реагировать на неправильные действия
пользователя или возникающие ошибки
не просто выводом маловразумительного
системного сообщения на английском
языке, а доступным неискушенному
пользователю текстом. По умолчанию
контроль в/в включен и системные сообщения
об ошибках генерируются автоматически.
Все они кратко приведены в Приложении
3. Для замены системной диагностики
своей собственной следует, во-первых,
отключить директиву контроля оператором{$I-},
а во-вторых, сразу же после оператора,
который мог породить ошибку, проверить
значение, возвращаемое системной
функциейIoResult.
Эта функция возвращаетноль, если
последняя операция в/в прошлауспешно,
в противном случае возвращается ненулевое
значение. После завершения «критического»
оператора директиву следует включить
снова, чтобы не создавать потенциально
опасных ситуаций в коде, который будет
писаться далее! Приведем один пример,
написав «расширенную» программу
решения квадратного уравнения, корректно
реагирующую на возникающие ошибки:
uses printer;
var a,b,c,d,x1,x2:real;
begin
writeln;
writeln (‘Введите 3
вещественных числа:’);
{$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
очистили стандартный поток ввода}
Readln;
Halt;
end.
Специальной директивы для контроля
математических ошибок в Паскале не
предусмотрено, но это почти всегда можно
сделать обычными проверками корректности
данных. Обратите внимание на альтернативное
решение проблемы «двух readln»
в этом коде, а также на новый операторHaltи способ
контроля того, удалось ли вывести строку
на принтер.
В дальнейшем мы не всегда будем выполнять
подобные проверки, однако, их никогда
не помешает делать, если Вы хотите
создать удобные для пользователя и
понятные для разработчика программы.
Для работы с вещественными числами с
двойной точностью (тип double)
может также понадобиться указать перед
программой директиву{$N+},
позволяющую сгенерировать код для
аппаратной обработки таких чисел.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Всего ответов: 2
Другие вопросы по: Информатика

Опубликовано: 27.02.2019 16:20
Ответов: 2

Опубликовано: 28.02.2019 09:00
Ответов: 3

Опубликовано: 01.03.2019 15:30
Ответов: 1

Опубликовано: 06.03.2019 17:30
Ответов: 1

Опубликовано: 06.03.2019 21:00
Ответов: 2

Опубликовано: 07.03.2019 19:50
Ответов: 3
Популярные вопросы
Опубликовано: 27.02.2019 12:50
Ответов: 2
Опубликовано: 27.02.2019 20:20
Ответов: 2
Опубликовано: 01.03.2019 00:00
Ответов: 3
Опубликовано: 01.03.2019 12:40
Ответов: 2
Опубликовано: 01.03.2019 22:00
Ответов: 1
Опубликовано: 02.03.2019 22:00
Ответов: 2
Опубликовано: 03.03.2019 09:20
Ответов: 1
Опубликовано: 03.03.2019 13:40
Ответов: 2
Опубликовано: 03.03.2019 14:00
Ответов: 3
Опубликовано: 03.03.2019 16:40
Ответов: 2
Предыдущий раздел:
Следующий раздел:
1.6. Ввод/вывод в текстовом режиме
Приведенная в предыдущем разделе программа запишет в некоторую область памяти число 2, однако внешне это никак не проявится. Нормальная программа должна уметь получать информацию от пользователя и сообщать ему результаты своей работы.
В простейшем случае вывод информации осуществляется процедурами write и writeln. В обоих случаях выводится текст или значения переменных. Отличие этих двух процедур в том, что последовательные вызовы write будут печатать информацию в одной строке, а writeln после каждого вызова переводит курсор на следующую строку. Примеры вызова процедур вывода:
writeln('Hello');
Печатается слово “Hello”.
writeln(x);
Напечатается значение переменной x.
x:=2;
writeln('x = ', x);
В одну строчку напечатается строка «x = » и значение переменной x, то есть в результате будет напечатано «x = 2».
x:=2; y:=3; writeln(x, y);
В одну строчку напечатаются значения переменных x и y, то есть «23».
writeln(x, ' ', y);
Между значениями x и y будет располагаться пробел.
writeln(x); writeln(y);
Значения x и y будут напечатаны на разных строках.
writeln(2*x+y);
Будет напечатано значение выражения 2*x+y.
writeln;
Вызов writeln без параметров приводит к переходу на новую строку. Несколько таких вызовов подряд вставят в выводимый текст несколько пустых строк.
Общее правило таково: write и writeln могут печатать значения переменных и произвольные текстовые строки. При этом текстовые строки должны быть взяты в кавычки. Одной процедурой можно вывести несколько значений переменных и строк текста, перечислив выводимые элементы через запятую.
Ввод информации осуществляется с помощью процедуры
readln(<список переменных>);
которая позволяет ввести с клавиатуры значения нескольких переменных. Например:
readln(x);
Выполнение программы приостановится, пока пользователь не введет значения переменной x и не нажмет Enter.
readln(x, y, z);
Программа ожидает ввода значений трех переменных. После каждого ввода следует жать Enter.
write('x = '); readln(x);
Курсор будет мигать не на пустой строке, а на строке содержащей приглашение вида «x = ».
readln;
В отсутствии параметров процедура просто приостанавливает выполнение программы до нажатия пользователем клвиши Enter.
Используем наши новые знания, написав программу, запрашивающую у пользователя два числа и печатающую их сумму.
program Summa;
var
x, y: integer;
begin
write('x = '); {Вывод текста 'x = '}
readln(x); {Ввод значения переменной x пользователем программы}
write('y = '); {Вывод текста 'y = '}
readln(y); {Ввод значения переменной y пользователем программы}
writeln('Summa = ', x+y); {Печать результата}
end.
Следующий раздел:
Предыдущий раздел:
Добавить комментарий
Неописанная переменная
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: Программы и алгоритмы для начинающих

Сообщение было отмечено Памирыч как решение