Как найти побочную диагональ массива

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

Вот код для основной и дополнительных диагоналей идущих сверху слева вниз направо:

    def finder(row,n):
       steck=[]
       for i in row:
          if not steck or steck==i:
             steck.append(i)
          else:
             if len(steck)>=n:
                break
             else:
                steck=[]
                steck.append(i)
       #print(len(steck)>=n)         
       return len(steck)>=n
    def horizontal(n,m):
       for row in m:
         if finder(row,n):
           return True
       return False
    def vertical(n,m):
       for col in zip(*m):
         if  finder(col,n):
            return True
       return False  
    def diagonal_dopoln_left(n,m):
       N=len(m)
       for counter in range(1,N):
          diag_len=N-counter
          list1=[m[i][i+counter] for i in range(diag_len)]
          print('list1',list1)
          list2=[m[i+counter][i] for i in range(diag_len)]
          print('list2',list2)      
          if finder(list1,n):
            return True
          if finder(list2,n):
            return True      
       return False 
    def diagonal_left(n,m):
       left_main_diag=[m[i][i] for i in range(len(m))]
       if finder(left_main_diag,n):
          return True 
       return False 
    def checkio(matrix):
      if diagonal_dopoln_left(4,matrix):
         return True
      return False




    if __name__ == '__main__':
       print(checkio([[11,12,14,17],
                      [14,15,16,10],
                      [10,18,12,11],
                      [10,81,12,11]
                ]))
       #Ответ:
       #list1 [14, 10]
       #list2 [10, 81]
       #list1 [17]
       #list2 [10]
       #False

Нашел дополнительные диагонали идущие сверху от основной которая идет справа сверху вниз таким кодом:

def finder(row,n):
    steck=[]
    for i in row:
        if not steck or steck==i:
            steck.append(i)
        else:
            if len(steck)>=n:
                break
            else:
                steck=[]
                steck.append(i)
    #print(len(steck)>=n)         
    return len(steck)>=n

def diagonal_right(n,m):
    left_main_diag=[m[i][-(i+1)] for i in range(len(m))]
    print('left_main_diag:',left_main_diag)
    if finder(left_main_diag,n):
        return True 
    return False 

def diagonal_dopoln_right(n,m):
    N=len(m)
    for counter in range(1,N):
        diag_len=N-counter
        list1=[m[i][-(i+counter)] for i in range(diag_len+1)]
        print('list1',list1)
        #list2=[m[i][-(i+1)] for i in range(diag_len+1)]
        #print('list2',list2)      
        #if finder(list1,n):
            #return True
        #if finder(list2,n):
            #return True      
    return False 


def checkio(matrix):
    n=4
    if diagonal_dopoln_right(n,matrix):
        return True
    return False

if __name__ == '__main__':
   print(checkio([[11,12,14,17],
                  [14,15,16,10],
                  [10,18,12,11],
                  [10,81,12,11]                               
                     ]))
   #Ответ:
   #list1 [17, 16, 18, 10]
   #list1 [14, 15, 10]
   #list1 [12, 14]
   #False 

Как найти такие диагонали снизу от основной, надо как-то правильно расставить индексы, пробовал по разному-return -1 )

На занятии будет рассмотрен двумерный массив в Pascal и примеры работы с ним. Кроме того, предстоит знакомство с понятиями побочная диагональ матрицы в Паскаль и главная диагональ

Содержание:

  • Двумерный массив в Pascal
  • Описание, ввод и вывод элементов двумерного массива
  • Главная и побочная диагональ при работе с двумерными матрицами в Pascal

Матрица или двумерный массив – это прямоугольная таблица чисел (или других элементов одного типа). Каждый элемент матрицы имеет два индекса (номер строки и номер столбца).

матрица

Исходные данные для решения многих задач можно представить в табличной форме:
двумерный массив Pascal
Таблица результатов производственной деятельности нескольких филиалов фирмы может быть представлена так:

zavod1: array [1..4] of integer;
zavod2: array [1..4] of integer; 
zavod3: array [1..4] of integer;

Или в виде двумерного массива так:

Объявление двумерного массива:

var A: array[1..3,1..4] of integer;
begin
{...}
begin
  var  a := new integer[3,4];
  {...}
end.

Описание, ввод и вывод элементов двумерного массива

Варианты описания двумерного массива (традиционный pascal)

  1. Описание массива в разделе переменных:
  2. const N = 3;
          M = 4;
    var A: array[1..N,1..M] of integer;
  3. Описание массива через раздел type:
  4. const
      M=10;
      N=5;
    type
      matrix=array [1..M, 1..N] of integer;
    var A: matrix;

Ввод двумерного массива m x n с клавиатуры:

ввод двумерного массива

for i:=1 to N do
  for j:=1 to M do begin
    write('A[',i,',',j,']=');
    read ( A[i,j] );
  end;

for var i:=0 to a.RowCount-1 do
  for var j:=0 to a.ColCount-1 do
     a[i,j]:=readinteger;

Заполнение случайными числами:

заполнение случайными числами


var a := MatrRandomInteger(3,4,0,10); // целые числа в диапазоне от 0 до 10
var a1 := MatrRandomReal(3,4,1,9) // веществ. числа в диапазоне от 1 до 9

«Красивый» вывод элементов двумерного массива m x n:

Следующий фрагмент программы выводит на экран значения элементов массива по строкам:
вывод двумерного массива

1
2
3
4
5
for i:=1 to N do begin
  for j:=1 to M do
     write ( A[i,j]:5 );
  writeln;
end;

1
2
3
4
5
6
begin
  var a := MatrRandomInteger(3,4,0,10);
  var a1 := MatrRandomReal(3,4,1,9);
  a.Println;
  a1.Println(6,1) // 6 позиций всего на вывод, 1 знак после десят. запятой
end.

Результат:

   8   2   1   3
   5   8   0   8
   6   3   9   3
   3.3   4.7   3.7   5.4
   2.9   1.7   2.3   4.0
   8.3   3.7   8.4   1.4

Рассмотрим следующую задачу: Получены значения температуры воздуха за 4 дня с трех метеостанций, расположенных в разных регионах страны:

Номер станции 1-й день 2-й день 3-й день 4-й день
1 -8 -14 -19 -18
2 25 28 26 20
3 11 18 20 25

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

t[1,1]:=-8; t[1,2]:=-14; t[1,3]:=-19; t[1,4]:=-18;
t[2,1]:=25; t[2,2]:=28; t[2,3]:=26; t[2,4]:=20;
t[3,1]:=11; t[3,2]:=18; t[3,3]:=20; t[3,4]:=25;

Или в pascalabc.NET:

var t := Matr(3,4,-8,-14,-19,-18,25,28,26,20,11,18,20,25);  
t.Println;

Объявление двумерного массива:

var t: array [1..3, 1..4] of integer;

Задание array 1: Необходимо:

  1. Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
  2. Распечатать показания термометров всех метеостанций за 2-й день.
  3. Определить среднюю температуру на 3-й метеостанции.
  4. Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла.

Дополните код:

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var t: array [1..3, 1..4] of integer;
s,i,j:integer;
begin
t[1,1]:=-8; 	t[1,2]:=-14; 	t[1,3]:=-19; 	t[1,4]:=-18;
t[2,1]:=25; 	t[2,2]:=28; 	t[2,3]:=26; 	t[2,4]:=20;
t[3,1]:=11; 	t[3,2]:=18; 	t[3,3]:=20; 	t[3,4]:=25;
{1. Распечатать показания термометров на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день}
writeln('1-е задание: ',t[2,4] , ' и ',t[...,...]);
 
{2. Показания термометров всех метеостанций за 2-й день}
for i:=1 to ... do 
   writeln ('2-е задание: ',t[...,...]);
 
{3. Определим среднее значение температуры на 3-й метеостанции:}
i:=3;
s:=0;
for j:=1 to 4 do 
   s:=...; {сумматор}
writeln('3-е задание: ', s/4);
{распечатаем всю таблицу}
for i:=1 to 3 do
    for j:=1 to 4 do
        writeln(t[i,j]);
{4. Распечатаем станции и дни с температурой 24-26 гр}
writeln('4-е задание: ');
for i:=1 to 3 do
    for ... ... do
        if (...) and (...) then
           writeln('станция ', i, ' день ', j)
end.

Самостоятельно подумайте, как находится сумма элементов массива pascal.

Задание array 2. Найти сумму элементов массива (прямоугольной таблицы) размером [m x n]

Задание array 4.
Найти сумму всех элементов массива (переменная sum) 5 x 4, а также сумму элементов, составляющих столбцы таблицы (двумерного массива). Для хранения сумм столбцов чисел использовать одномерный массив (s). Дополните код.
двумерный массив в pascal

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const  m = 5;
       n = 4;
var
    a: array[1..m,1..n] of byte;
    s: array[1..n] of byte;
    i,j, sum: byte;
begin
    randomize;
    for i := 1 to m do begin
        for j := 1 to n do begin
            ... {инициализация элементов массива случайными числами}
            ... {вывод элементов массива}
        end;
        writeln
    end;
    writeln ('------------'); {для оформления}
    {обнуление значений массива суммы s[]:}
    ...
    {поиск сумм элементов по столбцам:}
    for i := 1 to n do begin
         for j := 1 to m do begin
           s[i]:=...;
        end;
     write(...)  ; 
    end;
    {поиск общей суммы:}
    sum:=0;
    ...
    {вычисление суммы элементов массива значений сумм по столбцам:}
    for ...
        ...
    write (' | sum = ', sum);
readln
end.

Задание array 4_1.
Найти сумму элементов двумерного массива [m x n] по строкам:

2 8 1 9  : sum = 20
3 1 7 2  : sum = 13
4 5 6 2  : sum = 17

Методы матриц для работы со строками и столбцами:

begin
  var a := MatrRandomInteger(3,4);  
  a.Println;
 
  a.Row(0).Sum.Println();
  a.Row(1).Average.Println;
  a.Row(2).Product.Println;
 
  a.Col(0).Min.Println;
  a.Col(1).Max.Println;
end.

Результат:

  86  62  80  33
  51   4  36  65
  78  30   5  16
261 
39 
187200 
51 
62 

Главная и побочная диагональ при работе с двумерными матрицами в Pascal

Главная диагональ квадратной матрицы n x n (т.е. той, у которой количество строк равно количеству столбцов) проходит с верхнего левого угла матрицы (элемент 1,1) до правого нижнего угла матрицы (элемент n,n).

Побочная диагональ квадратной матрицы n x n проходит с нижнего левого угла матрицы (элемент n,1) до правого верхнего угла матрицы (элемент 1,n).

Формулу поиска элементов диагоналей проще всего искать, нарисовав элементы матрицы:
Если индексы начинаются с единицы (традиционный Паскаль):

1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4

Если индексы начинаются с нуля (pascalAbc.NET):

0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3

 
Учитывая, что первая цифра в программе будет соответствовать счетчику i, а вторая — счетчику j, то из таблицы можно вывести формулы:

Главная диагональ матрицы в Паскаль имеет формулу:
i=j
Побочная диагональ матрицы в Паскале традиционном имеет формулу:
n=i+j-1 (или j=n-i+1)

где n — размерность квадратной матрицы

Побочная диагональ матрицы в pascalAbc.Net имеет формулу:
n=i+j+1

где n — размерность квадратной матрицы

Пример: Вывести на экран сначала главную диагональ квадратной матрицы из N строк и N столбцов, а затем ее побочную диагональ.

Решение:
Вывод элементов главной диагонали
Вывод элементов побочной диагонали

Пример: Заменить элементы главной и побочной диагонали квадратной матрицы нулями

Показать решение:

Паскаль:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var i,j,n:integer;
a: array[1..100,1..100]of integer;
begin
   randomize;
   writeln ('введите размерность матрицы:');
   readln(n);
   for i:=1 to n do begin
        for j:=1 to n do  begin
            a[i,j]:=random(10);
            write(a[i,j]:3);
        end;
        writeln;
   end;
   writeln;
   for i:=1 to n do begin
        for j:=1 to n do  begin
            if (i=j) or (n=i+j-1) then a[i,j]:=0;
            write(a[i,j]:3)
        end;
        writeln;
   end;
end.

PascalAbc.Net

1
2
3
4
5
6
7
8
9
10
11
12
begin
  var n := readinteger('введите размерность матрицы:');
  var a := matrRandomInteger(n, n, -10, 10);
  a.Println(6);
  for var i := 0 to n - 1 do
  begin
    a[i, i] := 0;
    a[i, n - i - 1] := 0;
  end;
  writeln();
  a.Println(6);
end.

Задание array 5:
Найти отдельно сумму элементов главной и побочной диагонали квадратной матрицы

1 7 3 7
2 1 8 3
5 7 6 4
8 2 3 1
-------
sum1 = 9
sum2 = 30

Пример:
Дана матрица 5х5. Найти сумму элементов, стоящих на двух соседних диагоналях с главной и параллельных ей.
побочная диагональ матрицы паскаль и главная
Для решения задачи воспользуйтесь таблицей

Показать решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var
A:array[1..5,1..5] of integer;
i,j:integer;
sum,sum1,sum2:integer;
begin
randomize;
for i:=1 to 5 do
for j:=1 to 5 do
    A[i,j]:=random(10);
write ('Исходный массив A: ');
for i:=1 to 5 do begin
    writeln;
    for j:=1 to 5 do
        write (A[i,j]:2,' ');
    end;
sum1:=0;
for i:=1 to 5 do
    for j:=1 to 5 do
        if (i-j=1) then
            sum1:=sum1+A[i,j];
sum2:=0;
for i:=1 to 5 do
    for j:=1 to 5 do
        if (j-i=1) then
           sum2:=sum2+A[i,j];
sum:=sum1+sum2;
writeln;
writeln('Сумма = ',sum);
end.

Задание array 6: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскаль

Задание array 7: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
главная и побочная диагональ матрицы паскальдиагонали матрицы Паскаль

Задание array 8: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
диагонали матрицы Паскаль
главная и побочная диагональ матрицы паскаль

Задание array 9: Составить программу, позволяющую с помощью датчика случайных чисел сформировать матрицу размерностью N. Определить:

  • минимальный элемент, лежащий ниже побочной диагонали;
  • произведение ненулевых элементов последней строки.
  • Рассмотрим еще один пример работы с двумерным массивом.

    Пример: В двумерном массиве размером N х M определить среднее значение элементов. Найти индекс элемента массива, наиболее близкого к среднему значению.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    var index1,index2,i,j,N,M:integer;
    s,min,f:real;
    a:array[1..300,1..300] of real;
    begin
    N:=10;
    M:=5;
    for i:=1 to N do begin
      for j:=1 to M do begin
        a[i,j]:=random(20);
        s:=s+a[i,j];
        write(a[i,j]:3);
       end;
       writeln;
    end;
     
    f:=s/(N*M);
    writeln('srednee znachenie ',f);
    min:=abs(a[1,1]-f);
    for i:=1 to N do begin
      for j:=1 to M do begin
        if abs(a[i,j]-f)<min then begin
          min:=abs(a[i,j]-f);
          index1:=i;
          index2:=j;
        end;
      end;
    end;
    writeln('naibolee blizkiy ',index1,' ',index2);
    end.

    Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

    проверь себя

    0 / 0 / 0

    Регистрация: 22.11.2019

    Сообщений: 35

    1

    Найти побочную диагональ в матрице

    30.04.2020, 10:07. Показов 1499. Ответов 1


    Студворк — интернет-сервис помощи студентам

    Как найти побочную диагональ в матрице, в ней определить количество четных элементов?



    0



    sanec38

    Жесток & Наивен

    482 / 187 / 91

    Регистрация: 02.02.2017

    Сообщений: 427

    30.04.2020, 12:00

    2

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
            private static void Main(string[] args)
            {
                var rnd = new Random();
                var a = new int[5, 5];
                var count = 0;
                var color = Console.ForegroundColor;
                for(int i = 0; i < a.GetLength(0); i++)
                {
                    for(int j = 0; j < a.GetLength(1); j++)
                    {
                        a[i, j] = rnd.Next(1, 10);
                        if(j == a.GetLength(0) - i - 1)
                        {
                            if(a[i, j] % 2 == 0)
                            {
                                count++;
                            }
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.Write(a[i, j] + " ");
                            Console.ForegroundColor = color;
                            continue;
                        }
                        Console.Write(a[i, j] + " ");
                    }
                    Console.WriteLine();
                }
                Console.WriteLine($"Count {count}");
     
                Console.ReadKey();
            }



    0



    Дана квадратная матрица размером nxn. Найти минимальный элемент среди элементов, расположенных ниже главной диагонали, найти максимальный элемент, среди элементов расположенных выше побочной диагонали. Найденные минимальный и максимальный элементы поменять местами и вывести их индексы.

    // main_secondary_diagonal.cpp: определяет точку входа для консольного приложения.
    
    #include "stdafx.h"
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        srand(time(NULL));
        int size_array; // размер квадратной матрицы
        setlocale(LC_ALL, "rus");
    
        cout << "Введите размер квадратной матрицы: ";
        cin >> size_array;
    
        // динамическое создание двумерного массива
        int **arrayPtr = new int* [size_array];
        for (int count = 0; count < size_array; count++)
            arrayPtr[count] = new int [size_array];
    
        for (int counter_rows = 0; counter_rows < size_array; counter_rows++)
        {
            for (int counter_columns = 0; counter_columns < size_array; counter_columns++)
            {
                arrayPtr[counter_rows][counter_columns] = rand() % 100; // заполнение массива случайными числами
                cout << setw(2) << arrayPtr[counter_rows][counter_columns] << "  "; // вывод на экран двумерного массива
            }
            cout << endl;
        }
        cout << endl;
    
        int min = arrayPtr[1][0], // минимальный елемент массива, ниже главной диагонали
            row_min = 1,          // номер строки минимального элемента
            column_min = 0;       // номер столбца минимального элемента
    
        // поиск минимального элемента в массиве, ниже главной диагонали
        for (int counter_rows = 1; counter_rows < size_array; counter_rows++)
        {
            for (int counter_columns = 0; counter_columns < counter_rows ; counter_columns++)
            {
                if ( arrayPtr[counter_rows][counter_columns] < min )
                {
                    min = arrayPtr[counter_rows][counter_columns];
                    row_min = counter_rows;
                    column_min = counter_columns;
                }
            }
        }
    
        cout << "min" << "[" << (row_min + 1) << "][" << (column_min + 1) << "]"  << " = " << min << endl; 
    
        int max = arrayPtr[0][0], // максимальный элемнет массива, выше побочной диагонали
            row_max = 0,              // номер строки максимального элемента
            column_max = 0;           // номер столбца максимального элемента
    
        for (int counter_rows = 0; counter_rows < size_array - 1; counter_rows++)
        {
            for (int counter_columns = 0; counter_columns < (size_array - counter_rows - 1); counter_columns++)
            {
                if ( arrayPtr[counter_rows][counter_columns] > max )
                {
                    max = arrayPtr[counter_rows][counter_columns];
                    row_max = counter_rows;
                    column_max = counter_columns;
                }
            }
        }
    
        cout << "max" << "[" << (row_max + 1) << "][" << (column_max + 1) << "]"  << " = " << max << endl; 
    
        //////////////////перестановка элементов////////////////////////////////////////////////
    
        arrayPtr[row_min][column_min] = max;
        arrayPtr[row_max][column_max] = min;
    
        ////////////////////////////////////////////////////////////////////////////////////////
    
        cout << "nМассив после перестановки максимального и минимального элементов:n";
    
        for (int counter_rows = 0; counter_rows < size_array; counter_rows++)
        {
            for (int counter_columns = 0; counter_columns < size_array; counter_columns++)
            {
              cout << setw(2) << arrayPtr[counter_rows][counter_columns] << "  "; // вывод на экран двумерного массива
            }
            cout << endl;
        }
        cout << endl;
    
        cout << "min" << "[" << (row_max + 1) << "][" << (column_max + 1) << "]"  << " = " << min << endl; 
        cout << "max" << "[" << (row_min + 1) << "][" << (column_min + 1) << "]"  << " = " << max << endl; 
    
        // удаление двумерного динамического массива
        for (int count = 0; count < size_array; count++)
            delete []arrayPtr[count];
    
        system("pause");
        return 0;
    }

    Результат работы программы показан ниже:

    И снова здравствуйте! В прошлой части мы рассмотрели что такое одномерный массив в C++, узнали для чего он необходим, а так же порешали некоторые типовые академические задачи. В этот раз примеры программ будут написаны в среде Visual Studio 2017, но вы можете использовать любой другой инструмент, например Code::Blocks или онлайн компиляторы. Сегодня мы рассмотрим двумерный массив. Это также простейшая структура данных как и одномерный массив, к данным все также возможно обращаться по индексу, но есть некоторая особенность. Давайте рассмотрим ее так же на примере контейнера с яблоками:

    Article
    Article

    Получается, что у нас теперь многоэтажный контейнер, в каждой ячейке которой находятся яблоки (ячейка так же может быть пустой, для ссылочных типов это значение null и ноль для значимых типов). Для того что бы взять  или положить яблоки из определенной ячейки необходимо сначала выбрать строку, а затем столбец, после чего мы возьмем необходимые нам яблоки, или наоборот положим.  Обратите внимание, что нумерация ячеек строк и столбцов начинается с 0! Это важно, так как индексация массива начинается всегда с 0 а не 1. Т.е что бы обратиться к первой ячейке контейнера, нам необходимо достать яблоки из нулевой ячейки на пересечении двух координат (вспомнили игру Морской бой? =) ). Идем на нулевую строку и ищем нулевой столбец где находится нужная нам ячейка. 

    Здесь у нас лежат два яблока. Так же не забываем, что С++ строго типизированный язык программирования, поэтому мы не можем в целочисленный массив записать вещественное число (float или double) или символ (char) и наоборот. Но существуют языки в которых такое возможно, например PHP и Java Script.  Итак для работы с нашим контейнером и ячейками, нам предварительно нужно его создать и заполнить ячейки яблоками. Кладем в ячейку с координатами [0][0] два яблока, [0][1] — три яблока, [0][2] — одно яблоко и так далее до координат ячейки с индексом [4][4]. Что мы сделали? Правильно, инициализировали массив! В коде это будет выглядеть следующим образом:

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int apples[ROWS][COLUMNS] = {
    									{ 2, 3, 1, 1, 0 },
    									{ 0, 1, 2, 2, 0 },
    									{ 1, 1, 1, 1, 1 },
    									{ 3, 4, 1, 2, 3 },
    									{ 2, 2, 0, 2, 1 }
    	};
    
    	cout << "Выводим массив на экран: " << endl;
    	// Это цикл, в котором мы идем и заглядываем в каждую секцию
    	// по пересечениям строк и столбцов
    	// для этого необходим вложенный цикл for в основной цикл
    	// после чего печатаем количество каждой секции на экран
    	// строк у нас 5, это макрос ROWS
    	// столбцов у нас 5, это макрос COLUMNS
    	// setw(4) это манипулятор для форматирование строки на экране, 4 - это примерно
    	// 4 пробела между символами.
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    		cout << endl;
    	}
    	cout << endl;
    	system("pause"); // Задержка.
    	return 0;
    }
    

    Вот так мы реализовали программу заполнения массивы и вывода его на пользовательский экран в консоли. Результат на картинке:

    1

    Как и в одномерные массивы по ходу написания программы и ее исполнения мы можем изменять количество яблок в секциях контейнера нашего двумерного массива, например в ячейку с индексом[0][2] поместить восемь яблок, а в [2][4] сто яблок (размер каждой секции зависит от типа контейнера, он у нас int, а в C++ размер этого типа равен от -2 147 483 648 до 2 147 483 648). А вот размер самого контейнера и количества ячеек ( строки и колонки) мы пока изменять не можем. Для этой цели служит отдельный вид массивов, именуемый — динамическим.

    В массив мы можем записать вещественные числа, символы и строки:

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    
    #define ROWS 3      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 3   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количсетво яблок
    	// Можно и без указания размера при инициализации,
    	// компилятор автоматически создаст массив с необходимым размером
    	int apples[][COLUMNS] = {
    								{ 2, 1, 3 },
    								{ 100, 21, 32 }
    	};
    
    	char chars[ROWS][COLUMNS] = {
    									{ 'a', 'b', 'c' },
    									{ 'd', 'e', 'f' }
    	};
    
    	float reals[ROWS][COLUMNS] = {
    									{ 2.1, 1.3, 3.4 },
    									{ 6.8, 0.2, 8.3 }
    	};
    
    	double doubleReals[ROWS][COLUMNS] = {
    										{ 2.14, 1.333, 3.45 },
    										{ 6.882, 0.223, 8.123}
    	};
    	string strings[ROWS][COLUMNS] = {
    										{ "Вася", "Иван", "Петя" },
    										{ "Вадим", "Curtis", "Gucci Mane"},
    	};
    	return 0;
    }
    

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

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int apples[ROWS][COLUMNS];
    
    	cout << "Введите числа, что бы заполнить массив: " << endl;
    	// Это цикл, в котором мы заполняем наш двумерный массив вручную
    	// для этого необходим вложить еще один цикл for в основной цикл
    
    	for (size_t i = 0; i < ROWS; i++)
    	{
    		for (size_t j = 0; j < COLUMNS; j++)
    		{
    			cin >> apples[i][j];
    		}
    	}
    	cout << endl;
    
    	// Печатаем наш заполненый массив
    	cout << "Выводим массив на экран: " << endl;
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    		cout << endl;
    	}
    	cout << endl;
    	system("pause"); // Задержка.
    	return 0;
    }
    

    Давайте теперь попробуем заполнить массив случайными числами от 0 до 10. Для этого мы будем использовать знакомую из предыдущей статьи технику. Подключим header time.h  или  ctime:

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int apples[ROWS][COLUMNS];
    
    	cout << "Заполнение массива случайными числами от 1 до 10: " << endl;
    	// Это цикл, в котором мы вручную заполняем наш двумерный массив
    	// для этого необходим вложить еще один цикл for в основной цикл
    
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 11;
    		}
    	}
    
    	// Печатаем наш заполненый массив
    	cout << "Выводим массив на экран : " << endl;
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    		cout << endl;
    	}
    	cout << endl;
    	system("pause"); // Задержка.
    	return 0;
    }
    

    И получаем результат (у вас результат может отличаться, функция rand(); может сгенерировать другие значения).:

    3

    Заполнить случайными числами наш двумерный массив позволила функция rand() % 11; Но в этом примере существует такая же проблема как и в случае с примером, когда мы заполняли одномерный массив случайными числами. Данный код генерирует случайные числа только один раз. При следующих запусках программы, в наш двумерный массив будут записаны те же случайные числа, что и в самый первый раз. Что бы уййти от этой проблемы, необходимо применить специальную функцию srand();.

    Она на позволяет  устанавливать начало последовательности, генерируемой функцией rand() (функция rand() возвращает псевдослучайные числа). Функция srand() позволяет запускать программу несколько раз с различными последователь­ностями псевдослучайных чисел.

    Добавим необходимую функцию в наш код:

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int apples[ROWS][COLUMNS];
    
    	cout << "Заполнение массива случайными числами от 0 до 10: " << endl;
    	// Это цикл, в котором мы вручную заполняем наш двумерный массив
    	// для этого необходим вложить еще один цикл for в основной цикл
    
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (size_t j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 11;
    		}
    	}
    
    	// Печатаем наш заполненый массив
    	cout << "Выводим массив на экран : " << endl;
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    		cout << endl;
    	}
    	cout << endl;
    	system("pause"); // Задержка.
    	return 0;
    }
    

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

    Давайте мы теперь попробуем заполнить контейнер случайным количеством яблок и найдем, сколько ячеек, в которых находится четное количество яблок (наш двумерный массив заполним случайными числами и посчитаем все четные элементы). Для этого необходимо завести отдельную переменную и в отдельном вложенном цикле for проделать операцию с остатком от деления на 2 и проверить также на ноль.

    for (int i = 0; i < ROWS; i++)
    {
    for (int j = 0; j < COLUMNS; j++)
    {
    if (apples[i][j] % 2 == 0 && apples[i][j] != 0)
    {
    counter++;
    }
    }
    }
    
    Screenshot_1

    Запустим и увидим результат (у вас результат может отличаться, так как если вы помните, мы используем функцию srand();):

    Исходный текст программы:

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int apples[ROWS][COLUMNS];
    	int counter = 0;
    
    	cout << "Заполнение массива случайными числами от 0 до 10: " << endl;
    	// Это цикл, в котором мы вручную заполняем наш двумерный массив
    	// для этого необходим вложить еще один цикл for в основной цикл
    
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (size_t j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 11;
    		}
    	}
    
    	// Печатаем наш заполненый массив
    	cout << "Выводим массив на экран : " << endl;
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    		cout << endl;
    	}
    	cout << endl;
    
    	for (int i = 0; i < ROWS; i++)
    	{
    		for (int j = 0; j < COLUMNS; j++)
    		{
    			if (apples[i][j] % 2 == 0 && apples[i][j] != 0)
    			{
    				counter++;
    			}
    		}
    	}
    
    	cout << "Количество четных элементов в массиве : " << counter << endl; 
    	// Задержка.
    	system("pause");
    	return 0;
    }
    

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

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int apples[ROWS][COLUMNS];
    	float buffer = 0; // наша переменная, куда мы будем складывать сумму наших яблок
    
    	cout << "Заполнение массива случайными числами от 0 до 10: " << endl;
    	// Это цикл, в котором мы вручную заполняем наш двумерный массив
    	// для этого необходим вложить еще один цикл for в основной цикл
    
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 11;
    		}
    	}
    
    	// Печатаем наш заполненый массив
    	cout << "Выводим массив на экран : " << endl;
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    		cout << endl;
    	}
    	cout << endl;
    
    	for (int i = 0; i < ROWS; i++) {
    		for (int j = 0; j < COLUMNS; j++) {
    			buffer += apples[i][j];
    		}
    	}
    
    	cout << "Среднее арифметическое массива : " << buffer / (ROWS * COLUMNS) << endl;
    	// Задержка.
    	system("pause");
    	return 0;
    }
    

    Получаем результат (у вас результат может отличаться, так как если вы помните, мы используем функцию srand();).

    Screenshot_1

    Одна из часто встречаемых задач — программа, которая будет показывать пользователю максимальное количество яблок на каждой из полочек (имеется ввиду максимальное значение элемента в каждой строке):

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	// наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int apples[ROWS][COLUMNS];
    	int MAS_REZ[ROWS];
    	int max;
    	cout << "Заполнение массива случайными числами от 0 до 10: " << endl;
    	// Это цикл, в котором мы вручную заполняем наш двумерный массив
    	// для этого необходим вложить еще один цикл for в основной цикл
    
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 120;
    		}
    	}
    
    	// Печатаем наш заполненый массив
    	cout << "Выводим массив на экран : " << endl;
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    		cout << endl;
    	}
    	cout << endl;
    
    	// В этом блоке будем искать максимальное количество  яблок в каждой секции
    	// И выводить на экран пользователю.
    
    	for (size_t i = 0; i < ROWS; i++) {
    		max = apples[i][0];
    
    		for (size_t j = 0; j < COLUMNS; j++) {
    			if (apples[i][j] > max)
    			{
    				max = apples[i][j];
    			}
    		}
    		cout << "Максимальный элемент строки в матрице apples : " << max << endl;
    	}
    
    	// Задержка.
    	system("pause");
    	return 0;
    }
    

    И вот что получаем на выходе программы (у вас результат может отличаться, так как если вы помните, мы используем функцию srand();).:

    Screenshot_1

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

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	int apples[ROWS][COLUMNS];   // наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    
    	//Заполняем массив случайными числами (случайным количеством яблок в каждой ячейки)
    	for (int i = 0; i < ROWS; i++) {
    		for (int j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 120;
    		}
    	}
    	// Печатаем наш массив на экран пользователю
    	for (int i = 0; i < ROWS; i++) {
    		for (int j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    
    		cout << endl;
    	}
    	cout << endl;
    
    	//Запускаем цикл сравнения, в котором будем искать максимальное количество яблок в столбцах
    	int maxValue;
    
    	//Запускаем цикл сравнения
    	for (int i = 0; i < 5; i++)
    	{
    		//Определяем переменную внутри цикла специально, чтобы при переходе на следующий стобик(т.е. новую итеррацию цикла)- она обнулялась
    		int maxValue = 0;
    		//Пробегаем циклом по каждому элементу столбика, каждый раз сравниваем исходный элемент со следующим, и с максимальным на данный момент. Если проверяемый
    		//элемент больше последующего и больше максимального - то пересохраняем это значение в переменную
    		for (int j = 0; j < ROWS; j++)
    		{
    			if ((apples[j][i] > apples[j + 1][i]) && (apples[j][i] > maxValue))
    			{
    				maxValue = apples[j][i];
    			}
    		}
    		//Выводим на экран
    		cout << "Элемент " << i + 1 << " максимальный в столбце: " << maxValue << endl;
    	}
    
        // Задержка.
    	system("pause");
    	return 0;
    }
    

    После компиляции программы посмотрим результат (как вы уже понимаете, результаты в вашем случае могут быть другими):

    Screenshot_1

    Ффух, идем дальше. И я приведу пример очередной задачки, которая часто может встречаться на тернистом пути программиста. Среднее арифметическое мы уже находили, правда во всем нашем двумерном массиве. Давайте теперь попробуем найти среднее арифметическое каждой строки, после чего все эти числа поместить в одномерный массив.

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    #define SIZE 5
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	int apples[ROWS][COLUMNS];   // наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	float buffer, averageApples[ROWS];
    	//Заполняем массив случайными числами (случайным количеством яблок в каждой ячейки)
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (int j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 15;
    		}
    
    	}
    	// Печатаем наш массив на экран пользователю
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    
    		cout << endl;
    	}
    	cout << endl;
    
    	//Запускаем цикл в котором будем искать среднее арифметическое
    	int maxValue;
    
    	for (size_t i = 0; i < ROWS; i++) {
    
    		buffer = 0;
    		for (size_t j = 0; j < COLUMNS; j++) {
    
    			buffer += apples[i][j];
    		}
    
    		buffer = buffer / ROWS;
    		// Заполняем наш одномерный массив полученными значениями ср. арифметического
    		averageApples[i] = buffer;
    		cout << "Среднее значение " << i << " строки: " << buffer << endl;
    	}
    
    	cout << "nОдномерный массив со средними арифметическими каждой строкиn"  << endl;
    	// Выводим на экран наш одномерныый массив
    	for (size_t i = 0; i < SIZE; i++) 
    		cout << averageApples[i] << setw(2);
    
    	system("pause");
    	return 0;
    }
    

    Соответственно, после запуска приложения, проверим результат:

    Screenshot_1

    А давайте теперь попробуем поработать с диагоналями матрицы! В матрице существует главная и побочная диагональ. На рисунке ниже, в контейнере с права зеленым показана линия главной диагонали. Соответственно справа — побочная диагональ.

    Article

    Очень часто встречаются задачи, где необходимо перебирать элементы диагоналей, ниже или выше этих диагоналей и тд. Рассмотрим такой вариант задачи:  «Создайте двумерный массив 5*5. Метод заполнения произвольный.
    Выведите его. Все элементы главной диагонали занесите в одномерный массив и выведите его».

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    #define SIZE 5
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	int apples[ROWS][COLUMNS];   // наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int mainDiagonal[SIZE];      // одномерный массив, куда мы занесем все элементы главной диагонали матрицы apples
    	//Заполняем массив случайными числами (случайным количеством яблок в каждой ячейки)
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (int j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 15;
    		}
    
    	}
    	// Печатаем наш массив на экран пользователю
    	cout << "Текущий массив : " << endl;
    
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    
    		cout << endl;
    	}
    	cout << endl;
    
    	//Запускаем цикл в котором будем искать элементы главной диагонали
    	for (size_t i = 0; i < ROWS; i++) {
    
    		for (size_t j = 0; j < i + 1; j++) {
    
    			mainDiagonal[i] = apples[i][j];
    		}
    	}
    	cout << endl;
    	cout << "Массив с элементами главной диагонали" << endl;
    
    	for (size_t i = 0; i < SIZE; i++) {
    
    		cout << mainDiagonal[i] << setw(4);
    	}
    
    	// Задержка.
    	system("pause > NULL");
    	return 0;
    }
    

    Запустим нашу программу и посмотрим результат:

    Screenshot_1

    Все верно, в одномерный массив записались элементы главной диагонали нашего двумерного массива с «яблоками».

    А теперь найдем все элементы побочной диагонали.

    #include<iostream> // Стандартная библиотека ввода вывода
    #include<iomanip>// Библиотека манипуляторов для форматирования потока
    #include<time.h> // Стандартная библиотека ввода вывода
    
    #define ROWS 5      // Обозначаем длину строки нашего контейнера(массива) для яблок
    #define COLUMNS 5   // Обозначаем длину столбца нашего контейнера(массива) для яблок
    #define SIZE 5
    using namespace std; // используем стандартное пространство имен библиотеки iostream
    
    int main(int argc, char* argv[])
    {
    	// Русский язык в консольном приложении
    	setlocale(LC_ALL, "Rus");
    	srand(time(NULL)); //  устанавливает в качестве базы текущее время. Этот прием часто используется для того,
    	// чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и,
    	// соответственно, разный ряд получаемых значений.
    
    	int apples[ROWS][COLUMNS];   // наш контейнер с яблоками в каждой из
    	// секций которой лежит определенное количество яблок
    	int sideDiagonal[SIZE];      // одномерный массив, куда мы занесем все элементы главной диагонали матрицы apples
    	//Заполняем массив случайными числами (случайным количеством яблок в каждой ячейки)
    	for (size_t i = 0; i < ROWS; i++) {
    		for (int j = 0; j < COLUMNS; j++) {
    			apples[i][j] = rand() % 15;
    		}
    	}
    	// Печатаем наш массив на экран пользователю
    	cout << "Текущий массив : " << endl;
    
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			cout << setw(4) << apples[i][j];
    		}
    
    		cout << endl;
    	}
    	cout << endl;
    
    	//Запускаем цикл в котором будем искать элементы побочной диагонали
    	for (size_t i = 0; i < ROWS; i++) {
    		for (size_t j = 0; j < COLUMNS; j++) {
    			if (j == ROWS - (i + 1)) {
    				sideDiagonal[i] = apples[i][j];
    			}
    		}
    	}
    	cout << endl;
    	cout << "Массив с элементами побочной диагонали" << endl;
    
    	for (size_t i = 0; i < SIZE; i++) {
    		cout << sideDiagonal[i] << setw(4);
    	}
    
    	// Задержка.
    	system("pause > NULL");
    	return 0;
    }
    

    Screenshot_1

    Запускаем программу и проверяем получившийся результат:

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

    • В первом цикле мы бегаем по строкам двумерного массива;
    • Во втором (вложенном цикле for) мы бегаем по столбцам;
    • Элементы на главной диагонали — row = col;
    • Элементы ниже главной диагонали — col > row;
    • Элементы выше главной диагонали — col < row;
    • Элементы на побочной диагонали — col = Rows — row;
    • Элементы ниже побочной диагонали —  col > Rows — row;
    • Элементы выше побочной диагонали — col < Rows — row;

    На этой ноте завершаю эту статью. Мы еще вернемся к массивам и матрицам. Но только после того, как научимся оперировать непосредственно с памятью и пощупаем указатели. Так что следующий этап у нас, да да — указатели =) До встречи!

    Понравилась статья? Поделить с друзьями:
  • Как найти свой планшет если он потерялся
  • Как найти цену на товар по фото
  • Как правильно составить мудборд для фотосессии
  • Как найти директора фирмы ооо
  • Телевизор двоится как исправить