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

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
 
(не показана 21 промежуточная версия 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>
Слишком много запятых и апострофов рядом, потому начинающие часто путаются :)
Надо уяснить правила:
*запятые разделяют разные элементы вывода
*все, что находится в апострофах, будет выведено на экран без изменений


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


=== Корень из отрицательного числа ===
=== Корень из отрицательного числа ===
Строка 63: Строка 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

Ссылки