Datensatz aus Datei lesen, filtern und sortieren



  • @ padreighn er programmiert C! nicht C++ Siehe Header und gesamten Code.



  • sah ich auch gerade 🙂 fragt sich nur : will er c++ und kann nicht oder hängt er im falschen Forum 😉



  • HighLigerBiMBam schrieb:

    Im Link sind bereits die Funktionen, du musst sie nur korrekt verwenden. Jedenfalls, sollten deine Werte vor dem Schreiben erstmal in einem Array zwischengespeichert werden. Dann werden alle sortiert und erst im Abschluss in eine Datei geschrieben. Ich meinte der Bereich ist falsch du bist momentan im C++ Unterforum.

    Ja soweit war ich auch schon. Mein Problem ist, wie kann ich das mit der Funktion fscanf (die ich hier ja brauche) realisieren. Sprich wie kann ich die Werte Zeilenweise lesen.

    @ padreigh, danke für den Hinweis, jedoch führt das im Rahmen dieser Aufgabe glaube ich zuweit. ich belege nur einen kleinen programmierkurs und die aufgabe sollte auch "normal" zu lösen sein. sicherlich gibt es etliche elegantere und effizientere lösungswege. mir reicht quick and dirty bzw. mit gewöhnlichen verfahren.

    --> Ein Mod mal bitte in den C-Bereihc verschieben, danke



  • Wenn du schon ein Struct Parameter verwendest, dann kannst du auch ein parameter Array verwenden. Dann stellt sich die Frage, ob du manuell speicher anfordern kannst, oder mit einem Array fester Größe arbeitest.

    Kurz um du liest den Parameter und speicherst ihn direkt in ein parameter-array. Dann nimmst du den Array und sortierst ihn. Alternativ musst du mehrdimensionale Arrays verwenden für das Einlesen der strings...



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • #include <stdio.h>
    #include <string.h>
    
    #define DATENSIZE 100
    
    struct parameter 
    { 
    	int nummer; 
    	char zeit[100]; 
    	char art[100]; 
    	double wert; 
    };
    
    void swap(parameter *a, parameter *b)
    {
    	parameter t=*a; *a=*b; *b=t;
    }
    
    void sort(parameter arr[], int beg, int end)
    {
    	if (end > beg + 1)
    	{
    		parameter piv = arr[beg];
    		int l = beg + 1, r = end;
    		while (l < r)
    		{
    			if (arr[l].wert <= piv.wert)
    			l++;
    			else
    			swap(&arr[l], &arr[--r]);
    		}
    		swap(&arr[--l], &arr[beg]);
    		sort(arr, beg, l);
    		sort(arr, r, end);
    	}
    }
    
    void main() 
    {
    	//Lesen
    	FILE*Lese;
    	Lese=fopen ("Messwert.txt","r"); 
    	if (Lese==NULL) 
    	{ 
    		printf("Die Datei konnte nicht geoeffnet werden!\n");
    		return;
    	} 
    
    	parameter daten[DATENSIZE] = {0};
    	int datensatz = 0;
    
    	rewind(Lese);
    	while(fscanf(Lese,"%d%s%s%lf", &daten[datensatz].nummer, &daten[datensatz].zeit, &daten[datensatz].art, &daten[datensatz].wert)!=EOF){
    		printf("%d %s %s %lf \n", datensatz + 1, daten[datensatz].zeit, daten[datensatz].art, daten[datensatz].wert);
    		++datensatz;
    	}
    
    	fclose(Lese); 
    
    	//Sortieren
    	sort(daten, 0, datensatz);
    
    	//Schreiben
    	FILE*Schreibe;
    	Schreibe=fopen ("Datei.txt","w"); 
    	if (Schreibe==NULL) 
    	{ 
    		printf("Die Datei konnte nicht erzeugt werden!\n"); 
    		return;
    	}
    
    	const char typ[] = "TypB";
    	datensatz = 0;
    	while(datensatz < DATENSIZE && daten[datensatz].nummer != 0)
    	{
    		if(!strcmp(daten[datensatz].art, typ))
    			fprintf(Schreibe,"%d %s %s %lf \n", datensatz + 1, daten[datensatz].zeit, daten[datensatz].art, daten[datensatz].wert);
    		++datensatz;
    	}
    
    	fclose(Schreibe); 
    }
    


  • #include <stdio.h>
    #include <string.h>
    
    typedef struct {
    		int Nummer;
    		char Zeit[100];
    		char Art[100];
    		double wert;
    
    	} Parameter;
    
    int cmp(const void *a,const void *b)
    {
      Parameter p1=*(Parameter*)a;
      Parameter p2=*(Parameter*)b;
      return p1.wert>p2.wert?-1: p1.wert<p2.wert;
    }
    
    int main()
    {
    	FILE*Lese;
    	FILE*Schreibe;
    	int c;
            Parameter x,*p=0;
    
    	Lese=fopen ("Messwert.txt","r");
    	Schreibe=fopen ("Datei2.txt","w");
    
    	if (Lese==NULL)
    	{
    		printf("Die Datei konnte nicht geoeffnet werden!\n");
    	}
    
    	if (Schreibe==NULL)
    	{
    		printf("Die Datei konnte nicht erzeugt werden!\n");
    	}
       rewind(Lese); c=0;
    	 while(!feof(Lese))
         if( 4==fscanf(Lese,"%d%s%s%lf",&x.Nummer,x.Zeit,x.Art,&x.wert) )
    	     if( !strcmp("TypB",x.Art))
    		   {
             p=realloc(p,++c*sizeof*p);
             p[c-1]=x;
           }
    
        qsort(p,c,sizeof*p,cmp);
    
        while(c--)
          fprintf(Schreibe,"%d %s %s %f \n",p[c].Nummer, p[c].Zeit, p[c].Art,p[c].wert);
    
        free(p);
    		fclose(Lese);
    		fclose(Schreibe);
    		return 0;
    }
    


  • Wutz schrieb:

    #include <stdio.h>
    #include <string.h>
    
    typedef struct {
    		int Nummer;
    		char Zeit[100];
    		char Art[100];
    		double wert;
    
    	} Parameter;
    
    int cmp(const void *a,const void *b)
    {
      Parameter p1=*(Parameter*)a;
      Parameter p2=*(Parameter*)b;
      return p1.wert>p2.wert?-1: p1.wert<p2.wert;
    }
    
    int main()
    {
    	FILE*Lese;
    	FILE*Schreibe;
    	int c;
            Parameter x,*p=0;
    
    	Lese=fopen ("Messwert.txt","r");
    	Schreibe=fopen ("Datei2.txt","w");
    
    	if (Lese==NULL)
    	{
    		printf("Die Datei konnte nicht geoeffnet werden!\n");
    	}
    
    	if (Schreibe==NULL)
    	{
    		printf("Die Datei konnte nicht erzeugt werden!\n");
    	}
       rewind(Lese); c=0;
    	 while(!feof(Lese))
         if( 4==fscanf(Lese,"%d%s%s%lf",&x.Nummer,x.Zeit,x.Art,&x.wert) )
    	     if( !strcmp("TypB",x.Art))
    		   {
             p=realloc(p,++c*sizeof*p);
             p[c-1]=x;
           }
        
        qsort(p,c,sizeof*p,cmp);
    
        while(c--)
          fprintf(Schreibe,"%d %s %s %f \n",p[c].Nummer, p[c].Zeit, p[c].Art,p[c].wert);
    
        free(p);
    		fclose(Lese);
    		fclose(Schreibe);
    		return 0;
    }
    

    danke fehlt noch der #include <stdlib.h> hab ich eingefügt, bekomme allerdings hier

    p=realloc(p,++c*sizeof*p);
    

    folgenden fehler:

    error C2440: '=' : cannot convert from 'void *' to 'Parameter *'

    Auch das mit dem "*" habe ich noch nicht so ganz verstanden, kann man das irgendwie umgehen, weil das hatten wir noch nicht in unserem Kurs, möchte da ungern zuviel neues einbinden.



  • Du programmierst C Code mit einem C++ Compiler, typischer Anfängerfehler.



  • Wutz schrieb:

    Du programmierst C Code mit einem C++ Compiler, typischer Anfängerfehler.

    Ja bin Anfänger, wäre trotzdem nett wenn du mir bei dem Problem helfen könntest 😉

    Wir müssen (leider?!) das Visual Studio C++ 2008 verwenden, deswegen muss das Programm auch dadrin geschrieben werden.

    Danke



  • Wenn ihr die dynamische Speicherverwaltung noch nicht hattet, dann verwende einfach einen Array fester Größe.



  • Im VStudio musst du für C die Dateiendung auf .c setzen (nicht .cpp!) oder in den Projekteigenschaften C/C++ erweitert... /TC statt /TP setzen.



  • Wutz schrieb:

    Im VStudio musst du für C die Dateiendung auf .c setzen (nicht .cpp!) oder in den Projekteigenschaften C/C++ erweitert... /TC statt /TP setzen.

    Danke für die Info, aber bis jetzt haben wir das noch nicht so gemacht, obs jetzt die feine Art und Weise ist weiß ich nicht. Auf jeden Fall soll das Programm erstmal als cpp gespeichert/compiliert werden.

    Bezüglich Arrays steh ich auch etwas auf dem Schlauch. Wie kann ich die Datei bzw. die Werte darin dann in ein Array schreiben und dann auch sortieren?

    Wiegesagt quick and dirty, also einfach und simpel der Code ohne großen schnick schnack.



  • Ich habe die bisherigen Code ein wenig gemixed und auf Array umgeschrieben. Dürfen nicht mehr als 100 Messwerte(Treffer vom gesuchten Typ) in der Datei sein... Aber ich vermute ihr hattet bislang keine Speicherverwaltung. Wutz Variante ist Aufgrund des dynamischen Arrays jedoch die Beste!

    #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct
    { 
    	int Nummer; 
    	char Zeit[100]; 
    	char Art[100]; 
    	double wert; 
    } Parameter; 
    
    int cmp(const void *a,const void *b) 
    { 
      Parameter p1=*(Parameter*)a; 
      Parameter p2=*(Parameter*)b; 
      return p1.wert>p2.wert?-1: p1.wert<p2.wert; 
    } 
    
    int main() 
    { 
    	const int parametersize = 100;
    
    	Parameter x, p[parametersize]; 
    
    	FILE* Lese=fopen ("Messwert.txt","r"); 
    	if (Lese==NULL) 
    	{ 
    		printf("Die Datei konnte nicht geoeffnet werden!\n");
    		return 1;
    	} 
    
        int c=0; 
    	rewind(Lese);
    	while(!feof(Lese)) 
    		if( 4==fscanf(Lese,"%d%s%s%lf",&x.Nummer,x.Zeit,x.Art,&x.wert) ) 
    			if( !strcmp("TypB",x.Art)) 
    				p[c++]=x; 
    
    	fclose(Lese); 
    
        qsort(p,c,sizeof*p,cmp); 
    
    	FILE* Schreibe=fopen ("Datei2.txt","w"); 
    	if (Schreibe==NULL) 
    	{ 
    		printf("Die Datei konnte nicht erzeugt werden!\n");
    		return 2;
    	} 
    
        while(c--) 
    		fprintf(Schreibe,"%d %s %s %f \n",p[c].Nummer, p[c].Zeit, p[c].Art,p[c].wert); 
    
        fclose(Schreibe); 
    
        return 0; 
    }
    


  • HighLigerBiMBam schrieb:

    Wutz Variante ist Aufgrund des dynamischen Arrays jedoch die Beste!

    wenn er auch noch rückgabewerte testen würde...



  • danke @HighLigerBiMBam

    könntest du mir noch kurz erklären was es mit den ganzen "*" auf sich hat und ob es vielleicht auch ohne geht?

    und wie könnte man das ganze mit bubblesort realisieren?



  • Die "*" sind Zeiger, nachlesen ist wichtig zu wissen. wenn du bubblesort verwenden willst, dann musst du dies nur anstelle des qsort verwenden. Die cmp-Funktion brauchst du dann natürlich auch nichtmehr.



  • hallo.

    wie kann ich es ändern, dass das programm vom Größten zum kleinen Wert ordnet?

    Bis jetzt ist es ja vom kleinsten zum größten, wir sollen das allerdings anders rum machen.

    gibts ferner noch weitere hinweise wie ich den code von "HighLigerBiMBam" noch weiter vereinfachen kann. denn da sind sehr viele sachen drin die wir noch nicht hatten vorallem das mit den "*" aber auch so sachen wie

    p1.wert>p2.wert?-1
    

    mit dem "?"

    ansonsten wäre es nett, wenn du oder jemand anders den code mal kommentieren könnte (am besten für vollblut anfänger)

    HighLigerBiMBam schrieb:

    Ich habe die bisherigen Code ein wenig gemixed und auf Array umgeschrieben. Dürfen nicht mehr als 100 Messwerte(Treffer vom gesuchten Typ) in der Datei sein... Aber ich vermute ihr hattet bislang keine Speicherverwaltung. Wutz Variante ist Aufgrund des dynamischen Arrays jedoch die Beste!

    #include <stdio.h> 
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct
    { 
    	int Nummer; 
    	char Zeit[100]; 
    	char Art[100]; 
    	double wert; 
    } Parameter; 
    
    int cmp(const void *a,const void *b) 
    { 
      Parameter p1=*(Parameter*)a; 
      Parameter p2=*(Parameter*)b; 
      return p1.wert>p2.wert?-1: p1.wert<p2.wert; 
    } 
    
    int main() 
    { 
    	const int parametersize = 100;
     
    	Parameter x, p[parametersize]; 
    
    	FILE* Lese=fopen ("Messwert.txt","r"); 
    	if (Lese==NULL) 
    	{ 
    		printf("Die Datei konnte nicht geoeffnet werden!\n");
    		return 1;
    	} 
    
        int c=0; 
    	rewind(Lese);
    	while(!feof(Lese)) 
    		if( 4==fscanf(Lese,"%d%s%s%lf",&x.Nummer,x.Zeit,x.Art,&x.wert) ) 
    			if( !strcmp("TypB",x.Art)) 
    				p[c++]=x; 
    
    	fclose(Lese); 
        
        qsort(p,c,sizeof*p,cmp); 
    
    	FILE* Schreibe=fopen ("Datei2.txt","w"); 
    	if (Schreibe==NULL) 
    	{ 
    		printf("Die Datei konnte nicht erzeugt werden!\n");
    		return 2;
    	} 
    
        while(c--) 
    		fprintf(Schreibe,"%d %s %s %f \n",p[c].Nummer, p[c].Zeit, p[c].Art,p[c].wert); 
        
        fclose(Schreibe); 
    
        return 0; 
    }
    


  • ich push das hier nochmal, und hoffe dass mir noch jemand weiter helfen kann bezüglich vereinfachung des quellcodes und richtiger sortierung



  • habs nun mal mit bubblesort probiert, aber ich bekomme immer einen fehler:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef struct
    {
        int Nummer;
        char Zeit[100];
        char Art[50];
        double wert;
    } Parameter;
    
    void bubbleSort(double numbers[], int array_size)
    {
      int i, j;
      double temp;
    
      for (i = (array_size - 1); i >= 0; i--)
      {
        for (j = 1; j <= i; j++)
        {
          if (numbers[j-1] > numbers[j])
          {
            temp = numbers[j-1];
            numbers[j-1] = numbers[j];
            numbers[j] = temp;
          }
        }
      }
    }
    
    int main()
    {
        const int parametersize = 100;
    
        Parameter x, p[parametersize];
    
        FILE* Lese=fopen ("Messwert.txt","r");
        if (Lese==NULL)
        {
            printf("Die Datei konnte nicht geoeffnet werden!\n");
            return 1;
        }
    
        int c=0;
        rewind(Lese);
    
        while(!feof(Lese))
            if( 4==fscanf(Lese,"%d%s%s%lf",&x.Nummer,x.Zeit,x.Art,&x.wert) )
                if( !strcmp("Art2",x.Art))
                    p[c++]=x;
    
        fclose(Lese);
    
      bubbleSort(p,c);
    
        FILE* Schreibe=fopen ("Datei2.txt","w");
        if (Schreibe==NULL)
        {
            printf("Die Datei konnte nicht erzeugt werden!\n");
            return 2;
        }
    
        while(c--)
            fprintf(Schreibe,"%d %s %s %f \n",p[c].Nummer, p[c].Zeit, p[c].Art,p[c].wert);
    
        fclose(Schreibe);
    
        return 0;
    }
    

    56)bubbleSort' : cannot convert parameter 1 from 'Parameter [100]' to 'double []'


Anmelden zum Antworten