Двумерные массивы в СИ
Объявление двумерного массива в СИ имеет следующий синтаксис:
тип имя[размер №1][размер №2];
Размеры двумерного массива в СИ указываются в отдельных парных квадратных скобках после имени и могут быть любыми положительными целочисленными значениями. На практике принято значение первой размерности называть строками, а второй – столбцами. Как и в случае одномерного массива, в стандарте С89 регламентируется, что размеры двумерного массива должны быть целочисленными константами.
Стандарт С99 допускает объявление динамических двумерных массивов путём использования выражений при указании размеров матрицы, если в это выражение входят значения определенных ранее переменных (выражение должно иметь положительный целочисленный результат). Например:
int n,m;
printf("Введите размеры матрицы: ”);
scanf("%d %d”,&n,&m);
double a[n][m];
При объявлении двумерного массива в СИ допускается производить инициализацию значений элементов матрицы:
тип имя[размер №1][размер №2] = {
{значение № 11, ... значение № 1N},
...
{значение № M1, ... значение № MN}
};
Примеры объявлений с инициализацией:
int a[2][4] = { //Объявлен двумерный массив
{1,2,3,4}, // 1 2 3 4
{5,6}}; // 5 6 0 0
double b[3][5] = { //Объявлен двумерный массив
{1.0, 2.0, 3.0, 4.0, 5.0}, // 1 2 3 4 5
{6.0, 7.0} // 6 7 0 0 0
}; // 0 0 0 0 0
Пропускать значения инициализации строк нельзя. Например, следующий фрагмент кода программы неправильный:
int a[3][5] = {{1,2,3,4,5},,{6,7,8,9,0}};
Допускается не указывать количество строк в двумерном массиве (указываются пустые квадратные скобки). В таком случае размер массива будет определен по числу инициализирующих значений строк. Количество столбцов матрицы всегда необходимо указывать. Например:
double b[][4] = {{1,2,3,4},{5,6,7,8}};
Объявление константных матриц (значения их элементов изменить нельзя) начинается с ключевого слова const, за которым следует объявление матрицы с инициализацией. Пример:
const int matrix[][5] = {
{1,2,3,4,5},
{6,7,8,9}
};
Обращение к элементу матрицы осуществляется путем указания имени матрицы, а после имени в отдельных парных квадратных скобках индексы элемента (строка и столбец):
имя[строка][столбец]
Индексация в языке СИ начинается с нуля, поэтому для матрицы размером, например, пять строк и десять столбцов правильными будут индексы строк от нуля до четырех, а столбцов – от нуля до девяти включительно.
Каждый отдельный элемент матрицы может рассматриваться как простая переменная и, соответственно, выступать в выражениях в качестве RValue или LValue значений.
Ввод и вывод матриц в языке СИ осуществляется поэлементно. Так как матрица имеет двойную размерность, то ввод и вывод осуществляется во вложенных циклах. Например:
double a[5][10];
for(int i=0;i<5;i++)
for(int j=0;j<10;j++)
scanf("%lf”,&a[i][j]);
...
for(int i=0;i<5;i++){
for(int j=0;j<10;j++)
printf("%8.2lf\t”,a[i][j]);
printf("\n”);
}
Присвоение матрицы матрице также осуществляется поэлементно. Например, необходимо присвоить целочисленную матрицу x целочисленной матрице y. Фрагмент программы:
int x[5][10], y[5][10];
...
for(int i=0;i<5;i++)
for(int j=0;j<10;j++)
y[i][j] = x[i][j];
...
В языке СИ допускается создание массивов размерностью три и более(т.е трехмерных, четырехмерных и т.д.). Например, объявление трёхмерного целочисленного массива с инициализацией будет иметь вид:
int a[2][2][2]={ //это трехмерный массив
{{1,2},{3,4}},
{{5,6},{7,8}}
};
Ввод, вывод и прочая обработка такого массива осуществляется аналогично обработке двумерного массива, только уже в трех вложенных циклах.
Примеры решения задач по двумерным массивам
Пора почитать о строках в СИ.