Wegstreckenberechnung per Kommandozeilenparameter - häää???



  • Hallöchen, bin jetzt auch hier. 😃
    Ich habe erst vor kurzem mit der C programmierung angefangen und habe folgende aufgabe erhalten:

    Es ist ein Programm zu schreiben, bei welchem die Wegstrecke zwischen verschiedenen Zielen
    berechnet wird. Die einzelnen Orte sind dabei als Kommandozeilenparameter dem main() zu
    übergeben.
    Die Eingabe gilt als korrekt, wenn nur der Anfangsbuchstabe oder der ganze Name des Ortes
    eingegeben wird.
    Es soll dann die Wegstrecke zwischen Anfangsort und Endziel über die angegebenen
    Zwischenstationen bestimmt und am Bildschirm ausgegebenen werden.
    Erstellen Sie eine Tabelle in Excel, um die Entfernungen der Städte zu protokollieren.

    Hilfe:
    Mögliche Eingabe:
    wegstrecke Wien G Salzburg
    Ausgabe:
    Die Strecke .............. beträgt 482km.

    Natürlich will ich die Aufgabe nicht gelöst haben, ist ja auch nicht Sinn und Zweck. Ich habe zurzeit nur leider keinen Plan wie ich anfangen soll. Ich weiss, dass die Kommandozeilenparameter, mit denen der Benutzer das Programm aufruft, in argv[] steht, das kann ich auch auslesen. Allerdings verstehe ich die Frage nach dem "vollständigen Namen und ANFANGSBUCHSTABEN" nicht, wie bekomm ich die Strings aus argv[] raus und verarbeite sie weiter? Gibts da eine Stringfunktion oder so?
    Außerdem hänge ich dabei wie ich die Entfernungen der Werte speichern soll -> (die sache mit der excel tabelle), also wie ich die eintrage -> irgendwas mit einem feld, mehrdimensional oder eindimensional? 😕
    Dann die Eingabe mit dem Feld überprüfen und die Entfernungen zusammenzählen... allerdings haperts eben an der logik wie ich das jetzt genau umsetze, ich werde noch waaahnsinnig. 😡 😞

    Ich hoffe Ihr könnt mir mal ein wenig aus der Patsche helfen und mir tipps geben. 😕 🙂



  • Die Orte und die dazugehörogen Ortskoordinaten (Vectoren) muss das Programm kennen.
    D.h. du könntest (A) die Orte + Koordinaten tabellarisch hardcodiert im Code unterbringen. Oder (B) Die daten in eine excel-Datei (CSV format) ableigen und beim programmstart einlesen.

    Ortsname; Y-Koordinate; X-Koordinate
    Musterstadt; 10.4; 50.3

    Was mich irritiert ist die eingabe eines Anfangsbuchstaben eines Ortes? Was ist wenn mehrer Orte den gleichen Anfangsbuchstaben haben, oder ist das ausgeschlossen?

    es gibt str funktion dir dir helfen:

    strcmp (String mit String vergelichen)
    strstr ((Teil-)string in einem anderen String suchen)
    strupr (Alle buchstaben eines string groß machen)

    typedef struct{
      char acOrt[50]; //Max. 50 zeichen
      double X,Y;
    } ORTDATA;
    
    int main(char **argv[],int argc){
    
      //-> Array anlegen
      ORTDATA meineOrte[500]; // Max 500 orte aus datei lesen
      //-> Datei öffnen und in array speichern (fopen ,fscanf etc.)
      //-> Orte nacheinadner aus argv lesen, und mit allen orten in Array vergleichen
      //-> wenn gefunden Koordinaten untereinander liegen Orte Strecke berechnen.
    // Etc...
    
    }
    


  • Ahornsirup schrieb:

    ...
    Allerdings verstehe ich die Frage nach dem "vollständigen Namen und ANFANGSBUCHSTABEN" nicht, wie bekomm ich die Strings aus argv[] raus und verarbeite sie weiter? Gibts da eine Stringfunktion oder so?

    Hier ein kleines Beispiel, das bei der Eingabe zwei Städtenamen erwartet und dann schaut, ob als Ziel Berlin eingegeben wurde.

    #include <stdio.h>
    #include <string.h>
    
    int main (int argc, char *argv[])
    {
        char Start[255], Ziel[255];
        if (argc<3)
        {
            printf("Zu wenig Parameter !!!");
            return 0;
        }
        // argv[0] enthält den Dateinamen
        strcpy(Start,argv[1]);
        strcpy(Ziel,argv[2]);
        if (strcmp(Ziel,"Berlin")==0)
            printf("Sie haben Berlin als Ziel eingegeben");
        getchar();
    }
    


  • BorisDieKlinge schrieb:

    Die Orte und die dazugehörogen Ortskoordinaten (Vectoren) muss das Programm kennen.
    D.h. du könntest (A) die Orte + Koordinaten tabellarisch hardcodiert im Code unterbringen. Oder (B) Die daten in eine excel-Datei (CSV format) ableigen und beim programmstart einlesen.

    Ortsname; Y-Koordinate; X-Koordinate
    Musterstadt; 10.4; 50.3

    Was mich irritiert ist die eingabe eines Anfangsbuchstaben eines Ortes? Was ist wenn mehrer Orte den gleichen Anfangsbuchstaben haben, oder ist das ausgeschlossen?

    es gibt str funktion dir dir helfen:

    strcmp (String mit String vergelichen)
    strstr ((Teil-)string in einem anderen String suchen)
    strupr (Alle buchstaben eines string groß machen)

    typedef struct{
      char acOrt[50]; //Max. 50 zeichen
      double X,Y;
    } ORTDATA;
    
    int main(char **argv[],int argc){
    
      //-> Array anlegen
      ORTDATA meineOrte[500]; // Max 500 orte aus datei lesen
      //-> Datei öffnen und in array speichern (fopen ,fscanf etc.)
      //-> Orte nacheinadner aus argv lesen, und mit allen orten in Array vergleichen
      //-> wenn gefunden Koordinaten untereinander liegen Orte Strecke berechnen.
    // Etc...
       
    
    }
    

    also die sache mit der struktur wäre ja super nur leider dürfen wir die (noch) nicht verwenden... 🙄 und die orte, die sache mit der datei fällt aus, das kann ich noch nicht... ich habe den tipp bekommen dass es irgendwie mit einem mehrdimensionalen array gelöst wird, nur sind die doch sooo kompliziert 😮
    also in etwa so?

    berlin[][]={200,370,...};
    

    Es ist allerdings ausgeschlossen dass 2 städte den gleichen anfangsbuchstaben haben (wie praxisnah 🙄 ) und wie das mit der zwischenstation gelöst wird, da hapert's ^^
    weil ich will ja zb eingeben können:
    Berlin K Hamburg
    und dabei sollte sowas in der art rauskommen:
    "Die Strecke von Berlin über Köln nach Hamburg beträgt xxx KM"
    😕

    aber ich glaube so langsam lichtet sich der schleier des unwissens in meinem kopf 😃 😃 (zumindest etwas 😉 )
    danke schonmal für eure antworten 👍 🙂
    (und ja, ich bin ein härtefall in C 😃 )



  • Mehrdimensionale Arrays sind auch nicht schwerer als normale (eindimensionale). Aber es wäre schon schöner, wenn du die Daten in einer Datei auslagern würdest/könntest. Falls dir diese Option nicht verboten ist, würd ich sie nutzen. Das ist auch ganz schnell gelernt/verstanden.

    Zwischenstationen:
    Mache einfach mehrere Wegberechnungen und addiere:

    Aufruf:
    "deinProgramm Berlin K Hamburg"

    Wegberechnung Berlin -> K
    Wegberechnung K -> Hamburg
    (Wer hat dir eigentlich so eine besch***** Abkürzung genannt ??? 😉 )



  • Korhil schrieb:

    Mehrdimensionale Arrays sind auch nicht schwerer als normale (eindimensionale). Aber es wäre schon schöner, wenn du die Daten in einer Datei auslagern würdest/könntest. Falls dir diese Option nicht verboten ist, würd ich sie nutzen. Das ist auch ganz schnell gelernt/verstanden.

    Zwischenstationen:
    Mache einfach mehrere Wegberechnungen und addiere:

    Aufruf:
    "deinProgramm Berlin K Hamburg"

    Wegberechnung Berlin -> K
    Wegberechnung K -> Hamburg
    (Wer hat dir eigentlich so eine besch***** Abkürzung genannt ??? 😉 )

    hö, welche abkürzung? naja daran kann nur mein prog-lehrer schuld sein 😃
    naja wir sollen schon die stoffgebiete nehmen die wir auch schon gemacht haben, in nem aufsatz wär das dann vielleicht "schön aber themenverfehlung". 👎
    den aufruf check ich grade nicht ganz, das heisst ich lese einmal das komplette berlin k hamburg per kdozeilenparameter ein, und dann nur den ersten string berling verarbeiten??? oder versteh ich das falsch? 😕



  • du gibst ein um dein Programm zu starten:

    programmname Startort Zwischenstop Ziel

    argv[0] = Programmname
    argv[1] = Startort
    argv[2] = Zwischenstop
    argv[3] = Zielort

    Du solltest es allerdings am besten so flexibel gestalten, dass du 0 bis x Zwischenstops eingeben kannst und das Programm die letzte Angabe als Zielort identifiziert.



  • aha, okay, ich denke ich begreife langsam was ich da so zu tun hab... ich werde jetzt mal ein wenig rumprobieren und dann den (wahrscheinlich falschen code) posten 💡 👍



  • guten abend^^
    also bis jetzt hab ich's so gelöst:

    //Preprozessoranweisungen
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    
    //Funktionsprotoypen
    int kdoCheck(char *argv[]);
    //Main
    int main(int argc, char *argv[]){
    //argc = Anzahl der mitgeschickten char-Pointer; argv = Feld von Strings
    
        //Städte
        int city[9][9] = {{0}};
        /* Angaben der Städteentfernungen zu finden in der Excel Tabelle*!/
        /*New York*/
        city[0][0] = 0; //New York - New York
        city[0][1] = 154;  //New York - Philadelphia
        city[0][2] = 346;  //New York - Boston
        city[0][3] = 2499;  //New York - Dallas
        city[0][4] = 1424;  //New York - Atlanta
        city[0][5] = 1773;  //New York - Memphis
        city[0][6] = 748;  //New York - Cleveland
        city[0][7] = 1759;  //New York - Tallahassee
        city[0][8] = 837;  //New York - Springfield
        city[0][9] = 2627;  //New York - Houston
        /*Philadelphia*/
        city[1][0] = 0; //Philadelphia - Philadelphia
        city[1][1] = 154; //Philadelphia - New York
        city[1][2] = 506; //Philadelphia - Boston
        city[1][3] = 2361; //Philadelphia - Dallas
        city[1][4] = 1246; //Philadelphia - Atlanta
        city[1][5] = 1635; //Philadelphia - Memphis
        city[1][6] = 695; //Philadelphia - Cleveland
        city[1][7] = 1613; //Philadelphia - Tallahassee
        city[1][8] = 826; //Philadelphia - Springfield
        city[1][9] = 2489; //Philadelphia - Houston
        /*Boston*/
        city[2][0] = 0; //Boston - Boston
        city[2][1] = 346; //Boston - New York
        city[2][2] = 506; //Boston - Philadelphia
        city[2][3] = 2843; //Boston - Dallas
        city[2][4] = 1768; //Boston - Atlanta
        city[2][5] = 2117; //Boston - Memphis
        city[2][6] = 1027; //Boston - Cleveland
        city[2][7] = 2115; //Boston - Tallahassee
        city[2][8] = 1316; //Boston - Springfield
        city[2][9] = 2971; //Boston - Houston
        /*Dallas*/
        city[3][0] = 0; //Dallas - Dallas
        city[3][1] = 2499; //Dallas - New York
        city[3][2] = 2361; //Dallas - Philadelphia
        city[3][3] = 2843; //Dallas - Boston
        city[3][4] = 1257; //Dallas - Atlanta
        city[3][5] = 729; //Dallas - Memphis
        city[3][6] = 1903; //Dallas - Cleveland
        city[3][7] = 1419; //Dallas - Tallahassee
        city[3][8] = 1633; //Dallas - Springfield
        city[3][9] = 385; //Dallas - Houston
        /*Atlanta*/
        city[4][0] = 0; //Atlanta - Atlanta
        city[4][1] = 1424; //Atlanta - New York
        city[4][2] = 1246; //Atlanta - Philadelphia
        city[4][3] = 1768; //Atlanta - Boston
        city[4][4] = 1257; //Atlanta - Dallas
        city[4][5] = 616; //Atlanta - Memphis
        city[4][6] = 1141; //Atlanta - Cleveland
        city[4][7] = 433; //Atlanta - Tallahassee
        city[4][8] = 871; //Atlanta - Springfield
        city[4][9] = 1277; //Atlanta - Houston
        /*Memphis*/
        city[5][0] = 0; //Memphis - Memphis
        city[5][1] = 1773; //Memphis - New York
        city[5][2] = 1635; //Memphis - Philadelphia
        city[5][3] = 2117; //Memphis - Boston
        city[5][4] = 729; //Memphis - Dallas
        city[5][5] = 616; //Memphis - Atlanta
        city[5][6] = 1177; //Memphis - Cleveland
        city[5][7] = 870; //Memphis - Tallahassee
        city[5][8] = 907; //Memphis - Springfield
        city[5][9] = 1043; //Memphis - Houston
        /*Cleveland*/
        city[6][0] = 0; //Cleveland - Cleveland
        city[6][1] = 748; //Cleveland - New York
        city[6][2] = 695; //Cleveland - Philadelphia
        city[6][3] = 1027; //Cleveland - Boston
        city[6][4] = 1903; //Cleveland - Dallas
        city[6][5] = 1141; //Cleveland - Atlanta
        city[6][6] = 1177; //Cleveland - Memphis
        city[6][7] = 1572; //Cleveland - Tallahassee
        city[6][8] = 297; //Cleveland - Springfield
        city[6][9] = 2214; //Cleveland - Houston
        /*Tallahassee*/
        city[7][0] = 0; //Tallahassee - Tallahassee
        city[7][1] = 1759; //Tallahassee - New York
        city[7][2] = 1613; //Tallahassee - Philadelphia
        city[7][3] = 2115; //Tallahassee - Boston
        city[7][4] = 1419; //Tallahassee - Dallas
        city[7][5] = 433; //Tallahassee - Atlanta
        city[7][6] = 870; //Tallahassee - Memphis
        city[7][7] = 1572; //Tallahassee - Cleveland
        city[7][8] = 1307; //Tallahassee - Springfield
        city[7][9] = 1141; //Tallahassee - Houston
         /*Springfield, OH*/
        city[8][0] = 0; //Springfield - Springfield
        city[8][1] = 837; //Springfield - New York
        city[8][2] = 826; //Springfield - Philadelphia
        city[8][3] = 1316; //Springfield - Boston
        city[8][4] = 1633; //Springfield - Dallas
        city[8][5] = 871; //Springfield - Atlanta
        city[8][6] = 907; //Springfield - Memphis
        city[8][7] = 297; //Springfield - Cleveland
        city[8][8] = 1307; //Springfield - Tallahassee
        city[8][9] = 1944; //Springfield - Houston
         /*Houston*/
        city[9][0] = 0; //Houston - Houston
        city[9][1] = 2627; //Houston - New York
        city[9][2] = 2489; //Houston - Philadelphia
        city[9][3] = 2971; //Houston - Boston
        city[9][4] = 385; //Houston - Dallas
        city[9][5] = 1277; //Houston - Atlanta
        city[9][6] = 1043; //Houston - Memphis
        city[9][7] = 2214; //Houston - Cleveland
        city[9][8] = 1141; //Houston - Tallahassee
        city[9][9] = 1944; //Houston - Springfield
    
        //Variablendeklarationen
        int i = 0;
    
        //Check, ob GENAU 3 Orte eingegeben wurden
        if(argc!=4) {
          kdoCheck();
        }
        else{
           printf("Falsche Anzahl von Argumenten! Bitte geben Sie genau 3 Orte an!\n");
           return 1;
        }
    
        printf("\n\n\n");
        system("pause");
        return 0;
    }
    /* Name der Funktion: kdoCheck
    *  Aufruf: main()
    *  Beschreibung: Diese Funktion überprüft ob die Eingaben des Users gültig 
    *  sind. Bei Fehler wird 1 returniert.
    */
    int kdoCheck(char *argv[]){
        int j;
    //abfrage ob eingegebene werte mit denen im feld übereinstimmen
        for(){
        }
    }
    

    In der KdoCheck funktion, ich verstehe nicht wie ich das überprüfen kann, iwie haperts da schon an der bedingung in der mitte der for...
    Anschliessend muss ich dann noch die berechnung lösen, ich hoffe ihr könnt mir helfen... 😞 😞
    Wie aus mir mal ein richtiger Programmierer werden soll, das frage ich mich wirklich... 😕 👎



  • Du übergibst nix an die Funktion, d.h. du müßtest den Weg per globaler Variable übergeben, was aber ehr weniger schön ist.
    => übergib die Parameter

    In der Funktion mußt du dann aus den Parameterangaben die Ziffern der Städte gewinnen und dann läuft das wohl nur noch so ab:

    Weg = city[x][y] + city[y][z]

    mit
    x = Startort
    y = Zwischenstop
    z = Zielort



  • danke für die antwort 🙂
    die parameter übergeben? also int kdoCheck(param1, param2); so in etwa?
    und das gewinnen der ziffern für die städte dann in einer schleife?

    oje langsam läuft mir die zeit davon, morgen um 8 uhr abends spätestens muss ichs abgeben 😡 ich will programmieren können!!! 😞



  • Hi!
    Abends abgeben? Machst du ne Abendschule?

    Gültigkeitsprüfung für die Eingabe:
    Du brauchst eine Liste mit allen Städten, z.B. char* cities[] = ...

    Dann brauchst du nur noch das argv-Array durchzugehen und jeden Eintrag
    beginnend mit Index 1 dieses Arrays im Städte-Array wieder zu finden.
    Da ja auch der Anfangsbuchstabe gültig sein soll, brauchst du also
    nur die Anfangsbuchstaben zu vergleichen.

    z.B. so:

    char* cities[] = { "New York", "Philadelphia", "Boston", "Dallas",
                            "Atlanta", "Memphis", "Cleveland", "Tallahassee",
                               "Springfield", "Houston", NULL };  
    char Error[256];
    
    int CitiesExist ( char* c[], unsigned n )
    {
        unsigned i = 0, z = 0;
        char** helper;
    
        for ( i = 1; i <= n; i++ ) // Beginne mit Index 1, 0 ist Programmname.
        {
            helper = cities;
            while ( *helper )
            {
                if ( **helper == c[i][0] )
                {
                     z++; // Anfangsbuchtabe erkannt.
                     break;                        
                }
                *helper++;
            }
            if ( ! *helper ) // Fehler speichern.
            {
              sprintf( Error, "Unknown city: %s\n", c[i] );
              break; // Abbruch bei der ersten unbekannten Stadt.
            }
    
        }
        if ( z == n ) return 0; // Alle Anfangsbuchstaben erkannt.
        else return 1; // Nicht alle Anfangsbuchstaben erkannt.
    }
    
    int main( int argc, char* argv[] ) 
    { 
        if ( argc < 2 ) // Mindestens ein Stadtname. Keine Maximumbegrenzung.
        {
          puts ( "Too few arguments!" );
          return 1;
        }
    
        if ( CitiesExist( argv, argc-1 ) )
            puts ( Error );
    
        return 0; 
    }
    

    Gruß,
    B.B.



  • Ne, aber wir haben so eine Online Plattform für Hausaufgaben etc. 🙂 👍
    Großes THX für den code, ich versteh das jetzt! ich werd mich morgen gleich nach der schule hinsetzen und nochma schnell alle kapitel durchgehen die mir da anscheinend fehlen, und dann endlich diese aufgabe fertig stellen! kann doch nicht so schwer sein 😡 😃 Ich werde programmieren können, das hab ich mir fest vorgenommen. 👍

    EDIT:
    Ich versteh zeile 13 ned ganz, woher nimmst du das "cities"? meinst du damit das städtefeld? das steht ja im main und nicht in der funktion?! 😕



  • Ahornsirup schrieb:

    Ne, aber wir haben so eine Online Plattform für Hausaufgaben etc. 🙂 👍
    Großes THX für den code, ich versteh das jetzt! ich werd mich morgen gleich nach der schule hinsetzen und nochma schnell alle kapitel durchgehen die mir da anscheinend fehlen, und dann endlich diese aufgabe fertig stellen! kann doch nicht so schwer sein 😡 😃 Ich werde programmieren können, das hab ich mir fest vorgenommen. 👍

    EDIT:
    Ich versteh zeile 13 ned ganz, woher nimmst du das "cities"? meinst du damit das städtefeld? das steht ja im main und nicht in der funktion?! 😕

    B.B. Hat die Variable cities ganz am Anfang global deklariert, so kann sie im gesamten Programm genutzt werden, also auch in Zeile 13.



  • Ahornsirup schrieb:

    guten abend^^
    also bis jetzt hab ich's so gelöst:

    int kdoCheck(char *argv[]){
        int j;
    //abfrage ob eingegebene werte mit denen im feld übereinstimmen
        for(){
        }
    }
    

    In der KdoCheck funktion, ich verstehe nicht wie ich das überprüfen kann, iwie haperts da schon an der bedingung in der mitte der for...
    Anschliessend muss ich dann noch die berechnung lösen, ich hoffe ihr könnt mir helfen... 😞 😞
    Wie aus mir mal ein richtiger Programmierer werden soll, das frage ich mich wirklich... 😕 👎

    Irgendwie sieht das so aus, als wenn du vielleicht nochmals einen Schritt zurücktreten solltest (Überblick verschaffen).
    Wenn du programmierst, überlege dir erst, was du machen willst (z.B. alle Parameter durchlaufen) und fange erst danach an zu programmieren.

    Hier sieht das so aus, als wenn dir die for-Schleife gefallen hat, du sie einfügst und dann überlegst, was man denn jetzt damit machen könnte.



  • tja leider hast du da nich ganz unrecht, manchmal zumindest 🙄 👎
    auf die sache mit der globalen variable hätt ich auch selber draufkommen können, seufz 🙄
    Ich glaube es hilft einem als Anfänger, sich mal auf nem zettel alles zu notieren was man machen will und DANN erst den pc einzuschalten... 🙂 programmieren ist wohl 90% hirn und 10% tippen 🙂
    Und genau das werde ich jetzt machen 🙂 👍



  • also ich habs jetzt wirklich geschafft, es ist zwar ein wenig... buggy^^" aber ich habs geschafft 🙂 so, und nun werden erst nochmal grundlagen nachgepaukt! 😃 🙄 😃

    Vielen herzlichen Dank für Eure Hilfe hier, tolle community! 👍 🙂 👍
    Ohne die denkschubser wär ich wohl nicht sehr weit gekommen. 😃
    Mein Programm ist zwar SEHR anfängerhaft und schlecht geschrieben, aber immerhin. 🕶 Irgendwie hab ich langsam richtig Bock auf C, auch wenn das hier wohl niemanden interessiert. 😃



  • Lol! Ich habe genau die selbe Aufgabe (HTL edvo)


Anmelden zum Antworten