Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/133: Рейтинг темы: голосов - 133, средняя оценка - 4.96
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154

Перегрузка операторов сравнения

22.06.2011, 08:22. Показов 26176. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, делаю упражнение с дробями, перегрузку арифметических операторов сделал, а со сравнением не получается, подскажите как нужно делать.
Вот код того что уже есть:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Fraction
{
    internal class Fraction
 
    {
        public Fraction()
        {
            x = 0;
            y = 1;
        }
        public Fraction(long X, uint Y)
        {
            x = X;
            y = Y;
        }
        private long x;
        private uint y;
        public float getFrac()
        {
            float x1=x;
            return x1/y;
        }
        public static Fraction operator +(Fraction f1, Fraction f2)
        {
            Fraction th=new Fraction();
            th.x = (f1.x*f2.y) + (f2.x*f1.y);
            th.y = f1.y*f2.y;
            return th;
        }
        public static Fraction operator -(Fraction f1, Fraction f2)
        {
            Fraction th = new Fraction();
            th.x = (f1.x * f2.y) - (f2.x * f1.y);
            th.y = f1.y * f2.y;
            return th;
        }
        public static Fraction operator *(Fraction f1, Fraction f2)
        {
            Fraction th = new Fraction();
            th.x = f1.x * f2.x;
            th.y = f1.y * f2.y;
            return th;
        }
        public static Fraction operator /(Fraction f1, Fraction f2)
        {
            Fraction th = new Fraction();
            th.x = f1.x * f2.y;
            th.y = f1.y * (uint)f2.x;
            return th;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Fraction d1=new Fraction(1,2);
            Fraction d2 = new Fraction(1,4);
            Fraction d3 = new Fraction(1, 2);
            Fraction d = new Fraction();
            d = d1 + d2+d3;
            Console.WriteLine(d.getFrac());
            Console.ReadKey();
        }
    }
}
пробовал написать так:
C#
1
2
3
4
5
6
7
8
        
public static bool operator < (Fraction f1, Fraction f2)
{
            if (f1.getFrac() < f2.getFrac())
                return true;
            else
                return false;
}
выдает ошибку - The operator 'Fraction.Fraction.operator <(Fraction.Fraction, Fraction.Fraction)' requires a matching operator '>' to also be defined
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2011, 08:22
Ответы с готовыми решениями:

Перегрузка операторов сравнения
Нужно перегрузить операторы сравнения using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Перегрузка оператора сравнения
подскажите как перегрузить != в моем классе с возвращением тру или не тру =)

Перегрузка оператора сравнения
Ребят, помогите, кодю на с++, с# слабо знаю возникла проблема. Я не могу перегрузить оператор сравнения(==). Каким образом его...

14
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 09:41
Добавь еще оператор >. Смысловой перевод сообщения об ошибке: оператор больше тоже нужно добавить. Правда вместо перегрузки операторов сравнения удобнее реализовать интерфейс IComparable<Class1>

C#
1
2
3
4
5
6
7
8
9
10
11
class Class1:IComparable<Class1>
    {
        #region IComparable<Class1> Members
 
        public int CompareTo(Class1 other)
        {
            throw new NotImplementedException();
        }
 
        #endregion
    }
Метод возвращает 1 если this больше чем other, -1 если меньше и 0 если равны.

Такая реализация позволяет написать 1 метод вместо переопределения 6 (>,<,>=,<=,=,!=)
1
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
22.06.2011, 09:46  [ТС]
Цитата Сообщение от XAHOK Посмотреть сообщение
Правда вместо перегрузки операторов сравнения удобнее реализовать интерфейс IComparable<Class1>
Если Вам не трудно напишите пожалуйста, как нужно всё это в коде реализовать, как использовать в методе сравнения, заранее благодарю
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 10:27
Цитата Сообщение от Askar2008 Посмотреть сообщение
Если Вам не трудно напишите пожалуйста, как нужно всё это в коде реализовать, как использовать в методе сравнения, заранее благодарю
К сожалению я ввел вас в заблуждение. Реализация интерфейса требуется для автоматических сортировок стандартным методом Sort в списках и тому подобное.
Переопределите сразу все 6 операторов сравнения. Написан код был правильно, но одного оператора недостаточно. Нужно реализовать все.
C#
1
2
3
4
5
6
public static bool operator < (Fraction f1, Fraction f2)
public static bool operator <= (Fraction f1, Fraction f2)
public static bool operator > (Fraction f1, Fraction f2)
public static bool operator >= (Fraction f1, Fraction f2)
public static bool operator == (Fraction f1, Fraction f2)
public static bool operator != (Fraction f1, Fraction f2)
1
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
22.06.2011, 10:29  [ТС]
Цитата Сообщение от XAHOK Посмотреть сообщение
Думаю очевидно, что первый вариант лучше, т.к. требует написания только одной строки кода.
Да несомненно вы правы! Со знаком > и < попробовал получилось, теперь разберусь с IComparable. Спасибо!
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 10:38
Цитата Сообщение от Askar2008 Посмотреть сообщение
Да несомненно вы правы! Со знаком > и < попробовал получилось, теперь разберусь с IComparable. Спасибо!
Долго редактировал. Использование интерфейса IComparable полезно там, где выполняется автоматическое сравнение, например сортировка списка List методом List.Sort(). Изначально ввел вас в заблуждение к сожалению.
0
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
22.06.2011, 13:32  [ТС]
Оказывается, операции "равно" (==) и "не равно" (!=) реализовывать в С# нет нужды. Они работают автоматически, по крайней мере в данном случае!
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 13:54
Цитата Сообщение от Askar2008 Посмотреть сообщение
Оказывается, операции "равно" (==) и "не равно" (!=) реализовывать в С# нет нужды. Они работают автоматически, по крайней мере в данном случае!
Эти операции сравнивают адреса памяти. В вашем случае их переопределять однозначно.
0
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
22.06.2011, 13:56  [ТС]
Цитата Сообщение от XAHOK Посмотреть сообщение
Эти операции сравнивают адреса памяти. В вашем случае их переопределять однозначно.
почему адреса? на мой взгляд эти операции сравнивают все поля объекта А с соответствующими полями объекта Б, разве не так?!
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 14:20
Методы равно и неравно используются от класса Object. А там они работают именно таким образом.
Что бы удостовериться создайте консольный проект и напишите в нем следующий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Program
    {
        public class Class1
        {
            public int a = 1;
        }
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            Class1 c2 = new Class1();
            Console.WriteLine(c1 == c2);
            Console.ReadKey();
        }
    }
Как видно у двух объектов класса 1 одинаковый параметр. Но на экране вы увидите False, т.к. адреса у них разные.
0
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
22.06.2011, 14:25  [ТС]
Цитата Сообщение от XAHOK Посмотреть сообщение
Методы равно и неравно используются от класса Object. А там они работают именно таким образом.
Что бы удостовериться создайте консольный проект и напишите в нем следующий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Program
    {
        public class Class1
        {
            public int a = 1;
        }
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            Class1 c2 = new Class1();
            Console.WriteLine(c1 == c2);
            Console.ReadKey();
        }
    }
Как видно у двух объектов класса 1 одинаковый параметр. Но на экране вы увидите False, т.к. адреса у них разные.
Хмм, действительно =) Поторопился с выводами!
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 14:38
Цитата Сообщение от Askar2008 Посмотреть сообщение
Хмм, действительно =) Поторопился с выводами!
В свое время сам с этим столкнулся. Это сделано для того, что бы можно было сравнивать не только классы, но и базовые типы: int, string, float и т.п. У них ведь нет внутренних параметров.
1
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
22.06.2011, 15:04  [ТС]
Вот вроде все что хотел реализовал, если не трудно отпишите замечания, может в каком то месте можно было сделать иначе (проще или эффективнее), заранее благодарю!
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Fraction
{
    internal class Fraction
 
    {
        public Fraction()
        {
            x = 0;
            y = 1;
        }
        public Fraction(long X, uint Y)
        {
            bool flag = false;
            if (X<0)
            {
                X *= -1;
                flag = true;
            }
            if (X>Y)
            {
                uint YY = Y;
                while (YY>1)
                {
                    if (X % YY == 0 && Y%YY==0)
                    {
                        X = X/YY;
                        Y = Y/YY;
                    }
                    YY--;
                }
            }
            else if (Y>X)
            {
                uint XX = (uint)X;
                while (XX > 1)
                {
                    if (Y % XX == 0 && X % XX==0)
                    {
                        Y =Y / (uint)XX;
                        X = X/XX;
                        
                    }
                    XX--;
                }              
            }
            else if (X==Y)
            {
                X = X/X;
                Y = Y/Y;
            }
            if (flag == true)
                x = X * -1;
            else
                x = X;
                y = Y;
            
        }
        private long x;
        private uint y;
        public float GetFrac()
        {
            float x1=x;
            return x1/y;
        }
        public int CompareTo(Fraction f1, Fraction f2)
        {
            float m1, m2;
            if (f1.GetFrac() > f2.GetFrac())
                return 1;
            if (f1.GetFrac() < f2.GetFrac())
                return -1;
            else
                return 0;
        }
        public static Fraction operator +(Fraction f1, Fraction f2)
        {
            Fraction th=new Fraction();
            th.x = (f1.x*f2.y) + (f2.x*f1.y);
            th.y = f1.y*f2.y;
            return th;
        }
        public static Fraction operator -(Fraction f1, Fraction f2)
        {
            Fraction th = new Fraction();
            th.x = (f1.x * f2.y) - (f2.x * f1.y);
            th.y = f1.y * f2.y;
            return th;
        }
        public static Fraction operator *(Fraction f1, Fraction f2)
        {
            Fraction th = new Fraction();
            th.x = f1.x * f2.x;
            th.y = f1.y * f2.y;
            return th;
        }
        public static Fraction operator /(Fraction f1, Fraction f2)
        {
            Fraction th = new Fraction();
            th.x = f1.x * f2.y;
            th.y = f1.y * (uint)f2.x;
            return th;
        }
        public static bool operator <(Fraction f1, Fraction f2)
        {
            if (f1.GetFrac() < f2.GetFrac())
                return true;
            else
                return false;
        }
        public static bool operator >(Fraction f1, Fraction f2)
        {
            if (f1.GetFrac() > f2.GetFrac())
                return true;
            else
                return false;
        }
        public static bool operator >=(Fraction f1, Fraction f2)
        {
            if (f1.GetFrac() >= f2.GetFrac())
                return true;
            else
                return false;
        }
        public static bool operator <=(Fraction f1, Fraction f2)
        {
            if (f1.GetFrac() <= f2.GetFrac())
                return true;
            else
                return false;
        }
        public static bool operator ==(Fraction f1,Fraction f2)
        {
            if (f1.GetFrac() == f2.GetFrac())
                return true;
            else
                return false;
        }
        public static bool operator !=(Fraction f1, Fraction f2)
        {
            if (f1.GetFrac() != f2.GetFrac())
                return true;
            else
                return false;
        }
        public string GetString()
        {
            return this.x + "/" + this.y;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Fraction d1=new Fraction(2,2);
            Console.WriteLine(d1.GetString());
            Fraction d2 = new Fraction(1,2);
            Fraction d3 = new Fraction(1,2);
            Fraction d = new Fraction();
            if (d1 > d2) Console.WriteLine("{0}>{1}", d1.GetString(), d2.GetString());
            else if (d1 < d2) Console.WriteLine("{0}<{1}", d1.GetString(), d2.GetString());
            if (d1 >= d2) Console.WriteLine("{0}>={1}", d1.GetString(), d2.GetString());
            if (d1 <= d2) Console.WriteLine("{0}<={1}", d1.GetString(), d2.GetString());
            if (d2 == d3) Console.WriteLine("{0}={1}", d2.GetString(), d3.GetString());
            if (d2 != d1) Console.WriteLine("{0}!={1}", d2.GetString(), d1.GetString());
            //d = d1 + d2 + d3;
            //Console.WriteLine(d.GetString());
            Console.ReadKey();
        }
    }
}
0
 Аватар для XAHOK
273 / 266 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 15:24
Заменить метод на свойство
C#
1
2
3
4
5
6
7
8
9
10
public float GetFrac()
        {
            float x1=x;
            return x1/y;
        }
 
public float Frac
        {
            get { return x/y; }
        }
Если источник является первым параметром, то можно заменить таким образом
C#
1
2
X = X/YY
X/=YY
Хм, а вот это всегда запишет в X единицу
C#
1
X = X/X;
0
16 / 16 / 7
Регистрация: 04.03.2009
Сообщений: 154
22.06.2011, 15:28  [ТС]
Цитата Сообщение от XAHOK Посмотреть сообщение
Хм, а вот это всегда запишет в X единицу
точно, и как я сам до этого не дашел!)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.06.2011, 15:28
Помогаю со студенческими работами здесь

Перегрузка операторов
Есть много классов, в которых реализация перегрузки операторов такая: public static bool operator ==(Gradient first, Gradient...

Перегрузка операторов
Условие задачи: Напишите программу, в которой есть класс с двумя целочисленными полями. Опишите для этого класса операторные методы,...

Перегрузка операторов ++ (--)
Описан класс, реализующий тип данных «вещественная матрица». Класс должен реализовывает следующие операции над матрицами: □ ...

Перегрузка операторов
Привет всем у меня есть программа в ней нужна сделать перегрузку операции &amp;&amp; но как сделать правильно не знаю помогите плиз кто знает. ...

Перегрузка операторов
Всем добрый день! В свободное время читаю Шилда &quot;Полное руководство С# 4.0&quot; (для каких конкретных целей еще не решил). Дошел до главы...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru