- •Н. А. Аленский основы программирования
- •§ 1. Структура простой программы. Ввод, вывод
- •1.1. Пример первой программы
- •1.2. Директива препроцессора #include
- •1.3. Структура программы
- •1.4. Комментарии
- •1.5. Ключевые слова и идентификаторы
- •1.6. Простой ввод, вывод
- •§ 2. Оператор if
- •2.1. Полная форма
- •2.2. Сокращённая форма
- •2.3. Особенности оператора
- •Задачи и упражнения
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Особенности операции присваивания
- •3.5. Тернарная операция (?)
- •Задачи и упражнения
- •§ 4. Оператор выбора switch
- •Задачи и упражнения
- •§ 5. Операторы цикла
- •5.1. Оператор while c предусловием
- •Правила использования и особенности оператора while
- •5.2. Оператор цикла do … while c постусловием
- •5.3. Оператор for
- •5.4. Операторы continue и break
- •Задачи и упражнения
- •§ 6. Введение в одномерные массивы
- •6.1. Что такое массив. Объявление одномерного массива
- •6.2. Способы определения массивов
- •6.3. Вывод одномерного массива. Функции printf и сprintf
- •6.4. Некоторые типы простых задач при работе с массивами
- •Задачи и упражнения
- •§ 1. Функции без результатов. Передача параметров по значению
- •1.1. Примеры. Правила оформления и вызова функций
- •Void line2(int Len, y, char ch) // ошибка,
- •1.2. Формальные и фактические параметры
- •1.3. Передача параметров по значению
- •§ 2. Функции типа void с несколькими результатами
- •2.1. Пример
- •2.2. Что такое ссылочный тип
- •2.3. Возврат значений из функции с помощью ссылочного типа
- •Задачи и упражнения
- •§ 3. Функции с одним результатом. Оператор return
- •Задачи и упражнения
- •§ 4. Одномерные массивы в функциях. Сортировка массива
- •Задачи и упражнения.
- •§ 5. Область действия имён. Локальные и глобальные имена
- •§ 6. Дополнительные возможности функций
- •Встраиваемые функции (inlineфункции)
- •6.2. Параметры по умолчанию
- •6.3. Перегрузка функций
- •§ 1. Примеры
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Задачи и упражнения.
- •Глава 4 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •1.2. Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •Задачи и упражнения.
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •Глава 5 матрицы (двухмерные массивы) § 1. Объявление, способы определения
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов на обработку матриц
- •3.1. Построчная обработка
- •3.2. Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •3.5. Преобразование матрицы
- •Упражнения.
- •3.6. Построение матриц
- •§ 4. Передача матрицы в качестве параметра функции
- •Задачи и упражнения.
- •Б. Обработка матрицы по столбцам.
- •Даны две матрицы a и b одинаковой размерности. Построить матрицу с, каждый элемент которой определяется по правилу:
- •Список рекомендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Задачи и упражнения …….……………………………………...12
- •3.1. Константы ………………………………………………...…14
3.3. Обработка всей матрицы
К такому типу отнесём задачи, в которых выполняется анализ матрицы не отдельно для каждой строки или столбца, а для всей матрицы в целом. В таких алгоритмах можно обрабатывать её как по строкам, так и по столбцам. Но так как элементы матрицы располагаются в памяти по строкам, то более правильно организовать внешний цикл по номеру строки, а внутренний — по номеру столбца.
Найдём наибольший элемент во всей матрице и номер строки и столбца, на пересечении которых он находится:
int MyMax, Imax, Jmax;
MyMax=A[0][0]; Imax=Jmax=0;
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
if ( A[i][j]>MyMax)
{ MyMax= A[i][j];
Imax=i;
Jmax=j; }
textcolor(10);
cprintf(" \n\r Max element= %d in %d row, %d column", MyMax,Imax, Jmax);
Обратим внимание, что операторы MyMax=A[0][0]; Imax=Jmax=0; располагаются вне всех циклов, так как мы находим общий наибольший элемент, т. е. одно число, а не для каждой строки или столбца отдельно. По этой же причине сprintf выполняется один раз. Поэтому фигурные скобки расставлены по–другому, не так, как в задачах первых двух типов. Заметим, что при “цветном” выводе с помощью cprintf для перехода в начало следующей строки недостаточно одного управляющего символа ‘\n’, а надо использовать и символ ‘\r’.
Упражнения.
1. Если наибольший элемент повторяется несколько раз, индексы какого из них мы найдём?
-
Что надо изменить, чтобы наибольший элемент и его номер находились для каждой строки и выводились по мере получения?
3.4. Обработка части матрицы
Есть задачи, в которых требуется обработать элементы главной или побочной диагонали квадратной матрицы, объявленной, например, так: const n=5; int A[n][n]; Структура циклов останется такой же, как при решении аналогичной задачи для одномерного массива. Например, для нахождения среднего значения главной диагонали необязательно писать два следующих вложенных цикла:
float Sum=0;
for (int i=0; i<n; i++)
for (int j=0; j< n; j++)
if ( i==j)Sum+=A[i][j];
Sum/=n;
Так как для элементов главной диагонали оба индекса одинаковы, то это можно выполнить компактнее с помощью одного цикла:
float Sum=0;
for (int i=0; i<n; i++)
Sum+=A[i][i];
Sum/=n;
Сравните с задачей нахождения этого же параметра в одномерном массиве.
Для обработки побочной диагонали, как и при решении некоторых других типов задач, необходимо найти зависимость второго индекса от первого. Легко видеть, что сумма индексов равна n-1. Поэтому второй индекс будет равен n-1-i, и соответствующая часть программы будет такой:
float Sum=0;
for (int i=0; i<n; i++)
Sum+=A[i][ n-1-i];
Sum/=n;
Верхний треугольник квадратной матрицы относительно главной диагонали — это те элементы, у которых i<j, если главная диагональ не включается, или i<=j, если включается. Аналогично определяется нижний треугольник относительно главной диагонали и треугольники относительно побочной диагонали.
Для обработки таких треугольников необходимо определить, как изменяются индексы. Анализируя, например, верхний треугольник, можно видеть, что в нулевой строке j изменяется от 0 до n-1, в первой строке — от 1 до n-1, во второй строке — от 2 до n-1 и так далее. Значит, в произвольной i-й строке индекс j изменяется от i до n-1. Поэтому, например, подсчёт количества нулевых элементов верхнего треугольника, включая и главную диагональ, будет выглядеть следующим образом:
int K0=0;
for (int i=0; i<n; i++)
for (int j=i; j< n; j++)
if (A[i][j] ==0) K0++;
Если диагональные элементы не надо анализировать, то заголовок внутреннего цикла будет таким:
for (int j=i+1; j< n; j++)…
Упражнение. Эту же задачу решить для нижнего (верхнего) треугольника относительно побочной диагонали.