IF Bedingungen + Logik = 2 Probleme
-
Guten Tag,
ich steh gerade vor 2 Problemen. Ich verwende 3 IF Bedingungen mit logischen Operatoren. Nun habe ich erstens das Problem das bei diesem Code..
if(( stadt1 == "Hong Kong" && stadt2 == "Singapur" ) || ( stadt1 == "Hamburg" && stadt2 == "Dubai" ) || ( stadt1 == "Singapur" && stadt2 == "Hong Kong" ) || ( stadt1 == "Dubai" && stadt2 == "Hamburg" ))die 2. Zeile total überflüßig ist. Da die IF Bedingung die Variablen einfach nur mal umgekehrt betrachtet. Leider funktioniert meine IF Bedingung nicht ohne die 2. Zeile. Wie kann ich also am besten dem Compiler später übermitteln das auch die umgekehrte Variante möglich ist.
Das zweite Problem was ich habe ist die Unübersichtlichkeit bei meiner größten Bedingung..
if(( stadt1 == "Hong Kong" && stadt2 == "Los Angeles" ) || ( stadt1 == "Hong Kong" && stadt2 == "Dubai" ) || ( stadt1 == "Los Angeles" && stadt2 == "Singapur" ) || ( stadt1 == "Singapur" && stadt2 == "Dubai" ) || ( stadt1 == "Hamburg" && stadt2 == "Rio de Janeiro" ) || ( stadt1 == "Hamburg" && stadt2 == "Los Angeles" ) || ( stadt1 == "Los Angeles" && stadt2 == "Rio de Janeiro" ) || ( stadt1 == "Rio de Janeiro" && stadt2 == "Dubai" ) || ( stadt1 == "Hamburg" && stadt2 == "Hong Kong" ) || ( stadt1 == "Los Angeles" && stadt2 == "Dubai" ) || ( stadt1 == "Hamburg" && stadt2 == "Singapur" ))Diese IF Bedingung ist so schon schrecklich lang und hier habe ich noch nichtmal die umgekehrte Variante miteinbezogen wodurch sie nochmal doppelt solang werden würde.
Könnte mir jemand vielleicht helfen damit ich die umgekehrte Variante nicht verwenden brauch?
Und vielleicht kann mir jemand zu einer anderen Alternative als meine mit den Bedingungen raten.
-
Waere es nicht einfacher das ueber find () zu machen?
The find() algorithm looks for an element matching val between start and end. If an element matching val is found, the return value is an iterator that points to that element. Otherwise, the return value is an iterator that points to end.
-
Chiiter das ist pures Chaos.
Du musst versuchen das anders anzugehen. Ich kann dir nicht einmal genau sagen wie weil ich das gesamt problem nicht kenne. Aber das ist offensichtlich der falsche weg und es gibt mit sicherheit eine weitaus bessere lösung.
-
Es ist so das ich 6 Städte habe. Ich habe immer eine Startstadt und eine Zielstadt. Diesen habe ich eine Entfernung zugeordnet. Kurz, Mittel und Lang. Deswegen sind die Städte in den kleinen Klammern mit UND verknüpft und ich habe 3 IF Bedingungen. Es gibt aber bei 6 Städten 30 unterschiedliche Start und Ziel Kombinationen. Ich habe das als erstes mit UND und ODER festgehalten. Am Ende hab ich gesehen das die Formel recht lang ist.
Bei find() bin ich mir nicht ganz sicher wie ich das realisiere soll. Ich könnte die Start und Ziel Strings mit einem + zusammenfügen und dann danach mit find() suchen, wie in dem Beispiel mit einer Schleife. Aber ich brauch ja dann trotzdem 3 Bedingungen und irgendeinen Vergleich.
edit: ach moment ich könnte ja auch 3mal find() benutzen oder? Ich glaub ich hab da eine Idee die ich mal testen muss. Meld mich später
-
Etwa so wuerde ich es machen:
vector <string> ListTowns; vector <string>::iterator Pos_1; vector <string>::iterator Pos_2; ListTowns.push_back ("Hong Kong"); ListTowns.push_back ("Los Angeles"); ListTowns.push_back ("Hong Kong"); ListTowns.push_back ("Singapur"); ListTowns.push_back ("Dubai"); ListTowns.push_back ("Rio de Janeiro"); Pos_1 = find (ListTowns.begin (), ListTowns.end (), Town_1); Pos_2 = find (ListTowns.begin (), ListTowns.end (), Town_2); if ((Pos_1 == ListTowns.end ()) || (Pos_2 == ListTowns.end ())) cout << "Not in List" << endl; else cout << "Bingo!" << endl;
-
Hab jetzt das hier zusammen gecodet. Leider kann ich den Code nicht testen, da ich massig an Fehlermeldungen bekomme. Liegt wohl daran das ich vielleicht vergessen habe ein paar Bibliotheken zu includen und anderem.
Ist das hier denn in etwa ein guter Lösungsansatz?
# include <iostream> # include <string> # include <algorithm> int main() { string stadt1; string stadt2; string reise; string result1, result2; std::cout << "Stadt1: "; std::getline(cin, stadt1); std::cout << endl; std::cout << "Stadt2: "; std::getline(cin, stadt2); std::cout << endl << endl; reise = stadt1 + stadt2; vector <string>::iterator ListTowns1; vector <string>::iterator ListTowns2; ListTowns1.push_back("Hong KongSingapur"); ListTowns1.push_back("HamburgDubai"); ListTowns2.push_back("SingapurHong Kong"); ListTowns2.push_back("DubaiHamburg"); vector<string>::iterator result1; vector<string>::iterator result2; result1 = find( ListTowns1.begin(), ListTowns1.end(), reise ); result2 = find( ListTowns2.begin(), ListTowns2.end(), reise ); if( (result1 != ListTowns1.end()) || (result1 != ListTowns2.end()) ) std::cout << "kurze Strecke"; }
-
Probier das mal:
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { string stadt1; string stadt2; vector<string>::iterator result1; vector<string>::iterator result2; vector <string> ListTowns; ListTowns.push_back("Hong Kong"); ListTowns.push_back("Singapur"); ListTowns.push_back("Dubai"); ListTowns.push_back("Hamburg"); cout << "Stadt1: "; getline(cin, stadt1); cout << endl; cout << "Stadt2: "; getline(cin, stadt2); cout << endl << endl; result1 = find( ListTowns.begin(), ListTowns.end(), stadt1 ); result2 = find( ListTowns.begin(), ListTowns.end(), stadt2 ); if( (result1 != ListTowns.end()) && (result2 != ListTowns.end()) ) cout << "kurze Strecke"; else cout << "Not in List"; return 0; }
-
Vielen Dank an alle ich habe jetzt die Lösung. Ich hab bei meinem Quellcode jetzt einfach das geändert was ich ändern musste damit es läuft. Ich musste es so machen, da ich zB von Hamburg nach Hong Kong keine kurze Strecke in meinem kleinen Projekt habe, sondern nur von Hamburg nach Dubai und zurück. Von Singapur nach Hong Kong und zurück sind auch eine kurze Strecke, aber nicht von Singapur nach Hamburg.
edit: Hab übrigens herausgefunden das es bei Vektoren wohl Probleme mit Leerzeichen in Strings gibt. Weiß jemand warum?
Hier mal der Code und vielen dank an die die mir hier geholfen haben.
# include <iostream> # include <string> # include <vector> # include <algorithm> using namespace std; int main() { string stadt1; string stadt2; string reise; vector <string> ListTowns1; vector <string> ListTowns2; vector <string>::iterator result1; vector <string>::iterator result2; cout << "Stadt1: "; getline(cin, stadt1); cout << endl; cout << "Stadt2: "; getline(cin, stadt2); cout << endl << endl; reise = stadt1 + stadt2; ListTowns1.push_back("Hong_KongSingapur"); ListTowns1.push_back("HamburgDubai"); ListTowns2.push_back("SingapurHong_Kong"); ListTowns2.push_back("DubaiHamburg"); result1 = find( ListTowns1.begin(), ListTowns1.end(), reise ); result2 = find( ListTowns2.begin(), ListTowns2.end(), reise ); if( (result1 != ListTowns1.end()) || (result1 != ListTowns2.end()) ) cout << "kurze Strecke"; else cout << "Konnte nicht gefunden werden"; }
-
Mit diesen Iteratoren kenne ich mich leider (noch) nicht aus, bin auch noch Anfänger. Ich habe es mal mit Schleifen gemacht.
Es geht vielleicht noch einfacher, doch hier das funktioniert zumindest.
Schau es dir an, eventuell kann man damit was anfangen, wenn nicht dann nicht.
Die Eingaben (cin) kann man sich selber dazu basteln.vector<string> town; town.push_back("Dubai"); town.push_back("Hamburg"); town.push_back("Singapur"); town.push_back("Hongkong"); string stadt1, stadt2; stadt1 = "Hamburg"; stadt2 = "Dubai"; int s1flag = 0, s2flag = 0; if( (stadt1 != stadt2) ) { // Städte dürfen nicht gleich sein for( size_t i = 0; i < town.size(); ++i ) { if( stadt1 == town[i] ) { stadt1 = town[i]; s1flag = 0; break; } else s1flag = 1; } for ( size_t j = 0; j < town.size(); ++j ) { if( stadt2 == town[j] ) { stadt2 = town[j]; s2flag = 0; break; } else s2flag = 1; } if( s1flag == 1 || s2flag == 1 ) { cout << "Nicht oder unvollstaendig" << endl; } else cout << stadt1 << endl << stadt2 << endl; } else cout << "Gleichheit" << endl;cstddef includen für size_t