Работа с матрицей в методах класса

При работе с матрицей в методах класса необходимо руководствоваться следующими правилами и рекомендациями.

Матрица объявляется в классе в качестве поля с максимальными первой и второй размерностями, в качестве которых можно использовать глобальные константы. Реальное количество строк и столбцов также объявляем, как два поля класса, и определяем их с помощью конструктора. Желательно в нём предусмотреть проверку, не превосходят ли реальные размерности матриц их наибольшие значения.

В методах класса матрица и её размерности в качестве параметров не записываются. Значения элементов матрицы определяются в каком-нибудь из методов класса одним из описанных в § 1 способов.

Для использования методов такого класса создаём объект.

Ту же задачу, что и в предыдущем примере, решим с помощью функций класса:

const

unsigned n1max=5, n2max=10;

class MatrClass

{

double x[n1max][n2max];

unsigned size1, size2;

public:

MatrClass (unsigned n1, unsigned n2)

{ if (n1<=0 || n1>n1max) n1=n1max;

if (n2<=0 || n2>n2max) n2=n2max;

size1=n1; size2=n2;

}

void INP1( );

/* Поля класса (матрицу и её две размерности) в качестве параметров методов не записываем! Размерности передаём с помощью конструктора, а матрицу получаем с помощью метода INP1.*/

void OUT1( );

void SORT1( int );

} ;

void MatrClass::INP1()

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

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

x[i][j]=random(20)-10;

}

void MatrClass::SORT1(int k)

{ int i,j,m,mn,N;

for (m=0;m<size1-1;m++)

{ mn=x[m][k]; N=m;

for (i=m+1;i<size1;i++)

if (x[i][k]<mn)

{ mn=x[i][k]; N=i;

}

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

{ double t; t=x[m][j];

x[m][j]=x[N][j]; x[N][j]=t;

}

}

}

void MatrClass::OUT1()

{ int X,j,Y=wherey();

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

for (X=1, j=0; j<size2; j++, X+=7)

{ gotoxy(X,Y);

cout<<x[i][j];

}

cout<<endl;

}

int main()

{

const int N1=3, N2=6; int k;

MatrClass ObjMatr ( N1, N2);

ObjMatr.INP1(); cout<<"\nOld matrix\n";

ObjMatr.OUT1();

cout <<"\nInput the number of collumn for sorting =>";

//Ввод номера столбца, по которому будем сортировать,

//с контролем ввода

while(1)

{ cin>>k;

if (k>=0 && k<N2) break;

cout<<"k>=0 && k<"<<N2<<" Repeat ";

}

ObjMatr.SORT1(k);

cout<<"\nMatrix after sorting\n";

ObjMatr.OUT1();

getch();

return 0;

}

Структуры

 

Все переменные, которые мы использовали до настоящего времени, относились к одному определенному типу, они были или символьными (char), или строковыми (char St[15]), или целочисленными (int), или с плавающей точкой (float). Даже массивы независимо от их размерности содержали переменные только одного типа. Все встречавшиеся нам переменные были простыми, то есть такими переменными, значения которым присваиваются путем простого использования имени переменной в инструкциях ввода данных или присваи-

вания.

Сейчас рассмотрим еще один структурированный тип данных: структуры.

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

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

Формат описания структуры имеет вид:

struct [имя_типа_структуры]

{

//Описание_элементов

<тип_1> <элемент_1>;

<тип_2> <элемент_2>;

…………………….

<тип_п> <элемент_п>;

} [список переменных];

 

где

struct – служебное слово;

[имя_типа_структуры] – имя нового пользовательского типа;

<тип_1>…<тип_п> - известные типы данных;

<элемент_1><элемент_п> - идентификаторы, называемые полями структуры;

[список переменных] – список переменных имеющих тип данной структуры.

 

Например:

1) создать новый тип данных с именем CD, который содержит пять элементов информации: три строки, одно значение типа float и одно целочисленное значение.

struct CD

{

char name[20]; //имя диска

char description[40]; //описание

char category[12]; //категория

float cost; //цена

int number; //номер

};

……………

CD disc[10]; // массив из 10-ти дисков

……………

Размер области памяти для структуры равен 78 байт (это можно определить при помощи функции sizeof(CD) ), а для disk[10] равен 780 байт.

Данную структуру можно использовать для создания картотеки CD дисков.

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

struct complex

{

float x, y;

} z1,z2,z3;

3) создать новый тип данных для создания базы данных по автомобилям и массив из 100 автомобилей:

struct TAuto

{

char FIO[20]; //фам., имя, отч. владельца

char Adres[40]; //адрес владельца

char Marka[25]; //марка авто

char Number[10]; //номер авто

float V; //объем двигателя

};

……………

TAuto auto[100];

……………

 

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

struct pointer

{

int Data; //поле данных динамической структуры

pointer *next; //поле указателя

};

…….

pointer ph,pk; //указатели на вершину, конец дин. структуры

…….

 

5) создать новый тип данных для хранения данных о человеке:

struct { char Name [20]; // Имя char Surname [20]; // Фамилия int age; // возраст char adres; // адрес char passport[11]; //данные паспорта} Man, Female;

 

Работа со структурами

 

1) Инициализация полей структуры.Если начальные значения полей структуры известны, то их можно задать при описании структуры:

struct

{

char fio[30];

int date, code;

double salary;

}worker = {"Страусенко", 31, 215, 34.55};

struct complex

{

float x,y;

} Z [2][3] = {

{{1, 1}, {1, 1}, {1, 1}}, // строка 1. TO есть массив Z[0]

{{2, 2}, {2, 2}, {2, 2}} // строка 2. то есть массив Z[1]

};

2) Доступ к полям структуры. Доступ к элементам (компонентам, полям) структуры осуществляется двумя способами:

* с помощью оператора связывающей точки (оператора точки) "." при непосредственной работе со структурой;

* при использовании указателей на структуры с помощью стрелки "–>".

Общий формат доступа к элементам структуры имеет следующий вид:

 

<имя_переменной_структуры>.<имя_поля>;<имя_указателя_на_структуру>–><имя_поля>;

<*имя_указателя_на_структуру>.<имя_поля>;

 

Например:

* printf(“Введите данные первого диска:);

printf(“Наименование-->”);

scanf(“%s”,&disk[0].name);

printf(“Описание-->”);

scanf(“%s”,&disk[0].description);

…………

printf(“Стоимость-->”);

scanf(“%f”,&disk[0].coast);

………..

 

* printf();

scanf();