Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Двумерный массив представляет собой таблицу из однотипных элементов организованную по строкам и столбцам.

Работа добавлена на сайт samzan.net:


Двумерные массивы PAGE  157

 

глава 4

Двумерные массивы

Кроме одномерных массивов, в практических задачах часто используются и двумерные массивы. Двумерный массив представляет собой таблицу из однотипных элементов, организованную по строкам и столбцам. Элемент такого массива записывается так: A[I][J], где первый индекс I представляет собой номер строки, а второй индекс J является номером столбца. Местоположение каждого элемента массива в памяти компьютера определяется этими индексами.

В языке С/С++ используется следующее описание двумерного массива:

Тип_элементов Имя_массива[число строк][число столбцов];

Описание вполне аналогичное описанию одномерного массива.

Нахождение суммы элементов массива

Исходная ситуация традиционна для работы с двумерными массивами: дан массив A[I,J], где индексы I, J принимают значения от 1 до N. В данном случае будем считать элементы массива целыми числами (имеющими тип int). Сумма элементов двумерного массива вычисляется по следующей формуле:

.                                             (4.1)

Алгоритм вычисления S по соотношению (4.1) достаточно простой и программа, его реализующая, не требует пояснения с использованием блок-схемы (как и ряд других программ, рассматриваемых в примерах этой главы). В листинге 4.1 приведена реализация решения данной задачи. Для определенности мы установили размерность массива: 10 строк и 10 столбцов. Как и в разработках предыдущих глав, в данной программе обеспечено первоначальное заполнение элементов массива с помощью датчика случайных чисел.

Листинг 4.1. Вычисление суммы значений элементов двумерного массива

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 10

#define NM 11

void main()

{

  int A[NM][NM];

  int J,I,S;

  for (I=1;I<=N; I++)

    for (J=1;J<=N; J++)

        A[I][J]=rand()%100;

  S=0;

   for (I=1;I<=N; I++)

     for (J=1;J<=N; J++)

         S= S + A[I][J];

  cout<<"Сумма элементов двумерного массива="<<S;

  _getch();

 

}

Сумма элементов
с заданными свойствами

Несколько изменим формулировку предыдущего задания. Будем считать, что требуется просуммировать только те элементы, значения которых являются нечетными числами, а кроме того, эти значения должны располагаться в интервале от 10 до 100. В листинге 4.2 приведена программа, реализующая решение данной задачи.

Листинг 4.2. Вычисление суммы значений элементов массива при условии

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 10

#define NM 11

void main()

{

  int A[NM][NM];

  int J,I,S;

  for (I=1;I<=N; I++)

      for (J=1;J<=N; J++)

        A[I][J]=rand()%100;

    S=0;

    for (I=1;I<=N; I++)

      for (J=1;J<=N; J++)

     if (((A[I][J]% 2) ==1)&&(A[I][J] >= 10)&&(A[I][J]<= 100))

   S= S + A[I][J];

  cout<<"Сумма элементов двумерного массива="<<S;

  _getch();

 

}

Расчет среднего арифметического

В данном случае нам требуется вычислить среднее арифметическое значение только положительных значений элементов двумерного массива. В листинге 4.3 приведена программа, реализующая решение данной задачи. Здесь мы использовали две переменные:

  •  S — для суммы интересующих нас элементов;
  •  M — количество элементов, по которым подсчитывается сумма.

Листинг 4.3. Вычисление среднего арифметического

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 10

#define NM 11

void main()

{

  int A[NM][NM];

  int J,I,M;

  float S;

  for (I=1;I<=N; I++)

    for (J=1;J<=N; J++)

       A[I][J]=rand()%100;

   S=0;

   M=0;

  for (I=1;I<=N; I++)

    for (J=1;J<=N; J++)

  if (A[I][J]>0)

   {  S= S + A[I][J];

           M=M+1;}

  S=S/M;

  cout<<"'Среднее арифметическое равно "<<S;

  _getch();

 

}

 

Поиск минимального элемента

В листинге 4.4 приведена программа поиска минимального элемента в двумерном массиве (N на M элементов), заполненном целыми числами. Под поиском подразумевается нахождение номера строки и столбца необходимого элемента в двумерном массиве. При этом, если минимальных элементов несколько, то достаточно найти индексы только одного из них. Блок-схема алгоритма приведена на рис. 4.1.

Листинг 4.4. Поиск индексов минимального элемента в двумерном массиве

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 10

#define NM 11

#define M 20

#define MM 21

void main()

{

  int A[NM][NM];

  int I,J,Min,Imin,Jmin;

  

  for (I=1;I<=N; I++)

     for (J=1;J<=M; J++)

        A[I][J]=rand()%100;

    Min= A[1][1];

  Imin=1;

  Jmin=1;

  for (I=1;I<=N; I++)

    for (J=1;J<=M; J++)

   {

          if( A[I][J]< Min)

    {

                 Min=A[I][J];

                 Imin=I; Jmin=J;

    }

}

  cout<<" I= "<<Imin;

cout<<" J= "<<Jmin;

   _getch();

 

}

Рис. 4.1. Блок-схема к программе листинга 4.4

Изменим предыдущую программу так, чтобы в результате на экран выводились индексы всех минимальных элементов. В этом случае (листинг 4.5) нам потребуется дополнительный цикл для просмотра всех элементов.

Листинг 4.5. Поиск индексов всех минимальных элементов
в двумерном массиве

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 10

#define NM 11

#define M 20

#define MM 21

void main()

{

  int A[NM][NM];

  int I,J,Min;

  

   for (I=1;I<=N; I++)

    for (J=1;J<=M; J++)

       A[I][J]=rand()%100;

    Min= A[1][1];

  

  for (I=1;I<=N; I++)

      for (J=1;J<=M; J++)

   {

          if( A[I][J]< Min)

                 Min=A[I][J];

   }

  for (I=1;I<=N; I++)

     for (J=1;J<=M; J++)

    if( A[I][J] == Min)

     {

         cout<<" I="<<I;

         cout<<" J="<<J;

         }

  _getch();

 

}

Поиск номера строки
с минимальной суммой

Рассмотрим задачу поиска номера строки массива, для которой сумма элементов минимальна. Алгоритм представлен на рис. 4.2, а текст программы в листинге 4.6.

Листинг 4.6. Поиск номера строки с минимальной суммой элементов

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 10

#define NM 11

#define M 20

#define MM 21

void main()

{

  int A[NM][NM];

  int I,J,Imin,Sum,SumMin;

  

  for (I=1;I<=N; I++)

   for (J=1;J<=M; J++)

     A[I][J]=rand()%100;

  for (I=1; I<=N;I++)

    {

    Sum=0;

    for( J=1; J<= M;J++)

       Sum=Sum+A[I][J];

    if (I == 1)

 {

         Imin=1;

         SumMin=Sum;

 }

    else

 {

        if( SumMin>Sum )

  {

              SumMin=Sum;

              Imin=I;

  }

 }

}

  cout<<"Номер строки с минимальной суммой элементов "<<Imin;

  _getch();

 

}

Рис. 4.2. Блок-схема к программе листинга 4.6

Подсчет числа учащихся

В двумерном массиве хранится информация о количестве учеников в каждом классе всех параллелей школы (параллели нумеруются от 1 до 11). Так,
в каждой строке двумерного массива сначала располагается число классов
в определенной параллели, а затем последующие элементы содержат число учащихся в каждом классе данной параллели. Пример одной из строк двумерного массива выглядит так:

4 25 23 27 28,

что означает четыре класса в параллели и, соответственно, 25 учеников
в первом из классов параллели, 23 ученика во втором классе параллели
и т. д.

Необходимо написать программу, которая позволит автоматически определить общее число учащихся в классах с 5-й по 10-ю параллель включительно. Для определенности будем считать, что в каждой параллели не более пяти классов. В листинге 4.7 приведена программа, решающая данную задачу. Для заполнения информации о числе классов в параллелях и числа учащихся мы использовали датчик случайных чисел. Число учащихся в классе варьируется от 20 до 30.

Листинг 4.7. Подсчет числа учащихся в параллелях

#include "stdafx.h"

#include <iostream>

using namespace std;

#include <conio.h>

#include <math.h>

#define N 11

#define NM 12

#define M 7

#define MM 8

void main()

{

  int A[NM][NM];

  int I,J,Schet;

  

  for (I=1;I<=N; I++)

       A[I][1]=rand()%6;

  for (I=1; I<=N;I++)

    for (J=1;J<=A[I][1];J++)

        A[I][J+1]=20+rand()%10;

    Schet=0;

  for (I=5;I<= 10;I++)

      for (J=1; J<= A[I][1];J++)

         Schet=Schet+ A[I][J+1] ;

   cout<<" Schet ="<<Schet;

  _getch();

 

}

Изменим программу так, чтобы подсчет производился по интервалу параллелей, значения которых вводятся с клавиатуры. В листинге 4.8 приведена необходимая программа.

Листинг 4.8. Подсчет числа учащихся по произвольному интервалу параллелей

program listing_4_8;

const

 N=11; M=6;

var

 A:array[1..N,1..M] of integer;

 I,J,Schet,P1,P2:integer;

begin

 writeln('Ввести интервал параллелей');

 readln(P1,P2);

 for I:=1 to N do

    A[I,1]:=random(6);

 for I:=1 to N do

  for J:=1 to A[I,1] do

        A[I,J+1]:=20+random(10);

Schet:=0;

 for I:=P1 to P2 do

  for J:=1 to A[I,1] do

         Schet:=Schet+ A[I,J+1] ;

writeln(' Schet =', Schet);

end.

Определение результата турнира

В двумерном массиве (N на N элементов) хранится информация о результатах хоккейного турнира. В турнире участвовали N команд и элемент массива A[I, J] содержит число очков, которые набрала I-я команда в игре на своем поле во встрече с J-й командой. Соответственно, элемент A[J, I] содержит число очков, которые набрала J-я команда при встрече с I-й на своем поле. Будем считать, что за победу команде дается 2 очка, в случае ничьей — одно очко, а при поражении команда очков не получает.

Необходимо определить чемпиона (или несколько команд, набравших максимальное количество очков). В листинге 4.9 приведена программа, позволяющая определить победителя (или победителей) турнира. Здесь мы сначала обеспечиваем формирование результатов турнира с помощью датчика случайных чисел. После этого производится подсчет числа очков, набранных первой командой. И этот результат принимается за максимум, который фиксируется в переменной MaxBalls. Далее последовательно вычисляются набранные очки другими командами. В результате мы получаем максимальное количество очков по итогам турнира, которые набрала команда-чемпион. При этом в дополнительном массиве B фиксируются результаты, набранные каждой командой.

Листинг 4.9. Определение победителя турнира

program listing_4_9;

const

  N=10;

var

  A:array[1..N,1..N] of integer;

  B:array[1..N] of integer;

  I,J,MaxBalls,Vr_Max:integer;

begin

 for I:=1 to N do

   for J:=1 to N do

    begin

      if I <> J then

            A[I,J]:=random(3)

      else

            A[I,J]:=0;

    end;

MaxBalls:=0;

 for I:=2 to N do

   MaxBalls:= MaxBalls + A[1,I];

 for I:=2 to N do

   MaxBalls:= MaxBalls + 2 — A[I,1];

B[1]:= MaxBalls;

 for I:=2 to N do

  begin

   Vr_Max:=0;

   for J:=1 to N do

      if I <> J then

         Vr_Max:= Vr_Max +A[I,J];

   for J:=1 to N do

      if I <> J then

          Vr_Max:= Vr_Max +2-A[J,I];

  B[I]:=Vr_Max;

  if Vr_Max > MaxBalls then

       MaxBalls:=Vr_Max;

 end;

for I:=1 to N do

   if B[I] = MaxBalls then

        writeln(I);

end.

Расчет доходов по отделу

В двумерном массиве хранится информация о доходах отдела (10 человек) за каждый месяц текущего года. Необходимо подсчитать общую сумму по отделу за каждый квартал. В листинге 4.10 приведена необходимая программа, где после внесения оплат производится группировка данных по кварталам. Отметим назначение двух переменных:

L1 — для обозначения первого месяца квартала;

L2 — для обозначения последнего месяца квартала.

Листинг 4.10. Расчет доходов по кварталам

program listing_4_10;

const

  N=10; M=12;

var

  A:array[1..N,1..M] of integer;

  I,J,L1,L2,L:integer;

  Sum:longint;

begin

 { Формирование зарплат }

 for I:=1 to N do

   for J:=1 to N do

      A[I,J]:=7000+500*random(10);

{ Расчет по кварталам }

 for I:=1 to 4 do

  begin

    Sum:=0;

    L1:=1+(I-1)*3;

    L2:=3+(I-1)*3;

    for J:=1 to N do

      for L:= L1 to L2 do

        Sum:=Sum+A[J,L];

    writeln(I,Sum)

 end;

end.

Анализ средней зарплаты сотрудников

В двумерном массиве хранится информация о доходах отдела (10 человек) за каждый месяц в течение года. Необходимо подсчитать число сотрудников,
у которых доходы за год оказались выше средних по отделу. В листинге 4.11 приведена необходимая программа.

Листинг 4.11. Подсчет числа сотрудников по условию

program listing_4_11;

const

  N=10; M=12;

var

 A:array[1..N,1..M] of integer;

 I,J,Col:integer;

 Srednee,Sr:real;

begin

 for I:=1 to N do

   for J:=1 to M do

        A[I,J]:=7000+500*random(10);

Srednee:=0;

 for I:=1 to N do

  for J:=1 to M do

     Srednee:=Srednee+A[I,J];

Srednee:= Srednee/10;

Col:=0;

 for I:=1 to N do

 begin

   Sr:=0;

   for J:=1 to M do

      Sr:=Sr+A[I,J];

   if Sr > Srednee then

      Col:=Col+1;

 end;

end.

