Zeilenweise einlesen und Maximum-Suche



  • Hallo,

    ich bin neu hier und habe am Montag einen C-Test an der Uni und bräuchte euere Hilfe.
    meine Aufgabe lautet:

    Schreiben Sie ein C-Programm, das von der Datei "input.txt" (in Ihrem TestVerzeichnis) die dort gespeicherten Zahlenwerte zeilenweise einliest, innerhalb jeder Zeile den Minimalwert findet und diese Minimalwerte untereinander am Bildschirm ausgibt.
    Programmieren Sie diese Aufgabe unter Verwendung von zumindest 1 Schleifenanweisung!

    Ich schaffe das zeilenweise einlesen zwar. Aber ich weiß nicht wie ich dann die Zeilen unterscheiden kann, dass ich je Zeile das Maximum finden kann.
    Ich möchte es auch nicht mit einer Matrix programmieren.

    Über rasche antworten würde ich mich sehr freuen! DANKE!



  • ich wollte noch hinzufugen: das ist das, was ich bisher habe. input.txt ist die einzulesende datei. (besteht bei mir jetzt aus 10 zeichen pro zeile mit insgesamt 2 zeilen. (jeweils zahlen von 1 bis 10).
    mein problem wie gesagt ist jetzt die bedinung für das maximum pro zeile.

    #include <stdio.h>
    #define File "/Users/julia/Desktop/input.txt"
    #define MAX_LINELENGTH 1024
    #define LAENGE 2

    main()
    {
    char buffer[ MAX_LINELENGTH+1 ];
    double x=0, max, a[0];
    FILE *f=fopen(File,"r");

    if(f==NULL)
    {printf("Cannot open %s\n",File);
    return(1);
    }

    while(fgets(buffer, MAX_LINELENGTH, f))
    printf("%s",buffer);

    }

    Danke nochmal



  • juliatheresarosa schrieb:

    Hallo,

    ich bin neu hier und habe am Montag einen C-Test an der Uni und bräuchte euere Hilfe.
    meine Aufgabe lautet:

    Schreiben Sie ein C-Programm, das von der Datei "input.txt" (in Ihrem TestVerzeichnis) die dort gespeicherten Zahlenwerte zeilenweise einliest, innerhalb jeder Zeile den Minimalwert findet und diese Minimalwerte untereinander am Bildschirm ausgibt.
    Programmieren Sie diese Aufgabe unter Verwendung von zumindest 1 Schleifenanweisung!

    Ich schaffe das zeilenweise einlesen zwar. Aber ich weiß nicht wie ich dann die Zeilen unterscheiden kann, dass ich je Zeile das Maximum finden kann.
    Ich möchte es auch nicht mit einer Matrix programmieren.

    Über rasche antworten würde ich mich sehr freuen! DANKE!

    in der Angabe ist Minimalwert mit Maximalwert zu vertauschen!



  • Kapsele die Funktionalität zur Interpretation einer Zeile in Werte und die Max.-Berechnung in einer(oder 2) Funktionen und rufe diese Funktion in while auf.
    Du hast auch nicht gesagt, wie deine Werte in der Zeile vorliegen, d.h. wodurch getrennt, wieviele es sind (ob die Anzahl gleich ist, was den Code erheblich vereinfachen würde) und ob es int,float oder sonstwas sind.

    float maxvonzeile(const char*s)
    {
      int n=0;
      float f,r=FLT_MIN;
      while( *s && sscanf(s+=n,"%f%n",&f,&n)==1 )
        if( f>r ) r=f;
      return r;
    }
    ...
    while(fgets(buffer, MAX_LINELENGTH, f))
    printf("Max = %f",maxvonzeile(buffer));
    

    für durch Whitespace getrennte floats in jeder Zeile mit beliebiger Anzahl pro Zeile



  • ich soll dies ales input.txt einlesen:

    # Textversuch
    # hiu
    # blabla
    # Ding Dong
    # Das ist ein Test
    # Hui
    575.84 6.
    212.02 7.
    247.04 8.
    800.90 9.
    378.3
    2754.98456
    345 825 123
    489 567 203
    785 658 245
    889 997 4589
    1245 5647 666
    4236 145 4444
    47 89 233
    111 22 36699

    und danke mal für deine antwort!



  • Zeile 5 wird dir dein Lehrer sicher nicht abnehmen, am Beispiel solltest du nur das Prinzip erkennen, obwohl das Beispiel auch für deine nachgereichte Datenstruktur funktionieren sollte.



  • Wutz schrieb:

    Zeile 5 wird dir dein Lehrer sicher nicht abnehmen, am Beispiel solltest du nur das Prinzip erkennen, obwohl das Beispiel auch für deine nachgereichte Datenstruktur funktionieren sollte.

    der input wurde von meinem Professor an der Uni ausgegeben. für den inhalt kann ich nichts 🙂
    aber leider funktionert es mit meinem code nicht. habe jetzt neu probiert:

    #include <stdio.h>
    #define File "/Users/julia/Desktop/input.txt"
    #define MAX_LINELENGTH 100
    main()
    {
    char buffer[ MAX_LINELENGTH+1 ];
    int a[MAX_LINELENGTH];
    int iText=0;
    int iDaten=0;
    int i=0; /*Anzahl der Zeilen*/

    FILE *f=fopen(File,"r");

    if(f==NULL)
    {printf("Cannot open %s\n",File);
    return(1);
    }
    while(fgets(buffer, MAX_LINELENGTH, f))
    //printf("%s",buffer);
    {
    if (buffer[0]=='#') {iText++;}

    //else
    //{iDaten++;

    {for(iDaten=0; iDaten < MAX_LINELENGTH; iDaten++)

    {if(iDaten=MAX_LINELENGTH) {i++;}

    {sscanf (buffer, "a[%i]: %i\n",&iDaten,&a[MAX_LINELENGTH]);
    printf("Die %i. Zeile lautet: %i\n",i, a[MAX_LINELENGTH]);
    }
    }
    }
    }

    printf("Die Anzahl der Textzeilen ist: %d\n\n", iText);

    fclose(f);
    return(0);
    }

    wär dankbar wenn mir jemand das mit MAX_LINLENGTH erklären kann. wenn ich da 1 eingeben dann rennt er im terminal von zeile 1 bis ∞ und endlosschleife und wenn ich 100 eingebe dann bekomme ich nur 18 statt (wie im input file) 20.

    DANKE



  • Ohne den ganzen Code angeschaut zu haben (kann man ohne Code-Tags kaum lesen):

    if(iDaten=MAX_LINELENGTH) {i++;}
    

    Das sieht nach einer ungewollten Zuweisung aus.



  • MAX_LINELENGTH ist deine Länge von buffer, d.h. max. MAX_LINELENGTH-1 Zeichen werden von fgets hier reinkopiert zzgl. des abschließenden '\0'.
    Du musst also in der deiner Schleife unterhalb von fgets bis zum Stringende vom jeweiligen buffer-Inhalt laufen, du läufst derzeit immer bis ganz ans Ende.
    Und wie ist ein String-Ende in C definiert? Hat dich das dein Professor nicht gelehrt?
    Richtig, bis '\0' vorkommt:

    for(iDaten=0; buffer[iDaten]!='\0'; iDaten++)
    

    Damit hast du aber noch nicht viel erreicht, du sollst die Zeichen ja zusammen als float interpretieren, da nützen dir die einzelnen Zeichen nichts.
    Ich nehme mal an, dein Lehrer will auf strtok hinaus, damit "teilst" du den String ein einzelne Teile getrennt durch z.B. Leerzeichen ' ' auf, die du dann mit z.B. atof (ist etwas einfacher zu handhaben als sscanf) in einen float-Wert wandeln kannst und damit auswerten kannst.
    Also werfe die o.g. Schleife weg und benutze eine strtok Schleife, da kannst du mal nach suchen.


Anmelden zum Antworten