Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Технологии программирования. Учебно-методическое пособие для СПО
.pdf
Элемент массива (значение элемента массива) – значение, хранящееся в
определенной ячейке памяти, расположенной в пределах массива, а также адрес
этой ячейки памяти.
Каждый элемент массива характеризуется тремя величинами:
1. Адресом элемента – адресом начальной ячейки памяти, в которой
расположен этот элемент;
2. Индексом элемента (порядковым номером элемента в массиве);
3. Значением элемента.
Адрес массива – адрес начального элемента массива.
Имя массива – идентификатор, используемый для обращения к элементам
массива.
Размер массива – количество элементов массива
Размер элемента – количество байт, занимаемых одним элементом массива.
Длина массива – количество байт, отводимое в памяти для хранения всех
элементов массива.
Общий вид описания массива:
<тип элементов> имяМассива [число элементов];
МАТРИЦА
Матрица – это двумерный массив.
Описание двухмерного массива
Описание матрицы задается структурным типом вида:
<тип элементов><имя> [m][ n] ;
где m – количество строк;
n –количество столбцов матрицы.
По описанию матрицы во внутренней памяти компьютера выделяется
область из тп последовательных ячеек, в которые при работе программы
записываются значения элементов матрицы. Например, по описанию:
float A [3][5];
В памяти компьютера для элементов матрицы выделяется область, состоящая
из 3
5=15 последовательных ячеек вещественного типа. Из описания видно,
что матрица состоит из трех строк и пяти столбцов.
Обращение к отдельным элементам матрицы осуществляется с помощью
переменной с двумя индексами, причем индексы, как и для одномерного
массива начинаются с нуля. Например:
А[i][j] aij;
А[2][3] a23;
А[2*n][k+1] a
2n,k+1
.
11

