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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2018, 09:32   #1
rioto
 
Регистрация: 12.05.2018
Сообщений: 6
По умолчанию Перегруз бинарного оператора

Помогите пожалуйста с перегрузом 3 операций объединения, пресечение, и разность.

Код:
#include <iostream>
#include <stdio.h>

using namespace std;
 
class Set 
{ 
private: 
    unsigned int size; 
    unsigned int* array; 
public: 
    Set() { size = 0; array = new unsigned int[size]; } // конструктор
 
    Set(int s) {  size = s; array = new unsigned int[size]; // конструктор с аргументами
                  for ( unsigned i = 0; i < size; i++) 
                      array[i] = 0;  }
                 
    Set(const Set &ob) // конструктор копии
    {   size = ob.size;  
        array = new unsigned  int[size]; 
        for ( unsigned int i = 0; i < size; i++) 
              array[i] = ob.array[i]; } 
 
    ~Set() { delete [] array; }  // деструктор
    void Enter(); // ввод
    void Show(); // вывод
    void Union(Set, Set); // объединение         Необходим перегруз
    void intersection(Set, Set); // пересечение   Необходим перегруз
    void operator = (Set); // перегрузки            
    int operator [] (int i); 
   void Raznost(Set, Set); //разность                    Необходим перегруз
}; 
void Set::Enter() 
{ 
    std::cout << "Введите размер множества " << std::endl; 
    std::cin >> size;  
    array = new unsigned int[size];
    for ( unsigned int i = 0; i < size; i++) 
    { 
        std::cout << "Введите элемент " << i + 1 << ")   "; 
        std::cin >> array[i]; 
    } 
}  
void Set::Show() 
{ 
    std::cout << "Множество " << std::endl; 
    for ( unsigned int i = 0; i < size; i++) 
        std::cout << array[i] << " "; 
    std::cout << std::endl;
}  
void Set::Union(Set a, Set b) 
{ 
    this->size = a.size + b.size;  
    this->array = new unsigned int[size];
    unsigned i, j, count = 0; 
    unsigned int n = a.size;
    for ( i = 0; i < a.size; i++) 
        array[i] = a.array[i]; 
 
    for ( i = 0; i < b.size; i++) 
    { 
        for ( j = 0; j < a.size; j++) 
            if(b.array[i] == a.array[j]) 
                continue; 
            else 
                count++; 
        if(count == a.size) 
            array[n++] = b.array[i];  
        count = 0;
    } 
    size = n;
}  
void Set::intersection(Set a, Set b) 
{  
    size = a.size + b.size; 
    array = new unsigned int[size]; 
    unsigned int i, j, n = 0; 
 
    for ( i = 0; i < a.size; i++) 
        for ( j = 0; j < b.size; j++) 
        { 
            if(a.array[i] == b.array[j]) 
            {
                array[n++] = a.array[i]; 
                continue;
            } 
        } 
        size = n;
} 
void Set::Raznost(Set a, Set b)
{
    array = new unsigned int[size]; 
    unsigned int i, n = 0; 
	for (int i = 0; i < a.size; i++)
     { int j = 0;
       while (j < b.size && b[j] != a[i]) j++;
       if (j == b.size) cout << a[i] << "\t";
     }	
     cout << "\n" << endl;
}
void Set::operator = (Set a) 
{ 
    unsigned int i;
    delete[] this->array; 
    this->size = a.size; 
    this->array = new unsigned int[size]; 
    for ( i = 0; i < size; i++) 
        array[i] = a.array[i];
} 
int Set::operator[](int i) 
{ 
    return array[i];
} 
int main() 
{  
    setlocale(0, "rus");  
    Set a; 
    std::cout << "Ввод и вывод 1 множества " << std::endl;
    a.Enter(); 
    a.Show(); 
    Set b = a; 
    std::cout << "инициализация множества 2 с помощью конструктора копии "<< std::endl; 
    b.Show();  
    std::cout << "Ввод множества 2 " << std::endl;
    b.Enter(); 
    Set c;  
    std::cout << "Объединение множеств " << std::endl;
    c.Union(a, b);  
    c.Show();
    std::cout << "Пересечение " << std::endl;
    c.intersection(a, b);  
    c.Show();
     std::cout << "Разность a/b " << std::endl;
    c.Raznost(a,b);
     std::cout << "Разность b/a " << std::endl;
    c.Raznost(b,a);
}
rioto вне форума Ответить с цитированием
Старый 13.05.2018, 06:31   #2
rioto
 
Регистрация: 12.05.2018
Сообщений: 6
По умолчанию я уже попробовал пересечения перегруз сделать но компилятор ругается

Код:
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
class Set 
{ 
private: 
    unsigned int size;  // размер массива
    unsigned int* array;  // указатель массива
public: 
    Set() { size=0; array = new unsigned int[size]; } // конструктор
 
    Set(int s) {  size = s; array = new unsigned int[size]; // конструктор с аргументами
                  for ( unsigned i = 0; i < size; i++) 
                      array[i] = 0;  }
                 
    Set(const Set &ob) // копировальный конструктор
    {   size = ob.size;  
        array = new unsigned  int[size]; 
        for ( unsigned int i = 0; i < size; i++) 
              array[i] = ob.array[i]; } 
 
