Программирование / си++ / 2Semestr / Lab_5v3 / Отчет
.docМинистерство Образования Российской Федерации
Пермский Государственный Технический Университет
Кафедра ИТАС
Лабораторная работа № 5
ПЕРЕГРУЗКА ОПЕРАЦИЙ
Вариант №3
Выполнил: Студент
группы АСУ 04-2
Заколодкин К.А.
Проверил: Ноткин А.М.
Пермь 2005
Задание варианта № 3
-
Определить АТД множество с элементами типа char. Реализовать в нем конструкторы, деструктор, функции Input (ввод с клавиатуры) и Print (вывод на экран), перегрузить операцию присваивания.
-
Дополнить определение класса перегруженными операциями:
- удалить элемент из множества (типа set-char);
> проверка на подмножество;
!= проверка множеств на неравенство.
-
Реализовать эти операции.
Определение класса:
//Class.h
//--------------------------------------------------------------
#ifndef CLASS
#define CLASS 1
#include <iostream.h>
#include <string.h>
//--------------------------------------------------------------
class Mnozhestvo
{
char* beg;
int len;
int max_s;
public:
Mnozhestvo();
Mnozhestvo(int);
~Mnozhestvo();
void Print();
bool ToBe(char);
void Insert ();
Mnozhestvo& operator=(const Mnozhestvo& );
bool operator>(Mnozhestvo&);
void operator- (int);
void operator- (char);
bool operator != (Mnozhestvo&);
};
//--------------------------------------------------------------
#endif
Обоснование включения в класс нескольких конструкторов, деструктора и операции присваивания.
-
Два конструктора - для создания удобного нам объекта ( в зависимости от нужного кол-ва элементов – определенное или максимальное ).
-
Деструктор - для удаления динамической памяти.
-
Операция присваивания – для предотвращения копирования поля char* beg в побитовом копировании.
Реализация перегруженных операций
Mnozhestvo & Mnozhestvo::operator=(const Mnozhestvo& Obj)
{
if(this==&Obj) return *this;
delete[] beg;
len=Obj.len;
beg=new char [len];
strcpy(beg,Obj.beg);
return *this;
}
//--------------------------------------------------------------------
bool Mnozhestvo::operator>(Mnozhestvo& Obj)
{
int Len=0;
if(len<Obj.len) return false;
for(int i=0;i<len;i++)
{
if(ToBe(Obj.beg[i])) Len++;
}
if (Len==Obj.len) return true;
return false;
}
//--------------------------------------------------------------------
void operator -(Mnozhestvo& Obj , int n)
{
int i,j=0;
Obj.len-=1;
char* t=new char[Obj.len];
for(i=0;i<Obj.len+1;i++)
{
if(i!=(n-1))
{
t[j]=Obj.beg[i];
j++;
}
}
delete[] Obj.beg;
Obj.beg=t;
}
//--------------------------------------------------------------------
void operator -(Mnozhestvo& Obj, char c)
{
c=ToRus(c);
if(!Obj.ToBe(c))
Rus(" Такого элемента нет ! \n");
else
{
int i,j=0;
Obj.len-=1;
char* t=new char[Obj.len];
for(i=0;i<Obj.len+1;i++)
{
if(Obj.beg[i]!=c)
{
t[j]=Obj.beg[i];
j++;
}
}
delete[] Obj.beg;
Obj.beg=t;
}
}
//--------------------------------------------------------------------
bool operator != (Mnozhestvo& Obj1,Mnozhestvo& Obj2)
{
if(Obj1.GetLen()!=Obj2.GetLen()) return true;
if(strcmp(Obj1.GetBeg(),Obj2.GetBeg())==0) return false;
return true;
}
//--------------------------------------------------------------------
Функция Main ()
#include "Class.h"
void Rus(char*);
void main()
{
Mnozhestvo A(2),B(2),C(3);
A.Insert();// ц,у
B.Insert();// к,ц
C.Insert();// у,к,ц
A=C;
if(A>B) Rus("Подмножество найдено! \n");
A-'ц';// удаляет элемент ц
A-2; // удаляет элемент №2
A.Print();
if(A!=B) C.Print();
}
Результат работы
Введите 2 символа
ц
у
Введите 2 символа
к
ц
Введите 3 символа
у
ц
к
Подмножество найдено!
Множество :
у
Множество :
у
ц
к
Press any key to continue