Matrizen nach der Anzahl ihrer Elemente sortieren



  • Hi,
    für Uni müssen wir ein Programm schreiben, dass Matrizen einliest aus einer Datei, die Matrizen sortiert und wieder ausgibt.
    Leider hab ich bei dem Sortieren noch so einige Probleme.
    Wie man hier sieht hapert es auch noch an anderer stelle aber hier gehts mir gerade nur um die Sortierung.

    Folgende Datei soll eingelesen werden

    1 1
    2
    
    2 3
    1 2 3.3
    4 5 6
    
    2 1
    -2.5
    3
    

    Und das hier ist mein Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
    	double m[100][100];
    	int zeile;
    	int spalte;
    }MATRIX;
    
    int main(void)
    {
    	int vergleich(const void *a, const void *b);
    
    	MATRIX *ptr;
    	int i,j,x, anzahl=0,rueckgabe;
    
    	FILE *f;
    	f=fopen("ss06.in","r");
    	FILE *s;
    	s=fopen("ss06.out","w");	
    
    	ptr = (MATRIX *)malloc(sizeof(MATRIX));
    
    	rueckgabe = fscanf(f,"%d %d",&((*ptr).zeile),&((*ptr).spalte));
    
    	for (i=0;i<((*ptr).zeile);i++)
    	{
    		for (j=0;j<((*ptr).spalte);j++)
    		{
    			rueckgabe = fscanf(f,"%f",&((*ptr).m[i][j]));
    		}
    	}
    
    	while (rueckgabe != EOF)
    	{
    		anzahl++;
    		ptr = (MATRIX *)realloc(ptr,(anzahl+1)*sizeof(MATRIX));
    
    		rueckgabe = fscanf(f,"%d %d",&((*(ptr+anzahl)).zeile),&((*(ptr+anzahl)).spalte));
    
    		for (i=0;i<((*(ptr+anzahl)).zeile);i++)
    		{
    			for (j=0;j<((*(ptr+anzahl)).spalte);j++)
    			{
    				rueckgabe = fscanf(f,"%f",&((*(ptr+anzahl)).m[i][j]));
    			}
    		}
    	}
    	fclose(f);
    
    //	qsort = (ptr,anzahl,sizeof(MATRIX),vergleich);
    
    	for (x=anzahl-1;x>=0;x--)
    	{
    		fprintf=(s,"%d %d",(*(ptr+x)).zeile,(*(ptr+x)).spalte);
    
    		for (i=0;i<((*(ptr+x)).zeile);i++)
    		{
    			for (j=0;j<((*(ptr+x)).spalte);j++)
    			{
    				fprintf = (s,"%f ",(*(ptr+x)).m[i][j]);
    			}
    			fprintf = (s,"\n");
    		}
    	}
    
    }
    

    Wie könnte man das Sortieren anstellen un dprogrammieren?

    Bitte bitte helft mir!

    Liebe Grüße

    Anne



  • struktur basteln, in der M und N der matrix stehen, das alles in ein array; mit sort()/qsort() und eigener cmp() funktion sortieren.



  • hmm ja so in etwa wollt ichs machen vom prinzip her.

    Nur mein Problem ist das ich bei der "cmp" funktion probleme habe. hätte ich ein zu sortierendes feld wäre das kein Problem, aber hier ist das ja mit ner sturktur.

    Anne



  • Mein kompletter Quellcode, Problemkind ist jetzt die cmp Funktion für Quicksort und alles um qsort herum.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct
    {
    	double m[100][100];
    	int zeile;
    	int spalte;
    }MATRIX;
    
    int main(void)
    {
    	int cmp(const void *, const void *);
    
    	MATRIX *ptr;
    	int i;
            int j;
            int x;
            int anzahl = 0;
            int rueckgabe;
    
    	FILE *f;
    	f = fopen("ss06.in","r");
    	FILE *s;
    	s = fopen("ss06.out","w");	
    
    	ptr = (MATRIX *)malloc(sizeof(MATRIX));
    
    	rueckgabe = fscanf(f,"%d %d",&((*ptr).zeile),&((*ptr).spalte));
    
    	for (i=0;i<((*ptr).zeile);i++)
    	{
    		for (j=0;j<((*ptr).spalte);j++)
    		{
    			rueckgabe = fscanf(f,"%lf",&((*ptr).m[i][j]));
    		}
    	}
    
    	while (rueckgabe != EOF)
    	{
    		anzahl++;
    		ptr = (MATRIX *)realloc(ptr,(anzahl+1)*sizeof(MATRIX));
    
    		rueckgabe = fscanf(f,"%d %d",&((*(ptr+anzahl)).zeile),&((*(ptr+anzahl)).spalte));
    
    		for (i=0;i<((*(ptr+anzahl)).zeile);i++)
    		{
    			for (j=0;j<((*(ptr+anzahl)).spalte);j++)
    			{
    				rueckgabe = fscanf(f,"%lf",&((*(ptr+anzahl)).m[i][j]));
    			}
    		}
    	}
    	fclose(f);
    
    	qsort(ptr,anzahl,sizeof(MATRIX),cmp);
    
    	for (x=0;x<anzahl;x++)
    	{
    		fprintf(s,"%d %d\n",(*(ptr+x)).zeile,(*(ptr+x)).spalte);
    
    		for (i=0;i<((*(ptr+x)).zeile);i++)
    		{
    			for (j=0;j<((*(ptr+x)).spalte);j++)
    			{
    				fprintf(s,"%lf ",(*(ptr+x)).m[i][j]);
    			}
    			fprintf(s,"\n");
    		}
    	fprintf(s,"\n");
    	}
    
    fclose(s);	
    }
    
    int cmp(const void *a_ptr, const void *b_ptr)
    {
    
    }
    


  • Anne2 schrieb:

    Nur mein Problem ist das ich bei der "cmp" funktion probleme habe. hätte ich ein zu sortierendes feld wäre das kein Problem, aber hier ist das ja mit ner sturktur.

    Du hast dir doch mit malloc() Speicher für deine Matrizen geholt. Die liegen nun sequentiell im Speicher und können ebenso vom qsort() sortiert werden wie ein billiges int-Array.
    Du musst jetzt halt in der Vergleichsfunktion definieren wann genau eine MATRIX größer/kleiner/gleich einer Anderen ist.



  • Und dann sortiert der mir alles als ob das ein array wäre?

    Hmm ich probiers einfach mal *grins* 🙂 Im Zweifelsfall schrei ich 🙂



  • So ich habs jetzt

    int cmp(const void *a, const void *b)
    {
       int az,as,bz,bs,aa,bb;
    
       az = ((MATRIX *)a)->zeile;
       as = ((MATRIX *)a)->spalte;
       bz = ((MATRIX *)b)->zeile;
       bs = ((MATRIX *)b)->spalte;
    
       aa = az*as;
       bb = bz*bs;
    
       if ( aa > bb)
       {
            return(-1);
       }
       else if ( bb > aa)
       {
            return(1);
       }
       else
       {
           return(0);
       }
    }
    

    Meine Restfrage: Das ganze ist ausm Script im Internet "abgeschrieben". Dort wurde das "az = ((MATRIX *)a)->zeile;" verwendet. Wie kann ich diese Zeilen so umschreiben das ich nicht den Operator -> verwende? Ich kriegs einfach nicht hin!

    Danke!



  • Ein einfaches

    return bb - aa;
    

    würde auch reichen 😉

    Zu deiner Frage:

    ((MATRIX *)a)->zeile
    // equivalent zu
    (*((MATRIX *)a)).zeile
    

    Aber was hast du gegen den -> Operator?

    Edit: Lass den anderen Thread doch bitte in Würde sterben 😉



  • Klar lass ich den anderen Sterben
    und diesen hier ab jetzt auch.
    Mein Lebensrettender Post war ein versehen, bin zu sehr auf informatik konzentriert um mich mit so banalen dingen wie dem posten im richtigen thread zu beschäftigen.

    Ich möchte mich hier an dieser Stelle vielmals für Eure Hilfe bedanken.
    Ihr habt mir den Tag und quasi auch das Semester was Informatik angeht gerettet. Abgesehen davon das es ich das was ich geschrieben habe auch wirklich verstehe. Vielen Vielen Dank!

    Anne!


Anmelden zum Antworten