Вы находитесь на странице: 1из 21

Алгоритмы и структуры данных Теоретические сведения

Этапы разработки программного продукта


Процесс разработки программы или программного обеспечения можно разделить на
следующие этапы, называемые жизненным циклом программы:

 Постановка задачи
 Выбор метода решения поставленной задачи
 Детализация модели - для каждой отдельной функции разрабатывается
последовательность выполняемых действий, т.е. алгоритмы.
 Определение структуры данных
 Разработка алгоритма
 Кодирование алгоритма на каком-либо языке программирования
 Отладка программы
 Тестирование
 Поддержка и развитие программы
 Старение

Любой из этапов имеет важное значение для программы. Изучаемый курс посвящен
изучению алгоритмов и структур данных.

1. Этап определения структур данных

Виды данных

До реализации задачи необходимо определить такие понятия как исходные и


результирующие данные, а также выясняется - каким образом из исходных данных могут
быть получены результирующие.
Исходные данные должны быть полными, т.е. содержать данные, необходимые и
достаточные для решения задачи. Если данные неполные, необходимо приложить
дополнительные усилия для сбора дополнительных сведений, т.к. эта ситуация может также
возникнуть на последующих этапах при выборе метода решения.

По отношению к процессу решения исходные данные делят на три вида:


Постоянные исходные данные - это данные, которые сохраняют свои значения в
процессе решения задачи (математические константы, координаты неподвижных объектов) и
не зависят от внешних факторов.
Условно-постоянные данные - это данные, которые могут иногда изменять свои
значения; причем эти изменения не зависят от процесса решения задачи, а определяются
внешними факторами (величина подоходного налога, курс валют, количество дней в году).
Переменные данные - это данные, которые изменяют свои значения в процессе
решения задачи.

На этом этапе важно не только классифицировать данные по отношению к процессу


решения, но определить их наименование, тип, структуру и ограничения, накладываемые на
их значения. Желательно также определить допустимые и недопустимые операции по
отношению к различным типам исходных данных.

По структуре данные можно также поделить на отдельные группы:

1
Алгоритмы и структуры данных Теоретические сведения

Классификация данных по структурному признаку

Простые Структурированные

Нечисловые Числовые Однородные Неоднородные

Данное относят к простому типу, если в любой момент времени оно определяет
одно и только одно значение. Диапазон изменения возможных значений определяется типом
данных. Например, требуется вычислить площадь поверхности некоторого тела. Очевидно,
что для представления информации о вычисляемой площади поверхности некоторого тела
достаточно использовать данное простого числового типа. Простые данные определяют
такое отношение: одно имя - одно значение.
Структурированные данные отличаются от простых тем, что к ним применимо другое
отношение: одно имя - много значений. Если все элементы, входящие в такую структуру,
однотипны, то такая структура называется однородной, в противном случае - неоднородной.
Классическим примером однородной структуры является массив, являющийся
последовательностью однотипных значений, таких как, например, (2, 51, 3, 7, 88).
Неоднородная структура в отличие от однородной содержит значения различных типов,
относящихся к одному понятию или объекту, и, значит, такое структурированное данное
несет в себе больше информации. Для представления неоднородных структур используют
запись. Запись - это структура, предназначенная для представления данных различного типа.
Запись состоит из поименованных полей, каждое из которых должно содержать значение
определенного типа.

После того, как выявлены необходимые данные для задачи и определена их


структура, необходимо задать тип каждому данному.

Понятие типа

Тип данного позволяет решить следующие вопросы:

1. Размещение данных в памяти.


2. Контроль за выполняемыми действиями над данными.

Тип данных - это совокупность следующих характеристик:


а) Диапазон значений, которые могут принимать данные этого типа;
б) Объем памяти, необходимый для хранения;
в) Перечень операторов;
г) Внутренний формат представления данного.

Во многих языках программирования принята следующая классификация типов:

2
Алгоритмы и структуры данных Теоретические сведения

Простые типы данных

Тип данного Описание Операции Диапазоны Объем


значений памяти
Целочисленные Целые числа, разделенные на Все арифметические 0…256 1,2,4 байт
диапазоны: короткие целые, операции -32768...32767 (соответственно
целые и длинные целые -231...+231 диапазону)
Вещественные Дробные (действительные) 10-99...1099 от 4,6 байт
числа, которые в зависимости от
количества чисел в дробной части
делятся на вещественные с
одинарной или двойной
точностью.
символьный Один символ Сцепление значения 1 байт
кодовой таблицы
ASCII
булевский Логические данные: истина или Отрицание NOT 0 - true 1 бит
ложь Конъюнкция AND 1 – false
Дизъюнкция OR

