Weg finder
-
Das Ding sieht ja grausam aus.
(das geht los bei einer fehlenden Struktur und hört bei solchen Nonsens-Anweisungen wie "switch(3)" noch lange nicht auf)
-
Grob gesagt für das 2. genannte (wenn ich das richtig in erinnerung habe):
du nummerierst all deine Knotenpunkte (Bahnhöfe)
Du legst ein 2-dimensionales bool array an (können auch vectoren sein), "quadratisch"
(also wenn du 12 Knotenpunkte hast bool wege[12][12] o.ä.)Wenn es jetzt von 3 auf 7 ne Verbindung gibt setzt du wege[5][7] auf true. Wenn der Rückweg auch geht wege[7][5] ebenfalls.
Wann immer du an einem Bahnhof ankommst(z.B Bahnhof
durchläufst du einfach wege[8]for(size_t i=0;i<12;++i) //die 12 durch die Variable ersetzen wo die Anzahl der BahnhLfe drinsteht if(wege[8][i]) cout<<"Es gibt einen Weg von 8 nach "<<i<<endl; else cout<<"Es gibt keinen Weg von 8 nach "<<i<<endl;Sowas in der Art halt. Aber Google und Wikipedia sind hier denke ich wirklich deine besten Freunde.
EDIT: hier sind 2 Posts dazwischengeflogen, jetzt würd ich eher sagen: such dir ein Grundlagentutorial. if(station=a) u.ä. sollte man besser nicht schreiben.
-
Hmm, ich vermute mal, bei Deinem Kenntnisstand ist ein Wegfinde-Algorithmus noch nicht wirklich denkbar. Versuch erst mal, die Basics der Sprache C++ zu lernen.
-
Also ich möchte nur mal eines loswerden.
1.Ich bin erst 16!
2.Ich hab "KEIN" Mathe-Info in der Schule (Weil der Kurs nicht zu stande kam)
3.Ich hab mit HTML angefangen, dann WDL, dann Grundlagen von C und ann Grundlagen von C++, und ein wenig von WinAPI!!!Also bitte nicht meckern. Geht das theoretisch denn mit switch und case?
MFG: LPP1991
-
theoretisch schon, aber es ist nicht empfehlenswert.
du willst einen weg finden, also einen weg vom start zum ziel suchen. eine recht einfache variante dafür ist breitensuche. http://de.wikipedia.org/wiki/Breitensuche
nicht von den ganzen begriffen irritieren lassen. der abschnitt "Algorithmus (informell)" liefert eigentlich genug info.
und dann empfehle ich dir mal die ersten paar lektionen von dem tutorial hier anzugucken: http://www.volkard.de/vcppkold/inhalt.html
-
Ok, vielen Dank! Meine Variante funktioniert tatsächlich, doch wie sage ich dem Programmd dass der alle Wege verschieden speichern soll? Also weg 1 führt über b ung nach H, weg 2 führt über c nach H und weg 3 führt über d nach f zu H. Sodass ich sie vergleichen kann und das programm dann sagt welcher Weg der kürzeste ist? Also mommentan spucjt das Programm einfach den Weg 1 aus, da er immer aus den Case 1 besteht. Jedoch ist Weg 2 halt kürzer. Wie mach ich dass?
LPP1991
-
finde alle wege und such davon den kürzesten aus

-
LPP1991 schrieb:
Also bitte nicht meckern.
Niemand meckert. Wir alle haben mal klein angefangen. Wir haben nur versucht, eine realistische Einschätzung Deines Kenntnissstands vorzunehmen.
-
-
Ja, aber er nimmt immer die Case1'er und die anderen findet der garnicht. Wieso? und wenn ich case3 wegnehme, kommt 2 raus, aber wenn ich case1 oder 2 wegnehme immer noch 3.. das ist komisch. Warum?
#include <cstdlib> #include <iostream> using namespace std; char start; int shortest; int Ziel=0; char *station; int weg=0; int lol; int station_a=0; int station_b=0; int station_c=0; int station_d=0; int station_e=0; int station_f=0; int station_g=0; int station_h=0; int main(int argc, char *argv[]) { station_h=4137; station="a"; while(Ziel==0) { ///////////////////////////////////////////////////////////////////////////////// if (station="a") { if(station_a==4137) { cout << weg; Ziel=1; } station_a=1; switch(3) { case 1: if(station_b!=1){station="b"; weg++; break;} case 2: if(station_c!=1){station="c"; weg++; break;} case 3: if(station_d!=1){station="d"; weg++; break;} } } ///////////////////////////////////////////////////////////////////////////////// if (station="b") { if(station_b==4137) { cout << weg; Ziel=1; } station_b=1; switch(2) { case 1: if(station_g!=1){station="g"; weg++; break;} case 2: if(station_a!=1){station="a"; weg++; break;} } } ///////////////////////////////////////////////////////////////////////////////// if (station="c") { if(station_c==4137) { cout << weg; Ziel=1; } station_c=1; switch(3) { case 1: if(station_h!=1){station="h"; weg++; break;} case 2: if(station_a!=1){station="a"; weg++; break;} case 3: if(station_f!=1){station="f"; weg++; break;} } } ///////////////////////////////////////////////////////////////////////////////// if (station="d") { if(station_d==4137) { cout << weg; Ziel=1; } station_d=1; switch(2) { case 1: if(station_f!=1){station="f"; weg++; break;} case 2: if(station_a!=1){station="a"; weg++; break;} } } ///////////////////////////////////////////////////////////////////////////////// if (station="g") { if(station_g==4137) { cout << weg; Ziel=1; } station_g=1; switch(2) { case 1: if(station_b!=1){station="b"; weg++; break;} case 2: if(station_h!=1){station="h"; weg++; break;} } } ///////////////////////////////////////////////////////////////////////////////// if (station="h") { if(station_h==4137) { cout << weg; Ziel=1; } station_h=1; switch(2) { case 1: if(station_g!=1){station="g"; weg++; break;} case 2: if(station_c!=1){station="c"; weg++; break;} } } ///////////////////////////////////////////////////////////////////////////////// if (station="f") { if(station_f==4137) { cout << weg; Ziel=1; } station_f=1; switch(2) { case 1: if(station_c!=1){station="c"; weg++; break;} case 2: if(station_d!=1){station="d"; weg++; break;} } } } cin>>lol; }
-
station="f"
sowas ist eine zuweisung. das ist zwar gültig in einem if-statement, leistet aber wahrscheinlich nicht, was du willst. dei zuweisung liefert nämlich den wert der variablen nach der zuweisung zurück. da dieser ungleich 0 ist, interpretiert c++ das als "true".
da station ein cstring ist, musst du auch die entsprechende methode zum vergleichen von cstrings verwenden. http://cppreference.com/stdstring/strncmp.html
-
Weil switch nunmal nicht so funktionniert.
An switch übergibst du eine Variable, keine Zahl.
Und es ist nicht so, dass einer meckert. Es ist nur halt so, dass in dem Code recht viele Fehler stecken, was darauf schlieszen lässt dass du erst vor kurzem mit C++ angefangen hast. Daher empfiehlt man dir auch dich einmal durch ein Tutorial zu lesen (gibt ja genug im Internet, sollte auch hier einige Links geben) Danach kannst du einen groszen teil deiner Fehler selbst beheben. Wegfindung scheint halt ganz einfach noch (im Augenblick) etwas zu schwer für deinen Kenntnisstand zu sein.
-
Also, Danke! Hab ich total vergessen, ist aber klar, doch hab ich dadurch einen Fehler bekommen, Ich habe versucht, und versucht, aber der Fehler bleibt. Also hier erstmal der COde nun:
#include <cstdlib> #include <iostream> #include <string.h> using namespace std; char start; int shortest; int Ziel=0; string station[100]; int weg=0; int lol; int station_a=0; int station_b=0; int station_c=0; int station_d=0; int station_e=0; int station_f=0; int station_g=0; int station_h=0; int main(int argc, char *argv[]) { station_h=4137; string station="a"; while(Ziel==0) { ///////////////////////////////////////////////////////////////////////////////// if( strcmp( station, "a" ) == 0 ) { if(station_a==4137) { cout << weg; Ziel=1; } station_a=1; switch(3) { case 1: if(station_b!=1){station="b"; weg++; break;} case 2: if(station_c!=1){station="c"; weg++; break;} case 3: if(station_d!=1){station="d"; weg++; break;} } }usw...
nun der Fehler:
C:\Dev-Cpp\Projects\LUB\main.cpp In function `int main(int, char**)': C:\Dev-Cpp\Projects\LUB\main.cpp no matching function for call to `strncmp(std::string&, const char[2])' C:\Dev-Cpp\include\string.h:51 candidates are: int strncmp(const char*, const char*, size_t)also was ist los? Ich versteh den Fehler nich. Egal ob ich Station als string oder char nehme.
-
strncmp erwartet drei parameter. sagt dir der compiler ja auch. als dritten parameter erwartet es die anzahl der zeichen, die verglichen werden sollen.
vielleicht ist es für dich empfehlenswert, gleich komplett auf std::string umzusteigen. für die kannst du nämlich einfach == verwenden.
string station[100];das definiert übrigens einen array von string mit 100 elementen und keinen string mit 100 zeichen.
-
Also, ich hab es vertsnaden, doch mal eine Frage, wie müsste ich es machen um den User einen Namen einzugeben, und den zu vergleichen. Ich hab das letztenms noch I-Wo gebraucht, doch finde ich die Datei leider nich mehr wo das stand!
-
Also ich habs gefunden und mal so gemacht wie ich denke. Aber wenn ich nun als User "a" eintippe macht das Programm nicht mehr weiter. Und da ich station_h als Ziel gesetzt habe (Durch die Nr. 4137) müsste er mir eigentlich eine "1" anzeigen, da ja von "a" weg++; ausgeführt wird. Doch auch dass passiert nicht. Hier der Code:
#include <cstdlib> #include <iostream> #include <string.h> using namespace std; char start; int shortest; int Ziel=0; int weg=0; int lol; int station_a=0; int station_b=0; int station_c=0; int station_d=0; int station_e=0; int station_f=0; int station_g=0; int station_h=0; string a= "a"; string b= "b"; string c= "c"; string d= "d"; int main(int argc, char *argv[]) { station_b=4137; string station; getline(cin, station); while(Ziel==0) { ///////////////////////////////////////////////////////////////////////////////// if( station.compare("a") == 1 ) { if(station_a==4137) { cout << weg; Ziel=1; } station_a=1; switch(3) { case 1: if(station_b!=1){station.erase(); station.append(B); weg++; break;} case 2: if(station_c!=1){station.erase(); station.append(c); weg++; break;} case 3: if(station_d!=1){station.erase(); station.append(d); weg++; break;} } }usw...
-
switch(3) ist absoluter Unfug! (Warum wurde bereits erklärt)
-
Weil switch immer noch nicht so funktionniert. Versuch es mal mit switch(station_a)
-
Also ich habe alle switch() mit Switch(station_"buchstabe") ersetzt. Doch funktioniert es immer noch nicht, er springt immer noch nicht weiter.
warum?
-
Also hier der Code. Es kommen zwar komische ergebnisse raus so wie 8,7,1,0 und so, scheint aber zu funktionieren, doch wenn ich z.B. B als Ziel setze, und der User "d" als startpunkt eintippt, scheint es wieder nicht zu funktionieren, da ich dann kein Ergebnmis erhalte. und noch was, Woher kommt die Zahl 8 etc.?? und wie kann ich dem jetzt sagen der soll alle Wege finden und schaun wo der kürzeste lang geht? Müsste danit doch auch gehen oder?
#include <cstdlib> #include <iostream> #include <string.h> using namespace std; char start; int shortest; int Ziel=0; int weg=0; int lol; int station_a=0; int station_b=0; int station_c=0; int station_d=0; int station_e=0; int station_f=0; int station_g=0; int station_h=0; string a= "a"; string b= "b"; string c= "c"; string d= "d"; string f= "f"; string g= "g"; string h= "h"; int main(int argc, char *argv[]) { station_h=4137; string station; getline(cin, station); while(Ziel==0) { ///////////////////////////////////////////////////////////////////////////////// if( station.compare("a") == 0) { if(station_a==4137) { cout << weg; Ziel=1; } station_a=1; switch(station_a) { case 1: if(station_b!=1){station.erase(); station.append(b); weg++; } case 2: if(station_c!=1){station.erase(); station.append(c); weg++; } case 3: if(station_d!=1){station.erase(); station.append(d); weg++; } } } ///////////////////////////////////////////////////////////////////////////////// if( station.compare("b") == 0) { if(station_b==4137) { cout << weg; Ziel=1; } station_b=1; switch(station_b) { case 1: if(station_g!=1){station.erase(); station.append(g); weg++; } case 2: if(station_a!=1){station.erase(); station.append(a); weg++; } } } ///////////////////////////////////////////////////////////////////////////////// if( station.compare("c") == 0) { if(station_c==4137) { cout << weg; Ziel=1; } station_c=1; switch(station_c) { case 1: if(station_h!=1){station.erase(); station.append(h); weg++; } case 2: if(station_a!=1){station.erase(); station.append(a); weg++; } case 3: if(station_f!=1){station.erase(); station.append(f); weg++; } } } ///////////////////////////////////////////////////////////////////////////////// if( station.compare("d") == 0) { if(station_d==4137) { cout << weg; Ziel=1; } station_d=1; switch(station_d) { case 1: if(station_f!=1){station.erase(); station.append(f); weg++; } case 2: if(station_a!=1){station.erase(); station.append(a); weg++; } } } ///////////////////////////////////////////////////////////////////////////////// if( station.compare("g") == 0) { if(station_g==4137) { cout << weg; Ziel=1; } station_g=1; switch(station_g) { case 1: if(station_b!=1){station.erase(); station.append(b); weg++; } case 2: if(station_h!=1){station.erase(); station.append(h); weg++; } } } ///////////////////////////////////////////////////////////////////////////////// if( station.compare("h") == 0) { if(station_h==4137) { cout << weg; Ziel=1; } station_h=1; switch(station_h) { case 1: if(station_g!=1){station.erase(); station.append(g); weg++; } case 2: if(station_c!=1){station.erase(); station.append(c); weg++; } } } ///////////////////////////////////////////////////////////////////////////////// if( station.compare("f") == 0) { if(station_f==4137) { cout << weg; Ziel=1; } station_f=1; switch(station_f) { case 1: if(station_c!=1){station.erase(); station.append(c); weg++; } case 2: if(station_d!=1){station.erase(); station.append(d); weg++; } } } } cin>>lol; }MFG: LPP1991
PS. Danke dass ihr eure zeit opfert mir zu helfen.