Лабораторная работа №4
Тема: Структурный тип данных в языке С++
Цель: Изучение алгоритмов обработки объектов структурного типа данных и способов их реализации в языке С++.
1. Задания для самостоятельного выполнения.
2. Методические указания.
3. Пример выполнения задания.
4. Рейтинговый контроль.
1. Задания для самостоятельного выполнения
Вариант №1
Описать структуру с именем STUDENT, содержащую следующие поля:
- Фамилия и инициалы; Номер группы; Успеваемость (массив из 5 элементов).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 10 структур типа STUDENT; записи должны быть упорядочены по возрастанию номера группы; Вывод фамилий и номеров групп тех студентов, чей средний балл больше 4.0. Если таких студентов нет, вывести соответствующее сообщение.
Вариант №2
Описать структуру с именем STUDENT, содержащую следующие поля:
- Фамилия и инициалы; Номер группы; Успеваемость (массив из 5 элементов).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 10 структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла. Вывод фамилий и номеров групп студентов, имеющих оценки 4 и 5. Если таких студентов нет, вывести соответствующее сообщение.
Вариант №3
Описать структуру с именем STUDENT, содержащую следующие поля:
- Фамилия и инициалы; Номер группы; Успеваемость (массив из 5 элементов).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 10 структур типа STUDENT; записи должны быть упорядочены по алфавиту. Вывод фамилий и номеров групп студентов, имеющих хотя бы одну 2. Если таких студентов нет, вывести соответствующее сообщение.
Вариант №4
Описать структуру с именем AEROFLOT, содержащую следующие поля:
- Название пункта назначения рейса; Номер рейса; Тип самолёта.
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 7 структур типа AEROFLOT; записи должны быть упорядочены по возрастанию номера рейса; Вывод номеров рейсов и типов самолётов, вылетающих в пункт назначения, название которого совпало с названием, введённым с клавиатуры. Если таких рейсов нет, вывести соответствующие сообщение.
Вариант №5
Описать структуру с именем AEROFLOT, содержащую следующие поля:
- Название пункта назначения рейса; Номер рейса; Тип самолёта.
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 7 структур типа AEROFLOT; записи должны быть упорядочены в алфавитном порядке по названиям пунктов назначения; Вывод пунктов назначения и номеров рейсов, обслуживаемых самолётом, тип которого введён с клавиатуры. Если таких рейсов нет, вывести соответствующие сообщение.
Вариант №6
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя; Номер телефона; Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть упорядочены по датам рождения; Вывод информации о тех людях, чьи дни рождения приходятся на месяц, значение которого введено с клавиатуры. Если таких нет, вывести соответствующие сообщение.
Вариант №7
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя; Номер телефона; Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть размещены по алфавиту; Вывод информации о человеке, номер телефона которого введён с клавиатуры; Если такого нет, вывести соответствующие сообщение.
Вариант №8
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя; Номер телефона; Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть упорядочены по первым цифрам телефона; Вывод информации о человеке, чья фамилия введена с клавиатуры; Если такого нет, вывести соответствующие сообщение.
Вариант №9
Описать структуру с именем ZNAK содержащую следующие поля:
- Фамилия, имя; Знак Зодиака; Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа ZNAK, записи должны быть упорядочены по датам рождения; Вывод информации о человеке, чья фамилия введена с клавиатуры; Если такого нет, вывести соответствующие сообщение.
Вариант №10
Описать структуру с именем ZNAK содержащую следующие поля:
- Фамилия, имя; Знак Зодиака; Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа ZNAK, записи должны быть упорядочены по знакам зодиака; Вывод информации о людях, родившихся под знаком, введённом с клавиатуры. Если такого нет, вывести соответствующие сообщение.
2. Методические указания
Для выполнения данной лабораторной работы необходимо изучить теоретический материал по теме «Структуры».
Структура как и массив относятся к составным данным, т. е. это объект, состоящий из нескольких элементов (в Паскале – запись, состоящая из полей). В простейшем случае элементами структуры являются объекты типа int, float, char… В более сложных –можно использовать объекты любого типа, в том числе массивы, структуры.
Объявление структурного шаблона (структурного типа).Информация о книге:
Автор | Название | Год | Цена |
struct kniga /* имя шаблона */
{
char avtor[20];
char nazv[60];
int god;
float cena;
};
или
#define KNIGA struct kniga
Шаблон может быть локальным (внутри функции) или глобальным (вне функции).
Описание шаблона не вызывает выделения памяти. Это - аналог описания типа.
Определение структурных переменныхОпределим структурную переменную kn1:
- Ссылка на шаблон:
struct kniga kn1; или
KNIGA kn1;
struct kniga - тип переменной;
kn1 – имя переменной;
struct kniga kn1, kn2, *uk_kniga;
kn1, kn2 - две переменных;
*uk_kniga – указатель на структуру kniga
- Определение структурной переменной без ссылки на шаблон:
struct
{
int a;
float b;
}z1, z2;
z1,z2 – две переменных типа struct;
- Использование typedef
typedef struct
{
…
}KNIGA;
KNIGA kn1;
ИнициализацияИнициализация возможна только для внешних и статистических структур.
Принадлежность к внешнему типу определяется местом объявления структурной переменной, а не шаблона.
static struct kniga kn1={“Иванов А.И.”, ”физика”, 1983, 1.75} ;
Доступ к элементам структурыАналогично Паскалю используются составные имена.
<имя переменной>.<имя элемента> |
Составное имя
struct kniga kn1;
kn1.avtor – имя символьного массива[20] – адрес
kn1.nazv – имя символьного массива[60]
kn1.god – имя переменной типа int
kn.cena – имя переменной типа float, &kn1.cena – адрес
Эти имена могут быть использованы так же, как и обычные имена переменных:
kn1.avtor[5]=‘a‘;
scanf(“% f“,&kn1.cena);
kn1.god =1988 ;
*(kn1.avtor+1)=‘p‘ ;
gets(kn1.nazv);
Массивы структурstruct kniga kns[3] – массив из трех структур
kns[0].avtor – указатель на массив
kns[1].god - третий элемент второй структуры
kns[2].nazv[0]
номер элемента массива всегда указывается после имени.
Автор | название | год | цена |
| |
| 0 | ||||
1 | |||||
2 | |||||
| |
| |
Элементом структуры может быть другая структура
|
![]()
АВТОР | НАЗВАНИЕ | ГОД | АВТОР |
struct avtor
{
char im[10];
char ot[15];
char fam[15];
};
struct kninga1
{
struct avtor avt; /* Вложенная структура */
char nazv[60];
int god;
float cena;
};
Определение переменной и инициализацияstruct avtor avt1;
struct kniga1 kn_89 = / * инициализация только внешних или статических * /
/ * переменных */
{
{“Иван “, ”Иванович”, “ Иванов “},
”физика“,
1989,
1.75
};
Доступ:
kn_89.avt.fam[1]=‘p‘; Иранов
Целесообразно использование указателей на структуры по трем причинам:
- так же, как и указатели на массивы, они легче в использовании, чем сами массивы; многие удобные представления данных являются структурами, содержащими указатели к другим структурам.
struсt avtor *ukavt;
struсt kniga1 *ukknig; /* объявление двух указателей на структуры * /
Все операции с указателями, справедливые для обычных переменных, справедливы и для структурных переменных.
Можно использовать операции:
ukavt=&avt1;
ukknig=&kn-89;
*ukavt avt1
Имя структуры - это не адрес!
Указатели и массивы структур
struct kniga1 kni[100];
ukknig=kni; ukknig=&kni[0];
ukknig=kni+1; ukknig=&kni[1];
Прибавление “1“ к указателю увеличивает его значение (адрес) на число байтов, которое занимает соответствующий тип.
ukknig++; ukknig=&kni[2]; *ukknig=kni[2];
Операции над структурами
- Присваивание: struсt kniga kn1,kn2;
kn2=kn1;
- Сравнение структур - осуществляют специальные подпрограммы.
- Доступ к элементу структуры выполняется при помощи указателя:
struct avtor *ukavt, avt1;
ukavt – указатель на структуру
avt1 – переменная типа структуры
ukavt=&avt1; /* указатель ссылается на avt1*/
avt1.im[0]=‘a‘; Имя структуры - это не адрес
Как с помощью указателя ukavt получить доступ к этому же элементу?
Существует два способа:
1. Операция присоединения
ukavt–>im[0]= 'a'; |
Смысл новой операции –>:
avt1.im[0] и ukavt=&avt1;
Cтруктурный указатель, за которым следует операция –>, работает так же, как имя структуры с последующей операцией “.“.
( нельзя записать ukavt.im[0] т. к. ukavt – не является именем структуры).
Важно отметить, что ukavt – указатель, а ukavt–>im[0] - элемент структуры, на которую делается ссылка и имеет тип char.
2. Другой способ получить доступ к элементу структуры с помощью составного имени.
Составное имя
(*ukavt ).im[0]= 'a'; |
Круглые скобки необходимы, т. к. операция “.” имеет более высокий приоритет, чем *
Содержимое по адресу ukavt:
ukavt=&avt1;
*ukavt=*(&avt1);
avt1
“Дыры” могут возникать на стыке соседних элементов структуры из-за выравнивания границ памяти.
| ‘ a ‘ | ? | 1 | 2 |
char int
8. Передача информации о структурах функциям
Саму структуру можно использовать в качестве формальных параметров функции.
1. Можно передавать в качестве фактических параметров элемент структуры или его адрес.
struct pr
{
int a;
float b;
};
int ab ( int a, float *b )
{
*b=2.5*(float)a;
return (2*a);
}
void main()
{
struct pr pr1;
scanf(“%d“,&pr1.a); /* адрес элемента */
printf(“результат: %db=%f\n“,ab(pr1.a,&pr1.b),pr1.b);
}
2. Можно использовать адрес структуры в качестве фактического параметра.
Объявим шаблон и переменные одновременно в задаче определения остатка от деления целых чисел.
struct sab
{
int a, b;
}pr1={21,3};
/* int по умолчанию */ ab1(struct sab *prim) / * указатель на структуру pr1 */
{
return (prim->a%prim->b); /* остаток от деления */
}
void main()
{
printf(“остаток=%d“,ab1(&pr1));
}
3. Можно использовать имя массива структур в качестве фактического параметра
(то есть адрес первого элемента массива).
struct pr /* Глобальный шаблон */
{
int a;
float b;
};
void main() /*найти сумму всех элементов*/ структуры
{ /*в массиве структур 10 записей*/
int i;
float ab2(struct pr *prim); /*прототип функции*/
struct pr pr2[10];
for(i=0;i<10;i++)
scanf(“%d %f”,&pr2[i].a,&pr2[i].b);
printf(“сумма=%f“,ab2(pr2)); /* pr2 – имя массива структур, адрес первой
структуры. */
}
float ab2(struct pr *prim)
{
int i;
float sum=0;
for(i=0;i<10;i++,prim++)sum+=prim->a+prim->b;
return (sum);
}
Данная лабораторная работа предусматривает в качестве контроля отчет в печатном виде и его защита
Отчет должен включать в себя:
1. Текст задания
2. Блок – схему
3. Программный код с комментариями
4. Примеры рез-та работы программы.
3. Пример выполнения задания.
Описать структуру с именем NOTE содержащую следующие поля:
- Фамилия, имя; Номер телефона; Дата рождения (массив из трёх чисел).
Написать программу, выполняющую следующие действия:
- Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть размещены по алфавиту; Вывод информации о человеке, номер телефона которого введён с клавиатуры;
Если такого нет, вывести соответствующие сообщение.
#include<iostream. h> #include<conio. h> #include<string. h>
#include<stdlib. h> #include<stdio. h>
main()
{clrscr();
struct NOTE
{char fn[30]; int no; int bd[3];};
int q, i,e, a,ctr[8],num;
char c;
c='#'; q=8;
NOTE box[8]; NOTE box1[8];
for(i=0;i<q;i++)
{cout<<"Vvedite Familiy, Imya (cherez probel)"<<endl;
gets(box[i].fn);
cout<<"Vvedite nomer telefona"<<endl;cin>>box[i].no;
cout<<"Vvedite daty rozhdeniya"<<endl;
cout<<"chislo"<<endl;cin>>box[i].bd[0];
cout<<"mesyatc"<<endl;cin>>box[i].bd[1];
cout<<"god"<<endl;cin>>box[i].bd[2];};
cout<<"Vvedite nomer telefona"<<endl;cin>>num;
cout<<"Yporyadocheno po alfavity:"<<endl;
for(i=0;i<q;i++)
{c='#';
for(e=0;e<q;e++)
{if(box[e].fn[0]>=c)
{c=box[e].fn[0]; a=e;};};
strcpy(box1[i].fn, box[a].fn);
box1[i].no=box[a].no;box1[i].bd[0]=box[a].bd[0];
box1[i].bd[1]=box[a].bd[1];
box1[i].bd[2]=box[a].bd[2];box[a].fn[0]='!';};
for(i=q-1;i>=0;i--)
{cout<<box1[i].fn<<endl;cout<<box1[i].no<<endl;
cout<<box1[i].bd[0]<<endl;
cout<<box1[i].bd[1]<<endl;
cout<<box1[i].bd[2]<<endl;}
cout<<"sovpadeniya"<<endl;
for(i=q-1;i>=0;i--)
if(box1[i].no==num)
{cout<<box1[i].fn<<endl;
cout<<box1[i].no<<endl;
cout<<box1[i].bd[0]<<endl;
cout<<box1[i].bd[1]<<endl;
cout<<box1[i].bd[2]<<endl;a=1;}
if (a!=1) cout<<"takih nety";
getch();}




4. Рейтинговый контроль.
Выполнение задания в аудитории | 2 балла |
Отчет лабораторной работы | 2 балла |
Максимум за работу | 4 балла |
Минимум за работу | 0 баллов |


