Flaechen sortieren
-
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; }
-
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; }
-
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