Подсчет элементов по условию

Задан двумерный числовой массив размерности N на N. Необходимо подсчитать число положительных элементов, расположенных выше главной диагонали (располагается от элемента A[1,1] до элемента A[N,N]). В листинге 4.12 приведена необходимая программа.

Просмотр элементов, расположенных выше главной диагонали, реализуется с помощью следующего вложенного цикла:

for I:=1 to N do

 for J:=I+1 to N do

Листинг 4.12.  Подсчет числа элементов по условию

program listing_4_12;

const

 N=10;

var

 A:array[1..N,1..N] of integer;

 I,J,Cols:integer;

begin

 for I:=1 to N do

   for J:=1 to N do

        A[I,J]:=-50+random(100);

Cols:=0;

 for I:=1 to N do

  for J:=I+1 to N do

    if A[I,J] > 0 then

       Cols:=Cols+1;

end.

Подсчет суммы элементов по условию

Задан двумерный числовой массив размерности N на N. Необходимо подсчитать сумму отрицательных элементов, размещенных выше главной диагонали, которая располагается от элемента A[1,N] до элемента A[N,1]. В листинге 4.13 приведена необходимая программа.

Листинг 4.13. Подсчет суммы элементов по условию

program listing_4_13;

const

 N=10;

var

 A:array[1..N,1..N] of integer;

 I,J,Sum:integer;

begin

 for I:=1 to N do

    for J:=1 to N do

         A[I,J]:=-50+random(100);

Sum:=0;

 for I:=1 to N do

  for J:=1 to N-I do

    if A[I,J] < 0 then

       Sum:=Sum+1;

 writeln(Sum);

end.

Нахождение индексов элементов

Задан двумерный числовой массив размерностью N на M. Необходимо вывести на экран индексы первых (начиная c начальных столбцов) положительных элементов в каждой строке. В листинге 4.14 приведена необходимая программа.

Листинг 4.14. Нахождение индексов первых положительных элементов

program listing_4_14;

const

 N=10; M=20;

var

 A:array[1..N,1..M] of integer;

 I,J:integer;

begin

 for I:=1 to N do

    for J:=1 to M do

         A[I,J]:=-50+random(100);

 for I:=1 to N do

   for J:=1 to M do

       if A[I,J]> 0 then

          begin

             writeln(I,' ',J);

             break;

          end;

end.

Рассмотрим еще одну похожую ситуацию. Пусть задан двумерный числовой массив размерностью N на M. Необходимо вывести на экран индексы последних отрицательных элементов в каждой строке. В листинге 4.15 приведена необходимая программа.

Листинг 4.15. Нахождение индексов отрицательных элементов

program listing_4_15;

const

 N=10; M=20;

var

 A:array[1..N,1..M] of integer;

 I,J:integer;

begin

for I:=1 to N do

    for J:=1 to M do

         A[I,J]:=-50+random(100);

 for I:=1 to N do

   for J:=M downto 1 do

       if A[I,J]< 0 then

          begin

             writeln(I,' ',J);

             break;

          end;

end.

Нахождение уникальных элементов

Задан двумерный числовой массив размерностью N на M. Необходимо вывести на экран только уникальные элементы в каждой строке. Так, если в определенной строке есть одинаковые элементы, то их выводить не надо. В листинге 4.16 приведена необходимая программа. Здесь перед выводом очередного элемента мы предварительно анализируем предыдущие элементы в данной строке.

Листинг 4.16.  Нахождение уникальных элементов в каждой строке

program listing_4_16;

const

  N=10; M=10;

var

 A:array[1..N,1..M] of integer;

 I,J,L,Flag:integer;

begin

 for I:=1 to N do

    for J:=1 to M do

         A[I,J]:=-5+random(10);

 for I:=1 to N do

  begin

   for J:=1 to M do

     begin

        Flag:=0;

        for L:=1 to J-1  do

          begin

              if A[I,J]= A[I,L] then

                begin

                     Flag:=1;

                     break;

                end;

          end;

        if Flag=0 then

           write(A[I,J],' ');

     end;

   writeln;

  end;

end.

Анализ тестирования

В двумерном массиве размерностью N на M хранится информация о результатах тестирования среди учащихся по пяти темам. Необходимо вывести номера участников (номера строк двумерного массива), которые в сумме набрали более 100 баллов. В листинге 4.17 приведена необходимая программа.

Листинг 4.17.  Анализ тестирования учащихся

program listing_4_17;

const

 N=10; M=5;

var

 A:array[1..N,1..M] of integer;

 I,J,Sym:integer;

begin

 for I:=1 to N do

     for J:=1 to M do

       A[I,J]:=random(50);

 for I:=1 to N do

   begin

    Sym:=0;

    for J:=1 to M do

       Sym:=Sym+A[I,J];

    if Sym > 100  then

       writeln(I);

   end;

