Решение задач с использованием структур
Цель работы
Изучить и освоить приёмы разработки программ с использованием структур.
Подготовка к работе.
Необходимо ознакомиться с основными составными типами данных (перечисление, смесь, структура, битовые поля) и с особенностями обращения к элементам структуры через указатель на структуру. [лекция 12]. Sobyt
Теоретическая часть.
Структуры в С++ часто применяют для логического объединения связанных между собой данных. В структуру, в противоположность массиву, можно объединять данные различных типов.
Например, требуется обрабатывать информацию о расписании работы конференцзала, и для каждого мероприятия надо знать время, тему, фамилию организатора и количество участников. Поскольку вся эта информация относится к одному событию, логично дать ему имя, чтобы впоследствии можно было к нему обращаться. Для этого описывается новый тип данных (после описания ставится «;»):
struct Sobyt{
int hour, min;
char theme[100], name[100];
int num;
};
Имя этого типа данных – Sobyt. Можно описать переменные или массивы этого типа, так же, как переменные и массивы встроенных типов, например:
Sobyt e1, e2[10]; // структура и массив структур
Если структура используется только в одном месте программы, можно совместить описание типа с описанием переменных, при этом имя типа можно не указывать:
struct {
int hour, min;
char theme[100], name[100];
int num;
} e1, e2[10];
Переменные структурного типа можно размещать и в динамической области памяти, для этого надо описать указатель на структуру и выделить под нее место:
Sobyt *pe = new Sobyt; // структура
Sobyt *pm = new Sobyt[m]; // массив m структур
Элементы структуры называют полями. Поля могут быть любого основного типа, массивом, указателем, объединением или структурой. Для обращения к полю используется операция выбора («точка» для переменной и «->» для указателя), например:
e1.hour = 12; e1.min = 30;
strcnpy(e2[0].theme, “Новые пути развития ИТ”, 99);
pe->num = 30; // или (*pe).num = 30;
pm[2].hour = 14; // или (*(pm+2)).hour = 14;
Структуры одного типа можно присваивать друг другу:
*pe = e1; pm[1] = e1; pm[4] =e2[0];
Но присвоение – это и все, что можно делать со структурами целиком. Другие операции, например сравнение на равенство или вывод, не определены. Хотя пользователь может задать их самостоятельно.
Ввод/вывод структур, как и массивов, выполняется поэлементно. Например:
// с использованием классов ввода-вывода <iostream.h>
cin>>e1.hour>>e1.min;
cin.getline(e1.tneme,100);
cout<<e1.hour<<’ ‘<<e1.min<<’ ‘<<e1.theme<<endl;
// с использованием ввода-вывода в стиле С (<stdio.h>)
scanf(“%d%d”, &e1.hour, &e1.min; gets(e1.theme);
printf(“%d %d %s”, e1.hour, e1.min, e1.theme);
Структуры (только не динамические) можно инициализировать перечислением значений их элементов:
Sobyt e3 = {12, 30, “ Новые пути развития ИТ ”, 25};
В качестве примера рассмотрим программу вывода на экран студентов группы, родившихся в определенном месяце (месяц вводим интерактивно). Нарисуем блок-схему алгоритма задачи (см.рис.3). Обратите внимание, если мы не можем описывать производимые в программе действия математическими формулами, то объясняем словами. Код программы будет выглядеть следующим образом:
# include <iostream.h>
# include <stdio.h>
# include <string.h>
# define n 25 // const int n=25; - количество студентов в группе
void main()
{struct stud {
char fam[20]; // фамилия студента
char mr[8]; // месяц рождения студента
}std[n],*p=&std[0]; // описание массива 25 структур и
//указателя на структуру
int i;
char mes[8];
for(i=0;i<n;i++,p++) // указатель сдвигается построчно
{cout<<"\n"<<"введите фамилию \n";
cin>>((*p).fam); // используем операцию разыменования
cout<<'\n'<<"введите месяц\n";
cin>>(*p).gr;
}
p-=n; // указатель возвращаем на начало списка
cout<<"\n"<<"введите искомый месяц\n";
cin>>mes;
for(i=0;i<n;i++,p++)
if(strcmp(std[i].mr,mes)==0 ) // сравнение месяца рождения
//каждого студента с введенным
cout<<(*p).fam<<"\n"; // если совпадают, то выдача
//фамилии студента на экран монитора
}
Рис.3. Блок-схема алгоритма программы определения студентов, родившихся в указанный месяц
Задание.
Для выданного преподавателем варианта задачи написать и отладить программу на языке С++. Для отладки используйте массив из 3-4 структур.
Обращение к структурам произведите как классическим способом, так и посредством указателя. Попробуйте обращение через указатель-переменную и указатель-константу. Чем будут тогда отличаться программы?
5. Требования к отчету по лабораторной работе:
Отчет должен содержать:
1) распечатку или текст программы с комментариями;
2) результаты работы программы
Варианты индивидуальных заданий.
1. Ввести в ЭВМ информацию о сотрудника отдела: фамилия, имя, возраст. Распечатать имена сотрудников, возраст которых превышает 33 года.
2. Ввести в ЭВМ информацию о номенклатуре товаров продаваемых в киосках института: номер киоска, наименование товара, его количество. Определить киоски, содержащие необходимые товары.
3. Сформировать список сотрудников отдела: фамилия, имя, месяц рождения. Распечатать имена сотрудников родившихся в летние месяцы.
4. Сформировать список о зарегистрированных пересдачах задолженностей студентов: ФИО, предмет, количество пересдач. Распечатать список по количеству пересдач и выдать его на экран дисплея.
5. Сформировать список, в котором хранится информация о предметах, изъятых на таможне за отчётный период: дата изъятия, наименование предмета, количество единиц, стоимость. Определить количество единиц заданного типа предмета за март месяц.
6. Есть информация о сотрудниках предприятия: фамилия и инициалы работника, занимаемая им должность, год поступления на работу. Сформировать список работников предприятия, чей стаж работы превышает значение, введенное с клавиатуры.
7. Сформировать ведомость, в которой хранятся результаты сессии группы (20 человек): ФИО, предмет, экзаменационная оценка. Написать программу корректировки оценок, у 3 студентов, пересдавших сессию.
8. В ведомости хранится информация о пропусках занятий студентами: ФИО, предмет, пол, время занятия. Поступила очередная информация о пропусках. Написать программу и алгоритм решения следующей задачи: проверить наличие в исходной ведомости повторных пропусков занятий.
9. В списке содержится информация о владельцах гаражного кооператива: ФИО, марка автомобиля, номер машины. Написать программу внесения в список информации о новых членах кооператива, если данные о них отсутствуют в исходном файле.
10. В списке хранится информация о студентах получивших разрешение на пересдачу экзамена: ФИО, группа, предмет, курс. Сформировать список, содержащий информацию о студентах получивших разрешение на пересдачу после заданной даты.
11. В списке содержится информация о владельцах автотранспорта: ФИО, марка автомобиля, номер машины. Написать программу формирования списка, содержащего информацию о владельцах автомобилей, в номере которых встречаются заданные цифры.
12. В ведомости хранится информация о деятельности некоторых подразделений: наименование подразделения, количество сотрудников, прибыль, полученная за текущий квартал. Определить лучшее подразделение с учётом числа сотрудников.
13. В расписании хранится информация о движении поездов по станции «Старый Оскол»: номер поезда, пункт назначения, время прибытия, время отправления. Необходимо распечатать все поезда, которые отправляются в заданном диапазоне времени.
14. В расписании хранится информация о движении поездов по станции «Старый Оскол»: номер поезда, пункт назначения, время прибытия, время отправления. На его базе сформировать новое, расписание содержащее информацию о поездах, движущихся в заданный конечный пункт.
15. Сформировать документ, в котором хранится информация об ассортименте продовольственных товаров в коммерческих магазинах: наименование магазина, наименование товара, количество этого товара, цена за килограмм. Подобрать магазины для оптовой закупки заданного товара в заданном количестве на имеющуюся сумму.
16. Создать документ, в котором хранится информация о предметах, изъятых на таможне за отчётный период: дата изъятия, наименование предмета, группа товара (оружие, продовольственные товары, т.д.), количество единиц, стоимость единицы. Определить группу предметов, по которой изъято наибольшее количество товара.
17. Сформировать список, в котором хранится информация о сотрудниках подразделения: ФИО, место рождения, год рождения. На его основе сформировать новый список сотрудников, родившихся в данном городе и распечатать его.
18. Создать список, в котором хранится информация об абонентах АТС: ФИО, место жительства, номер телефона. Необходимо выдать список абонентов номера телефонов которых содержат заданную комбинацию из 3-х цифр.
19. В отчёте хранится информация о лицензиях, выданных на приобретение газового оружия: ФИО, дата выдачи лицензии, тип оружия, его стоимость. Необходимо вывести на экран все записи с заданной стоимостью
20. Сформировать документ, в котором хранится информация об академических задолженностях по факультетам за три года. Написать программу определения факультетов с максимальным и минимальным количеством задолженностей.
21. Сформировать список, в котором хранится информация об ассортименте продовольственных товаров в коммерческих магазинах: код (наименование) магазина, наименование товара, количество этого товара. Подобрать магазин, в котором хранится заданный товар в нужном количестве.
22. Создать список, в котором хранится информация об абонентах АТС: ФИО, место жительства, номер телефона. Необходимо написать программу, которая по фамилии выдаёт номер абонента.
23. Сформировать документ, в котором хранится информация о заболеваниях сотрудников: ФИО, год рождения, заболевание, продолжительность болезни. На его основе сформировать список сотрудников, которые перенесли одно и тоже заболевание.
24. Создать список, в котором хранится информация об абонентах библиотеки: ФИО, кафедра, количество книг взятых абонентом. Необходимо написать программу, определения кафедры, за которой числится максимальное количество книг.
25. В отчёте хранится информация об изобретательской деятельности кафедр за три года: наименование кафедр, количество заявок, количество положительных решений. Написать программу определения кафедры получившей максимальное количество положительных решений.
26. Написать программу определения месяца, в котором родилось максимальное количество студентов в вашей группе.
27. По информации о результатах сессии: фамилия и инициалы студента, номер группы, успеваемость (массив из пяти элементов) – сформировать список студентов, имеющих хотя бы одну «двойку».
28. По информации о результатах сессии: фамилия и инициалы студента, номер группы, успеваемость (массив из пяти элементов) – сформировать список студентов, имеющих только оценки «4» и «5».
29. По информации о результатах сессии: фамилия и инициалы студента, номер группы, успеваемость (массив из пяти элементов) – сформировать список студентов, имеющих средний балл, больший 4.0.
30. По имеющейся информации о сотрудниках предприятия: подразделение, ФИО сотрудника, месяц, заработная плата за этот месяц – рассчитать совокупный фонд заработной платы сотрудников введенного подразделения за 1-ый квартал отчетного года.
7. Контрольные вопросы
1.Назовите основные отличительные характеристики типа данных «структура».
2.Какие типы полей может содержать структура?
3.Назовите способы обращения к элементам структуры.
4.Назовите способы описания переменных структурного типа.
5.Можно ли присваивать переменной структурного типа структуру?
6. Каковы отличия структуры от перечисления?
7. Каковы отличия структуры от смеси (объединения)?
8. Каковы отличия структуры от массива?
9. Чем отличаются указатели на массив и на структуру?
Лабораторная работа № 4.