Двумерные массивы. Операции с двумерным массивом. Присваивание значений. Копирование элементов

Страницы работы

Фрагмент текста работы

Лабораторная работа 5

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

(для выполнения лабораторной работы №5 необходимо проработать материал лекций №№ 13-15 и разобрать примеры, приведенные в данной методичке)

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

Операции с  двумерным массивом.. 2

Ввод и вывод значений. 2

Присваивание значений. 5

Копирование элементов. 5

Представление двумерного массива как одномерного. 6

Двумерные массивы и указатели. 6

Строки как элементы двумерного массива и массива указателей. 7

Способы передачи двумерного массива в функцию.. 12

Динамические двумерные массивы.. 15

Двумерный массив, как возвращаемое из функции значение. 17

Обработка матриц. 19

Построчная обработка. 19

Обработка по столбцам.. 20

Обработка всей матрицы.. 20

Обход по «спирали» квадратной матрицы порядка n. 20

Обработка части матрицы.. 21

Обработка элементов главной или побочной диагоналей квадратной матрицы.. 21

Обработка элементов над(под) главной или побочной диагоналями квадратной матрицы.. 22

Преобразование матриц. 23

Перестановка строк. 23

Перестановка столбцов. 23

Удаление k-ой строки матрицы.. 24

Вставка строки. 25

Построение матриц. 26

Примеры работы с двумерными массивами. 27

Вычисление  количества нулевых  элементов «треугольника» над главной диагональю матрицы,  включая  диагональ. 27

Вычисление  количества  нулевых  элементов  «треугольника» ниже побочной диагонали матрицы,  не включая  диагональ. 27

Вычисление  среднего  значения  элементов  главной  и побочной диагоналей матрицы.. 28

«Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину. 28

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

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

Нахождение среднего  балла  и количества плохих оценок по предмету. 31

Нахождение сумм элементов квадратной матрицы на главной диагонали и на диагоналях, параллельных главной. 32

Обход  по «спирали» квадратной матрицы.. 33

Поиск максимального элемента и его номера в заданной строке динамической символьной матрицы.. 34

Умножение матриц. 35

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

Операции с  двумерным массивом

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

Ввод и вывод значений

Вывод элементов двумерного массива осуществляется по строкам:

1. для целочисленных значений (например, не превосходящих 5 знаков):

#include <iomanip>

const int n = 10;

const int  m = 5;

int main ()

{static int a[n][m];        //статический массив инициализируется 0

int i, j;

for (i=0; i< n; i++)

{

for( j=0; j< m; j++)

cout << setw (8) << a[i][j];                                     //+ позиция на знак +2 пробела

cout <<endl;

}

_getch();

return 0;

}

или

const int n = 9;

const int  m = 3;

int main () {

static int a[n][m];

int i, j;

for (i=0; i< n; i++)

for( j=0; j< m; j++)        //\t  табуляция (отступ между элементами)

printf ("a[%d][%d]=%d \t%c", i, j, a[i][j], (j==m-1)? '\n': ' ');

_getch();

return 0;

}

или

const int n = 10;

const int  m = 5;

int main () {

static int a[n][m];

int  i, j;

for (i=0; i< n; i++)

for( j=0; j< m; j++)

printf ("%d \t%c", a[i][j], (j==m-1)? '\n': ' ');

_getch();

return 0;

}

или

const int n = 9;

const int  m = 3;

int main ()

{

static int a[n][m];

int i, j;

for (i=0; i< n; i++)

{for ( j=0; j< m; j++)                  

printf ("a[%d][%d]=%3d\t", i, j, a[i][j]);

printf ("\n");

}

_getch();

return 0;

}

2. для вещественных значений (в предположении, что количество знаков в целой части числа не превосходит 3, а количество знаков после запятой равно 4):

#include <stdlib.h>

#define  n  9

#define  m  3

int main () {

static double a[n][m];

int i, j;

for (i=0; i< n; i++)

for( j=0; j< m; j++)             

{a[i][j] = rand();

printf ("%10.4lf  %c", a[i][j], (j==m-1)? '\n': ' ');

//+ позиции на знак, точку и пробел

}

_getch();

return 0;

}

или

#include <iomanip>

#include <stdlib.h>

const int n = 10;

const int  m = 5;

int main ()

{static int a[n][m];

int i, j;

for (i=0; i< n; i++)

for( j=0; j< m; j++)

{a[i][j] = rand();        //получение элементов матрицы

cout << setw(10) << setprecision(4) << setiosflags(ios::fixed);

cout << a[i][j];         //вывод  элементов матрицы

if (!((j+1)%m))  cout << endl;   //по 5 в строке

}

_getch();

return 0;

}

или

#include <iomanip>

#include <stdlib.h>

const int n = 10;

const int  m = 5;

int main ()

{

static int a[n][m];

int i, j;

for (i=0; i< n; i++)

{ for( j=0; j< m; j++)

{a[i][j] = rand();      //получение элементов матрицы

cout << setw(10);     

cout << setprecision(4) << setiosflags(ios::fixed);

cout << a[i][j];            //вывод  элементов матрицы

}                         

cout << endl;

}

_getch();

return 0;

}

При вводе значений двумерного массива возможны варианты:

  • набираем элементы строки массива через пробел и нажимаем <enter>
  • набираем все элементы массива через пробел и нажимаем <enter>
  • после набора каждого элемента нажимаем <enter>
  • произвольного сочетания названных способов

#include <stdlib.h>

int main ()

{

const int n=5;

const int m=3;

int a[n][m];

int i, j;

//1    

for (i=0; i< n; i++)

for( j=0; j< m; j++)

a[i][ j] = rand() %5;    // или cin >> a[i][j];

// или scanf ("%d", &a[i][j]);

for (i=0; i< n; i++)

{ for( j=0; j< m; j++)

printf ("%5d", a[i][j]);      //или  cout << setw(5) << a[i][j];

printf ("\n");                       //или  cout << endl;

}

printf ("\n");                            //или  cout << endl;

//2      

for (i=0; i< n; i++)

for( j=0; j< m; j++)

*(a[i]+ j) = rand() %5;       // или cin >> *(a[i]+ j);

// или scanf ("%d", (a[i]+j));

for (i=0; i< n; i++)

{ for( j=0; j< m; j++)

printf ("%5d", *(a[i]+ j));  //или  cout << setw(5) << *(a[i]+ j);

printf ("\n");                           //или  cout << endl;

}

printf ("\n");                              //или  cout << endl;

//3      

for (i=0; i< n; i++)

for( j=0; j< m; j++)

*(*(a+i)+j) = rand() %5;    // или cin >> *(*(a+i)+ j);

// или scanf ("%d", (*(a+i)+j) );

for (i=0; i< n; i++)

{ for( j=0; j< m; j++)

printf ("%5d", *(*(a+i)+j));//или  cout << setw(5) << *(*(a+i)+j);

printf ("\n");              //или  cout << endl;

}

_getch();

return 0;

}

Заполнение двумерного массива случайными числами от 1 до 11 и вывод элементов массива на экран:

#include <stdlib.h>

const int n = 10;

const int  m = 5;

int main ()

{static int a[n][m];

for (int i=0; i<n; i++)

for(int j=0; j<m; j++)

{a[i][j] = 1 +rand() % 10;

printf (" %7d %c", a[i][j], (j==m-1)?'\n':' ');

}

_getch();

return 0;

}

Присваивание значений

Присваивание значений элементам символьного массива  chararray [n][m]:

#include <stdlib.h>

int main ()

{

const int n=3;

const int m=4;

char a[n][m];

int i, j;

for (i=0; i< 4; i++)

for( j=0; j< 3; j++)

a[i][ j] = char (97+rand() %26);                                           //символы латинского алфавита

for (i=0; i< 4; i++)

{for( j=0; j< 3; j++)

printf ("%2c",a[i][j]);

printf ("\n");

}

_getch();

return 0;

}

Копирование элементов

Копирование элементов двумерного массива b в идентичный по структуре двумерный массив a осуществляется с помощью операторов:

int a[10][3], b[10][3];

for (int i=0; i< 10; i++)

        for( int j=0; j< 3; j++)

                  a[i][j] = b[i][j];

или с помощью функции memcpy ():

#include <string.h>

int main()

   {const int n=10;

    const int m=7;

    int a[n][m], b[n][m];

    for (int i=0; i<n; i++)

         for(int j=0; j<m; j++)

              b[i][j] = 1 +rand() % 10;        

    memcpy (a, b, sizeof (b) );// !!!

    for (unsigned i=0; i< n; i++)

      for (unsigned j=0; j< m; j++)                 

            printf ("%3d%c", b[i][j], (j==m-1)?'\n':' ');

_getch();

   return 0;

  }

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

Двумерный массив можно представить в виде одномерного, а «двумерность» учитывать при обращении к элементам массива. Пусть имеем двумерный массив  double A[n][m] (n строк по m элементов). Представим его в виде одномерного массива double A[n*m]; тогда обращение к элементу одномерного массива A[i*m + j] есть фактически обращение к элементу двумерного массива A[i][j]. Рассмотрим это на примере:

const int n=3;

const int m=4;

int main()   

{

inti, j;

 int *A = new int[n*m];         //динамический одномерный массив

for ( i=0; i<n; i++)

   for ( j=0; j<m; j++) 

            A[i*m+j]=i*m+j; //инициализация 2d-массива с элементом A[i][j]                                                             //как 1d-массива с элементом A[i*m+j]

for ( i=0; i<n; i++)

   {for ( j=0; j<m; j++) 

            cout << setw(4) << A [i*m+j];  //вывод 2d-массива

            cout << endl;                         

    }

delete [ ]A;             

 _getch();

return 0;

}

Двумерные массивы и указатели

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

Похожие материалы

Информация о работе