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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2017, 13:11   #1
Букер
 
Регистрация: 20.04.2017
Сообщений: 4
По умолчанию Объединение, пересечение, дополнение множеств целых чисел

Есть код.
Set.h
Код:
using namespace std; 
class Set
{
	int *nums; 
	size_t capacity; 
	size_t size;
public:
		Set(); 
		Set(Set &); 
		Set(size_t); 
		virtual ~Set(); 
		friend Set operator^(Set &, int); // добавление
		friend Set operator-(Set &, int); // удаление
		friend bool operator==(Set const &, Set const &); // сравнение
		friend bool operator!=(Set const &, Set const &); // сравнение
		friend bool operator>(Set const &, int); // проверка на наличие
		friend Set operator+(Set const &, Set const &); // объединение
		friend Set operator*(Set const &, Set const &); // пересечение
		friend Set operator/(Set const &, Set const &); // дополнение
		friend void Sort(Set &obj); // сортировка (размещение нулей в конце массива)
};
Set operator^(Set &, int);
Set operator-(Set &, int);
bool operator==(Set const &, Set const &);
bool operator!=(Set const &, Set const &);
bool operator>(Set const &, int);
Set operator+(Set const &, Set const &);
Set operator*(Set const &, Set const &);
Set operator/(Set const &, Set const &); 
void Inc(size_t); 
void Dec(size_t);
Set.cpp
Код:
#include "Set.h"
void Sort(Set &obj)
{
	int a; 
	for (size_t i = 0; i < obj.capacity; Inc(i))
	{
		if (0 == obj.nums[i])
		{
			obj.nums[i] = obj.nums[i + 1]; 
		}
	}
}
void Inc(size_t size)
{
	++size; 
}
void Dec(size_t size)
{
	--size; 
}
Set operator^(Set &obj, int term)
{
	for (size_t i = 0; i < obj.size; Inc(i))
	{
		if (obj.nums[i] == term)
		{
			return obj; 
		}
	}
	obj.nums[obj.size] = term; 
	Inc(obj.size); 
	return obj; 
}
Set operator-(Set &obj, int term)
{
	for (size_t i = 0; i < obj.size; Inc(i))
	{
		if (obj.nums[i] == term)
		{
			obj.nums[i] = 0; 
		}
	}
	Dec(obj.size);  
	Sort(obj); 
	return obj; 
}
bool operator==(Set const &obj1, Set const &obj2)
{
	if (obj1.size != obj2.size)
	{
		return false; 
	}
	size_t a = obj1.size; 
	for (size_t i = 0; i < obj1.size; Inc(i))
	{
		for (size_t j = 0; j < obj2.size; Inc(j))
		{
			if (obj1.nums[i] == obj2.nums[j])
			{
				Dec(a); 
			}
		}
	}
	if (a != 0)
	{
		return false; 
	}
	if (0 == a)
	{
		return true; 
	}
}
bool operator!=(Set const &obj1, Set const &obj2)
{
	if (obj1 == obj2)
	{
		return false; 
	}
	return true; 
}
bool operator>(Set const &obj, int term)
{
	for (size_t i = 0; i < obj.size; Inc(i))
	{
		if (obj.nums[i] == term)
		{
			return true; 
		}
	}
	return false; 
}
Set operator+(Set const &obj1, Set const &obj2)
{
	Set obj3; 
	for (size_t i = 0; i < obj1.size; Inc(i))
	{
		obj3 = obj3 ^ obj1.nums[i];
	}
	for (size_t i = 0; i < obj1.size; Inc(i))
	{
		obj3 = obj3 ^ obj2.nums[i];
	}
	return obj3; 
}
Set operator*(Set const &obj1, Set const &obj2)
{
	Set obj3; 
	for (size_t i = 0; i < obj1.size; Inc(i))
	{
		for (size_t j = 0; i < obj2.size; Inc(j))
		{
			if (obj1.nums[i] == obj2.nums[j])
			{
				obj3 = obj3 ^ obj1.nums[i]; 
			}
		}
	}
	return obj3; 
}
Set operator/(Set const &obj1, Set const &obj2)
{
	Set obj3; 
	obj3 = obj3 + obj1; 
	for (size_t i = 0; i < obj3.size; Inc(i))
	{
		for (size_t j = 0; j < obj2.size; Inc(j))
		{
			if (obj3.nums[i] == obj2.nums[j])
			{
				obj3.nums[i] = 0;
				Dec(obj3.size);
			}
		}
	}
	Sort(obj3); 
	return obj3; 
}
Преподаватель говорит, что нужно избавиться от дублирования кода (много похожих for и if). Как это сделать? Ведь здесь циклы и условные операторы отличаются друг от друга, имеют разный уровень вложенности.

