1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
1

Во всех классах реализовать интерфейс IComparable и перегрузить метод CompareTo для сравнения объектов

08.05.2014, 13:27. Показов 7517. Ответов 20
Метки нет (Все метки)

В программах требуется описать базовый класс (возможно, абстрактный), в котором задается интерфейс для производных классов. Во всех классах реализовать интерфейс IComparable и перегрузить метод CompareTo для сравнения объектов по каким-либо полям на усмотрение разработчика программы.
Функция Main должна содержать массив из элементов базового класса, заполненный ссылками на производные классы. В этой функции должно демонстрироваться использование всех разработанных элементов классов, а также сортировка массива объектов.
Вот программа написанная с помощью наследования, нужно переделать на делегаты и интерфейсы.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Наследование
{
//Создать класс Paiг (пара целых чисел). 
//Определить метод умножения на число и операцию сложения пар (a,b) + (c,d) = (а + b, с + d). 
//Определить класс- наследник Money с полями: рубли и копейки. 
//Переопределить операцию  сложения и определить методы вычитания денежных сумм. 
 
    class Program
    {
        class Pair
        {
            public int a, b;
            public Pair(int a, int b)
            {
                this.a = a; this.b = b;
            }
            public static Pair operator *(int b, Pair a)
            {
                return new Pair(a.a * b, a.b * b);
            }
            public static Pair operator +(Pair a, Pair b)
            {
                return new Pair(a.a + a.b, b.a + b.b);
            }
            public virtual string show()
            {
                return Convert.ToString(a) + "," + Convert.ToString(b);
            }
        }
        class Money : Pair
        {
            public Money(int a, int b)
                : base(a, b) { }
 
            public static Money operator +(Money a, Money b)
            {
                int r, k;
                r = a.a + b.a;
                if ((a.b + b.b) >= 100)
                { r++; k = a.b + b.b - 100; }
                else
                    k = a.b + b.b;
                return new Money(r, k);
            }
            public static Money operator *(int b, Money a)
            {
                int r, k;
                r = b * a.a;
                if ((a.b * b) >= 100)
                { r = r + a.b / 100; k = a.b % 100; }
                else
                    k = a.b * b;
                return new Money(r, k);
            }
            public static Money operator -(Money a, Money b)
            {
                int r, k;
                r = a.a - b.a;
                if ((a.b - b.b) < 0)
                { r--; k = a.b - b.b + 100; }
                else
                    k = a.b - b.b;
                return new Money(r, k);
            }
            public override string show()
            {
                return Convert.ToString(a) + " руб " + Convert.ToString(b) + " коп";
            }
        }
 
        static void Main(string[] args)
        {
            Pair p1 = new Pair(6, 4);
            Pair p2 = new Pair(8, 9);
 
            Money c1 = new Money(10, 5);
            Money c2 = new Money(7, 97);
            Console.WriteLine("Класс Pair");
            Console.WriteLine("(" + p1.show() + ")" + " + " + "(" + p2.show() + ")" + " = " + "(" + (p1 + p2).show() + ")");
            Console.WriteLine(p1.show() + " * " + "4" + " = " + (4 * p1).show());
 
            Console.WriteLine("Класс Money");
            Console.WriteLine(c1.show() + " + " + c2.show() + " = " + (c1 + c2).show());
            Console.WriteLine(c1.show() + " * " + "8" + " = " + (8 * c1).show());
            Console.WriteLine(c1.show() + " - " + c2.show() + " = " + (c1 - c2).show());
            Console.ReadLine();
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2014, 13:27
Ответы с готовыми решениями:

Интерфейс IComparable, метод CompareTo
public class Car:IComparable { public int CarID { get; set; } public int...

Реализовать интерфейс IComparable и перегрузить операции отношения для реализации семантики
Нужно в программу добавить реализацию интерфейса IComparable и перегрузить операции отношения для...

Реализовать метод CompareTo для сравнения строк
Задание такое: В класс Edition добавить реализацию интерфейсa System.IComparable для сравнения...

Реализовать интерфейс IComparable и перегрузить операции отношения
Задание (лаб. 9): 1. Создать абстрактный класс Persona с методами, позволяющим вывести на экран...

20
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
08.05.2014, 13:33 2
Fenlou, не совсем понял, как связаны задание, приведенный код и вот это:
Цитата Сообщение от Fenlou Посмотреть сообщение
делегаты и интерфейсы.
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
08.05.2014, 14:40  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
не совсем понял, как связаны задание
ну в данном примере класс наследовался. А можно при помощи делегатов переделать задание
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
08.05.2014, 15:08 4
Цитата Сообщение от Fenlou Посмотреть сообщение
А можно при помощи делегатов переделать задание
Можно переделать не с абстрактным классом, а с интерфейсом. Но при чем тут делегаты, мне не понятно, если честно...
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
08.05.2014, 21:26  [ТС] 5
Ну как с интерфейсом?
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
08.05.2014, 23:29 6
Цитата Сообщение от Fenlou Посмотреть сообщение
Ну как с интерфейсом?
Fenlou, с интерфейсом хорошо... Без интерфейса плохо.
Вот что наваял. Разбирайтесь...
Класс Прямоугольник (в нем же общий для всех класс для сортировки по площади)
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication11
{
    public class Rectangle:IFigure,IComparable<Rectangle>
    {
        //Автосвойства 
        public string Name { get; private set; }
        public Color Color { get; private set; }
     
        //Переменные
        private int Width;
        private int Height;
 
        //Конструкторы
        public Rectangle(int w, int h, Color c)
            : this(w, h, "", c) { }
        public Rectangle(int w, int h, string n, Color c)
        {
            Width = w;
            Height = h;
            Name = n;
            Color = c;
        }
 
        //Метод рисования
        public void Draw()
        {
            Console.WriteLine("Drawing Rectangle {0}, colored {1}", Name, Color);
        }
 
        //Свойство площади
        public double Square
        {
            get { return Width * Height; }
        }
 
        //Реализация IComparable
        public int CompareTo(Rectangle other)
        {
            if (this.Square > other.Square)
                return 1;
            if (this.Square < other.Square)
                return -1;
            else
                return 0;
        }
    }
    //Класс компаратора
    public class MyCompare : IComparer<IFigure>
    {
        public int Compare(IFigure x, IFigure y)
        {
            if (x.Square > y.Square)
                return 1;
            if (x.Square < y.Square)
                return -1;
            else
                return 0;
        }
    }
}
Класс Треугольник
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication11
{
    public class Triangle:IFigure,IComparable<Triangle>
    {
        //Автосвойства
        public string Name { get; private set; }
        public Color Color { get; private set; }
 
        //Переменные
        private int Height;
        private int Length;
 
        //Конструкторы
        public Triangle(int h, int l, Color c)
            : this(h, l, "", c) { }       
        public Triangle(int h,int l,string n,Color c)
        {
            Height = h;
            Length = l;
            Name = n;
            Color = c;
        }
        //Метод рисования
        public void Draw()
        {
            Console.WriteLine("Drawing Triangle {0}, colored {1}", Name, Color);
        }
 
        //Свойство площади
        public double Square
        {
            get { return (Height*Length)/2; }
        }
 
        //Реализация IComparable
        public int CompareTo(Triangle other)
        {
            if (this.Square > other.Square)
                return 1;
            if (this.Square < other.Square)
                return -1;
            else
                return 0;
        }
    }
}
Класс Круг
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication11
{
    public class Circle:IFigure,IComparable<Circle>
    {
        //Автосвойства
        public string Name { get; private set; }
        public Color Color { get; private set; }
 
        //Переменные
        private double Radius;
 
        //Конструкторы
        public Circle(double r, Color c)
            : this(r, "", c) { }      
        public Circle(double r,string n,Color c)
        {
            Radius = r;
            Name = n;
            Color = c;
        }
        
        //Метод рисования
        public void Draw()
        {
            Console.WriteLine("Drawing Circle {0}, colored {1}", Name, Color);
        }
        //Свойство площади
        public double Square
        {
            get { return Math.PI * Math.Pow(Radius, 2); }
        }
 
        //Реализация IComparable
        public int CompareTo(Circle other)
        {
            if (this.Square > other.Square)
                return 1;
            if (this.Square < other.Square)
                return -1;
            else
                return 0;
        }
    }
}
Интерфейс ( с перечислением цветов)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication11
{
    //Интерфейс
    public interface IFigure
    {
        void Draw();
        double Square { get; }     
    }
    //Перечисление цветов
    public enum Color
    {
        Red,
        Green,
        Black,
        White
    }
}
Основная консоль.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            //Создаем массив
            IFigure[] myFigures = new IFigure[5]
            {
                new Rectangle(82,23,"Rect1",Color.Red),
                new Triangle(28,40,"Tr1",Color.Green),
                new Circle(20.5,"Crcl1",Color.Black),
                new Rectangle(78,30,Color.White),
                new Circle(10.2,Color.Red)
            };
 
            //Используем общий метод интерфейса
            foreach (IFigure itfIf in myFigures)
            {
                itfIf.Draw();
            }
            Console.WriteLine();
 
            //Выводим площадь каждой фигуры
            foreach (IFigure itfIf in myFigures)
            {
                Console.WriteLine("Square is {0}", itfIf.Square);
            }
 
            //Сортируем нашим сортировщиком по площади
            Array.Sort(myFigures, new MyCompare());
 
            Console.WriteLine();
 
            //Выводим снова площадь каждой фигуры
            foreach (IFigure itfIf in myFigures)
            {
                Console.WriteLine("Square is {0}", itfIf.Square);
            }
            Console.ReadLine();
        }
    }
}
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
10.05.2014, 17:52  [ТС] 7
Цитата Сообщение от insite2012 Посмотреть сообщение
Вот что наваял. Разбирайтесь...
ясно, а помочь с моей сможете?
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
10.05.2014, 18:04 8
Fenlou, так для вас и писал, разве это не то что надо? Несколько классов с одним интерфесом...
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
10.05.2014, 18:27  [ТС] 9
Цитата Сообщение от insite2012 Посмотреть сообщение
так для вас и писал, разве это не то что надо? Несколько классов с одним интерфесом...
это пример
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
13.05.2014, 07:48  [ТС] 10
Ну решите пожалуйста программку!
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
13.05.2014, 09:12 11
Fenlou, какую именно? Вам моего примера мало? Тогда скажите точнее, что за программка вам нужна.
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
13.05.2014, 10:59  [ТС] 12
Цитата Сообщение от insite2012 Посмотреть сообщение
какую именно? Вам моего примера мало? Тогда скажите точнее, что за программка вам нужна.
Создать класс Paiг (пара целых чисел). Определить метод умножения на число и операцию сложения пар (a,b) + (c,d) = (а + b, с + d). Определить класс- наследник Money с полями: рубли и копейки. Переопределить операцию сложения и определить методы вычитания денежных сумм.
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
13.05.2014, 11:34 13
Fenlou, а в первом посте сказать это сразу было никак?
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
13.05.2014, 12:03  [ТС] 14
Цитата Сообщение от insite2012 Посмотреть сообщение
а в первом посте сказать это сразу было никак?
в коде была формулировка задачи
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
13.05.2014, 12:14 15
Fenlou, ваш код мне мало о чем скажет.
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
13.05.2014, 12:34  [ТС] 16
Цитата Сообщение от insite2012 Посмотреть сообщение
ваш код мне мало о чем скажет.
поможете?
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
13.05.2014, 12:56 17
Fenlou, да. В процессе дня, с работой закончу.
0
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
13.05.2014, 13:21  [ТС] 18
Цитата Сообщение от insite2012 Посмотреть сообщение
да. В процессе дня, с работой закончу.
Спасибо
0
Эксперт .NET
5456 / 4229 / 1208
Регистрация: 12.10.2013
Сообщений: 12,223
Записей в блоге: 2
13.05.2014, 16:46 19
Fenlou, в общем вот. Если честно, я так точно и не понял что требуется. Вот что получилось.
Класс Деньги.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication22
{
    public class Monye:IMoney
    {
        //Свойства
        public double rub { get; private set; }
        public double cop { get; private set; }
        //Конструкторы
        public Monye(double c)
            : this(0, c) { }      
        public Monye(double r,double c)
        {
            rub = r;
            if (c >= 100)
            {
                cop = c % 100;
                rub += ((c - cop) / 100);
            }
            else
                cop = c;
        }
        //Вывод значения
        public string GetValue()
        {
            return string.Format("Сумма: {0:C};", rub+(cop/100));
        }
        //Реализация умножения
        public IMoney Multiply(int arg)
        {
            return new Monye(this.rub * arg, this.cop * arg);
        }
        //Реализация сложения
        public IMoney Sum(IMoney m1)
        {
            if (m1 is Monye)
            {
                return new Monye(this.rub + ((Monye)m1).rub,
                                 this.cop + ((Monye)m1).cop);
            }
            else
                return new Monye(0, 0);
        }
    }
}
Класс Пара
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication22
{
    public class Pair:IMoney
    {
        //Свойства
        public int x { get; private set; }
        public int y { get; private set; }
        //Конструкторы
        public Pair(int xVal)
        :this(xVal,0){ }       
        public Pair(int xVal,int yVal)
        {
            x = xVal;
            y = yVal;
        }
        //Вывод значения
        public string GetValue()
        {
            return string.Format("X: {0}; Y: {1}", x, y);
        }
        //Реализация умножения
        public IMoney Multiply(int arg)
        {
            return new Pair(this.x * arg, this.y * arg);
        }
        //Реализация сложения
        public IMoney Sum(IMoney m1)
        {
            if (m1 is Pair)
            {
                return new Pair(this.x + ((Pair)m1).x,
                                this.y + ((Pair)m1).y);
            }
            return new Pair(0, 0);
        }
    }
}
Интерфейс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication22
{
    public interface IMoney
    {
        //Вывод значения
        string GetValue();
        //Метод умножения на аргумент
        IMoney Multiply(int arg);
        //Метод сложения двух объектов
        IMoney Sum(IMoney m1);
    }
}
Основное приложение, проверка
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication22
{
    class Program
    {
        static void Main(string[] args)
        {
            //Массив объектов
            IMoney[] myMonies = new IMoney[5]
            {
                new Pair(10,10),
                new Monye(100,26),
                new Monye(20),
                new Pair(100),
                new Monye(23,220)
            };
            //Выводим на экран
            foreach (IMoney itfM in myMonies)
            {
                Console.WriteLine(itfM.GetValue());
            }
 
            Console.WriteLine("\n********************\n");
 
            //Изменяем через умножение на аргумент
            for (int i = 0; i < myMonies.Length; i++)
            {
                myMonies[i] = myMonies[i].Multiply(2);
            }
            //Выводим на экран
            foreach (IMoney itfM in myMonies)
            {
                Console.WriteLine(itfM.GetValue());
            }
 
            Console.WriteLine("\n********************\n");
 
            IMoney mCheck = new Monye(10, 25);
 
            //Изменяем через сложение с новым объектом типа Money
            for (int i = 0; i < myMonies.Length; i++)
            {
                myMonies[i] = myMonies[i].Sum(mCheck);
            }
 
            //Выводим на экран
            foreach (IMoney itfM in myMonies)
            {
                Console.WriteLine(itfM.GetValue());
            }
            Console.ReadLine();
        }
    }
}
Проверяйте.
1
1 / 1 / 2
Регистрация: 11.03.2014
Сообщений: 483
13.05.2014, 17:41  [ТС] 20
Цитата Сообщение от insite2012 Посмотреть сообщение
Проверяйте.
Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2014, 17:41
Помогаю со студенческими работами здесь

Как реализовать интерфейс IComparable и перегрузить операции отношения?
Здравствуйте! Помогите, пожалуйста, с заданием: Выполнить задание 9, используя для хранения...

Как реализовать интерфейс IComparable и перегрузить операции отношения?
помогите, прошу очень-очень, суть вопроса внизу Задание, на основе которого написан код: ...

Как перегрузить методы Equals() и GetHashCode(), для сравнения свойств объектов?
Есть два объекта класса Квадрат.Необходимо сравнить их по площади заданной свойством. Для этого...

Как перегрузить операции отношения для реализации значимой семантики сравнения объектов
Добрый вечер, уважаемые участники форума. Есть поставленная задача с наследованием: Она в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru