Класс моделирующий множество Intset

Рубрика: C++, Дата: 1 March, 2013, Автор:
Tags:

Определите, реализуйте и протестируйте класс Intset (множество целых). Предоставьте операции объединения множеств, пересечения и симметричной разности.

Да интересная задача, такую задачку я вроде решал из 100 целых чисел из нулей или единиц.

Объединение множеств пересечение это когда встречаются две единицы, то выводиться 1, а кода два нуля то выводиться 0 и если ноль и один, то один.Объединение множеств симметричной разности – это когда два нуля, то один, а кода две единицы то 0, и кода 0 и 1, то тоже ноль вроде так хз? Но мы сделаем так и нас это не волнует, хоть даже мы и подменим понятия.

Начинаем создавать.

Будем делать по следующей схеме:

  • Объединение это (1:1-1, 1:0-1, 0:1-1, 0:0-0)
  • Пересечение это (1:1-0, 1:0-1, 0:1-1, 0-0-1)
  • Симметричная разность это (1:1-0, 0:0-1, 0:1-0, 1:0-0)

Ну что ж приступаем вот код класса Intset.h :

//opredelenie interfaica klacca
#ifndef INTSET_H
#define INTSET_H

class Intset
{
	int mass[100];
public:
	//konctryktor
	Intset();

	//function vuvoda
	void print();

	//ob6edinenie obed() (1:1-1,1:0-1,0:1-1,0-0)
	void obed(Intset &);

	//perecechenie per() (1:1-0,1:0-1,0:1-1,0-0-1)
	void per(Intset &);

	//cimetr raznoct6 raz() (1:1-0, 0:0-1, 0:1-0, 1:0-0)
	void raz(Intset &);
};

#endif

Дальше Intset.cpp :

//opredelenie klacca
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
using std::srand;
using std::rand;
#include <ctime>
using std::time;

#include "Intset.h"

Intset::Intset()
{
	srand(time(0));
	for(int i=0;i<100;i++)
	{
		mass[i]=rand()%2;
		//cout <<mass[i]<<' ';
	}
}

void Intset::print()
{
	for(int i=0;i<100;i++)
	{
		cout <<mass[i]<<' ';
	}
	cout <<endl;
}

//ob6edinenie obed()
void Intset::obed(Intset &a)
{
	for(int i=0;i<100;i++)
	{
		if(mass[i]==1||a.mass[i]==1)
		{
			mass[i]=1;
		}
	}
}

//perecechenie per() (1:1-0,1:0-1,0:1-1,0-0-1)
void Intset::per(Intset &a)
{
	for(int i=0;i<100;i++)
	{
		if(mass[i]==1&&a.mass[i]==0)
		{
			mass[i]=1;
		}
		else if(mass[i]==0&&a.mass[i]==1)
		{
			mass[i]=1;
		}
		else
		{
			mass[i]=0;
		}
	}
}

//cimetr raznoct6 raz() (1:1-0, 0:0-1, 0:1-0, 1:0-0)
void Intset::raz(Intset &a)
{
	for(int i=0;i<100;i++)
	{
		if(mass[i]==1&&a.mass[i]==1)
		{
			mass[i]=0;
		}
		else if(mass[i]==0&&a.mass[i]==0)
		{
			mass[i]=1;
		}
		else
		{
			mass[i]=0;
		}
	}
}

И сам код программы:

//klacc Intset mnojectvo celux
#include <iostream>
using std::cout;
using std::endl;

#include "Intset.h"

int main()
{
	Intset a;
	a.print();
	cout <<endl;
	sleep(2);//zaderjka vremeni
	Intset b;
	b.print();
	cout <<endl;
	a.obed(b);
	a.print();
	cout <<endl;
	a.per(b);
	a.print();
	cout <<endl;
	a.raz(b);
	a.print();

	return 0;
}

Все на этом я думаю все хватит.

Вроде простенькая задачка не знаю правильно ли мы ее сделали, но думаю сойдет. 🙂

Но тут еще есть продолжение ее

Нужно модифицировать класс Intset во множество узлов Node , где Node определяемая нами структура,

как то мне лень описывать скину ка я сразу код Intset.h

//opredelenie interfaica klacca
#ifndef INTSET_H
#define INTSET_H
struct Node
{
	//konctryktor
	Node(int a)
	:value(a),ptr(0)
	{
		//pyctoi konctryktor
	}
	int value;
	Node *ptr;//cledychii element
};

class Intset
{
	Node* firstPtr;//ykazatel6 na pervui element
	Node* lastPtr;//ykazatel6 na poclednii element
	int mass[100];//massiv mnojectvo
	
public:
	//konctryktor
	Intset();
	
	//dobavit6 element
	void insert(int);
	
	//ydalenie elementov
	void dell();
	
	//ydalenie helper
	void dellHelper(Node* ptr);
	
	//vuvod elementov
	void print1();
	
	//vuvod helper
	void print1Helper(Node* ptr);
	
	//function vuvoda
	void print();
	
	//ob6edinenie obed() (1:1-1,1:0-1,0:1-1,0-0)
	void obed(Intset &);
	
	//perecechenie per() (1:1-0,1:0-1,0:1-1,0-0-1)
	void per(Intset &);
	
	//cimetr raznoct6 raz() (1:1-0, 0:0-1, 0:1-0, 1:0-0)
	void raz(Intset &);
};

#endif

файл Intset.cpp

//opredelenie klacca
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
using std::srand;
using std::rand;
#include <ctime>
using std::time;

#include "Intset.h"

Intset::Intset()
:firstPtr(0),lastPtr(0)
{
	
	srand(time(0));
	//Node a(rand()%2);
	//firstPtr=new Node;
	
	for(int i=1;i<100;i++)
	{
		int a=rand()%2;
		insert(a);
		//insert(i);
		//exit(1);
		//cout <<i<<endl;
		mass[i]=a;
		//cout <<mass[i]<<' ';
	}
}

//dobavit6 element
void Intset::insert(int a)
{
	if(firstPtr==0)//cpicok pyctoi
	{
		//cout <<"Nety elementov"<<endl;
		firstPtr=new Node(a);//dobavl9em novui element
		lastPtr=firstPtr;//inicializ. poclednii element
		//exit(1);
	}
	else if(lastPtr!=0)//ne pyctoi
	{
		//cout <<"cpicok ne pyct"<<endl;
		Node* temp=new Node(a);//dobavl9em novui element
		lastPtr->ptr=temp;//adrecc vremennui
		lastPtr=temp;//dobavl9em element
	}
}

//ydalenie elementov
void Intset::dell()
{
	if(firstPtr==0)//cpicok pyctoi
	{
		cout <<"cpicok pyctoi"<<endl;
	}
	else if(firstPtr!=0)//cpicok ne pyctoi
	{
		Node* temp=firstPtr;
		dellHelper(firstPtr->ptr);//bydem nade9t6c9 ochictit pam9t6
		delete temp;//vucvobojdenie pam9ti
		firstPtr=0;
		lastPtr=0;
	}
}

//ydalenie helper
void Intset::dellHelper(Node* ptr)
{
	if(ptr!=0)
	{
		Node* temp=ptr;//pam9t6 dl9 ydaleni9
		dellHelper(ptr->ptr);
		delete temp;//vucvobojdenie pam9ti
	}
}

//vuvod elementov
void Intset::print1()
{
	if(firstPtr==0)
	{
		//cout <<"cpicok pyct"<<endl;
	}
	else if(firstPtr!=0)
	{
		cout <<"est6 elementu"<<endl;
		cout <<firstPtr->value<<' ';
		print1Helper(firstPtr->ptr);
	}
}

//vuvod helper
void Intset::print1Helper(Node* ptr)
{
	if(ptr!=0)
	{
		cout <<ptr->value<<' ';
	}
	if(ptr->ptr!=0)
	{
		print1Helper(ptr->ptr);
	}
}


void Intset::print()
{
	for(int i=1;i<100;i++)
	{
		cout <<mass[i]<<' ';
	}
	cout <<endl;
}

//ob6edinenie obed()
void Intset::obed(Intset &a)
{
	for(int i=0;i<100;i++)
	{
		if(mass[i]==1||a.mass[i]==1)
		{
			mass[i]=1;
		}
	}
	
	dell();//ocvobojdenie
	for(int i=1;i<100;i++)
	{
		insert(mass[i]);
	}
	
}

//perecechenie per() (1:1-0,1:0-1,0:1-1,0-0-1)
void Intset::per(Intset &a)
{
	for(int i=0;i<100;i++)
	{
		if(mass[i]==1&&a.mass[i]==0)
		{
			mass[i]=1;
		}
		else if(mass[i]==0&&a.mass[i]==1)
		{
			mass[i]=1;
		}
		else
		{
			mass[i]=0;
		}
	}
	
	dell();//ocvobojdenie
	for(int i=1;i<100;i++)
	{
		insert(mass[i]);
	}
}

//cimetr raznoct6 raz() (1:1-0, 0:0-1, 0:1-0, 1:0-0)
void Intset::raz(Intset &a)
{
	for(int i=0;i<100;i++)
	{
		if(mass[i]==1&&a.mass[i]==1)
		{
			mass[i]=0;
		}
		else if(mass[i]==0&&a.mass[i]==0)
		{
			mass[i]=1;
		}
		else
		{
			mass[i]=0;
		}
	}
	
	dell();//ocvobojdenie
	for(int i=1;i<100;i++)
	{
		insert(mass[i]);
	}
}

и файл самой программки назовите его как хотите:

//modifikaci9 Intset vo mnojectvo yzlov Node, gde Node opredel9ema9 ctryktyra
//klacc Intset mnojectvo celux
#include <iostream>
using std::cout;
using std::endl;

#include "Intset.cpp"

int main()
{
	Intset a;
	a.print();
	a.print1();
	cout <<"________________________"<<endl;
	cout <<endl;
	sleep(2);//zaderjka vremeni
	Intset b;
	b.print();
	b.print1();
	cout <<"________________________"<<endl;
	cout <<endl;
	a.obed(b);
	a.print();
	a.print1();
	cout <<"________________________"<<endl;
	cout <<endl;
	a.per(b);
	a.print();
	a.print1();
	cout <<"________________________"<<endl;
	cout <<endl;
	a.raz(b);
	a.print();
	a.print1();
	cout <<"________________________"<<endl;
	
	return 0;
}

Мы просто добавили struct Node в дефинишин класса, а в самом классе добавили два указателя на начало списка, firstPtr, и на последний элемент списка lastPtr, и все, затем просто создали список из узлов. Лень описывать, чо мы делали спать охота, разбирайтесь сами в коде, кому чо не понятно спрашивайте.

 

 

rss