______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 22.04.2017 в 13:19.
Букер вне форума Ответить с цитированием
Старый 22.04.2017, 17:19   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

1. Избавится от паскаль-стиля, с этими Inc/Dec, вы вообще уверены, что код работает? Потому что Inc/Dec ничего не изменяет, чтобы заработало, как задумано нужно так

Код:
void Inc(size_t& size)
{
	++size; 
}
void Dec(size_t& size)
{
	--size; 
}
Но вообще убрать к черту, и сделать ++i и т.д. везде.

2. Похожие вынести в приватную функцию, член класса. Базовые операции, (например копирование а в б), потому что, "копировани" похоже много раз пользуется.
alexzk вне форума Ответить с цитированием
Старый 22.04.2017, 19:08   #3
Букер
 
Регистрация: 20.04.2017
Сообщений: 4
По умолчанию

1. Inc и Dec сделал, чтобы увеличивать/уменьшать мощность множества (++obj.size, --obj.size). Inc в циклах заменю на ++i.
2. Можно пример, как это делается? Я не понимаю, как можно объединить в одну функцию разные циклы.
К примеру:
Код:
for (size_t i = 0; i < obj1.size; ++i)
	{
		for (size_t j = 0; i < obj2.size; ++j)
		{
			if (obj1.nums[i] == obj2.nums[j])
			{
				obj3 = obj3 ^ obj1.nums[i]; 
			}
		}
	}
Код:
for (size_t i = 0; i < obj3.size; ++i)
	{
		for (size_t j = 0; j < obj2.size; ++j)
		{
			if (obj3.nums[i] == obj2.nums[j])
			{
				obj3.nums[i] = 0;
				Dec(obj3.size);
			}
		}
	}
Два цикла for-for-if. Как сделать функцию, позволяющую выполнять и тот, и другой цикл? Ведь в первом if записано
Код:
obj3 = obj3 ^ obj1.nums[i];
, а во втором
Код:
obj3.nums[i] = 0;
				Dec(obj3.size);
Букер вне форума Ответить с цитированием
Старый 22.04.2017, 19:36   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Совсем замените, какая к черту "мощность"....у вас есть оператор ++, зачем его дублировать ? Если вы реально хотите, чтобы "множество увеличивало мощность" вот и измените поведение оператора ++, тогда запись

++mnogestvo

будет автоматически делать увеличение мощности.

...циклы у вас разные, потому что все в куче - люди, кони ... выразите операции одни через другие, например:

1. оператор == это, если, размеры множеств равны и размер пересечения 2 множеств равно исходному размеру. - вот вообще никакого цикла, все выражено через пересечение.
alexzk вне форума Ответить с цитированием
Старый 22.04.2017, 20:11   #5
Букер
 
Регистрация: 20.04.2017
Сообщений: 4
По умолчанию

== выражаем через пересечение. Через что выражать пересечение, кроме как через циклы?
Букер вне форума Ответить с цитированием
Старый 22.04.2017, 20:17   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Букер Посмотреть сообщение
== выражаем через пересечение. Через что выражать пересечение, кроме как через циклы?
Ну циклы будут в пересечении, а в равенстве уже не будет их совсем, будет типа

size == other.size && (*this ^ other).size == size

как-то так
alexzk вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пересечение множеств Adelia Паскаль, Turbo Pascal, PascalABC.NET 4 15.11.2014 21:39
объединение, пересечение,разность множеств. Pascal ABC программирование Помощь студентам 0 10.06.2013 21:26
Пересечение множеств Mirazhana Общие вопросы C/C++ 8 07.01.2013 21:50
Пересечение множеств iNsomNia7 Паскаль, Turbo Pascal, PascalABC.NET 1 19.11.2012 14:38
Пересечение множеств. С++ Демик Помощь студентам 4 13.03.2011 18:04