Поиск по сайту:

Двумерный массив в C++


Введение

Двумерный массив в C++ — это простейшая форма многомерного массива. Его можно представить как массив массивов. На изображении ниже показан двумерный массив.

Двумерный массив также называют матрицей. Это может быть любой тип, такой как целое число, символ, число с плавающей запятой и т. д., в зависимости от инициализации. В следующем разделе мы собираемся обсудить, как мы можем инициализировать 2D-массивы.

Инициализация двумерного массива в C++

Итак, как нам инициализировать двумерный массив в C++? Вот так просто:

int arr[4][2] = {
{1234, 56},
{1212, 33},
{1434, 80},
{1312, 78}
} ;

Итак, как видите, мы инициализируем двумерный массив arr с 4 строками и 2 столбцами как массив массивов. Каждый элемент массива снова является массивом целых чисел.

Мы также можем инициализировать двумерный массив следующим образом.

int arr[4][2] = {1234, 56, 1212, 33, 1434, 80, 1312, 78};

В этом случае arr также представляет собой двумерный массив с 4 строками и 2 столбцами.

Печать 2D-массива в C++

Мы закончили инициализацию 2D-массива, теперь, фактически не распечатывая его, мы не можем подтвердить, что это было сделано правильно.

Кроме того, во многих случаях нам может понадобиться распечатать результирующий 2D-массив после выполнения над ним некоторых операций. Итак, как мы это делаем?

Код ниже показывает нам, как мы можем это сделать.

#include<iostream>
using namespace std; 
main( ) 
{  
	int arr[4][2] = {
		{ 10, 11 },
		{ 20, 21 },
		{ 30, 31 },
		{ 40, 41 }
		} ;
		
	int i,j;
	
	cout<<"Printing a 2D Array:\n";
	for(i=0;i<4;i++)
	{
		for(j=0;j<2;j++)
		{
			cout<<"\t"<<arr[i][j];
		}
		cout<<endl;
	}
}

Выход:

В приведенном выше коде

  • Сначала мы инициализируем двумерный массив arr[4][2] с определенными значениями,
  • После этого мы пытаемся напечатать соответствующий массив, используя два цикла for,
  • внешний цикл for выполняет итерацию по строкам, а внутренний - по столбцам двумерного массива,
  • Итак, для каждой итерации внешнего цикла i увеличивается и переводит нас к следующему одномерному массиву. Кроме того, внутренний цикл одновременно обходит весь массив 1D,
  • И соответственно, мы печатаем отдельный элемент arr[ i ][j ].

Использование элементов 2D-массива в качестве пользовательского ввода

Ранее мы видели, как можно инициализировать 2D-массив заранее определенными значениями. Но мы также можем сделать его пользовательским вводом. Давайте посмотрим, как

#include<iostream>
using namespace std; 
main( ) 
{  
      int  s[2][2];
      int  i, j;
      cout<<"\n2D Array Input:\n";
	  for(i=0;i<2;i++)
	  {
	  	for(j=0;j<2;j++)
	  	{
	  		cout<<"\ns["<<i<<"]["<<j<<"]=  ";
	  		cin>>s[i][j];
		}
	  } 
	  
	  cout<<"\nThe 2-D Array is:\n";
      for(i=0;i<2;i++)
	  {
	  	for(j=0;j<2;j++)
	  	{
	  		cout<<"\t"<<s[i][j];
		}
		cout<<endl;
	  } 
} 

Выход:

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

Сложение матриц с использованием двумерных массивов в C++

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

#include<iostream>
using namespace std; 
main() 
{  
      int  m1[5][5], m2[5][5], m3[5][5];
      int  i, j, r, c;
      
      cout<<"Enter the no.of rows of the matrices to be added(max 5):";
      cin>>r;
      cout<<"Enter the no.of columns of the matrices to be added(max 5):";
      cin>>c;
      
      cout<<"\n1st Matrix Input:\n";
	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		cout<<"\nmatrix1["<<i<<"]["<<j<<"]=  ";
	  		cin>>m1[i][j];
		}
	  } 
	  
	  cout<<"\n2nd Matrix Input:\n";
	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		cout<<"\nmatrix2["<<i<<"]["<<j<<"]=  ";
	  		cin>>m2[i][j];
		}
	  } 
	  
	  cout<<"\nAdding Matrices...\n";
	  
	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		m3[i][j]=m1[i][j]+m2[i][j];
		}
	  } 
	  
	  cout<<"\nThe resultant Matrix is:\n";

	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		cout<<"\t"<<m3[i][j];
		}
		cout<<endl;
	  } 
	  
} 

Выход:

Здесь,

  • Возьмем две матрицы m1 и m2, содержащие максимум 5 строк и 5 столбцов. И еще одна матрица m3, в которой мы будем хранить результат,
  • В качестве пользовательского ввода мы использовали количество строк и столбцов для обеих матриц. Поскольку мы выполняем сложение матриц, количество строк и столбцов должно быть одинаковым для обеих матриц,
  • После этого мы принимаем обе матрицы в качестве входных данных пользователя, снова используя вложенные циклы for,
  • На данный момент у нас есть обе матрицы m1 и m2,
  • затем мы проходим по матрице m3, используя два цикла for, и обновляем соответствующие элементы m3[ i ][j ] на значение m1[i][j]+m2 [i][j]. Таким образом, к концу внешнего цикла for мы получим желаемую матрицу,
  • Наконец, мы распечатываем результирующую матрицу m3.

Указатель на 2D-массив в C++

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

#include<iostream>
using namespace std;
/* Usage of pointer to an array */ 
main( ) 
{  
      int  s[5][2] = {
           {1, 2},
           {1, 2},
           {1, 2},
           {1, 2}
           } ;
           
      int (*p)[2] ;
      int  i, j;
      for (i = 0 ; i <= 3 ; i++)
      {
      		p=&s[i];
      		cout<<"Row"<<i<<":";
            for (j = 0; j <= 1; j++)
                cout<<"\t"<<*(*p+j);
            cout<<endl;
      } 
      
}

Выход:

Здесь,

  • В приведенном выше коде мы пытаемся напечатать 2D-массив с помощью указателей.
  • Как и раньше, сначала мы инициализируем двумерный массив s[5][2]. А также указатель (*p)[2], где p — указатель, в котором хранится адрес массива из 2 элементов,
  • Как мы уже говорили, двумерный массив можно разбить на массив массивов. Таким образом, в этом случае s на самом деле является массивом из 5 элементов, которые также являются массивами с 2 элементами для каждой строки.
  • Мы используем цикл for для обхода этих 5 элементов массива, s. Для каждой итерации мы присваиваем p адрес s[i],
  • Кроме того, внутренний цикл for выводит отдельные элементы массива s[i] с помощью указателя p. Здесь (*p + j) дает нам адрес отдельного элемента s[i][j], поэтому с помощью *(*p+j) мы можем получить доступ соответствующее значение.

Передача двумерного массива в функцию

В этом разделе мы узнаем, как передать двумерный массив любой функции и получить доступ к соответствующим элементам. В приведенном ниже коде мы передаем массив a двум функциям show() и print(), которые распечатывают переданный двумерный массив.

#include<iostream>
using namespace std;   
 
void show(int (*q)[4], int  row, int  col)
{
	int  i, j ;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
    		cout<<"\t"<<*(*(q + i)+j); 
		cout<<"\n";
	}  
    cout<<"\n";
} 
 
void print(int  q[][4], int row, int col)
{
    int  i, j; 
    for(i=0;i<row;i++)
    {   
	 for(j=0;j<col;j++)
   	    	cout<<"\t"<<q[i][j];
   	 cout<<"\n";
	}
   cout<<"\n";
}
 
int main() 
{
  int  a[3][4] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21} ; 
 
  show (a, 3, 4);
  print (a, 3, 4);
  return 0;
} 

Выход:

Здесь,

  • В функции show() мы определили q как указатель на массив из 4 целых чисел посредством объявления int (*q)[4],< /li>
  • q содержит базовый адрес нулевого одномерного массива
  • Затем этот адрес присваивается q, указателю int, а затем с помощью этого указателя осуществляется доступ ко всем элементам нулевого одномерного массива.
  • В следующий раз в цикле, когда i принимает значение 1, выражение q+i извлекает адрес первого одномерного массива. Это связано с тем, что q является указателем на нулевой одномерный массив, и добавление к нему 1 даст нам адрес следующего одномерного массива. Этот адрес снова присваивается q, и с его помощью осуществляется доступ ко всем элементам следующего одномерного массива
  • Во второй функции print() объявление q выглядит следующим образом: int q[][4] ,
  • Это то же самое, что и int (*q )[4], где q — указатель на массив из 4 целых чисел. Единственное преимущество состоит в том, что теперь мы можем использовать более знакомое выражение q[i][j] для доступа к элементам массива. Мы могли бы использовать то же выражение и в show(), но для лучшего понимания использования указателей мы используем указатели для доступа к каждому элементу.

Заключение

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

Рекомендации

  • https://en.wikipedia.org/wiki/Array_data_structure
  • /сообщество/учебники/массивы-в-c