end.

Изменение знака элементов

В двумерном массиве размерностью N на M элементов необходимо сделать следующее преобразование: в каждой строке у последнего отрицательного элемента следует поменять знак. В листинге 4.18 приведена необходимая программа.

Листинг 4.18. Изменение знака у  правых крайних отрицательных элементов

program listing_4_18;

const

  N=10; M=20;

var

 A:array[1..N,1..M] of integer;

 I,J:integer;

begin

 for I:=1 to N do

    for J:=1 to M do

       A[I,J]:=-50+random(100);

 for I:=1 to N do

   for J:=M downto 1 do

       if A[I,J]< 0 then

          begin

             A[I,J]:=-A[I,J];

             break;

          end;

end.

Изменение элементов по условию

В двумерном массиве размерностью N на M элементов необходимо сделать следующее преобразование: в каждой строке максимальный элемент умножить на 10. В листинге 4.19 приведена необходимая программа.

Листинг 4.19. Изменение элементов по условию

program listing_4_19;

const

  N=10; M=20;

var

 A:array[1..N,1..M] of integer;

 I,J,Maxsim:integer;

begin

 for I:=1 to N do

   for J:=1 to M do

      A[I,J]:=-50+random(100);

 for I:=1 to N do

 begin

   Maxsim:=A[I,1];

   for J:=2 to M do

       if A[I,J] > Maxsim then

            Maxsim:= A[I,J];

   for J:=1 to M do

       if A[I,J] = Maxsim then

            A[I,J]:= A[I,J]*10;

 end;

end.

Тур коня на шахматной доске

Рассмотрим задачу, которая заключается в разработке программы, моделирующей ходы коня на шахматной доске. Сформулируем словесное описание разработки. Пользователь выбирает произвольное положение шахматной фигуры, а затем программа автоматически продвигает коня по шахматной доске с условием, что дважды побывать на одной клетке конь не может. Таким образом маршрут коня завершается, когда нет возможности перехода с текущего поля ни на одну, еще не посещенную клетку.

В качестве аналога шахматной доски выберем двумерный массив 8 на 8 элементов.

Как известно, в шахматах конь может пойти из заданного поля максимум на восемь других полей доски. Если фигура расположена на краю доски, то число возможных ходов уменьшается. Также, если поле для хода уже занято, то конь пойти на него не может.

Варианты ходов шахматного коня с произвольного поля показаны на рис. 4.3, при этом нумерация вариантов в дальнейшем будет отражаться в алгоритме маршрута именно в таком виде. Например, вариант с номером 2 связан с перемещением фигуры на одну клетку вверх и две клетки вправо.

Сформулируем алгоритм выбора очередного хода. В цикле последовательно просматриваются возможные варианты ходов из текущего поля. Просмотр возможных полей осуществляется последовательно, начиная с первого варианта. Если очередной рассматриваемый вариант хода возможен (данная клетка располагается в пределах доски и конь на этой клетке еще не был), то производится перемещение фигуры в соответствии с этим вариантом. Если ход невозможен, то просматривается следующий вариант и далее, вплоть до восьмого. Если ни один ход из текущей клетки невозможен, то тур шахматного коня на этом завершается.

Рис. 4.3. Возможные ходы коня

Для программного запоминания ходов коня нам потребуется двумерный массив A[N, N]. Возможные ходы коня будем называть вариантами, а для обозначения вариантов введем переменную K, которая может принимать значения от 1 до 8.

Например, при третьем варианте хода (K:=3) к текущему значению координаты X добавляется значение элемента массива Dx[3], а к текущему значению координаты Y добавляется значение Dy[3].

Таблица 4.1. Данные для выполнения хода шахматного коня

K

Новое значение Y

Новое значение X

Значение элемента массива Dy(K)

Значение элемента массива Dx(K)

1

Y-2

X+1

-2

1

2

Y-1

X+2

-1

2

3

Y+1

X+2

1

2

4

Y+2

X+1

2

1

5

Y+2

X-1

2

-1

6

Y+1

X-2

1

-2

7

Y-1

X-2

-1

-2

8

Y-2

X-1

-2

-1

Блок-схема алгоритма приведена на рис. 4.4, а программная реализация — в листинге 4.20.

Листинг 4.20. Тур шахматного коня

program listing_4_20;

const

 Dx: array[1..8] of integer =(1,2,2,1,-1,-2,-2,-1);

 Dy: array[1..8] of integer =(-2,-1,1,2,2,1,-1,-2);

var

  Mass: array[1..8,1..8] of integer;

  I,J,K,X,Y,VarX,VarY,Nom:integer;

