Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций по курсу 'Информатика'.doc
Скачиваний:
4
Добавлен:
14.07.2019
Размер:
483.84 Кб
Скачать

Матрицы.

Оператор описания целочисленной матрицы, состоящей из 3-х строк и 4-х столбцов:

int matr[3][4] ;

Например такая матрица:

  1. 2 3 4 элементы матрицы задаются так: matr[0][0] - 1

  1. 6 7 8 matr[0][1] - 2

9 10 11 12 matr[1][0] - 5

matr[2][3] - 12

Номера строки и столбца отсчитываются от 0, поэтому последний элемент в матрице размерностью 3 на 4 - matr[2][3]. В памяти элементы матрицы располагаются линейно по строкам.

Имя матрицы определяет адрес элемента matr[0][0].

matr одно и тоже &matr[0][0] одно и тоже matr[0]

matr[1] одно и тоже &matr[1][0] одно и тоже matr+4

*(matr +6) одно и тоже *(matr[1]+2) одно и тоже matr[1][2] одно и тоже 7

Ввод и вывод матрицы осуществляется так:

  1. Инициализация.

int matr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} } ;

int matr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } ;

  1. Ввод.

for ( i=0 ; i<3 ; i++)

for ( j=0 ; j<4 ; j++)

scanf(“%d”, &matr[i][j]) ;

  1. Вывод.

for ( i=0 ; i<3 ; i++)

{

for ( j=0 ; j<4 ; j++)

printf(“%d ”, matr[i][j]) ;

printf(“\n”) ;

}

Рассмотрим задачу: найти в матрице максимальный элемент.

{

int matr[5][5], i, j, max ;

for ( i=0 ; i<5 ; i++)

for ( j=0 ; j<5 ; j++)

scanf(“%d”, &matr[i][j]) ;

max=matr[0][0] ;

for ( i=0 ; i<5 ; i++)

for ( j=0 ; j<5 ; j++)

if ( max<matr[i][j]) max=matr[i][j] ;

printf(“%d”, max) ;

}

Примечание: подумать, что нужно сделать, чтобы вывести не только значение max, но и его «адрес» - индексы.

Еще одна интересная задача – транспонирование матрицы.

Математически это означает переворачивание матрицы на бок, замена строк столбцами.

Исходная транспонированная

3 7 3 5 8 3 2 1 1

2 5 6 7 9 7 5 4 2

1 4 4 5 8 3 6 4 3

1 2 3 4 5 5 7 5 4

8 9 8 5

Для квадратной матрицы транспонирование – это перестановка местами элементов с симметричными индексами, т.е. matr[i][j] переставляется с matr[j]i], а элементы главной диагонали остаются на месте.

Рассмотрим программу реализующую данный алгоритм.

#include<stdio.h>

#include<conio.h>

main()

{

int matr[5][5], i, j, k ;

for ( i=0 ; i<5 ; i++)

for ( j=0 ; j<5 ; j++)

scanf(“%d”, &matr[i][j]) ;

for ( i=0 ; i<5 ; i++)

for ( j=0 ; j<5 ; j++)

{

k=matr[i][j] ;

matr[i]j]=matr[j][i] ;

matr[j]i]=k ;

}

for ( i=0 ; i<5 ; i++)

{ for ( j=0 ; j<5 ; j++)

printf(“%d ”, matr[i][j]) ;

printf(“\n”) ;

}

}

В этой программе специально сделана ошибка. Матрица транспонироваться не будет, на печати мы увидим исходную. Почему, найдите ошибку и исправьте ее.

Очевидно, что строка матрицы является вектором, поэтому работа со строкой или столбцом матрицы аналогична работе с вектором. Рассмотрим пузырьковую сортировку каждой строки матрицы.

#include<stdio.h>

#include<conio.h>

main()

{

int matr[10][10], i, j, k ;

for ( i=0 ; i<10; i++)

for ( j=0 ; j<10 ; j++)

scanf(“%d”, &matr[i][j]) ;

for (k=0 ; k<10 ; k++) // перебор строк

for ( i=0 ; i<8 ; i++) // пузырьковая сортировка каждой строки матрицы по убыванию

for ( j=0 ; j<9-i; j++)

{

if( matr[k][j]<matr[k][j+1] ) {

x=matr[k][j] ;

matr[k][j]=matr[k][j+1] ;

matr[k][j+1]=x ;

}

}

for ( i=0 ; i<10 ; i++)

{ for ( j=0 ; j<10 ; j++)

printf(“%d ”, matr[i][j]) ;

printf(“\n”) ;

}

}

Попробуйте выполнить следующие задачи:

    1. Обнулить все элементы матрицы под главной диагональю. Идея решения в том, что первый индекс у этих элементов больше второго.

    2. Проверить является ли вектор нулевым, т.е. состоит из одних нулевых элементов.

Идея решения – сосчитать количество нулевых элементов в векторе, если это количество равно размеру вектора, то он нулевой.