Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_2_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
217.09 Кб
Скачать

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

С помощью операции 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 точек

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

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

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

Point pp;

Point & Spp=pp;

Причем структура pp к этому времени должна быть объявлена. После такого объявления Spp и pp – это два синонимa одной и той же переменной структурного типа Point.

Поэтому если изменить поле x или y структуры pp, то изменится соответствующее поле структуры Spp.

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

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

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

Пусть заголовок функции имеет вид:

void Func( Point str, .....)

Многоточие означает, что кроме параметра типа структуры функция может иметь и другие параметры.

В вызывающей функции объявляем переменную структурного типа, определяем ее поля и вызываем функцию Func:

Point p;

cin>>p.x >>p.y;

Func (p,....);

..........

При таком способе передачи параметров структуры str и p занимают разные участки памяти и при вызове функции Func значения полей структуры p копируются в соответствующие поля структуры str. Поэтому изменение полей структуры str не влечет изменение полей структуры p.

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

void Func( Point & str, .....)

В самой функции доступ к полям структуры str выполняется с помощью операции "."

В вызывающей функции объявляем переменную структурного типа и вызываем функцию Func:

Point p;

Func (p,....);

..........

В этом случае структуры str и p занимают один и тот же участок памяти, т.е. одна и та же структура в функции Func называется str, а в вызывающей функции-p. Поэтому изменение полей структуры str означает изменение соответствующих полей структуры p.

В качестве параметра можно использовать указатель на структуру. Тогда заголовок функции будет таким:

void Func( Point * str, .....)

В самой функции доступ к полям структуры str выполняется с помощью операции "->" и операции разыменования.

В вызывающей функции объявляем переменную структурного типа и вызываем функцию Func:

Point p;

Func ( & p,.......);

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

Point *p=new Point;

Func ( p,.......);

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

Пример 9.1. Сформировать статический массив структур, каждый элемент которого содержит информацию о студенте:

-фамилия, имя, отчество (вводим);

-массив оценок (вводим);

-средний балл (вычисляем)

const m=4; //Количество оценок

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

struct Student

{ char name[10];

int mark[m];

float mid;

};

void Input(Student * mas, int ,int); //Функция ввода информации

void Show( Student * mas, int); //Функция вывода информации

float MyMid( int *mas, int); //Функция вычисления среднего балла

int main()

{ const n=5; //Количество студентов

Student str[n]; //Статический массив структур

Input (str, n, m);

Show (str, n);

getch();

return 0;

}

void Input(Student *mas, int size1, int size2)

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

{ cout<<"name ";

cin>>mas[i].name;

cout<<"mark ";

for( int j=0; j<size2; j++)

cin>>mas[i].mark[j];

mas[i].mid=MyMid(mas[i].mark, size2);

}

}

void Show (Student * mas, int size1)

{ cout<<"Список студентов"<<endl;

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

cout<<mas[i].name<<" "<<mas[i].mid<<endl;

}

float MyMid(int *mas, int size2)

{ float s=0;

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

s+=mas[i];

s /=size2;

return s;

}

Пример 9.2. Сформировать динамический массив структур. Каждый элемент массива содержит информацию о точке на плоскости (координаты точки и расстояние точки от начала координат). Найти точку, максимально удаленную от начала координат.

#include <conio.h>

#include <math.h>

#include <stdlib.h>

#include <stdio.h>

#include <iostream.h>

struct Point

{

float x,y;

float r;

};

void Input(Point *mas, int n);

int MyMax(Point *mas, int n);

void Show (Point * mas, int n);

int main()

{

int n;

cout<<"Задайте количество точек ";

cin>>n;

Point *p=new Point[n];//Объявляем динам. массив структур

Input (p, n);

cout<<"Maксимально удаленная точка "<<MyMax(p,n);

Show (p, n);

getch();

return 0;

}

void Input(Point *mas, int n)

{

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

{

cout<<"x= ";

cin>>mas[i].x;

cout<<"y= ";

cin>>mas[i].y;

}

}

void Show (Point * mas, int n)

{

cout<<"Точки:"<<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;

}

}

46