begin

 for J:=1 to 8 do

   for I:=1 to 8 do

      Mass[I,J]:=0;

  writeln('Ввод номера поля по горизонтали ');

  readln(X);

  writeln('Ввод номера поля по вертикали ');

  readln(Y);

  Nom:=1;

  K:=1;

  Mass[Y,X]:= Nom ;

  repeat

   VarX:=X+Dx[K];

   VarY:=Y+Dy[K];

   if ( VarX < 1) Or ( VarX >8) Or ( VarY < 1) Or ( VarY > 8) then

       K:=K+1

   else

        if Mass[VarY , VarX ]> 0 then

             K:=K+1

        else

           begin

              X:=VarX;

              Y:=Vary;

              Nom:=Nom+1;

              Mass[Y,X]:= Nom ;

              K:=1

           end

   until K>8;

   for I:=1 to 8 do

     begin

        writeln;

        for J:=1 to 8 do

           write (Mass[I,J]:3);

        writeln;

     end;

end.

Рис. 4.4. Блок-схема к программе листинга 4.20

Задания из ЕГЭ за 2008 – 2010 годы

В заданиях данного раздела требуется проанализировать программный код без использования компьютера и сделать правильный вывод. В последнем разделе главы приведены правильные ответы.

Задача 4.1

Дан фрагмент программы, который представлен в листинге 4.21. Чему равно значение C[4,3], если перед приведенными командами значение C[4,3]=10.

Листинг 4.21. Фрагмент программы к задаче 4.1

for N:=1 to 6 do

for M:=1 to 5 do

 begin

    C[N,M]:= C[N,M]+(2*N-M);

 end

Задача 4.2

Значения элементов двумерного массива А размером 5 на 5 задаются с по-
мощью вложенного цикла во фрагменте, представленном в листинге 4.22. Сколько элементов массива будут больше 10?

Листинг 4.22. Фрагмент к заданию 4.2

for I:=1 to 5 do

for J:=1 to 5 do

 begin

    A[I,J]:= I * J;

 end;

Задача 4.3

Значения элементов двумерного массива А размером 5 на 5 задаются с по-
мощью вложенного цикла во фрагменте, представленном в листинге 4.23. Сколько элементов массива будут больше 2?

Листинг 4.23. Фрагмент к задаче 4.3

for I:=1 to 5 do

for J:=1 to 5 do

 begin

    A[I,J]:= I mod J;

 end;

Задача 4.4

Значения элементов двумерного массива размером 7 на 7 задаются с по-
мощью вложенного цикла во фрагменте, представленном в листинге 4.24. Сколько элементов массива будут иметь значения больше 0?

Листинг 4.24. Фрагмент к задаче 4.4

for I:=1 to 7 do

 for J:=1 to 7 do

 begin

    B[I,J]:= J — I;

 end;

Задача 4.5

Значения элементов двумерного массива А размером 4 на 4 первоначально были равны нулю. Затем значения элементов меняются с помощью вложенного оператора цикла во фрагменте программы, представленном в листинге 4.25. Сколько элементов массива будут равны 1?

Листинг 4.25. Фрагмент к задаче 4.5

for N:=1 to 4 do

 for K:=N to 4 do

   begin

     A[N,K]:= A[N,K] + 1;

     A[K,N]:= A[K,N] + 1;

   end;

Задача 4.6

Дан фрагмент программы, который представлен в листинге 4.26. Чему равно значение C[3,5], после выполнения данного фрагмента.

Листинг 4.26. Фрагмент программы к задаче 4.6

C[3,4]:= 5;

C[2,5]:= 7;

C[2,4]:= 2;

for N:=3 to 4 do

for M:=4 to 5 do

   C[N,M]:= C[N-1,M]+ C[N,M];

Задача 4.7

Значения элементов двумерного массива А размером 4 на 4 задаются с по-
мощью вложенного цикла во фрагменте, представленном в листинге
 4.27. Сколько элементов массива будут меньше 5?

Листинг 4.27. Фрагмент к заданию 4.7

for I:=1 to 4 do

for J:=1 to 4 do

 begin

    A[I,J]:= I * J+I;

 end;

Задача 4.8

Значения элементов двумерного массива А размером 3 на 3 задаются с по-
мощью вложенного цикла во фрагменте, представленном в листинге 4.28. Сколько элементов массива будут больше 2?

Листинг 4.28. Фрагмент к задаче 4.8

for I:=1 to 3 do

for J:=1 to 3 do

 begin

    A[I,J]:= I div J mod J;

 end;

Задача 4.9

Значения элементов двумерного массива размером 5 на 5 задаются с по-
мощью вложенного цикла во фрагменте, представленном в листинге 4.29. Сколько элементов массива будут иметь значения равные 0?

