Помощь - Поиск - Пользователи - Календарь
Полная версия: Досрочный выход из цикла(while)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Engl
Здравствуйте,преподаватель заставил доделать 3 задачи,то есть заменить циклы for на while,у меня с этим туго получается..
Вот коды задачек:
1)Дана матрица и массив,нужно удалить эл-ты тех столбцов,которые присутствуют в массиве и вычислить сумму оставшихся столбцов

program abc;
uses crt;
const
N=5; M=5; K=5;
var
A: array[1..N,1..5] of integer;
B: array[1..K] of integer;
i,j,p,sum:integer;
Procedure zadan(p:integer); //
begin
for j:=1 to M do
A[j,p]:=0;
end;
Procedure summa(p:integer); //
begin
sum:=0;
for i:=1 to N do
sum:=sum+a[i,p];
writeln('summa ',p,'-ro stlobza=',sum);
end; //

begin
clrscr;
writeln('Vvodite elementbI matrizi A:');
for i:=1 to N do
for j:=1 to M do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln('Vvodite elementbI massiva B:');
for i:=1 to K do begin
write('B[',i,']=');
readln(b[i]);
end;
writeln;
writeln('Na4alnii massiv:');
for i:=1 to N do begin
for j:=1 to M do
write(a[i,j],', ');
writeln; end; writeln;

for p:=1 to M do begin //
for i:=1 to K do
if B[i]=p then begin zadan(p);end;
if B[i]<>p then summa(p);
end; writeln; //
writeln('Obrabotanna9 matriza: ');
for i:=1 to N do begin
for j:=1 to M do
write(a[i,j],', ');
writeln; end;
readln;
end.

В этой задаче нужно заменить на while в этом месте


for p:=1 to M do begin //
for i:=1 to K do
if B[i]=p then begin zadan(p); end;
if B[i]<>p then summa(p);

Вот,что я попытался сделать:

p:=1;
i:=1;
while (p<>m) and (i<>k) do begin
if B[i]=p then begin zadan(p); end;
if B[i]<>p then summa(p);
inc(p);
inc(i);


2) Дана матрица и массив,нужно сортировать методом пузырька по убыванию тех строк,которые присутствуют в массиве

program ABC;
uses crt;
const
N=5; M=5; K=5;
var
C: array[1..N,1..M] of integer;
D: array[1..K] of integer;
i,j,o: integer;

Procedure Sort(o:integer);
{Procedura sortirovki massiva, pereda4a globalnogo parametra "O"}
var tmp,p:integer;
begin
for p:=1 to M do //
for j:=2 to M do
if C[o,j]>C[o,j-1] then
begin
tmp:=C[o,j-1];
C[o,j-1]:=C[o,j];
C[o,j]:=tmp;
end; //
end;
begin
clrscr;
writeln('Vvedite elementbI massiva C:'); {}
for i:=1 to N do
for j:=1 to M do
begin
write('C[',i,',',j,']=');
readln(C[i,j]);
end;
writeln('Vvedite elementbI massiva D:');
for i:=1 to K do
begin
write('D[',i,']=');
readln(D[i]);
if D[i]<=N then begin O:=D[i]; Sort(o); end;
end;
writeln;writeln('Otsortirovanna9 matriza:');writeln;
for i:=1 to 5 do begin
for j:=1 to 5 do
write(C[i,j],', ');
writeln;
end;
readln;
end.



В этой задаче нужно заменить на while в этом месте

for i:=1 to K do
begin
write('D[',i,']=');
readln(D[i]);
if D[i]<=N then begin O:=D[i]; Sort(o); end;
end;


Вот,что я попытался сделать:

i:=1
while i<>k do begin
begin
write('D[',i,']=');
readln(D[i]);
if D[i]<=N then begin O:=D[i]; Sort(o); end;
end;
inc(i);


3)Дана матрица и массив,нужно сортировать по убыванию методом установки эл-ты тех столбцов,которые присутствуют в массиве
program abc;
uses crt;
const
N=5; M=5; k=7;
var
C:array[1..n,1..n] of integer;
d:array[1..k] of integer;
zna4:boolean;
i,j,p: integer;
procedure zadan(j:integer); //

var
tmp,h:integer;
begin
writeln('sortirovka stolbza ü ',j);
for h:=1 to N do
for i:=2 to N do
if c[i-1,j]<c[i,j] then
begin
tmp:=c[i-1,j];
c[i-1,j]:= c[i,j];
c[i,j]:=tmp;
end;
end; //
begin
clrscr;
writeln('Vvodite massiv C:');
for i:=1 to N do
for j:=1 to M do begin
write('C[',i,',',j,']=');
readln(c[i,j]);
end;
writeln('vvodite elementbI massiva D:');
for i:=1 to K do
begin
write('D[',i,']=');
readln(d[i]);
end;

writeln('Na4aln99 matriza: ');
for i:=1 to N do begin
for j:=1 to M do
write(c[i,j],', ');
writeln;
end; writeln;
for j:=1 to M do

begin
for i:=1 to N do
begin
zna4:=false;
for p:=1 to K do
if c[i,j]=D[p] then begin zna4:=true; break; end;
if zna4=false then begin break; break end;
end;
if zna4=true then zadan(j);
end;


writeln;writeln('Obrabotanna9 matriza:');
for i:=1 to N do begin
for j:=1 to N do
write(c[i,j],', ');
writeln;
end; writeln;
readln;
end.

В этой задаче нужно заменить на while в этом месте
 for j:=1 to M do   

begin
for i:=1 to N do
begin
zna4:=false;
for p:=1 to K do
if c[i,j]=D[p] then begin zna4:=true; break; end;
if zna4=false then begin break; break end;
end;
if zna4=true then zadan(j);
end;
Lapp
Цитата(Engl @ 15.01.2010 21:15) *
1)Дана ...
В этой задаче нужно заменить на while в этом месте

for p:=1 to M do begin //
for i:=1 to K do
if B[i]=p then begin zadan(p); end;
if B[i]<>p then summa(p);

Вот,что я попытался сделать:

p:=1;
i:=1;
while (p<>m) and (i<>k) do begin
if B[i]=p then begin zadan(p); end;
if B[i]<>p then summa(p);
inc(p);
inc(i);
Во-первых, при цитировании первого куска нельзя забывать заевршающий end. Во-вторых, там ДВА вложенных цикла for, поэтому должно быть и два цикла while. В каждом свое условие, объединять их нельзя, поскольку приращение должно быть отдельное. Иначе гоаоря, цикл по i проходит много раз, при каждом значении p. Вот, смотри:

p:=1;
while p<=m do begin
i:=1;
while i<=k do begin
if B[i]=p then zadan(p) else summa(p);
inc(i)
end;
inc(p)
end;

Кроме прочего, я заменил два if на один if .. else.
Engl
Спасибо,к другим задачам можно увидеть правильный цикл
Lapp
Во-первых, небольшое исправление.. Сейчас заметил: в том моем куске нужно знаки "<" заменить на "<=" (я сейчас подредактирую тот мессадж. Ну, и поскольку я там ошибся, так уж и быть, напишу про второй номер..
Цитата(Engl @ 15.01.2010 21:15) *
2) Дана ...
В этой задаче нужно заменить на while в этом месте
for i:=1 to K do
begin
write('D[',i,']=');
readln(D[i]);
if D[i]<=N then begin O:=D[i]; Sort(o); end;
end;


Вот,что я попытался сделать:
i:=1
while i<>k do begin
begin
write('D[',i,']=');
readln(D[i]);
if D[i]<=N then begin O:=D[i]; Sort(o); end;
end;
inc(i);

Зачем тут второй begin? И почему приращение inc(i) вылезло за пределы блока? И опять неравенство в условии нужно нестрогое. Вот так:
i:=1;
while i<=k do begin
write('D[',i,']=');
readln(D[i]);
if D[i]<=N then begin
O:=D[i];
Sort(o);
end;
inc(i);
end;


Все, дальше попробуй из этих примеров сделать выводы и напиши остальное сам. Или хотя бы попытайся. Результат можешь показать, проверим.
Engl
Первая задача не правильно работает ><
Для третье вот мой код:
for j:=1 to M do

begin
for i:=1 to N do
begin
zna4:=false;
p:=1;
while p<=k do begin

if c[i,j]=D[p] then begin zna4:=true; break; end;
if zna4=false then begin break; break end;
end;
if zna4=true then zadan(j);
inc(P);
end;
end;

volvo
Цитата
Первая задача не правильно работает ><
А не надо использовать ГЛОБАЛЬНУЮ переменную в качестве счетчика цикла. У тебя и в основной программе и в подпрограмме цикл по i (причем это именно одна и та же переменная, физически она одна, второй просто нет!!!), вот и получается, что после возврата из подпрограммы, значение i совсем не то, что было перед заходом в нее... Вот тут, я имею в виду:

Цитата
p:=1;
while p<=m do begin
i:=1;
while i<=k do begin
if B[i]=p then zadan(p) else summa(p);
inc(i) { <--- Вот именно здесь все и нарушено... }
end;
inc(p)
end;
Диагноз: описывай в подпрограмме локальную переменную для цикла.

Читаем Как не надо писать программы (пункт 3). Ничего не напоминает?
Engl
Допустим мы берем новую переменную для счетчика "z",и описываем ее в начале и в одной из процедур
И заменяем ее вместо "I"
p:=1;
while p<=m do begin
z:=1;
while z<=k do begin
if B[z]=p then zadan(p) else summa(p);
inc(z)
end;
inc(p)
end;


Так?
volvo
Зачем ты вводишь ЕЩЕ ОДНУ глобальную переменную? Вот так не проще будет:
Procedure summa(p:integer);
var i, sum: integer; { <--- !!! }
begin
sum:=0;
for i:=1 to N do
sum:=sum+a[i,p];
writeln('summa ',p,'-ro stlobza=',sum);
end;
?
Engl
Теперь понял,но все равно не правильно вычисляет
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.