
- •Курс лекций по дисциплине “Основы программирования и алгоритмические языки” Бондарев в.М., Марченко ю.С. Введение
- •Основы алгоритмизации
- •1 Основные этапы решения задачи на эвм
- •1.1 Постановка задачи
- •1.2 Проектирование программы
- •1.3 Разработка алгоритма
- •1.4 Кодирование
- •1.5 Отладка и тестирование программы
- •2 Элементарные алгоритмические структуры
- •2.1 Последовательная алгоритмическая структура
- •2.2 Алгоритмическая структура выбора
- •2.3 Алгоритмическая структура повторения
- •2.4 Комбинация структур
- •2.5 Пошаговая детализация алгоритма
- •2.6 Разработка алгоритма вычисления Sin X
- •2.7 Разработка алгоритма подсчета простых чисел
- •3 Алгоритмы поиска
- •3.1 Поиск наибольшего среди вводимых чисел
- •3.2 Поиск наибольшего числа в массиве
- •3.3 Поиск заданного числа в массиве
- •3.4 Поиск с порогом
- •3.5 Двоичный поиск
- •4 Алгоритмы сортировки
- •4.1 Обменная сортировка
- •4.2 Сортировка слиянием
- •4.3 Сравнение двух алгоритмов сортировки
- •5 Рекурсивные алгоритмы
- •5.1 Простая рекурсия
- •5.2 Ханойские башни
- •5.3 Быстрая обменная сортировка
- •6.2 Простейшая программа
- •6.3 Составление простой программы
- •6.4 Программа сложение двух чисел
- •6.5 Организация повторений
- •6.6 Условный оператор
- •If (выражение) оператор [else оператор].
- •6.7 Оператор цикла for
- •7 Указатели и массивы
- •7.1 Указатели
- •7.2 Разыменование и разадресация
- •7.3 Операции new и delete
- •7.4 Массивы
- •7.5 Многомерные массивы
- •7.6 Связь между массивами и указателями
- •7.7 Массивы в динамической памяти
- •8 Строки и структуры
- •8.1 Встроенный тип char
- •8.2 Строки символов как массивы
- •8.3 Строковые библиотечные функции
- •8.4 Структуры
- •8.5 Объявление структур
- •8.6 Битовые поля
- •8.7 Объединения
- •9 Функции
- •9.1 Функция для сложения чисел
- •9.2 Ссылки
- •9.3 Выходные параметры функции
- •9.4 Ссылка — возвращаемое значение
- •9.5 Одномерные массивы как параметры
- •9.6 Двумерные массивы как параметры
- •10 Еще о функциях
- •10.1 Параметры по умолчанию
- •10.2 Произвольное число параметров
- •10.3 Неиспользуемые параметры
- •10.4 Перегруженные функции
- •10.5 Указатель на функцию
- •Void error(char* p) { /*тело ф-ции*/} ,
- •10.6 Спецификатор inline
- •Inline void error(char* p) { /*тело ф-ции*/}
- •10.7 Макросы
- •11 Ввод и вывод
- •11.1 Разновидности ввода и вывода
- •11.2 Открытие и закрытие потока
- •11.3 Ввод и вывод символов
- •11.4 Ввод и вывод строк
- •11.5 Ввод и вывод записей
- •11.6 Управление указателем файла
- •11.7 Состояние потока
- •11.8 Форматированный вывод
- •11.9 Форматированный ввод
- •11.10 Другие функции форматного ввода и вывода
- •12 Уточнение понятий языка
- •12.1 Объявление, определение, инициализация
- •12.2 Область видимости и время жизни
- •12.3 Типы
- •12.4 Производные типы
- •12.5 Числовые константы
- •12.6 Именные константы
- •12.7 Перечисление
- •12.8 Порядок вычисления выражений
- •13 Операции и операторы
- •13.1 Сводка операций
- •13.2 Сводка операторов
- •13.3 Оператор выражения
- •13.4 Оператор switch
- •13.5 Операторы break и continue
- •13.6 Оператор goto и метки
- •14 Классы
- •14.1 Определение класса
- •14.2 Инкапсуляция
- •14.3 Конструктор
- •14.4 Деструктор
- •14.5 Пример класса — список в динамической памяти
- •14.6 Указатель на себя
- •15 Производные классы
- •15.1 Простое наследование
- •15.2 Списки инициализации
- •15.3 Ключи доступа
- •15.4 Виртуальные функции
- •15.5 Реализация виртуальных функций
- •15.6 Полиморфизм
- •16 Еще о класcах
- •16.1 Статические элементы
- •16.2 Друзья класса
- •16.3 Перегрузка операций
- •16.4 Множественное наследование
- •17.1 Библиотека потоков
- •17.2 Предопределенные потоки
- •17.3 Операции помещения в поток и извлечения из потока
- •17.4 Форматирующие функции-элементы
- •17.5 Флаги форматирования
- •17.6 Манипуляторы
- •18 Еще о потоках
- •18.1 Ошибки потока
- •18.2 Опрос состояния потока
- •18.3 Файловый ввод-вывод с применением потоков
- •18.4 Конструкторы файловых потоков
- •18.5 Функции для открытия и закрытия файлов
- •18.6 Замена буфера потока
- •18.7 Текстовый и бинарный ввод-вывод
- •18.8 Бесформатный ввод и вывод
- •18.9. Часто применяемые функции потока
- •18.10 Форматирование в памяти
- •18.11 Дополнительные возможности ostrstream
- •19 Шаблоны
- •19.1 Шаблоны функций
- •19.2 Перегрузка и специализация шаблонов
- •19.3 Шаблоны классов
- •20 Директивы препроцесора
- •20.1 Директива #define
- •20.2 Директива #include
- •20.3 Условная компиляция
- •20.4 Директива #error
- •20.5 Директива #line
- •20.6 Директива #pragma
- •21.1 Адресация памяти
- •21.2 Модели памяти
- •21.3 Спецификация указателей
- •Int near* var_name;
- •Int* near var_name;
- •21.4 Макросы для указателей
- •21.5 Модификаторы переменных
- •21.6 Модификаторы функций
- •21.7 Соглашения о вызове
- •21.8 Встроенный код ассемблера
- •21.9 Псевдорегистры
- •Литература
- •Содержание
- •21.8 Встроенный код ассемблера ........................................................
- •21.9 Псевдорегистры ............................................................................
2.5 Пошаговая детализация алгоритма
Теоретически доказано, что трех алгоритмических структур: последовательности, выбора и повторения достаточно, чтобы записать любой алгоритм, который способна выполнить ЭВМ. При этом каждый внутренний оператор любой структуры может быть элементарным оператором или одной из алгоритмических структур. Все это поможет нам ответить на мучительный вопрос, встающий перед каждым начинающим программистом: “С чего начать разработку алгоритма?”.
Во-первых, выбрать подходящую структуру для будущего алгоритма (последовательность, выбор или повторение).
Во-вторых, заняться внутренними операторами выбранной структуры так, как если бы они были самостоятельными алгоритмами, т.е. выбрать структуру, заняться внутренними операторами и т.д.
Углублять разработку следует до тех пор, пока внутренние операторы не окажутся элементарными операторами алгоритмического языка. Изложенный метод называется пошаговой детализацией алгоритма или разработкой алгоритма сверху вниз.
2.6 Разработка алгоритма вычисления Sin X
Перейдем от теории к практике и рассмотрим примеры разработки алгоритмов.
З а д а ч а. Ввести X и подсчитать значение функции Sin X по формуле
Р е ш е н и е.
К
Начало
Ввести X;
Подсчитать сумму SinX;
Вывести сумму SinX на экран.
Конец
Первый и третий пункты алгоритма просты, а второй нуждается в детализации. Чтобы посчитать какую-то сумму, вначале очищают переменную, предназначенную для хранения суммы, а потом, при помощи конструкции повторения, накапливают в ней слагаемое. В данной задаче накопление слагаемых будем продолжать, пока очередное слагаемое не станет достаточно маленьким, т.е. не перестанет заметно изменять сумму (можно математически доказать, что при любом X, начиная с некоторого слагаемого, они будут монотонно убывать).
Начало
Очистить переменную SinX = 0;
Получить первое слагаемое Piece = X;
ПокаPiece > 0.0001повторять
Начало
Прибавить очередное слагаемое к сумме SinX = SinX + Piece;
Вычислить следующее слагаемое Piece;
Конец
Конец
Остается уточнить, каким образом можно вычислить следующее слагаемое. Если присмотреться к формуле в условии задачи, то можно увидеть, что каждое следующее слагаемое получается из предыдущего путем умножения его на (-X*X) и деления на (i-1)*i, где i — число, стоящее под знаком факториала в знаменателе слагаемого. Для краткости назовем его номером слагаемого, хотя тогда слагаемые будут нумероваться только нечетными числами. С учетом такой нумерации слагаемых уточним последний алгоритм.
Начало
Очистить переменную SinX = 0;
Получить первое слагаемое Piece = X;
Установить номер первого слагаемого i = 1;
ПокаPiece > 0.0001повторять
Начало
Прибавить очередное слагаемое к сумме SinX = SinX+Piece;
Определить номер следующего слагаемого i = i+2;
Вычислить следующее слагаемое
Piece = Piece * ( - X * X) / (( i - 1) * i);
Конец
Конец
Окончательно алгоритм приймет следующий вид.
Начало
Ввести X;
Очистить переменную SinX = 0;
Получить первое слагаемое Piece = X;
Установить номер первого слагаемого i = 1;
ПокаPiece > 0.0001повторять
Начало
Прибавить очередное слагаемое к сумме SinX = SinX+Piece;
Определить номер следующего слагаемого i = i+2;
Вычислить следующее слагаемое Piece = Piece * (-X*X) / ((i-1)*i);
Конец
Вывести сумму SinX на экран;
Конец