Структуры
Лабораторная работа 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;
}
}