Здравствуйте. Извиняюсь, за возможно глупый вопрос, но я только начал изучать Паскаль и уже много, что перепробовал для исправления проблемы, но не вышло, поэтому решил обратиться сюда. У меня такая проблема: при запуске программы пишет ошибку в 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.