Ошибка ввода программа завершена program1 pas строка 6

Midass

0 / 0 / 0

Регистрация: 10.09.2015

Сообщений: 34

1

Ошибка ввода — программа завершена

15.09.2015, 19:58. Показов 5180. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Пишет: »*Ошибка ввода. Программа завершена (Program3.pas, строка 6)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
program primer;
var
  y,x:real;
begin
  writeln('Введите число x');
  readln(x);
   if (x>-5) or (x<>0) then
      begin
    y:=1/x;
    writeln(' x=',x,' y=',y);
      end
         else
    if (x<-10) then
       begin
     y:=sqr(x);
     writeln(' x=',x,' y=',y);
       end
          else begin y:=y+1;
     writeln(' x=',x,' y=',y); end
end.



0



ФедосеевПавел

Модератор

Эксперт по электронике

8322 / 4221 / 1602

Регистрация: 01.02.2015

Сообщений: 13,144

Записей в блоге: 4

15.09.2015, 21:25

2

Ваш отформатированный код

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program primer;
 
var
  y, x: real;
begin
  writeln('Введите число x');
  readln(x);
  if (x > -5) or (x <> 0) then
  begin
    y := 1 / x;
    writeln(' x=', x, ' y=', y);
  end
  else
  if (x < -10) then
  begin
    y := sqr(x);
    writeln(' x=', x, ' y=', y);
  end
  else
  begin
    y := y + 1;
    writeln(' x=', x, ' y=', y);
  end;
end.

Очевидно, что будут выполнятся только ветка » if (x > -5) or (x <> 0) then».
А сообщения «»*Ошибка ввода. Программа завершена (Program3.pas, строка 6)» — не было.
Что вы вводите?



1



Почетный модератор

64288 / 47587 / 32739

Регистрация: 18.05.2008

Сообщений: 115,181

15.09.2015, 21:30

3

Цитата
Сообщение от ФедосеевПавел
Посмотреть сообщение

Что вы вводите?

Нужно условие задачи глянуть, тут лажа написана…



1



0 / 0 / 0

Регистрация: 10.09.2015

Сообщений: 34

15.09.2015, 21:41

 [ТС]

4

Вот условие:

Виды функций:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
Y=begin{cases}frac1X&text{, if }x>-5, xneq 0\ X^2&text{, if }x<-10\ sqrt{|X|+1}&text{, otherwise}end{cases}<br />

Исходные данные:

X=-18.76; X=-3.57; X=-7.15.



0



Модератор

Эксперт по электронике

8322 / 4221 / 1602

Регистрация: 01.02.2015

Сообщений: 13,144

Записей в блоге: 4

15.09.2015, 21:50

5

if (x > -5)

or

and (x <> 0) then



1



Puporev

Почетный модератор

64288 / 47587 / 32739

Регистрация: 18.05.2008

Сообщений: 115,181

15.09.2015, 21:50

6

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

Решение

Если как написано на картинке, то так.

Pascal
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.



1



Модератор

Эксперт по электронике

8322 / 4221 / 1602

Регистрация: 01.02.2015

Сообщений: 13,144

Записей в блоге: 4

15.09.2015, 21:51

7

И ещё — в ветках if достаточно вычислять. Вывод writeln — можно сделать после вычисления перед последним end. Как это показано у Puporev.



1



Midass

0 / 0 / 0

Регистрация: 10.09.2015

Сообщений: 34

1

Ошибка ввода — программа завершена

15.09.2015, 19:58. Показов 4790. Ответов 6

Метки нет (Все метки)


Пишет: »*Ошибка ввода. Программа завершена (Program3.pas, строка 6)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
program primer;
var
  y,x:real;
begin
  writeln('Введите число x');
  readln(x);
   if (x>-5) or (x<>0) then
      begin
    y:=1/x;
    writeln(' x=',x,' y=',y);
      end
         else
    if (x<-10) then
       begin
     y:=sqr(x);
     writeln(' x=',x,' y=',y);
       end
          else begin y:=y+1;
     writeln(' x=',x,' y=',y); end
end.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

ФедосеевПавел

Модератор

Эксперт по электронике

8276 / 4180 / 1595

Регистрация: 01.02.2015

Сообщений: 12,994

Записей в блоге: 3

15.09.2015, 21:25

2

Ваш отформатированный код

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program primer;
 
var
  y, x: real;