Структурированные типы данных

Типы Описание Операции Объем


данных памяти
Строки Последовательность символов, Допустимые над от 0 до 255 байт
заключенная в «». символами

Массивы Упорядоченная совокупность


однотипных элементов.
Математические прообразы – векторы и
матрицы.
Рассчитывается,
Множества Набор объектов, взаимосвязанных по
исходя из
какому либо признаку или группе Определяются
количества
признаков. типом
элементов
Каждый объект называется элементом элементов
(полей) и их
множества.
типов
Записи Структурированный тип данных,
состоящий из фиксированного числа
компонентов одного или нескольких
типов.

Операции, выполняемые над данными

Набор выполняемых операций над данным определяется его типом.


В зависимости от видов операндов и от вида полученного результата операции делятся на 3
группы:
Операции

Арифметические Операции сравнения Логические


(отношения)

3
Алгоритмы и структуры данных Теоретические сведения

Арифметические операции
Знак Название Программная запись
- 1) Указание операции отрицания (изменение - (х)
знака) х-у
2) Бинарная операция вычитания
+ Сложение Х+у
* Умножение Х*у
/ Деление, результат которого всегда вещественное Х/у 7 / 3=2,3333
число
Div Целочисленное деление, результат которого целое Х div у 7 div 3= 2
число, т.к. дробная часть отбрасывается
Mod Определение остатка от целочисленного деления X mod y 7 mod
(дробная часть) 3=0,333
^ Возведение в степень Х ^ 2 = х2

Операции сравнения
Знак Назначение Программная запись
операции
= равенство X = y x = 12
< меньше X < y x > 12
> больше X > y x > 12
<> неравенство Х  у x <>y x><y
<= Меньше или равно X <=4 x  4
>= Больше или равно Y >= x yx
Результатом таких операций может быть одно из двух возможных логических
значений:
1.True = истина = да, внутри ЭВМ хранится как 1 (единица)
2.False = ложь = нет, о

Условия вида в программе оформляются (х > = 5) и (х < = 10) , как 2 отдельных


оператора сравнения связанные между собой специальной логической операцией.

Логические операторы
Знак Назначение Программная запись
Not Логическое отрицание Not (х = у)
Табл. Истинности
not (1) = 0
not (0) = 1
Or Логическое "или" (логическое сложение) (х < 0) or (x<>y)
Таблица истинности:
1 or 1=1
1 or 0=1
0 or 1=1
0 or 0=0
And Логические "и" (x<10) and (x>5)
Таблица истинности:
1 and 1=1
1 and 0=0
0 and 0=0
0 and 1=0
4
Алгоритмы и структуры данных Теоретические сведения

2. Этап разработки алгоритмов

Понятие, свойства и способы описания


Слово «алгоритм» появилось в 9-м веке и связано с именем математика Аль-
Хорезми, который сформулировал правила выполнения четырех арифметических действий
над многозначными числами.
В настоящее время понятие алгоритма - одно из фундаментальных понятий науки
информатика. С одной стороны алгоритм является предметом изучения такой отрасли
математики как теория алгоритмов, с другой стороны в информатике существует
неформальное определение алгоритма, и алгоритмизация выступает в качестве общего
метода информатики.

Алгоритм – это точно определенная последовательность действий для некоторого


исполнителя, выполняемых по строго определенным правилам и приводящих через
некоторое количество шагов к решению задачи.

Основными особенностями любого алгоритма являются решение задачи в


обобщенном виде и возможность выполнять действия по решению задачи для конкретных
значений (не только человеку, но и различным техническим устройствам (исполнителям)).
Основным исполнителем несложных алгоритмов является человек. Достаточно вспомнить
последовательность действий для решения систем линейных уравнений, вычисления корней
уравнений.
При решении сложных задач исполнителем является ЭВМ и составление алгоритма
решения задачи является необходимым этапом, детализирующим метод решения для
дальнейшего программирования. Программа осуществляет еще более глубокую детализацию
решения и его визуализацию.

В общем случае алгоритм можно сформировать следующими способами:

 Описать словесно (устно)


 Описать в виде текста – пошаговая запись
 Оформить в виде рисунка – графическое представление

Очевидно, что последний способ наиболее нагляден и имеет минимальное количество


вероятных ошибок. Поэтому при создании программного продукта используется
графический способ, при котором алгоритм представляется в виде блок-схемы.

Правильно построенный алгоритм должен обладать следующими свойствами:

 Конечность (дискретность) - алгоритм должен быть разбит на отдельные шаги,


количество шагов не должно быть бесконечным.
 Определенность – каждый шаг должен пониматься исполнителем однозначно.
 Результативность – алгоритм должен приводить к результату, иногда к
отрицательному (невозможность решения по определенным причинам).
 Массовость - алгоритм должен работать для любого набора исходных данных, т.е по
одному и тому же алгоритму решаются однотипные задачи и неоднократно.

5
Алгоритмы и структуры данных Теоретические сведения

Правила построения блок-схем

Алгоритм в виде блок-схемы формируется по правилам, определенным ГОСТ 19.002-80


(Заменен на ГОСТ 19.701-90 (ИСО 5807-85)):
1) Алгоритм представляет собой совокупность блоков. Блок – определенная геометрическая
фигура.
2) Вид блока определяет вид выполняемого действия. Допустимые формы блоков
установлены ГОСТ 19.003-80. Содержимое блока определяет данные, над которыми
выполняется действие.
3) Блоки соединяются линиями управления, задающей очередность выполнения блоков
(линии управления).
4) По умолчанию блоки выполняются сверху вниз и слева направо, в противном случае на
линии указания [  ].
5) В блок-схеме должен быть только один блок начала и один блок окончания.
6) Для более детального пояснения действий в алгоритме можно использовать ремарки.
7) Для больших алгоритмов можно строить разрывы. Разрывы нумеруются.

Рассмотрим наиболее часто используемые блоки:

Название Вид Примечание


Пуск / Остановка Начало, конец, останов, вход
и выход

Ввод / Вывод Блок ввода или вывода.


Допустимы любые
устройства.
Ввод Только ввод с клавиатуры.
Указанному данному
присваивается введенное
значение
Вывод Вывод на монитор или печать
результатов

Действие Вычислительное действие


или последовательность
действий

Предопределенны Вычисление по стандартной


й процесс подпрограмме или
подпрограмме пользователя

Условие Проверка условия, в


(решение) результате может быть
только одно из двух решений
(истина или ложь)
Счетчик повтора Организует повторение от
(модификатор) заданного начального
значения до заданного
конечного с некоторым шагом
Соединитель Оформляет разрывы в

6
Алгоритмы и структуры данных Теоретические сведения

алгоритме

Ремарки Поясняющий текст


