Объявление, способы определения
Матрица объявляется, например, следующим образом:
const n=3, m=5; int A[n][m],
где n — количество строк (первая, левая размерность), m —количество столбцов или количество элементов в строке (вторая, правая размерность). Матрица располагается в оперативной памяти по строкам и занимает непрерывный участок, объём которой равен n*m*sizeof(int), где int — тип элементов матрицы.
Тот или иной способ определения матрицы применяется в зависимости от специфики конкретной задачи.
Матрицу можно инициализировать при объявлении:
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];
} }
Для экономии времени, затрачиваемого на ввод матрицы, для некоторых задач её элементы можно определить с помощью датчика случайных чисел(см. 6.2 гл. 1):
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);
Сформированную так матрицу для некоторых задач легче анализировать.
Преимущество последних двух способов в том, что во время отладки программмы не нужно тратить время на неоднократный ввод элементов матрицы или записывать их в тексте программы при объявлении. При этом матрицу надо обязательно выводить на экран, чтобы можно было проверить полученный результат.
Вывод матриц
Простой вывод можно выполнить, используя управление курсором. Для этого в программе ввода (§ 1) достаточно заменить cin на cout.
Кроме этого можно предложить следующий вариант вывода:
cout<<endl;
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); }
int 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(); return 0;
}
Замечания.
Напомним, что стандартные функции textcolor и textbackground устанавливают только цвет выводимых символов и цвет фона в текстовом режиме, но ничего не выводят. Для “цветного” вывода вместо printf или cout необходимо использовать функцию cprintf.
Предполагается, что размерности матрицы такие, что её строка размещается в одной строке экрана. Кроме того, вся матрица размещается на экране. В противном случае надо усложнить предложенный фрагмент программы.
Для удобства анализа результатов часто требуется одновременно выводить несколько матриц, матрицу и вектор и т. п. При этом они должны располагаться в определённом порядке и в заданном месте экрана.
Например, слева выведем матрицу A[n][m] цветом С1, далее, правее — одномерный массив B[n] в столбец по одному элементу цветом С2 и, наконец, ещё правее — матрицу D[n][k] цветом C3 в обратном порядке, т. е. сначала (n–1)–ю строку, затем (n–2)–ю и так далее, 0–ю строку.
void MyC(int C)
{textcolor(C); }
int main()
{ textbackground(1); clrscr();
const n=4, m=6, k=5; int D[n][k], A[n][m];
float b[n]; randomize();
for ( int i=0; i<n; i++)
{ b[i]=(float)random(m+k)/10;
// или b[i]=random(m+k)/10.;
// можно по-другому правилу b[i]=(float)i / 10;
for ( int j=0; j<m; j++)
{ A[i][j]= random(50)-100; // Все элементы отрицательные
D[i][j]= random(500)+200; // Все элементы положительные
}
}
MyC(10); cprintf(" Matrix A ");
MyC(11); cprintf(" Vector b");
MyC(15); cprintf(" Matrix D\n");
for ( int i=0; i<n; i++)
{ cout<<endl;
MyC(10);
for ( int j=0; j<m; j++) // Вывод i–й строки матрицы A
cprintf ("%4d", A[i][j]);
MyC(11);
// Вывод одного i–го элемента вектора b
cprintf (" %6.1f ", b[i]);
MyC(15); // Вывод i–й строки матрицы D в обратном порядке
for ( int j=0; j<k; j++)
cprintf ("%5d", D[n-1-i][j]);
}
getch(); return 0;
}
Замечание. Предполагается, что размерности матриц и вектора такие, что в одной строке экрана размещаются две строки из A и D и один элемент b. Кроме того, все три массива могут поместиться на экране. В противном случае требуется усложнение вывода.
Упражнение. Написать второй вариант этой же программы, в которой используется функция gotoxy. Сначала выводим всю матрицу A, затем возвращаемся на первую строку и выводим в столбец вектор b и, наконец, в обратном порядке выводим матрицу D.
Дата добавления: 2016-07-18; просмотров: 1606;