Структуры

Лабораторная работа 5. Структуры и функции

Цель работы

Изучить особенности работы и определить допустимые операции со структурами. Разобраться с принципами объявления, определения и использования функций.

Краткая теоретическая часть

Структуры

Структура – это составной объект, в который входят элементы любых типов, за исключением функций. В отличие от массива, все элементы которого однотипны, структура может содержать элементы разных типов. В языке C++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке Си:

struct [ имя_типа ]

{

тип_1 элемент_1;

тип_2 элемент_2;

...

тип_n элемент_n;

} [ список_описателей ];

Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка.

Пример:

struct {

int year;

char moth;

int day;

} date, date2;

Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами.

Пример:

struct student{ // описание нового типа student

char fio[30];

long int num_zac;

double sr_bal;

}; // описание заканчивается точкой с запятой

 

student gr[30], *p; // определение массива типа student и

//указателя на тип student.

Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:

Пример:

struct {

char fio[30];

long int num_zac;

double sr_bal;

}student1 = {"Necto", 011999,3.66};

При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив – это массив массивов).

Пример:

struct complех{

float real, im;

} compl [2][3] = {{{1, 1}, {1, 1}, {1, 1}},{{2, 2}, {2, 2}, {2, 2}}};

Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции. Размер структуры не обязательно равен сумме размеров ее элементов, поскольку они могут быть выровнены по границам слова.

Доступ к полям структуры выполняется с помощью операций выбора . (точка) при обращении к полю через имя структуры и операции –> при обращении через указатель.

Пример:

student student1, gr[30], *p;

student.fio = "Страусенке":

gr[8].sr_bal=5;

p–>num_zac = 012001;

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

Пример:

struct A {

int a;

double х;

};

struct В {

A a;

double х,

} х[2];

х[0].а.а = 1;

х[1]. х = 0.1;

Из примера видно, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. Более того, можно объявлять в одной области видимости структуру и другой объект (например, переменную или массив) с одинаковыми именами, если при определении структурной переменной использовать слово struct.

Задание:

Описать структуру с именем avto, содержащую поля:

1. fam – фамилия и инициалы владельца автомобиля;

2. marka – марка автомобиля;

3. nomer – номер автомобиля.

Написать программу, выполняющую следующие действия:

1. ввод с клавиатуры данных в массив gai, состоящий из шести элементов типа avto; записи должны быть упорядочены в алфавитном порядке по фамилиям и именам владельцев;

2. вывод на экран информации о владельцах автомобиля, марка которого вводится с клавиатуры; если таковых автомобилей нет, то на экран дисплея вывести соответствующее сообщение.

Программа решения задачи будет иметь вид:

#include <iostream.h>

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <windows.h>

char buf[256];

char * Rus(char *text)

{

CharToOem(text,buf);

return buf;

}

struct avto {

char fam[25];

char marka[20];

char nomer[10];};

 

void output_gai(avto *,int );

 

void main(void)

{

int i,n;

bool flag;

cout<<Rus("Введите количество записей: ");

cin>>n;

avto *gai = new avto[n], temp;

char m[20];

for(i=0;i<n;i++)

{ // Ввод данных

cout<<Rus("Введите фамилию владельца ")<<i+1;

cout<<Rus("-го автомобиля: ");

cin >> gai[i].fam;

cout<<Rus("Введите марку ")<<i+1;

cout<<Rus("-го автомобиля: ");

cin >> gai[i].marka;

cout<<Rus("Введите номер ")<<i+1;

cout<<Rus("-го автомобиля: ");

cin >> gai[i].nomer;

}

cout << Rus("Исходные данные до сортировки") << endl;

output_gai(gai,n);

// Сортировка

flag = true;

while(flag)

{

flag = false;

for(i=0;i<n-1;i++)

if(strcmp(gai[i].fam,gai[i+1].fam)>0)

{

temp=gai[i];

gai[i]=gai[i+1];

gai[i+1]=temp;

flag = true;

}

}

cout << endl<<Rus("После сортировки")<<endl;

output_gai(gai,n);

cout << endl << Rus("Введите марку автомобиля: ");

cin >> m;

cout << endl << Rus("Искомые автомобили") << endl;

flag = true;

for(i=0;i<n;i++)

if(!strcmp(m,gai[i].marka))

{

output_gai(&gai[i],1);

flag = false;

}

if(flag)

{

cout<<Rus("\nМарки ")<<m;

cout<<Rus("нет в списках");}

delete [] gai;

}

}

void output_gai( avto *gai, int n)

{

int i;

for(i=0;i<n;i++)

{

cout.setf(ios::left);

cout.width(15);

cout<<gai[i].fam;// *(gai+i)->fam;

cout.width(15);

cout<<gai[i].marka;

cout.setf(ios::right);

cout.width(5);

cout<<gai[i].nomer<<endl;

}

}