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

Как уменьшить количество создаваемых объектов в при написании меню программы

11.03.2012, 00:43. Показов 1352. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я пишу меню к программе работающей по следующим условия: сделать приложение для сортировки массивов различными алгоритмами. В консоли сделать простенькое меню. Сделать интерфейс в котором есть метод сортировки. Затем, наследуя этот класс, реализовывать разные алгоритмы (наследование + полиморфизм). Применить исключительные ситуации.
Я реализовал заполнение массива случайными числами, числами из файла и с клавиатуры.
Идея меню, вначале пользователю позволить заполнить массив одним из доступных способов, а затем выбрать тип сортировки массива. Методы заполнения лежат в базовом классе, а метод сортировки объявлен виртуальным и переопределяется в производных классах. Проблема в том, что при вызове метода, в котором реализовано меню, создается куча объектов и захламляется память. Первоначально пользователь не выбирает тип сортировки. Поэтому приходится для одного вида заполнения массива использовать несколько объектов производных классов отвечающих за ту или иную сортировку. По этой причине память захламляется. Как можно избежать данной ситуации?
Вот как это выглядит в коде:
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
static void Menu()
        {
            int menu = 0;
            int arraySize = int.Parse(Console.ReadLine());
            menu = int.Parse(Console.ReadLine());
            while (menu != 6)
            {
                ISort[] sort = new ISort[4];
                sort[0] = new Sort();
                sort[1] = new BubbleSort(arraySize);
                sort[2] = new SelectSort(arraySize);
                sort[3] = new InsertionSort(arraySize);
                try
                {
                    switch (menu)
                    {
                        case 1:
                            sort[1].RandomFill();
                            sort[2].RandomFill();
                            sort[3].RandomFill(); 
                            break;
                        case 2:
                            sort[1].FillFromFile();
                            sort[2].FillFromFile();
                            sort[3].FillFromFile();
                            break;
                        case 3:
                            sort[1].EnterTheValues();
                            sort[2].EnterTheValues();
                            sort[3].EnterTheValues();
                            break;
                        case 4:
                            sort[1].SortArray();
                            sort[0].SortEvent += sort[1].BubbleSortHandler;
                            break;
                        case 5:
                            sort[2].SortArray();
                            break;
                        case 6:
                            sort[3].SortArray();
                            break;
                        default :
                            break;
                    }
                }
 
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                
            }
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2012, 00:43
Ответы с готовыми решениями:

Уменьшить число создаваемых объектов обёрток
Вопрос: Можнo ли уменьшить числo сoздаваемых объектoв обёртoк? Зaдaчa: Нaписaть клaсс, кoтoрый считaет скoлькo рaз кaждoе слoвo...

Подсчитать количество создаваемых объектов при наследовании
Нужно подсчитывать отдельно количество объектов для каждого из классов. Но как это сделать? При наследовании создаётся сначала базовый...

Ограничения на количество объектов|переменных, создаваемых редактором диалогов в MS Visual Studio 6.0
Столкнулся с тем что не могу больше добавить ни одной переменной (то есть добавить то могу но программа вылетает с ошибкой) и не могу...

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.03.2012, 00:48
Используйте циклы.
0
4 / 4 / 0
Регистрация: 07.09.2009
Сообщений: 190
11.03.2012, 03:34  [ТС]
каким образом их тут использовать?
0
107 / 107 / 9
Регистрация: 19.12.2010
Сообщений: 417
11.03.2012, 04:27
Ваши классы-сортировщики не должны хранить никаких данных и не должны уметь загружать массивы. Они должны каким-то способом принять массив, отсортировать его и вернуть результат. Вы подумайте по ООП, кто должен загружать, заполнять и сохранять массивы? Никак не сортировщики. Они должны только сортировать. А загрузкой и всем прочим должны заниматься сами массивы. Раз они не могут - надо делать вой класс MyArray и все ваши методы FillRandom, ReadFromFile переносить туда. Ещё неплохо бы в этом классе сделать методы добавления, удаления, копирования элементов. Я сделал пример без такого класса.
Я бы, наверно, сделал такой алгоритм:
1. Объявил интерфейс ISorter с методом Sort(), принимающем и возвращающем массив; //Это может быть бы и опустил.
2. Сделал бы абстрактный класс Sorter, унаследованный от ISorter, но пока ничего не делающий (вероятно, потом пригодится);
3. В каждом потомке от Sorter реализуем Sort();
Простой пример
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
using System;
 
namespace Test
{
    class TestMain
    {
        static void Main()
        {
            int[] arr = { 1, 3, 2 };
            int[] res;
            ISorter iSorter;
 
            PrintArray("Чистый:", arr);
 
            iSorter = new BubleSorter();
            res = iSorter.Sort(arr);
            PrintArray("BubleSorter:", res);
 
            iSorter = new SelectSorter();
            res = iSorter.Sort(arr);
            PrintArray("SelectSorter:", res);
 
            Console.ReadKey();
 
        }
 
        static void PrintArray(string mes, int[] array)
        {
            Console.Write("{0} ", mes);
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write("{0} ", array[i]);
            }
            Console.WriteLine();
        }
    }
 
    public interface ISorter
    {
        int[] Sort(int[] array);
    }
 
    public abstract class Sorter: ISorter
    {
        public abstract  int[] Sort(int[] array);
    }
 
    public class BubleSorter : Sorter
    {
        public BubleSorter()
        {
        }
 
        public override int[] Sort(int[] array)
        {
            //Укороченная сортировка методом пузырька:
            //http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D1%83%D0%B7%D1%8B%D1%80%D1%8C%D0%BA%D0%BE%D0%BC
            bool t = true;
            while (t)
            {
                t = false;
                for (int j = 0; j < array.Length - 1; j++)
                {
                    if (array[j] > array[j + 1])
                    {
                        int tmp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = tmp;
                        t = true;
                    }
                }
            }
 
            return array;
        }
    }
 
    public class SelectSorter : Sorter
    {
        public SelectSorter()
        {
        }
 
        public override int[] Sort(int[] array)
        {
            //Реализуем сортировку вместо этого:
            return new int[1];
        }
    }
}

