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