Лабораторная работа №1 Вариант 16
.docЛипецкий государственный технический университет
Кафедра автоматизированных систем управления
Лабораторная работа №1
по объектно-ориентированному программированию
Реализация класса «Матрица» («Множество»)
|
Студент |
|
|
|
Филатов А.А. |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-09-2 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Овчинников В.В. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2012
1. Задание
Изучить базовые понятия объектно-ориентированного программирования и получить практические навыки разработки простейших классов, переопределения операций классов.
Вариант 16. Реализовать на языке C++ класс "Булева матрица" такой, чтобы операцию исключающего ИЛИ двух матриц и присвоение результата третьей переменной-матрице можно было осуществить одной строкой C=A^B, как во время объявлении переменной C, так и после.
-
Краткое описание реализованного класса
class BoolMatrix{
public:
//Заполнение матрицы случайными значениями
void fillRand();
//Ввод с клавиатуры
BoolMatrix inputFromKeyboard();
//вывод матрицы
void output();
//получить размер матрицы
int getN();
//установить значение элемента p[i][j]=value
void setValue(int i, int j, bool value);
//получить значение p[i][j]
bool getValue(int i, int j);
//перегрузка оператора исключающего или
BoolMatrix operator^(BoolMatrix &right);
//конструктор копирования
BoolMatrix(BoolMatrix &a);
//переопределение операции присваивания
BoolMatrix & operator = (const BoolMatrix & other);
//конструктор
BoolMatrix(int _n = 5);
//деструктор
~BoolMatrix();
private:
//указатель для хранения матрицы
bool **p;
//размер матрицы
int n;
};
3. Исходный текст программы
#include <iostream>
#include <time.h>
using namespace std;
class BoolMatrix
{
public:
//Заполнение матрицы случайными значениями
void fillRand()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
p[i][j] = rand() % 2;
}
//Ввод с клавиатуры
BoolMatrix inputFromKeyboard()
{
int n, temp;
bool success = false;
do
{
cin.clear();
//очистка буферов
_flushall();
cout << "Input n:" << endl;
cin >> n;
cout << endl;
if(cin.fail() || n <= 0)
cout << "Incorrect input. Please try again:" << endl;
else
success = true;
}
while(!success); //контроль ввода
BoolMatrix t(n);
for(int i=0; i<n;i++)
for(int j=0;j<n;j++)
{
success = false;
do
{
cin.clear();
//очистка буферов
_flushall();
cout << "Input [" << i << "][" << j << "]" << endl;
cin >> temp;
if(cin.fail() || (temp!=0 && temp!=1))
cout << "Incorrect input. Please try again:" << endl;
else
success = true;
}
while(!success); //контроль ввода
t.setValue(i,j,temp);
}
return t;
}
//вывод матрицы
void output()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout << p[i][j] << "\t";
cout << endl;
}
cout << endl;
}
//получить размер матрицы
int getN()
{
return n;
}
//установить значение элемента p[i][j]=value
void setValue(int i, int j, bool value)
{
p[i][j] = value;
}
//получить значение p[i][j]
bool getValue(int i, int j)
{
return p[i][j];
}
//перегрузка оператора исключающего или
BoolMatrix operator^(BoolMatrix &right)
{
int a = n,b = right.getN();
if(a != b)
return NULL;
BoolMatrix temp(n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
temp.setValue(i,j,p[i][j]^right.getValue(i,j));
return temp;
}
//конструктор копирования
BoolMatrix(BoolMatrix &a)
{
n = a.getN();
p=new bool*[n];
for(int i=0;i<n;i++)
{
p[i] = new bool[n];
for(int j=0;j<n;j++)
{
p[i][j]=a.getValue(i,j);
}
}
}
//переопределение операции присваивания
BoolMatrix & operator = (const BoolMatrix & other)
{
if (this != &other) // защита от самоприсваивания
{
bool **new_p;
new_p = new bool*[other.n];
for(int i=0;i<other.n;i++)
new_p[i]=new bool[other.n];
//копируем содержимое
for(int i=0;i<other.n;i++)
for(int j=0;j<other.n;j++)
new_p[i][j] = other.p[i][j];
for(int i=0;i<n;i++)
delete p[i];
delete p;
p = new_p;
n = other.n;
}
return *this;
}
//конструктор
BoolMatrix(int _n = 5)
{
p = new bool*[_n];
for(int i=0;i<_n;i++)
p[i]=new bool[_n];
n=_n;
}
//деструктор
~BoolMatrix()
{
for(int i=0;i<n;i++)
delete p[i];
delete p;
}
private:
//указатель для хранения матрицы
bool **p;
//размер матрицы
int n;
};
int main()
{
bool exit = false;
while(!exit)
{
int t;
bool success = false;
do
{
cout << "What do you want to do?" << endl << "1. Run" << endl << "2. Exit" << endl;
cin >> t;
if(cin.fail() || (t!=1 && t!=2))
cout << "Incorrect input. Please try again:" << endl;
else
success = true;
}
while(!success);
switch(t)
{
case 1:
{
BoolMatrix C;
srand (time(NULL));
/*A.fillRand();
B.fillRand();*/
cout << "Matrix A" << endl;
BoolMatrix A = A.inputFromKeyboard();
cout << "Matrix B" << endl;
BoolMatrix B = B.inputFromKeyboard();
cout << "Matrix A" << endl;
A.output();
cout << "Matrix B" << endl;
B.output();
//после объявления переменной
C = A ^ B;
if(C.getN() > 0)
{
cout << "C = A ^ B" << endl;
C.output();
//во время объявления переменной
BoolMatrix D = A ^ B;
cout << endl << "Matrix D = A ^ B" << endl;
D.output();
}
else
{
cout << "The sizes of matrixes don't match" << endl;
}
}
break;
default:
exit = true;
break;
}
}
}
4. Контрольный пример