
- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
П.3.2. Программирование линейных и разветвляющихся процессов
Линейным называется процесс, в котором каждое составляющее его действие имеет только одного возможного преемника, не зависящего ни от исходных данных, ни от промежуточных результатов.
Представление линейного процесса производится с помощью только структур СЛЕДОВАНИЕ. Любой вычислительный процесс может быть представлен линейным. Это определяется степенью детализации этапов процесса. Чаще всего представление процесса линейным используется на начальных стадиях разработки программ в целях выделения основных этапов вычислительного процесса.
Так, укрупненный алгоритм установления междугородного телефонного соединения может быть описан с помощью структурограммы, представленной на рис. П.3.4.
Рис. П.3.4. Алгоритм международной автоматической связи
Линейность алгоритма устанавления соединения объясняется лишь отсутствием детализазации процесса коммутации. Детализация алгоритма приведет уже на начальном ее этапе к включению в него символа РАЗВЕТВЛЕНИЕ, определяющего в зависимости от состояния линии «свободно-занято» – ввод кода города либо повторный набор индекса соединений.
Таким образом, алгоритм сразу перестает быть линейным.
Вычислительный процесс называется разветвляющимся, если у некоторых действий, составляющих процесс, имеется два или более возможных преемников, причем выбор действия для продолжения осуществляется по значениям исходных данных или промежуточных результатов.
Для программирования по выбору ветвей процесса используется базовая структура РАЗВЕТВЛЕНИЕ. Разветвление на два пути реализуется одной базовой структурой, а на три и более путей - совокупностью базовых структур, вложенных одна в другую. Их число должно быть на единицу меньше числа возможных ветвей процесса.
В качестве примера изобразим структурограмму (рис. П.3.5) вычисления некоторой функции
Рис. П.3.5. Структурограмма вложенного ветвления
В случае если число точек ветвления достаточно велико (больше трех) и условия ветвления могут быть записаны не в виде неравенств, определяющих принадлежность аргумента тому или иному диапазону, а в виде точно определенных значений, целесообразно использовать в программировании конструкцию CASE.
Для иллюстрации программирования в случае большого числа точек ветвления построим структурограммы вычисления функции
сначала с использованием структуры РАЗВЕТВЛЕНИЕ (рис. П.3.6, а), а затем конструкции CASE (рис. П.3.6, б).
Рис. П.3.6. Структурограмма ветвления с большой степенью вложенности с использованием структур: а – РАЗВЕТВЛЕНИЯ, б – конструкции CASE
Сравнение двух структурограмм показывает, что использование конструкции CASE в случае точного определения значений селектора, задающего условия ветвления, явно предпочтительней.
П.3.3. Программирование циклических процессов
Вычислительный процесс называется циклическим, если некоторые действия, составляющие процесс, повторяются многократно при однократном выполнении всего процесса, объемлющего этот цикл.
Число повторений цикла может быть либо известно заранее, либо неизвестно. Циклы с известным количеством повторений принято называть арифметическими (цикл с параметром), а с неизвестным – итерационными.
В арифметических циклах вводится специальная переменная, называемая счетчиком цикла, и задаются ее начальное и конечное значения. После каждого выполнения тела цикла значение счетчика изменяется на единицу, и выход из цикла осуществляется после достижения счетчиком его конечного значения.
В итерационных циклах на каждом шаге вычислений происходят последовательное приближение и проверка условия достижения искомого результата. Выход из цикла осуществляется в случае выполнения заданного условия. Например, вычисление суммы членов ряда с некоторой заранее заданной точностью ε. При этом на каждом шаге в сумму добавляется очередной член ряда, и суммирование производится до тех пор, пока значение этого члена не станет меньше ε.
В итерационных алгоритмах необходимо обеспечить обязательное достижение условия выхода из цикла (сходимость итерационного процесса). В противном случае произойдет бесконечное зацикливание алгоритма, приводящее к потере его результативности.
По структуре циклы делятся на простые и вложенные. В первом случае внутри цикла не содержится других циклов. Во втором случае внутри тела одного цикла повторяется некоторая последовательность операторов, образующая внутренний цикл. Глубина вложения циклов может быть различной.
Программирование вложенных циклов начинается с самого внешнего в порядке убывания их вложенности. В тело внешнего цикла включается внутренний цикл, в которой может включаться еще один цикл, по отношению к которому предыдущий внутренний цикл становится уже внешним и так далее.
Управление условием своего окончания осуществляется каждым вложенным циклом самостоятельно и не должно иметь связи ни с внутренним, ни с внешним по отношению к нему циклом.
Проверка окончания циклов начинается с самого внутреннего и идет в порядке возрастания их вложенности.
При изменении значения параметра (счетчика) внешнего цикла необходимо восстанавливать значения параметров внутренних циклов.
Проиллюстрируем программирование циклических алгоритмов рядом примеров.