Flaechen sortieren



  • Hallo!

    Ich hab ein Programm geschrieben zum Flächen sortieren mit Bubblesort.(Quicksort noch nicht gelernt).
    Das Problem ist bei der Ausgabe: Es sortiert die Flaechen von 1-8, aber die flaeche[0] ist irgendeine hohe Minus-Zahl.
    Ich kann den Fehler nicht finden :(.

    Hier das Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define MAX_ANZAHL 10
    
    float generate(int a[], int b[], int flaeche[]);
    float generate(int a[], int b[], int flaeche[])
    {
    	int i=0;
      for(i=0; i<MAX_ANZAHL-1; i++)
    	{
    	  a[i]=rand()%10;
    		b[i]=rand()%10;
    		flaeche[i]=a[i]*b[i];
    	}
    }
    
    float sort(int flaeche[]);
    float sort(int flaeche[])
    {
      int hilf=0;
    	int x=0;
    	int i=0;
    
    	for(x=0; x<MAX_ANZAHL-1; x++)
    	{
    	  for(i=0; i<MAX_ANZAHL-1; i++)
    		{
    		  if(flaeche[i]>flaeche[i+1])
    			{
    			  hilf=flaeche[i];
    				flaeche[i]=flaeche[i+1];
    				flaeche[i+1]=hilf;
    			}
    		}
    	}
    }
    
    int main()
    {
      int flaeche[MAX_ANZAHL];
    	int a[MAX_ANZAHL];
    	int b[MAX_ANZAHL];
    	int x=0;
    	int i=0;
    	int hilf=0;
    
    	generate(a,b,flaeche);
    	sort(flaeche);
    
    	for(i=0; i<MAX_ANZAHL-1; i++)
    	{  
    		printf("flaeche[%d]=%d\n",i,flaeche[i]);
    	}
    
    	return 0;
    }
    


  • Du greifst in deiner Sortierfunktion auf das Element flaeche[MAX_ANZAHL] zu, das außerhalb des Arrays liegt - sprich: dort liegen Daten, die dich eigentlich nichts angehen.

    PS: Die Funktions-Prototypen machen wenig Sinn, wenn direkt in der nächsten Zeile die dazugehörige Funktionsdefinition steht 😉



  • 1. In generate() erzeugst du nur 9 Flächen (von 0 bis 😎

    2. Wofür ist die for(x=0; Schleife in sort()?

    3. Du deklarierst sort() und genarate() mit Rückgabewert float. Du gibst aber nichts zurück (kein return)

    4. Vergiss float, nimm double.

    5. Die Funktionsprototypen gehören an den Anfang des Programms



  • Vergiss 2. 🙄



  • So ich hab jetzt die Prototypen am Anfang hingemacht und statt float void genommen, weil man ja keine Rückgabewert braucht.

    Warum zähle ich in generate() nur bis 8? In der for steht ja von 0 bis MAX_ANZAHL-1(-->9).

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define MAX_ANZAHL 10
    
    void sort(int flaeche[]);
    void generate(int a[], int b[], int flaeche[]);
    
    void generate(int a[], int b[], int flaeche[])
    {
    	int i=0;
      for(i=0; i<MAX_ANZAHL-1; i++)
    	{
    	  a[i]=rand()%10;
    		b[i]=rand()%10;
    		flaeche[i]=a[i]*b[i];
    	}
    }
    
    void sort(int flaeche[])
    {
      int hilf=0;
    	int x=0;
    	int i=0;
    
    	for(x=0; x<MAX_ANZAHL-1; x++)
    	{
    	  for(i=0; i<MAX_ANZAHL-1; i++)
    		{
    		  if(flaeche[i]>flaeche[i+1])
    			{
    			  hilf=flaeche[i];
    				flaeche[i]=flaeche[i+1];
    				flaeche[i+1]=hilf;
    			}
    		}
    	}
    }
    
    int main()
    {
      int flaeche[MAX_ANZAHL];
    	int a[MAX_ANZAHL];
    	int b[MAX_ANZAHL];
    	int x=0;
    	int i=0;
    	int hilf=0;
    
    	generate(a,b,flaeche);
    	sort(flaeche);
    
    	for(i=0; i<MAX_ANZAHL-1; i++)
    	{  
    		printf("flaeche[%d]=%d\n",i,flaeche[i]);
    	}
    
    	return 0;
    }
    

  • Mod

    C_Boy schrieb:

    Warum zähle ich in generate() nur bis 8? In der for steht ja von 0 bis MAX_ANZAHL-1(-->9).

    Nein, da zählst du von 0 bis 8, denn 9 ist schon nicht mehr kleiner als MAX_ANZAHL-1, was deine Abbruchbedingung ist.

    Und benutze bitte statt den code-Tags die cpp-Tags (der Button links daneben), dann wird der Code auch schön bunt und besser lesbar.



  • Man kann das auch ganz einfach mit ein paar printf rausfinden.

    In generate() in der Schleife z.B.:

    printf("Generate: Flaeche %d = %f * %f = %f\n", i, a[i], b[i], flaeche[i]);
    

    In sort()

    printf("Generate: %d Vergleiche %d mit %d : %f | %f \n", x, i, i+ 1, flaeche[i], flaeche[i+1]);
    

    Hätte dir auch in main() auffallen müssen. Da gibst du auch nur bis flaeche[8] aus.

    Wozu brauchst du überhaupt die Felder a und b?
    Nach dem sortieren ist der Zusammenhang mit flaeche eh verloren.



  • So jetzt gibt es 10 Flaechen aus, aber es kommt ein Stack around Fehler:
    Ja die Felder a und b brauch zum Berechnen für verschiedene Flaechen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define MAX_ANZAHL 10
    
    void sort(int flaeche[]);
    void generate(int a[], int b[], int flaeche[]);
    
    void generate(int a[], int b[], int flaeche[])
    {
    	int i=0;
      for(i=0; i<MAX_ANZAHL-1; i++)
    	{
    	  a[i]=rand()%10;
    		b[i]=rand()%10;
    		flaeche[i]=a[i]*b[i];
    	}
    }
    
    void sort(int flaeche[])
    {
      int hilf=0;
    	int x=0;
    	int i=0;
    
    	for(x=0; x<=MAX_ANZAHL-1; x++)
    	{
    	  for(i=0; i<=MAX_ANZAHL-1; i++)
    		{
    		  if(flaeche[i]>flaeche[i+1])
    			{
    			  hilf=flaeche[i];
    				flaeche[i]=flaeche[i+1];
    				flaeche[i+1]=hilf;
    			}
    		}
    	}
    }
    
    int main()
    {
      int flaeche[MAX_ANZAHL];
    	int a[MAX_ANZAHL];
    	int b[MAX_ANZAHL];
    	int x=0;
    	int i=0;
    	int hilf=0;
    
    	generate(a,b,flaeche);
    	sort(flaeche);
    
    	for(i=0; i<=MAX_ANZAHL-1; i++)
    	{  
    		printf("flaeche[%d]=%d\n",i,flaeche[i]);
    	}
    
    	return 0;
    }
    


  • In C schreibt man üblicher:

    for(i=0; i<MAX_ANZAHL; i++) //  nur Vergleich auf <, dafuer kein -1
    

    In sort() greifst du auf flaeche[i+1] zu. Wenn i=9 ist, dann greifst du auf flaeche[10] zu und das existiert nicht.
    Deswegen habe ich auch nur von generate geschrieben.
    Also bei der inneren Schleife von sort:

    for(i=0; i<MAX_ANZAHL-1; i++) // nur < aber mit -1
    


  • Danke an alle erstmal...
    So müsste es stimmen?
    Aber habt ich vielleicht noch ein paar Tipps wie man da leichter schreiben kann oder so?
    Oder passt das eh so?

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define MAX_ANZAHL 10
    
    void sort(int flaeche[]);
    void generate(int a[], int b[], int flaeche[]);
    
    void generate(int a[], int b[], int flaeche[])
    {
    	int i=0;
      for(i=0; i<MAX_ANZAHL; i++)
    	{
    	  a[i]=rand()%10;
    		b[i]=rand()%10;
    		flaeche[i]=a[i]*b[i];
    	}
    }
    
    void sort(int flaeche[])
    {
      int hilf=0;
    	int x=0;
    	int i=0;
    
    	for(x=0; x<MAX_ANZAHL; x++)
    	{
    	  for(i=0; i<MAX_ANZAHL-1; i++)
    		{
    		  if(flaeche[i]>flaeche[i+1])
    			{
    			  hilf=flaeche[i];
    				flaeche[i]=flaeche[i+1];
    				flaeche[i+1]=hilf;
    			}
    		}
    	}
    }
    
    int main()
    {
      int flaeche[MAX_ANZAHL];
    	int a[MAX_ANZAHL];
    	int b[MAX_ANZAHL];
    	int x=0;
    	int i=0;
    	int hilf=0;
    
    	generate(a,b,flaeche);
    	sort(flaeche);
    
    	for(i=0; i<MAX_ANZAHL; i++)
    	{  
    		printf("flaeche[%d]=%d\n",i,flaeche[i]);
    	}
    
    	return 0;
    }
    

  • Mod

    C_Boy schrieb:

    Danke an alle erstmal...
    So müsste es stimmen?

    Es sind zumindest keine offensichtlichen Fehler drin. Funktioniert es denn?

    Aber habt ich vielleicht noch ein paar Tipps wie man da leichter schreiben kann oder so?

    Die (für dich hoffentlich offensichtliche) Antwort wäre natürlich, sich keine eigene Sortierfunktion zu schreiben, sondern die aus der Standardbibliothek zu benutzen.

    Oder passt das eh so?

    Stilkritik:
    1. Die Variablen x und hilf in main sind unbenutzt.
    2. Du hast von Funktionsdeklarationen gehört, aber nicht verstanden, wozu sie da sind.
    3. Wozu sind eigentlich a und b gut?

    edit: Insbesondere der Punkt 3 ist kein einfacher Stilfehler, sondern wiegt ganz schön schwer. Denke darüber nach!



  • Die Variablen x und hilf in main sind unbenutzt.

    Ok, stimmt.

    Wozu sind eigentlich a und b gut?

    Ich würde sagen zum Flaechenberechnen.(Aber sicherlich falsche Antwort, weil mathematisch würde es stimmen?)

    MfG C_boy



  • C_Boy schrieb:

    Wozu sind eigentlich a und b gut?

    Ich würde sagen zum Flaechenberechnen.(Aber sicherlich falsche Antwort, weil mathematisch würde es stimmen?)

    MfG C_boy

    Die Frage war wohl eher, was du damit anfangen willst. In der generate() Funktion füllst du sie, danach werden sie nie mehr verwendet. Und nach dem Sortieren passen die Seitenlängen dort auch nicht mehr zu den Flächeninhalten.



  • Ja in generate wird a[i] und b[i] erzeugt. Die Flaeche hab ich gleich mit berechnet dadurch brauch ich im int main keine for-Schleife.

    Ok, also meint ihr weil ich sie im int main() nirgends verwende?

    Macht es so die Sache anders:(?)

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define MAX_ANZAHL 10
    
    void sort(int flaeche[]);
    void generate(int a[], int b[], int flaeche[]);
    
    void generate(int a[], int b[], int flaeche[])
    {
    	int i=0;
      for(i=0; i<MAX_ANZAHL; i++)
    	{
    	  a[i]=rand()%10;
    		b[i]=rand()%10;
    		flaeche[i]=a[i]*b[i];
    	}
    }
    
    void sort(int flaeche[])
    {
      int hilf=0;
    	int x=0;
    	int i=0;
    
    	for(x=0; x<MAX_ANZAHL; x++)
    	{
    	  for(i=0; i<MAX_ANZAHL-1; i++)
    		{
    		  if(flaeche[i]>flaeche[i+1])
    			{
    			  hilf=flaeche[i];
    				flaeche[i]=flaeche[i+1];
    				flaeche[i+1]=hilf;
    			}
    		}
    	}
    }
    
    int main()
    {
      int flaeche[MAX_ANZAHL];
    	int a[MAX_ANZAHL];
    	int b[MAX_ANZAHL];
            int i=0;
    
    	generate(a,b,flaeche);
    	sort(flaeche);
    
    	for(i=0; i<MAX_ANZAHL; i++)
    	{  
    		printf("a[%d]*b[%d] --> flaeche[%d]=%d\n",i,i,i,flaeche[i]);
    	}
    
    	return 0;
    }
    

  • Mod

    C_Boy schrieb:

    Ja in generate wird a[i] und b[i] erzeugt. Die Flaeche hab ich gleich mit berechnet dadurch brauch ich im int main keine for-Schleife.

    Ok, also meint ihr weil ich sie im int main() nirgends verwende?

    Nochmal: Wozu sind die Werte da? Du legst Felder an, gibst sie zwischen Funktionen hin und her, füllst sie mit Werten. Aber das einzige Mal wo sie benutzt werden ist gleich in der Zeile nach der Wertzuweisung! Nirgends spielt eine Rolle, dass sie Felder sind, nirgends spielt eine Rolle, dass sie in der maiin leben, nirgends spielt eine Rolle, dass sie an generate übergeben werden.

    Denk mal darüber nach, was der Unterschied zwischen diesem und deinem Code ist:

    void generate(int flaeche[])
    {
      int i;
      for(i=0; i<MAX_ANZAHL; i++)
        {
          int a = rand()%10;
          int b = rand()%10;
          flaeche[i] = a * b;
        }
    }
    

    Oder noch kürzer:

    void generate(int flaeche[])
    {
      int i;
      for(i=0; i<MAX_ANZAHL; i++)
        {
          flaeche[i] = (rand()%10) * (rand()%10);
        }
    }
    

    Du siehst: Nicht einmal die Existenz von a und b spielt eine Rolle!



  • void generate(int flaeche[])
    {
      int i;
      for(i=0; i<MAX_ANZAHL; i++)
        {
          flaeche[i] = (rand()%10) * (rand()%10);
        }
    }
    

    Ahja, stimmt man setzt direkt ein.
    Danke 🙂


Anmelden zum Antworten