Листинг 4.29. Фрагмент к задаче 4.9

for I:=1 to 5 do

 for J:=1 to 5 do

 begin

    B[I,J]:= J mod I;

 end;

Задача 4.10

Значения элементов двумерного массива А размером 4 на 4 первоначально были равны единице. Затем значения элементов меняются с помощью вложенного оператора цикла во фрагменте программы, представленном в листинге 4.30. Сколько элементов массива будут равны 0?

Листинг 4.30. Фрагмент к задаче 4.10

for N:=1 to 4 do

 for K:=1 to 4 do

   begin

     A[N,K]:= A[K,N] — 1;

   end;

Задача 4.11

Дан фрагмент программы (листинг 4.31), обрабатывающей двумерный массив А размером N на N. Представим массив в виде квадратной таблицы, в которой для элемента массива A[I,J] величина I является номером строки, а величина J номером столбца, в котором расположен элемент. Что делает рассматриваемый алгоритм:

меняет местами элементы двух диагоналей;

меняет местами элементы диагонали и K-й строки;

меняет местами элементы диагонали и K-го столбца;

меняет местами элементы K-й строки и K-го столбца.

Листинг 4.31. Фрагмент к задаче 4.11

K:=1;

for I:=1 to N do

begin

     C:= A[I,K];    

     A[I,K]:= A[K,I];

     A[K,I]:= C;

   end;

Ответы к задачам и заданиям из ЕГЭ

Задача 4.1

Здесь требуется только подставить числа (N:=4 и M:=3) и выполнить арифметическое вычисление: 10 + (2 * 4 – 3) = 15.

Задача 4.2

Всего в массиве 25 элементов и требуется проанализировать результат вычисления каждого элемента массива. Так, результаты больше 10 дают произведения: 5 на 5; 4 на 5; 5 на 4; 4 на 4; 5 на 3; 3 на 5; 4 на 3; 3 на 4. В результате получаем, что число интересующих наc элементов массива равно 8.

Задача 4.3

Всего в массиве 25 элементов и требуется проанализировать результат вычисления остатка от деления I на J. Так, результаты больше 2 дают остатки от деления: 3 на 4; 3 на 5; 4 на 5. В результате получаем ответ 3.

Задача 4.4

Проанализируем двумерный массив по строкам. В первой строке (при I:=1) таких элементов насчитывается 6 штук, во второй (при I:=2) таких элементов 5 штук. Продолжая анализ следующих строк, получим ответы: 4, 3, 2, 1, 0.

В итоге получается, что в массиве число положительных элементов равно 6 + 5 + 4 + 3 + 2 + 1 = 21 значение.

Задача 4.5

Любой способ решения заключается в последовательном анализе выполнения циклов. В табл. 4.2 приведен один из вариантов такого анализа. Здесь первые два столбца соответствуют очередным значениям счетчиков циклов, а последующие два других столбца соответствуют значениям A[N,K] и A[K,N], которые вычисляются в цикле (заметим, что вложенный цикл вычисляется от N до 4). Таким образом, всего в массиве 6 элементов, которые равны 1.

Таблица 4.2. Решение задачи 4.5

N

K

A[N,K]

A[K,N]

1

1

A[1,1]=1

A[1,1]=2

1

2

A[1,2]=1

A[2,1]=1

1

3

A[1,3]=1

A[3,1]=1

1

4

A[1,4]=1

A[4,1]=1

2

2

A[2,2]=1

A[2,2]=2

2

3

A[2,3]=1

A[3,2]=1

2

4

A[2,4]=1

A[4,2]=1

3

3

A[3,3]=1

A[3,3]=2

3

4

A[3,4]=1

A[4,3]=1

4

4

A[4,4]=1

A[4,4]=2

Однако можно предложить и другой вариант анализа (табл. 4.3). В этом
случае мы формируем таблицу размером 4 на 4 (визуальное представление массива 4 на 4) и начинаем последовательно выполнять шаги, указанные
в циклах. После очередного шага в соответствии с циклами мы корректируем значения рассматриваемых элементов. После заполнения таблицы простой пересчет приводит к тому же значению равному 6.

Таблица 4.3. Второй вариант решения задачи 4.2

N

K=1

K=2

K=3

K=4

N =1

A[1,1]=2

A[1,2]=1

A[1,3]=1

A[1,4]=1

N =2

A[2,1]=0

A[2,2]=2

A[2,3]=1

A[2,4]=1

N =3

A[3,1]=0

A[3,2]=0

A[3,3]=2

A[3,4]=1

N =4

A[4,1]=0

A[4,2]=0

A[4,3]=0

A[4,4]=2

Задача 4.6

