Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л_9 (2 пары) Структура+.doc
Скачиваний:
8
Добавлен:
05.11.2018
Размер:
119.3 Кб
Скачать

Использование структур

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

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

  • Создаваемый тип данных не имеет собственного поведения. То есть объект такого типа рассматривается как пассивный набор данных.

  • Члены данных создаваемого типа данных не могут находиться во взаимно противоречивом состоянии. То есть любая комбинация значений членов структуры является допустимой.

Для более сложных пользовательских типов данных в языке C++ используются классы.

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

Пример 1.

struct Point { int x,y;};

Point GetCursorPosition()

{

Point cursor;

return cursor;

}

В этом случае вызывающая функция будет получать результат типа Point, содержащий два значения – координаты x и y курсора.

Пример 2.

void DisplayCursorInfo()

{

Point cursor;

cursor = GetCursorPosition();

cout << cursor.x;

cout << cursor.y;

}

В качестве типов членов структуры могут использоваться ранее объявленные пользовательские типы.

Например, вместо использования структуры вида:

Пример 3.

struct Box3

{

bool visible;

double x_center, y_center, z_center;

double x_size, y_size, z_size;

};

Можно воспользоваться объявлением структуры vec3 и написать:

Пример 4.

struct box {

bool visible;

vec3 center;

vec3 size;

};

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

Пример 5.

void Display(const Box3& box) {

if ( box.visible) {

cout << “Center: (“ << box.center.x << “,” <<

box.center.y << “,” <<

box.center.z << “)” << endl;

}

}

Объекты структур можно присваивать, передавать в качестве аргументов и возвращать в качестве значений функций. Другие операторы (такие как == и != не определены). Объекты структур могут являться элементами массивов.

Необходимо использовать структуры для описания пользовательских типов данных во всех случаях, когда это позволяет улучшить читаемость программы.

Пример 6. Используя тип структура для передачи массивов, подсчитать в каждой строке mn – матрицы суммы абсолютных величин элементов.

Для решения этой задачи создана функция sum_abs_in_rows, аргументом которой является структура Massiv_2, а тип результата – структура Massiv_1.

#include <iostream.h>

#include <iomanip.h>

#include <stdlib.h>

#include <conio.h>

const int nElem = 20;

struct Massiv_2{int Rows, Cols; float ar2[nElem][nElem];};

struct Massiv_1{int Cols; float ar1[nElem];};

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

Massiv_2 init (int m, int n); // инициализация двухмерного массива;

void out2 (Massiv_2 mas2); // вывод элементов двухмерного массива;

float absF (float x) { return x < 0 ? -x : x;} /* модуль вещественного числа; */

Massiv_1 sum_abs_in_rows (Massiv_2 mas2); /* суммы модулей в строках; */

void out1(Massiv_1 mas1); // вывод элементов одномерного массива.

void main(void)

{ clrscr();

randomize();

int M, N;

cout<<"Rows "<<"(<="<<nElem<<"): ";cin>>M;

cout<<"Cols "<<"(<="<<nElem<<"): ";cin>>N;

// Инициализируем двумерный массив псевдослучайными числами:

Massiv_2 m2= init(M,N);

// Выводим на экран элементы двумерного массива:

out2(m2);

// Формируем одномерный массив из сумм модулей элементов в строках

// двухмерного массива:

Massiv_1 m1 =sum_abs_in_rows(m2);

// Выводим полученный массив на экран:

out1(m1);

getch();

}

// Объявление функций.

Massiv_2 init(int m, int n)

{Massiv_2 mas2; mas2.Rows = m; mas2.Cols = n;

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

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

mas2.ar2[i] [j] = (float)(random(30) - 15) / 10;

return mas2;

}

void out2(Massiv_2 mas2)

{for(int i = 0; i < mas2.Rows; i++)

{for(int j = 0; j < mas2.Cols; j++)

cout << setprecision(2) << setw(5) << mas2.ar2[i] [j];

cout<<"\n";

}

}

Massiv_1 sum_abs_in_rows(Massiv_2 mas2)

{ Massiv_1 mas1;

float S;

mas1.Cols = mas2.Rows;

for(int i = 0; i<mas1.Cols; i++) mas1.ar1[i] = 0;

int k = -1;

for(int i = 0; i<mas2.Rows; i++)

{ S=0; ++k;

for(int j=0; j < mas2.Cols; j++) mas1.ar1[k] += absF(mas2.ar2[i] [j]);

}

return mas1;

}

void out1(Massiv_1 mas1)

{cout<<"\n";

for(int i = 0; i < mas1.Cols; i++)

cout << setprecision(2) << setw(5) << mas1.ar1[i]; }

Результат работы программы: