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

 

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