Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. II. Организационные структуры управления и тенденции в их развитии
  2. III. Проблема сознания, социальной структуры и насилия
  3. III. Разработка новой организационной структуры «Дормаша».
  4. Адаптивные структуры управления
  5. Анализ композиционной структуры градостроительных объектов
  6. Анализ логической структуры текстов рассуждений. Приемы их построения
  7. Анализ наличия, состава и структуры имущества организации.

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

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

1. По значению. З аголовок функции в этом случае имеет вид:

void func (Point st,.....)

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

Point t; cin>>t.x>>t.y;

func(t,....);

При передачи аргументов функции по значению структуры st и t занимают разные участки памяти. Поэт ому изменение полей структуры st не влечет изменение полей структуры t.

2. По ссылке. Если функция должна изменить поля структуры, то можно использовать ссылку на структуру. Её прототип в этом случае имеет вид:

void func (Point & rst,.....);

В самой функции доступ к полям структуры r st выполняется с помощью операции точка (.). В вызывающей функции объявляем переменную структурного типа t и вызываем функцию func():

Point t;

func(t,....);

Структуры rst и t занимают один и тот же участок памяти, поэтому изменение полей структуры rst означает изменение соответствующих полей структуры t.

3. C помощью указателя. В качестве параметра функции можно использовать указатель на структуру. Её прототип будет иметь вид:

void func (Point * p,.....);

В самой функции доступ к полям структуры выполняется с помощью операции стрелка (->) и операции разыменования (*). В вызывающей функции следует объявить переменную структурного типа и вызвать функцию func() следующим образом:

Point st;

func(&st,.......); // указываем адрес структуры

Можно также в вызывающей функции определить указатель на структуру, проинициализировать его и передать в функцию func():

Point * q = new Point;

func(q,.......); // в этом случае & не нужен

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

// Пример 11.1. Определить структуру, полями которой являются

// числитель и знаменатель рациональной дроби. Создать функцию

// для сложения двух дробей. Функция возвращает число.

#include <iostream>

using namespace std;

struct Rac {

double a;

double b;

};

double sum (Rac s1, Rac s2){ //функция сложения дробей

double z = ((s1.a * s2.b) + (s1.b * s2.a)) / (s1.b * s2.b);

return z; // функция возвращает число

}

int main() {

Rac st1, st2; // объявление структур st1, st2

cout<<"Vvedi a, b for st1: "; cin>>st1.a>>st1.b; // ввод через пробел

cout<<"Vvedi a, b for st2: "; cin>>st2.a>>st2.b;

double rez = sum(st1, st2); cout<<"rez= "<<rez<<endl;

system("pause");

}

// Пример 11.2. Определить структуру, полями которой являются

// числитель и знаменатель рациональной дроби. Создать функцию

// для сложения двух дробей. Функция возвращает структуру.

#include <iostream>

using namespace std;

struct Rac {

double a, b;

};

Rac sum (Rac s1, Rac s2){ //функция сложения дробей

Rac t;

t.a = (s1.a*s2.b)+(s1.b*s2.a); t.b = s1.b*s2.b;

return t; // функция возвращает структуру

}

int main(){

Rac st1, st2, rez; // объявление структур st1, st2

cout<<"Vvedi a, b for st1: "; cin>>st1.a>>st1.b;

cout<<"Vvedi a, b for st2: "; cin>>st2.a>>st2.b;

rez = sum(st1, st2);

cout<<"rez= "<<rez.a<<'/'<<rez.b<<endl;

}

// Пример 11.3. Сформировать динамический массив структур,

// элементы которого содержат информацию о точке на плоскости

// (координаты точки и расстояние точки от начала координат).

// Найти точку, максимально удаленную от начала координат.

#include <math.h>

#include <iostream>

using namespace std;

struct Point {

float x,y;

float r;

};

void input (Point * mas, int n); // прототип функции input()

int myMax(Point * mas, int n); // прототип функции myMax()

void show(Point * mas, int n); // прототип функции show()

int main() {

int n;

cout<<"Vvedite kolichestvo tochek: "; cin>>n;

Point *p = new Point[n]; // динамический массив структур

input(p, n); // вызов input()

cout<<"index max udalen. Tochki = "<<myMax(p, n)<<endl;

show(p, n); // вызов show()

system("pause");

}

void input (Point * mas, int n){

for(int i = 0; i < n; i++){

cout<<"x y = "; cin>>mas[i].x>>mas[i].y;

}

}

void show (Point * mas, int n){

cout<<"Tochki:"<<endl;

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

cout<<mas[i].x<<" "<<mas[i].y<<" "<<mas[i].r<< endl;

}

int myMax (Point * mas, int n){

int imax = 0;

for (int i = 0; i < n; i++){

mas[i].r = sqrt (mas[i].x * mas[i].x + mas[i].y * mas[i].y);

if (mas[i].r > mas[imax].r) imax = i;

}

return imax;

}


Дата добавления: 2015-08-03; просмотров: 52 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Операции над переменными структурного типа| Рациональное неведение

mybiblioteka.su - 2015-2024 год. (0.011 сек.)