- •Алгоритм.
- •Множественный выбор switch.
- •Оператор do … while ( с постусловием ).
- •Do оператор ;
- •Оператор цикла for.
- •Использование операторов break и continue в циклах.
- •Функции ввода-вывода.
- •Общий вид программы.
- •Вложенные циклы.
- •Адреса и указатели.
- •Массивы.
- •Int a[10] ; // целочисленный вектор из 10 элементов.
- •Векторы.
- •Сортировка вектора.
- •Матрицы.
- •Строки.
- •Подпрограммы.
- •Директива препроцессора #define .
- •Области видимости.
- •Классы памяти.
- •Рекурсия.
- •Подготовка к зачету.
- •Структуры.
- •Int ball [4] ; // описание третьего поля – оценки.
- •Очередь.
- •Линейные списки.
- •Деревья.
- •Int n, k ; // ее размерности
- •Void print ( void ) // печать матрицы
- •Определение методов вне класса.
- •Частные и общие данные.
- •Конструктор.
- •Перегрузка операторов.
- •Неявный указатель *this.
- •Дружественные функции.
- •Класс множество.
- •Наследование.
- •Объекто-ориентированное программирование.
- •Список вопросов к экзамену.
- •Литература.
Матрицы.
Оператор описания целочисленной матрицы, состоящей из 3-х строк и 4-х столбцов:
int matr[3][4] ;
Например такая матрица:
2 3 4 элементы матрицы задаются так: matr[0][0] - 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
Ввод и вывод матрицы осуществляется так:
Инициализация.
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 } ;
Ввод.
for ( i=0 ; i<3 ; i++)
for ( j=0 ; j<4 ; j++)
scanf(“%d”, &matr[i][j]) ;
Вывод.
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”) ;
}
}
Попробуйте выполнить следующие задачи:
Обнулить все элементы матрицы под главной диагональю. Идея решения в том, что первый индекс у этих элементов больше второго.
Проверить является ли вектор нулевым, т.е. состоит из одних нулевых элементов.
Идея решения – сосчитать количество нулевых элементов в векторе, если это количество равно размеру вектора, то он нулевой.