Реализация алгоритма для поиска обьекта
Всем привет.
Я не силен в алгаритмах, но вот тут возникла проблемка, надо код который работает но с ошибками (да еще и с go to) переделать на нормальный человеческий вид.
Его принцип такой что надо ходить в цикле по обьектам пока не найдем тот который нужно. Движение в направлениях только вверх и вниз.
Ниже привожу кусок кода что является тем который работает но требует как в песне перемен.
QQuickItem * Stack::find(StackItem item, Stack::Direction direction) { QQuickItem *res = nullptr; QQuickItem *itemPage = item.page; QQuickItem *itemFocus = item.focus; QList<QQuickItem *> list; // siblings QQuickItem *itemPrev; QQuickItem *itemNext; // parent, next int i; int i = -1; if(itemFocus) itemPrev = qobject_cast<QQuickItem *>(itemFocus->parent()); else itemPrev = itemPage; if(!itemPrev) return nullptr; list = childrenOf(itemPrev); if(itemFocus) i = list.indexOf(itemFocus); try_another: if(direction == Direction::Up && list.length() > i+1) i++; else if(direction == Direction::Down && i > 0) i--; else { itemNext = itemPrev; itemPrev = qobject_cast<QQuickItem *>(qobject_cast<QQuickItem *>(itemPrev)->parent()); if(itemPrev) { if(itemNext == itemPage) return nullptr; list = childrenOf(itemPrev); i = list.indexOf(itemNext); goto try_another; } else return nullptr; } deeper: if(i < 0 || i > (list.length()-1)) { qDebug() << "fuck invalid index, parent" << itemPrev << i; return nullptr; } itemNext = list[i]; if(itemNext->isVisible() && itemNext->isEnabled()) { if(isEnabledOn(itemNext)) { res = itemNext; goto result; } else { if(childrenOf(itemNext).count()) { if(direction == Direction::Down) i = 0; else i = childrenOf(itemNext).count()-1; itemPrev = itemNext; list = childrenOf(itemPrev); goto deeper; } goto try_another; } } else goto try_another; result: return res; }
А вот так выглядит часть начатой реализации в которой как раз есть нужные циклы за счет которых будет происходить поиск. То есть то что выше в коде надо в правильном порядке чтоли перетащить сюда.
QQuickItem *res = nullptr; QQuickItem *itemPage = item.page; QQuickItem *itemFocus = item.focus; QList<QQuickItem *> list; // siblings QQuickItem *itemPrev; QQuickItem *itemNext; // parent, next int i; int i = -1; if(itemFocus) itemPrev = itemFocus->parentItem(); else itemPrev = itemPage; if(!itemPrev) return nullptr; list = childrenOf(itemPrev); if(itemFocus) i = list.indexOf(itemFocus); list = childrenOf(itemFocus->parentItem()); bool found = false; while (!found) // TODO: if not found { if(direction == Direction::Down) { // TODO: если индекс карента не последний while () // TODO: if last { // visible and enabled } } else if(direction == Direction::Up) { while () // TODO: if first { // visible and enabled } } } return res;
Так же я думаю важным отличием от кода с go to и на что надо переписать так это несколько переменных что будут помогать в поиске. first, last, direction, childre(yes, no)
И прикрепляю файлик с самим алгаритмом. В нем расмотренны все варианты. И само представленеи обьектов по которым происходит поиск.
Дерево
Алгоритм
Надеюсь кто то сможет с этим помочь.
Спасибо.
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 12, 2024, 1:58 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 11:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 11:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10