Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 24

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

Отдельные структурные переменные с произвольным шаблоном, как и обычные переменные любого типа, могут быть объединены в массивы фиксированной длины:

struct BOOK

{    string author; // Автор книги

stringtitle ; // Название книги

intjear; // Год издания

intn; // К- во странниц

}catalog[10];// Массив структур

Имя catalog объявлено как массив 10 структур с общим шаблоном BOOK. Обращение к элементом отдельной структуры производится, как и ранее, с использованием операции – точки. Например, обращение вида

catalog[3].title[4];

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

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

Тип struct – совершенно полноправный тип данных языка С++. Поэтому на этот тип можно объявить указатель. В отличие от массива, имя структурной переменной не эквивалентно ее адресу. Адрес можно получить известным образом:

DATEdata_1; // Объявление структурной переменной

DATE *pt; // Создание указателя на структуры данного типа

pt = &data_1; // Занесение в указатель адреса конкретной структуры типа DATA

При наличии указателя на структуру к элементам этой структуры можно обращаться с помощью операции –>. Например, pt–>year. Можно обращаться к элементу структуры и таким образом: (*имя_указа-теля).имя_элемента_структуры. Наличие круглых скобок обязательно. Таким образом, следующие три выражения эквивалентны:

(*pt).year; pt–>year; data_1.year.

Все они именуют один и тот же элемент intyear структурной переменной data_1, имеющий тип DATE.

Структуры и функции

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

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

Пример 2

// Передача структуры в функцию по значению

#include <iostream>

 struct man

{ string name;

int dd,mm,yy;

stringzodiak;

};

voidproc1(manB)// Формальный параметр – структура В с шаблоном

// man

{B.dd++;}

void main()

{ manA = {"Иванов И.И",1,10,1989,"Весы"};

proc1(A); //Фактический параметр – копия структуры А

// с шаблоном man

cout<<"A.dd="<<A.dd; //Выдача на экран – A.dd=1

}

При передаче структуры в функцию по значению изменить элементы этой структуры в функции невозможно. Обратите внимание, что программа определяет структуру man вне функции main и до функции proc1, поскольку функция объявляет переменную B типа man, и определение структуры man должно располагаться до функции.

Ели вы хотите с помощью функции изменять элементы структуры, то необходимо передавать ее адрес, тогда формальным параметром будет указатель на структуру (пример 3).

Пример 3

// Передача структуры в функцию через указатель

structman

{ …};

// Передача через указатель

void proc2(man *p) // Формальный параметр – указатель на

// структуру типа man

{p->dd++;}

 void main()

{ man A={"Иванов И.И",1,10,1989,"Весы"};

proc2(&A);// Фактический параметр – адрес структуры А

cout<<"A.dd="<<A.dd; //Выдача на экран – A.dd=2

}

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

structcoord // Описание структуры с именем coord

{ float pik;

  int n_str,n_stl;

}

coord max_m(float *pt,int n,int m);// Возвращает структуру типа coord

void main()

{ coord man1;// Структура man1 построена по шаблону coord

floatc[4][5]={......};