// Set.h Объявление класса TSet
#ifndef SET_H
#define SET_H //Предотвращает несколько include
class TElem;
typedef TElem* PTElem;
typedef PTElem* PPTElem;
class TSet;
typedef TSet* PTSet;
class TSet {
private:
int max;
int index; //индекс массива множества
PPTElem set; //Указатель на массив указателей на PTElem
protected:
virtual int CompareElem(PTElem p1, PTElem p2) = 0;
public:
TSet(int n)
{ max=n; index=0; set=new PTElem[n]; }
virtual ~TSet() { delete[] set; }
void AddElem(PTElem p);
int HasElem(PTElem p);
};
#endif //SET_H
// Set.cpp Реализация класса TSet
#include <iostream.h>
#include <stdlib.h>
#include "set.h"
// Добавляет элемент в множество
void TSet::AddElem(PTElem p)
{
if (set == NULL) {
cout << endl << "ERROR: Out of memory";
exit(1);
}
if (index>= max) {
cout << endl << "ERROR: Set limit exceeded";
exit(1);
}
set[index] = p;
++index;
}
//Возвращает истину, если элемент, адресуемый р, находится в множстве
int TSet::HasElem(PTElem p)
{
if (set == NULL)
return 0; //В пустом множестве нет элементов
for( int i=0; i<index; i++)
if(CompareElem(p,set[i])==0)
return 1;
return 0;
}
// TSet.cpp Тестирование класса TSet
#include <iostream.h>
#include <string.h>
#include "set.h"
class TElem {
private:
char *sp; //Указатель на элемент-строку
public:
TElem(const char *s) {sp = strdup(s);}
virtual ~TElem() {delete sp;}
virtual const char *GetString(void) {return sp;}
};
class TMySet: public TSet {
protected:
virtual int CompareElem(PTElem p1, PTElem p2);
public:
TMySet(int n): TSet(n) {}
};
void Test(const char *s, PTSet setp);
void main()
{
TMySet array(10); //Множество из 10 объектов TElem
array.AddElem(new TElem("Sep"));
array.AddElem(new TElem("Apr"));
array.AddElem(new TElem("Jun"));
array.AddElem(new TElem("Nov"));
Test("Jun",&array);
Test("Feb",&array);
Test("Sep",&array);
Test("Nov",&array);
Test("Apr",&array);
Test("Jul",&array);
}
//Сообщает, принадлежит ли строка s множеству setp
void Test(const char *s, PTSet setp)
{
TElem testElem(s);
if (setp->HasElem(&testElem))
cout << s << " is in the set " << endl;
else
cout << s << " is not in the set " << endl;
}
// Возвращает 0, если два элемента идентичны, иначе не нуль
int TMySet::CompareElem(PTElem p1, PTElem p2)
{
return (strcmp(p1->GetString(), p2->GetString()));
}
