Конспект лекций по программированию для начинающих. Гладков В.П. - 184 стр.

UptoLike

Составители: 

186
{обмен местами строк с номерами k и p}
for i:=1 to n do
begin r:=a[k,i]; a[k,i]:=a[p,i]; a[p,i]:=r end;
{обмен местами строки и столбца с номером p}
for i:=1 to n do
begin r:=a[p,i]; a[p,i]:=a[i,p]; a[i,p]:=r end;
{обмен местами строк с номерами k и p}
for i:=1 to n do
begin r:=a[k,i]; a[k,i]:=a[p,i]; a[p,i]:=r end;
Решение 2. Недостатком предыдущего решения является большое количество
циклов. Попробуем решить задачу по-другому, сократив количество используемых
циклов. В задаче используется понятие «переставляемые элементы». Их несколько
в строке k и столбце p, поэтому переставляемые элементы строки k обозначим
переменной i, а столбца p - j. Однако элемент, стоящий на пересечении строки k и
столбца p, переставляться не должен. Поэтому окончательно имеем:
переставляемые элементы строки k - 1<=i<=n, кроме i=p; переставляемые элементы
столбца p - 1<=j<=n, кроме j=k. В соответствии с этим можно организовать цикл
перебора, пока есть переставляемые элементы. В теле цикла элементы меняются
местами или пропускаются, если они не являются переставляемыми. Фрагмент
решения, реализующий описанную идею, приведен ниже.
i:=1; j:=1;
while (i<=n) and (j<=n) do
if (i<>p) and (j<>k)
then begin r:=a[j,p]; a[j,p]:=a[k,i]; a[k,i]:=r;
i:=i+1; j:=j+1
end
else begin if i=p then i:=i+1;
if j=k then j:=j+1
end.
Упражнение. Выполните трассировку последней программы.
Пример 11.42. Подсчитать, в скольких строках двумерного массива n·n,
содержащего целые числа, встречается число 2.
Решение. Из условия задачи следует, что требуется перебрать все строки
массива (цикл по строкам). Для каждой строки нужно проверить, есть ли в ней
число 2. Эта часть решения реализуется поисковым циклом. Вкладывая поисковый
цикл в цикл перебора строк, получаем решение задачи. Ниже приводится фрагмент
программы на Паскале:
s:=0; {количество элементов равных 2}
for i:=1 to n do {цикл
по строкам}
begin j:=1; f:=false;
while (j<=n) and not f do {поисковый цикл}
if a[i,j]=2 then f:=true else j:=j+1;
if f then s:=s+1 {проверка результатов поиска}
end.
Пример 11.43. Найти суммы элементов строк для заданного двумерного
массива n·n.
                                      186

   {обмен местами строк с номерами k и p}
   for i:=1 to n do
   begin r:=a[k,i]; a[k,i]:=a[p,i]; a[p,i]:=r end;
   {обмен местами строки и столбца с номером p}
   for i:=1 to n do
   begin r:=a[p,i]; a[p,i]:=a[i,p]; a[i,p]:=r end;
   {обмен местами строк с номерами k и p}
   for i:=1 to n do
   begin r:=a[k,i]; a[k,i]:=a[p,i]; a[p,i]:=r end;
   Решение 2. Недостатком предыдущего решения является большое количество
циклов. Попробуем решить задачу по-другому, сократив количество используемых
циклов. В задаче используется понятие «переставляемые элементы». Их несколько
в строке k и столбце p, поэтому переставляемые элементы строки k обозначим
переменной i, а столбца p - j. Однако элемент, стоящий на пересечении строки k и
столбца p, переставляться не должен. Поэтому окончательно имеем:
переставляемые элементы строки k - 1<=i<=n, кроме i=p; переставляемые элементы
столбца p - 1<=j<=n, кроме j=k. В соответствии с этим можно организовать цикл
перебора, пока есть переставляемые элементы. В теле цикла элементы меняются
местами или пропускаются, если они не являются переставляемыми. Фрагмент
решения, реализующий описанную идею, приведен ниже.
   i:=1; j:=1;
   while (i<=n) and (j<=n) do
      if (i<>p) and (j<>k)
      then begin r:=a[j,p]; a[j,p]:=a[k,i]; a[k,i]:=r;
                      i:=i+1; j:=j+1
              end
      else begin if i=p then i:=i+1;
                      if j=k then j:=j+1
              end.
   Упражнение. Выполните трассировку последней программы.
   Пример 11.42. Подсчитать, в скольких строках двумерного массива n·n,
содержащего целые числа, встречается число 2.
   Решение. Из условия задачи следует, что требуется перебрать все строки
массива (цикл по строкам). Для каждой строки нужно проверить, есть ли в ней
число 2. Эта часть решения реализуется поисковым циклом. Вкладывая поисковый
цикл в цикл перебора строк, получаем решение задачи. Ниже приводится фрагмент
программы на Паскале:
   s:=0; {количество элементов равных 2}
   for i:=1 to n do {цикл по строкам}
   begin      j:=1; f:=false;
              while (j<=n) and not f do {поисковый цикл}
                      if a[i,j]=2 then f:=true else j:=j+1;
              if f then s:=s+1 {проверка результатов поиска}
   end.
   Пример 11.43. Найти суммы элементов строк для заданного двумерного
массива n·n.