
- •Оглавление
- •Введение
- •1. Структурное программирование
- •2.1. Общий вид окна
- •2.2. Создание консольного приложения и работа с ним
- •2.3. Компиляция и запуск проекта
- •2.4. Отладка программы
- •2.5. Создание рабочего пространства для нескольких проектов
- •6.5. Типы с плавающей точкой
- •7. Переменные
- •8. Выражения
- •9. Ввод и вывод данных
- •10.1. Базовые конструкции структурного программирования
- •10.2. Оператор «выражение»
- •10.2. Составные операторы
- •10.3. Операторы выбора
- •10.4. Операторы циклов
- •10.5. Операторы перехода
- •11.1. Программирование ветвлений
- •11.2. Программирование арифметических циклов
- •11.3. Программирование итерационных циклов
- •11.4. Программирование вложенных циклов
- •12. Массивы
- •12.2. Примеры решения задач и использованием массивов
- •13. Указатели
- •13.1. Понятие указателя
- •13.2. Динамическая память
- •13.3. Операции с указателями
- •14. Ссылки
- •15. Указатели и массивы
- •15.1. Одномерные массивы и указатели
- •15.2. Многомерные массивы и указатели
- •15.3. Динамические массивы
- •16. Символьная информация и строки
- •16.1. Представление символьной информации
- •16. 2. Библиотечные функции для работы со строками
- •16. 3. Примеры решения задач с использованием строк
- •17.1. Объявление и определение функций
- •17.2. Прототип функции
- •17.3. Параметры функции
- •17.4. Локальные и глобальные переменные
- •17.5 Функции и массивы
- •13.5.1. Передача одномерных массивов как параметров функции
- •13.5.2. Передача строк в качестве параметров функций
- •13.5.3. Передача многомерных массивов в функцию
- •17.6 Функции с начальными значениями параметров (по-умолчанию)
- •17.7. Подставляемые (inline) функции
- •17.8. Функции с переменным числом параметров
- •17.9. Рекурсия
- •17.10 Перегрузка функций
- •17.11. Шаблоны функций
- •17.12. Указатель на функцию
- •17.13. Ссылки на функцию
- •18. Типы данных, определяемые пользователем
- •18.1. Переименование типов
- •18.2. Перечисления
- •18.3. Структуры
- •18.3.1. Работа со структурами
- •18.3.2. Битовые поля
- •18.3.3. Объединения
- •19. Динамические структуры данных
- •19.1. Создание элемента списка
- •19.2. Создание списка из n элементов
- •19. 3. Перебор элементов списка
- •19. 4. Удаление элемента с заданным номером
- •19. 5. Добавление элемента с заданным номером
- •19.6. Двунаправленные списки
- •19. 7. Очереди и стеки
- •19. 8. Бинарные деревья
- •19.9.Обход дерева
- •19.10. Формирование дерева
- •19.11. Удаление элемента из дерева
- •19. 12. Обработка деревьев с помощью рекурсивного обхода
- •20. Препроцессорные средства
- •20.1. Стадии и команды препроцессорной обработки
- •20.2. Директива #define
- •20.3. Включение текстов из файлов
- •20.4. Условная компиляция
- •20.5. Макроподстановки средствами препроцессора
- •21.2. Кодирование и документирование программы
18.3.2. Битовые поля
Битовые поля – это особый вид полей структуры. При описании битового поля указывается его длина в битах (целая положительная константа).
struct
{
int a:10; //длина поля 10 бит
int b:14; //длина поля 14 бит
} xx, *pxx;
…
xx.a = 1;
pxx = &xx;
pxx->b = 8;
Битовые поля могут быть любого целого типа. Они используются для плотной упаковки данных. Например, с их помощью удобно реализовать флажки типа «да» / «нет».
Особенностью битовых полей является то, что нельзя получить их адрес. Размещение битовых полей в памяти зависит от компилятора и аппаратуры.
18.3.3. Объединения
Объединение (union) – это частный случай структуры. Все поля объединения располагаются по одному и тому же адресу. Длина объединения равна наибольшей из длин его полей. В каждый момент времени в такой переменной может храниться только одно значение. Объединения применяют для экономии памяти, если известно, что более одного поля не потребуется. Также объединение обеспечивает доступ к одному участку памяти с помощью переменных разного типа.
union
{
char s[10];
int x;
} u1;
|
|
|
|
|
|
|
|
|
|
0 |
1 |
2 |
3 |
. . . . |
|
|
|
|
9 |
x - занимает 2 байта |
|
|
|
|
|
|
|||
S – занимает 10 байтов |
Рис. 10. Расположение объединения в памяти
И s, и x располагаются на одном участке памяти. Размер такого объединения будет равен 10 байтам.
//использование объединений
enum paytype{CARD,CHECK}; //тип оплаты
struct
{
/*поле, которое определяет, с каким полем объединения будет выполняться работа*/
paytype ptype;
union
{
char card[25];
long check;
};
} info;
switch (info.ptype)
{
case CARD:cout<<”\nОплата по карте:”<<info.card; break;
case CHECK:cout<<”\nОплата чеком:”<<info.check; break;
}
19. Динамические структуры данных
Во многих задачах требуется использовать данные, у которых конфигурация, размеры и состав могут меняться в процессе выполнения программы. Для их представления используют динамические информационные структуры. К таким структурам относят:
линейные списки;
стеки;
очереди;
бинарные деревья;
Они отличаются способом связи отдельных элементов и допустимыми операциями. Динамическая структура может занимать несмежные участки динамической памяти.
Наиболее простой динамической структурой является линейный однонаправленный список, элементами которого служат объекты структурного типа (рис.7).
Рис. 11. Линейный однонаправленный список
Описание простейшего элемента такого списка выглядит следующим образом:
struct имя_типа
{
информационное поле;
адресное поле;
};
информационное поле – это поле любого, ранее объявленного или стандартного, типа;
адресное поле – это указатель на объект того же типа, что и определяемая структура, в него записывается адрес следующего элемента списка.
Информационных полей может быть несколько.
//пример 1
struct point
{
int key; //информационное поле
point* next; //адресное поле
};
//пример 2
struct person
{
char* name; //информационное поле
int age; //информационное поле
person* next; //адресное поле
};
Каждый элемент списка содержит ключ, который идентифицирует этот элемент. Ключ обычно бывает либо целым числом (пример 1), либо строкой (пример 2).
Над списками можно выполнять следующие операции:
начальное формирование списка (создание первого элемента);
добавление элемента в конец списка;
добавление элемента в начало списка;
поиск элемента с заданным ключом;
удаление элемента с заданным ключом;
удаление элемента с заданным номером;
добавление элемента с заданным номером;
и т. д.
Рассмотрим основные операции над списком из примера 1.