(примечание) --------[

Базовые алгоритмические структуры

Основными особенностями любого алгоритма являются решение задачи в


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

Начало Линейные алгоритмы

Линейный алгоритм предполагают выполнение


Ввод X,Y последовательности действий строго по одной линии и только
один раз.

Z = X+Y Например: Рассчитать и вывести на экран сумму, разность и


C = X-Y произведение двух чисел Х и У, введенных с клавиатуры.
D = X*Y
Линейные алгоритмы не содержат блока условия. Они
предназначены для представления линейных процессов. Такие
Вывод алгоритмы применяют для описания обобщенного решения
Z,C,D задачи в виде последовательности модулей.

Разветвления
Конец
Разветвление предполагает оформление в алгоритме
нескольких альтернативных путей решения. Выбор пути решения зависит от проверки
некоторого условия. Различают следующие виды ветвлений:

Разветвления

нормальное усечённое с вложением


(стандартное) (неполное)

+(Да) -(Нет) +(Да) -(Нет) +(Да) -(Нет)


Усл.
Усл. Усл.1

Да
Усл.
2

7
Алгоритмы и структуры данных Теоретические сведения

Как видно из примера разветвленные алгоритмы в своем составе содержат блок условия.
Каждый блок условия характеризуется одним входом и двумя выходами:
 Условие выполняется – «истина» – «да» – «+»
 Условие не выполняется – «ложь» - «нет» - «-»

Пример: Определить максимальное из трех чисел А, В, С, введенных с клавиатуры.

НАЧАЛО

Ввод A,B,C

+
A<=B и A<=C

Вывод A
+
С<=B

Вывод C

Вывод B

КОНЕЦ

Циклы

Циклические алгоритмы являются наиболее распространенным видом алгоритмов, в


них предусматривается повторное выполнение определенного набора действий при
выполнении некоторого условия. Такое повторное выполнение часто называют циклом.
Существуют два основных видов циклических алгоритмов: циклы с известным
количеством повторений и циклы с неизвестным количеством повторений. Если до цикла
известно количество повторений, достаточно сформировать счетчик повторений. Если же
количество повторений определяется уже внутри цикла, то для выхода из цикла
использовать условие. Различают циклические алгоритмы с предусловием, циклические
алгоритмы с постусловием. Они отличаются друг от друга местоположением условия
выхода их цикла.
Цикл с предусловием начинается с проверки условия выхода из цикла. Это логическое
выражение, например I<=6. Если оно истинно, то выполняются те действия, которые должны
повторяться. В противном случае, если логическое выражение I<=6 ложно, то этот цикл
прекращает свои действия.
Цикл с постусловием функционирует иначе. Сначала выполняется один раз те
действия, которые подлежат повторению, затем проверяется логическое выражение ,
определяющее условие выхода из цикла, например, I>6 .Проверка его осуществляется тоже
по-другому. Если условие выхода истинно, то цикл с постусловием прекращает свою
8
Алгоритмы и структуры данных Теоретические сведения

работу, в противном случае - происходит повторение действий, указанных в цикле.


Повторяющиеся действия в цикле
называются "телом цикла".

Циклы

С известным количеством С неизвестным количеством


повторений повторений

i от нач. до
кон. с шагом С предусловием с постусловием
1
нет
Усл.

да

Да
Усл.
нет

9
Алгоритмы и структуры данных Теоретические сведения

Переменная цикла I изменяется от Количество повторов определяет условие.


заданного начального значения до Пока оно истинно, цикл повторяется. В теле
заданного конечного значения с цикла обязательно должно присутствовать
определенным шагом. По мере этого действие, которое изменит результат проверки
процесса происходит повторение условия. В противном случае цикл может
действий стать бесконечным.

10
Алгоритмы и структуры данных Теоретические сведения

11
Алгоритмы и структуры данных Теоретические сведения

Пример. Пусть требуется составить алгоритм вычисления суммы ряда S=x+x^2+x^3+…


+x^n.
Исходные данные для алгоритма это переменные X и N. На каждом шаге будем вычислять
очередной элемент суммы Y и прибавлять его к предыдущему значению суммы S. Для этого
используем формулу вычисления Y=ХK, где K изменяется от 1 до n и равно количеству
элементов ряда. Начальное значение суммы ряда S равно 0.
Данную задачу можно решить любым циклом. Реализуем задачу более сложным алгоритмом
– циклом с предусловием.

НАЧАЛО

Ввод x, N

S:=0

Y:=x

K:=1

+
K<=N

Y:=Xk

S:=S+Y
Вывод S
K:=K+1

КОНЕЦ

12
Алгоритмы и структуры данных Теоретические сведения

13
Алгоритмы и структуры данных Теоретические сведения

3. Обработка одномерных массивов

Понятие массива и его характеристики

Под структурой данных типа массив понимают однородную структуру однотипных


данных, одновременно хранящихся в последовательных ячейках оперативной памяти. Эта
структура должна иметь имя и определять заданное количество данных (элементов).
Однотипность данных определяет возможность использования циклических алгоритмов для
обработки всех элементов массива. Количество итераций (повторений) цикла определяется
количеством элементов массива. Одновременное хранение в памяти всех элементов массива
позволяет решать большой набор задач, таких как, поиск элементов, упорядочение и
изменение порядка следования элементов.
Доступ к любому элементу массива осуществляется по его номеру (индексу).
Поэтому для обращения к элементу массива используют имя_массива (номер элемента),
например, А(5).
Массив называется одномерным, если для получения доступа к его элементам
достаточно одной индексной переменной.
Массив называется многомерным, если для получения доступа к его элементам
необходимо указать несколько индексов.

Например:
1) одномерный массив: ряд чисел, записанный последовательно:
5 5 4 4 5 5 4 4 7
n1 n2 n3 n4 n5 n6 n7 n8 n9

2) Двухмерный массив – таблица, каждый элемент которой задался указанием номера


столбца и строки.

Заполнение массива элементами

Числовой массив можно заполнить одним из следующих способов:


 ввести значения элементов с клавиатуры
 рассчитать значение каждого элемента по заданной формуле
 заполнит алгоритм случайными числами, используя стандартную подпрограмму
генерации случайных чисел RND или Random.

Например: Заполнить одномерный массив 20 числами, введенными с клавиатуры:

14
Алгоритмы и структуры данных Теоретические сведения

Начало

I=1 до 20 с
шагом 1

Ввод
А(i)

конец

Вывод на экран всех элементов массива

Очевидно, что вывод массива на экран можно производить таким же алгоритмом, что и в
предыдущем примере, но вместо ввода использовать блок вывода.

Суммирование элементов одномерного массива

Пример. Просуммировать все элементы одномерного массива T из 30 целых чисел

Начало

S: =Ø

I : = 1 to 30

S : = S + t (i)

Конец

Поиск заданного элемента

Пример. Определить минимальный элемент массива Т из 30 целых чисел

15
Алгоритмы и структуры данных Теоретические сведения

Начало

Min = t (1)

I = 2 до 30

Да
t(i) > Min

Min: = t (i)

Min

Конец

Сортировка элементов массива


Под сортировкой понимают процесс перестановки объектов данного массива в
определенном порядке. Различают сортировку по возрастанию и сортировку по убыванию.
Целью сортировки являются упорядочение массивов для облегчения последующего поиска
элементов в данном массиве. Существует множество методов сортировки массивов,
различающихся скоростью сортировки. Рассмотрим наиболее простые способы сортировки
одномерных массивов на примере сортировки по возрастанию.

Сортировка методом простого выбора

Этот метод основывается на алгоритме поиска минимального элемента. В массиве


А(1..n) отыскивается минимальный элемент, который ставится на первое место. Для того,
чтобы не потерять элемент , стоящий на первом месте , этот элемент устанавливается на
место минимального. Затем в усеченной последовательности, исключая первый элемент,
отыскивается минимальный элемент и ставится на второе место и так далее n-1 раз (n-1
проходов по массиву) пока не встанет на свое место предпоследний n-1 элемент массива А,
сдвинув максимальный элемент в самый конец.
Рассмотрим схему перемещения элементов массива на примере массива из 8 целых чисел:

16
Алгоритмы и структуры данных Теоретические сведения

В таблице красным цветом выделен минимальный элемент, а серым цветом –


просматриваемая часть массива.

Обобщенный алгоритм сортировки массива методом простого выбора можно представить


следующим образом:

Сортировка последовательным методом

17
Алгоритмы и структуры данных Теоретические сведения

Этот метод также предполагает перемещение минимального элемента на первое место


в массиве, но другим способом: в массиве А(1..n) первый элемент по очереди сравнивается с
остальными элементами массива. При необходимости элементы меняются местами. В
результате на первом месте оказывается минимальный элемент. Оставшаяся часть массива
рассматривается как усеченный массив и процесс повторяется вновь до тех пор пока в
массиве не останется один элемент.
Рассмотрим схему перемещения элементов массива на примере массива из 8 целых чисел:

В таблице красным цветом выделен минимальный элемент, а серым цветом –


просматриваемая часть массива.

Обобщенный алгоритм сортировки массива методом простого выбора можно представить


следующим образом:

18
Алгоритмы и структуры данных Теоретические сведения

Сортировка элементов массива методом обмена (методом пузырька)

Метод пузырька заключается в том, что по очереди сравниваются 2 стоящих рядом


элементов массива. Если они соответствуют заданному условию (например, и так
упорядочены), то их оставляют без изменения и переходят к следующей паре элементов. Как
и в методе прямого выбора, необходимо повторять сравнения до конца массива, постепенно
сдвигая наименьший элемент в начало массива («поднимаются как пузырьки»). Наибольший
элемент после прохода по массиву передвинется в конец массива (упадет «как камень»). В
последующем проходе последний элемент не учитывается. А весь процесс повторяется до
тех пора пока в массиве не останется один элемент.

Рассмотрим схему перемещения элементов массива на примере массива из 8 целых чисел:

19
Алгоритмы и структуры данных Теоретические сведения

В таблице красным цветом выделен максимальный элемент, а серым цветом –


просматриваемая часть массива.
Обобщенный алгоритм сортировки массива методом простого выбора можно представить
следующим образом:

Сортировка элементов массива методом вставки (прямого включения)

Такой метод широко используется при игре в карты. Идея метода: по очереди из массива
извлекается один элемент и переставляется в нужное место массива. Очевидно, что
алгоритм сортировки в общем виде модно отобразить так:

 выбрать элемент из массива (по очереди)


 найти место, в которое его необходимо переставить
 переместить элемент

20
Алгоритмы и структуры данных Теоретические сведения

Рассмотрим пример процесса сортировки с помощью массива из 8 целых чисел.

В таблице красным цветом выделен элемент, для которого производится поиск места, а
серым цветом – передвигаемая часть массива.
Как видно из примера, при поиске места рассматривается только левая часть массива (от
текущего элемента).

Очевидно, что при построении алгоритма для сортировок по убыванию необходимо вместо
минимального элемента осуществлять поиск максимального и т.д.

21