Объявление, способы определения


Матрица объявляется, например, следующим образом:

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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.015 сек.