Алгоритмизация и программирование. Учебное пособие для студентов направления подготовки 09.03.02 Информационные системы и технологии
.pdf
Рис 69. Программный код задачи 20
Результаты реализации программы:
– для $ = 5 (рис. 70)
Рис 70. Результат решения задачи 20 для n=5
– для $ = 10 (рис. 71)
Рис 71. Результат решения задачи 20 для n=10
При реализации данной программы можно заметить, что на самом деле функция rand генерирует псевдослучайные числа. То есть числа, которые кажутся случайными, но на самом деле имеют вполне определенные значения и повторный вызов функции rand элементы массива не изменяет.
Для получения случайного числа необходимо использовать функцию srand из стандартной библиотеки, которая получает целый аргумент unsigned, и при каждом использовании функции rand она будет умножать его на переданное число. Чтобы не вводить каждый раз начальное число, используют показания часов.
91
srand ((unsigned)time(NULL)); // автоматически считывает показания часов в качестве начального числа
Функция time возвращает текущее время, выраженное в секундах. Данное значение преобразуется в беззнаковое целое число и используется как начальное значение в ГСЧ.
При использовании функции srand обязательно добавлять в заголовочный файл библиотеки #include <time.h>.
Для достижения желаемого результата случайности вызывать функцию srand необходимо один раз. Иначе это приводит к снижению эффективности программы.
Для предыдущего примера получим массив случайных чисел с помощью ГСЧ с использованием функции srand. Приведем только часть программы, в которой будут изменения
– подключение библиотеки #include <time.h> и обращении к функции srand. Остальные действия останутся неизменными.
Задача 21. Создайте массив случайных чисел с помощью ГСЧ и напечатайте его. Математическая модель и описание алгоритма решения. Пользователю предлагается
указать размер массива $, после чего программа генерирует случайные элементы массива заданного размера. Тело программы совпадает с задачей 20, за исключением некоторых моментов (см. ниже).
Текст программы к задаче 21.
------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<math.h>
# include <time.h>
int main ()
{
srand((unsigned) time(NULL)); int A[100], n, i;
………………………………………………………..
………………………………………………………..
return 0;
}
------------------------------------------------------------------------------------------------
В компиляторе языка С++ этот компьютерный код представлен на рис. 72.
92
Рис 72. Программный код задачи 21
Результаты реализации программы:
– для $ = 5 (рис. 73)
Рис 73. Результат решения задачи 21 для n=5
– для $ = 10 (рис. 74)
Рис 74. Результат решения задачи 21 для n=10
Обратите внимание, значения элементов массива теперь действительно случайные и не повторяются.
93
§ 4. Пример решения задач с массивами.
Задача 22. Найдите длину массива и сумму его элементов: {500, 800, 200, 300, 700, 500, 600, 250}.
Математическая модель и описание алгоритма решения. Программа описывает поиск длины массива и суммы его элементов. Массив задан в условии, пользователю не нужно ничего вводить.
Текст программы к задаче 22.
------------------------------------------------------------------------------------------------
#include <iostream> using namespace std;
int main ()
{
int sum = 0;
int salaries[] = { 500, 800, 200, 300, 700, 500, 600, 250 }; int length = sizeof(salaries) / sizeof(salaries[0]);
for (int i = 0; i < length; i++)
{
sum += salaries[i];
}
cout << " Sum of array elements: " << sum << "\n"; cout << " Array length: " << length << "\n";
}
------------------------------------------------------------------------------------------------
В компиляторе языка С++ этот компьютерный код представлен на рис. 75.
Рис 75. Программный код задачи 22
94
Результаты реализации программы на рис. 76:
Рис 76. Результат решения задачи 22
Задача 23. Найдите минимальное и максимальное значения в массиве {1, 2, 32, 40, 100, 2, 33, 5, 6, 213, 7, 9, 2, -1}.
Математическая модель и описание алгоритма решения. Программа описывает поиск минимального значения в массиве. Массив задан в условии, пользователю не нужно ничего вводить.
Текст программы к задаче 23.
------------------------------------------------------------------------------------------------
#include <iostream> using namespace std;
int main ()
{
int nums[] = { 1, 2, 32, 40, 100, 2, 33, 5, 6, 213, 7, 9, 2, -1 }; int min = nums[0], max = nums[0];
int length = sizeof(nums) / sizeof(nums[0]); for(int i = 0; i < length; i++)
{
if(nums[i] < min)
{
min = nums[i];
}
if(nums[i] > max)
{
max = nums[i];
}
}
cout << " Minimum value: " << min;
cout << "\n Maximum value: " << max << "\n";
}
------------------------------------------------------------------------------------------------
95
В компиляторе языка С++ этот компьютерный код представлен на рис. 77.
Рис 77. Программный код задачи 23
Результаты реализации программы на рис. 78:
Рис 78. Результат решения задачи 23
Задача 24. Установите взаимное соответствие между элементами массивов имен работников и их зарплат:
{"Anton", "Igor", "Boris", "Artyom"} и {100, 200, 300, 350}.
Математическая модель и описание алгоритма решения. Программа описывает установление взаимного соответствия между двумя массивами. Оба массива заданы в условии, пользователю не нужно ничего вводить.
96
Текст программы к задаче 24.
------------------------------------------------------------------------------------------------
#include <iostream> using namespace std;
int main ()
{
string names[] = { "Anton", "Igor", "Boris", "Artyom" }; int salaries[] = { 100, 200, 300, 350 };
string name; int index = -1; int salary;
cout << " Enter your name: "; cin >> name;
int length = sizeof(salaries) / sizeof(salaries[0]); for(int i = 0; i < length; i++)
{
if (names[i] == name)
{
salary = salaries[i]; index = i;
break;
}
}
cout << " Hello, " << name << "!\n Your ID in the system: "; cout << index << "\n Your salary: " << salary << " rubles \n";
}
------------------------------------------------------------------------------------------------
В компиляторе языка С++ этот компьютерный код представлен на рис. 79.
97
Рис 79. Программный код задачи 24
Результаты реализации программы на рис. 80:
Рис 80. Результат решения задачи 24
98
Глава 8. ФУНКЦИИ
§ 1. Функции: определение и структура.
Решая любую сложную задачу, можно разбить её на более мелкие подзадачи. Составление алгоритма решения таких задач включает использование вспомогательных алгоритмов или подпрограмм. Главное преимущество подпрограмм – обращение к ним возможно многократно число раз из любого места основной программы, что облегчает написание кода программы.
Вязыке программирования С++ такие подпрограммы называют функцией – совокупность объявлений и операторов, предназначенных для решения определенной подзадачи.
Каждая функция должна иметь имя, по которому её объявляют, определяют и вызывают в программе. Как минимум с одной функцией мы всегда встречаемся в языках программирования С/С++, это главная функция main(). При запуске она вызывается автоматически и в каком месте она бы не находилась, именно с неё начинается выполнение программы.
Всвою очередь функция main() может вызывать другие функции. Различают стандартные и программируемые пользователем функции.
Работа с функциями состоит в трех этапах:
1. Определение – описание действий, которые выполняет функция.
2. Объявление – задание формы обращения к функции.
3. Вызов функции в программе.
Рассмотрим подробнее каждый этап работы с функцией.
Вопределение функции входит заголовок и тело функции.
Заголовок содержит информацию о типе результата, имя функции, список формальных параметров, их количество и порядок следования. Тело функции задает вспомогательный алгоритм с использованием внутренних локальных переменных.
Структура определения функции:
[<тип_результата>] <имя_функции> ([<список_формальных_параметров>])
{
<тело_функции>
}
Имя функции – это произвольный идентификатор, несовпадающий со служебными словами и именами других объектов программы.
Список формальных параметров представляет собой последовательность объявлений формальных параметров <обозначение_типа> <имя_параметра>, разделенная запятыми.
99
§ 2. Формальные и фактические параметры функции.
Формальные параметры – это переменные, которые используются внутри тела функции; они получают значения при вызове функции в программе. При этом им присваиваются значения фактических параметров – соответствующих аргументов функции: переменных, констант, выражений.
Указывать имена формальных параметров не обязательно, достаточно указать их тип.
Пример. Приведем несколько функций:
1)double Sum(double x, double y, double z); // возвращает значение типа double, имеет три параметра
2)int Prod(int, int); // возвращает значение типа int, имеет два параметра
3)void Mod(int z); // возвращает значение типа void, имеет один параметр
4)Vect(); // возвращает значение типа int, не имеет параметров
Все переменные, которые объявлены в теле функции без указания класса памяти, являются локальными и имеют класс памяти auto. При выходе из функции значения этих переменных теряются.
Результатом функции является временная переменная, которая может возвращаться функцией и использоваться в том месте программы, где было к ней обращение.
§ 3. Способы передачи параметров функции.
Важным оператором в теле функции является оператор возврата функции в место её вызова:
return [<выражение>];
Если функция не возвращает никакое значение, то <выражение> в return отсутствует. Для каждой функции задается тип возвращаемого значения. Если он явно не опреде-
лен, то по умолчанию считается тип возврата int.
Функция может содержать несколько операторов return, а может не содержать ни одного. После выполнения оператора return программа переходит к следующему оператору после функции, и команды тела функции больше не выполняются. Если в функции явно не написан оператор return, то компилятор автоматически считает, что return находится в конце тела функции перед закрывающейся фигурной скобкой.
100
