Форум программистов, компьютерный форум CyberForum.ru

перегрузка операторов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 5.00
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 01:32     перегрузка операторов #1
Имеется такая программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
class reversion
{ 
    vector<int> mass1;
    vector<int> mass2;
    vector<int> rev1;
    vector<int> rev2;
        vector<int> mult1;
    vector<int> mult2;
    int len;
    public:
    reversion(){len=0;}
    void record1();      // Функция записывае в вектора mass1 и rev1 данные
    void record2();       // Функция записывае в вектора mass2 и rev2 данные
    reversion operator *(reversion mult);            // этот оператор делает определенные действия с векторами mass1 и rev1 и mass2 и rev2.
    reversion operator <<(reversion display); вывод на дисплей векторов mult1 и mult 2, которые были изменены через оператор *
};
void reversion::record1()
{   
    int x=1;
    int i=0;
    cout<<"Введите 1 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass1.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass1[i]<<" ";
    cout<<endl;
    x=1;
    i=0;
    cout<<"Введите 1 перестановку"<<endl;
        for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev1.push_back(x);
                k++;
            }
        }
        int z=0;
        for(int i=k-1;i>=0;i--)
            if(mass1[i]==rev1[i])
            {
                mass1.pop_back();
                rev1.pop_back();
                z++;
            }
            else
                break;
            k=k-z;
}
void reversion::record2()
{
    int x=1;
    int i=0;
    cout<<"Введите 2 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass2.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass2[i]<<" ";
    cout<<endl;
        x=1;
        i=0;
    cout<<"Введите 2 перестановку"<<endl;
    for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev2.push_back(x);
                p++;
            }
        }
        int z=0;
        for(int i=p-1;i>=0;i--)
            if(mass2[i]==rev2[i])
            {
                mass2.pop_back();
                rev2.pop_back();
                z++;
            }
            else
                break;
            p=p-z;
    cout<<endl;
}
reversion reversion::operator *(reversion mult)
{
    reversion D;
    int f=k;
    int z=0;
    if(k>p)
    {
        f=k;
        for(int i=p;i<k;i++)
        {
            D.mass2.push_back(i+1);
            D.rev2.push_back(i+1);
        }
    }
    if(k<p)
    {
        f=p;
        for(int i=k;i<p;i++)
        {
            D.mass1.push_back(i+1);
            D.rev1.push_back(i+1);
        }
    }
    
    int k=0;
    for(int i=0;i<f;i++)
    {
        k=D.rev1[i];
        for(int j=0;j<f;j++)
        {
            if(D.mass2[j]==k)
                D.mult2.push_back(rev2[j]);
        }
    }
    return D;
}
reversion reversion::operator <<(reversion display)
{
    reversion F;
    for(int i=0;i<p;i++)
        cout<<F.mult1[i]<<" ";
    cout<<endl;
    for(int i=0;i<p;i++)
        cout<<F.mult2[i]<<" ";
    cout<<endl<<endl;
    return F;
}
void main()
{  
    setlocale (LC_ALL,"RUS");
    reversion A;
    A.record1();
    reversion B;
    B.record2();
    reversion C;
    C<<A*B;         
    getch();
}
У меня такая проблема, когда вызывается оператор *, то он не видит то, что было проделано в функции record1(); видит только то что было в record2();

Добавлено через 34 минуты
Кто-нибудь знает почему так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 01:32     перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
C++ Перегрузка операторов
Перегрузка операторов С++ C++
C++ перегрузка операторов
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:06  [ТС]     перегрузка операторов #21
Как то размыто я понял то что вы написали) Сейчас почитаю книгу Дейтела и попробую написать)

