Лабораторная работа №4 Тема : Структурный тип данных в языке С++

Вид материалаЛабораторная работа

Содержание


Указатели и массивы структур
Операции над структурами
Подобный материал:
Лабораторная работа №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, записи должны быть упорядочены по знакам зодиака;
  • Вывод информации о людях, родившихся под знаком, введённом с клавиатуры.
  • Если такого нет, вывести соответствующие сообщение.



  1. Методические указания

Для выполнения данной лабораторной работы необходимо изучить теоретический материал по теме «Структуры».


Структура как и массив относятся к составным данным, т.е. это объект, состоящий из нескольких элементов (в Паскале – запись, состоящая из полей). В простейшем случае элементами структуры являются объекты типа int, float, char… В более сложных –можно использовать объекты любого типа, в том числе массивы, структуры.

  1. Объявление структурного шаблона (структурного типа).


Информация о книге:



Автор

Название

Год

Цена


struct kniga /* имя шаблона */

{

char avtor[20];

char nazv[60];

int god;

float cena;

};

или

#define KNIGA struct kniga


Шаблон может быть локальным (внутри функции) или глобальным (вне функции).

Описание шаблона не вызывает выделения памяти. Это - аналог описания типа.


  1. Определение структурных переменных


Определим структурную переменную 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;

  1. Инициализация


Инициализация возможна только для внешних и статистических структур.

Принадлежность к внешнему типу определяется местом объявления структурной переменной, а не шаблона.


static struct kniga kn1={“Иванов А.И.”, ”физика”, 1983, 1.75} ;

  1. Доступ к элементам структуры


Аналогично Паскалю используются составные имена.


<имя переменной>.<имя элемента>
Составное имя

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);


  1. Массивы структур


struct kniga kns[3] – массив из трех структур

kns[0].avtor – указатель на массив

kns[1].god - третий элемент второй структуры

kns[2].nazv[0]


номер элемента массива всегда указывается после имени.


0 1 2 3

Автор

название

год

цена














0













1
















2



  1. Вложенные структуры














Элементом структуры может быть другая структура

КНИГА





АВТОР

НАЗВАНИЕ

ГОД

АВТОР




ИМЯ

ОТЧЕСТВО

ФАМИЛИЯ

struct avtor

{

char im[10];

char ot[15];

char fam[15];

};

struct kninga1

{

struct avtor avt; /* Вложенная структура */

char nazv[60];

int god;

float cena;

};
  1. Определение переменной и инициализация


struct avtor avt1;

struct kniga1 kn_89 = / * инициализация только внешних или статических * /

/ * переменных */

{

{“Иван “, ”Иванович”, “ Иванов “},

”физика“,

1989,

1.75

};


Доступ:

kn_89.avt.fam[1]=‘p‘; Иранов

  1. Указатели на структуры


Целесообразно использование указателей на структуры по трем причинам:
  • так же, как и указатели на массивы, они легче в использовании, чем сами массивы;
  • многие удобные представления данных являются структурами, содержащими указатели к другим структурам.


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);

}

  1. Можно использовать адрес структуры в качестве фактического параметра.


Объявим шаблон и переменные одновременно в задаче определения остатка от деления целых чисел.


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));

}

  1. Можно использовать имя массива структур в качестве фактического параметра

(то есть адрес первого элемента массива).


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. Примеры рез-та работы программы.



  1. Пример выполнения задания.

Описать структуру с именем NOTE содержащую следующие поля:
  • Фамилия, имя;
  • Номер телефона;
  • Дата рождения (массив из трёх чисел).

Написать программу, выполняющую следующие действия:
  • Ввод с клавиатуры данных в массив, состоящий из 8 структур типа NOTE, записи должны быть размещены по алфавиту;
  • Вывод информации о человеке, номер телефона которого введён с клавиатуры;

Если такого нет, вывести соответствующие сообщение.


#include #include #include

#include #include

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
{cout<<"Vvedite Familiy, Imya (cherez probel)"<
gets(box[i].fn);

cout<<"Vvedite nomer telefona"<>box[i].no;

cout<<"Vvedite daty rozhdeniya"<
cout<<"chislo"<>box[i].bd[0];

cout<<"mesyatc"<>box[i].bd[1];

cout<<"god"<>box[i].bd[2];};

cout<<"Vvedite nomer telefona"<>num;


cout<<"Yporyadocheno po alfavity:"<

for(i=0;i
{c='#';

for(e=0;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<
cout<
cout<
cout<

cout<<"sovpadeniya"<

for(i=q-1;i>=0;i--)

if(box1[i].no==num)

{cout<
cout<
cout<
cout<
cout<
if (a!=1) cout<<"takih nety";

getch();}






4. Рейтинговый контроль.


Выполнение задания в аудитории

2 балла

Отчет лабораторной работы

2 балла

Максимум за работу

4 балла

Минимум за работу

0 баллов