Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2011, 16:58   #1
Nadinka______
 
Регистрация: 07.09.2011
Сообщений: 4
По умолчанию [C++]перегрузка

Класс - множество set.

Код:
class set
{           
    public:
        set():power(0),rear(NULL){};
        set(const set & s);
        set(int p);
        set(int * a, int sz); 
        ~set();
        friend ostream & operator <<(ostream & out, const set & s);
        set & operator --(); //prefix
        set & operator --(int); //postfix
        operator int() { return power; }
        short operator == (const set & s) const;
        friend set operator +(int el, const set & s);   
        set operator & (const set & s2)const;          
        set & operator -= (const int el);                                   
 private:
        int power;        
        struct element * rear;
        void push(int val);
        struct element * contains(int v) const;
        void delEl(struct element * p);
};
void set::push(int val)                                                         
{ 
    struct element * newEl = new element;
    newEl->v = val;
	power++;
    if (rear)                       //если список не пустой
    {
        newEl->next = rear->next;
        rear->next = newEl;
        rear = newEl;             
    }
    else                            
    {
        newEl->next = newEl;
        rear = newEl;
    }
}

set::set(int * a, int sz):power(0),rear(NULL)            
{
    push(a[0]);
    for (int i=1; i<sz; i++)
    {
        if (!contains(a[i]))
            push(a[i]);
    }   
}

struct element * set::contains(int val) const        
{
    if (!rear) 
        return 0;
    struct element * p = rear;
    do
    {
        if (p->v == val)
            return p;
        p = p->next;
    } while (p != rear);
    return NULL;
}

void set::delEl(struct element * p)
{
    power--;
    delete p;
}

set::set(const set & s):power(0),rear(NULL)     
{
    if (s.rear)
    {
        struct element * p = s.rear->next;
        do             
        {                               
            push(p->v);
            p = p->next;
        } while (p != s.rear->next);
    }
}

set::~set()
{
    if (power)                  
    {
        struct element * p;
        do                             
        {                                   
            p = rear->next;
            rear->next = p->next;
            delEl(p);
        } while (power);
    }
}

ostream & operator <<(ostream & out, const set & s)
{
    if (s.power == 0)          
    {
        out<<"Empty set"<<endl;
        return out;
    }
    int i;                      
    struct element * p = s.rear->next;
    out<<"power["<<s.power<<"]"<<endl;
    do
    {
        out<<p->v<<"   ";         
        p = p->next;
    } while (p != s.rear->next);
    out<<endl;
    return out;
}

set & set::operator --()                
{                    
    struct element * p = rear->next;
    rear->next = p->next;
    delEl(p);
    return (*this);
}

set & set::operator --(int)            
{
    *this -= rear->v;
    return (*this);
}

short set::operator == (const set & s) const
{
    if (power != s.power)                   
        return 0;
    if (power == 0)                         
        return 1;
    struct element * p = s.rear;
    do                                      
    {
        if (!contains(p->v))                
            return 0;                       
        p = p->next;
    } while (p != s.rear);
    return 1;                               
}

set set::operator & (const set & s2)const				//пересечение множеств
{
    
	if ((power == s2.power)&&(*this == s2))             
		return *this;
	set spike; set spike2; set newS;
    if ((power == 0) || (s2.power == 0))                
        return newS;
	struct element *p = rear->next;
	
	if (power <= s2.power)                     
	{
		do       
		{
			if (s2.contains(p->v))      
				newS.push(p->v);
		    p = p->next;
        } while( p != rear->next);
	}
	else
	{
		newS = s2 & *this;
	}
	return newS;
}

set & set::operator -=(const int el)  
{
	struct element *p = contains(el);
	if (p==NULL || power == 0)
		return *this;        
	if ((power == 1) & (p != NULL))        
	{
        delEl(rear);
        rear = NULL;
        return *this;
    }
	if (p == rear)                     
	{
        do 
        {
            p = p->next;                
        } while (p->next != rear);
        p->next = rear->next;
        delEl(rear);
        rear = p;
    }
    else
    {
        struct element *tmp = p->next;
        p->v = p->next->v;
        p->next = p->next->next;        
        if (tmp == rear)
            rear = p;
        delEl(tmp);
        
    }
	return *this;
}
Как мне сделать проверку на подмножество???
Nadinka______ вне форума Ответить с цитированием
Старый 13.09.2011, 16:59   #2
Nadinka______
 
Регистрация: 07.09.2011
Сообщений: 4
По умолчанию

Вот само задание:
Класс - множество set. Дополнительно перегрузить следующие операции: -- удалить элемент из множества (типа set-item); * - пересечение множеств; < - сравнение множеств; > - проверка на подмножество; int()- мощность множества.
Nadinka______ вне форума Ответить с цитированием
Старый 13.09.2011, 17:37   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А нафига было создавать класс set, если он и так уже реализован в STL? Возможно, конечно, там не совсем то, но...
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.09.2011, 19:16   #4
Nadinka______
 
Регистрация: 07.09.2011
Сообщений: 4
По умолчанию

Цитата:
А нафига было создавать класс set, если он и так
уже реализован в STL? Возможно, конечно, там не совсем то, но...
Задание контрольной работы
Nadinka______ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Перегрузка GLAM1 Общие вопросы C/C++ 7 01.04.2011 15:49
C++ Перегрузка GLAM1 Помощь студентам 3 31.03.2011 21:09
Перегрузка в C++ Паыел Общие вопросы C/C++ 0 07.12.2010 16:26
Перегрузка в С++ Tat-ka Помощь студентам 1 08.11.2009 03:26
Перегрузка nevermind_111 Общие вопросы .NET 2 14.10.2009 12:40