![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Andrewshkovskii |
![]() ![]()
Сообщение
#1
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Как всегда рассчитываю на помощь volvo
![]() Есть дерево, в нем возможны 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 - 27.12.2010 1:25 |
![]() ![]() |
Andrewshkovskii |
![]()
Сообщение
#2
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
По ограничениям , наложенными на ввод данных интерфейсом, не может быть так, что у элемента с типом 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 - 27.12.2010 10:01 |
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 9:12 |