Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
L_r_03.doc
Скачиваний:
6
Добавлен:
17.11.2019
Размер:
118.27 Кб
Скачать

Лабораторная работа №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";

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]