Использование объединений
Допустимы массивы объединений и указатели на объединения. Объединения могут передаваться функции как параметры и возвращаться функцией.
Объединение как элемент структуры
Объединения часто включаются в структуры, один из элементов которых является ключом, указывающим тип хранимого в памяти элемента объединения.
Например:
//содержит информацию о работающих служащих и пенсионерах
struct mail {
char id; // a - active (), r - retired()
union {
struct {
char name[30];
char dept[10];
char location[3];
} active;
struct {
char name[30];
char street[20];
char city_state[3];
char zip[5];
} retired;
} info;
} preson;
Структура типа struct mail используется для хранения почтового адреса работающего служащего или пенсионера. При заполнении структуры этого типа информацией в нее заносится порция данных, соответствующая элементам active или retired объединения info. Поле id устанавливается равным 'a' или 'r' для указания фактически записанного в объединении элемента. При применении объединения используется меньше памяти, чем в случае применения структуры, которая имела бы идентичные поля, но некоторые из них не использовались бы.
Рис. Объединение как элемент структурыПеременные с изменяемой структурой
Очень часто некоторые объекты программы относятся к одному и тому же классу, отличаясь лишь некоторыми деталями. В таких случаях используются переменные с изменяемой структурой. Рассмотрим, например, представление геометрических фигур. Общая информация о фигурах может включать такие элементы, как площадь, периметр. Однако соответствующая информация о геометрических размерах может оказаться различной в зависимости от их формы.
Пример 2. Информация о геометрических фигурах представляется на основе комбинированного использования структуры и объединения.
struct figure {
double area,perimetr; // общие компоненты
int type; // признак компонента
union { // перечисление компонент
double radius; // окружность
double a[2]; // прямоугольник
double b[3]; // треугольник
} geom_fig;
} fig1, fig2;
В общем случае каждый объект типа figure будет состоять из трех компонентов: area, perimetr, type. Компонент type называется меткой активного компонента, так как он используется для указания, какой из компонентов объединения geom_fig является активным в данный момент. Такая структура называется переменной структурой, потому что ее компоненты меняются в зависимости от значения метки активного компонента (значение type). Отметим, что вместо компоненты type типа int, целесообразно было бы использовать перечисляемый тип. Например, такой
enum figure_chess {CIRCLE, BOX, TRIANGLE};
Константы CIRCLE, BOX, TRIANGLE получат значения соответственно равные 0, 1, 2. Переменная type может быть объявлена как имеющая перечислимый тип:
enum figure_chess type;
В этом случае компилятор С++ предупредит программиста о потенциально ошибочных присваиваниях, таких, например, как figure.type = 40;
В общем случае переменная структуры будет состоять из трех частей: набор общих компонент, метки активного компонента и части с меняющимися компонентами. Общая форма переменной структуры, имеет следующий вид:
struct {
ОбщиеКомпоненты; МеткаАктивногоКомпонента;
union {
ОписаниеКомпоненты1;
ОписаниеКомпоненты2;
...................
ОписаниеКомпонентыN;
} ИдентификаторОбъединения;
} ИдентификаторСтруктуры;
Пример 3. Определения переменной структуры с именем helth_record
struct { // общая информация
char name[25]; // имя
int age; // возраст
char sex; // пол
// метка активного компонента(семейное положение)
enum merital_status ins;
// переменная часть
union { // холост
// нет компонент
struct { // состоит в браке
char marripge_date[8];
char spouse_name[25];
int no_children;
} marriage_info;
// разведен */
char date_divorced[8];
} marital_info;
} health_record;
enum marital_status { SINGLE, // холост
MARRIGO, // женат
DIVOREED // разведен
};
Обращаться к компонентам структуры можно при помощи ссылок:
helth_record.nаme
helth_record.ins
helth_record.marriage_info.marriage_date
Задания
1.На основе определения структуры из Примера 2 разработайте программу, которая запрашивает параметры геометрической фигуры и выводит ее периметр и площадь.
2.Разработайте структуру Вклад: Код вкладчика, Тип вклада (Название, Процентная ставка, Расчетный период, Налоговый вычет), Сумма вклада. Введите информацию о трех клиентах и выведите вычисленную итоговую сумму на счету на данный расчетный период.
3.Разработайте структуру, используя объединение: Сотрудник (ФИО, пол, образование, специальность, вуз, должность, стаж). Сотрудник может не иметь высшего образования. Введите информацию о трех сотрудниках и распечатайте в виде таблицы.
Домашние задания
1.Наберите код программы из Примера 1. Выполните компиляцию и запуск программы.
2.На основе определения структуры из Примера 3 разработайте программу, которая запрашивает информацию о трех объектах и выводит ее в виде таблицы.
3. Индивидуальное задание. Номер варианта определяется по журналу. Опишите структуру для моделирования, предложенного понятия. Введите необходимое число записей и выведите результат обработки на экран.
Варианты индивидуального задания
№ | Задание |
1. | Оплата водоснабжения (фамилия квартиросъемщика, улица, дом, корпус, квартира, предыдущее и текущее показания счетчика – по 6 цифр). Определите плату за водоснабжение. Цена 1 кубометра вводится с клавиатуры. |
2. | Бланк требования на книгу (автор, название книги, шифр, название тематического каталога, наличие в библиотеке на данный момент, цена, год выпуска, количество экземпляров). Определите, в каком веке выпущена данная книга и стоимость всех экземпляров. |
3. | Поликлиника (ФИО пациента, № медицинского полиса, пол, дата рождения, диагноз). Определите по полу и дате рождения, является ли пациент пенсионером на данный момент. Считать средний пенсионный возраст женщин 55 лет, мужчин – 60 лет. |
4. | Спринтер (ФИО спортсмена, страна, длина дистанции в метрах, результат в часах, минутах и секундах). Определите, улучшен ли мировой рекорд по данной дистанции и на сколько секунд. |
5. | Координаты точки в пространстве (тройка вещественных чисел). Определите, лежат ли в одной плоскости введенные четыре точки. |
6. | Коммунальные услуги (фамилия квартиросъемщика, улица, дом, корпус, квартира, общая площадь, количество проживающих). Определите, должен ли квартиросъемщик доплачивать за избыточную площадь, и, если да, то сколько. Размер квартплаты, норма метража и процент доплаты вводится с клавиатуры. |
7. | Плоскость (четверка коэффициентов, определяющих общее уравнение плоскости в пространстве). Введите две плоскости и определите их взаимное расположение. |
8. | Экзаменационная ведомость (ФИО студента, номер зачетной книжки, предмет, форма отчетности, номер билета, оценка, дата сдачи). Определите по номеру зачетной книжки, на каком курсе учится студент, если известно, что он сдает летнюю сессию. |
9. | Склад товаров (наименование товара, код товара, цена, количество, страна-производитель, дата выпуска, срок годности в месяцах). Определите годность товара по введенной текущей дате. |
10. | Комплексное число (действительная часть, мнимая часть). Введите два таких числа и операцию над ними (+, –, *, /). Выведите результат операции. |
11. | Шахматная доска (номер столбца, номер строки). Определите, можно ли поставить ферзей на две данные клетки, чтобы они не «били» друг друга. |
12. | Анкета школьника (ФИО школьника, дата рождения, пол, класс, сколько факультативов посещает, объем недельной нагрузки в часах). Определите, не перегружен ли школьник (до 10 лет включительно – не более 30 часов, до 14 лет включительно – не более 34 часов, остальные – не более 36 часов). Каждый факультатив дает дополнительный 1 час в неделю. |
13. | Координаты точки в пространстве (тройка вещественных чисел). Определите, лежит ли данная точка между двумя другими введенными точками. |
14. | Биквадратное уравнение (три коэффициента, определяющие уравнение). Введите два биквадратных уравнения и определите, есть ли у них хотя бы один общий вещественный корень. |
15. | Бухгалтерия (ФИО работника, пол, год рождения, должность, оклад, премия в процентах). Определите, превышает ли суммарная заработная плата работника прожиточный минимум на данный момент. |
16. | Калорийность продукта (наименование, масса в граммах, содержание белков, жиров и углеводов в процентах от общего количества, цена за 1 кг). Определите калорийность и стоимость всего продукта. Калорийность 100 г жиров, белков и углеводов вводятся с клавиатуры. |
17. | Бланк требования на книгу (автор, название книги, шифр, название тематического каталога, наличие в библиотеке на данный момент, цена, год выпуска, количество экземпляров). Определите стоимость всех таких книг. |
18. | Комплексное число (действительная часть, мнимая часть). Введите комплексное число и натуральное число N. Выведите результат извлечения корня степени N из данного комплексного числа. |
19. | Координаты точки в пространстве (тройка вещественных чисел). Определите, образуют ли треугольник введенные три точки. |
20. | Тестирование (ФИО школьника, дата рождения, пол, класс, сколько решено верно заданий из частей А, B, C). Определите суммарный балл за тест по правилу: за каждое задание части А – по 1 баллу, части B – по 2 балла, части C – по 3 балла. Определите оценку из расчета: до 30 баллов включительно – «2», от 31 до 45 – «3», от 46 до 78 – «4», более 78 – «5». |
21. | Оплата электроэнергии (фамилия квартиросъемщика, улица, дом, корпус, квартира, предыдущее и текущее показания электросчетчика – по 4 цифры). Определите плату за электроэнергию. Цена 1 КВт-час вводится с клавиатуры. |
22. | Шар (координаты центра в трехмерном пространстве и радиус). Введите два шара и определите их взаимное расположение. |
23. | Шахматная доска (номер столбца, номер строки). Определите, в какой цвет окрашена данная клетка. |
24. | Астрономический справочник (название звезды, тип, яркость, удаленность от Земли в астрономических единицах (а.е.)). Введите три звезды. Найти звезды данной яркости, находящиеся на данном расстоянии от Земли. |
25. | Таблица Менделеева (название элемента, обозначение, порядковый номер, число протонов, число нейтронов в ядре, масса ядра). Ввести химическую формулу вещества и найти молекулярную массу. (Например, ввод H2SO4; вывод: 98). |
26. | Вектор (тройка вещественных чисел-координат). Введите два вектора и найдите их скалярное произведение и модуль векторного произведения. |
27. | Шахматная доска (номер столбца, номер строки). Определите, лежат ли две данные клетки на одной диагонали. |
28. | Медиатека (название диска, тип диска, объем в мегабайтах, цена, год выпуска). Найтиде цену всех дисков, выпущенных в данный год. |
Дата добавления: 2015-02-16; просмотров: 1124;