Здесь требуется проанализировать работу алгоритма. Так как нас интересует элемент из третьей строки (C[3,5]), то рассмотрим выполнение внутреннего цикла (по M) при  N:=3. Так, при М:=4 получим:

C[3,4]:= C[2,4]+ C[3,4],

что после подстановки приводит к результату, равному 7.

Следующее выполнение внутреннего цикла приводит к результату:

C[3,5]:= C[2,5]+ C[3,5],

что дает ответ 14.

Задача 4.7

Всего в массиве 16 элементов и требуется проанализировать результат вычисления каждого элемента массива. Так, результат, меньший 7, дают значения:

I:=1, J:=1;

I:=1, J:=2;

I:=2, J:=1;

I:=2, J:=2;

I:=1, J:=3;

I:=3, J:=1.

В итоге получаем, что число интересующих нас элементов массива равно 6.

Задача 4.8

Всего в массиве 25 элементов и требуется проанализировать результат вычисления выражения, где используется целочисленное деление и остаток от деления.

Так, вычисления дают:

1 div 1 mod 1 = 0;

1 div 2 mod 2=  2;

1 div 3 mod 3 = 3;

2 div 1 mod 1 = 0;

2 div 2 mod 2 = 2;

2 div 3 mod 3 = 3;

3 div 1 mod 1 = 0;

3 div 2 mod 2 = 2;

3 div 3 mod 3 = 3.

Из этого можно сделать вывод о том, что в массиве имеются три элемента, значения которых больше 2.

Задача 4.9

Проанализируем двумерный массив по строкам. В первой строке (при I:=1) таких элементов (равных 0) насчитывается 5 штук, во второй (при I:=2) 2 штуки. Продолжая анализ следующих строк, получим: 1, 1, 1. В итоге: 5 + 2 + 1 + 1 + 1 = 10 элементов массива имеют нулевые значения.

Задача 4.10

Рассмотрим вариант анализа, основанный на данных табл. 4.4. В этом случае мы формируем таблицу размером 4 на 4 (визуальное представление массива 4 на 4) и начинаем последовательно выполнять шаги, указанные в циклах. После очередного шага в соответствии с циклами мы корректируем значения рассматриваемых элементов. После заполнения таблицы простой пересчет приводит к результату: 10 элементов массива имеют нулевые значения.

Таблица 4.4. Решение задачи 4.10

N

K=1

K=2

K=3

K=4

N =1

A[1,1]= 0

A[1,2]=0

A[1,3]=0

A[1,4]=0

N =2

A[2,1]=-1

A[2,2]=0

A[2,3]=0

A[2,4]=0

N =3

A[3,1]=-1

A[3,2]=-1

A[3,3]=0

A[3,4]=0

N =4

A[4,1]=-1

A[4,2]=-1

A[4,3]=-1

A[4,4]=0

Задача 4.11

Программа выполняет вычисление в одном цикле по переменной I. Значение индекса K в программе не меняется. Рассмотрим элемент А[2,1]. Этот элемент расположен в 1-м столбце 2-й строки. Как видно из алгоритма его значение меняется на значение элемента А[1,2]. Соответственно в A[1,2] записывается исходное значение А[2,1]. Аналогично, меняются местами элементы А[3,1] и А[1,3] и т. д. Таким образом, производится замена элементов первого столбца на элементы первой строки. В результате подходит версия ответа — обмен значений элементов K-й строки и K-го столбца.


В этой строке все верно?




1. Реферат- Экология Нижнего Тагила
2. Разработка информационной системы
3. Введение Летний лагерь
4. Особенности ценообразования на физкультурно-спортивные услуги
5. реферат дисертації на здобуття наукового ступеня доктора технічних наук.html
6. Реферат- Влияние физической тренировки на опорно-двигательный аппарат
7. центральный аппарат; 2 территориальные учреждения; 3 расчетнокассовые центры; 4 вычислительные центр
8. институционализация теневой экономики Общепризнанный количественный рост теневой экономики в России2
9. Экология Казахстана
10. лекциях по работе в системе 1С-Предприятие 81
11. Законодательное функционирование научноисследовательской деятельности в РБ
12. 2009 г. Психология и педагогика Психические процессы психология позна
13. орудийная деятельность
14. Сначала змея меня не укусила В последнее время складывается впечатление что на Плюсах работает нек
15. то съедобный корешок
16. Реферат- Правовое регулирование деятельности акционерных обществ
17. Тема10 ВЫБОРЫ В ОРГАНЫ ПОЛИТИЧЕСКОЙ ВЛАСТИ 1
18. Алгоритм компактного хранения и решения СЛАУ высокого порядк
19. по теме- ldquo;Государство и рыночная экономикаrdquo;.
20. а используется элемент b то элемент а должен быть описан раньше