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

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

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

 
 Ответить  Открыть новую тему 
> Досрочный выход из цикла(while)
Engl
сообщение 15.01.2010 21:15
Сообщение #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 - 15.01.2010 21:43
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.01.2010 0:46
Сообщение #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 - 17.01.2010 10:58


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





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

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


Спасибо,к другим задачам можно увидеть правильный цикл
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 17.01.2010 10:58
Сообщение #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 
 К началу страницы 
+ Ответить 
Engl
сообщение 17.01.2010 18:46
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.01.2010 19:19
Сообщение #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). Ничего не напоминает?
 К началу страницы 
+ Ответить 
Engl
сообщение 17.01.2010 21:02
Сообщение #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 - 17.01.2010 21:02
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.01.2010 21:06
Сообщение #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;
?
 К началу страницы 
+ Ответить 
Engl
сообщение 17.01.2010 21:46
Сообщение #9





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

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


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

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

 



- Текстовая версия 21.06.2025 3:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"