Консультация № 184531
23.11.2011, 15:33
300.00 руб.
0 5 1
Здравствуйте!
Требуется написать программу из области объектно-ориентированного программирования на С++. Среда - Visual Studio, код прокомментировать.

1. Разработать класс "множество символов" в соответствии со следующим заданием:
Состояние класса -
Множество состоит из элементов типа char (в множестве не может быть двух элементов с одинаковыми значениями) и определяется мощностью (количеством элементов в множестве) и значениями своих элементов, например: множество из 6 элементов - строка abcdef. Память под множество выделяется статически, во время компиляции, и задается массивом фиксированного предельного значения (например, максимальная мощность множества 100 элементов).
Протокол класса -
Определяет возможности создания и инициализации экземпляров класса и правила использования их (методы класса).
Предусмотреть следующие возможности:
• пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию;
• создание экземпляров класса с инициализацией мощностью множества (начальное множество - символы, начиная с символа пробел);
• создание экземпляров класса с инициализацией значениями элементов множества как строки символов;
• ввод экземпляров класса из входного потока и вывод их значений в выходной поток
(с помощью перегруженных операторов >> и << );
• объединение двух множеств (с помощью перегруженного оператора сложения +; результирующее множество должно содержать элементы множества 1 и отличающиеся элементы множества 2);
• добавление нового элемента в множество (с помощью перегруженного оператора += );
• вычисление пересечения двух множеств (с помощью перегруженного оператора умножения *; результирующее множество должно состоять из элементов, имеющихся и в множестве 1, и в множестве 2);
• вычисление разности двух множеств (с помощью перегруженного оператора вычитания -; результирующее множество должно состоять из элементов первого множества без тех, которые есть во втором множестве);
• определение, имеется ли некоторый заданный элемент в множестве.
2. Проектирование класса рекомендуется начать с представления состояния класса, учитывающего заданные операции, а затем реализации конструкторов и перегруженного оператора вывода. Для отладки и исчерпывающего тестирования других методов разработанного класса реализовать диалоговую программу, которая позволяет вводить параметры, отлаживаемых методов.
4. Написать прикладную программу, использующую разработанный класс.

Обсуждение

Неизвестный
28.11.2011, 12:22
общий
это ответ
Здравствуйте, Посетитель - 383089!

Вот вариант решения Вашей задачи. Символы хранятся в статическом массиве, максимальная длина массива ограничена статической константой. Реальная длина множества на каждый момент времени определяется полем power.
Недопустимость повторных символов в множестве учитывается на этапах добавления и инициализации.
Операторы +, - и * реализованы как дружественные функции, как и операторы ввода-вывода.
Дополнительно для удобства добавила оператор присваивания и конструктор копирования.

Работу класса можно проверить на таком примере:
Код:
#include "Set.h"
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
Set s1 ("01234567");
Set s2;
for (char i='5'; i<='9'; i++)
s2+=i;
cout << "\ns1:\n" << s1;
cout << "\ns2:\n" << s2;
cout << "\ns1+s2:\n" << s1+s2;
cout << "\ns1-s2:\n" << s1-s2;
cout << "\ns1*s2:\n" << s1*s2;
_getch();
return 0;
}


Если Вам нужна какая-то более конкретная программа, использующая данный класс, пишите.
Проверено в VS 2010. Код в приложении и в приложенном архиве, из комментариев должно быть всё понятно.

Удачи!

Приложение:
//Set.h
#pragma once
#include <iostream>
using namespace std;

class Set
{
static const int max_power = 100; //максимальная мощность
char set [max_power]; //массив символов
int power; //мощность
public:
Set () : power(0) {}; //• пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию;
Set (const Set& s); //конструктор копирования
Set (int p); //• создание экземпляров класса с инициализацией мощностью множества (начальное множество - символы, начиная с символа пробел);
Set (char* str);//• создание экземпляров класса с инициализацией значениями элементов множества как строки символов;
~Set () {}; //деструктор

Set& operator = (const Set& s); //оператор присваивания
Set& operator += (const char e);//• добавление нового элемента в множество (с помощью перегруженного оператора += );
bool In (char e) const;//• определение, имеется ли некоторый заданный элемент в множестве.

friend Set operator - (const Set &p1, const Set &p2); //• вычисление разности двух множеств (с помощью перегруженного оператора вычитания -; результирующее множество должно состоять из элементов первого множества без тех, которые есть во втором множестве);
friend Set operator * (const Set &p1, const Set &p2); //• вычисление пересечения двух множеств (с помощью перегруженного оператора умножения *; результирующее множество должно состоять из элементов, имеющихся и в множестве 1, и в множестве 2);
friend Set operator + (const Set &p1, const Set &p2); //• объединение двух множеств (с помощью перегруженного оператора сложения +; результирующее множество должно содержать элементы множества 1 и отличающиеся элементы множества 2);
friend istream & operator >> ( istream & in, Set & p ); // ввод экземпляров класса из входного потока
friend ostream & operator << ( ostream & out, const Set & p ); // вывод в выходной поток
};

//Set.cpp

#include "Set.h"

Set::Set (const Set& s)
{
power = s.power; //копируем мощность
memcpy (set, s.set, sizeof(char)*power); //копируем данные
}

Set::Set (int p)
{
if (p>max_power) { //если переданная мощность больше максимальной
power = 0; //инициализируем по умолчанию
return;
}
power = p; //сохраняем мощность
for (int i = 0; i<p; i++) //заполняем символами от пробела
set[i] = ' '+i;
}

Set::Set (char* str)
{
power = 0; //обнуляем мощность
int len = strlen (str); //получаем длину строки
if (len > max_power) return; //если она больше максимальной - выходим
for (int i = 0; i<len; i++) //Заполняем символами из строки
*this+=str[i];
}

Set& Set::operator = (const Set& s)
{ //аналогично конструктору копирования
power = s.power;
memcpy (set, s.set, sizeof(char)*power);
return *this;
}

Set& Set::operator += (const char e)
{
if (power+1>max_power || In(e)) return *this; //если максимальная мощность достигнута или такой элемент уже есть - выходим
set[power] = e; //Добавляем в конец
power++; //увеличиваем мощность
}

bool Set::In (char e) const
{
for (int i = 0; i<power; i++) //ищем символ в массиве
if (set[i] == e) return true; //нашли - возвращаем 1
return false; //не нашли - 0
}

Set operator - (const Set &p1, const Set &p2)
{
Set tmp; //буфер
for (int i = 0; i<p1.power; i++) //идём по символам первого множества
if (!p2.In(p1.set[i])) tmp+=p1.set[i]; //если символ первого не содержится во втором, добавляем к результату
return tmp; //возвращаем буфер
}

Set operator * (const Set &p1, const Set &p2)
{
Set tmp;
for (int i = 0; i<p1.power; i++) //если символ первого содержится во втором, добавляем к результату
if (p2.In(p1.set[i])) tmp+=p1.set[i];
return tmp;
}

Set operator + (const Set &p1, const Set &p2)
{
Set tmp;
for (int i = 0; i<p1.power; i++) //просто добавляем к результату все символы первого и второго множеств
tmp+=p1.set[i]; //повторные не добавятся из-за реализации оператора +=
for (int i = 0; i<p2.power; i++)
tmp+=p2.set[i];
return tmp;
}

istream & operator >> ( istream & in, Set & p )
{
cout << "Enter power: ";
in >> p.power;
cout << "Enter chars: ";
for (int i=0; i<p.power; i++)
in >> p.set[i];
return in;
}

ostream & operator << ( ostream & out, const Set & p )
{
out << "{ ";
for (int i = 0; i<p.power-1; i++)
out << p.set[i] << ", ";
out << p.set[p.power-1] << " }";
return out;
}

Прикрепленные файлы:
Неизвестный
28.11.2011, 22:59
общий
Благодарю)
Неизвестный
01.12.2011, 22:29
общий
Возникли сложности с реализацией примера использования конструктора определения, имеется ли некоторый заданный элемент в множестве.
Подскажите как сделать, пожалуйста.
Неизвестный
02.12.2011, 00:42
общий
Не совсем понятен вопрос. Если объявить
Set a ("asdfg");
то a.In ('a') вернёт true
a.In ('b') вернёт false
Например.
Неизвестный
02.12.2011, 20:44
общий
Спасибо, это и хотел выяснить.
Форма ответа