
- •Конспект лекций по курсу Программирование на языке высокого уровня.
- •Часть I. Структурное программирование
- •Автор: доцент Шустова л.И.
- •Часть II. Структуры данных 16
- •Часть III. Методы сортировки 97
- •Понятие системы программирования
- •Типы и назначение файлов
- •Директива#include
- •Директива #define
- •Директива условной генерации
- •Основы ввода/вывода
- •Вывод данных
- •Ввод данных
- •Определение и использование функций
- •Функция вычисления факториала числа.
- •Функция возведения вещественного числа в целую степень
- •Функция, меняющая местами значения двух параметров
- •Описание массива
- •Пример программы с использованием массива целых чисел
- •Абстрактные структуры данных
- •Определение
- •Базовые структуры данных
- •Очереди и стеки
- •Деревья
- •Внутренние структуры данных
- •Векторы
- •Отображение абстрактных структур данных на внутренние
- •Строка-вектор
- •1. Функция сцепления двух строк.
- •2. Функция поэлементного сравнения двух строк.
- •3. Функция разбиения строки.
- •4. Функция нахождения подстроки в строке.
- •Строка-список
- •1. Сцепление двух строк.
- •2. Поэлементное сравнение двух строк.
- •3. Разбиение строки на несколько частей.
- •4. Функция нахождения подстроки в строке.
- •Стек-вектор
- •Стек-список
- •Очереди
- •Очередь-вектор
- •Очередь-список
- •Деревья
- •Классификация таблиц
- •Способ работы с таблицей
- •Способ доступа к таблице
- •Просматриваемые таблицы
- •Просматриваемая таблица-вектор
- •Статическая просматриваемая таблица-вектор
- •Динамическая просматриваемая таблица-вектор
- •Просматриваемая таблица-список
- •Упорядоченные таблицы
- •Упорядоченная таблица-вектор
- •Динамическая упорядоченная таблица-вектор
- •Перемешанные таблицы
- •Открытое перемешивание
- •Перемешивание сцеплением
- •Деревья поиска
- •Бинарное дерево
- •Многоходовые деревья
- •Структура вершины в-дерева
- •Операция вставки
- •Удаление элемента
- •Перераспределение элементов
- •Сцепление вершин
- •Операция включения
- •Удаление элемента
- •Методы сортировки
- •Введение
- •Классификация методов внутренней сортировки
- •Быстрая сортировка
- •Распределительные сортировки
- •Сортировка поразрядным группированием
- •Сортировка вычислением адреса
Директива#include
Данная директива предназначена для включения на этапе препроцессорной обработки в исходный текст программы других файлов. Директива может быть использована в одном из двух видов:
#include <имя_файла> или
#include ”имя_файла”
Форма записи директивы влияет на то, где препроцессор ищет указанный файл (если файл задан простым именем). Первая форма предписывает искать файл в системных каталогах, заранее известных препроцессору (маршрутное имя каталога задается в опциях настройки системы программирования) и используется для стандартных файлов-заголовков. Если указанный в такой директиве файл не будет найден, выводится сообщение об ошибке. Вторая форма директивы предписывает искать указанный файл в рабочем каталоге и используется для собственных файлов-заголовков. Если в этом случае файл не будет найден, делается попытка найти его в системном каталоге и только после этого, опять же в случае неудачи, выводится сообщение об ошибке. Если файл задан полным маршрутным именем, указанные выше алгоритмы поиска не применяются.
Препроцессор, встретив в тексте программы директиву #include, вставляетвместо нееполный текст указанного файла, после чего продолжает работу с первой строки вставленного файла.
Допускаются вложенные директивы #include. Максимальное количество вложений определяется конкретной системой программирования.
Примеры:
#include <iostream.h>
#include ”mydef.h”
Важно! Пробелы при задании имени файлалюбым способомне допустимы! Если первый пример будет записан в виде: #include < iostream.h >, препроцессор С++ формирует имя файла вместе с окружающими его пробелами и не сможет его найти.
Директива #define
Директива #defineочень широко использовалась в программах на языке С и редко используется в С++ программах, так как язык С++ предлагает другие, более удобные средства, выполняющие те же функции, что и директива#define. Тем не менее, эта директива все еще используется, и мы рассмотрим ее простейшую форму – директиву без параметров (или, другими словами, макроподстановку без параметров), которая часто используется для назначения константе имени:
#define имя_макро [текст]
Например, широко используемая в системных файлах константа NULL, задающая “пустой” указатель, определяется следующим образом:
#define NULL (0L)
Текст, определяющий значение макроподстановки, начинается с первого послеимени_макросимвола, отличного от пробела, и заканчивается концом строки.Любые промежуточные пробелы являются частью текста. Препроцессор, встретив в тексте программы директиву#define, запоминает указанное в нейимя_макро и связанный с нимтекст; затем, продолжая обработку текста программы и встретив в немимя_макро, заменяет его соответствующимтекстом.
Директива условной генерации
При трансляции исходных много файловых С++ программ часто возникают ошибки из-за того, что один и тот же личный файл-заголовок включается в программу неоднократно. Например, в файле f1.cиспользованы директивы#include "var1.h"и#include "mydef.h", а в файлеvar1.hиспользована директива#include "mydef.h"; в результате при компиляции файлаf1.cфайлmydef.hбудет включен в программу дважды, что приведет к появлению синтаксических ошибок. Чтобы устранить такие ошибки, в файлах-заголовках используются специальные директивы условной генерации (#if... - #endif), которые, в частности, препятствуют многократному включению данного файла. Чаще всего с такой целью используется директива #ifndef, с помощью которой файл-заголовок оформляется следующим образом:
#ifndef имя_макро
#define имя_макро
.
. /* содержимое файла-заголовка */
.
#endif
Препроцессор С++, обрабатывая директиву #ifndef, проверяет, определено или нет указанное в нейимя_макро; если оно не определено (if not define), обрабатываются все строки файла, помещенные ниже директивы#ifndefи до директивы#endif. Если жеимя_макроопределено, все строки файла до директивы#endifвключительно пропускаются (и, следовательно, не обрабатываются и не включаются в текст программы).
В качестве имени_макронаиболее удобно использовать имя, построенное на основе имени файла-заголовка; тогда, например, файл-заголовокmydef.hбудет выглядеть следующим образом:
#ifndef _MYDEF_H
#define _MYDEF_H
.
. /* содержимое файла-заголовка */
.
#endif
По такой схеме оформлены все стандартные файлы-заголовки.
Структура С++ программы
Существует хорошее определение программы в соответствии с методологией структурного программирования, данное Н. Виртом:
Программа –это алгоритм плюс данные
Алгоритмы сложных, больших программ следует представлять в виде композиции логически завершенных частей (фрагментов), каждая из которых решает определенную часть общей задачи. В языках программирования для оформления таких фрагментов программ используются подпрограммы и/или функции. В языке С++ логически завершенной единицей обработки информации является функция.
Программа на языке С++, написанная в соответствии со структурной методологией, обычно представляет собой большое количество небольших по размеру функций.
В общем случае структуру любого исходного С++ файла можно представить следующим образом:
Все функции, используемые в С++ программе, являются внешнимии располагаются автономно по отношению друг к другу. Все функции равноправны и могут использоваться в любом месте программы. Особое место занимает только одна функция – функцияmain, с которой начинается выполнение программы; этим и определяется ее особенность. В любой программе должна быть одна (и только одна) функция с именемmain. Где конкретно (в каком файле и/или месте файла) размещается эта функция – значения не имеет.
Все объекты (переменные, массивы, функции и так далее), используемые в программе, должны быть предварительно объявлены.
Объекты, объявленные вне функций, являются глобальнымии могут быть использованы без повторного объявления в любой из ниже размещенных функций.
Объекты, объявленные внутри функции, являются локальнымии определены только внутри данной функции.
Если какие-либо функции используются до их определения (или же определения каких-либо функций размещены в других файлах или используются библиотечные функции), для них должны быть включены соответствующие прототипы. Прототипы библиотечных функций находятся в соответствующих стандартных файлах-заголовках.
Типы данных, используемых в программе. Константы. Правила записи и вычисления выражений. Оператор описания данных. Область видимости и время жизни переменных, классы памяти. Описание и инициализация простых переменных.