    ~Set() { delete [] array; }  // деструктор
    void Enter(); // ввод
    void Show(); // вывод
    void Union(Set, Set); // объединение
    void operator*(const Set &, const Set &); // пересечение вот оно как раз и не работает
    void operator = (Set); // перегруз оператора сравнения
    int operator [] (int i); 
   void Raznost(Set, Set); // разность
}; 
void Set::Enter() 
{ 
    std::cout << " Введите размер множества " << std::endl; 
    std::cin >> size;  
    array = new unsigned int[size];
    for ( unsigned int i = 0; i < size; i++) 
    { 
        std::cout << "Введите элемент множества" << i + 1 << ")   "; 
        std::cin >> array[i]; 
    } 
}  
void Set::Show() 
{ 
    std::cout << "Множество" << std::endl; 
    for ( unsigned int i = 0; i < size; i++) 
        std::cout << array[i] << " "; 
    std::cout << std::endl;
}  
void Set::Union(Set a, Set b) 
{ 
    this->size = a.size + b.size;  
    this->array = new unsigned int[size];
    unsigned i, j, count = 0; 
    unsigned int n = a.size;
    for ( i = 0; i < a.size; i++) 
        array[i] = a.array[i]; 
 
    for ( i = 0; i < b.size; i++) 
    { 
        for ( j = 0; j < a.size; j++) 
            if(b.array[i] == a.array[j]) 
                continue; 
            else 
                count++; 
        if(count == a.size) 
            array[n++] = b.array[i];  
        count = 0;
    } 
    size = n;
}  
void Set::operator*(const Set &a, const Set &b) // Это перегруз пересечения
{  
    size = a.size + b.size; 
    array = new unsigned int[size]; 
    unsigned int i, j, n = 0; 
 
    for ( i = 0; i < a.size; i++) 
        for ( j = 0; j < b.size; j++) 
        { 
            if(a.array[i] == b.array[j]) 
            {
                array[n++] = a.array[i]; 
                continue;
            } 
        } 
        size = n;
} 
void Set::Raznost(Set a, Set b)
{
    array = new unsigned int[size]; 
    unsigned int i, n = 0; 
    for (int i = 0; i < a.size; i++)
     { int j = 0;
       while (j < b.size && b[j] != a[i]) j++;
       if (j == b.size) cout << a[i] << "\t";
     }  
     cout << "\n" << endl;
} 
void Set::operator = (Set a) 
{ 
    unsigned int i;
    delete[] this->array; 
    this->size = a.size; 
    this->array = new unsigned int[size]; 
    for ( i = 0; i < size; i++) 
        array[i] = a.array[i];
} 
int Set::operator[](int i) 
{ 
    return array[i];
} 
int main() 
{  
    setlocale(0, "rus");  
    Set a; 
    std::cout << "Ввод и вывод  1 множества" << std::endl;
    a.Enter(); 
    a.Show(); 
    Set b = a;
    std::cout << "Инициализация множества 2 с помощью конструктора копирования "<< std::endl; 
    b.Show();
    std::cout << "Ввод множества 2 " << std::endl;
    b.Enter(); 
    Set c;  
    std::cout << "Объединение " << std::endl;
    c.Union(a, b);  
    c.Show();
    std::cout << "Пересечение" << std::endl; // вывод пересечения
    c= a*b;  
    c.Show();
    std::cout << "Разность a/b " << std::endl;
    c.Raznost(a,b);
     std::cout << "Разность b/a " << std::endl;
    c.Raznost(b,a); 
}
Объясните кодом пожалуйста.
rioto вне форума Ответить с цитированием
Старый 13.05.2018, 07:01   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
void operator*(const Set &, const Set &); // пересечение вот оно как раз и не работает
Зачем у бинарного оператора три параметра?
Почему возвращаете воид? Проблема с выражениями будет.
p51x вне форума Ответить с цитированием
Старый 13.05.2018, 07:42   #4
rioto
 
Регистрация: 12.05.2018
Сообщений: 6
По умолчанию

Я программирую недавно. Поэтому спрошу, а почему три а не два, и что надо возвращать если не Void? А лучше поясните пожалуйста на примере кодом.
rioto вне форума Ответить с цитированием
Старый 13.05.2018, 07:57   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от rioto Посмотреть сообщение
а почему три а не два
Потому что у вас класс и объект класса уже в параметрах. Когда пишите a + b, формально вызывается a.operator+(b).

Цитата:
Сообщение от rioto Посмотреть сообщение
и что надо возвращать если не Void
Пусть у вас есть такое выражение a*b + c. Если вы вернете в * воид, что будет? Что желательно вернуть?

Цитата:
Сообщение от rioto Посмотреть сообщение
А лучше поясните пожалуйста на примере кодом.
Может за вас и погуглить? И доки почитать? А вы что делать будете? http://en.cppreference.com/w/cpp/language/operators
p51x вне форума Ответить с цитированием
Старый 13.05.2018, 09:18   #6
rioto
 
Регистрация: 12.05.2018
Сообщений: 6
По умолчанию

void operator*(const Set &, const Set &) - дошло почему это не бинарный. Надо вот так Set Operator*(const Set&)
rioto вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегруз оператора в классе, С++. QT. Вызов перегруженного оператора. Алексей_2012 Помощь студентам 1 14.06.2015 20:44
перегруз Windows dell 2011 Windows 6 29.03.2013 23:29
Программы с использованием условного оператора и оператора выбора. Задачи по Delphi. Не могу сделать 4 программу Bovi4 Помощь студентам 0 25.10.2011 20:15
Перегрузка бинарного оператора XuMuK Общие вопросы C/C++ 48 21.07.2011 11:20
Перегрузка бинарного оператора + EC.cpp Общие вопросы C/C++ 4 10.04.2011 00:32