Как найти четные элементы в матрице с

PashaMorgan

0 / 0 / 1

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

Сообщений: 13

1

Определить четные значения в матрице

05.11.2013, 17:07. Показов 1205. Ответов 4

Метки нет (Все метки)


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

В целочисленной матрице размерами N*M определить количество элементов, которые имеют четные значения (N и M не больше 10). Матрицу сформировать из случайных чисел в диапазоне от 0 до 100.

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
31
32
33
34
35
36
37
#include "time.h"
#include "clocale"
#include "iostream"
using namespace std;
int main()
{
    int n,i,j,tmp=0;
    cout<<"n="; cin>>n;  
    int a[n][n];
    
    //âêëþ÷èì ðàíäîì
    srand(time(NULL));
    // çàïîëíåíèå ìàññèâà
    
      for(i=0;i<n;i++)  
       {
         for(j=0;j<n;j++)
         {
        a[i][j]=rand()%100-0;
       cout<<a[i][j]<<" ";
       }
        cout<<"rn";
        
         //ïîèñê ÷åòíûõ çíà÷åíèé ìàòðèöû
         for(i=0;i<n;i++)  
       {
         for(j=0;j<n;j++)
         {
            if ( a[i][j] % 2 == 0) tmp++ ;
            cout<<tmp;
            }
            }   
}
        
         system("PAUSE");
         return 0;
}



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

05.11.2013, 17:07

Ответы с готовыми решениями:

В матрице определить четные элементы, имеющие нечетную сумму индексов.
Дана матрица М(7,4). Определить четные элементы, имеющие нечетную сумму индексов.

В заданной матрице определить среднее арифметическое значение положительных элементов столбиков, имеющих четные индексы
В заданной матрице S (1 … 5,1..4) определить среднее арифметическое значение положительных…

Определить количество элементов, имеющих четные значения
Помогите решить бесталковому студенту, только начинаю разбираться в c+, не получается, желательно с…

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

Задания на двумерные массивы
Дан двумерный массив размерностью N x M…

4

Anton_Kretov

89 / 51 / 15

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

Сообщений: 179

05.11.2013, 17:42

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
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstdlib>
#include <time.h>
 
using namespace std;
 
const int N = 10; //Менять тут
const int M = 10; //Менять тут
 
//even - четный по-английский
int findEvenNumsInMatrix(int testMatrix[N][M]);
 
int main()
{
    int testMatrix[N][M];
 
 
    srand(time(NULL));
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            testMatrix[i][j] = 50 - rand() % 100; //Тут менять наполнение массива
            cout << "n" << "testMatrix[" << i << "][" << j << "] = " << testMatrix[i][j];
        }
    }
 
    cout << "n" << "Amount of Even numbers in testMatrix is " << findEvenNumsInMatrix(testMatrix);
    return 0;
}
 
int findEvenNumsInMatrix(int testMatrix[N][M]) {
    int amountOfEvenNums = 0;
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            if(testMatrix[i][j] % 2 == 0) amountOfEvenNums++;
        }
    }
 
    return amountOfEvenNums;
}



1



PashaMorgan

0 / 0 / 1

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

Сообщений: 13

05.11.2013, 17:45

 [ТС]

3

Цитата
Сообщение от Anton_Kretov
Посмотреть сообщение

Вот, протестите мой вариант, код выполняет ваше условие.

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
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstdlib>
#include <time.h>
 
using namespace std;
 
const int N = 10; //Менять тут
const int M = 10; //Менять тут
 
//even - четный по-английский
int findEvenNumsInMatrix(int testMatrix[N][M]);
 
int main()
{
    int testMatrix[N][M];
 
 
    srand(time(NULL));
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            testMatrix[i][j] = 50 - rand() % 100; //Тут менять наполнение массива
            cout << "n" << "testMatrix[" << i << "][" << j << "] = " << testMatrix[i][j];
        }
    }
 
    cout << "n" << "Amount of Even numbers in testMatrix is " << findEvenNumsInMatrix(testMatrix);
    return 0;
}
 
int findEvenNumsInMatrix(int testMatrix[N][M]) {
    int amountOfEvenNums = 0;
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            if(testMatrix[i][j] % 2 == 0) amountOfEvenNums++;
        }
    }
 
    return amountOfEvenNums;
}

Спасибо Большое,буду изучать)



0



89 / 51 / 15

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

Сообщений: 179

05.11.2013, 17:46

4

Цитата
Сообщение от PashaMorgan
Посмотреть сообщение

Спасибо Большое,буду изучать)

Рад помочь! :3



0



TSed

20 / 20 / 15

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

Сообщений: 76

05.11.2013, 18:01

5

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <ctime>
 
using namespace std;
 
int main(){
    int n, m;
    srand(time(0));
 
    while(true){
        cout<<"N->";
        cin>>n;
        cout<<"M->";
        cin>>m;
        if ( ((n>0) && (n<=10)) && ((m>0) && (n<=10)) )
            break;
        cout<<"Wrong M or N"<<endl;
    }
 
    int **arr = new int *[n];
    for (int i = 0; i < m; i++)
        arr[i] = new int[n];
    
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            arr[i][j] = rand()%100;
        }
    }
    
    int count = 0;
 
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            if(arr[i][j]%2 == 0)
                count++;
        }
    }
 
    cout<<"Result->"<<count<<endl;
    system("pause");
    for (int i = 0; i < m; i++)
        delete []arr[i];
    delete [] arr;
 
    return 0;
}



0



