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

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


== Ссылки ==
== Ссылки ==
[[Алгоритмы_для_начинающих_на_примерах|Алгоритмы для начинающих]]
*[[Программы для начинающих]]
*[http://pascalabc.net/ru/programmyi-i-algoritmyi-dlya-nachinayuschih.html Сайт PascalABC.NET: Программы и алгоритмы для начинающих]

Текущая версия от 15:49, 19 января 2010

Неверный тип переменной цикла

var x: real;
begin
  for x := 1 to 10 do // переменная - параметр цикла не может иметь вещественный тип
    write(x);
end.

Изменение переменной цикла в теле цикла

Пример 1.

var i: integer;
begin
  for i := 1 to 10 do
  begin
    write(i);
    i := i + 2; // Нельзя изменять значение переменной цикла внутри цикла
  end;  
end.

Пример 2.

var i: integer;
begin
  for i := 1 to 10 do
  begin
    read(i); // Нельзя изменять значение переменной цикла внутри цикла
    write(i);
  end;  
end.

Использование одинаковой переменной цикла в заголовках вложенных циклов

var i,j: integer;
begin
  for i := 1 to 10 do
  for i := 1 to 10 do // ошибка: во вложенном цикле нельзя использовать параметр цикла с тем же именем
  begin
    write(i);
  end;  
end.

Неинициализированная переменная

var 
  i: integer;
  p: real;
begin
  // Забыли инициализировать p := 1
  for i := 1 to 10 do
    p := p * 2;
  write(p);  
end.

Зацикливание

var x: integer;
begin
  x := 1;
  while x>0 do // ошибка: условие все время остается истинным
  begin
    writeln(x);
    x := x + 1;
  end;
end.

Переполнение

var 
  n: integer;
  x: real;
begin
  n := integer.MaxValue; // максимальное целое
  writeln(n);
  n := n + 1; // следующее за максимальным целым
  writeln(n);  
  writeln;
  
  x := real.MaxValue; // максимальное вещественное
  writeln(x);
  x := x * 2; // бОльшее, чем максимальное вещественное
  writeln(x); // в ряде компиляторов возникает ошибка переполнения. 
              // Здесь x получает значение "бесконечность"
end.

Сравнение вещественных чисел на равенство

begin
  if 0.3*3 = 0.9 then // Значения не равны ввиду ошибки округления при работе с вещественными числами
    writeln('Равны')
  else writeln('Не равны');
end.

Ссылки