Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 2021 / OIT_lek_sem_29_09_2021.docx
Скачиваний:
2
Добавлен:
14.12.2023
Размер:
36 Кб
Скачать

В примере 10 алгоритм сортировки реализован программно.

Пример 10.

#include "stdafx.h"

#include <iostream>

using namespace std;

// основная функция main

void main() {

int x[] = {6,4,9,3,1,2,7,5,8,1};

int i, j, n, t;

n = sizeof(x) / sizeof(x[0]);

for (i = 0; i < n-1; i++) // внешний цикл

for (j = 0; j < n - 1- i; j++) // внутренний цикл

if (x[j] > x[j + 1]) { i=0

t = x[j]; j=0 4,6,9,3,1,2,7,5,8,1

x[j] = x[j + 1]; j=1 4,6,9,3,1,2,7,5,8,1

x[j + 1] = t; j=2 4,6,3,9,1,2,7,5,8,1

} j=3 4,6,3,1,9,2,7,5,8,1

for (i = 0; i < n; i++) j=4 4,6,3,1,2,9,7,5,8,1

cout << x[i] << ' '; j=5 4,6,3,1,2,7,9,5,8,1

}// конец функции main j=6 4,6,3,1,2,7,5,9,8,1

j=7 4,6,3,1,2,7,5,8,9,1

j=8 4,6,3,1,2,7,5,8,1,9

i=1

j=0 4,6,3,1,2,7,5,8,1,9

j=7 4,3,1,2,6,5,7,1,8,9

i=2

j=0…

i=8

1,1,2,3,4,5,6,7,8,9

Функция main начинается с инициализации массива x. Далее вычисляется его размер n. Затем выполняется сортировка во вложенных циклах с управляющими переменными соответственно i и j. Внутренний цикл необходим для сравнения двух элементов: текущего и следующего. Если текущий элемент оказывается больше следующего, тогда их меняют местами с помощью вспомогательной переменной t. Таким образом, после первого прохода внутреннего цикла на последнем месте в массиве окажется наибольший из n элементов – это 9. Чтобы в итоге массив оказался отсортированным, необходим внешний цикл для организации повторов внутреннего цикла. Во втором (при i=1) прогоне цикла j на предпоследнем месте окажется наибольший элемент из оставшихся n-i – это 8 и т.д. При сравнении двух элементов (текущего и следующего) нельзя выйти за объявленную границу размерности массива, поэтому в условии выполнения внутреннего цикла используется n-1 (j<n-1-i;). Внешнему циклу достаточно выполнить n-1 повторов цикла j, потому что при i=8 первый элемент массива с индексом 0 и второй – с индексом 1 уже окажутся упорядоченными.

В примере 11 проиллюстрируем задачу нахождения наименьших элементов каждой строки матрицы x[4,4] и запишем их в массив y[4].

Пример 11.

#include "stdafx.h"

#include <iostream>

using namespace std;

// основная функция main

Void main() {

const int n=4;

int i, j;

float xmin, x[n][n], y[n];

cout << "*****x*****";

cout << "\n";

for (i = 0; i < n; i++) {

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

cout << "x[" << i << "][" << j << "]=";

cin >> x[i][j];

}

cout << "\n";

}// ввод матрицы x с клавиатуры

for (i = 0; i < n; i++) {// внешний цикл

xmin = x[i][0];

for (j = 1; j < n; j++) // внутренний цикл

if (x[i][j] < xmin)

xmin = x[i][j];

// конец внутреннего цикла

y[i] = xmin;

}// конец внешнего цикла

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

cout << y[i] << ' ';

}// конец функции main

Особенность данного алгоритма состоит в том, что при переходе к следующей строке i (внешний цикл) xmin получает своё новое значение – x[i][0] (элемент с индексом 0 в каждой строке). Затем во внутреннем цикле по столбцам j выполняется сравнение текущего элемента в строке x[i][j] c xmin. В итоге переменная xmin получает значение наименьшего элемента в строке. Далее выполняется оператор присваивания (y[i]=xmin;) и формируется вектор решения y[i]. Вывод результирующего массива y осуществляется в цикле.

5. Функции

5.1. Определение функции. Обращение к функции

Функция является основной программной единицей в С++, минимальным исполняемым программным модулем. Всякая программа обязательно включает в себя основную функцию с именем main. Если в тексте программы используются дополнительные функции, то они выполняют роль подпрограмм.

Формат описания функции следующий:

тип имя_функции (спецификация_параметров)

{тело_функции}

Тип функции ‒ это тип возвращаемого функцией результата. Если функция не возвращает никакого результата, то для неё указывается тип void.

Имя функции ‒ идентификатор, задаваемый программистом, или main для основной функции.

Спецификации параметров ‒ это либо "пусто", либо список имён формальных параметров (аргументов) с указанием типа каждого из них. Аргументы это локальные переменные, существующие в теле функции.

Тело функции ‒ это или составной оператор, или блок. Признаком блока является наличие описаний программных объектов (переменных, массивов и т.д.), которые действуют в пределах этого блока. Блок ограничивается фигурными скобками.

Тело функции не может содержать в себе определения других функций. Но из всякой функции возможно обращение к другим функциям. Оператором возврата из функции в точку её вызова является оператор return:

return;

или

return выражение;

В первом случае функция не возвращает никакого значения в качестве своего результата. Во втором случае результатом функции является значение указанного выражения. Тип выражения должен совпадать с типом функции либо относиться к числу типов, допускающих автоматическое преобразование к типу функции.

Формат обращения к функции (вызова функции) традиционный:

имя_функции (список_фактических_параметров)

Между формальными и фактическими параметрами при вызове функции должны соблюдаться правила по последовательности и по типам. Аргументами при обращении к функции могут быть идентификаторы переменных, имеющие конкретные значения, непосредственно числа, арифметические выражения, вызов другой функции с возвращаемым значением.

Для иллюстрации рассмотренных положений обратимся к следующей задаче (пример 12). Требуется составить программу нахождения наибольшего значения из трёх величин ‒ max(a,b,c). Воспользуемся равенством: max(a,b,c)= max(max(a,b),c).

Далее приведём текст программы с последующими комментариями.

Пример 12.

#include "stdafx.h"

#include <iostream>

using namespace std;

// описание вспомогательной функции MAX

int MAX(int x, int y) {

if (x > y) return x;

else return y;

}// конец описания функции MAX

// основная функция main

Соседние файлы в папке Лекции 2021