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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложный конструктор копирования 
:(
    Опции темы
Elfet
  Дата 10.12.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Немогу написать конструктор копирования для вот такого класса:
Код

   class Graph
    {
        private LinkedList<Peak> graph;

        public bool EnableLoops;
        public bool EnableRepeat;

        public Graph()
        {
            graph = new LinkedList<Peak>();
            EnableLoops = false;
            EnableRepeat = false;
        }

        public Graph(Graph t1)
        {
            EnableLoops = t1.EnableLoops;
            EnableRepeat = t1.EnableRepeat;
            graph = new LinkedList<Peak>(t1.graph);
            
        }
    }

Где Peak:
Код

    class Peak
    {
        public int numer;
        public int x;
        public int y;
        public LinkedList<Peak> ribs;
    }

так же имеет LinkedList<Peak>.
Как такое реализовать?  smile 


--------------------
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 10.12.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



А если вынести список связей в отдельный класс, типа Hub ? Тогда у Peak и у Graph будет по одному объекту Hub, который можно легко скопировать.


--------------------
user posted image
PM MAIL WWW   Вверх
Elfet
Дата 11.12.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Угу. Я хотел так сделать. НО препод сказал, что нужно сделать вот так вот! Через списки такие вот. Какие-то стандарты нам хотел показать smile


--------------------
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 11.12.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Не совсем хорошо понимаю, что такое ribs у Peak  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Elfet
Дата 11.12.2006, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



LinkedList<Peak> - список ссылок на вершины на которые есть рёбра из данного Peak
Что бы можно было зававать такую структуру:
Цитата
вершина:список ребер
1:2,4
2:1,3
3:2
4:1



--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 11.12.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Пошёл стожным путём
Код

        public Graph(Graph from)
        {
            EnableLoops = from.EnableLoops;
            EnableRepeat = from.EnableRepeat;
            graph = new LinkedList<Peak>();
            FromString(from.ToString());
        }

Код

        public override string ToString()
        {
            string r = "";
            foreach (Peak i in graph)
            {
                r += i.numer.ToString() + "(" + i.x.ToString() + "," + i.y + ")";
                foreach (Peak j in i.ribs)
                {
                    r += j.numer.ToString() + ",";
                }
                r += ";";

            }

            return r;
        }

        public bool FromString(string from)
        {
            char [] ch = from.ToCharArray();
            Stack<System.Drawing.Point> addAll = new Stack<System.Drawing.Point>();
            string line = "";
            for (int i = 0; i < from.Length; i++)
            {
                if (ch[i] != ';')
                {
                    line += ch[i].ToString();
                }
                else
                {
                    char [] comle = line.ToCharArray();
                    line = "";
                    int j = 0;
                    string numerString = "";
                    for (; comle[j] != '(' && j < comle.Length; j++)
                        numerString += comle[j].ToString();
                    int numer; 
                    if (!int.TryParse(numerString, out numer)) return false;

                    string posXstring = "";
                    for (j++; comle[j] != ',' && j < comle.Length; j++)
                        posXstring += comle[j].ToString();
                    int posX; 
                    if (!int.TryParse(posXstring, out posX)) return false;

                    string posYstring = "";
                    for (j++; comle[j] != ')' && j < comle.Length; j++)
                        posYstring += comle[j].ToString();
                    int posY;
                    if (!int.TryParse(posYstring, out posY)) return false;

                    AddPeak(posX, posY);
                    RenumerPeak(graph.Last.Value, numer);
                    
                    string toString = "";
                    for (j++; j < comle.Length; j++)
                    {
                        if (comle[j] == ',')
                        {
                            int to;
                            if (!int.TryParse(toString, out to)) return false;
                            addAll.Push(new System.Drawing.Point(graph.Last.Value.numer, to));

                            toString = "";
                        }
                        else
                        {
                            toString += comle[j].ToString();
                        }                        
                    }
                }
            }

            foreach(System.Drawing.Point i in addAll)
            {
                AddRib(i.X, i.Y);
            }

            return true;
        }

Можно ли как-нибудь оптемезировать функцию FromString?


--------------------
PM MAIL WWW Skype   Вверх
mr.DUDA
Дата 11.12.2006, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Парсить из строки ? Ужос.


--------------------
user posted image
PM MAIL WWW   Вверх
vladsch
Дата 11.12.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А почему бы не попробывать сереализацию и десереализацию (например, в мемори стрим)?
После десереализации коллекцию graph десереализованного объекта присвоить graph, создаваемого объекта
PM MAIL   Вверх
Void
Дата 11.12.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Вообще, копирующий конструктор — нетипичная для C# идиома. Реализация ICloneable на мой взгляд уместнее.
Сериализацию использовать можно, но медленно.
А вот извращения со строкой я совсем не понял: что мешает точно так же бежать по from.graph?
Хотелось бы ещё глянуть на код методов AddPeak и AddRib.

 smile Вершина графа — vertex. Ребро — edge.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Elfet
Дата 11.12.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Цитата(mr.DUDA @  11.12.2006,  18:33 Найти цитируемый пост)
Парсить из строки ? Ужос. 

Для строк я сделал сохранение в файл ещё. smile

Цитата(vladsch @  11.12.2006,  18:51 Найти цитируемый пост)
А почему бы не попробывать сереализацию и десереализацию (например, в мемори стрим)?
После десереализации коллекцию graph десереализованного объекта присвоить graph, создаваемого объекта 

 сереализацию и десереализацию ? Это что?

Цитата(Void @  11.12.2006,  20:49 Найти цитируемый пост)
Вообще, копирующий конструктор — нетипичная для C# идиома. Реализация ICloneable на мой взгляд уместнее.
Сериализацию использовать можно, но медленно.
А вот извращения со строкой я совсем не понял: что мешает точно так же бежать по from.graph?
Хотелось бы ещё глянуть на код методов AddPeak и AddRib.

по from.graph и впрям ничего smile Просто я сначала сделал методы для преобразования в строки.
А как реализовать ICloneable?  smile

Добавлено @ 20:43 
Цитата(Void @  11.12.2006,  20:49 Найти цитируемый пост)
smile Вершина графа — vertex. Ребро — edge. 

Так лучше будет? smile

Добавлено @ 20:45 
Код

        public bool AddPeak(int x, int y)
        {
            Peak newPeak = new Peak();
            newPeak.x = x;
            newPeak.y = y;
            if (graph.Last == null)
                newPeak.numer = 1;
            else
            {
                int max = graph.First.Value.numer;
                foreach (Peak i in graph)
                    if (i.numer > max) max = i.numer;
                newPeak.numer = max + 1;
            }
            newPeak.ribs = new LinkedList<Peak>();
            graph.AddLast(newPeak);
            return true;
        }

Код

        public bool AddRib(Peak fromPeak, Peak toPeak)
        {
            if (fromPeak == null || toPeak == null)
                return false;
            if (!EnableLoops)
                if (fromPeak.numer == toPeak.numer)
                    return false;
            if (!EnableRepeat)
            {
                foreach (Peak i in fromPeak.ribs)
                    if (i.numer == toPeak.numer)
                        return false;
            }
            fromPeak.ribs.AddLast(toPeak);
            return true;
        }



--------------------
PM MAIL WWW Skype   Вверх
Void
Дата 11.12.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(Elfet @  11.12.2006,  22:41 Найти цитируемый пост)
сереализацию и десереализацию ? Это что?

Это как-то так:
Код
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

class Graph
{
    public Graph(Graph from)
    {
        EnableLoops = from.EnableLoops;
        EnableRepeat = from.EnableRepeat;
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, from.graph);
            stream.Seek(0, SeekOrigin.Begin);
            graph = (LinkedList<Peak>)formatter.Deserialize(stream);
        }
    }
}

Цитата(Elfet @  11.12.2006,  22:41 Найти цитируемый пост)
Вершина графа — vertex. Ребро — edge. 
Так лучше будет?

Просто по английски они именно так называются, и в коде, связанном с графами, эти названия встречаются сплошь и рядом. А в peaks and ribs я некоторое время въезжал. peaks, они у гор или функций, а ribs — у человека smile
Цитата(Elfet @  11.12.2006,  22:41 Найти цитируемый пост)
А как реализовать ICloneable?

Код
class Graph : ICloneable
{
    public object Clone()
    {
        Graph newGraph = new Graph();
        // здесь копируем в newGraph свою структуру
        return newGraph;
    }
}

Пробежки по всем вершинам в AddPeak можно избежать, достаточно завести в классе поле maxnum, и обновлять его в том же AddPeak.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Elfet
Дата 11.12.2006, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Ок! Спасиьо! Clone возвращает object - нужно ли перегружать операцию преобразования типа в Graph?  smile

Добавлено @ 21:38 
Код

LinkedList<Graph> saveBack;
saveBack = new LinkedList<Graph>();
saveBack.AddLast((Graph)graph1.Clone());

Правильно?


--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 16.12.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Вот что получилось: Graph Simple smile


--------------------
PM MAIL WWW Skype   Вверх
vitovt
Дата 18.12.2006, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Elfet, рекомендую книгу Э.Троелсона "C# и платформа .NET"
Можно найти на  этом сайте   smile 

Это сообщение отредактировал(а) vitovt - 18.12.2006, 01:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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