Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 29

Сортировка списка комбинационных элементов

01.12.2016, 16:16. Показов 687. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Преподаватель дал задание описать базовый класс Element (Элемент) и производный от него класс Combine (Комбинационный элемент ИЛИ-НЕ). Во всех классах нужно было реализовать интерфейс IComparable и перегрузить операции отношения для реализации значимой семантики сравнения объектов по какому-нибудь полю на выбор.
Программа считала и выводила всё правильно для списка логических элементов с одинаковым количеством входов. Но зачем преподаватель попросил усложнить программу и сделать сортировку списка комбинационных элементов с разным количеством входов (сортировать по количеству входов). И вот тут началось что-то не понятное. Программа иногда (на удивление) выводит всё правильно, но в большинстве случаев выводит сообщение "Индекс находится вне границ массива".

Element
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Combin_Element
{
    class Element : IComparable<Element>
    {
        public string Name;
        public int AmountInput;
        public int AmountOutput;
        public string Get_Name
        {
            get { return Name; }
        }
        public int Get_In
        {
            get { return AmountInput; }
            set { value = AmountInput; }
        }
 
        public int Get_Out
        {
            get { return AmountOutput; }
            set { value = AmountOutput; }
        }
        public Element()
        {
            Name = " ";
            AmountInput = 1;
            AmountOutput = 1;
        }
        public Element(string Name_)
        {
            Name = Name_;
            this.AmountInput = 1;
            this.AmountOutput = 1;
        }
        public Element(string Name_, int AmountInput_, int AmountOutput_)
        {
            this.Name = Name_;
            this.AmountInput = AmountInput_;
            this.AmountOutput = AmountOutput_;
        }
        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return false;
            }
            Element el = obj as Element;
            if (ReferenceEquals(this, obj)) return true;
            if (el == null) return false;
            else
                if ((Name == el.Name) && (Get_In == el.Get_In) && (Get_Out == el.Get_Out)) return true;
                else
                    return false;
        }
        public bool Equals(Element elem)
        {
            if ((Name == elem.Name) && (Get_In == elem.Get_In) && (Get_Out == elem.Get_Out)) return true;
            else return false;
        }
        public override int GetHashCode()
        {
            return this.GetType().GetHashCode();
        }
        public int CompareTo(Element other)
        {
            if (this.AmountInput > other.AmountInput) return 1;
            if (this.AmountInput < other.AmountInput) return -1;
            if (this.AmountInput == other.AmountInput)
            {
                if (this.AmountOutput > other.AmountOutput) return 1;
                if (this.AmountOutput < other.AmountOutput) return -1;
            }
            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
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Combin_Element
{
    class Combine : Element, IComparable<Combine>
    {
        bool[] Field;
        public Combine(string Name_El, int Input_El, int Output_El)
            : base(Name_El, Input_El, Output_El) //метод, задающий значение на входах экземпляра класса
        {
            Field = new bool[Input_El];
        }
        public void Setting_In(int index, bool value)
        {
            Field[index] = value;
        }
        public bool Getting_In(int index)
        {
            return Field[index];
        }
        public bool Output()
        {
            bool Out = true;
            for (int i = 0; i < Field.Length; i++)
                Out = !(Out || Field[i]);
            return Out;
 
        }
        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return false;
            }
            Combine el = obj as Combine;
            if ((System.Object)el == null)
            {
                return false;
            }
 
            bool check = true;
            if (Field.Length == el.Field.Length)
            {
                for (int i = 0; i < Field.Length; i++)
                {
                    if (Field[i] != el.Field[i])
                    {
                        check = false;
                    }
                }
            }
            return check;
        }
        public bool Equals(Combine elem)
        {
            bool check = true;
            if (Field.Length == elem.Field.Length)
            {
                for (int i = 0; i < Field.Length; i++)
                {
                    if (Field[i] != elem.Field[i])
                    {
                        check = false;
                    }
                }
            }
            return check;
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        public int CompareTo(Combine other)
        {
            if (base.CompareTo(other as Combine) == 0)
            if (base.AmountInput > other.AmountInput) return 1;
            if (base.AmountInput < other.AmountInput) return -1;
            if (base.AmountInput == other.AmountInput)
            {
                if (Convert.ToInt32(Output()) > Convert.ToInt32(other.Output()))
                    return 1;
                if (Convert.ToInt32(Output()) < Convert.ToInt32(other.Output()))
                    return -1;
            }
            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
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Combin_Element
{
    class Program
    {
        const int com_in = 4;
        //Вывод меню
        static ConsoleKeyInfo Menu()
        {
            Console.Clear();
            Console.WriteLine("Добро пожаловать!\nДля продолжения необходимо выбрать нужный Вам пункт меню.\nДля прекращения работы программы нажмите клавишу 'Esc'" + Environment.NewLine);
            Console.WriteLine("1 - Тестовая программа");
            Console.WriteLine(Environment.NewLine + "Esc - Выход" + Environment.NewLine);
            return Console.ReadKey();
        }
        private static void Element()
        {
        Console.Clear();
            Random rand = new Random();
            //int Input = 4;
            int[] Input;
            Input = new int[com_in];
            for (int i = 0; i < com_in; i++)
            {
                Input[i] = rand.Next(2, 6);
                Console.WriteLine(Input[i]);
            }
            //ВЫВОД ДО СОРТИРОВКИ//
            Console.WriteLine(Environment.NewLine + "Список элементов до сортировки:" + Environment.NewLine);
            List<Combine> com_el = new List<Combine>();
            int a = 0;
            for (int i = 0; i < com_in; i++)
            {
                com_el.Add(new Combine(Environment.NewLine + "Логическое-ИЛИ-НЕ (" + Convert.ToString(i + 1) + ")", Input[i], 1));
                Console.WriteLine(com_el[i].Name + ":" + Environment.NewLine);
                Console.WriteLine("Входы: ");
                for (int j = 0; j < Input[i]; j++)
                //for (int j = 0; j < Input; j++)
                {
                    a = rand.Next(1, 9);
                    if (a % 2 == 0)
                        com_el[i].Setting_In(j, true);
                    else com_el[i].Setting_In(j, false);
                    Console.WriteLine(j + " = " + Convert.ToString(com_el[i].Getting_In(j)));
                }
                Console.WriteLine("Выход = " + Convert.ToString(com_el[i].Output()) + Environment.NewLine);
            }
            Console.WriteLine("-----------------------");
            Array.Sort(Input);
            for (int i = 0; i < com_in; i++)
            {
                Console.WriteLine(Input[i]);
            }
            com_el.Sort();
            Console.WriteLine(Environment.NewLine + "Список элементов после сортировки:");
            for (int i = 0; i < com_in; i++)
            {
                Console.WriteLine(com_el[i].Name + ":" + Environment.NewLine);
                //Console.WriteLine("Переменная i = " + i + ";  Число входов: " + Input);
                //for (int j = 0; j < Input; j++)
                Console.WriteLine("Переменная i = " + i + ";  Число входов: " + Input[i]);
                for (int j = 0; j < Input[i]; j++)
                    Console.WriteLine(j + " = " + Convert.ToString(com_el[i].Getting_In(j)));
                Console.WriteLine("Выход = " + Convert.ToString(com_el[i].Output()));
            }
        Console.ReadLine();
        }
        static void Main(string[] args)
        {
            ConsoleKeyInfo keypress;
            do
            {
                Console.Clear();
                keypress = Menu();
                switch (keypress.Key)
                {
                    case ConsoleKey.NumPad1:
                        Element();
                        break;
                }
            }
            while (keypress.Key != ConsoleKey.Escape);  
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.12.2016, 16:16
Ответы с готовыми решениями:

Сортировка элементов списка
При нажатии на кнопку элементы списка сортируются по возрастанию. Как это сделать?

Сортировка списка по типу элементов
Помогите пожалуйста... есть список Фигур - List&lt;Figure&gt; list; в нем наследованные объекты класса квадрат, круг и прямоугольник; ...

Сортировка элементов списка по дате
Подскажите как сделать сортировку по дате а то что то не нашел. public class NewsModels { public NewsModels() ...

1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 29
04.12.2016, 21:23  [ТС]
Всё, вопрос решён. Лабораторная сдана.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2016, 21:23
Помогаю со студенческими работами здесь

Сортировка списка из составных элементов по частям этих элементов
Отсортируйте список участников олимпиады: 1) По убыванию набранного балла. 2) При равных значения балла - по фамилии в...

Сортировка элементов списка
сортировка элементов списка sorting_1(, ).

Сортировка элементов списка
Привет, у меня есть список, в нём есть 5 фамилий и эти 5 фамилий нужно отсортировать по количеству символов в строке(от большего к...

Сортировка элементов двунаправленного списка
Помогите пожалуйста! Есть двунаправленный список. Как организовать сортировку двунаправленного списка по табельному номеру? Элементы...

Сортировка только четных элементов списка
Доброго всем времени суток!!! Вопросик собс-но вот в чем - как отсортировать только четные элементы списка, не напрягая остальные? ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru