IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Обход иерархического дерева вниз., дерево из QTreeWidgetItem
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Как всегда рассчитываю на помощь volvo smile.gif
Есть дерево, в нем возможны 3 элемента
3. Элемент типа 1003 - критерий, у этого элемента есть некоторое значение.
2. Элемент типа 1002 - это подгруппа (т.е. у неё есть род. группа) и она содержит только элементы типа 1003, у неё есть значение(вес).
1. Элемент типа 1001 - Группа верхнего уровня (в неё входят либо только элементы 1002 - подгруппы, либо только элементы 1003 - критерии), у него есть значение(вес).

Глубина/вложенность дерева может быть бесконечно глубокой.

Какой проход необходимо реализовать :
1. Необходимо подсчитать значениях все элементов 1003. (значение_критериев_группы)
2. Умножить значение элементов группы на родительскую группу. (значение_группы или значение_подгруппы)
2.1 Если эта группа вложена в другую группу(т.е. является подгруппой) необходимо умножить её значение на значение родительской группы
3. И так , пока не дойдем до корня.
Вот пример изображения на картинке, как элементы взаимодействуют с собой(это QTreeWidget).
Изображение

Я набрасал логику алгоритма в текстовом блокнотике в виде "псевдокода", хотелось бы что бы мне помогли понять, правильно ли я понял алгоритм
Код
Подсчитать группы, для этого нужен рекурсивный алгоритм обхода дерева групп критерией :
        //Берем список топ-левел айтемов.
        //для каждого айтема этого списка
        //обнулить : значение_группы, значение_критериев_подгруппы, значение_критериев_группы.
        //получаем список его чилдов
          //функция_1(список айтемов) :
            //для каждого из списка
            //если тип айтема 1001(группа, у неё есть подгруппы либо только критерии) получаем количество его чилдов если оно >0 (это исключит пустые группы)
                //получаем список чилдов.
                  //вызываем функция_1 для этого списка.
                //если значение_критериев_подгруппы != 0 (Значит была подсчитана подгруппа)
                    // значение_группы+=вес_группы*значение_подгру
ппы.
                //иначе (значит не было подгрупп)
                    // значение_группы+=вес_группы*значение_критер
иев_группы
            //иначе если тип айтема 1002(подгруппа) получаем количество его чилдов если оно >0 (это исключит пустые группы), все его чилды 100% критерии
                //для каждого критерия(чилда)
                    //если его значение !=0
                        // значение_критериев_группы+=взвешенное_знач
ние_критерия_по_году_рейтинга
                // значение_подгруппы=вес_подгруппы*значение_
ритериев_группы
            //иначе если тип айтема 1003(критерий) то мы нашли критерий и для него (иначе это пустая группа, но этого лучше не допускать)
                //если его значения !=0 (но этого тоже лучше не допускать)
                    // значение_критериев_группы+=взвешенное_знач
ние_критерия_по_году_рейтинга
        //значение верхней группы+=вес_верхней_группы*значение_группы.

Но проблема в том, что в Qt (4.7.1) нельзя просто получить список детей элемента(только итерировать по ним, либо получить, но они удаляться из виджета/айтема). Я попробую написать алгоритм, но прощу помощи здесь, вдруг что-то упустил..

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


По ограничениям , наложенными на ввод данных интерфейсом, не может быть так, что у элемента с типом 1002 будут элементы с типом, не равным 1003.
А для элемента 1003 не может быть потомков.
А не правильно обработал в прошлый раз из-за того, что типа айтемов сбились..точнее алгоритм их выставления был не верным.
Либо изменять алгоритм обхода (что бы он проверял, есть ли у элемента потопки-подгруппы) ,либо переделывать алгоритм выставления типов.
Вот что выдает обход дерева ,по типам, сейчас :
Код
"Научно-исследовательская работа" 1001
  "Научная работа" 1002
  "Объем НИОКР" 1003
  "Участие в изобретательской деятельности" 1003
"Подготовка научных кадров" 1002 <--вот здесь должен был быть тип 1001, т.к. элемент содержит ПОДгруппу.
"Научная работа студентов" 1002
   "Участие в договорных НИОКР" 1003
   "Доклады на неделе науки и конференциях" 1003
"Подготовка соискателей ученых степеней" 1002 <--вот здесь должен был быть тип 1001, т.к. элемент содержит ПОДгруппу.
"Эффектиновсть подготовки" 1002
   "Эффектиновсть аспирантуры" 1003
   "Эффективность работы по подготовке докторов наук" 1003
"Участие в подготовке научных кадров" 1002
   "Подготовка аспирантов" 1003
   "Участие в советах по защите диссертаций" 1003
"Научные труды" 1002
   "Доклады" 1003
   "Монографии" 1003
   "Статьи" 1003

Я перепроверю алгоритм, и выложу результат сюда (если возникнут проблемы)..
Вот, а за ответ, volvo, спасибо! Ты всегда помогаешь : )

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.05.2024 1:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name