Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Kürzester Weg..

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.05.2008, 14:35 Uhr
xXx
Devil


Ehm ich geh jetzt nicht alles durch aber du scheinst die Sprache noch nicht verstanden zu haben return verlässt die Funktion!

C++:
int Vorgaenger_laenge(const char* ptr_name, const cPunkt* ptr_points, const std::size_t size)
{
    for (std::size_t i(0); i < size; ++i)
        if (std::strcmp(ptr_points[i].Name, ptr_name) == 0)
            return ptr_points[i].Laenge;
  
    std::cerr << "FEHLER: Punkt konnte nicht gefunden werden!" << std::endl;
    return 0;
}
wäre z.B. wesentlich ordentlicher

Und das zieht sich bei dir durch Räum auf und guck dann nochmal gezielt per Debugger, was falsch ist

Achja, du nutzt C++ ... dann nimm lieber std::string + Referenzen und guck dir mal das Schlüsselwort "const" an
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.05.2008, 14:48 Uhr
Fingolin



äh ja ich denk du trifst des wesentliche *hust* hab mich weng damit übernommen bin leider noch am lernen^^ ich könnte jetzt anfangen und fragen was ist
C++:
const char
aber ich glaube das hätte kein Sinn und kein Ende xD naja danke trotzdem...

ps.:
"return verlässt die Funktion!"
bei welcher Funktion meinst du das?
Danke nochmal
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.

Dieser Post wurde am 27.05.2008 um 14:52 Uhr von Fingolin editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.05.2008, 16:42 Uhr
xXx
Devil


Bei deinem Vorgangerlaenge z.B. damit kannst du dir die Bool variable sparen, weil a nie auf true gesetzt wird und false immer gleich a ist. Doch da du durch return die Funktion verlässt ist das ja auch korrekt und nur überflüssig
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.05.2008, 18:07 Uhr
öni




C++:
const
bedeutet immmer das es eine Konstante sein muss, die man normalerweise beim initaliesieren vorläd und dessen Wert sich nie ändern kann. Ein gutes Beispiel wäre:

C++:
const float pi=3.14159265

pi bleibt ja immer gleich und man brauch es nicht zu verändern eine Konstante eben.


C++:
char
ist in C++ meist ein einzelnes Zeichen (Asci-Code) also zum Beispiel a oder b oder sonst was wie 7 oder & oder ( oder = .......i,f,z,d,e,s.....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.05.2008, 18:18 Uhr
Suba Esel



Vielleicht noch als Ergänzung - bei önis Beispiel schlägt ein "pi = 5" dann fehl, du bekommst einen Compilerfehler.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.05.2008, 18:28 Uhr
Fingolin



Also es ist nich der Fehler aber eine mögliche Quelle meint ihr oder?^^
Danke
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: