Skip to content

Практическая работа №6

Работа со структурами (struct) в C++

Section titled “Работа со структурами (struct) в C++”

Цель работы: Научиться объявлять, инициализировать и эффективно использовать пользовательские типы данных — структуры (struct) — для объединения логически связанных данных разных типов, а также применять массивы структур и указатели на структуры в языке программирования C++.

Основные теоретические положения

Section titled “Основные теоретические положения”

1. Объявление и использование структур

Section titled “1. Объявление и использование структур”

Структура в C++ — это пользовательский тип данных, который позволяет объединить логически связанные переменные (члены структуры) разных типов под одним именем. Это позволяет работать с группой данных как с единым целым.

// Объявление структуры для описания студента
struct Student {
char name[50]; // Имя студента
int studentID; // ID студента
float averageGrade; // Средний балл
bool isFullTime; // Очная форма обучения
};
Инициализация и доступ к членам
Section titled “Инициализация и доступ к членам”

Для доступа к членам структуры используется оператор точки (.).

// Объявление и инициализация переменной типа Student
Student s1 = {"Ivanov Ivan", 1001, 4.75, true};
// Доступ к членам структуры
printf("Имя: %s\n", s1.name);
printf("ID: %d\n", s1.studentID);
// Изменение члена структуры
s1.averageGrade = 4.85;

Очень часто структуры используются для создания массивов структур, что позволяет хранить набор однотипных записей (например, список студентов, товаров или книг).

// Объявление массива из 3-х студентов
Student group[3] = {
{"Petrov Petr", 1002, 4.2, true},
{"Sidorova Anna", 1003, 5.0, false},
{"Kuznetsov Alex", 1004, 3.9, true}
};
// Доступ к члену структуры во втором элементе массива (индекс 1)
printf("Средний балл Анны: %.2f\n", group[1].averageGrade);

3. Указатели на структуры

Section titled “3. Указатели на структуры”

Указатели на структуры используются для динамического выделения памяти или для передачи структур в функции по ссылке. Для доступа к членам структуры через указатель используется оператор стрелки (->).

// Объявление указателя на структуру Student
Student s2 = {"Dmitriev Oleg", 1005, 4.1, true};
Student* ptr_s2 = &s2;
// Доступ к членам через указатель
printf("ID через указатель: %d\n", (*ptr_s2).studentID); // Использование оператора точки с разыменованием
printf("Имя через оператор стрелки: %s\n", ptr_s2->name); // Предпочтительный способ

Структура может содержать в качестве члена другую структуру, что позволяет создавать более сложные и логически организованные типы данных.

struct Date {
int day;
int month;
int year;
};
struct Employee {
char name[50];
Date hireDate; // Вложенная структура
double salary;
};
Employee e1 = {"Elena", {15, 10, 2023}, 75000.0};
// Доступ к членам вложенной структуры
printf("Дата найма: %d.%d.%d\n", e1.hireDate.day, e1.hireDate.month, e1.hireDate.year);

Компиляция и запуск программы

Section titled “Компиляция и запуск программы”
Terminal window
g++ *имя_файла*.cpp -o *название_файла_для_компиляции*
./*название_скомпилированного_файла*

Для каждого задания необходимо:

  1. Составить схему алгоритма программы;
  2. Написать программу на языке программирования C++;
  3. Произвести отладку программы на различных входных данных.

Задания для выполнения

Section titled “Задания для выполнения”

Выбор варианта: Номер варианта соответствует порядковому номеру студента в списке группы. Если количество студентов превышает 15, варианты повторяются по кругу (например, 16-й студент выполняет Вариант 1, 17-й - Вариант 2 и т.д.).

Тип задачиОписание задачи
1Базовая структураОбъявите структуру Point с членами x и y (целые числа). Создайте две переменные типа Point и вычислите расстояние между ними по формуле $\sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}$.
2Массив структурОбъявите структуру Book (название, автор, год издания). Создайте массив из 5 книг. Реализуйте функцию для поиска книги по названию и вывода информации о ней.
3Сложная структураОбъявите структуру Student (ФИО, номер зачетки, массив из 5 оценок). Создайте массив из 3-х студентов. Найдите студента с самым высоким средним баллом.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Time (часы, минуты, секунды). Создайте две переменные типа Time и реализуйте функцию для сложения двух моментов времени.
2Массив структурОбъявите структуру Product (название, цена, количество на складе). Создайте массив из 4-х товаров. Отсортируйте массив по цене в порядке возрастания.
3Сложная структураОбъявите структуру Triangle (три вершины, каждая из которых — структура Point с координатами x и y). Вычислите периметр заданного треугольника.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Date (день, месяц, год). Создайте переменную типа Date и реализуйте функцию для проверки, является ли год високосным.
2Массив структурОбъявите структуру Car (марка, модель, год выпуска). Создайте массив из 5 автомобилей. Реализуйте функцию для подсчета количества автомобилей, выпущенных после заданного года.
3Сложная структураОбъявите структуру Employee (ФИО, должность, зарплата). Создайте массив из 4-х сотрудников. Найдите сотрудника с самой высокой зарплатой в заданной должности.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Fraction (числитель, знаменатель). Реализуйте функцию для сокращения заданной дроби.
2Массив структурОбъявите структуру City (название, население). Создайте массив из 6 городов. Отсортируйте массив по населению в порядке убывания.
3Сложная структураОбъявите структуру Rectangle (левая верхняя вершина Point, правая нижняя вершина Point). Вычислите площадь заданного прямоугольника.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру RGBColor (красный, зеленый, синий — целые числа от 0 до 255). Создайте две переменные и реализуйте функцию для вычисления “среднего” цвета (среднее арифметическое каждого компонента).
2Массив структурОбъявите структуру Movie (название, режиссер, рейтинг от 1 до 10). Создайте массив из 5 фильмов. Реализуйте функцию для вывода списка фильмов с рейтингом выше заданного значения.
3Сложная структураОбъявите структуру Vector3D (x, y, z). Создайте массив из 3-х векторов. Реализуйте функцию для вычисления скалярного произведения двух векторов.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Circle (центр Point, радиус). Создайте переменную типа Circle и реализуйте функцию для вычисления ее площади.
2Массив структурОбъявите структуру Athlete (ФИО, вид спорта, лучший результат). Создайте массив из 5 спортсменов. Отсортируйте массив по лучшему результату в порядке убывания для заданного вида спорта.
3Сложная структураОбъявите структуру Complex (действительная часть, мнимая часть). Создайте массив из 3-х комплексных чисел. Реализуйте функцию для умножения двух комплексных чисел.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Vector2D (x, y). Реализуйте функцию для вычисления длины (модуля) вектора.
2Массив структурОбъявите структуру Recipe (название, время приготовления в минутах). Создайте массив из 5 рецептов. Найдите рецепт с минимальным временем приготовления.
3Сложная структураОбъявите структуру Passport (номер, ФИО, дата рождения Date). Создайте массив из 4-х паспортов. Реализуйте функцию для поиска паспорта по дате рождения.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Temperature (значение, шкала: ‘C’ или ‘F’). Реализуйте функцию для перевода температуры из Цельсия в Фаренгейт и наоборот.
2Массив структурОбъявите структуру Song (название, исполнитель, длительность в секундах). Создайте массив из 5 песен. Подсчитайте общую длительность всех песен в массиве.
3Сложная структураОбъявите структуру LineSegment (начальная точка Point, конечная точка Point). Реализуйте функцию для проверки, является ли отрезок горизонтальным или вертикальным.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Money (рубли, копейки). Реализуйте функцию для вывода денежной суммы в формате “РР руб. КК коп.”.
2Массив структурОбъявите структуру Country (название, столица, площадь). Создайте массив из 4-х стран. Отсортируйте массив по площади в порядке возрастания.
3Сложная структураОбъявите структуру InventoryItem (название, количество, цена за единицу). Создайте массив из 5 товаров. Вычислите общую стоимость всех товаров на складе.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Box (длина, ширина, высота). Вычислите объем и площадь поверхности заданного параллелепипеда.
2Массив структурОбъявите структуру Flight (номер рейса, город отправления, город прибытия). Создайте массив из 5 рейсов. Реализуйте функцию для поиска всех рейсов, прибывающих в заданный город.
3Сложная структураОбъявите структуру Polynomial (коэффициенты, степень). Создайте массив из 3-х полиномов. Реализуйте функцию для сложения двух полиномов.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Address (улица, дом, квартира). Реализуйте функцию для форматированного вывода адреса.
2Массив структурОбъявите структуру WeatherDay (дата Date, минимальная температура, максимальная температура). Создайте массив из 7 дней. Найдите день с самой большой разницей между минимальной и максимальной температурой.
3Сложная структураОбъявите структуру LibraryCard (номер, владелец Student). Создайте массив из 4-х карт. Реализуйте функцию для поиска владельца карты по ее номеру.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Circle (координаты центра x, y, радиус). Реализуйте функцию для проверки, лежит ли заданная точка Point внутри этого круга.
2Массив структурОбъявите структуру Animal (вид, кличка, возраст). Создайте массив из 5 животных. Реализуйте функцию для вывода списка животных заданного возраста.
3Сложная структураОбъявите структуру Matrix2x2 (массив 2x2 целых чисел). Реализуйте функцию для вычисления определителя заданной матрицы.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Rectangle (длина, ширина). Реализуйте функцию для сравнения двух прямоугольников по площади.
2Массив структурОбъявите структуру Player (имя, очки). Создайте массив из 6 игроков. Отсортируйте массив по очкам в порядке убывания.
3Сложная структураОбъявите структуру BankAccount (номер счета, ФИО владельца, баланс). Создайте массив из 3-х счетов. Реализуйте функцию для перевода средств с одного счета на другой.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Complex (действительная часть, мнимая часть). Реализуйте функцию для вычисления модуля комплексного числа.
2Массив структурОбъявите структуру Employee (ФИО, отдел). Создайте массив из 5 сотрудников. Подсчитайте количество сотрудников в каждом отделе.
3Сложная структураОбъявите структуру Line (коэффициенты A, B, C в уравнении $Ax + By + C = 0$). Реализуйте функцию для проверки, параллельны ли две заданные прямые.
Тип задачиОписание задачи
1Базовая структураОбъявите структуру Vector2D (x, y). Реализуйте функцию для вычисления угла между двумя заданными векторами.
2Массив структурОбъявите структуру Student (ФИО, группа). Создайте массив из 7 студентов. Отсортируйте массив по номеру группы, а студентов внутри группы — по алфавиту.
3Сложная структураОбъявите структуру Book (название, автор, год издания, цена). Создайте массив из 5 книг. Найдите самую дорогую книгу, выпущенную после 2010 года.

  1. Что такое структура (struct) в C++ и для чего она используется?
  2. В чем основное отличие структуры от массива?
  3. Как объявить структуру и получить доступ к ее членам? Приведите пример.
  4. Объясните разницу в доступе к членам структуры, когда вы работаете с самой структурой (.) и когда работаете с указателем на структуру (->).
  5. Что такое массив структур и как он объявляется?
  6. Может ли структура содержать в качестве члена другую структуру? Если да, приведите пример.
  7. Как передать структуру в функцию по значению и по ссылке? Какой способ предпочтительнее и почему?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. Стивен Прата. Язык программирования C++. Лекции и упражнения. 6-е изд. – М.: ООО “И.Д. Вильямс”, 2012. – 1248 с.
  2. Бьерн Страуструп. Язык программирования C++. 4-е изд. – М.: Бином-Пресс, 2011. – 1136 с.
  3. C++ Structures (Structs). cplusplus.com. https://www.cplusplus.com/doc/tutorial/structures/
  4. Стивен Прата. Язык программирования C++. Лекции и упражнения. 6-е изд. – М.: ООО “И.Д. Вильямс”, 2012. – 1248 с.