Начало. Возможные ошибки: различия между версиями

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
 
(не показано 14 промежуточных версий 3 участников)
Строка 4: Строка 4:
   S := 1; // Неизвестное имя S
   S := 1; // Неизвестное имя S
end.</source>
end.</source>
Все используемые переменные должны быть предварительно описаны в разделе описаний.
Все используемые переменные должны быть предварительно описаны с помощью ключевого слова '''var''' (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).


=== Отсутствующая ; ===
=== Отсутствующая ; ===
<source lang="pascal">var S: integer // Ожидалась ;
<source lang="pascal">
begin
begin
   S := 1;  
  var S: integer
   S := 1;         // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка!
end.</source>
end.</source>
<p>
<p>
<source lang="pascal">var S: integer;
<source lang="pascal">
begin
begin
   S := 1 // Ожидалась ;
   var S := 1  
   S := S + 1
   S := S + 1 // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end.
end.</source>
end.</source>
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется '''в начале следующей строки'''.


=== Несовместимость типов при присваивании ===
=== Несовместимость типов при присваивании ===
<source lang="pascal">var S: integer;
<source lang="pascal">
begin
begin
   S := 1.3; // Нельзя преобразовать тип real к integer
   var S: integer := 1.3; // Нельзя преобразовать тип real к integer
end.</source>
Безболезненно можно присваивать только данные одного типа. Если данные - разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ - в строку. Обратные преобразования не допускаются.
 
Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая '''краткая''' форма объявления и инициализации переменной:
<source lang="pascal">
begin
  var S := 1.3; // Тип real будет выведен компилятором автоматически
end.</source>
end.</source>
Безболезненно можно присваивать только данные одного типа. Если данные - разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ - в строку. Обратные преобразования не допускаются.


=== Отсутствие закрывающего апострофа литеральной строки ===
=== Отсутствие закрывающего апострофа литеральной строки ===
<source lang="pascal">var x,y: integer;
<source lang="pascal">
begin
begin
   x := 2; y := 3;
   var x := 2;   // x получает тип integer
   writeln('Результат сложения равен=,x+y); // Не хватает закрывающего апострофа
  var y := 3;   // y получает тип integer
   writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа
end.</source>
end.</source>
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф


=== Ошибки расстановки запятых и апострофов при выводе строк и выражений ===
=== Ошибки расстановки запятых и апострофов при выводе строк и выражений ===
<source lang="pascal">var x,y: integer;
<source lang="pascal">
begin
begin
   x := 2; y := 3;
   var x := 2;   // x получает тип integer
   writeln(x,'+,'y,'=',x+y); // Неверная расстановка запятых и апострофов
  var y := 3;   // y получает тип integer
   writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов
end.</source>
end.</source>
Слишком много запятых и апострофов рядом, потому начинающие часто путаются :)  
Слишком много запятых и апострофов рядом, потому начинающие часто путаются :)  
Строка 46: Строка 55:


=== Ошибка ввода ===
=== Ошибка ввода ===
<source lang="pascal">var x: integer;
<source lang="pascal">
begin
begin
  var x: integer;
   read(x); // введите блаблабла и посмотрите, что получится
   read(x); // введите блаблабла и посмотрите, что получится
end.</source>
end.</source>
Это - ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой
Это - ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой.
 
Аналогичный фрагмент в более современном и предпочтительном синтаксисе:
<source lang="pascal">
begin
  var x := ReadInteger;
end.</source>


=== Ошибка неинициализированной переменной ===
=== Ошибка неинициализированной переменной ===
<source lang="pascal">var x,r: integer;
<source lang="pascal">
begin
begin
  var x: integer;
   // Забыли инициализировать или ввести x
   // Забыли инициализировать или ввести x
   r := x*x;
   var r := x * x; // r получает тип integer
   writeln('Квадрат числа ',x,' = ',r);
   writeln('Квадрат числа ', x, ' = ', r);
end.</source>
end.</source>
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.


=== Деление на 0 ===
=== Деление на 0 ===
<source lang="pascal">var x,c: integer;
<source lang="pascal">
begin
begin
   x := 0;
   var x := 0;
   c := 666 div x; // Здесь происходит деление на 0
   var c := 666 div x; // Здесь происходит деление на 0
end.</source>
end.</source>
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.


=== Корень из отрицательного числа ===
=== Корень из отрицательного числа ===
Строка 72: Строка 90:
   writeln(sqrt(-1)); // Корень из отрицательного числа  
   writeln(sqrt(-1)); // Корень из отрицательного числа  
end.</source>
end.</source>
В PascalABC.NET выводит NaN - Not a Number
В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN - Not a Number
 
== Ссылки ==
== Ссылки ==
[[Алгоритмы_для_начинающих_на_примерах|Оглавление]]
*[[Программы для начинающих]]
*[http://pascalabc.net/ru/programmyi-i-algoritmyi-dlya-nachinayuschih.html Сайт PascalABC.NET: Программы и алгоритмы для начинающих]

Текущая версия от 12:39, 26 августа 2015

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

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

Ссылки