- •О.Л. Викентьева, А.Н. Гусин, O.A. Полякова
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
- •1. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- •10.1. Базовые конструкции структурного программирования
- •10.3. Составные операторы
- •10.4. Операторы выбора
- •10.5. Операторы циклов
- •10.6. Операторы перехода
- •11. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ С ИСПОЛЬЗОВАНИЕМ ОСНОВНЫХ ОПЕРАТОРОВ C++
- •11.2. Программирование арифметических циклов
- •11.3. Программирование итерационных циклов
- •11.4. Программирование вложенных циклов
- •12. МАССИВЫ
- •12.1. Определение массива в C/C++
- •12.2. Примеры решения задач с использованием массивов
- •13. УКАЗАТЕЛИ
- •13.1. Понятие указателя
- •13.2. Динамическая память
- •13.3. Операции с указателями
- •14. ССЫЛКИ
- •15.3. Динамические массивы
- •СИМВОЛЬНАЯ ИНФОРМАЦИЯ И СТРОКИ
- •16.1. Представление символьной информации
- •16.2. Библиотечные функции для работы со строками
- •16.3. Примеры решения задач с использованием строк
- •17. ФУНКЦИИ В C++
- •17.1. Объявление и определение функций
- •17.2. Прототип функции
- •17.3. Параметры функции
- •17.4. Локальные и глобальные переменные
- •17.5. Функции и массивы
- •17.5.1. Передача одномерных массивов как параметров функции
- •17.5.2. Передача строк в качестве параметров функций
- •17.5.3. Передача многомерных массивов в функцию
- •17.6. Функции с начальными значениями параметров (по умолчанию)
- •17.7. Подставляемые (inline) функции
- •17.8. Функции с переменным числом параметров
- •17.9. Рекурсия
- •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. Создание списка из п элементов
- •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.1. Проектирование программы
- •21.2. Кодирование и документирование программы
- •СПИСОК ЛИТЕРАТУРЫ
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
s t r u c t |
|
|
|
|
|
{ |
|
|
|
|
|
i n t |
a : 10; |
//д л и н а |
п оля |
10 |
бит |
i n t |
b :1 4 ; |
//д л и н а |
поля |
14 |
бит |
} хх , *рхх;
х х . а = 1; рхх = &хх;
рхх->Ь = 8;
Битовые поля могут быть любого целого типа. Они используют ся для плотной упаковки данных. Например, с их помощью удобно реализовать флажки типа «да» / «нет».
Особенностью битовых полей является то, что нельзя получить их адрес. Размещение битовых полей в памяти зависит от компилято ра и аппаратуры.
18.3.3. Объединения
Объединение (u n io n ) - это частный случай структуры. Все поля
объединения располагаются по одному и тому же адресу. Длина объе динения равна наибольшей из длин его полей. В каждый момент вре мени в такой переменной может храниться только одно значение. Объ единения применяют для экономии памяти, если известно, что более одного поля не потребуется. Также объединение обеспечивает доступ
к одному участку памяти с помощью переменных разного типа, |
|
||
u n io n |
|
|
|
{ |
|
|
|
c h a r |
|
s [1 0 ]; |
|
i n t |
x; |
|
|
} u l ; |
|
|
|
0 |
1 |
2 | 3 |
9 |
х - занимает 2 байта |
|
||
s - занимает 10 байтов |
|
Рис. 14. Расположение объединения в памяти
И s, и х располагаются на одном участке памяти (рис. 14). Размер такого объединения будет равен 10 байтам.
//использование объединений
enum paytype{CARD,CHECK}; //тип оплаты struct
{
/*поле, которое определяет, с каким полем объ единения будет выполняться работа*/
paytype ptype; union
{
c h a r c a r d [2 5 ]; lo n g c h e c k ;
};
} info;
switch (infо .ptype)
{
case CARD:cout«"\nOrLnaTa по карте: "«info, card; break;
case CHECK:со и « < "\п О п л ата чеком: " « i n f o , check; b reak ;
}
19. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
Во многих задачах требуется использовать данные, у которых конфигурация, размеры и состав могут меняться в процессе выпол нения программы. Для их представления используют динамические информационные структуры. К таким структурам относят:
-линейные списки;
-стеки;
-очереди;
-бинарные деревья.
Они отличаются способом связи отдельных элементов и допус тимыми операциями. Динамическая структура может занимать не смежные участки динамической памяти.
Наиболее простой динамической структурой является линейный однонаправленный список, элементами которого служат объекты структурного типа (рис. 15).
Beg - начало списка
Рис. 15. Линейный однонаправленный список
Описание простейшего элемента такого списка выглядит сле дующим образом:
struct имя_типа
{
информационное поле;
адресное поле;
}; - информационное поле - это поле любого, ранее объявленного
или стандартного, типа; - адресное поле - это указатель на объект того же типа, что
и определяемая структура, в него записывается адрес следующего элемента списка.
Информационных полей может быть несколько.
//пример 1 |
|
|
|
struct |
point |
|
|
{ |
|
|
поле |
int key; //информационное |
|||
point* |
next; |
//адресное |
поле |
}; |
|
|
|
//пример 2 |
|
|
|
struct |
person |
|
|
{ |
|
//информационное поле |
|
char* name; |
|||
int age; //информационное |
поле |
||
person* |
next; |
//адресное |
поле |
};
Каждый элемент списка содержит ключ, который идентифици рует этот элемент. Ключ обычно бывает либо целым числом (при мер 1), либо строкой (пример 2).
Над списками можно выполнять следующие операции:
-начальное формирование списка (создание первого элемента);
-добавление элемента в конец списка;
-добавление элемента в начало списка;
-поиск элемента с заданным ключом;
-удаление элемента с заданным ключом;
-удаление элемента с заданным номером;
-добавление элемента с заданным номером и т.д.
Рассмотрим основные операции над списком из примера 1.
19.1. Создание элемента списка
Каждый элемент списка содержит как минимум два поля: ин формационное и адресное. Для создания одного элемента необходи мо выделить под него память и заполнить поля элемента. Значение адресного поля можно ввести с клавиатуры, в адресное поле записать нулевое значение.
#include <iostream.h>
//описание структуры
struct point
{