begin
  writeln('Введите число x');
  readln(x);
  if (x > -5) or (x <> 0) then
  begin
    y := 1 / x;
    writeln(' x=', x, ' y=', y);
  end
  else
  if (x < -10) then
  begin
    y := sqr(x);
    writeln(' x=', x, ' y=', y);
  end
  else
  begin
    y := y + 1;
    writeln(' x=', x, ' y=', y);
  end;
end.

Очевидно, что будут выполнятся только ветка » if (x > -5) or (x <> 0) then».
А сообщения «»*Ошибка ввода. Программа завершена (Program3.pas, строка 6)» — не было.
Что вы вводите?

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

Вот условие:

Виды функций:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br /> Y=begin{cases}frac1X&text{, if }x>-5, xneq 0 X^2&text{, if }x<-10 sqrt{|X|+1}&text{, otherwise}end{cases}<br />

Исходные данные:

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)

or

and (x <> 0) then

1

Puporev

Почетный модератор

64270 / 47569 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

15.09.2015, 21:50

6

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

Решение

Если как написано на картинке, то так.

Pascal
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.

1

Модератор

Эксперт по электронике

8276 / 4180 / 1595

Регистрация: 01.02.2015

Сообщений: 12,994

Записей в блоге: 3

15.09.2015, 21:51

7

И ещё — в ветках if достаточно вычислять. Вывод writeln — можно сделать после вычисления перед последним end. Как это показано у Puporev.

1

Неописанная переменная

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+}или{$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+},
позволяющую сгенерировать код для
аппаратной обработки таких чисел.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

1 Out of memory (Выход за границы памяти). 2 Identifier expected (Не указан идентификатор). 3 Unknown identifier (Неизвестный идентификатор). 4 Duplicate identifier (Двойной идентификатор). 5 Syntax error (Синтаксическая ошибка). 6 Error in real constant (Ошибка в вещественной константе). 7 Error in integer constant (Ошибка в целой константе). 8 String constant exceeds line (Строковая константа превышает допустимые размеры). 9 Too many nested files (Слишком много вложенных файлов). 10 Unexpected end of file (He найден конец файла). 11 Line too long (Слишком длинная строка) 12 Type identifier expected (Здесь нужен идентификатор типа). 13 Too many open files (Слишком много открытых файлов). 14 Invalid file name (Неверное имя файла). 15 File not found (Файл не найден). 16 Disk full (Диск заполнен). 17 Invalid compiler directive (Неправильная директива компилятора). 18 Too many files (Слишком много файлов). 19 Undefined type in pointer definition (Неопределенный тип в объявлении указателя). 20 Variable identifier expected (Отсутствует идентификатор переменной). 21 Error in type (Ошибка в объявлении типа). 22 Structure too large (Слишком большая структура). 23 Set base type of range (Базовый тип множества нарушает границы). 24 File components may not be files (Компонентами файла не могут быть файлы) . 25 Invalid string length (Неверная длина строки). 26 Type mismatch (Несоответствие типов). 27 Invalid subrange base type (Неправильный базовый тип для типа-диапазона). 28 Lower bound greater than upper bound (Нижняя граница больше верхней). 29 Ordinal type expected (Нужен порядковый тип). 30 Integer constant expected (Нужна целая константа). 31 Constant expected (Нужна константа). 32 Integer or real constant expected (Нужна целая или вещественная константа) . 33 Type identifier expected (Нужен идентификатор типа) 34 Invalid function result type (Неправильный тип результата функции) 35 Label identifier expected (Нужен идентификатор метки). 36 BEGIN expected (Нужен BEGIN). 37 END expected (Нужен END). 38 Integer expression expected (Нужно выражение типа INTEGER). 39 Ordinal expression expected (Нужно выражение перечисляемого типа). 40 Boolean expression expected (Нужно выражение типа BOOLEAN). 41 Operand types do not match operator (Типы операндов не соответствуют операции). 42 Error in expression (Ошибка в выражении). 43 Illegal assignment (Неверное присваивание). 44 Field identifier expected (Нужен идентификатор поля) . 45 Object file too large (Объектный файл слишком большой). 46 Undefined external (Неопределенная внешняя процедура). 47 Invalid object file record (Неправильная запись объектного файла). 48 Code segment too large (Сегмент кода слишком большой). 49 Data segment too large (Сегмент данных слишком велик). 50 DO expected (Нужен оператор DO). 51 Invalid PUBLIC definition (Неверное PUBLIC-определение). 52 Invalid EXTRN definition (Неправильное EXTRN-определение). 53 Too many EXTRN definition (Слишком много EXTRN-определений). 54 OF expected (Требуется OF). 55 INTERFACE expected (Требуется интерфейсная секция). 56 Invalid relocatable reference (Неправильная перемещаемая ссылка). 57 THEN expected (Требуется THEN). 58 TO or DOWNTO expected (Требуется TO или DOWNTO). 59 Undefined forward (Неопределенное опережающее описание). 60 Too many procedures (Слишком много процедур). 61 Invalid typecast (Неверное преобразование типа). 62 Division by zero (Деление на ноль). 63 Invalid file type (Неверный файловый тип). 64 Cannot Read or Write variables of this type (Нет возможности считать или записать переменные данного типа). 65 Pointer variable expected (Нужно использовать переменную-указатель). 66 String variable expected (Нужна строковая переменная). 67 String expression expected (Нужно выражение строкового типа). 68 Circular unit reference (Перекрестная ссылка модулей). 69 Unit name mismatch (Несоответствие имен программных модулей). 70 Unit version mismatch (Несоответствие версий модулей). 71 Duplicate unit name (Повторное имя программного модуля). 72 Unit file format error (Ошибка формата файла модуля). 73 IMPLEMENTATION expected (Отсутствует исполняемая часть модуля). 74 Constant and case types do not match (Типы констант и тип выражения опе- ратора CASE не соответствуют друг другу). 75 Record variable expected (Нужна переменная типа запись). 76 Constant out of range (Константа нарушает границы). 77 File variable expected (Нужна файловая переменная). 78 Pointer expression expected (Нужно выражение типа указатель). 79 Integer or real expression expected (Нужно выражение вещественного или целого типа). 80 Label not within current block (Метка не находится внутри текущего блока) 81 Label already defined (Метка уже определена). 82 Undefined label in processing statement part (Неопределенная метка в предшествующем разделе операторов). 83 Invalid @ argument (Неправильный аргумент операции @). 84 Unit expected (Нужно кодовое слово UNIT). 85 ”;” expected (Нужно указать”;”). 86 ”:” expected (Нужно указать”:”). 87 ”,”expected (Нужно указать”,”). 88 ”(” expected (Нужно указать ”(”). 89 ”)” expected (Нужно указать”)”). 90 ”=” expected (Нужно указать”=”) 91 ”:=” expected (Нужно указать”:=”) 92 ”[” or ”(.”expected (Нужно указать ”[” или ”(.”). 93 ”]” or ”.)” expected (Нужно указать”]” или ”.)”). 94 ”.” expected (Нужно указать”.”) 95 ”..” expected (Нужно указать”..”). 96 Too many variables (Слишком много переменных). 97 Invalid FOR control variable (Неправильный параметр цикла оператора FOR). 98 Integer variable expected (Нужна переменная целого типа). 99 File and procedure types are not allowed here (Здесь не могут использоваться файлы или процедурные типы). 100 String length mismatch (Несоответствие длины строки). 101 Invalid ordering of fields (Неверный порядок полей). 102 String constant expected (Нужна константа строкового типа). 103 Integer or real variable expected (Нужна переменная типа INTEGER или REAL). 104 Ordinal variable expected (Нужна переменная порядкового типа). 105 INLINE error (Ошибка в операторе INLINE) 106 Character expression expected (Предшествующее выражение должно иметь символьный тип). 107 Too many relocation items (Слишком много перемещаемых элементов). 108 Overflow in arithmetic operator (Переполнение при выполнении арифметического оператора). 109 No enclosing FOR, WHILE or REPEAT statement (Нет операторов, заканчивающих операторы FOR, WHILE или REPEAT). 110 Debug information table overflow (Переполнение информационной таблицы отладки) 111 N/A 112 CASE constant out of range (Константа CASE нарушает допустимые границы) . 113 Error in statement (Ошибка в операторе). 114 114 Cannot call an interrupt procedure (Невозможно вызвать процедуру npерывания). 115 N/A 116 Must be in 8087 mode to compile this (Для компиляции необходим режим 8087). 117 Target address not found (Указанный адрес не найден). 118 118 Include files are not allowed here (Здесь не допускаются включаемые файлы). 119 No inherited methods are accessible here (В этом месте программы нет унаследованных методов). 120 N/A 121 Invalid qualifier (Неверный квалификатор). 122 Invalid variable reference (Недействительная ссылка на переменную). 123 Too many symbols (Слишком много символов). 124 Statement part too large (Слишком большой раздел операторов). 125 N/A 126 Files must be var parameters (Файлы должны передаваться как параметры-переменные). 127 Too many conditional symbols (Слишком много условных символов). 128 Misplaced conditional directive (Пропущена условная директива). 129 ENDIF directive missing (Пропущена директива ENDIF). 130 Error in initial conditional defines (Ошибка в условных определениях). 131 Header does not match previous definition (Заголовок не соответствует предыдущему определению). 132 Critical disk error (Критическая ошибка диска). 133 Cannot evaluate this expression (Нельзя вычислить данное выражение). 134 Expression incorrectly germinated (Некорректное завершение выражения). 135 Invalid format specifier (Неверный спецификатор формата). 136 Invalid indirect reference (Недопустимая косвенная ссылка). 137 Structured variable are not allowed here (Здесь нельзя использовать переменную структурного типа). 138 Cannot evaluate without System unit (Нельзя вычислить выражение без мо-дуля SYSTEM). 139 Cannot access this symbol (Нет доступа к данному символу). 140 Invalid floating-point operation (Недопустимая операция с плавающей запятой). 141 Cannot compile overlay to memory (Нельзя выполнить компиляцию оверлейных модулей в память). 142 Procedure or function variable expected (Должна использоваться перемен- ная процедурного типа). 143 Invalid procedure or function reference (Недопустимая ссылка на процедуру или функцию) . 144 Cannot overlay this unit (Этот модуль не может использоваться в качестве оверлейного). 145 Too many nested scopes (Слишком много вложений). 146 File access denied (Отказано в доступе к файлу). 147 Object type expected (Здесь должен быть тип OBJECT) . 148 object types are not allowed (Нельзя объявлять локальные объекты). 149 VIRTUAL expected (Пропущено слово VIRTUAL). 150 Method identifier expected (Пропущен идентификатор инкапсулированного правила). 151 Virtual constructor are not allowed (Конструктор не может быть виртуальным). 153 Destructor identifier expected (Пропущен идентификатор деструктора). 154 Fail only allowed within constructor (Обращение к стандартной процедуре FAIL может содержаться только в конструкторе). 155 Invalid combination of opcode and operands (Недопустимая комбинация кода команды и операндов). 156 Memory reference expected (Отсутствует адрес). 157 Cannot add or subtract relocatable symbols (Нельзя складывать или вычитать перемещаемые символы). 158 Invalid register combination (Недопустимая комбинация регистров). 159 286/287 instructions are not enabled (Недоступен набор команд микропроцессоров 286/287). 160 Invalid symbol reference (Недопустимая ссылка на символ). 161 Code generation error (Ошибка генерации кода). 162 ASM expected (Отсутствует зарезервированное слово ASM).

7.4 Обработка текстовых файлов в языке Free Pascal

При работе с текстовыми файлами следует учесть следующее:

  1. Действие процедур reset, rewrite, close, rename, erase и функции eof аналогично их действию при работе с компонентными (типизированными) файлами.
  2. Процедуры seek, trunсate и функция filepos не работают с текстовыми файлами.
  3. Можно пользоваться процедурой открытия текстового файла append(f), где f — имя файловой переменной. Эта процедура служит для открытия файла в режиме дозаписи в конец файла. Она применима только к уже физически существующим файлам, открывает и готовит их для добавления информации в конец файла.
  4. Запись и чтение в текстовый файл осуществляются с помощью процедур write, writeln, read, readln следующей структуры:

read ( f, x1, x2, x3,…, xn );

read ( f, x );

readln ( f, x1, x2, x3,…, xn );

readln ( f, x );

write ( f, x1, x2, x3,…, xn );

write ( f, x );

writeln ( f, x1, x2, x3,…, xn );

writeln ( f, x );

В этих операторах f — файловая переменная. В операторах чтения (read, readln) x, x1, x2, x3,…, xn — переменные, в которые происходит чтение из файла. В операторах записи write, writeln x, x1, x2, x3,…, xn — переменные или константы, информация из которых записывается в файл.

Есть ряд особенностей при работе операторов write, writeln, read, readln с текстовыми файлами. Имена переменных могут быть целого, вещественного, символьного и строкового типа. Перед записью данных в текстовый файл с помощью процедуры write происходит их преобразование в тип string. Действие оператора writeln отличается тем, что после указанных переменных и констант в файл записывается символ «конец строки».

При чтении данных из текстового файла с помощью процедур read, readln происходит преобразование из строкового типа к нужному типу данных. Если преобразование невозможно, то генерируется код ошибки, значение которого можно узнать, обратившись к функции IOResult. Компилятор Free Pascal позволяет генерировать код программы в двух режимах: с проверкой корректности ввода-вывода и без неё.

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

  • {$I+} — режим проверки ошибок ввода-вывода включён;
  • {$I-} — режим проверки ошибок ввода-вывода отключён.

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

При включённом режиме проверки любая ошибка ввода-вывода будет фатальной, программа прервётся, выдав номер ошибки.

Если убрать режим проверки, то при возникновении ошибки ввода-вывода программа не будет останавливаться, а продолжит работу со следующего оператора. Результат операции ввода-вывода будет неопределён.

Для опроса кода ошибки лучше пользоваться специальной функцией IOResult, но необходимо помнить, что опросить её можно только один раз после каждой операции ввода или вывода: она обнуляет своё значение при каждом вызове. IOResult возвращает целое число, соответствующее коду последней ошибки ввода-вывода. Если IOResult=0, то при вводе-выводе ошибок не было, иначе IOResult возвращает код ошибки. Некоторые коды ошибок приведены в табл. 7.9.

Таблица
7.9.
Коды ошибок операций ввода-вывода

Код ошибки Описание
2 файл не найден
3 путь не найден
4 слишком много открытых файлов
5 отказано в доступе
12 неверный режим доступа
15 неправильный номер диска
16 нельзя удалять текущую директорию
100 ошибка при чтении с диска
101 ошибка при записи на диск
102 не применена процедура AssignFile
103 файл не открыт
104 файл не открыт для ввода
105 файл не открыт для вывода
106 неверный номер
150 диск защищён от записи

Рассмотрим несколько практических примеров обработки ошибок ввода-вывода:

  1. При открытии проверить, существует ли заданный файл и возможно ли чтение данных из него.
    assign ( f, ’ abc. dat ’ );
    {$I-}
    reset ( f );
    {$I+}
    if IOResult<>0 then
    writeln ( ’файл не найден или не читается ’ )
    else
    begin
    read ( f,... );
    close ( f );
    end;
    
  2. Проверить, является ли вводимое с клавиатуры число целым.
    var i : integer;
    begin
    {$I-}
    repeat
    write ( ’введите целое число  i ’ );
    readln ( i );
    until ( IOResult =0);
    {$I+}
    {Этот цикл повторяется до тех пор, пока не будет введено целое число.}
    end.
    

При работе с текстовым файлом необходимо помнить специальные правила чтения значений переменных:

  • Когда вводятся числовые значения, два числа считаются разделёнными, если между ними есть хотя бы один пробел, или символ табуляции, или символ конца строки.
  • При вводе строк начало текущей строки идёт сразу за последним, введённым до этого символом. Вводится количество символов, равное объявленной длине строки. Если при чтении встретился символ «конец строки», то работа с этой строкой заканчивается. Сам символ конца строки является разделителем и в переменную никогда не считывается.
  • Процедура readln считывает значения текущей строки файла, курсор переводится в новую строку файла, и дальнейший ввод осуществляется с неё.

В качестве примера работы с текстовыми файлами рассмотрим следующую задачу.

ЗАДАЧА 7.8. В текстовом файле abc.txt находятся матрицы A(N, M ) и B(N, M ) и их размеры. Найти матрицу C = A + B, которую дописать в файл abc.txt.

Сначала создадим текстовый файл abc.txt следующей структуры: в первой строке через пробел хранятся размеры матрицы (числа N и M), затем построчно хранятся матрицы A и B.

Файл abc.txt

Рис.
7.14.
Файл abc.txt

На рис. 7.14 приведён пример файла abc.txt, в котором хранятся матрицы A(4,5) и B(4,5).

Текст консольного приложения решения задачи 7.8 с комментариями приведён ниже.

program Project1;
{$mode objfpc}{$H+}
uses
	Classes, SysUtils
	{ you can add units after this };
var
	f : Text;
	i, j, N,M: word;
	a, b, c : array [ 1.. 1000, 1.. 1000 ] of real;
begin
//Связываем файловую переменную f с файлом на диске.
	AssignFile ( f, ’ abc. t x t ’ );
//Открываем файл в режиме чтения.
	Reset ( f );
//Считываем из первой строки файла abc.txt значения N и M.
	Read( f,N,M);
//Последовательно считываем элементы матрицы А из файла.
	for i :=1 to N do
	for j :=1 to M do
	read ( f, a [ i, j ] );
//Последовательно считываем элементы матрицы B из файла.
	for i :=1 to N do
	for j :=1 to M do
	read ( f, b [ i, j ] );
//Формируем матрицу C=A+B.
	for i :=1 to N do
	for j :=1 to M do
	c [ i, j ] : = a [ i, j ]+b [ i ] [ j ];
//Закрываем файл f.
	CloseFile ( f );
//Открываем файл в режиме дозаписи.
	Append( f );
//Дозапись матрицы C в файл.
	for i :=1 to N do
	begin
		for j :=1 to M do
//Дописываем в файл очередной элемент матрицы и пробел в
//текстовый файл.
		write ( f, c [ i, j ] : 1 : 2, ’   ’ );
//По окончании вывода строки матрицы переходим на новую
//строку в текстовом файле.
		writeln ( f );
	end;
//Закрываем файл.
	CloseFile ( f );
end.

После работы программы файл abc.txt будет примерно таким, как показано на рис. 7.15.

Файл abc.txt после дозаписи матрицы C

Рис.
7.15.
Файл abc.txt после дозаписи матрицы C

Скажите, что мне делать? Выдаёт в PASCAL такую ошибку:

Program1.pas(6) : Ошибка времени выполнения: Файл ‘C:UsershomeDesktopinput.txt’ не найден.

Задача такая:

var

a,b:int64;

fi,fo:text;

begin

assign(fi,’input.txt.’);

reset(fi);

assign(fo,’output.txt’);

rewrite(fo);

read(fi,a,b);

if(a>b)then

write(fo,a)

else write(fo,b);

close(fi);

close(fo);

end.

раздел
const
?

раздел
type
?

раздел
begin … end ?

раздел
program ?

  1. Какие
    из комментариев неправильны :

{Программа
для вычисления}

(*
Это тоже комментарий *)

{{
Комментарий в комментарии }}

(*
{ Другой вариант }*)

{
(* Следующий
вариант
*) }

(*
(* Возможный
вариант
*) *)

  1. Для
    чего используется слово uses
    ?

  1. такого
    слова нет в языке Паскаль

  2. это
    пользовательский идентификатор

  3. с
    его помощью подключают стандартные
    модули

  4. это
    стандартная константа

  5. это
    описание процедуры

  1. В
    разделе процедур и функций описываются
    :

    1. только
      стандартные процедуры

    2. только
      пользовательские процедуры

    3. и
      стандартные, и пользовательские

    4. такого
      раздела в программе не может быть

  1. Наберите
    и откомпилируйте простейшую программу
    :

Program
MyProg;

begin

Writeln
(5*6);

Writeln(‘
Привет
‘);

end.

Каков
будет результат ее выполнения ?

  1. Где
    ошибки (их три) в следующей программе
    ?

Program
Ошибки;

begin

Summa
:= 6+8;

end;

  1. Где
    ошибки (их три) в следующей программе
    ?

Program
Ошибки1;

{{
Программа с ошибками }}

begin

var
X: integer;

X:=
6+8;

Write
(X);

end.

  1. Где
    ошибка в следующей программе ?

Program
Oshibka;

uses
;

{(*
Программа с ошибкой *)}

begin

end.

  1. Где
    ошибка в следующей программе ?

Program
Summa;

var
X, Y, Сумма
: integer;

begin

Writeln(‘
Введите
Х
‘);

Readln
(X);

Writeln(‘
Введите
Y ‘);

Readln
(Y);

Сумма:=Х+Y;

Writeln(Сумма);

end.

Глава 3

Операторы языка
ПАСКАЛЬ

3.1 ВВОД-ВЫВОД
ДАННЫХ

Часто
первыми действиями, выполняемыми
программой, являются действия по вводу
и выводу данных.

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

Основные
устройства ввода — клавиатура и дисковый
файл. Программа получает входные данные
из файла Input и помещает
результат обработки в файл Output.
Стандартно файлу Input
назначена клавиатура, файлу Output
– экран терминала.

Для
ввода и вывода данных в языке Паскаль
предусмотрены следующие процедуры
ввода-вывода: Read, Readln, Write, Writeln. Часто
эти процедуры называют операторами.

3.1.1 Процедура
чтения Read

Обеспечивает
ввод числовых данных, символов, строк
для их последующей обработки.

Формат:

Read
(а1, а2, а3, …,а
n)
;

Readln;

Readln
(а1, а2, а3, …,а
n)
;

где
а1, а2, а3, …,аn
– переменные допустимых типов
данных integer, real, char, string.

Третий
оператор эквивалентен первым двум,
выполненным последовательно. Значения
набираются на клавиатуре через пробел
и высвечиваются на экране. После набора
данных для одной процедуры нажимается
Enter.

Значения
переменных должны вводиться в строгом
соответствии с синтаксисом языка
Паскаль. Если элемент ввода типа integer,
а набирается с клавиатуры значение
типа char – возникает ошибка
ввода-вывода.

Пример:

Var
x : integer;

y
: real;

z
: boolean;

…..

Read
(x, y, z) ;

С
клавиатуры можно ввести

32
-1.8
true

Типовые
ошибки при вводе:

3.2
-1.8 true {В
качестве х введено
действительное значение}

х
= 32 {В качестве х
введено символьное значение}

32
-1,8 true {В
качестве у введено
символьное значение}

В
случае несоответствия типа введенных
данных типу переменной, значение которой
вводится с клавиатуры, программа
завершает работу и на экране выводится
сообщение об ошибке ввода-вывода. Если
программа запущена из среды Turbo Pascal –
Error 106 Invalid numeric format
(Неверный числовой формат).

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

Например,

Read
(x, y);

Read
(z);

С
клавиатуры можно ввести данные через
пробел на одной строке

32
-1.8
true

Процедура
чтения Readln аналогична Read.
Единственное отличие состоит в том,
что если в программе несколько процедур
Readln, то после считывания значений
переменных для одной процедуры Readln,
данные для следующей процедуры будут
считываться с начала новой строки.

Например,

Readln(x,
y);

Read(z);

С
клавиатуры ввели данные через пробел
на одной строке

32
-1.8
true {Значение
переменной z
считываться не будет}

Инструкция
Readln при вводе с клавиатуры
предпочтительней Read, т.к. полностью
освобождает буфер клавиатуры – рабочую
область памяти, в которой временно
хранятся введенные с клавиатуры символы.
Инструкция Read оставляет в буфере
клавиатуры код клавиши Enter, которой
завершает процесс.

Процедура
Readln без переменных обычно записывается
в конце программы и служит для создания
паузы, которая длится до нажатия клавиши
Enter. В противном случае по окончании
программы окно с текстом программы
закроет экран с полученным результатом.

3.1.2 Процедура
записи Write

В
ывод

данных – передача информации после
обработки из оперативной памяти на
внешнее устройство (экран, принтер,
файл на диске).

Обеспечивает
вывод числовых данных, символов, строк
и булевских значений.

Формат:

Write
(а1, а2, а3, …,а
n)
;

Writeln;

Writeln
(а1, а2, а3, …,а
n)
;

где
а1, а2, а3, …,аn
– выражение типа integer, byte, real,
char, boolean.

Инструкции
Write и Writeln предназначены для
вывода констант различных типов,
значений переменных или выражений.
Число параметров – произвольное. Данные
выводятся на экран.

Из
констант наиболее часто выводятся
строки текста (строковые константы
заключаются в апострофы). Если в
конструкции вывода записано выражение,
оно сначала будет вычислено, а затем
выполнен вывод полученного результата.

Процедура
Writeln аналогична Write, отличие
заключается в том, что после вывода
последней переменной из списка, курсор
автоматически переходит в начало новой
строки. Инструкция Writeln без параметров
переводит курсор в начало следующей
строки, что позволяет, например, отделять
результаты работы программы друг от
друга пустыми строками.

ФОРМАТ ВЫВОДА

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

Write(y1:n:m,
y2:n:m, …);

Writeln(y1:n:m,
y2:n:m, …);

где
y1,
y2,…
— выражение, переменная или
константа;

n
– определяет общую ширину поля
вывода;

m
– определяет
место под дробную часть.

Если
заданное n
мало, при выводе ширина поля будет
увеличена, если мало m
– то производится округление.

Кроме
того, в операторах вывода можно задавать
количество пробелов. Для этого необходимо
записать оператор вывода в виде:

Write
(‘ ‘ :
q);

где
q
— константа целого типа, указывающая
число пробелов.

Примеры:

  • x
    целое число

х
– выводится десятичное представление
величины х, начиная
с позиции расположения курсора

Значение
x

Выражение

Результат

123

Write(x)

123

896

Write(x,x)

896896

х
:
n
– выводится десятичное представление
величины х в крайние
правые позиции поля шириной n

Значение
x

Выражение

Результат

123

Write(x:5)

_
_ 123

4

Write(x*х:7)

_
_ _ _ _16

  • R
    вещественное
    число

R
– в поле шириной 16 символов выводится
десятичное представление величины R
в формате с плавающей точкой:

±
#.# # # # # # # # # # E ± # #

Значение
R

Выражение

Результат

123.432

Write(R)

_
1.2343200000Е+02

-0.25

Write(R)


2.5000000000Е-01

200

Write(R/2)

_
1.0000000000Е+02

R
:
n
– в крайние правые позиции поля
шириной n
символов выводится десятичное
представление величины R
в формате с плавающей точкой (минимальная
длина поля вывода 8 символов для
отрицательного значения и 7 символов
для положительного значения R,
после десятичной точки выводится по
крайней мере одна цифра):

Значение
R

Выражение

Результат

123.432

Write(R:12)

1.234320Е+02

-0.25

Write(R:9)

-2.50Е-01

R
:
n:
m
– в крайние правые позиции поля
шириной n
символов выводится десятичное
представление величины R
в формате с фиксированной точкой,
после десятичной точки выводится m
цифр, представляющих дробную часть.
Если m=0,
ни десятичная точка, ни дробная часть
не выводятся.

Значение
R

Выражение

Результат

123.432

Write(R:8:4)

123.4320

-0.25

Write(R:7:1)

_
_ _- 0.3

200

Write(R:3:0)

200

  • Ch
    – выражение символьного типа

Ch
– начиная с ткущей позиции курсора
выводится значение Ch

Значение
Ch

Выражение

Результат

‘123’

Write(Ch)

123

‘No’

Write(Ch)

No

‘?!’

Write(Ch,
Ch)

?!?!

Ch
:
n
– в крайние правые позиции поля
шириной n
символов выводится значение Ch

Значение
Ch

Выражение

Результат

‘123’

Write(Ch:5)

_
_ 123

‘?!’

Write(Ch:3,
Ch:5)

_
?! _ _ _?!

  • S
    – выражение строкового типа

S
– начиная с позиции расположения
курсора выводится значение S

Значение
S

Выражение

Результат

‘DAY
NEDELY’

Write(S)

DAY
NEDELY

‘No’

Write(S,
S)

NoNo

S
:
n
– в крайние правые позиции поля
шириной n
символов выводится значение S

Значение
S

Выражение

Результат

‘DAY
NEDELY’’

Write(S:12)

_
_DAY NEDELY

‘No’

Write(S:3,
S:5)

_No
_ _ _ No

  • В
    – выражение логического типа

В
– начиная с текущей позиции курсора
значение В выводится
True
или False

Значение
В

Выражение

Результат

True

Write(В)

True

False

Write(В,
not В)

FalseTrue

В
:
n
– в крайние правые позиции поля
шириной n
символов выводится результат True
или False булевского
выражения В

Значение
В

Выражение

Результат

True

Write(В:5)

_
True

False

Write(В:6,
not В:5)

_
False_ True

Пример
программы с использованием Write:

Var
A: integer;

B,
C, D: real;

begin

А:=2;
В:=5.8;

Write(A:3,’
’:2); Writeln(B:4:2);

C:=A+B;

D:=A*B;

Writeln;

Writeln(‘Сумма
‘, ‘ C=‘,
C:3:1);

Writeln(‘Произведение
‘, ‘ D=‘, D);

end.

Результат
выполнения:

_
_ 2_ _5.80

Сумма
C=5.8

Произведение
D=1.1600000000Е+01

3.2 ОПЕРАТОРЫ

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

О
ператором

называется предложение языка
программирования, задающее полное
описание некоторого действия, которое
необходимо выполнить.

Операторы
языка Паскаль можно разделить на простые
и структурные.

Операторы,
не содержащие никаких других операторов,
называются простыми:

  • оператор
    присваивания

  • оператор
    безусловного перехода

  • оператор
    вызова процедуры

  • пустой
    оператор

Структурные
(сложные) – представляют собой
конструкции, содержащие простые
операторы.

3.2.1 Простые
операторы

Главная » Информатика — 5 — 9 классы

Program1.pas(6) : Встречено ‘WriteLN’, а ожидалось ‘;’
program калькулятор;
var a,b,c:integer;
begin
WriteLN (‘введите число

a:’);
readln(a)
WriteLN; (‘введите число b:’);
readln(b)
c:=a+b;
writeln(‘ответ’,c);
end
объясните пожалуйста что надо сделать

Ответ №1

program calculator;

var  

 a,b,c:integer;

begin

 Writeln (‘введите число a:’);

 readln(a);

 Writeln (‘введите число b:’);

 readln(b);

 c:=a+b;

 writeln(‘ответ: ‘,c);

end.

Понравилась статья? Поделить с друзьями:
  • Ошибка ввода пинкода пинкод уже укомплектован или устарел
  • Ошибка взаимной проверки подлинности между локальным адаптером bluetooth
  • Ошибка вещественное деление на ноль
  • Ошибка ветки реестра ключ не найден в реестре
  • Ошибка весов нет инициализации sram