Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите выбрать структуру данных 
:(
    Опции темы
Retamon
Дата 24.9.2013, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.9.2013

Репутация: нет
Всего: нет



Нужно написать программу, помогите выбрать для нее структуру данных.
Даны материалы, зависящие от других. Например Комп - это Системник + Монитор, а например Системник в свою очередь - Мать + Память и т.д....
В каком формате хранить, и как обрабатывать?
Чтобы например выбрать в списке комп, и оно выдало весь список составляющих, все глубже и глубже по уровням?
Я начинающий программист, но не тупой вроде smile
Поэтому, если знаете какой точно здесь нужен формат данных, просто тыкните его, и книжку или ссылку, куда что читать. Разжевывать не надо, сразу посылать РТФМ - тоже.
PM MAIL   Вверх
jonie
Дата 24.9.2013, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



может вы все же имеете в виду декомпозицию системы? Тогда это лаба в чистом виде же, а для лаб у нас целый раздел имеется...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
jsharp36
Дата 24.9.2013, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



Цитата

   Я начинающий программист, но не тупой вроде smile
   

Совсем начинающий, судя с вопроса )
C# - объектно-ориентированный язык, поэтому классы - родной формат. Там есть типы, вроде Tuple<>, но это уже не совсем хорошие типы, а удобные только для использования "на коротких дистанциях", чтобы не писать класс. К свойствам Tuple обращаться неудобно, т.к. нет читаемости, не ясно, что такое Item1, Item2 и т.д.
Класс SystemBlock содержит два свойства MotherBoard и Memory. Тип их определяет то, что имелось ввиду под "и т.д.". Если дальше ничего, то возможно, достаточно string. Далее, класс Computer содержит два свойства: SystemBlock (типа SystemBlock, можете назвать как-то разными синонимами, чтобы отличать класс и свойство. Это ссылка на объект класса "Системник") и свойство Monitor, тоже если дальше глубины нет, то string.

Цитата

   Чтобы например выбрать в списке комп, и оно выдало весь список составляющих...
   

Сами ответили, что это список, т.е. скорее List<> или какой-то наследник листа.

Выбирать что угодно, например, количество компьютеров с мониторами Sumsung - Linq. Для разворачивания не требуется.
Такое моделирование с помощью классов - самое верное и правильное с т.з. моделирования предметной области и статической типизации.
Но может быть неудобным с т.з. именно этой задачи. На каждом уровне, например, нужен свой код, чтобы двигаться вглубь и количество уровней строго задано в коде.
Тогда просто посмотрите, как создаются структуры "дерево". В общем, надо класс Node (узел), и чтобы он мог содержать другие узлы.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
dzaraev
Дата 25.9.2013, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: 1
Всего: 1



Если "ткнуть книжкуссылку", то вот довольно известный труд Буча: http://rutracker.org/forum/viewtopic.php?t=3343958 Также вам поможет гугель по запросу "объектно-ориентированный анализ". В общем вы затронули истинно-инженерскую тему - создание модели окружающего мира  smile.
Ну и конечно же изучайте паттерны проектирования, начать можно с тех же GoF - http://ru.wikipedia.org/wiki/Design_Patterns .

Про мониторы - накидал небольшой пример: есть общая абстракция над компонентами и есть конкретные компоненты. Можно выполнять обобщенные операции, а после приведения типа из абстрактного компонента к конкретному - можно работать с конкретным. Компьютер можно также представить как составной компонент (например DesktopStation:ComputerComponentBase). Можно реализовать поднобное не через интерфейсы, а например через дженерики. Ну там уже сами фантазируйте как вам удобней )

Код

public class ComponentVendor
        {
            public ComponentVendor(string name)
            {
                Name = name;
            }

            public string Name { get; set; } 
        }

        public interface IComputerComponent
        {
            ComponentVendor Vendor { get; }

            IEnumerable<IComputerComponent> Parts { get; }

            bool IsCompatibleWith(IComputerComponent component);

            bool IsCanBeHooked(IComputerComponent component);
            void HookUp(IComputerComponent component);
        }

        public abstract class ComputerComponentBase : IComputerComponent
        {
            private readonly List<IComputerComponent> _parts;

            protected ComputerComponentBase(string vendorName, List<IComputerComponent> parts)
            {
                _parts = parts;
                Vendor = new ComponentVendor(vendorName);
            }

            public ComponentVendor Vendor { get; private set; }

            public IEnumerable<IComputerComponent> Parts { get { return _parts; } }

            public abstract bool IsCompatibleWith(IComputerComponent component);

            public virtual bool IsCanBeHooked(IComputerComponent component)
            {
                return 
                    !_parts.Contains(component) && 
                    IsCompatibleWith(component);
            }

            public virtual void HookUp(IComputerComponent component)
            {
                if (IsCanBeHooked(component))
                {
                    _parts.Add(component);
                }
            }
        }

        public class Monitor : ComputerComponentBase
        {
            public double Diagonal { get; set; }

            public Monitor(string vendorName, double diagonal)
                :base(vendorName, new List<IComputerComponent>())
            {
                Diagonal = diagonal;
            }

            public override bool IsCompatibleWith(IComputerComponent component)
            {
                //Выясняем реальный тип аргумента и решаем - совместим ли он с нашим монитором.
                throw new NotImplementedException();
            }
        }

        public class SystemBlock : ComputerComponentBase
        {
            public SystemBlock(string vendorName)
                : base(vendorName, new List<IComputerComponent>())
            {
                //Do nothing
            }

            public override bool IsCompatibleWith(IComputerComponent component)
            {
                //Выясняем реальный тип аргумента и решаем - совместим ли он с нашим
                //системным блоком. Для этого нужно позырить в другие компоненты блока, 
                //и например узнать - совместима ли карта памяти с текущей 
                //уже подключенной материнкой и т.д.
                throw new NotImplementedException();
            }
        }


Это сообщение отредактировал(а) dzaraev - 25.9.2013, 07:41
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
Retamon
Дата 25.9.2013, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.9.2013

Репутация: нет
Всего: нет



Всем спасибо за советы. Но что-то вы не то мне советуете.
Мне нужно хранить данные, а вы предлагаете классами мне зашить их намертво в код.
Каждый раз если что-то добавилось - дописывать код?

Нашел вроде
http://www.artfulsoftware.com/mysqlbook/sa...sqled1ch20.html

Придется создать БД и забить всю иерахию.

Это сообщение отредактировал(а) Retamon - 25.9.2013, 11:52
PM MAIL   Вверх
dzaraev
Дата 25.9.2013, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: 1
Всего: 1



Цитата(Retamon @  25.9.2013,  11:49 Найти цитируемый пост)
Мне нужно хранить данные, а вы предлагаете классами мне зашить их намертво в код.

Каков вопрос - таков ответ  smile 

Цитата(Retamon @  24.9.2013,  15:42 Найти цитируемый пост)
Нужно написать программу, помогите выбрать для нее структуру данных.

Структура данных может быть описана и в коде, и абстрактно и черт знает как еще. Ваш вопрос должен был быть таким: "как строить реляционную модель данных, когда данные представляют иерархию" или как-то так. 
И кстати вам всё равно придётся 
Код

классами мне зашить их намертво в код.

если не классами, так запросами (string или linq) т.к. на уровне кода вам также потреуется модель данных и если изменится реляционная схема - изменится и объектная модель (хоть и не в 100% случаев).
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
k0rvin
Дата 1.10.2013, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Цитата(dzaraev @  25.9.2013,  15:07 Найти цитируемый пост)
Каков вопрос - таков ответ

Вопрос, кстати, достаточно нормальный, хотя немного двусмысленный. В любом случае, при чем тут ООАиП, классы и паттерны — не понятно.

Цитата(Retamon @  24.9.2013,  15:42 Найти цитируемый пост)
Нужно написать программу, помогите выбрать для нее структуру данных.

Двусвязный граф (bidirectional graph).

Цитата(Retamon @  24.9.2013,  15:42 Найти цитируемый пост)
и книжку или ссылку, куда что читать

Для начала: http://en.wikibooks.org/wiki/Data_Structures/Graphs
Пример реализации: http://quickgraph.codeplex.com/SourceContr...ctionalGraph.cs умеет также сериализацию, т.е. можно просто сохранять в файл при завершении работы программы, например. Однако, если предполагается, что в будущем БД комплектующих разрастется, то, конечно, стоит задуматься об использовании СУБД. ИМХО, лучше всего тут подойдут http://en.wikipedia.org/wiki/Graph_database нежели реляционные СУБД.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.