IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Досрочный выход из цикла(while)
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Женя

Репутация: -  0  +


Здравствуйте,преподаватель заставил доделать 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;


Сообщение отредактировано: Engl -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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.

Сообщение отредактировано: Lapp -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Женя

Репутация: -  0  +


Спасибо,к другим задачам можно увидеть правильный цикл
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Во-первых, небольшое исправление.. Сейчас заметил: в том моем куске нужно знаки "<" заменить на "<=" (я сейчас подредактирую тот мессадж. Ну, и поскольку я там ошибся, так уж и быть, напишу про второй номер..
Цитата(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;


Все, дальше попробуй из этих примеров сделать выводы и напиши остальное сам. Или хотя бы попытайся. Результат можешь показать, проверим.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Женя

Репутация: -  0  +


Первая задача не правильно работает ><
Для третье вот мой код:
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;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Первая задача не правильно работает ><
А не надо использовать ГЛОБАЛЬНУЮ переменную в качестве счетчика цикла. У тебя и в основной программе и в подпрограмме цикл по 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). Ничего не напоминает?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Женя

Репутация: -  0  +


Допустим мы берем новую переменную для счетчика "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;


Так?

Сообщение отредактировано: Engl -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Зачем ты вводишь ЕЩЕ ОДНУ глобальную переменную? Вот так не проще будет:
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;
?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Женя

Репутация: -  0  +


Теперь понял,но все равно не правильно вычисляет
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 7:30
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name