Начало. Возможные ошибки: различия между версиями
Ulysses (обсуждение | вклад) (→Ошибка ввода: + ReadInteger) |
|||
(не показаны 44 промежуточные версии 4 участников) | |||
Строка 1: | Строка 1: | ||
__NOTOC__ | |||
=== Неописанная переменная === | === Неописанная переменная === | ||
<source lang="pascal">begin | <source lang="pascal">begin | ||
S := 1; // Неизвестное имя S | S := 1; // Неизвестное имя S | ||
end.</source> | end.</source> | ||
Все используемые переменные должны быть предварительно описаны с помощью ключевого слова '''var''' (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы). | |||
=== Отсутствующая ; === | === Отсутствующая ; === | ||
<source lang="pascal"> | <source lang="pascal"> | ||
begin | begin | ||
S := 1; | var S: integer | ||
S := 1; // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка! | |||
end.</source> | end.</source> | ||
<p> | <p> | ||
<source lang="pascal"> | <source lang="pascal"> | ||
begin | begin | ||
S := 1 | var S := 1 | ||
S := S + 1 | S := S + 1 // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end. | ||
end.</source> | end.</source> | ||
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется '''в начале следующей строки'''. | |||
=== Несовместимость типов при присваивании === | === Несовместимость типов при присваивании === | ||
<source lang="pascal"> | |||
begin | |||
var S: integer := 1.3; // Нельзя преобразовать тип real к integer | |||
end.</source> | |||
Безболезненно можно присваивать только данные одного типа. Если данные - разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ - в строку. Обратные преобразования не допускаются. | |||
Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая '''краткая''' форма объявления и инициализации переменной: | |||
<source lang="pascal"> | |||
begin | |||
var S := 1.3; // Тип real будет выведен компилятором автоматически | |||
end.</source> | |||
=== Отсутствие закрывающего апострофа литеральной строки === | === Отсутствие закрывающего апострофа литеральной строки === | ||
<source lang="pascal"> | |||
begin | |||
var x := 2; // x получает тип integer | |||
var y := 3; // y получает тип integer | |||
writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа | |||
end.</source> | |||
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф | |||
=== Ошибки расстановки запятых и апострофов при выводе строк и выражений === | === Ошибки расстановки запятых и апострофов при выводе строк и выражений === | ||
<source lang="pascal"> | |||
begin | |||
var x := 2; // x получает тип integer | |||
var y := 3; // y получает тип integer | |||
writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов | |||
end.</source> | |||
Слишком много запятых и апострофов рядом, потому начинающие часто путаются :) | |||
Надо уяснить правила: | |||
*запятые разделяют разные элементы вывода | |||
*все, что находится в апострофах, будет выведено на экран без изменений | |||
=== Ошибка ввода === | === Ошибка ввода === | ||
=== | <source lang="pascal"> | ||
begin | |||
var x: integer; | |||
read(x); // введите блаблабла и посмотрите, что получится | |||
end.</source> | |||
Это - ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой. | |||
Аналогичный фрагмент в более современном и предпочтительном синтаксисе: | |||
<source lang="pascal"> | |||
begin | |||
var x := ReadInteger; | |||
end.</source> | |||
=== Ошибка неинициализированной переменной === | === Ошибка неинициализированной переменной === | ||
<source lang="pascal"> | |||
begin | |||
var x: integer; | |||
// Забыли инициализировать или ввести x | |||
var r := x * x; // r получает тип integer | |||
writeln('Квадрат числа ', x, ' = ', r); | |||
end.</source> | |||
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной. | |||
=== Деление на 0 === | |||
<source lang="pascal"> | |||
begin | |||
var x := 0; | |||
var c := 666 div x; // Здесь происходит деление на 0 | |||
end.</source> | |||
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой. | |||
=== Корень из отрицательного числа === | === Корень из отрицательного числа === | ||
=== | <source lang="pascal">begin | ||
writeln(sqrt(-1)); // Корень из отрицательного числа | |||
end.</source> | |||
В обычном Паскале возникает ошибка времени выполнения. | |||
В 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