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

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

Например:

//Определение структурного типа

struct person {

char *name;

int age;

};

· Функция может возвращать структуру как результат:

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

struct person f (int N);

· Функция может возвращать указатель на структуру:

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

struct person *ff (void);

· Параметром функции может быть структура:

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

void fff (struct person str);

· Параметром функции может быть указатель на объект структурного типа:

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

void ffff (struct person *pst);

При вызове функции fff() выделяется память для формального параметра, т.е. для вспомогательного объекта типа struct person. В этот объект переносится значение фактического параметра, заменяющего формальный параметр – структуру str. Далее выполняются действия, предусмотренные операторами тела функции fff(). Эти действия не могут изменять структуру, использованную в качестве фактического параметра.

В случае, когда параметром служит указатель на объект структурного типа, действиями внутри тела функции ffff() можно изменить ту структуру вызывающей функции, которая адресуется фактическим параметром pst.

Если функция не изменяет структуру, то такую структуру можно передать по значению.

Пример 4. Отображение полей структуры на экране.

#include <iostream.h>

struct book {

char title[40];

char authors[30];

char publishing_house[25];

int year;

int pages;

};

void show_book(book b) {

cout << "Название: "<< b.title<<"\n";

cout << "Автор: "<< b.authors<<"\n";

cout << "издательство: "<< b. publishing_house<<"\n";

cout << "Год: "<< b.year<<"\n";

cout << "Количество страниц: " << b.pages<<"\n";

}

void main(){

book a={"Программирование на языке Си", "Подбельский В.В.",

"Финансы и статистика", 2004,600};

show_book(a);

}

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

Пример 5. Параметр функции – указатель на структуру.

#include <iostream.h>

struct book {

char title[40];

char authors[30];

char publishing_house[15];

int year;

int pages;

};

void input_book(book *b){ //структура передается по указателю

cout << "Название: ";

cin >> b->title;

cout << "Автор: ";

cin >> b->authors;

cout << "Издательство: ";

cin >> b->publishing_house;

cout << "Год: ";

cin >> b->year;

cout << "Количество страниц: ";

cin >> b->pages;

}

void main(){

book a,*pa=&a;

input_book(pa);

}

 

Пример 6. Параметр функции – ссылка на структуру.

#include <iostream.h>

struct book {

char title[40];

char authors[30];

char publishing_house[15];

int year;

int pages;

};

void input_book(book &b) { //структура передается по ссылке

cout << "Название: ";

cin >> b.title;

cout << "Автор: ";

cin >> b.authors;

cout << "Издательство: ";

cin >> b.publishing_house;

cout << "Год: ";

cin >> b.year;

cout << "Количество страниц: ";

cin >> b.pages;

}

 

void main(){

book a;

input_book(a);

}

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

Пример 7. Функции g1, g2 и g3 возвращают структуру.

#include <iostream.h>

struct ss {

int a;

float b;

};

ss g1(ss v){ //параметр - значение

v.a=7;

v.b=8;

return v;

}

ss g2(ss &v){ //параметр - ссылка

v.a=v.b+7;

v.b=v.a+8;

return v;

}

ss g3(const ss &v){ //параметр - константная ссылка

ss q;

q.a=v.b+7;

q.b=v.a+8;

return q;

}

void main(){

ss x1,y1={1,2};

ss x2,y2={3,4};

ss x3,y3={5,6};

x1=g1(y1);

cout << "x1=" << x1.a << "; " << x1.b << "\n";

cout << "y1=" << y1.a << "; " << y1.b << "\n";

y1=g1(y1);

cout << "x1=" << x1.a << "; " << x1.b << "\n";

cout << "y1=" << y1.a << "; " << y1.b << "\n";

x2=g2(y2);

cout << "x2=" << x2.a << "; " << x2.b << "\n";

cout << "y2=" << y2.a << "; " << y2.b << "\n";

x3=g3(y3);

cout << "x3=" << x3.a << "; " << x3.b << "\n";

cout << "y3=" << y3.a << "; " << y3.b << "\n";

y3=g3(y3);

cout << "x3=" << x3.a << "; " << x3.b << "\n";

cout << "y3=" << y3.a << "; " << y3.b << "\n";

}

 

 

Задания

1.Наберите коды программ из Примеров 1, 3 и 7. Выполните компиляцию и запуск программ.

2.Разработайте структуру, содержащую сведения о результатах ЕГЭ по предмету: Фамилия, Имя, Отчество, Число баллов по первому предмету, Число баллов по второму предмету, Число баллов по третьему предмету. Разработайте функцию, определяющую результат поступления абитуриента по заданному проходному баллу. Введите сведения об N абитуриентах и выведите результаты зачисления по образцу (данные, введенные пользователем, выделены жирным шрифтом):

Введите проходной балл на специальность: 255

Введите количество абитуриентов: 5

 

Сведения о 1 абитуриенте

Фамилия: Петров

Имя: Федор

Отчество: Степанович

Число баллов по первому предмету: 84

Число баллов по второму предмету: 76

Число баллов по третьему предмету: 95

Результат: зачислен

...

3.Разработайте структуру, описывающую комплексное число. Разработайте функции, выполняющие с комплексными числами четыре арифметические операции (+, -, *, /). Введите два комплексных числа и знак операции. Выведите результат.

Домашние задания

1.Наберите коды программ из Примеров 2, 4, 5 и 6. Выполните компиляцию и запуск программ.

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

3.Разработайте структуру, описывающую товар в продовольственном магазине: Наименование Товара, Цена (руб.), Количество, Скидка1 (в %), Скидка2 (в %), Скидка3 (в %). Разработайте функцию, преобразующую цену товара с учетом системы скидок: если стоимость покупки данного наименования товара больше 100 рублей, то действует Скидка1, при превышении 500 рублей – Скидка2, при превышении 1000 рублей – Скидка3. Введите и преобразуйте сведения о трех товарах.

 









Дата добавления: 2015-02-16; просмотров: 726;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.019 сек.