000
27.05.2008, 14:03 Uhr
Fingolin
|
Hallo Im Rahmen eines Schul-Projekts soll ich ein Programm schreiben,dass den kürzesten Weg sucht(Bellman Ford algorithmus) Hier auszüge meines Codes in dem ich die Fehler/den Fehler vermute: int Suche Strecke
C++: |
int SucheStrecke(char *pStartpunkt,cStrecke *pStrecke,int AnzahlStrecken,cPunkt *pPunkt,int AnzahlPunkte,char *pEndpunkt,int i) { char pStart[Namenslaenge]; i=-1; while (i!=AnzahlStrecken) { i++; if (strcmp(pStrecke[i].Endpunkt_Name,pStartpunkt)==0)//Strecke ist der Start { if (pPunkt[i].Markiert==false)//Strecke wurde bisher nie erreicht. { pPunkt[i].Markiert=true; strcpy(pPunkt[i].Vorgaenger,pStartpunkt);//Vorgänger wird festgelegt pPunkt[i].Laenge=(pStrecke[i].Laenge+Vorgaengerlaenge(pStrecke[i].Anfangspunkt_Name,pPunkt,AnzahlPunkte));//Länge die gebraucht wurde um Punkt zu erreichen strcpy(pStart,pStrecke[i].Anfangspunkt_Name);//Weiter suchen... if (strcmp(pStart,pEndpunkt)!=0)//außer wenn punkt = ziel ist. { SucheStrecke(pStart,pStrecke,AnzahlStrecken,pPunkt,AnzahlPunkte,pEndpunkt,-1); } } else if (pPunkt[i].Markiert==true && pPunkt[i].Laenge>(pStrecke[i].Laenge+Vorgaengerlaenge(pStrecke[i].Anfangspunkt_Name,pPunkt,AnzahlPunkte)))//Strecke wurde erreicht aber es gibt einen krzeren weg { strcpy(pPunkt[i].Vorgaenger,pStartpunkt);//Vorgänger wird überschrieben... pPunkt[i].Laenge=(pStrecke[i].Laenge+Vorgaengerlaenge(pPunkt[i].Vorgaenger,pPunkt,AnzahlPunkte));//& Länge festgelegt strcpy(pStart,pStrecke[i].Anfangspunkt_Name);//weiter suchen... if (strcmp(pStart,pEndpunkt)!=0)//außer wenn punkt = ziel ist. { SucheStrecke(pStart,pStrecke,AnzahlStrecken,pPunkt,AnzahlPunkte,pEndpunkt,-1); } } }
else if (strcmp(pStrecke[i].Anfangspunkt_Name,pStartpunkt)==0)//Strecken können auch Rückwärts gegangen werden. { if (pPunkt[i].Markiert==false)//Punkt wurde noch nie erreicht. { int j=AnzahlStrecken; pPunkt[i].Markiert=true; strcpy(pPunkt[i].Vorgaenger,pStartpunkt); pPunkt[i].Laenge=(pStrecke[i].Laenge+Vorgaengerlaenge(pStrecke[i].Endpunkt_Name,pPunkt,AnzahlPunkte)); strcpy(pStart,pStrecke[i].Endpunkt_Name); if (strcmp(pStart,pEndpunkt)!=0) { SucheStrecke(pStart,pStrecke,AnzahlStrecken,pPunkt,AnzahlPunkte,pEndpunkt,-1); } } else if (pPunkt[i].Markiert==true && pPunkt[i].Laenge>(pStrecke[i].Laenge+Vorgaengerlaenge(pStrecke[i].Endpunkt_Name,pPunkt,AnzahlPunkte))) { strcpy(pPunkt[i].Vorgaenger,pStartpunkt); pPunkt[i].Laenge=(pStrecke[i].Laenge+Vorgaengerlaenge(pPunkt[i].Vorgaenger,pPunkt,AnzahlPunkte)); //################################### strcpy(pStart,pStrecke[i].Endpunkt_Name); if (strcmp(pStart,pEndpunkt)!=0) { SucheStrecke(pStart,pStrecke,AnzahlStrecken,pPunkt,AnzahlPunkte,pEndpunkt,-1); } } else { cout << " Ein Fehler trat auf." << endl;//Fehler } }
} return 0; };
|
int Vorgängerlänge:
C++: |
int Vorgaengerlaenge(char *pVorgängername,cPunkt *pPunkt,int AnzahlPunkte) { bool a=false; for (int i=0;i<AnzahlPunkte;i++) { if (strcmp(pPunkt[i].Name,pVorgängername)==0) { return pPunkt[i].Laenge; a=true; } } if (a==false) { cout << "Ein Fehler ist aufgetreten!" << endl; } return 0; };
|
int Route
C++: |
int Route(cPunkt *pPunkt,int AnzahlPunkte,char *pZielort) { char Ziel[Namenslaenge];
strcpy(Ziel,pZielort); cout << "Zielort: " << pZielort << endl; for (int i=0;i<AnzahlPunkte;i++) { if (strcmp(pPunkt[i].Vorgaenger,Ziel)==0) { cout << "Der Zielort " << pZielort << " Wurde erreicht." << endl; return 0; } if (strcmp(pPunkt[i].Name,pZielort)==0) { cout << pPunkt[i].Name << " erreicht über den Vorgänger: "<< pPunkt[i].Vorgaenger << endl; AnzahlPunkte--; for (int j=0;j<AnzahlPunkte;j++) { if (strcmp(pPunkt[i].Vorgaenger,pPunkt[j].Name)==0) { cout << pPunkt[j].Name << " erreicht über " << pPunkt[j].Vorgaenger << endl; pZielort=pPunkt[j].Vorgaenger; } } } } return 0; };
|
Die erste Funktion soll den kürzesten Weg suchen,und in die klasse Punkte schreiben... Die 2.hilft ein wenig dabei und die 3. soll dann alles ausgeben... Ach ja die Headerdatei noch:
C++: |
#define Namenslaenge 20 class cStrecke { public: char Anfangspunkt_Name[Namenslaenge]; char Endpunkt_Name[Namenslaenge]; void Anfangspunkt_Anzeigen(); void Endpunkt_Anzeigen(); int Laenge; int Anfangspunkt_Nummer; int Endpunkt_Nummer; bool Anfangspunkt_Start; bool Endpunkt_Start; bool Anfangspunkt_Ende; bool Endpunkt_Ende; int Streckennummer; cStrecke();
};
class cPunkt { public: char Name[Namenslaenge]; void getname(); char returnname(int i); bool Markiert; int Nummer; char Vorgaenger[Namenslaenge]; int Laenge; cPunkt(); };
void GetDaten(int AnzahlPunkte,int *pPunkte,cStrecke *pStrecke,cPunkt *pPunkt); void StreckenLoeschen(cStrecke *pStrecke,int AnzahlStrecken); int SucheStrecke(char *pStartpunkt,cStrecke *pStrecken,int AnzahlStrecken,cPunkt *pPunkt,int AnzahlPunkte,char *pEndpunkt,int i); void Strecken_neu(cStrecke *pStrecke,int AnzahlStrecken,cStrecke *pStrecken); int Vorgaengerlaenge(char *pVorgängername,cPunkt *pPunkt,int AnzahlPunkte); int Route(cPunkt *pPunkt,int AnzahlPunkte,char *pZielort);
|
Fehlermeldungen bekomme ich keine ich bekomm eben nur nich die kürzeste Strecke^^ Bin sehr dankbar für eure Antworten... Grüße Fingolin -- Wenn einer mit Vergnügen zu einer Musik in Reih und Glied marschieren kann, dann hat er sein großes Gehirn nur aus Irrtum bekommen, da für ihn das Rückenmark schon völlig genügen w�rde. |