Лабораторная работа №3. Решение задач с использованием структур
1. Цель работы
Изучить и освоить приёмы разработки программ с использованием структур.
2. Подготовка к работе.
Необходимо ознакомиться с основными составными типами данных (перечисление, смесь, структура, битовые поля) и с особенностями обращения к элементам структуры через указатель на структуру. [лекция 12]. Sobyt
3. Теоретическая часть.
Структуры в С++ часто применяют для логического объединения связанных между собой данных. В структуру, в противоположность массиву, можно объединять данные различных типов.
Например, требуется обрабатывать информацию о расписании работы конференцзала, и для каждого мероприятия надо знать время, тему, фамилию организатора и количество участников. Поскольку вся эта информация относится к одному событию, логично дать ему имя, чтобы впоследствии можно было к нему обращаться. Для этого описывается новый тип данных (после описания ставится «;»):
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};
В качестве примера рассмотрим программу вывода на экран студентов группы, родившихся в определенном месяце (месяц вводим интерактивно)
# 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";
}