Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №1 Вариант 16

.doc
Скачиваний:
23
Добавлен:
20.06.2014
Размер:
121.34 Кб
Скачать

Липецкий государственный технический университет

Кафедра автоматизированных систем управления

Лабораторная работа №1

по объектно-ориентированному программированию

Реализация класса «Матрица» («Множество»)

Студент

Филатов А.А.

подпись, дата

фамилия, инициалы

Группа

АС-09-2

Принял

Овчинников В.В.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2012

1. Задание

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

Вариант 16. Реализовать на языке C++ класс "Булева матрица" такой, чтобы операцию исключающего ИЛИ двух матриц и присвоение результата третьей переменной-матрице можно было осуществить одной строкой C=A^B, как во время объявлении переменной C, так и после.

  1. Краткое описание реализованного класса

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. Контрольный пример

10