Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 11 Структуры 2015.doc
Скачиваний:
132
Добавлен:
29.02.2016
Размер:
117.76 Кб
Скачать

Динамический массив структур

С помощью операции new можно создать динамический массив структур:

struct Point{

float x, y;

};

int n; cin>>n; Point * uk = new Point [n];

Переменной-указателю uk присваивается адрес начала массива структур. Доступ к полям i-й структуры осуществляется следующим образом:

for(int i = 0; i < n; i++){ //Ввод координат n точек

in>>uk->x>>uk->y; uk++; // или cin>>uk[i].x >>uk[i].y;

}

Ссылка на структуру

Для структур, как и для простых переменных, можно использовать ссылочный тип. Например:

Point pp; Point & spp = pp;

После такого объявления spp и pp – это два синонимa одной и той же переменной структурного типа Point (структурный тип Point определён выше). Поэтому если изменить поле x или y структуры pp, то изменится соответствующее поле структуры spp.

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

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

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

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

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

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

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

func(t,....);

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

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

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

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

Point t;

func(t,....);

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

  1. 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;

}

8