Двумерные массивы
С позволяет создавать многомерные массивы. Простейшим видом многомерного массива является двумерный массив. Двумерный массив это массив одномерных массивов. Двумерный массив объявляется следующим образом:
тип имя_массива [размер_2] [размер_1];
Как и в одномерных массивах, каждый индекс имеет нижнюю границу, равную 0, а число элементов для каждого уровня индекса определяется при объявлении многомерного массива.
Пример 5. Объявление многомерных массивов
double matrix A [100][10];
char table [41][22][3];
int index [7][12];
Большинство компиляторов хранит элементы многомерного массива друг за другом, т.е. как длинный одномерный массив. Исполняемый модуль вычисляет, где расположен искомый элемент в этом массиве.
Однако заполнение и обработку многомерных массивов чаще всего производят пользуясь вложенными циклами.
С дает возможность инициализировать многомерный массив способом, аналогичным инициализации одномерных массивов. Для этого нужно использовать список значений, расположенных в той же последовательности, в которой элементы многомерного массива хранятся в памяти ЭВМ.
Пример 6. Инициализация матрицы
#define MAX_COL 4
#define MAX_ROW 3
. . .
int main ( )
{ double x[MAX_ROW][MAX_COL]= {{ 1, 2, 3, 4}, // строка # 1
{ 5, 6, 7, 8}, // строка # 2
{ 9,10,11,12}}; // строка # 3
. . .
return 0;
}
Пример 7. Ввод многомерных массивов с клавиатуры.
. . .
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++)
{ cout << "x[" << i <<"][" << j<<"]";
cin >> x[i][ j]; }
}
. . .
Вывод массивов также осуществляется с помощью циклов, одиночных для одномерных массивов или вложенных для многомерных массивов.
Пример 7. Вывод матриц
. . .
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++)
{ cout << setw(5) << x[i][ j];
}
cout << endl;
}
При обработке матриц чаще всего встречаются следующие типы задач:
работа с матрицей в целом;
работа со строкой (столбцом) матрицы;
работа с диагональными элементами.
При работе с матрицей в целом, в качестве объекта для сравнения выбирают элемент с индексами (0,0), затем, последовательно перебирая все элементы матрицы, выполняют необходимые действия. Перебор элементов происходит с использованием вложенных циклов.
Пример 8. Определить среднее арифметическое значение элементов матрицы x[6][7] целого типа.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MAX_COL 6
#define MAX_ROW 7
int main()
{ int x[MAX_ROW][MAX_COL];
int i,j,sum=0;
float sred;
srand( (unsigned)time( NULL ) ); // Инициализация генератора случайных чисел
for(i=0; i<MAX_ROW; i++) //Заполнение массива случайными числами
for(j=0; j<MAX_COL; j++)
x[i][j]=rand()%11;
for(i=0; i<MAX_ROW; i++) // Вывод матрицы на экран
{ printf("\n");
for(j=0; j<MAX_COL; j++)
{ printf(" %6d", x[i][j]); // и вычисление суммы ее элементов
sum+=x[i][j];
}
}
sred= (float) sum/(MAX_ROW*MAX_COL);
printf("\nSumma=%d Meandr=%f\n",sum,sred);
return 0;
}
Для поиска элемента строки (столбца) объектом сравнения является первый элемент строки с индексами i,0 или столбца с индексами 0,j и обработка идет до конца строки (столбца). Обычно результатом такой обработки массива является вектор-столбец или вектор-строка.
Пример 9. Определить минимальный элемент каждой строки действительной матрицы matr[4][8].
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define COL 4
#define ROW 8
int main()
{ int matr[ROW][COL];
int i,j;
int min[ROW];
srand( (unsigned)time( NULL ) );
for (i=0; i<ROW; i++) // заполнение и вывод матрицы
{ for (j=0; j<COL; j++) // на экран
{ matr[i][j]=rand()%101;
printf(" %3d", matr[i][j]);
}
printf("\n");
}
for (i=0; i<ROW; i++) // формирование вектора-столбца
{ min[i]=matr[i][0]; // из минимальных элементов строк
for (j=0; j< COL; j++)
if (matr[i][j]<min[i]) min[i]=matr[i][j];
printf(" %3d", min[i]);
}
printf("\n");
for (i=0; i< ROW; i++) printf("%3d ",min[i]);
printf("\n");
return 0;
}
При работе с диагональными элементами учитывают, что индексы элементов, стоящих на главной диагонали, удовлетворяют условию i = j.
Элементы, стоящие на побочной диагонали, имеют индексы, удовлетворяющие условию
i=n - j - 1,
если n - порядок матрицы (предполагается, что матрица - квадратная).
