Aufgabe zum Montag bitte Hilfe



  • wesam88 schrieb:

    Aufgabe zum Montag bitte Hilfe /* <- tolles Timing, viele kommen hier erst So. >22Uhr mit ihren Fragen zu Montag */

    http://www.4shared.com/file/Hrldt4bW/CanDaten.html
    /* <- war jetzt nicht wirklich ernst gemeint, da man sich zur Dateneinsicht erst registrieren muss */

    /* 
     * File:   Aufgabe3.5.c
     * Author: Metro
     *
     * Created on 4. Mai 2012, 22:59
     */
    
    #include <stdio.h>
    #include <io.h> /* <- Müll, raus damit */
    #include <stdlib.h>
    
    /*
     * 
     */
     
    int main(void) {
        int long lines; /* <- Müll, raus mit int */
        int i,j;
        float z;
        char* zeile ;
        
        FILE* fp = fopen("Candaten.dat", "r");
        if (fp == NULL)
        {
            printf("Datei kann nicht geoeffnet werden\n");/* <- Müll, hier muss Programmende mit return oder exit() hin */
        }
        else
        {
            char* zeile ;  /* <- falsch, hier wird kein Speicherbereich definiert, außerdem ist zeile schon zuvor definiert */      
            for (lines=0;fgets(zeile,100,fp);++lines){} /* falsches Ergebnis, wenn Zeilen >99 Zeichen vorliegen */
        }
      float t;
      fseek(fp,0,SEEK_SET); /* <- Professorenschrott, muss portabel natürlich fseek(fp,0L,SEEK_SET) heißen, besser einfach rewind(fp) */
      
      float Daten[lines][5]; /* oberhässliches VLA, auch Professorenmüll */
      int zeiger=2; /* <- ein Zeiger ist kein int, ein int ist kein Zeiger */
      for(i=0;i<lines;i++)
          for(j=0;j<5;j++)
          {
              fseek(fp,zeiger,SEEK_SET); /* <- Müll, raus damit */
              fscanf(fp, "%f", &t); /* <- fscanf positioniert fp schon für dich, explizites o.g. fseek macht nur alles wieder kaputt */
              /* hier fscanf-Rückgabewert unbedingt auswerten, damit bemerkst du evtl. falsch einlesene Daten */
              Daten[i][j]=t;
              zeiger+=11;
          }
      fclose(fp);
       
      
        return (0);
    }
    

  • Mod

    Wutz schrieb:

    fseek(fp,0,SEEK_SET); /* <- Professorenschrott, muss portabel natürlich fseek(fp,0L,SEEK_SET) heißen, besser einfach rewind(fp) */
    

    Na, die korrekte implizite Umwandlung von 0 nach 0L ist dir aber schon portabel garantiert.



  • "...die korrekte implizite Umwandlung..." braucht z.B. nicht zu funktionieren bei einer Implementierung von fseek als Makro.
    Auf irgendwas Implizites zu vertrauen wenn man auch gleich was Eindeutiges explizit vorgeben kann ist auch nur Fehlerverschleierung und/oder bringt Portabilitätseinbußen mit sich, gerade für Lernende ungeeignet und aus Sicht von Lehrenden sogar schon fahrlässig.



  • fseek ist kein Makro, sonder eine Funktion (per Standard). Deine Argumentation ist albern. Sie wäre selbst dann albern, wenn fseek ein Makro sein dürfte, weil sich dieses Makro wie eine Funktion der Signatur int fseek(FILE*, long, int); verhalten müsste und bei deren Aufruf eine implizite Umwandlung stattfände. Ferner wird genau diese Umwandlung in einer Fußnote im Standard verwendet.



  • Versuche, die Aufgaben ein einzelne Funktionen zu separieren und von rein "technischen" Aktionen wie Dateioperationen zu trennen; in den Funktionen kannst du dich dann auf deine eigenen (fachlichen) Probleme konzentrieren:

    void skaliereZeit(float fm[][5],int i)
    {
      float minzeit=fm[0][0]; /* erster Wert einer Zeile soll wohl die Zeit sein ...; => Zeitwert des 1. Datensatzes/Zeile */
      float maxzeit=fm[i-1][0]; /* Arrays ist C beginnen immer bei 0 (und enden bei Größe-1); => Zeitwert des letzten Datensatzes/Zeile */
      float bereich=(maxzeit-minzeit);
      int x;
      for(x=0;x<i;++x)
        ...
    }
    
    void skaliereGeschwindigkeiten(float fm[][5],int i)
    {
    }
    
    void normiereGeschwindigkeiten(float fm[][5],int i)
    {
    }
    
    void ausgabeIntegerMatrix(float fm[][5],int i,char *name)
    {
      FILE *f=fopen(name,"w");
      int x,y;
      for(x=0;x<i;++x,fputc('\n',f)) /* hier die "Matrix"werte einzeln durchlaufen und als int-Wert in neue Datei schreiben */
        for(y=0;y<5;++y)
          fprintf(f,"%d ",(int)fm[x][y]);
      fclose(f);
    }
    
    int main(void) {
      FILE *f;
      if( f=fopen("Candaten.dat","r") )
      {
        int i=0;
        float *zeiger=0;
        while( (zeiger=realloc(zeiger,++i*sizeof*zeiger))!=0 && 1==fscanf(f,"%f",&zeiger[i-1]) ); /* alle durch Whitespaces getrennte float-Werte einlesen */
        fclose(f);
        --i;  /* i sind jetzt Anzahl der einlesenen float-Werte */
        i/=5; /* i ist jetzt Anzahl der Zeilen */
        skaliereZeit(zeiger,i);
        skaliereGeschwindigkeiten(zeiger,i);
        normiereGeschwindigkeiten(zeiger,i);
        ausgabeIntegerMatrix(zeiger,i,"CanDatenSkaliert.dat");
        free(zeiger);
      }
    
     return 0;
     }
    


  • @Wutz
    der totale schrott hat aber funktioniert 😮


  • Mod

    coolzero0001 schrieb:

    @Wutz
    der totale schrott hat aber funktioniert 😮

    Das hat der Kapitän der Titanik auch gedacht, als sie aus dem Hafen fuhr.



  • SeppJ schrieb:

    Wutz schrieb:

    fseek(fp,0,SEEK_SET); /* <- Professorenschrott, muss portabel natürlich fseek(fp,0L,SEEK_SET) heißen, besser einfach rewind(fp) */
    

    Na, die korrekte implizite Umwandlung von 0 nach 0L ist dir aber schon portabel garantiert.

    wutz ich bedanke mich bei dir
    Deine Hinweise helfen mir
    Ich habe meine Zeit verloren, mit fseek(fp,0,SEEK_SET)
    Ein Buchstabe spielt manschmal wichtige Rolle



  • Wutz schrieb:

    Versuche, die Aufgaben ein einzelne Funktionen zu separieren und von rein "technischen" Aktionen wie Dateioperationen zu trennen; in den Funktionen kannst du dich dann auf deine eigenen (fachlichen) Probleme konzentrieren:

    void skaliereZeit(float fm[][5],int i)
    {
      float minzeit=fm[0][0]; /* erster Wert einer Zeile soll wohl die Zeit sein ...; => Zeitwert des 1. Datensatzes/Zeile */
      float maxzeit=fm[i-1][0]; /* Arrays ist C beginnen immer bei 0 (und enden bei Größe-1); => Zeitwert des letzten Datensatzes/Zeile */
      float bereich=(maxzeit-minzeit);
      int x;
      for(x=0;x<i;++x)
        ...
    }
    
    void skaliereGeschwindigkeiten(float fm[][5],int i)
    {
    }
    
    void normiereGeschwindigkeiten(float fm[][5],int i)
    {
    }
    
    void ausgabeIntegerMatrix(float fm[][5],int i,char *name)
    {
      FILE *f=fopen(name,"w");
      int x,y;
      for(x=0;x<i;++x,fputc('\n',f)) /* hier die "Matrix"werte einzeln durchlaufen und als int-Wert in neue Datei schreiben */
        for(y=0;y<5;++y)
          fprintf(f,"%d ",(int)fm[x][y]);
      fclose(f);
    }
    
    int main(void) {
      FILE *f;
      if( f=fopen("Candaten.dat","r") )
      {
        int i=0;
        float *zeiger=0;
        while( (zeiger=realloc(zeiger,++i*sizeof*zeiger))!=0 && 1==fscanf(f,"%f",&zeiger[i-1]) ); /* alle durch Whitespaces getrennte float-Werte einlesen */
        fclose(f);
        --i;  /* i sind jetzt Anzahl der einlesenen float-Werte */
        i/=5; /* i ist jetzt Anzahl der Zeilen */
        skaliereZeit(zeiger,i);
        skaliereGeschwindigkeiten(zeiger,i);
        normiereGeschwindigkeiten(zeiger,i);
        ausgabeIntegerMatrix(zeiger,i,"CanDatenSkaliert.dat");
        free(zeiger);
      }
    
     return 0;
     }
    

    Ich finde so besser und gut aussieht, aber ich darf in dieser Aufgabe nur in HauptProgramm Arbeiten

    Aufjedenfall danke ich dir 🙂 🙂 🙂



  • #include <stdio.h> 
    #include <stdlib.h>
    
    /*
     * 
     */
    
    int main(void) {
        long lines;
        int i,k,j;
        float t,Zeit_min,Zeit_max,Rad_min,Rad_max,Rad_differenz;
        float Zeit_Skalierungsfaktor,Rad_Skalierungsfaktor;
        char* zeile ;
    
        FILE* fp = fopen("Candaten.dat", "r");
        if (fp == NULL)
        {
            printf("Daten kann nicht  geoeffnet werden\n");//fehler meldung
            return(0);
        }
        else
        {        
            for (lines=0;fgets(zeile,500,fp);++lines){}
        }
        fseek(fp,0l,SEEK_SET);
        float Daten[lines][5];
        float Datenskaliert[lines][5];
        for(i=0;i<lines;i++)
            for(j=0;j<5;j++)
            {
                fscanf(fp, "%f", &t);
                Daten[i][j]=t;
                Datenskaliert[i][j]=t;
    
            }
    
        Zeit_min=Daten[0][0];
        Zeit_max=Daten[lines-1][0];
        Zeit_Skalierungsfaktor=800/Zeit_max;
    
        Rad_max=Daten[0][1];
        Rad_min=Daten[0][1];
        float a[2];
        for(i=0;i<lines;i++)
            for(j=1;j<5;j++)
             {
               if (Daten[i][j] < Rad_min)
                    a[0] = Daten[i][j];
                if (Daten[i][j] > Rad_max)
                    a[1] = Daten[i][j];                
             }
        Rad_min=a[0];
        Rad_max=a[1];
       printf("%f\n%f\n",Rad_min,Rad_max);
    
        Rad_differenz= Rad_max- Rad_min;
    
        for(i=0;i<lines;i++) 
            Datenskaliert [i][0] *= Zeit_Skalierungsfaktor;
        Rad_Skalierungsfaktor = 400 / Rad_max;
        for(i=0;i<(lines);i++)
        {
            for(j=1;j<5;j++)
            {
                Datenskaliert[i][j] = (Datenskaliert[i][j] * Rad_Skalierungsfaktor);
            }
        }
            FILE *fp2;
        fp2=fopen("CanDatenSkaliert.dat","wt");
    
    //Fehlerabfrage
        if (fp2 == NULL)
        {
            printf("CanDatenSkaliert.dat kann nicht geoeffnet werden\n");
            return(-1);
        }
        for(i=0;i<lines;i++)
        {
            for(j=0;j<5;j++)
            {
                fprintf(fp2,"%2.0f\t ",Datenskaliert[i][j]);
                if (j % 5 == 4)
                    fprintf(fp2,"\n");
            }
        }
        fclose(fp2);
        fclose(fp);
    
        return (0);
    }
    

    Das habe ich gemacht, und das funktioniert 😉 😉


  • Mod

    SeppJ schrieb:

    coolzero0001 schrieb:

    @Wutz
    der totale schrott hat aber funktioniert 😮

    Das hat der Kapitän der Titanik auch gedacht, als sie aus dem Hafen fuhr.

    wesam88 schrieb:

    [...viel Code...]
    Das habe ich gemacht, und das funktioniert 😉 😉

    Der Eisberg sagt dazu:

    test.c: In function ‘main’:
    test.c:11:47: warning: variable ‘Rad_differenz’ set but not used [-Wunused-but-set-variable]
         float t,Zeit_min,Zeit_max,Rad_min,Rad_max,Rad_differenz;
                                                   ^
    test.c:11:13: warning: variable ‘Zeit_min’ set but not used [-Wunused-but-set-variable]
         float t,Zeit_min,Zeit_max,Rad_min,Rad_max,Rad_differenz;
                 ^
    test.c:10:11: warning: unused variable ‘k’ [-Wunused-variable]
         int i,k,j;
               ^
    [b]test.c:23:27: warning: ‘zeile’ may be used uninitialized in this function [-Wuninitialized]
             for (lines=0;fgets(zeile,500,fp);++lines){}[/b]
    

    ⚠ Der fett markierte ist schwerwiegend! ⚠



  • auch wenn einige sagen es ist alles schrott von mir!

    " Variablen immer am anfang definieren und initialisieren! "

    so wirds auch in der Technikerschule gelehrt.


Anmelden zum Antworten