- •Часть 2
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •Глава 6 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •§ 4. Вещественный тип
- •§ 5. Преобразование типов
- •Преобразование типов в выражениях
- •Преобразование типов при присваивании
- •Г л а в а 7 введение в указатели
- •§ 1. Понятие указателя. Операции разыменования и разадресации
- •§ 2. Инициализация и присваивание указателей
- •§ 3. Распределение динамической памяти
- •Операция new
- •Операция delete
- •§ 4. Параметры-указатели. Функция ввода scanf
- •Упражнения, тесты
- •Г л а в а 8 одномерные массивы, указатели и функции
- •§ 1. Связь указателей и одномерных массивов. Передача массива в качестве параметра функции
- •§ 2. Сортировка одномерных массивов
- •§ 3. Сортировка массива по параметру числа
- •§ 4. Сортировка массива выбором.
- •§ 5. Сортировка массива вставками
- •§ 6. Динамические одномерные массивы
- •6.1. Порядок работы с динамическим массивом
- •6.2. Работа с динамическим массивом в классе. Деструктор
- •§ 7. Введение в строки
- •Глава 9 мАтрицы
- •§ 1. Объявление, способы определения матриц
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов
- •3.1. Построчная обработка
- •Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •Преобразование матрицы
- •Построение матриц
- •§ 4. Матрицы, указатели и функции
- •Упражнения и тесты
- •Обработка матрицы по столбцам.
- •Список реКоМендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 2
§ 3. Типы алгоритмов
Ввиду многообразия задач по рассматриваемой теме сделана попытка классификации некоторых матричных задач. Объявление, определение и вывод матрицы A[n][m], описанные в предыдущих параграфах, опускаем.
3.1. Построчная обработка
К такому типу относятся задачи, в которых для каждой строки матрицы требуется найти её некоторый параметр. Таким параметром может быть, например, сумма, количество всех элементов строки или элементов с некоторым условием, наименьший (наибольший) элемент среди всех или части элементов строки и т. д. К этому классу можно отнести и задачи типа “есть ли нуль в строке матрицы?”. Их особенность в том, что не обязательно надо анализировать все элементы строки.
В таких программах внешний цикл строится по номеру строки, а в одном или нескольких внутренних циклах обрабатывается строка как одномерный массив. При этом полученные характеристики строк можно запоминать в одномерном массиве размерности n или выводить сразу по мере получения.
Например, пусть задана матрица A[n][m], в которой Aij — оценка i–го студента на j–м экзамене.
Пример 7. Cформируем массив S[n], каждый элемент которого содержит средний балл одного студента:
float S[n], Sum;
for (int i=0; i<n; i++)
{ Sum=0; for ( int j=0; j<m;) Sum+=A[i][j++];
S[i]=Sum/m;
}
Здесь важно обратить внимание на следующее:
оператор Sum=0;должен располагаться между операторами for, так как для каждой строки суммирование необходимо начинать с начала;
важны также расстановка фигурных скобок и место оператора S[i]=Sum/m; Он должен выполняться n раз и поэтому располагается внутри внешнего, но вне внутреннего цикла. В качестве упражнения предлагается рассмотреть другие, в том числе неправильные, варианты расстановки фигурных скобок;
массив S имеет размерность n, и индекс его элемента i, а не j, т. е. совпадает с номером строки, c параметром внешнего цикла;
массив S и переменная Sum должны объявляться с типом float. Если объявить их как int, то в массиве сохранится результат целочисленного деления без дробной части. Например, при делении 37/5 вместо 7.4 получили бы целое число 7. Недостаточно объявить только массив как float, оставив int Sum. Это проблему типов данных можно решить и так: float S[n]; int Sum; … S[i]=(float)Sum/m; Здесь при вычислении выражения переменная Sum временно приводится (преобразуется) к вещественному типу. При этом в других операциях и перед и после этого присваивания она остаётся целочисленной.
Обработка матрицы по столбцам
Пример 8. Задана матрица A[n][m], в которой Aij — оценка i–го студента на j–м экзамене. Найдём и сразу выведем, не формируя массив, количество плохих оценок по каждому предмету, т. е. в каждом столбце.
int K, i ;
for (int j=0; j<m; j++)
{ for (K=0, i =0; i <n; i ++)
if (A[i][j]==1 || A[i][j]==2 || A[i][j]==3) K++ ;
printf(“ \n%d column %d“ , j, K);
}
Особенность таких задач в том, что внешний цикл строим по номеру столбца, то есть по второму правому индексу. Во внутреннем цикле, изменяя первый левый индекс, обрабатываем столбец как одномерный массив. Как и в задачах предыдущего типа, важна правильная расстановка фигурных скобок и место операторов K=0; и printf. Каждый из них выполняется m раз, то есть для каждого столбца.
Поскольку матрицы располагаются в памяти по строкам, то элементы столбца находятся не рядом, а на определённом удалении друг от друга. Поэтому обработка по столбцам малоэффективна с точки зрения времени выполнения программ. Такую обработку желательно избегать.
