Основные действия с двухмерными массивами
I. Инициализация массива. Тот или иной способ инициализации массиваиспользуетсяв зависимости от специфики конкретной задачи.
а) инициализациямассивапри его описании:
int A[n][m]= {{1, -2, 3, -4, 5},
{ 10, 20, 33, -40},
{-11, 22, 300, 400, 500}};
Если в строке указано меньше элементов, чем требуется, то остальные инициализируются нулями. У нас во второй строке с номером 1 (нумерация и строк, и столбцов начинается с нуля) последний элемент будет нулевым.
б) Ввод матрицы с клавиатуры используется, если для тестирования программы принципиально важно, какие значения элементов матрицы введены, а другие способы её задания неприемлемы. Например, некоторые строки (но не все) не должны содержать нулей. Очевидным недостатком этого способа является трудоёмкость ввода и необходимость его повторения при отладке программы. Простейший ввод можно выполнить следующим образом:
for ( i=0; i<n; i++)
for ( j=0; j<m; j++)
cin>>A[i][j];
Но в этом варианте в каждой строке набираем одно число, и не видно, элемент с каким номером вводим. Желательно, чтобы вводимые элементы матрицы на экране располагались так, как в математической записи, то есть элементы строки матрицы должны
вводиться из одной строки экрана. Это можно выполнить, например, следующим образом:
for ( y=wherey(), i=0; i<n; i++, y++)
{ gotoxy(1, y); cout<<"i="<<i;
for (x=5, j=0; j<m; j++, x+=5)
{ gotoxy(x,y);
cin>>A[i][j];
} }
в) Для экономии времени, затрачиваемого на ввод матрицы, для некоторых задач её элементы можно определить с помощью генератора случайных чисел
Randomize();
for ( i=0; i<n; i++)
for ( j=0; j<m; j++)
A[i][j]=random(100);
Если по условию задачи требуется, чтобы числа матрицы принадлежали интервалу [r1, r2), где r2>r1, то в цикле следует записать A[i][j]=random(r2-r1)+r1; Этот метод можно использовать при отладке программы, если на элементы матрицы нет ограничений.
д) Элементы матрицы можно задать также по некоторому специальному правилу (закону), например:
for ( i=0; i<n; i++)
for ( j=0; j<m; j++)
A[i][j]=(i+1)*(j+1);
Сформированную так матрицу для некоторых задач легче анализировать.
Замечание. Преимущество последних двух способов инициализации массива в том, что во время отладки программы не нужно тратить время на неоднократный ввод элементов матрицы или записывать их в тексте программы при объявлении. При этом матрицу надо обязательно выводить на экран, чтобы можно было проверить полученный результат.
II. Вывод матриц.
а) Простой вывод в виде таблицы можно выполнить, используя два цикла for для вывода элементов первой строки, затем второй и т.д.
Кроме этого можно предложить следующий вариант вывода:
cout<<”\n”;
for ( i=0; i<n; i++)
{ printf("\n"); // Переход на новую строку экрана.
for ( j=0; j<m; j++)
printf ("%5d", A[i][j]);
}
При таком выводе числа столбцов будут выровнены благодаря наличию формата %5d, т. е. независимо от размерности чисел они будут выводиться друг под другом. Напомним, что для вещественных чисел необходимо указать, например, формат %7.2f. В этом фрагменте важно место оператора printf("\n"). Если символ “\n” записать во внутреннем цикле (printf ("\n%5d", A[i][j])), то в каждой строке экрана будет выводиться по одному числу. Необходимо также обратить внимание на расстановку фигурных скобок.
Иногда для наглядности целесообразно элементы матрицы в зависимости от условия выводить разным цветом. Например, положительные числа вывести цветом C1 на фоне C2, а отрицательные и нулевые — наоборот, цветом С2 на фоне С1, где С1 и С2 — целые числа, определяющие цвет. Это реализуется, например, следующим образом:
void MyColors (int C1, int C2)//пользовательская функция для задания цвета
{ textcolor(C1);
textbackground(C2); }
void main()
{ textbackground(3); clrscr(); // Очищает и закрашивает экран
const n=4,m=6; float A[n][m];
// Пример формирования вещественной матрицы
// случайным образом
randomize();
for ( int i=0; i<n; i++)
for ( int j=0; j<m; j++)
A[i][j]=(random(50)-40)/100. + random(5);
for ( int i=0; i<n; i++)
{ cout<<endl; // Переход на новую строку экрана.
for ( int j=0; j<m; j++)
{ if (A[i][j]>0) MyColors(2,15); // Изменение цветов
else MyColors(15,2);
cprintf ("%7.2f", A[i][j]);
}
} getch();
}