Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 8_Структуры и перечисления.doc
Скачиваний:
7
Добавлен:
10.03.2016
Размер:
220.16 Кб
Скачать

8.3. Передача структур аргументами функций

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

// demoStruct3.cpp : Defines the entry point for the console application.

//

// Листинг 8.3. Передача структур функции

#include "stdafx.h"

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cstdlib>

using namespace std;

#include <conio.h>

struct Marks

{

char name[80];

int phys;

int chem;

int maths;

};

// Прототипы функций

void set_one(Marks &str);

void set_all(Marks *str,int m);

void get(Marks *str,int m);

int main()

{

const int n=3;

Marks students[n];

set_all(students, n) ;

get (students,n) ;

getch();

return 0;

}

// Определения (реализация) функций

void set_one(Marks &str)

{

cout << ("Student name: ") ;

gets(str.name);

str.phys=3+rand()%3;

str.chem=3+rand()%3;

str.maths=3+rand()%3;

}

void set_all(Marks *str,int m)

{

for(int i=0;i<m;i++) set_one(str[i]);

}

void get(Marks *str,int m)

{

bool state;

char s [80];

do

{

cout << "What is the student name? ";

gets (s);

if(!strcmp(s,"exit")) return;

state=true;

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

{

if(!strcmp(str[i].name,s))

{

state=false;

cout<<"Physiscs : "<<str [i] .phys<<endl;

cout<<"Chemistry: "<<str[i] . chem << endl;

cout<<"Mathematics: "<<str[i].maths<<endl;

break;

}

}

if (state) cout<<"There is no student with such name\n";

}while(true);

}

Функциональность программы не изменилась, однако основной программный код реализован в виде нескольких функций. Функция set_one() предназначена для заполнения полей структуры, переданной аргументом функции. Функция объявлена как void set_one (Marks &str). Аргумент функции указан как такой, что имеет тип Marks - тип объявленной ранее структуры. Кроме того, аргумент (переменная структуры) передается по ссылке, поэтому перед формальным именем str аргумента функции указывается оператор &. Причина передачи аргумента функции по ссылке, а не по значению (как обычно) состоит в том, что в результате выполнения функции необходимо изменить аргумент, переданный этой функции.

При выполнении кода функции выводится приглашение ввести имя учащегося и с помощью генерирования случайных чисел определяются оценки по трем предметам. Соответствующий код уже комментировался ранее.

В функции set_all () в рамках оператора цикла вызывается функция set_one () для заполнения элементов массива, указанного первым аргументом функции set_all(). Прототип этой функции имеет вид void set_all (Marks *str, int m). Первый аргумент - указатель на переменную структуры Marks. В данном случае это имя заполняемого массива. Второй аргумент - размер массива. Поскольку имя массива является ссылкой на его первый элемент, проблемы с передачей аргументов, как в предыдущем случае, не возникает - при заполнении массива будет изменяться именно тот массив, имя которого передано аргументом функции.

Функция get () с прототипом void get (Marks *str,int m) предназначена для считывания имени учащегося и вывода его оценок. Первый аргумент функции - массив, в котором выполняется поиск на предмет совпадения имен учащихся, второй аргумент - размер массива. По сравнению с соответствующим кодом в 0листинге 6.2, в данном случае использована инструкция if (! strcmp (s, "exit") ) return для завершения работы функции (но не программы!). Непосредственно после инструкции return ничего не указывается, поскольку функция определена как такая, что не возвращает результат.

Как следствие использования описанных функций существенно упрощается код главного метода программы. Кроме инициализации константы, определяющей размер массива, и объявления массива с элементами-переменными структуры, основной код главного метода состоит из вызова двух функций (set_all () и get () ) и стандартной инструкции return 0.