Алгоритмические основы информатики. Учебное пособие
.pdf
МИНИСТЕРСТВОНАУКИИВЫСШЕГООБРАЗОВАНИЯ РОССИЙСКОЙФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕОБРАЗОВАТЕЛЬНОЕУЧРЕЖДЕНИЕ ВЫСШЕГООБРАЗОВАНИЯ «КАБАРДИНО-БАЛКАРСКИЙГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТим.Х.М.БЕРБЕКОВА»
Е. К. Эдгулова, Т. Ю. Хаширова, Ф. Х. Дзамихова
АЛГОРИТМИЧЕСКИЕ ОСНОВЫ ИНФОРМАТИКИ
Учебное пособие
Рекомендовано Редакционно-издательским советом КБГУ в качестве учебного пособия для обучающихся по направлению подготовки 09.03.01 Информатика
и вычислительная техника
Нальчик
КБГУ
2024
УДК 004:378.14.015.62 (075.8) ББК 32.81 я73
Э18
Рецензенты:
Институт информатики и проблем регионального управления Кабардино-Балкарского научного центра Российской академии наук
кандидат физико-математических наук, доцент кафедрыалгебры, анализа и методики преподавания математики Факультета математики, физики и информационных технологий Калмыцкого государственного университета им. Б.Б. Городовикова
Е.О. Басангова
Авторы:ЭдгуловаЕ.К.,ХашироваТ.Ю.,Дзамихова Ф.Х.
Э18 Эдгулова Е. К. Алгоритмические основы информатики: учебное пособие / Е. К. Эдгулова, Т. Ю. Хаширова, Ф. Х. Дзамихова ; Министерство науки и высшего образования Российской Федерации, Кабардино-Балкарский государственный университет им. Х.М. Бербекова. – Нальчик : Каб.-Балк. ун-т, 2024. – 108 с. – Библиогр. : с.105–107.– 50 экз.– Текст : непосредственный.
В издании представлен раздел курса «Алгоритмические основы информатики», изложенного по принципу «от простого к сложному», от задачи – к задаче. Необходимые теоретические сведения по С/С++ приводятся последовательно в соответствии срассматриваемыми темами.
Предназначено для студентов, обучающихся по направлению подготовки «Информатика и вычислительная техника», а также для всех интересующихся алгоритмизацией и программированием.
УДК 004:378.14.015.62 (075.8) ББК 32.81 я73
ЭдгуловаЕ.К.,ХашироваТ.Ю., ДзамиховаФ.Х., 2024
2
СОДЕРЖАНИЕ
ВВЕДЕНИЕ ………………………………………………………… 4
РАЗДЕЛ 1. Рандомизация данных ……………………………….. 5 РАЗДЕЛ 2. Базовые алгоритмы обработки чисел ……………….. 9
2.1.Использование в алгоритмах обработки натуральных чисел операций целочисленного деления ………………………………. 9
2.2.Алгоритмы нахождения делителей натурального числа …... 15
2.3.Алгоритмы обработки «именных» натуральных чисел ……. 18
2.4.Алгоритмы анализа числовых последовательностей ………. 31
2.5. Реализация алгоритмов с неизвестным числом повторений 37
2.6.Алгоритмы обработки элементов одномерного массива …... 48
2.7.Алгоритмы обработки элементов двумерного массива ……. 70 РАЗДЕЛ 3. Рекурсивные алгоритмы ……………………………... 93 РАЗДЕЛ 4. Нестандартная обработка чисел …………………….. 98
ЗАКЛЮЧЕНИЕ ……………………………………………………. 105
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА ……………………………. 106
3
ВВЕДЕНИЕ
В процессе многолетнего преподавания информатики у авторов сложилось убеждение, что для закрепления знаний, полученных на лекциях, студентам необходимо подробно разбирать типовые задачи в рамках практических занятий и выполнять индивидуальные задания по каждой теме. Несмотря на то, что сегодня существует большое количество литературы, содержащей задачи по алгоритмизации и программированию, авторы пособия, основываясь на собственном опыте проведения занятий по курсам «Информатика», «Алгоритмические основы информатики», «ЭВМ и программирование», «Алгоритмы и структуры данных», «Языки программирования» и «Практикум по программированию» для студентов УГС 09.00.00 Информатика и вычислительная техника сформировали перечень задач и упражнений, а также набор типовых алгоритмов. Часть приведенных задач и примеров заимствована из хорошо зарекомендовавших себя источников.
Данное пособие предназначено для студентов направлений подготовки 09.03.01 Информатика и вычислительная техника очной формы обучения. Кроме дисциплин «Алгоритмические основы информатики» является одной из основополагающих в процессе реализации указанных образовательных программ, учебными планами предусмотрено изучение дисциплин «Алгоритмы и структуры данных», «Технологии и методы программирования», «Численные методы», «Практикум по программированию», «Системы программирования», «Специальные главы информатики», «Имитационное моделирование сложных систем». Изучение этих и ряда других учебных дисциплин требует получения профессиональных навыков алгоритмизации, что возможно при успешном освоении курса «Алгоритмическиеосновыинформатики».
В учебном пособии представлен раздел курса «Алгоритмические основы информатики», изложенного по принципу «от простого к сложному», от задачи – к задаче. Необходимые теоретические сведения по С/С++ приводятся последовательно в соответствии с рассматриваемыми темами. Цель учебного пособия – систематизировать, закрепить и углубить знания теоретического материала; научить студентов приемам разработки алгоритмов по темам выбранного раздела, способствовать овладению навыками и умениями алгоритмизации и программирования задач обработки числовых данных.
Каждый раздел пособия содержит теоретический материал, подробно разобранные примеры разработки алгоритмов решения задач и их реализации на С/С++, контрольные вопросы для самопроверки усвоения материала, также приводится большое число задач для самостоятельного выполнения.
4
РАЗДЕЛ 1 Рандомизация данных
Возможность генерировать случайные числа может быть полезна в определенных видах программ, особенно в играх, программах статистического моделирования и научных симуляторах, которые должны моделировать случайные события. Моделирование случайных событий и процессов чаще всего реализуется с помощью генераторов псевдослучайных чисел.
Генератор псевдослучайных чисел (ГПСЧ или PRNG, pseudorandom number generator) – программа, выполняющая над заданным начальным числом (начальное порождающее значение) математические операции для преобразования его в какое-то другое число (сгенерированное число), «не связанное» с начальным. Постоянно применяя алгоритм к последнему сгенерированному числу, ГПСЧ может генерировать последовательность новых чисел, которые будут казаться случайными, если алгоритм достаточно сложен.
Ввод начального значения генератору случайных чисел выполняется только один раз. Если ввести его более одного раза, результаты будут менее случайными или совсем не случайными.
C (и, как следствие, C++) поставляется со встроенным генератором псевдослучайных чисел. Он реализован как две отдельные функции, которые находятся в заголовке cstdlib:
std::srand() устанавливает начальное порождающее значение в значение, которое передается вызывающей функцией. std::srand() необходимо вызывать только один раз, в начале вашей программы. Обычно это делается в верхней части main().
std::rand() генерирует следующее случайное число в последовательности. Это число будет псевдослучайным целым числом от 0 до RAND_MAX, значение константы в cstdlib, которое обычно установле-
но на 32767.
1. Пример вывода 100 случайных чисел.
#include <iostream>
#include <cstdlib> // для std::rand() и std::srand()
int
main()
{
std::srand(5323);
// устанавливаем начальное порождающее значение 5323
5
// Из-за недостатков некоторых компиляторов нам нужно вы-
звать std::rand()
// один раз здесь, чтобы получить "лучшие" случайные числа. std::rand();
// Вывести 100 случайных чисел
for
(int count{
1
}; count <=
100;
++count)
{
std::cout << std::rand()
<<
'\t';
// Если мы напечатали 5 чисел, начинаем новую строку
if
(count %
5
==
0)
std::cout <<
'\n';
}
return
0;
}
2. Пример генерирования случайного числа с плавающей точкой в заданном диапазоне.
#include <iostream>
#include <stdlib.h> // нужен для вызова функции rand(), srand()
#include <time.h> // нужен для вызова функции time() using namespace std;
//Функция, которая генерирует случайное число с плавающей запятой и указанной точностью
//Функция получает 3 параметра:
//- min - нижний предел;
//- max - верхний предел;
//- precision - точность, количество знаков после комы. double GetRandomNumberFloat(double min, double max, int pre-
cision)
{
// Установить стартовую точку srand(time(NULL));
double value;
//получить случайное число как целое число с порядком precision
value = rand() % (int)pow(10, precision);
//получить вещественное число
value = min + (value / pow(10, precision)) * (max - min);
6
return value;
}
void main()
{
// Использование функции GetRandomNumberFloat() double number;
srand(time(NULL));
// Получить число в диапазоне [0; 2] с точностью 2 знака после запятой
number = GetRandomNumberFloat(0, 2, 2); cout << "number = " << number << endl;
}
Контрольные вопросы
1.Что называется случайным числом?
2.Как сгенерировать случайное число?
3.Что такое псевдослучайное число?
4.Сколько раз задается начальное порождающее значение?
5.Как сгенерировать случайное число с плавающей запятой в указанных пределах
Задачи
Ввод исходных данных осуществить с использованием генератора случайных чисел.
1.Заданы стороны двух треугольников. Определить, будут ли эти треугольники равновеликими, т. е. имеют ли они равные площади.
2.Определить, является ли треугольник со сторонами a, b, с равнобедренным.
3.Определить, является ли треугольник со сторонами a, b, с равносторонним.
4.Подсчитать количество отрицательных чисел среди чисел а, b, с.
5.Подсчитать количество положительных чисел среди чисел а, b, c.
6.Подсчитать количество целых чисел среди чисел a, b, с.
7.Определить, имеется ли среди чисел а, b, с хотя бы одна пара взаимно противоположных чисел.
7
8.Даны два угла треугольника (в градусах). Определить, существует ли треугольник с заданными углами. Если да, то является ли он прямоугольным.
9.Две точки заданы своими координатами. Определить, которая из точек находится ближе к началу координат.
10.Две точки заданы своими координатами. Определить, которая из точек находится дальше от начала координат.
11.Заданы координаты вершин треугольника. Найти его площадь.
12.Ввести два целых числа. Выяснить, являются ли они оба четными или нечетными, либо одно четное, а другое нечетное.
13.Даны целые числа a, b, c. Проверить, выполняются ли неравен-
ства a < b < c.
14.Даны целые числа a, b, c. Удвоить эти числа, если a ≥ b ≥ c,
изаменить их абсолютными значениями, если это не так.
15.Даны два целых числа. Заменить первое число нулем, если оно меньше второго или равно ему, и оставить числа без изменения в противном случае.
16.Даны три целых числа. Выбрать из них те, которые принадлежат интервалу (1, 7).
17.Даны три числа. Определить, являются ли они последовательными членами арифметической прогрессии, и найти ее разность.
8
РАЗДЕЛ 2 Базовые алгоритмы обработки натуральных чисел
В этом разделе приводятся типовые алгоритмы обработки натуральных чисел, однако их число очень велико. Учитывая тот факт, что в одном учебном пособии не представляется возможным рассмотреть все подобные алгоритмы, авторы представили в этом разделе базовые алгоритмы с использованием операций целочисленного деления, нахождения делителей натурального числа, анализа числовых последовательностей, обработки «именных» натуральных чисел, обработки одномерных, двумерных массивов и длинных чисел.
Алгоритмы решения задач обработки числовых последовательностей предполагают анализ последовательности чисел из заданного диапазона, либо последовательности случайных целых чисел, получаемых
спомощью функции rand(n), либо вводимых с клавиатуры. Анализ числа заключается в проверке некоторого условия, которому должно удовлетворять данное число. Если условие выполняется, то осуществляется некоторая обработка числа. Иногда при проверке условия приходится также выполнять циклические действия над числами. Таким образом, для реализации задач по этой теме необходимо использование алгоритмов циклической и разветвляющейся структуры.
Важная составляющая любых программ, а для работы с целыми числами, в особенности, проверка вводимых значений. Она делается при помощи условного оператора в сочетании с оператором безусловного перехода (в простейших случаях), либо в цикле с предусловием (while ()) или постуловием (do … while()). Если используется переменная целого типа проверка «на целость» не нужна: при вводе числа
сдробной частью последняя будет отброшена. Но, тем не менее, проверка требуется для того, чтобы вводимые числа не выходили за пределы указанного диапазона.
2.1.Использование в алгоритмах обработки натуральных чисел операций целочисленного деления
Операция деления (/) применима к операндам арифметического типа. Если оба операнда целочисленные, результат операции округляется до целого числа, в противном случае тип результата определяется правилами преобразования. Операция остатка от деления (%) применяется только к целочисленным операндам. Знак результата зависит от реализации.
9
// Операция % - взятие остатка от деления int a, b;
int c;
a = 3; b = 5;
c = a % b; // c = 3
a = 8; b = 4;
c = a % b; // c = 0
c = 12 % 35; // c = 12
c = 35 % 12; // c = 11
c = -5 % -3; // c = -2
// Операция деления int a, b;
int c; float x;
a = 8; b = 3;
c = a / b; // c = 2
x = a / b; // x = 2.0
x = a / (float)b; // x = 2.666667
x = 17.0 / 3; // x = 5.666667 x = 17 / 3; // x = 5.0
Пример 1. Найдите количество четных цифр данного натурального числа.
Пояснения. Алгоритм обработки цифр заданного натурального числа реализуется с использованием цикла с предусловием. В теле цикла проверяется значение младшей цифры заданного числа (условие проверки определяется постановкой задачи). Если проверяемая цифра удовлетворяет условию задачи, то выполняется инструкция, прописанная в задаче, например, счетчик увеличивается на 1, для выполнения следующей итерации цикла младшая цифра числа отбрасывается. Тело цикла выполняется до тех пор, пока проверяемое число больше нуля.
10
