Мне было легче:
1) создать функцию, которая будет проверять, находится ли элемент где-либо в родительской иерархии другого. Что-то вроде этого (я не буду писать функцию, сделаю ее с WHILE DO):
is_related(id, parent_id);
в вашем примере
is_related(21, 19) == 1;
is_related(20, 19) == 1;
is_related(21, 18) == 0;
2) используйте подвыбор, что-то например:
select ...
from table t
join table pt on pt.id in (select i.id from table i where is_related(t.id,i.id));
Единственная проблема состоит в том, что когда я спрашиваю пользователя, на какую комнату он хочет перейти, если он вводит пустой ввод, то должно выводиться сообщение «Вы должны выбрать комнату».
blockquote >Использование
std::getline
, а затем извлечение числа из строки с помощьюstd::istringstream
- лучшая стратегия для этого.std::string line; std::cout << "Choose an existing room. "; while ( std::getline(std::cin, line) ) { // Try to get the room_change using istringstream. std::istringstream str(line); if ( str >> room_change ) { // Successfully read the room. break; } // Problem reading room_change. // Try again. std::cout << "Choose an existing room. "; }
Я только что запустил ваш код, и когда вы нажмете клавишу ввода, он будет ждать, пока вы не введете число или что-то недопустимое, например символ или строку. Я обнаружил, что если вы измените свой код с
cin >> room_change;
на
cin >> noskipws >> room_change;
, когда пользователь введет пробел, это приведет к тому, что cin.fail () вернет true, а затем перейдите к печати «Выберите существующую комнату».
В вашей ситуации цикл while будет вызываться до тех пор, пока мы не получим действительный ввод. «Выбрать существующую комнату» действительно повторяется, потому что room_change является целым числом, поэтому, когда мы нажимаем Enter, в буфере остается «\ n». Затем цикл while на следующей итерации читает это '\ n' и выполняет cin.fail (), прежде чем позволить вам ввести что-то еще. Одно решение, которое я нашел, состоит в том, чтобы использовать больше операторов cin.ignore ().
for (bool check = false; check == false;) { // Check if input is invalid
cin >> noskipws >> room_change;
if (cin.fail()) {
cout << "Choose an existing room.";
cin.clear();
cin.ignore();
} else if (room_change == room_current) {
cout << "You're already in that room.";
cin.ignore();
} else {
check = true;
cin.ignore();
}
}
Причина в том, что мы хотим избавиться от этого '\ n', чтобы cin.fail () не выполнялся. Тем не менее, я обнаружил, что когда вы вводите символ, он напечатает «Выберите существующую комнату» дважды. Он будет напечатан в первый раз, потому что символ не является целым числом, а во второй раз из-за этого '\ n'.
#include <iostream>
using namespace std;
int main(){
int room_change=200;
cout<<"Enter Blank";
cin>>room_change;
if(room_change==NULL){
cout<<"There is NO-THING"<<endl;
}
if(room_change!=NULL){
cout<<"There is something and that is :"<<room_change<<endl;
}
return 0;
}
Но гораздо более простой подход к этому будет использовать строки. Если это домашняя работа, и вы ограничены только целочисленной переменной. Это намного сложнее, если вы хотите определить, пуст ли буфер или нет. Независимо от ограничений домашней работы, ввод уровня ОС основан на строке. Как я могу использовать cin.get (), чтобы обнаружить пустой пользовательский ввод?