Добавлено через 55 минут
Если я вас правильно понял то получается что то типа этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
int s=2;
int k=0;
int p=0;
class reversion
{ 
    vector<int> mass1;
    vector<int> rev1;
    int len;
    public:
    reversion(){len=0;}
    void record1();
    void record2();
    reversion operator *();
    reversion operator <<();
 
};
void reversion::record1()
{   
    int x=1;
    int i=0;
    cout<<"Введите 1 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass1.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass1[i]<<" ";
    cout<<endl;
    x=1;
    i=0;
    cout<<"Введите 1 перестановку"<<endl;
        for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev1.push_back(x);
                k++;
            }
        }
        int z=0;
        for(int i=k-1;i>=0;i--)
            if(mass1[i]==rev1[i])
            {
                mass1.pop_back();
                rev1.pop_back();
                z++;
            }
            else
                break;
            k=k-z;
}
void reversion::record2()
{
    int x=1;
    int i=0;
    cout<<"Введите 2 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass1.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass1[i]<<" ";
    cout<<endl;
        x=1;
        i=0;
    cout<<"Введите 2 перестановку"<<endl;
    for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev1.push_back(x);
                p++;
            }
        }
        int z=0;
        for(int i=p-1;i>=0;i--)
            if(mass1[i]==rev1[i])
            {
                mass1.pop_back();
                rev1.pop_back();
                z++;
            }
            else
                break;
            p=p-z;
    cout<<endl;
}
reversion reversion::operator *()
{
    int f=k;
    int z=0;
    if(k>p)
    {
        f=k;
        for(int i=p;i<k;i++)
        {
            B.mass1.push_back(i+1);
            B.rev1.push_back(i+1);
        }
    }
    if(k<p)
    {
        f=p;
        for(int i=k;i<p;i++)
        {
            A.mass1.push_back(i+1);
            A.rev1.push_back(i+1);
        }
    }
    
    int k=0;
    for(int i=0;i<f;i++)
    {
        k=A.rev1[i];
        for(int j=0;j<f;j++)
        {
            if(B.mass2[j]==k)
                B.mult2.push_back(B.rev2[j]);
        }
    }
}
reversion reversion::operator <<()
{
    for(int i=0;i<p;i++)
        cout<<C.mass1[i]<<" ";
    cout<<endl;
    for(int i=0;i<p;i++)
        cout<<C.rev1[i]<<" ";
    cout<<endl<<endl;
}
void main()
{  
    setlocale (LC_ALL,"RUS");
    reversion A;
    A.record1();
    reversion B;
    B.record2();
    reversion C;
    C<<A*B;
    getch();
}
но тогда что нужно писать в аргументах операции * и <<
????
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
11.11.2011, 23:29     перегрузка операторов #22
в функции перегрузки операторов вам надо передать рефернсы на объекты над которыми вы собираетесь выполнять действия.
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:31  [ТС]     перегрузка операторов #23
Что такое референсы? покажите примерно как это делается))
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 23:39     перегрузка операторов #24
Цитата Сообщение от Smillles7 Посмотреть сообщение
Что такое референсы?
ссылки
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
11.11.2011, 23:40     перегрузка операторов #25
Цитата Сообщение от Smillles7 Посмотреть сообщение
Что такое референсы? покажите примерно как это делается))
Референсы - это ссылки.
Прототип выглядит так:
C++
1
тип operator*(const тип& R);
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:46  [ТС]     перегрузка операторов #26
мне нужно передать два вектора и + несколько int переменных, а он жалуется что:
слишком много параметров для этой функции оператора)
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
11.11.2011, 23:54     перегрузка операторов #27
Smillles7, одно из правил перегрузки операций - нельзя менять арность операции. Операция умножения - бинарная, поэтому операндов может быть только два: левый аргумент - текущий объект (для него не нужно параметра), и правый аргумент - это параметр перегружаемой операции.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
11.11.2011, 23:55     перегрузка операторов #28
Цитата Сообщение от Smillles7 Посмотреть сообщение
мне нужно передать два вектора и + несколько int переменных, а он жалуется что:
слишком много параметров для этой функции оператора)
вам надо передать экземпляры класса в функцию перегрузки операторов, а не векторы.
Smillles7, сформулируйте четко задачу которую вы пытаетесь решить.попробую написать вам класс и функции перегрузки операторов которые вам нужны.
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:56  [ТС]     перегрузка операторов #29
Класс перестановка на n элементном множестве.
перестановки пример:
123456.....
352614
реализовать операции:
1) перемножение перестановок
т.е
1234 * 1234 = 1234
3241 * 2143 = 4132
2) нахождение обратной перестановки
3) Тождественная перестановка
Мне нужно что бы в void main было примерно так:
С=A*B^B;
т.е мы перемножаем две перестановки и потом находим обратную к этим перемноженым перестановкам(оператор ^)
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
11.11.2011, 23:57     перегрузка операторов #30
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
левый аргумент - текущий объект (для него не нужно параметра)
ну это если функция перегрузки является членом класса. если функция глобальная то должна являтся другом класса и тогда нужны два аргумента.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
11.11.2011, 23:59     перегрузка операторов #31
Цитата Сообщение от greeezz Посмотреть сообщение
ну это если функция перегрузки является членом класса. если функция глобальная то должна являтся другом класса и тогда нужны два аргумента.
Да, конечно.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
12.11.2011, 07:10     перегрузка операторов #32

Не по теме:

извиняюсь что долго не отвечал. задержался на занятиях. ну дело собственно не в этом


На текущий момент набросал реализацию класса, перегрузку оператора умножение operator* и оператора присвоения operator=. Также сделал небольшую функция print() которая в показательных целях печатает последовательность объекта перестановки.
выкладываю то что уже готово чтобы вы могли посмотреть, подумать, может какие вопросы позадавать ну и может на какие-то мысли вас наведет данный код.

объявление класса Перестановка class Perestanovka
файл Perestanovka.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Perestanovka class definition
#ifndef PERESTANOVKA_H
#define PERESTANOVKA_H
 
#include <vector>
using std::vector;
 
class Perestanovka{
 
public:
    Perestanovka();              //default constructor
    void setSequence(int [], const int);   //set values of permutation
    void print() const;          //print sequence of permutation
 
    const Perestanovka operator*(const Perestanovka &); //overloading operator *
    const Perestanovka &operator=(const Perestanovka &); //overloading assignment operator
 
private:
    int size;       //size of mySequence.
    vector<int> mySequence;
};
#endif


имплементация класса Перестановка
файл Perestanovka.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Perestanovka class implimentation
#include "stdafx.h"
#include "Perestanovka.h"
 
#include <iostream>
 
// default constructor
Perestanovka::Perestanovka() {       
}
 
//сохраняем последовательность в поле объект
void Perestanovka::setSequence(int arr[], const int arrSize){ 
    size = arrSize;
    for(int  i = 0; i < size; ++i){
        mySequence.push_back(arr[i]);
    }
}
 
//печатаем имеющуюся в объекте последовательность
void Perestanovka::print() const{   
    for(int  i = 0; i < size; ++i){
        std::cout << mySequence.at(i) << " ";
    }
}
 
// перегрузка оператора умножение
const Perestanovka Perestanovka::operator*(const Perestanovka &right){ 
    Perestanovka result;
    if(size == right.size){
        for(int i = 0; i < size; ++i){  
            result.mySequence.push_back(right.mySequence.at((this->mySequence.at(i))-1));
        }
        result.size = size;
    }
    return result;
}
 
// перегрузка оператора присвоения
const Perestanovka &Perestanovka::operator=(const Perestanovka &right){
    this->mySequence = right.mySequence;
    this->size = right.size;
 
    return *this;
}


ну и файл откуда все запускаем
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "stdafx.h"
#include "Perestanovka.h"
#include <iostream>
using std::cout;
using std::endl;
 
void processing();      // прототип функции
 
int main()
{
    processing();       // запускаем наше хозяйство
    system("pause");
    return 0;
}
 
void processing(){
    const int size = 4;         
    int arr[size] = {3,2,4,1};  
    int arr2[size] = {2,1,4,3};
 
    Perestanovka a;   //создаем новый пустой объект a
    Perestanovka b;   //создаем новый пустой объект b
    Perestanovka c;   //создаем новый пустой объект c
    a.setSequence(arr, size);   //заполняем поля объекта
    b.setSequence(arr2, size);  //заполняем поля объекта
    
    cout << "Posledovatelnost perovoi perestanovki : ";
    a.print();  //печатаем объект а
    cout << endl;
 
    cout << "Posledovatelnost perovoi perestanovki : ";
    b.print(); //печатаем объект b
    cout << endl;
 
    c = a*b;        //Выполняем уножение перестановок
 
    cout << "\nRezultat umnozheniya : ";
    c.print(); //печатаем объект с
    cout << endl;
}


P.S. код протестирован в среде windows. работает корректно

Добавлено через 1 час 36 минут
Smillles7, Мне нужно что бы в void main было примерно так:
С=A*B^B;
т.е мы перемножаем две перестановки и потом находим обратную к этим перемноженым перестановкам(оператор ^)
Я так понимаю что НАХОЖДЕНИЕ обратной последовательности к этим перемноженным это обратная последовательность к результату перемножения (A*B).
А почему в формуле тогда написано ^B ? Что это значит?

Вообще с обратной перестановкой все просто.
если имеем:
3,1,4,2
то обратная перестановка будет:
2 4 1 3
для проверки умножаем перестановку на обратную и получаем единичную перестановку
1 2 3 4

Что такое Тождественная перестановка ?
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
12.11.2011, 11:30  [ТС]     перегрузка операторов #33
Цитата Сообщение от greeezz Посмотреть сообщение
Я так понимаю что НАХОЖДЕНИЕ обратной последовательности к этим перемноженным это обратная последовательность к результату перемножения (A*B).
А почему в формуле тогда написано ^B ? Что это значит?
Вы правильно поняли, это моя опечатка)
Что такое Тождественная перестановка ?
тождественная перестановка это нахождения наименьшего к, где наша перестановка будет возводиться в степень к, пока не получиться единичная перестановка)))

Добавлено через 8 минут
скажите зачем вы пишите в 6 строке:
using std::vector;
что значит at(i) в 22 строке?
и что значит это в 31 строке в частности this и стрелочка: (this->mySequence.at(i))-1))

Добавлено через 59 секунд
а так в принципе все остальное понятно) Огромное спасибо)
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
12.11.2011, 19:35     перегрузка операторов #34
Цитата Сообщение от Smillles7 Посмотреть сообщение
скажите зачем вы пишите в 6 строке:
using std::vector;
это я уточняю для себя и программы что именно я использую из стандартного пространства имен. нам же не нужно все пространство. вот я и беру только то что мне надо.
Цитата Сообщение от Smillles7 Посмотреть сообщение
что значит at(i) в 22 строке?
C++
1
mySequence.at(i)
возвращает значение элемента вектора находящегося на позиции i.
Цитата Сообщение от Smillles7 Посмотреть сообщение
что значит это в 31 строке в частности this и стрелочка: (this->mySequence.at(i))-1))
this это указатель на текущий объект. т.е. на объект который вызывает функцию. при работе с указателями стрелка -> это тоже самое что и точка при работе с именем объекта.
this->myMethod() можно записать как (*this).MyMethod()
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.11.2011, 19:57     перегрузка операторов #35
Цитата Сообщение от greeezz Посмотреть сообщение
this->MyMethod() можно записать как (*this).MyMethod()
Или просто MyMethod()
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
12.11.2011, 20:07     перегрузка операторов #36
Цитата Сообщение от Deviaphan Посмотреть сообщение
Или просто MyMethod()
да, конечно.
просто я сторался сделать код подробнее, чтобы автору было нагляднее представлять картину работы объектов.
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
12.11.2011, 23:15  [ТС]     перегрузка операторов #37
мне нужно еще чтобы если перестановки разных размеров, то я должен дописать в перестановку соответствующие элементы до совпадения размеров перестановок))
примерно так:
1 перестановка:
1423
2 перестановка:
132
то у меня вторая перестановка должна измениться на такую:
1324

насколько я понял mySequence это 1 перестановка, а right.mySequence 2 перестановка в перегрузке оператора *
тогда почему я не могу сделать так:
C++
1
2
3
4
5
6
if(size>right.size)
    for(int i=right.size;i<size;i++)
        right.mysequence.push_back(i+1);                    // жалуется здесь на . после mysequence
    if(size<right.size)
        for(int i=size;i<right.size;i++)
                mysequnce.push_back(i+1);
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
13.11.2011, 03:41     перегрузка операторов #38
Цитата Сообщение от Smillles7 Посмотреть сообщение
тогда почему я не могу сделать так:
в метод перегрузки оператора * передается адрес объекта который для функция константный. вы не можете изменять константные объекты. смотрите строку 39.
C++
1
... (const Perestanovka &right) ...
если вы хотите изменить объект справа то он не должен быть константным
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 21:44     перегрузка операторов
Еще ссылки по теме:

