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

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки
Строка 7: Строка 7:


=== Отсутствующая ; ===
=== Отсутствующая ; ===
<source lang="pascal">var S: integer // Ожидалась ;
<source lang="pascal">
begin
begin
  var S: integer // Ожидалась ;
   S := 1;  
   S := 1;  
end.</source>
end.</source>
<p>
<p>
<source lang="pascal">var S: integer;
<source lang="pascal">
begin
begin
   S := 1 // Ожидалась ;
   var S: integer := 1 // Ожидалась ;
   S := S + 1
   S := S + 1
end.</source>
end.</source>
Строка 20: Строка 21:


=== Несовместимость типов при присваивании ===
=== Несовместимость типов при присваивании ===
<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>
end.</source>
Безболезненно можно присваивать только данные одного типа. Если данные - разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ - в строку. Обратные преобразования не допускаются.
Безболезненно можно присваивать только данные одного типа. Если данные - разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ - в строку. Обратные преобразования не допускаются.


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


=== Ошибка ввода ===
=== Ошибка ввода ===
<source lang="pascal">var x: integer;
<source lang="pascal">
begin
begin
  var x: integer;
   read(x); // введите блаблабла и посмотрите, что получится
   read(x); // введите блаблабла и посмотрите, что получится
end.</source>
end.</source>
Строка 53: Строка 59:


=== Ошибка неинициализированной переменной ===
=== Ошибка неинициализированной переменной ===
<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>
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Строка 64: Строка 71:
<source lang="pascal">var x,c: integer;
<source lang="pascal">var x,c: integer;
begin
begin
   x := 0;
   var x: integer := 0;
   c := 666 div x; // Здесь происходит деление на 0
   var c: integer := 666 div x; // Здесь происходит деление на 0
end.</source>
end.</source>
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.

Версия от 09:55, 20 сентября 2014

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

begin
  S := 1; // Неизвестное имя S
end.

Все используемые переменные должны быть предварительно описаны в разделе описаний. В PascalABC.NET допускаются также описания переменных внутри блока.

Отсутствующая ;

begin
  var S: integer // Ожидалась ;
  S := 1; 
end.

begin
  var S: integer := 1 // Ожидалась ;
  S := S + 1
end.

Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки

Несовместимость типов при присваивании

begin
  var S: integer := 1.3; // Нельзя преобразовать тип real к integer
end.

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

Отсутствие закрывающего апострофа литеральной строки

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

Закрыть апостроф надо на той же строке, где расположен открывающий апостроф

Ошибки расстановки запятых и апострофов при выводе строк и выражений

begin
  var x, y: integer;
  x := 2; 
  y := 3;
  writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов
end.

Слишком много запятых и апострофов рядом, потому начинающие часто путаются :) Надо уяснить правила:

  • запятые разделяют разные элементы вывода
  • все, что находится в апострофах, будет выведено на экран без изменений

Ошибка ввода

begin
  var x: integer;
  read(x); // введите блаблабла и посмотрите, что получится
end.

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

Ошибка неинициализированной переменной

begin
  var x: integer;
  // Забыли инициализировать или ввести x
  var r := x * x;  // r получает тип integer
  writeln('Квадрат числа ', x, ' = ', r);
end.

Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.

Деление на 0

var x,c: integer;
begin
  var x: integer := 0;
  var c: integer := 666 div x; // Здесь происходит деление на 0
end.

Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.

Корень из отрицательного числа

begin
  writeln(sqrt(-1)); // Корень из отрицательного числа 
end.

В обычном Паскале возникает ошибка времени выполнения. В PascalABC.NET выводится NaN - Not a Number

Ссылки