C - Koordinaten aus Datei einlesen !!DRINGEND!!



  • Hallo!

    Ich muss für eine Uni-HA ein Programm schreiben, hab jedoch einige Tutorien verpasst. Daher brauch ich dringend eure Hilfe :):)!!

    Ein Teil des Programms, bzw einer im Hauptprogramm integrierten Funktion verlangt unteranderem folgendes:

    "Die Funktion einlesen liest die x- und y-Koordinaten der einzelnen Städte ein.
    Die Anzahl der eingelesenen Städte wird als Rückgabewert an das Hauptprogramm zurückgegeben."

    Also es gibt eine Datei mit Stadtkoordianaten, die beispielsweise so aussieht:

    000 243
    333 232
    334 223

    etc.

    Die Funktion soll diese Wertepaare als x, y Koordinaten abspeichern und die Anzahl der Werte dem Hauptprogramm zurückgeben.

    Bin jetzt soweit, und hab meine Fragen als Kommentare eingeschoben:
    ( Will ja nicht meine Hausaufgabe komplett von euch abschreiben 😉 )

    void einlesen /*void oder int? muss nach einlesen was in Klammern?*/
    
    {
            FILE *datin;
            char buffer[100];
            int x[20], y[20];
            int N;
    
            do {
    
                    printf("\nBitte Dateinamen eingeben!\n");
                    fgets (buffer, 100, stdin);
                    sscanf (buffer, "%s", dname);
                    datin = fopen (dname, "r");
    
                    if ( datin == NULL) printf("Datei existiert nicht!");
    
            } while ( datin != NULL); 
    
    // SO, bis hierhin wird Datei im Lesemodus geöffnet, ggf Fehlermeldung, 
    //jetzt der problematichere Teil..
    
            N = 0;
    
            do {
    
                    N++;
                    /*wie lese ich speziell aus der N-ten zeile der Datei?*/
                    fscanf(datin, "%i %i", x[N], y[N]); //ist das einlesen und zuweisen Richtig?
    
            } while ( N <= 20 /*bis 20 städte ausgelesen wurden*/ && /* oder bis das dateiende erreicht ist, wie schreib ich das hin? */)
    
            return N;
    }
    

    Bitte antwortet möglichst bald!!
    Danke für JEDEN nützlichen Tipp schonmal im Voraus!
    Grüße, ser_u 🙂


  • Mod

    Der beste Tipp ist, dass du den Stoff schnellstmöglich nachholst. Wenn dir in der Programmierung die Grundlagen fehlen, dann kannst du alles weitere vergessen und wirst hier bloß mit allen weiteren Hausaufgaben genau so ratlos aufschlagen. Hol dir daher ein gutes Buch (Zum Beispiel Kernighan & Ritchie. Nichts für Dummies, von A bis Z, in 21 Tagen oder mit ähnlichen Titeln!) oder arbeite gute(!) Internettutorials durch (leider sind Internetutorials oft von Anfangern geschrieben, sei dir daher sicher, dass das Tutorial von jemandem geschrieben wurde, der sich auskennt! Die Situation ist zwar in C nicht ganz so übel wie bei C++, aber aus dem Kopf heraus fallt mir trotzdem keines ein). Deine Vorlesungsunterlagen könnten auch nützlich sein.

    Dass dir jede Menge wichtigste Grundlagen fehlen, sieht man an den Fragen:

    void einlesen /*void oder int? muss nach einlesen was in Klammern?*/
    

    Du willst also den Kopf einer Funktion schreiben Guck dir erst einmal an, wie das überhaupt vom Grundprinzip her geht (das beantwortet die Frage nach den Klammern). void oder int? Das ist der Rückgabewert. Guck dir an, was das bedeutet. Die Frage beantwortet sich dann über die Anforderung

    Die Anzahl der eingelesenen Städte wird als Rückgabewert an das Hauptprogramm zurückgegeben."

    Was in die Klammern kommt, beantwortet sich über die Anforderung

    Die Funktion soll diese Wertepaare als x, y Koordinaten abspeichern und die Anzahl der Werte dem Hauptprogramm zurückgeben.

    Problem ist: Dies (d.h. call by reference) ist schon ein gehobenes Thema beim Umgang mit Funktionen. Dies zu erklären, bevor du nicht die Grundlagen kannst, kann man gleich vergessen. Du musst also erst einmal lernen, wie das mit Funktionen geht, dann hilft dir danach das Stichwort weiter. Erschwerend kommt noch das Thema Arrays dazu, welche sich bei Funktionen anders verhalten, als ein Anfänger naiv erwarten würde. Ich kann leider nicht einschätzen, wie gut du dich mit Arrays auskennst.

    int x[20], y[20];
    

    Diese Zeile wird sich wohl erledigt haben, wenn du das mit dem Funktionskopf verstanden hast.

    fgets (buffer, 100, stdin);
                    sscanf (buffer, "%s", dname);
                    datin = fopen (dname, "r");
    

    Du stellst zwar keine Frage, aber das Vorgehen ist ein bisschen konfus. Es ist ja sehr löblich, dass du fgets benutzt, aber was soll danach das sscanf? Außerdem: Was ist dname?

    } while ( datin != NULL);
    

    "while" bedeutet "so lange wie", nicht "bis". Grundlagen zu Schleifen sind auch von allerhöchster Wichtigkeit.

    /*wie lese ich speziell aus der N-ten zeile der Datei?*/
    

    Schwierig (aber machbar), jedoch: Wozu? Wenn du einen Datensatz nach dem anderen liest, dann weißt du doch, den wievielten Datensatz du gerade liest.

    fscanf(datin, "%i %i", x[N], y[N]); //ist das einlesen und zuweisen Richtig?
    

    Nein. Die scanf-Funktionsfamilie zu verstehen ist auch von höchster Wichtigkeit. Dies geht Hand in Hand mit dem oben genannten call by reference. Aber wieder musst du erst die Grundlagen verstehen, bevor man hier groß etwas erklären kann. Außerdem: Fehlerprüfung?

    } while ( [...] /* oder bis das dateiende erreicht ist, wie schreib ich das hin? */)
    

    Ganz anders. Wie gesagt: "while" heißt "so lange wie". Das heißt, wenn du das Dateiende erreichst, dann schlägt dein scanf fehl, du tust aber trotzdem so, als ob es gelungen wäre, erst dann prüfst du, ob das Lesen erfolgreich war. Die Logik einer Leseschleife sollte so aussehen:

    solange (Datenlesen mit Erfolg)
    {
      Verarbeite gelesene Daten.
    }
    

    Allgemein: Compiliere deinen Code zum Test, schalte Compilerwarnungen ein, behandle Warnungen wie Fehler. Eine Menge von den obigen Kommentaren hätte dein Compiler dir bereits geben können.



  • ser_u schrieb:

    /*void oder int?

    Du willst etwas zurückgeben....

    ser_u schrieb:

    muss nach einlesen was in Klammern?*/

    Klammern müssen sein. Ob da was rein muss, musst du wissen.
    Eine schlechte Idee ist es nicht.

    ser_u schrieb:

    /*wie lese ich speziell aus der N-ten zeile der Datei?*/

    Du kommst zur N-ten Zeile, indem du die vorhergehenden überliest.

    ser_u schrieb:

    //ist das einlesen und zuweisen Richtig?

    fscanf erwartet die Adressen der Variablen.
    Schau dir mal Beispiele von scanf an: http://www.cplusplus.com/reference/cstdio/scanf/

    Wenn du bis <=20 gehst, dann sprichst du auch das Element mit dem Index 20 an.
    Das existiert aber nicht, da der Index beim Array immer bei 0 anfängt (und in deinem Fall bis 19 geht).

    Du hast das fclose vergessen.

    Jetzt hast du die Koordinaten in der Funktion.
    Die gehen aber verloren, wenn du die Funktion verlässt.
    Zwei Arrays (x und y) sind auch nicht so prall. Mach eine struct und daraus ein Array.



  • Also DANKE schonmal das ihr euch so schnell bereit erklärt habt, mir zu helfen 🙂
    Super!

    (Ja, richtig, ich muss viel nacharbeiten, Privatleben hat mich gezwungener Maßen vom lernen abgehalten... naja)

    Also ich fang mal ganz oben an, beim Funktionskopf.
    Es ist, wie gesagt, eine Funktion(wegen Rückgabewert).
    Der Rückgabewert ist eine integer Zahl, daher muss es "int" sein und nicht "void".
    Wäre der RW eine Zahl vom Typ float, müsste "float" im Funktionskopf stehen.

    Und dieser Rückgabewert hängt von den Koordinatenpaaren, welche integer sind, ab, daher kommen diese zwischen den Klammern.

    int einlesen( int x[20], int y[20] )
    {...}

    Richtig soweit? 🙂

    Übrigens müssen es, denke ich mal, getrennte Arrays sein, weil mit diesen Paaren noch gerechnet wird. (Abstände untereinander)

    Gruß, ser_u



  • Bis auf den letzten Satz ist das soweit richtig.



  • Hey, falls es interessiert, ich war jetzt in einer Sprechstunde in der Uni und hab alle offenen Fragen mit den Tutoren geklärt!

    Danke nochmal für eure Anregungen!

    Grüße, ser_u


Anmelden zum Antworten