Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
46
Добавлен:
16.02.2016
Размер:
72.19 Кб
Скачать

Структуры как аргументы функций

Зачастую в тело функции необходимо передать информацию, структурированную по определенному принципу. При этом в качестве параметра в прототипе функции указывается пользовательский тип данных, сформированный при объявлении структуры. Так, если была объявлена структура

struct ALLNUMB

{

int nVar; long 1Var; short shVar; unsigned int uiVar;

};

прототип функции будет, например, иметь вид: void Func(ALLNUMB);

При этом происходит передача в тело функции параметра типа структуры по значению. Таким образом, оригинал структурированного объекта модификации не подлежит. Функция может также возвращать объект типа структуры:

ALLNUMB Func2(ALLNUMB);

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

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

#include <iostream.h>

#include <string.h>

struct HOUSE

{

unsigned short RegNum;

char Street[51];

// а учетом '\0'

char HouseNum[6];

unsigned short MaxFloorNum;

unsigned short MaxFlatNum;

bool Parking;

};

void OutAddress(HOUSE);

int main ()

{

HOUSE MyHouse;

MyHouse.RegNum = 524;

strcpy(MyHouse.Street, "ул. Гоголя");

strqpy{MyHouse.HouseNum, "2-a");

MyHouse.MaxFloorNum = 7;

MyHouse.MaxFlatNum = 84;

MyHouse.Parking = true;

OutAddress (MyHouse) ;

return 0;

}

void OutAddress(HOUSE house)

{

cout « house.Street « ", "; cout « house.HouseNum « '\n';

}

Вызов функции OutAddress (MyHouse) передает в тело сформированную структуру, доступ к членам которой осуществляется в соответствии с описанным выше правилом, через символ 'точка' (.). В результате на экран будет выведено:

ул. Гоголя, 2-а

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

Сама по себе одна единственная запись типа структуры в большинстве случаев вряд ли может вызывать повышенный интерес. Однако в случае, когда структурированные данные объединяются в массивы, речь идет уже не о единичном объекте, а о целой базе данных.

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

HOUSE mDistr[30];

Доступ к элементам такого массива осуществляется обычным способом, например, по индексу (индексация ведется, начиная с нуля). Следующий фрагмент кода осуществляет в цикле упорядоченное заполнение номеров домов структуры HOUSE, а затем выводит записанные данные в столбик на экран:

HOUSE mDistr[30];

for(int i=0; i<30; i++)

itoa(i+l,mDistr[i].HouseNum,10);

for(int i=0; i<30; i++)

cout « mDistrfi].HouseNum « '\n';

Напомним, что для работы функции преобразования целого числа в строку символов itoa() необходимо подключить модуль stdlib.h.

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

Соседние файлы в папке ЯзыкС++Глушаков