Есть матрица 10*10 с целыми числами. Необходимо узнать количество чётных чисел в ней:

   #include <stdio.h>
#include <stdlib.h>

#define ROWS 10
#define COLS 10

int main(void)
{
   int array[ROWS][COLS];
   for (int i = 0; i < ROWS; i++)
   {
       for (int j = 0; j < COLS; j++)
       {
           printf("array[%d][%d]=", i, j);
           scanf("%d", &array[i][j]);
       }
   }
   printf("n");
   for(int i = 0; i < ROWS; i++)
   {
       for(int j = 0; j < COLS; j++)
       {
           printf("%d ", array[i][j]);

       }
       printf("n");
   }




}

Duracell's user avatar

Duracell

1,9913 золотых знака16 серебряных знаков33 бронзовых знака

задан 30 дек 2022 в 17:05

Pavlik25's user avatar

1

  1. Добавляем в начало переменную, например int count = 0;
  2. Во втором цикле (вместо этого printf("%d ", array[i][j]);) проверяем делится ли число на 2 (array[i][j] % 2 == 0)
  3. Если число делится на 2: count++;
  4. Выводим count

ответ дан 30 дек 2022 в 17:26

SurfaceStack's user avatar

SurfaceStackSurfaceStack

8574 серебряных знака23 бронзовых знака

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

Ниже приведен пример кода, который решает задачу:

#include <stdio.h>
#include <stdlib.h>

#define ROWS 10
#define COLS 10

int main(void)
{
   int array[ROWS][COLS];
   for (int i = 0; i < ROWS; i++)
   {
       for (int j = 0; j < COLS; j++)
       {
           printf("array[%d][%d]=", i, j);
           scanf("%d", &array[i][j]);
       }
   }
   printf("n");
   int evenCount = 0; // счетчик четных чисел
   for(int i = 0; i < ROWS; i++)
   {
       for(int j = 0; j < COLS; j++)
       {
           if (array[i][j] % 2 == 0) // если число четное
           {
               evenCount++; // увеличиваем счетчик
           }
       }
   }
   printf("Количество четных чисел: %dn", evenCount);
   return 0;
}

ответ дан 30 дек 2022 в 17:30

hedgehogues's user avatar

hedgehogueshedgehogues

9,2218 золотых знаков44 серебряных знака93 бронзовых знака

Второй цикл не нужен

#include <stdio.h>
#include <stdlib.h>

#define ROWS 10
#define COLS 10
int evenCount = 0; // счетчик четных чисел
int main(void)
    {
    int array[ROWS][COLS];
    for (int i = 0; i < ROWS; i++)
        {
        for (int j = 0; j < COLS; j++)
            {
            printf("array[%d][%d]=", i, j);
            scanf("%d", &array[i][j]);
            if (array[i][j] % 2 == 0) evenCount++; // если число четное увеличиваем счетчик
            }
        }
    
    printf("nКоличество четных чисел: %dn", evenCount);
    return 0;
    }

ответ дан 31 дек 2022 в 14:52

Редиска's user avatar

Задача:

Напишите программу, которая принимает с клавиатуры число N, создает матрицу размера N на N, заполненную случайными числами, и выводит ее на экран. Затем определите количество четных чисел в этой матрице.

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

if (a[i][j] % 2 == 0 && a[i][j] !=0)
{
   sum++;
}

Если число делится на 2 без остатка и оно не 0, то прибавляем единичку, таким образом полный код будет такой:

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
	srand(time(NULL));
	int n = 0; 
	int sum = 0;
	cin >> n; // Считываем с клавиатуры n
	int **a = new int* [n]; // Создаем массив указателей
	for (int i = 0; i < n; i++)
	{
		a[i] = new int [n]; // Создаем элементы
	}
	// А дальше работа как с обычным массивом. 
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			a[i][j] = rand() % 10;
			cout << a[i][j] << " "; // Вывести элементы на консольку
			if (a[i][j] % 2 == 0 && a[i][j] !=0)
			{
				sum++;
			}

		}
		cout << endl; // Двумерный массив. Строка кончилась, переводим строку и на консоли
	}

	cout << "sum =" << sum << endl;
	// Удаление массива
	for (int i = 0; i < n; i++)
	{
		delete[]a[i]; // Удаляем каждый элемент
	}
	delete [] a; // А потом массив
	return 0;
}

using static System.Console;
using System.Collections.Generic;
class test
{
    static void Show(int[,] m)
    {
        for (int i = 0; i < m.GetLength(0); i++)
        {
            for (int j = 0; j < m.GetLength(1); j++)
                Write("{0,4}", m[i, j]);
            WriteLine();
        }
    }
    static void Main()
    {
        Write("N = "); int n = int.Parse(ReadLine());
        Write("M = "); int m = int.Parse(ReadLine());
        var inds = new List<int>();
        int[,] a = new int[n, m];
        for (int i = 0; i < m; i++)
        {
            bool b = true;
            for (int j = 0; j < n; j++)
            {
                Write("A[" + j + "," + i + "] = ");
                a[j, i] = int.Parse(ReadLine());
                if (a[j, i] % 2 != 0) b = false;
            }
            if (b) inds.Add(i);
        }
        WriteLine();
        Show(a);
        WriteLine();
        WriteLine(inds.Count == 0 ? "nety takix stolbcov" : "nomera stolbcov : " + string.Join(", ", inds));
        ReadKey(true);
    }
}

И снова здравствуйте! В прошлой части мы рассмотрели что такое одномерный массив в 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;

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

Добавить комментарий