В примере 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