Перегрузка операторов с++ C++
Перегрузка операторов C++
Перегрузка операторов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
13.11.2011, 21:44  [ТС]     перегрузка операторов #39
как запустить рекурсию в операторе????
C++
1
2
3
4
5
6
7
const reversion reversion::operator %(const reversion &right)
{            ......
                 ......
                      ......
         reversion::operator %(right);            // можно ли ее так запустить
        
}
Добавлено через 4 часа 40 минут
обошелся без рекурсии)))
программа готова))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
int z=2;
class reversion
{ 
public:
    public:
        reversion(){}
    void reversion::record(int [], int);
 
    const reversion operator*(reversion &);
    const reversion &operator=(const reversion &);
    const reversion operator^(const reversion &);
    const reversion operator%(const reversion &);
private:
    int k;
    int size;
    vector<int> myRevers;
};
void reversion::record(int rev[], int revsize)
{
    size=revsize;
    for(int i=0;i<size;i++)
        myRevers.push_back(rev[i]);
    for(int i=size;i>0;i--)
            if(i==rev[i])
                myRevers.pop_back();
            else
                break;
}
const reversion reversion::operator *(reversion &right)
{
    reversion result;
    int z=0;
    int f=size;
    if(size>right.size)
    {
        f=size;
        for(int i=right.size;i<size;i++)
            right.myRevers.push_back(i+1);
    }
    if(size<right.size)
    {
        for(int i=size;i<right.size;i++)
            myRevers.push_back(i+1);
        size=right.size;
    }
    int k=0;
    for(int i=0;i<size;i++)
    {
        k=myRevers[i];
        for(int j=0;j<size;j++)
        {
            if(j+1==k)
                result.myRevers.push_back(right.myRevers[j]);
        }
    }
    result.size=size;
    return result;
}
const reversion reversion::operator ^(const reversion &right)
{
    reversion temp;
    for(int i=1;i<=right.size;i++)
    {
        for(int j=0;j<right.size;j++)
            if(right.myRevers[j]==i)
                temp.myRevers.push_back(j+1);
    }
    temp.size=right.size;
    return temp;
}
const reversion reversion::operator %(const reversion &right)
{
    reversion temp1;
    size=right.size;
    this->myRevers=right.myRevers;
    vector<int> ident;
    int p;
    int r=0;
    while(r!=size)
    {
        for(int i=0;i<size;i++)
    {
        p=right.myRevers[i];
        for(int j=0;j<size;j++)
        {
            if(j+1==p)
                ident.push_back(myRevers[j]);
        }
    }
    for(int i=0;i<size;i++)
    {
        if(i+1==ident[i])
            r++;
    }
        if(r!=size)
        {
            z++;
            myRevers.clear();
        for(int j=0;j<size;j++)
            myRevers.push_back(ident[j]);
        ident.clear();
        }
    }
        temp1.k=z;
        temp1.myRevers=ident;
        temp1.size=size;
        return temp1;
}
const reversion &reversion::operator=(const reversion &right)
{
        this->myRevers=right.myRevers;
        this->size=right.size;
        this->k=right.k;
        cout<<"Перестановка:"<<endl;
        for(int i=0;i<size;i++)
        cout<<myRevers[i]<<" ";
        cout<<endl<<"наименьший к="<<k;
        return *this;
}
void main()
{  
    setlocale (LC_ALL,"RUS");
    int size1;
    cout<<"Введите кол-во элементов в 1 перестановке"<<endl;
    cin>>size1;
        int *rev1=new int [size1];
        int x=1;
    cout<<"Введите 1 перестановку"<<endl;
        for(int i=0;i<size1;i++)
        {
            cin>>x;
            rev1[i]=x;
        }
        int size2;
        cout<<"Введите кол-во элементов во 2 перестановке"<<endl;
    cin>>size2;
        int *rev2=new int [size2];
    cout<<"Введите 2 перестановку"<<endl;
        for(int i=0;i<size2;i++)
        {
            cin>>x;
            rev2[i]=x;
        }
        reversion A;
        reversion B;
        reversion C;
        reversion D;
        reversion Z;
        A.record(rev1,size1);
        B.record(rev2,size2);
        C=Z%(D^(A*B));
    getch();
}
Yandex
Объявления
13.11.2011, 21:44     перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 12:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru