CPerson::CPerson(int iDay, int iMonth, int iYear)



: m_sFName(NULL)

, m_sSName(NULL)

, m_dBirthDate(iDay, iMonth, iYear)

{

TRACE("Constructor CPerson with parameters was called\n");

}

 

 


Перегрузка векторных и матричных операций

По мере увеличения размера программы средняя наработка на отказ постоянно уменьшается

Закон Мерфи

Цель работы – практически освоить программирование перегрузки операций на примере выполнения математических операций над векторами и матрицами (4 час.).

Задание

Разработайте консольное приложение, а если хотите – приложение с графическим интерфейсом пользователяJ, в котором реализуются операции над векторами и матрицами, оформленные как перегруженные «классовые» операции в соответствии с вашим индивидуальным заданием. Само собой разумеется, что вы должны разработать классы матриц и векторов и в них реализовать перегруженные операции. Для хранения значений элементов матриц и векторов необходимо использовать указатели.

Любое приложение должно предоставлять очеееень привередливому пользователю, например, тому же добрейшему преподуL, следующие бесплатные, т.е. даровые, услуги:

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

Ø возможность ввода размеров векторов, матриц и других параметров;

Ø реализовать перегруженную операцию [] доступа к элементам векторов и матриц;

Ø в каждом варианте задания необходимо реализовать перегруженные операции как компонентные функции, дружественные и глобальные;

Ø наглядный вывод, чтобы было понятно даже самому тупому юзеру, исходных данных и результатов выполнения операций в соответствии с доставшимся вам самым легким вариантом задания. Операции вывода значений векторов и матриц на монитор реализовать как перегруженные.

 

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


Обратите внимание, что здесь проиллюстрирована операция умножения матриц и результирующая матрица «настоящая».

Бесценные методические указания

Для того чтобы в описании и реализации своих классов можно было использовать, например, стандартный ввод и вывод с помощью потоков cin и cout, начните файл с таких объявлений:

// Файл Matrix.h

#pragma once

#include "stdafx.h" // Добавить

Using namespace std; // Добавить

Class CMatrix

{

//

};

 

Допустим, требуется выполнять операции над прямоугольной матрицей размером NxM, где N – число строк, а М – число столбцов. Тогда выделить память для этой матрицы можно так:

double **Mtr;

Mtr=new double * [N];

for(int i=0;i<N;i++) Mtr[i]= new double [M];

 

Соответственно, освободить память можно так:

for(int i=0;i<N;i++) delete [] Mtr[i];

delete []Mtr;

 

Можно, элементарно, выделить память и для треугольной матрицы (в первой строке N столбцов, а в последней – 1):

double **Mtr;

Mtr=new double * [N];

for(int i=0;i<N;i++) Mtr[i]= new double [N-i];

 

Реализация перегруженной операции доступа по индексу [] для вектора вам известна, а как ее реализовать для матрицы как двумерного массива? Операции [][] в языке С++ не существует! Как же быть, если требуется передать два индекса (строка и столбец) посредством одного параметра? Да например так:

int Index=i/*строка*/*1000+j/*столбец*/; // "Упаковка индексов"

int i=Index/1000,j=Index%1000; // "Распаковка индексов"

 

Еще можно номер строки хранить в двух старших байтах переменной типа int, а номер столбца – в двух младших. Достоинством такого подхода является возможность контроля номера строки и номера столбца, т.е. индексов двумерного массива.

Заметим, однако, что можно перегрузить операцию [] и таким образом:

double * CMatrix::operator [](int Index)

{          

return Mtr[Index];

}

 

В этом случае выражение Obj[i] возвращает указатель на i-тую строку матрицы, а Obj[i][j] – значение двумерного массива в i-той строке и j-том столбце. Другими словами, имеет место тождество Obj[i][j] == *(Obj[i]+j).

Сказанное относится не только к двумерным массивам, а и к многомерным. Однако при таком подходе сложнее контролировать корректность индексов.


Дата добавления: 2018-02-18; просмотров: 464; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!