Переменная цикла for должна описываться в том же блоке что и цикл for
Перейти к содержимому

Переменная цикла for должна описываться в том же блоке что и цикл for

  • автор:

Научный форум dxdy

чего он хочет? и зачем вообще проверяет процедуру мою до того, как я начал вбивать эти данные? не должен ли он сначала делать саму программу и приходить к процедуре только тогда, когда я её вызову? мб я не так оформил? вроде бы поставил всё перед основным begin’ом. а так это моя первая работа с процедурами, подскажите, на что стоит обратиться внимание, а то ищу в сети литературу и нет ничего целикового и для тех кто первый раз использует procedure

Re: Procedure (Pascal)
21.10.2012, 16:49
Приведите весь текст процедуры.
Re: Procedure (Pascal)
21.10.2012, 16:51
Используется синтаксис Pascal

procedure Razdel;
begin
baza := ( right — left ) div 2 + 1 ;
mesto_bazu := baza;
repeat
repeat
if left = baza — 1 then break ;
if filelens [ left ] >filelens [ baza ] then break ;
left := left + 1 ;
until left = baza — 1 ;
repeat
if right = baza + 1 then break ;
if filelens [ baza ] >filelens [ right ] then break ;
right := right — 1 ;
until right = baza + 1 ;
if ( filelens [ left ] >filelens [ right ] ) and ( filelens [ left ] >filelens [ baza ] ) and ( filelens [ right ] < filelens [ baza ] ) then
begin
temp := filelens [ right ] ;
filelens [ right ] := filelens [ left ] ;
filelens [ left ] := temp;
left := left + 1 ;
right := right — 1 ;
end ;
until ( left = baza — 1 ) or ( right = baza + 1 ) ;
if left for i := 1 to baza — left do
if filelens [ baza — i ] >filelens [ baza ] then
begin
temp := filelens [ baza — i ] ;
filelens [ baza — i ] := filelens [ baza — 1 ] ;
filelens [ baza — 1 ] := temp;
temp := filelens [ baza ] ;
filelens [ baza ] := filelens [ baza — 1 ] ;
filelens [ baza — 1 ] := temp;
mesto_bazu := mesto_bazu — 1 ;
end ;
if right>baza then
for i := 1 to right — baza do
begin
if filelens [ baza + i ] begin
temp := filelens [ baza + i ] ;
filelens [ baza + i ] := filelens [ baza + 1 ] ;
filelens [ baza + 1 ] := temp;
temp := filelens [ baza ] ;
filelens [ baza ] := filelens [ baza + 1 ] ;
filelens [ baza + 1 ] := temp;
mesto_bazu := mesto_bazu + 1 ;
end ;
if baza + i = right then break ;
end ;
end ;

Оператор цикла for

Кроме того, переменную можно описать непосредственно в заголовке цикла:

for переменная : тип := начальное значение to или downto конечное значение do
оператор

for var переменная := начальное значение to или downto конечное значение do
оператор

В последнем случае используется автоопределение типа переменной по типу начального значения. В двух последних случаях область действия объявленной переменной распространяется до конца тела цикла, которое в данном случае образует неявный блок. Вне тела цикла такая переменная недоступна, поэтому следующий цикл может использовать переменную с тем же именем:

for var i := 1 to 10 do
Print(i);
for var i := 1 to 5 do
Print(i*i);

Текст от слова for до слова do включительно называется заголовком цикла , а оператор после do телом цикла . Переменная после слова for называется параметром цикла . Для первой формы цикла с ключевым словом to параметр цикла меняется от начального значения до конечного значения, увеличиваясь всякий раз на единицу, а для второй формы ключевым словом downto — уменьшаясь на единицу. Для каждого значения переменной-параметра выполняется тело цикла. Однократное повторение тела цикла называется итерацией цикла . Значение параметра цикла после завершения цикла считается неопределенным.

Переменная-параметр цикла может иметь любой порядковый тип. При этом начальное и конечное значения должны быть совместимы по присваиванию с переменной-параметром цикла.

var en: (red,green,blue,white);
.
for
en := red to blue do
write(Ord(en):2);
for var c := ‘a’ to ‘z’ do
write(c);

Если для цикла for . to начальное значение переменной цикла больше конечного значения или для цикла for . downto начальное значение переменной цикла меньше конечного значения, то тело цикла не выполнится ни разу.

Если цикл используется в подпрограмме, то переменная-параметр цикла должна быть описана как локальная. Наилучшим решением в PascalABC.NET является описание переменной в заголовке цикла.

Изменение переменной-параметра цикла внутри цикла является логической ошибкой. Например, следующий фрагмент со вложенным оператором for является ошибочным:

for i := 1 to 10 do
i -= 1;