Если будете делать свой класс MyArray, то перед сортировкой, возможно, вам придётся копировать его в методе Sort(), чтобы не испортить исходный массив.
Советую так и поступить, как я сказал.
Удачи.

Добавлено через 19 минут
Можно ещё в MyArray добавить метод Sort, который будет принимать ISorter и передавать ему себя... Конечно, такое лучше делать через делегаты, но тут норм.
0
 Аватар для Mega-xaxax
38 / 38 / 1
Регистрация: 11.03.2012
Сообщений: 95
11.03.2012, 05:15
Берем интерфейс ISort, в котором есть метод sort()
sort() должен возвращать массив значений double (ну или тех что у Вас)

Пишем класс, который формирует массив в зависимости от метода получения данных, назовем его Loader:
C#
1
Loader load = new Loader();
У него есть методы:
C#
1
2
3
LoadFromFile(string path) // path - путь к файлу
LoadRandom(int size) // size - размер массива
LoadFromConsole() // внутри цикл с Console.ReadLine()
А вот этот метод возвращает сформированный массив:
C#
1
getResult()
Создаем четыре класса BubbleSort, InsertionSort и т.д. и наследуем их от интерфейса ISort
Внутри этих классов должна быть внутреняя переменная хранящая массив значений. Ее можно передать в конструкторе:
C#
1
BubbleSort bubble = new BubbleSort(double[] array)
Вот так будет выглядеть сортировочный метод:
C#
1
bubble.sort()
Далее, в консоли выбираем метод загрузки (у Вас уже реализован)
Далее выбирается метод сортировки
После загрузки данных, создаем сортировочный класс:
C#
1
ISort sorter = new BubbleSort(array) // или new InsertionSort(array) в зависимости от выбранного метода
Ну а затем сортируем массив:
C#
1
double[] result = sorter.sort()
В итоге в переменной result должен находиться отсортированный массив
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2012, 05:15
Помогаю со студенческими работами здесь

Требуется советы в написании программы для открывания 3D объектов
Нужна помощь в написании программы на С# для открывания 3д объектов. Сроки поджимают. Дело в том что мне нужно сдать проект. тема:...

Как создается линия при написании программы?
как создается линия в маткад когда пишется программа ?

QML Как принять сигналы от динамически создаваемых объектов
Здравствуйте. Как можно установить слоты для сигналов динамически создаваемых QML объектов? Поясню на примере: Есть, например,...

Вывести количество чисел во втором списке, которые содержатся в первом (как уменьшить время работы программы)
подскажите пожалуйста как уменьшить время работы программы примерно на 0.5 секунд int n1 = int.Parse(Console.ReadLine()); ...

Как уменьшить количество ошибок при разработке программ на Си?
Есть ли библиотеки для ужесточения типизации (статическая, строгая, безопасная), ещё что нибудь?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru