§ 16. Тип данных структура (struct)
Сайт: | Профильное обучение |
Курс: | Информатика. 10 класс (Повышенный уровень) |
Книга: | § 16. Тип данных структура (struct) |
Напечатано:: | Гость |
Дата: | Четверг, 28 Ноябрь 2024, 05:43 |
16.1. Описание структур
Примером структуры может послужить любой объект, который определяется набором своих характеристик. Например, точка на плоскости определяется абсциссой и ординатой, дата — днем, месяцем и годом, для книги такими характеристиками могут быть: автор, название, год издания, количество страниц и т. д. Для описания таких объектов на языке программирования С++ используется ключевое слово struct (структура). Структура представляет собой сложный тип данных, составленный из простых типов, позволяющий использовать группу связанных между собой данных как единое целое. Отдельный элемент структуры называют полем. Общая форма объявления структуры: struct имя_типа { тип_1 элемент_1; тип_2 элемент_2; … тип_n элемент_n; }; Описывается структура до функции main. После закрывающей фигурной скобки «}» в объявлении структуры обязательно ставится точка с запятой. В примере 16.1 приведено описание структур. Описание структуры создает новый тип данных. Для того чтобы использовать структуру, нужно описать переменную соответствующего типа (пример 16.2). Инициализировать структуру можно, присвоив ее переменным значения с помощью синтаксиса инициализации (аналогично инициализации массивов): в фигурных скобках передаются значения для элементов структуры в том порядке, в котором они описаны (пример 16.3). Для структур определена единственная операция — присваивание. Все остальные действия при обработке структур происходят с ее полями. Обращение к полю структуры происходит через точку «.» (пример 16.4). С полями структуры можно выполнять все действия, определенные для типа, которым описано поле. В качестве поля структуры может быть использована другая структура. Она должна быть описана до того, как используется (пример 16.5). При использовании структур среда программирования выводит подсказку со списком всех полей структуры после того, как пользователь поставит точку. Имя поля можно выбрать из списка (пример 16.6). Структуры могут передаваться в функции как параметры. Функция может возвращать значение в виде структуры. |
Пример 16.1. Описание структур. Структура для описания точки на плоскости:
Структура для описания даты:
Структура для описания книги:
Структура, описывающая студента, поступившего в ВУЗ по результатам ЦТ:
В данном примере для каждого студента хранится его фамилия (fam), город из которого он приехал (gorod), год рождения (god_r). В векторе otm[1] хранятся три отметки, полученные на ЦТ, поле sr_bal предназначено для хранения среднего балла аттестата. Пример 16.2. Описание переменных типа структура.
Здесь описаны переменные А и В типа tchk (две точки); переменные d1 и d2 типа date (две даты); переменная K типа kniga и переменная gruppa, являющаяся массивом, содержащим описание для 30 студентов. Пример 16.3. Инициализация структуры:
Точка А имеет координаты (3.2; -4.1): книга K — «Комбинаторика», автор — Н. Я. Виленкин, в ней 400 страниц, издана в 2013 г. Пример 16.4. Обращение к полям структуры.
Пример 16.5. Описание структуры для хранения отрезка, концы которого являются точками.
Использование:
Или так
Пример 16.6. Подсказка системы. [1] При описании вектора в качестве поля структуры нельзя инициализировать элементы данных сразу в скобках (vector <int> otm(3)), нужно присвоить полю инициализируемое значение. |
16.2. Использование структур для описания геометрических объектов
Простейшим геометрическим объектом на плоскости является точка, которая задается своими координатами. Точка описана в примере 16.1. Пара точек на плоскости определяет отрезок, который описан в примере 16.5. Еще одним важным геометрическим объектом на плоскости является прямая. В математике используют разные способы описать прямую с помощью уравнений. Уравнение прямой на плоскости в прямоугольной системе координат — это некоторое уравнение с двумя переменными x и y, которое обращается в тождество при подстановке в него координат любой точки этой прямой. Любая форма уравнения прямой имеет параметры. Используя параметры уравнения, можно описать соответствующую структуру (пример 16.7). Разные формы уравнения прямой (в большинстве случаев) могут быть приведены друг к другу, поскольку они описывают один и тот же объект. Использование той или иной формы уравнения прямой зависит от задачи. Уравнение прямой в общем виде является наиболее универсальным. Любая другая форма уравнения прямой всегда может быть приведена к общему уравнению прямой. Пример 16.8. Известны координаты двух точек, через которые проходит прямая. Получить запись уравнения этой прямой в общем виде. Этапы выполнения задания I. Исходные данные: переменная p1 (структура, описывающая уравнение прямой, проходящей через две точки). II. Результат: переменная p2 (структура, описывающая уравнение прямой в общем виде). III. Алгоритм решения задачи. 1. Ввод исходных данных. Вводим координаты двух точек и создаем из них структуру p1.
4. Вывод результата. IV. Описание переменных: p1, p2 – struct. Пример 16.9. Известны координаты точки и коэффициенты уравнения прямой в общем виде. Определить, принадлежит ли точка прямой. Этапы выполнения задания I. Исходные данные: переменная АВ (структура, описывающая уравнение прямой в общем виде), А (структура, описывающая точку). II. Результат: сообщение «да» или «нет». III. Алгоритм решения задачи. 1. Ввод исходных данных. IV. Описание переменных: A, AB – struct. Пример 16.10. Известны координаты концов отрезка и коэффициенты уравнения прямой в общем виде. Определить, имеют ли прямая и отрезок общие точки. Этапы выполнения задания I. Исходные данные: переменная CD (структура, описывающая уравнение прямой в общем виде), АB (структура, описывающая отрезок). II. Результат: сообщение «да» или «нет». III. Алгоритм решения задачи. 1. Ввод исходных данных. Структуру AB создаем по введенным координатам двух точек. 2. Для того чтобы проверить, имеют ли прямая и отрезок общие точки, создадим функцию otr_na_pr. 3. Отрезок имеет с прямой общие точки, если выполняется одно из условий: 3.1. Один из концов отрезка лежит на прямой. 4. Если точка лежит на прямой, то при подстановке ее координат в уравнение, в левой части общего уравнения прямой получаем 0. Если точка не принадлежит прямой, то получаем одно из двух неравенств: или Каждое из неравенств определяет полуплоскость относительно заданной прямой. Прямая пересекает отрезок, если его концы находятся в разных полуплоскостях относительно заданной прямой. 5. Поскольку вычисления проходят в вещественных числах, то будем проверять, что полученное значение по модулю меньше, чем 10-6. Такой точности на практике обычно бывает достаточно. 6. Вывод результата. IV. Описание переменных: CD, AB – struct. Пример 16.11. Многоугольник задан списком своих вершин в порядке обхода. Для каждой вершины известны ее координаты на плоскости. Найти периметр многоугольника. Этапы выполнения задания I. Исходные данные: n — количество точек, a — массив точек. II. Результат: периметр многоугольника. III. Алгоритм решения задачи. 1. Ввод исходных данных. Создаем массив из точек и вводим координаты. |
Пример 16.7. Формы записи уравнения прямой и соответствующие им описания структур. Уравнение прямой с угловым коэффициентом: y = kx + l. Уравнение не позволяет описать прямую, параллельную оси OY.
Уравнение прямой в отрезках: Параметры а и b — величины отрезков, отсекаемых прямой на осях координат. Уравнение не позволяет описать прямую, проходящую через начало координат.
Уравнение прямой, проходящей через две точки ) и :
Общее уравнение прямой:
Пример 16.8. V. Программа:
VI. Тестирование. Пример 16.9. V. Программа:
VI. Тестирование. Пример 16.10. V. Программа:
VI. Тестирование. Отрезок целиком лежит на прямой. Один конец отрезка лежит на прямой. Прямая пересекает отрезок. Нет общих точек. Пример 16.11. V. Программа:
VI. Тестирование. |
16.3. Использование структур для описания даты и времени
Пример 16.12. Текущее время задано в часах, минутах и секундах. Который час будет через k секунд? Этапы выполнения задания I. Исходные данные: v — структура, описывающая время, k — число секунд. II. Результат: новое время. III. Алгоритм решения задачи. 1. Ввод исходных данных. 2.1. Переведем текущее время в секунды. Для этого просуммируем количество часов, умноженное на 3600 (количество секунд в часе), количество минут, умноженное на 60, и количество секунд. 3. Вывод результата. IV. Описание переменных: k – int, v – struct. Пример 16.13. Заданы две даты. Определить количество дней между ними. Этапы выполнения задания I. Исходные данные: d1, d2 — структуры, описывающие даты. II. Результат: число дней между двумя датами. III. Алгоритм решения задачи. 1. Ввод исходных данных.
где d — номер дня в дате, d1, d2, ... dm - 1 — количество дней в месяцах, предшествующих заданному, (y – 1900) * 365 — количество дней за полный прошедший год до текущей даты, (g – 1900)/4 — количество дней, которые нужно добавить за прошедшие високосные годы. Формула буде верной для дат от 01.01.1900 до 28.02.2100. (2100 год не является високосным, поскольку 2100 делится на 100, но не делится на 400). 3. Создадим функцию date_to_int. |
Пример 16.12. V. Программа:
VI. Тестирование. Пример 16.13. V. Программа:
VI. Тестирование. В функции преобразования необходима дополнительная проверка для случая, если текущий год является високосным. Тогда дополнительный номер должен быть добавлен только к датам после 28 февраля. 1900 г. исключается, поскольку он не является високосным. |
Вопросы к параграфу
1. Какой тип данных называют структурой? 2. Как называется отдельный элемент структуры? 3. Как описываются структуры? 4. Какие структуры можно использовать для описания геометрических объектов? 5. Какие структуры можно использовать для описания даты и времени? |
Упражнения
1. Напишите программу, которая преобразует уравнение прямой в отрезках в общее уравнение прямой.
2. Напишите программу, которая преобразует общее уравнение прямой в уравнение прямой с угловым коэффициентом. Предусмотреть проверку случая, когда это сделать невозможно.
3. Напишите программу, которая преобразует уравнение прямой, проходящей через две точки, в уравнение прямой с угловым коэффициентом. Если это невозможно, то получить уравнение в виде .
4. Напишите программу, которая определит взаимное расположение точки с координатами (x0, y0) и прямой .
5. Напишите программу, которая определит взаимное расположение точек с координатами (x1, y1), (x2, y2) и прямой .
6. Напишите программу, которая определит взаимное расположение точки с координатами (x0, y0) и двух параллельных прямых и .
7. Многоугольник задан списком своих вершин в порядке обхода. Для каждой вершины известны ее координаты на плоскости. Найдите длину самой короткой диагонали многоугольника.
8. Многоугольник задан списком своих вершин в порядке обхода. Для каждой вершины известны ее координаты на плоскости. Получите массив прямых, заданных уравнением прямой, проходящей через две точки. Каждая прямая проходит через сторону многоугольника. Преобразуйте каждое уравнение в общее уравнение прямой. Выведите эти уравнения. * Есть ли у многоугольника две разные стороны, лежащие на одной прямой (это может быть у невыпуклого многоугольника)?
9. Для проверки того, что точка (x0, y0) лежит внутри треугольника, заданного вершинами (x1, y1), (x2, y2), (x3, y3), можно воспользоваться следующим алгоритмом:
- Провести прямую через точки (x1, y1), (x2, y2).
- Если точки (x0, y0) и (x3, y3) лежат в разных полуплоскостях относительно этой прямой, то точка (x0, y0) лежит снаружи.
- Если точки (x0, y0) и (x3, y3) лежат в одной полуплоскости, то произвести аналогичные проверки для остальных вершин.
- Если для всех трех прямых точка (x0, y0) и оставшаяся вершина лежат в одной полуплоскости, то точка (x0, y0) внутри треугольника.
Реализовать описанный выше алгоритм.
10*. Написать программу для проверки, лежит ли точка (x0, y0) внутри выпуклого многоугольника.
11. Вводятся два значения времени: часы, минуты, секунды. Сколько секунд прошло между ними? Время указано в пределах одних суток.
12. Вводятся два значения времени: часы, минуты, секунды. Между ними могло пройти более суток (но не более двух суток). Сколько прошло времени между ними? Ответ получить в часах, минутах и секундах.
13. Вводится дата: день, месяц, год. Уменьшить введенную дату на t дней.
14. Дана дата. Вывести, сколько дней до нее осталось (или сколько дней прошло).
15. Вводится дата: месяц, год. Определить день недели. Для определения дня недели можно воспользоваться следующими формулами:
a = (14 − месяц) / 12
y = год − a
m = месяц + 12 * a − 2
ДеньНедели = (день + y + y / 4 − y / 100 + y / 400 + (31 * m) / 12) % 7
Все деления целочисленные. Результат: 0 — воскресенье, 1 — понедельник и т. д
16. Дана дата. Сгенерировать расписание с этой даты на t дней по такому принципу: сутки через трое. Если рабочий день приходится на воскресенье, то он переносится на понедельник. В итоге показать даты рабочих дней.
17*. Дан режим работы интернет-магазина. ПН 9:00 — 21:00, ВТ 9:00 — 21:00, СР 9:00 — 21:00, ЧТ 9:00 — 21:00, ПТ 9:00 — 21:00, СБ 10:00 — 18:00, ВС 10:00 — 18:00. И даны дата и время. Определить, работает ли в это время магазин и сколько минут до конца рабочей смены.