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  +


Вот накидал код, по-логике вроде верно, а на деле..сейчас буду проверять..
void MainWindow::function_1(const QTreeWidgetItem* item,const int &year )
{
    QTreeWidgetItem *item2;
    QTreeWidgetItem *item3;
qDebug() << "recursion here";
    for(int i=0;i<item->childCount();++i)
    {
        item2 = item->child(i);
        qDebug() << "for(int i=0;i<item->childCount();++i)" << item2->text(0);
        if(item2->type()==1001 && item2->childCount() > 0)
        {
            qDebug () << "if(item2->type()==1001 && item2->childCount() > 0)";
            for(int j=0;j<item2->childCount();++j)
            {
                item3 = item2->child(j);
                qDebug() << "for(int j=0;j<item2->childCount();++j)" << item3->text(0);
                function_1(item3,year);
            }
           if(subGroupValue!=0)
              groupValue+=groupWeight_(criteriaGroupMap.value(item2))*subGroupValue;
           else
               groupValue+=groupWeight_(criteriaGroupMap.value(item2))*groupCriteriaValue;
        }else if(item2->type()==1002 &&item2->childCount()>0)
                {
                    qDebug() << "else if(item2->type()==1002 &&item2->childCount()>0)";
                    for(int j=0;j<item2->childCount();++j)
                    {
                        item3=item2->child(j);
                        qDebug() << "for(int j=0;j<item2->childCount();++j)" << item3->text(0);
                        groupCriteriaValue+=weightedCriteriaValue_(criteriaMap.value(item3),year);
                    }
                    subGroupValue=groupWeight_(criteriaGroupMap.value(item2))*groupCriteriaValue;//вес группы в которой расположены критерии
                }else if(item2->type()==1003)
                        {
                            qDebug() << "else if(item2->type()==1003)" << item2->text(0);
                            groupCriteriaValue+=weightedCriteriaValue_(criteriaMap.value(item2),year);
                        }
    }
    groupValue+=groupWeight*groupValue;//значения для item, т.е. элемента верхнего уровня.-- подумать о том, что это значения для высшего УРОВНЯ.
}

Добавив отладочный вывод получаю :
Код
recursion here
for(int i=0;i<item->childCount();++i) "Научная работа"
else if(item2->type()==1002 &&item2->childCount()>0)
for(int j=0;j<item2->childCount();++j) "Объем НИОКР"
for(int j=0;j<item2->childCount();++j) "Участие в изобретательской деятельности"
for(int i=0;i<item->childCount();++i) "Подготовка научных кадров"
else if(item2->type()==1002 &&item2->childCount()>0)
for(int j=0;j<item2->childCount();++j) "Научная работа студентов"
for(int j=0;j<item2->childCount();++j) "Подготовка соискателей ученых степеней"
for(int i=0;i<item->childCount();++i) "Научные труды"
else if(item2->type()==1002 &&item2->childCount()>0)
for(int j=0;j<item2->childCount();++j) "Доклады"
for(int j=0;j<item2->childCount();++j) "Монографии"
for(int j=0;j<item2->childCount();++j) "Статьи"

Уровень рекурсии 1, а должен был быть более. Видно что не идет вниз в подгруппах, может сбились типы, проверю завтра, сейчас уже голова не варит, пойду спать..

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

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


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

 



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