Переменная цикла for должна описываться в том же блоке что и цикл for

Регистрация: 16.05.2019

Сообщений: 1

[РЕШЕНО][Pascal ABC] Ошибка: переменная цикла for должна описываться в том же блоке что и цикл for

uses crt; const m=20; n=35; type mas=array [1..100,1..100] of integer; var i,j,k,x,y,t,l,r,u,d,z:integer; a,b:mas; Procedure graf(a:mas); begin for y:=1 to m do begin for x:=1 to n do if a[y,x]=1 then write('-') else write(' '); writeln; end; end; Procedure prep; begin For y:=1 to m do for x:=1 to n do a[y,x]:=1; end; Procedure mway; begin randomize; k:=random(m-1)+1; x:=1; y:=k; a[y,x]:=0; a[y,x+1]:=0; x:=x+1; repeat k:=random(3); case k of 0: if (a[y-1,x]<>0) and (y-1>1) and (a[y-1,x-1]<>0) and (a[y-1,x+1]<>0) then begin a[y-1,x]:=0; y:=y-1; end; 1: if (a[y,x+1]<>0) and (a[y-1,x+1]<>0) and (a[y+1,x+1]<>0) then begin a[y,x+1]:=0; x:=x+1; end; 2: if (a[y+1,x]<>0) and (y+10) and (a[y+1,x-1]<>0) then begin a[y+1,x]:=0; y:=y+1; end; 3: if (a[y,x-1]<>0) and (x-1>1) and (a[y+1,x-1]<>0) and (a[y-1,x-1]<>0) then begin a[y,x-1]:=0; x:=x-1; end; end; until x=n; end; Procedure ris(a:mas); begin For y:=1 to m do begin for x:=1 to n do Write(a[y,x]); Writeln; end; end; begin clrscr; prep; mway; ris(a); t:=0; randomize; Writeln('Для продолжения нажмите ENTER'); readln; repeat x:=random(n-2)+1; For y:=1 to m do if a[y,x]=0 then begin u:=0; d:=0; r:=0; l:=0; z:=0; repeat k:=random(4); case k of 0: if (a[y-1,x]<>0) and (y-1>1) and (a[y-2,x]>0) and (a[y-2,x-1]<>0) and (a[y-2,x+1]<>0) and (a[y-1,x-1]<>0) and (a[y-1,x+1]<>0) then begin a[y-1,x]:=0; u:=0; y:=y-1; end else u:=1; 1: if (a[y,x+1]<>0) and (a[y,x+2]<>0) and (a[y-1,x+1]<>0) and (a[y+1,x+2]<>0) and (a[y-1,x+2]<>0) and (a[y+1,x+1]<>0) then begin a[y,x+1]:=0; r:=0; x:=x+1; end else r:=1; 2: if (a[y+1,x]<>0) and (a[y+2,x]<>0) and (y+10) and (a[y+2,x+1]<>0) and (a[y+2,x-1]<>0) and (a[y+1,x-1]<>0) then begin a[y+1,x]:=0; y:=y+1; d:=0; end else d:=1; 3: if (a[y,x-1]<>0) and (a[y,x-2]<>0) and (x-1>1) and (a[y+1,x-1]<>0) and (a[y+1,x-2]<>0) and (a[y-1,x-2]<>0) and (a[y-1,x-1]<>0) then begin a[y,x-1]:=0; x:=x-1; l:=0; end else l:=1; end; z:=u+l+r+d; until z=4; end; t:=t+1; until t=m*n; ris(a); graf(a); readln end.

Регистрация: 12.11.2010

Сообщений: 8,570

Вот так надо писать цикл for в Pascal ABC:

for var i:=1 to N do . 

Дополнительно объявлять переменную i (параметр цикла) в таком случае не надо.

Вадим Мошев
Посмотреть профиль
Найти ещё сообщения от Вадим Мошев

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО] Как убрать цикл for, оставив тело Kosta Riko Паскаль, Turbo Pascal, PascalABC.NET 2 17.12.2018 13:11
[Pascal ABC.NET] Графика и CRT. Ошибка, которая не должна быть DKFL2002 Паскаль, Turbo Pascal, PascalABC.NET 9 17.10.2018 12:52
Не изменяется переменная, хотя должна изменятся, что делать? ponchic Win Api 2 10.05.2016 20:14
Изменяется переменная, хотя не должна изменяться:( ponchic Win Api 2 08.05.2016 10:45
[РЕШЕНО]: Turbo Pascal. Ошибка 36: Begin expected. qoTIuHr Паскаль, Turbo Pascal, PascalABC.NET 7 24.07.2015 01:10

Переменная цикла for должна описываться в том же блоке что и цикл for

Здравствуйте помогите пожалуйста
Разработать программу решения четырех взаимосвязанных задач частой работы:
1)расчета элементов квадратной матрицы A = (ai,j ), i,j = 1,2. n по заданной формуле;
2)вычисления элементов вектора X = (xi), i = 1,2. n по заданному правилу;
3)требуемого упорядочения элементов матрицы А или вектора Х;
4)вычисления значения y по заданной формуле.
Размерность задачи n назначается преподавателем

1) аij=( 2.2 +j*(8.4*i + 1)^1/2)/(10^ln(i*j) +5)
2) xi=(сигма от n до j=1) ln(bji) где bji — элементы матрицы полученной заменой аij на сумму элементов i-й строки;
3)Упорядочить элементы строк матрицы А по убыванию значений;
4) y=(сигма от (n-1) до (i=2)) (x(i-1))/xi)+(xi/(x(i+1));

Регистрация: 08.03.2016
Сообщений: 0
Vladimir_S
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184

Uses CRT; Const Nmax=9; Var N,i,j:Integer; A,B:Array[1..Nmax,1..Nmax] of Real; X:Array[1..Nmax] of Real; Y:Real; Procedure Matrix_A; begin for i:=1 to N do begin for j:=1 to N do begin A[i,j]:=(2.2+Sqrt(8.4*i+1)*j)/(Exp(Ln(i*j)*Ln(10))+5); Write(A[i,j]:8:3); end; Writeln; end; end; Procedure Matrix_B; var S:Real; begin for i:=1 to N do begin S:=0; for j:=1 to N do S:=S+A[i,j]; for j:=1 to N do begin B[i,j]:=S; Write(B[i,j]:8:3); end; Writeln; end; end; Procedure Vector_X; begin for i:=1 to N do begin X[i]:=0; for j:=N downto 1 do X[i]:=X[i]+Ln(B[i,j]); Write(X[i]:8:3); end; Writeln; end; Procedure Ordering; var k:Integer; D:Real; begin for i:=1 to N do begin for j:=1 to N-1 do for k:=1 to N-j do if A[i,k]Nmax then Writeln('N must be < ',Nmax+1,'!'); Until N
Регистрация: 14.03.2015
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
выдает ошибку
Program1.pas(1,6): Модуль 'CRT' не найден
Хозяин Медной Горы
Регистрация: 01.08.2011
Адрес: Армавир
Сообщений: 12,159
Записей в дневнике: 8
Сказал(а) спасибо: 751
Поблагодарили 88 раз(а) в 27 сообщениях
Репутация: 57416
Сообщение от Lion17
Модуль 'CRT' не найден
Это не ТП это чёрте-что. Модуль СRТ встроен в ТП, его искать не надо.
Регистрация: 14.03.2015
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
я не совсем разбираюсь, можете по подробнее объяснить
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Хозяин Медной Горы
Регистрация: 01.08.2011
Адрес: Армавир
Сообщений: 12,159
Записей в дневнике: 8
Сказал(а) спасибо: 751
Поблагодарили 88 раз(а) в 27 сообщениях
Репутация: 57416
У Вас обычный Турбо/Борланд Паскаль или АВС/Лазарус?
Vladimir_S
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
Сообщение от Lion17
я не совсем разбираюсь, можете по подробнее объяснить

А для этого нам нужно знать, что у Вас за Паскаль. Паскали - они ведь разные бывают. Tubo, Free, Borland, ABC, Lazarus.
Ладно, вот Вам вариант без CRT. Попробуйте:

Const Nmax=9; Var N,i,j:Integer; A,B:Array[1..Nmax,1..Nmax] of Real; X:Array[1..Nmax] of Real; Y:Real; Procedure Matrix_A; begin for i:=1 to N do begin for j:=1 to N do begin A[i,j]:=(2.2+Sqrt(8.4*i+1)*j)/(Exp(Ln(i*j)*Ln(10))+5); Write(A[i,j]:8:3); end; Writeln; end; end; Procedure Matrix_B; var S:Real; begin for i:=1 to N do begin S:=0; for j:=1 to N do S:=S+A[i,j]; for j:=1 to N do begin B[i,j]:=S; Write(B[i,j]:8:3); end; Writeln; end; end; Procedure Vector_X; begin for i:=1 to N do begin X[i]:=0; for j:=N downto 1 do X[i]:=X[i]+Ln(B[i,j]); Write(X[i]:8:3); end; Writeln; end; Procedure Ordering; var k:Integer; D:Real; begin for i:=1 to N do begin for j:=1 to N-1 do for k:=1 to N-j do if A[i,k]Nmax then Writeln('N must be < ',Nmax+1,'!'); Until N

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *