Нельзя изменять значение переменной цикла внутри этого цикла паскаль как исправить

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

Нельзя изменять значение переменной цикла внутри этого цикла

А вот собственно сам код:

uses crt;
type
   Tmas=array[1..20] of real;
   Tmatr=array[1..20] of Tmas;
procedure Per(k,n:integer;var a:Tmatr; var b:Tmas);
var i,j:integer;z:real;
begin
   z:=a[k,k];i:=k;//если главный элемент строки (a[k,k])=0, z=0; запоминаем эту строку  
                                            ///(i:=k;) 
   for j:=k+1 to n do //от следующей стороки до конца ищем самый большой элемент в том столбце, где 0
     begin
       if abs(a[j,k])>z then //обычный поиск максимального
          begin
            z:=a[j,k];
            i:=j;
          end;
       if i>k then //если нашли больше ноля
          begin     
            for j:=k to n do //то делаем обмен элементами между строкой с нолем и            
               begin    //строкой с максимальным элементом в столбце с нолем
                 z:=a[i,j];a[i,j]:=a[k,j];a[k,j]:=z;
               end;
            z:=b[i];b[i]:=b[k];b[k]:=z; //обмениваем свободные члены
          end;
       end;
     end;
var a:Tmatr; //матрица системы
    b:Tmas;   //массив свободных членов
    x:Tmas;   //массив корней системы
    n,i,j,k:integer; //счетчики циклов
    z,r,g:real;  //вспомогательные переменные при расчетах
begin
clrscr;
write('Введите количество уравнений n=');
readln(n);
writeln('Введите коэффициенты системы и свободные члены');
for i:=1 to n do
for j:=1 to n+1 do
read(A[i,j]);  //вводим в строку через пробел коэффициенты и свободный член первого уравнения, жмем  
                    //Enter, 
                   //вводим следующую строку и так до конца
clrscr;     //очищаем экран
writeln('Матрица коэффициентов и свободных членов'); //выводим матрицу системы
for i:=1 to n do
  begin
    for j:=1 to n+1 do
    write(A[i,j]:6:2);
    writeln;
  end;
//Прямой ход Гаусса, преобразуем квадратную матрицу коэффициентов в треугольную типа
//2,35 -5,36 4,56 16,25
//0,00 -3,25 7,26 25,39
//0,00 0,00 2,35 59,23  //здесь потом найдем 3-ий корень (59,23/2,35), а от него обратным ходом остальные
for i:=1 to n do
b[i]:=a[i,n+1];  //присваиваем значения массиву свободных членов (последний столбец матрицы)
for k:=1 to n do  //начинаем с первой строки
     begin
       if a[k,k]=0 then Per(k,n,a,b);//добавлена процедура
       for j:=k+1 to n do //идем по строке выше главной диагонали до конца
          begin
            r:=a[j,k]/a[k,k]; //вычисляем коэффициент приведения первых коэффициентов, чтобы они были   
                                    //равны и при вычитании давали 0 (освобождаемся от очередного неизвестного), 
                                    //например    
                                    //1-е ур. 2х1+3х1-4х3=12
                                     //2-е ур -3х1+2х2+2х3=25
                                     //r= -3/2, тогда 2х1*-3/2=-3х1 
                                     //вычтем из ур.2-ур.1, х1 исчезнет 
           for i:=k to n do
               begin
                 a[j,i]:=a[j,i]-r*a[k,i]; //сейчас умножив все первое урававнение на -3/2,  вычитаем из первого  
              end;                         //уравнения второе      
           b[j]:=b[j]-r*b[k];             //и свободнгые члены
        end;
     end;
   //система будет 1.    2х1+3х1-4х3=12
   //                         2.   0х1+(2-(3*-3/2))х2 +(2+(4*-3/2)=25-12*(-3/2)
//Обратный ход Гаусса, находим корни
for k:=n downto 1 do //от последней строки к первой
     begin
       r:=0;
       for j:=k+1 to n do //в строке от главной диагонали вправо (где не ноли)
         begin
           g:=a[k,j]*x[j]; //умножаем коэффициенты на  известные уже корни
           r:=r+g;         //суммируем
         end;
      x[k]:=(b[k]-r)/a[k,k];  //из преобразованного прямым ходом свободного члена вычитаем полученную  
                                      //суммму и делим на первый коэффициент (который на главной диагонали)
     end;   
writeln('Корни системы:'); //выводим результат
for i:=1 to n do
write('x[',i,']=',x[i]:0:2,'   ');
readln;
end.

PascalABC.Net
Помогите пожалуйста исправить проблему или подскажите, что не так. Заранее большое спасибо 🙂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
program labI4(input,output);
Uses crt;
Label m1;
Var   a,a5: array [1..25,1..25] of real;
      b,b5: array [1..25] of real;
      k,i,m,n,st:integer;
      t,x:real;
BEGIN
 clrscr;
 write('Vvedite razmernost');
 readln(n);
 For i:=1 to n do
 For k:=1 to n do begin
  write('a[',i,',',k,']=');readln(a[i,k]);a5[i,k]:=a[i,k];
 end;
 writeln('Vvedite svobodnye chleny B');
 For i:=1 to n do begin
  write('b[',i,']=');readln(b[i]);b5[i]:=b[i];
 end;
 writeln('Nachalnaya matriza');
 For i:=1 to n do begin
  For k:=1 to n do begin
   write('a[',i,',',k,']=',a[i,k]:5:2,'':4);
  end;
  writeln('b[',i,']=',b[i]:5:2,'':4);
 end;
 readln;
 For k:=1 to n do begin
  st:=k;
  For i:=k to n do
   If a[st,k]<=a[i,k] Then st:=i;
  For i:=1 to n do begin
   t:=a[k,i];
   a[k,i]:=a[st,i];
   a[st,i]:=t;
  end;
  t:=b[k];
  b[k]:=b[st];
  b[st]:=t;
  For i:=1 to n do begin
   If i=k Then i:=i+1;
   If i=n+1 Then goto m1;
   t:=a[i,k]/a[k,k];
   For m:=1 to n do
    a[i,m]:=a[i,m]-t*a[k,m];
   b[i]:=b[i]-t*b[k];
  end;
  m1:
 end;
 writeln(' Konechnaya matriza');
 For i:=1 to n do begin
  For k:=1 to n do begin
   write('a[',i,k,']=',a[i,k]:5:2,'':4);
  end;
  writeln('b[',i,']=',b[i]:5:2,'':4);
 end;
 readln;
 For k:=1 to n do begin
  x:=b[k]/a[k,k];
  writeln('x(',k,')=',x:5:2);
  a[1,k]:=x;
 end;
 readkey
END.

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

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.

Ссылки

  • Программы для начинающих
  • Сайт PascalABC.NET: Программы и алгоритмы для начинающих
uses crt;
 var a,b,d,x,x1,y,j,k : integer; {j - количество четных цифр, k - нечетных, d -
                             количество натуральных чисел}
 BEGIN
    writeln('Введите число а > ');
    readln(a);
    writeln('Введите число b > ');
    readln(b);
    if ((a<0) or (a>b)) then
    writeln('Числа a и b должны быть натуральными, причем a<b!')
    else
     begin
      d:=0;
      for x:=a to b-1 do
      if (x mod 2 = 0) then
       begin
        x1:=x;//нельзя издеваться над счетчиком цикла...
        j:=0;
        k:=0;
        while x1>0 do
         begin
          y:=x1 mod 10;
          if y mod 2 =0 then j:=J+1
          else k:=k+1;
          x1:=x1 div 10;
         end;
        if j>k then d:=d+1;
       end;
      writeln('Количество четных натуральных чисел, принадлежащих интервалу');
      writeln('[',a,';',b,'), у которых количество четных цифр больше количества');
      writeln('нечетных, равно ', d, ' ');
    end;
END.

Пишет что в 21 строке Program1.pas(21) : Нельзя изменять значение переменной цикла внутри этого цикла. Что делать. Паскаль
Pascal

Const n=15;
Var a:array[1..n-1] of integer;
var i,j,ik,sum, ch, il, min: integer;
begin
  randomize;
  for i:=1 to n-1 do begin
    a[i]:=random(100)-20; write(a[i]:4);
  end; writeln; min:=1000;
  for i:=1 to n-1 do
    if a[i]<min then min:=a[i];
  writeln (‘Минимальный элемент массива =’, min); sum:=0;
  for i:=n-1 downto 1 do
    if a[i]>0 then il:=i;
  for i:=1 to n-1 do
    if a[i]>0 then ik:=i;
    for i:=il to ik do begin
      sum:=a[i]+sum; end;
    writeln (‘Сумма элементов между первым положительным и последним = ‘, sum); j:=0;
    for i:=2 to n-1 do begin
    if (a[i]=0) then begin
      ch:=a[1+j]; a[1+j]:=a[i]; a[i]:=ch; i:=i+1; j:=j+1;  end; end;
      for i:=1 to n-1 do
        write (a[i], ‘ ‘);
      writeln;
end.

Добавить комментарий