Ввод-вывод двухмерного массива
654
321
M
Матрицы, как и одномерные массивы, нужно вводить и выводить
поэлементно. Для того, чтобы ускорить процесс ввода данных или итераций
какого-либо действия используются циклы. Каждый элемент матрицы имеет
два индекса., поэтому для работы с ними необходимо использовать два цикла.
Если значениями параметра первого цикла будут номера строк матрицы, то
значениями параметрами второго – столбцы (или наоборот).
Для поэлементного ввода и вывода матрицы чаще используется двойной
цикл for.... Если задать индекс i как параметр внешнего цикла, а индекс j как
параметр внутреннего цикла, то ввод-вывод матрицы осуществляется
построчно.
В стандартном C++ существует два основных пути ввода-вывода
информации: с помощью потоков, реализованных в STL (Standard Template
Library) и посредством традиционной системы ввода-вывода. И потоки,
и традиционная система ввода-вывода для осуществления необходимых
действий используют вызовы операционной системы.
Для традиционного ввода-вывода используется библиотека <stdio.h> или
<cstdio>.
Основные команды традиционного ввода-вывода:
scanf – чтение с клавиатуры, printf – вывод на экран.
fscanf – чтение из файла, fprintf – вывод в файл.
Для поточного ввода – вывода используется библиотека <iostream>.
Основные команды поточного ввода-вывода:
std::cin – чтение с клавиатуры, std::cout – вывод на экран.
Пример 1. Организовать ввод целочисленной матрицы М по строкам.
Описание матрицы вместе с текущими индексами имеет вид:
int main()
{
int М[2][3] ;
int i, j;
Ввод в программе реализуется в форме диалога, т.е. сопровождается
поясняющим сообщением:
printf("Введите матрицу М\n");
12

for( i = 0; i<2; i++)
for( j = 0; j< 3; j++)
scanf("%f",&m[i][ j]);
На клавиатуре желательно для наглядности восприятия набирать элементы
матрицы по строкам, отделяя числа друг от друга одним или несколькими
пробелами:
1 2 3 [Enter]
4 5 6 [Enter]
Пример 2. Организовать вывод матрицы М на экран.
Вывод матрицы необходимо реализовать в удобном для чтения виде, т.е. чтобы
на одной строке экрана располагалась одна строка матрицы. С этой целью в
тело внешнего цикла, помимо внутреннего цикла, включается оператор printf,
который переводит курсор к началу следующей строки экрана после вывода
текущей строки матрицы.
for ( i = 0; i<2; i++)
{
for ( j = 0; j< 3; j++)
printf("%3d ",m[i][j]);
printf("\n");
}
Вид матрицы на экране будет следующим:
1 2 3
4 5 6
Виды матриц
Введем понятие матриц: квадратных, диагональных, единичных и нулевых.
Определение матрицы квадратной: Квадратной матрицей n-го порядка
называется матрица размера n×n.
В случае квадратной матрицы вводятся понятие главной и
побочной диагоналей.
13

Главной диагональю матрицы называется диагональ, идущая из левого
верхнего угла матрицы в правый нижний ее угол.
Побочной диагональю той же матрицы называется диагональ, идущая из
левого нижнего угла в правый верхний угол.
Понятие диагональной матрицы: Диагональной называется квадратная
матрица, у которой все элементы вне главной диагонали равны нулю.
Понятие единичной матрицы: Единичной (обозначается Е иногда I)
называется диагональная матрица с единицами на главной диагонали.
Понятие нулевой матрицы: Нулевой называется матрица, все элементы
которой равны нулю.
Две матрицы А и В называются равными (А=В), если они одинакового размера
(т.е. имеют одинаковое количество строе и одинаковое количество столбцов и
их соответствующие элементы равны). Так, если
то А=B, если a11=b11, a12=b12, a21=b21, a22=b22
Обработка матриц
Базовыми алгоритмами обработки матриц являются те же алгоритмы,
которые используются при обработке одномерных массивов: нахождение
суммы, количества некоторых элементов матрицы; нахождение минимального
и максимального элементов; сортировка отдельных строк или столбцов
матрицы. Однако реализацию этих алгоритмов можно условно рассматривать
для двух типов задач.
14

1. Алгоритмы реализуются при просмотре всех элементов матрицы
(просмотр может быть с условием). Начальная установка искомых
параметров алгоритма выполняется перед двойным циклом. В этом
случае запись операторов цикла для параметров i и j осуществляется
последовательно друг за другом и имеет вид:
<начальная установка искомых параметров>
for (i = 0; i<n; i++)
for (j = 0; j< n; j++)
<тело цикла>;
2. Алгоритмы реализуются внутри каждой строки или каждого столбца
матрицы. В этом случае начальная установка искомых параметров
алгоритма выполняется между операторами цикла, записанными для
параметров i и j. Например, если алгоритм реализуется для каждой
строки, то запись в программе имеет следующий вид:
for ( i = 0; i< m ; i++)
{
<начальная установка искомых параметров>
for ( j = 0; j< n; j++)
<тело цикла>;
}
Некоторые свойства матриц:
если номер строки элемента совпадает с номером столбца , это
означает, что элемент лежит на главной диагонали матрицы;
если номер строки превышает номер столбца , то элемент
находиться ниже главной диагонали;
если номер столбца больше номера строки , то элемент
находиться выше главной диагонали;
элемент лежит на побочной диагонали, если его индексы удовлетворяют
равенству ;
неравенство характерно для элемента, находящегося выше
побочной диагонали;
соответственно, элементу, лежащему ниже побочной диагонали,
соответствует выражение .
15

Варианты заданий:
В соответствии с индивидуальным заданием, номер которого совпадает с
Вашим номером в журнале, разработать алгоритм и программу на языке Си
в стиле структурного программирования
1. Сформировать матрицу В путем вычеркивания строки и столбца
матрицы А, на пересечении которых находится мaксимальный
элемент матрицы А. Определить количество строк, в которых есть
нули и записать в обратном порядке главную диагональ матрицы.
2. Определить, есть ли в матрице нули, и найти среднее
арифметическое элементов матриц. Поменять местами главную и
побочную диагонали.
3. Вывести на экран элементы квадрата из матрицы, в правом нижнем
углу которого расположен максимальный элемент. Определить
среднее арифметическое значение исходной матрицы. Заменить нули
в матрице на скаляр, введенный с клавиатуры.
4. Получить матрицу C[m,k] путем умножения матрицы А[m,n] на
матрицу B[n,k] и определить в результирующей матрице строку с
наибольшим количеством отрицательных элементов. Заменить в
полученной матрице отрицательные элементы на их количество .
5. Элементы тех столбцов матрицы, в которых есть нули, увеличить на
скаляр, равный количеству нулей в соответствующем столбце
матрицы. Поменять местами первый и последний столбец исходной
матрицы.
6. Умножить в матрице квадрат, в правом верхнем углу которого
расположен минимальный элемент, на число, вводимое с
клавиатуры. Определить сумму элементов этого квадрата.
Сформировать из этого квадрата массив.
7. Получить матрицу D[m,n] путем умножения матрицы B[m,k] на
матрицу E[k,n]. Определить в результирующей матрице столбец с
наибольшей суммой отрицательных элементов. Упорядочить этот
столбец по убыванию.
8. Вывести на экран элементы квадрата из матрицы, в правом верхнем
углу которого расположен самый первый ноль. Определить, сколько
всего нулей в исходной матрице, и, если их больше чем количество
строк в матрице, заменить нули на это количество.
9. Найти столбец с максимальным произведением положительных
элементов. Сформировать массив из попарных сумм элементов
главной и побочной диагоналей. Записать в обратном порядке
элементы побочной диагонали.
16

10. Элементы тех строк матрицы, в которых есть отрицательные
элементы увеличить на скаляр, равный размеру матрицы.
Определить строку с максимальным количеством отрицательных
элементов.
11. Разделить в матрице квадрат, в левом верхнем углу которого
расположен минимальный элемент, на число, равное сумме всех
остальных элементов матрицы. Записать в обратном порядке
главную диагональ матрицы.
12. Сформировать матрицу С путем вычеркивания строки и столбца
матрицы А, на пересечении которых находится минимальный
элемент матрицы А. Определить количество нулей в
сформированной матрице.
13. Умножить в матрице квадрат, в левом нижнем углу которого
расположен максимальный элемент, на число, равное количеству
нулевых элементов в побочной диагонали. Заменить все
отрицательные элементы матрицы на их модули.
14. Элементы столбцов матрицы А уменьшить на элемент главной
диагонали соответствующего столбца. Определить количество нулей
в матрице. Побочную диагональ упорядочить по убыванию.
15. Элементы строк матрицы увеличить на средние значения
положительных элементов своих строк. Опередить сумму всех
элементов матрицы. Сформировать массив из элементов,
расположенных выше главной и побочной диагоналей.
16. Сформировать массив В из элементов расположенных выше
главной диагонали матрицы А. Определить, сколько элементов
этого массива меньше среднего значения элементов исходной
матрицы. Упорядочить главную диагональ матрицы.
17. Сформировать массив С из элементов матрицы А, расположенных
ниже побочной диагонали и определить, сколько элементов этого
массива меньше числа, равного сумме минимальных элементов
строк матрицы.
18. Сформировать массив В из максимальных элементов строк
исходной матрицы А. Определить, есть ли в матрице А нули и если
есть, то записать в обратном порядке элементы полученного массива.
19. Элементы строк матрицы увеличить на элементы побочной
диагонали соответствующих строк. Определить строку с
наибольшим количеством отрицательных элементов .
20. Сформировать массив В из попарной суммы элементов главной и
побочной диагоналей исходной матрицы. Определить, сколько
элементов этого массива меньше максимального значения заданной
матрицы.
17

21. Сформировать массив С из элементов расположенных правее
главной диагонали и вычислить сумму тех элементов этого массива,
которые меньше числа, расположенному на пересечении диагоналей
исходной матрицы, если такой есть.
22. Сформировать массив В из элементов матрицы А, расположенных
левее побочной диагоналей, и вычислить произведение тех
элементов этого массива, которые больше числа, расположенного на
пересечении диагоналей исходной матрицы.
23. Определить количество положительных элементов левой верхней
четверти исходной матрицы. Определить сумму положительных
элементов, расположенных под побочной диагональю, и вывести этот
треугольник.
24. Сформировать массив D, содержащий суммы отрицательных
элементов каждого столбца, все элементы полученного массива
возвести в квадрат. Вывести на печать элементы, расположенные
ниже главной диагонали.
18

Занятие № 3
Процедурное программирование
Разработка функций для обработки матриц
Цель работы: Приобрести навыки использования функций, разработанных
пользователем.
Подготовка к практическому занятию
3. Повторить такие элементы языка как: понятие функции, структура
типизированной функции, структура нетипизированной функции, списки
фактических и формальных параметров, вызов функции.
4. В соответствии с заданием разработать алгоритм решения задачи,
описать его в виде схемы и составить программу на языке Си.
Функция – это автономная часть программы, реализующая определенный
алгоритм и допускающая обращение к ней из различных частей главной
программы и из других подпрограмм этой программы, так как каждая функция
по отношению к другим является внешней.
Различают системные (в составе систем программирования) и собственные
функции.
Системные функции хранятся в стандартных библиотеках, и пользователю не
нужно вдаваться в подробности их реализации. Достаточно знать лишь их
сигнатуру. Примером системных функций, используемых ранее, являются
функции printf() и scanf().
Собственные функции — это функции, написанные пользователем для решения
конкретной подзадачи.
Каждая функция в языке Си должна быть определена, то есть должны быть
указаны:
тип возвращаемого значения;
имя функции;
информация о формальных аргументах;
тело функции.
Определение функции имеет следующий синтаксис:
ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)
{
ТелоФункции;
...
return(ВозвращаемоеЗначение);
}
Пример: Функция сложения двух вещественных чисел
float function(float x, float z)
{
float y;
19

y=x+z;
return(y);
}
В указанном примере возвращаемое значение имеет тип float. В качестве
возвращаемого значения в вызывающую функцию передается значение
переменной y. Формальными аргументами являются значения переменных x и
z.
Если функция не возвращает значения, то тип возвращаемого значения для нее
указывается как void. При этом операция return может быть опущена. Если
функция не принимает аргументов, в круглых скобках также указывается void.
Тип, указываемый в заголовке функции, определяет тип результата ее работы,
который будет возвращаться в точку вызова. Если тип не указан, то по
умолчанию подразумевается int (целый). Для возврата значения в теле
функции должен быть оператор return. В дальнейшем будем называть такую
функцию типизированной.
Если функция не должна возвращать результат, то она считается не-
типизированной, что задается ключевым словом void, стоящим в заголовке
на месте типа. В этом случае оператор return в функции не требуется.
С точки зрения вызывающей программы функцию можно представить
как некий «черный ящик», у которого есть несколько входов и один выход. С
точки зрения вызывающей программы неважно, каким образом производится
обработка информации внутри функции. Для корректного использования
функции достаточно знать лишь ее сигнатуру.
Вызов функции
Общий вид вызова функции
Переменная = ИмяФункции(СписокФактическихАргументов);
Фактический аргумент — это величина, которая присваивается
формальному аргументу при вызове функции. Таким образом, формальный
аргумент — это переменная в вызываемой функции, а фактический аргумент —
это конкретное значение, присвоенное этой переменной вызывающей
функцией. Фактический аргумент может быть константой, переменной или
выражением. Если фактический аргумент представлен в виде выражения, то его
значение сначала вычисляется, а затем передается в вызываемую функцию.
Если в функцию требуется передать несколько значений, то они записываются
через запятую. При этом формальные параметры заменяются значениями
фактических параметров в порядке их следования в сигнатуре функции.
Возврат в вызывающую функцию
По окончании выполнения вызываемой функции осуществляется возврат
значения в точку ее вызова. Это значение присваивается переменной, тип
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
