Höchstzahlenverfahren
-
Hi habe ein Problem damit das Höchstzahlverfahren zu programmieren. Mein Problem ist, dass ich ein 2 dimensionales Array habe, das nach den größten Zahlen(je nach Eingabe) durchsucht werden soll. Je nachdem wieviele Höchstzahlen in einer Zeile vorkommen sollen dann Sitze vergeben werden, aber ich bekomm es jetzt schon seit ein paar Tagen einfach nicht hin. Ich hoffe jemand von euch kann mir helfen.
# include <stdio.h> int main (void) { int m, n, G; printf ("Bitte Anzahl der Sitze eingeben:"); scanf ("%d", &n); printf ("n=%d\n", n); printf ("Bitte Anzahl der Parteien angeben:"); scanf ("%d", &m); printf ("m=%d\n", m); /* printf ("Bitte Anzahl der Wahlberechtigten eigenben:"); ============= am Ende Wahlbeteiligung berechnen scanf ("%d", &G); printf ("G=%d\n", G); */ int i=1; int S[m]; #define MAX m+1 typedef struct{ int i; /* Parteizahl */ int S[i]; /* Stimmen */ int N[i]; /* Sitze */ float q[m*n]; /* Qoutient */ int d; /* Divisor */ }Parteien; for (i = 1;i < MAX; i++) { printf ("Bitte gültige Stimmen für die Partei %d eingeben:", i); scanf ("%d", &S[i]); printf ("Stimmen=%d\n", S[i]); } printf ("S1=%d\n",S[1]); // dient nur der Überprüfung printf ("S2=%d\n",S[2]); // dient nur der Überprüfung printf ("S3=%d\n",S[3]); // dient nur der Überprüfung printf ("S4=%d\n",S[4]); // dient nur der Überprüfung /* hier Strukur in Tabellenform int Tabelle [m] [n];*/ int s; int N[i]; int d; float q[m*n]; int tabelle[m][n]; for (i = 1; i < MAX; i++) { s=S[i]; for (d = 1; d < n; d++) { q[m*n] = s/d; tabelle[i][d] = q[m*n]; } } /* die m höchsten Zahlen suchen, dann für jeweilige Zeile N[i]+1(=Plätze)*/ int maxzahl; int maxposition; maxzahl=0; maxposition=0; N[i] = 0; int l=i; int k=d; int o=m; for (o=m; o > 0; o--)// Sitze die zu vergeben sind { for (l = 1; l < MAX; l++) //====> hier muss irgendwo der Fehler liegen!!!! { for (k = 1; k < n; k++) { if (q[m*n]>maxzahl) { maxzahl=q[m*n]; maxposition = i; q[m*n]=maxzahl; } N[i]=N[i]+1; } } } //Hier wird der Tabellenkopf ausgegeben. printf("\n\n\n"); printf("Stimmen\t \t 1\t 2\t 3\t 4\t 5\t 6\t 7\t 8\t 9\t Plätze"); for (i = 1; i < MAX; i++) { printf("\n %i ", S[i]); for (d = 1; d < n; d++) { printf("\t %i ", tabelle[i][d]); } printf("\t%i", N); } printf ("\nS1=%d\n",N[1]); // dient nur der Überprüfung printf ("S2=%d\n",N[2]); // dient nur der Überprüfung printf ("S3=%d\n",N[3]); // dient nur der Überprüfung printf ("S4=%d\n",N[4]); return 0; }
~edit durch SeppJ: Codetags eingefügt~
-
Was ist deine Frage? Hast du Fehler, falsche Ergebnisse, Schwierigkeiten bei der Umsetzung? Wir können nicht hellsehen.
Benutze für Code bitte unbedingt die Codetags (Unter dem Editfenster, unter den Smileys). Ich füge sie dieses Mal ausnahmsweise nachträglich in deinen Beitrag ein, weil du als Unregistrierter deine Beiträge nicht bearbeiten kannst. Beim nächsten Mal bitte selber dran denken und die Vorschau benutzen, ob auch wirklich alles mit dem Beitrag stimmt.
P.S.: Hier ist übrigens mal die Ausgabe meines Compilers zu deinem Code:
test.c: In function ‘main’: test.c:111:9: warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=] printf("\t%i", N); ^ test.c:70:5: warning: variable ‘maxposition’ set but not used [-Wunused-but-set-variable] int maxposition; ^ test.c:7:11: warning: unused variable ‘G’ [-Wunused-variable] int m, n, G; ^ test.c:33:2: warning: typedef ‘Parteien’ locally defined but not used [-Wunused-local-typedefs] }Parteien; ^
Die erste Warnung ist ein handfester Fehler, der behoben werden muss. Der Rest sind Schönheitsmängel die auf Chaos bei der Programmierung hindeuten. Vielleicht beantwortet das ja schon deine Frage.
Dein Compiler kann bestimmt auch solche Fehler finden. Man muss bloß das Warnlevel hochsetzen, bei den meisten sind standardmäßig nämlich keine oder wenige Warnungen aktiviert. Als Anfänger solltest du Warnungen wie Fehler behandeln.
-
Danke für die Bearbeitung und die schnelle Antwort! Wusste nicht genau wie ich es posten sollte. Ich habe Schwirigkeiten mit der Umsetzung und daher auch falsche Ergbnisse bzw. erst gar keine sinnvollen. Daher vermute ich das der Fehler im Bereich von Zeile 69 - 96 liegt bis dahin läuft alles planmäßig. Da ich hier meine Tabelle nach den z.B. 10 höchsten Zahlen durchsuchen möchte und dann wie gesagt daraus die Sitze berechnen möchte. Die Zeilen stehen für die Parteien wenn nun z.B. in Zeile 1 fünf der 10 höchsten Zahlen vorkommen müsste das Ergebnis von N[1]= 5 sein. Aber ich bekomme diese Rückmeldung nicht einmal annähernd. Und hab mittlerweile schon einiges versucht, aber es will mir einfach nicht gelingen. Das Chaos kommt daher dass ich aus den anderen Versuchen noch unbenutzte Dinge übrig hab.(z.B. die definierte Structur) und dass Programm dann noch weitere Berechnungen ausführen soll, die möchte ich mir dann allerdings wieder selbst erarbeiten. Nur hier stoße ich an meine Grenzen. Bin auch noch ein ziemlicher Anfänger was C angeht. Denn Fehler habe ich gleich mal behoben und N durch N[i] ersetzt. Aber die entsprechenden Ergebnisse sind falsch so hat Partei 1 keine Sitze und Partei 2 fünf Sitze usw. Daher muss der Fehler in dem genannten Bereich liegen.
-
Tut mir Leid, der Code ist leider so chaotisch mit all den falschen Versuchen, die nicht sauber bereinigt wurden, dass es so gut wie unlesbar ist. Daher kommt nach dem, was mir mein Compiler geflüstert hat, das was mir mein automatischer Speicherdebugger sagt. Der erzählt, dass du das N-Feld aus Zeile 50 benutzt, ohne es zu initialisieren. Womit er auch offensichtlich völlig recht hat. Außerdem schreibst du in Zeile 73 fröhlich hinter die Grenzen des Feldes. Das hat mir mein Debugger zwar nicht gesagt (weil es bei variable length arrays schwierig ist, solche Fehler automatisch zu finden), aber das habe ich beim Querlesen gesehen, als ich geguckt habe, was du mit dem N-Feld anstellst. Falls du irgendwie die fixe Idee haben solltest, dass
N = 0;
*die ersten i-Einträge auf 0 setzt (der Code sieht so aus, als solle das eine Initialisierung des Feldes sein): Nein, macht es nicht.Lass mich raten: Du hattest am Anfang ein paar Compilerfehler (so etwas wie " variable-sized object may not be initialized") und hast dann so lange an deinem Code rumgepfuscht, bis es compilierte? Dazu:
c.rackwitz schrieb:
Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. [i]Du
- musst genau wissen, warum du wo und welches Zeichen setzt.Das gilt besonders als Anfänger in C, wo dir der sehr tolerante Compiler so ziemlich jeden Müll abnimmt, sei er auch noch so sinnlos. Es kommt dann natürlich trotzdem nur Müll raus :p .
-
Danke, das bringt mich der Lösung schon näher(hätte ich aber auch selber erkennen müssen), allerdings funktioniert meine Sitzvergabe immer noch nicht, die Sitze bleiben bei 0 stehen. Wie gesagt mit dem Bereich des Codes bin ich auch nicht sonderlich glücklich, da ist definitv ein Fehler drin. Hab den Code jetzt mal gesäubert und die Änderungen eigefügt. Ich hoffe es ist jetzt besser lesbar als vorher.
[code="c"]# include <stdio.h> int main (void) { int m, n, G; printf ("Bitte Anzahl der Sitze eingeben:"); scanf ("%d", &n); printf ("n=%d\n", n); printf ("Bitte Anzahl der Parteien angeben:"); scanf ("%d", &m); printf ("m=%d\n", m); int i=1; int S[m]; #define MAX m+1 for (i = 1;i < MAX; i++) { printf ("Bitte gültige Stimmen für die Partei %d eingeben:", i); scanf ("%d", &S[i]); printf ("Stimmen=%d\n", S[i]); } int Tabelle [m] [n]; int s; int N[i]; for (i = 1; i < MAX; i++){N[i]=0;} int d; float q[m*n]; int tabelle[m][n]; //Eingabe for (i = 1; i < MAX; i++) { s=S[i]; for (d = 1; d < n; d++) { q[m*n] = s/d; tabelle[i][d] = q[m*n]; } } /* die m höchsten Zahlen suchen, dann für jeweilige Zeile N[i]+1(=Plätze)*/ int maxzahl; int maxposition; maxzahl=0; maxposition=0; int l=i; int k=d; int o=m; for (o=m; o > 0; o--)// Sitze die zu vergeben sind { for (l = 1; l < MAX; l++) { for (k = 1; k < n; k++) { if (q[m*n]>maxzahl) { maxzahl=q[m*n]; maxposition = i; } N[i]=N[i]+1; } } } //Hier wird der Tabellenkopf ausgegeben. printf("\n\n\n"); printf("Stimmen\t \t 1\t 2\t 3\t 4\t 5\t 6\t 7\t 8\t 9\t Plätze"); for (i = 1; i < MAX; i++) { printf("\n %i ", S[i]); for (d = 1; d < n; d++) { printf("\t %i ", tabelle[i][d]); } printf("\t%i", N[i]); } printf ("\nS1=%d\n",N[1]); // dient nur der Überprüfung printf ("S2=%d\n",N[2]); // dient nur der Überprüfung printf ("S3=%d\n",N[3]); // dient nur der Überprüfung printf ("S4=%d\n",N[4]); return 0; }
-
Wo hast du Programmieren gelernt? Qualifiziert war das jedenfalls nicht.
Ich habe schon länger nicht mehr solchen VLA-Müll gesehen.
Weißt du, was eine Funktion ist? Nein, sonst hättest du sie benutzt.
Funktionen sind essentiell in C.
Arrays in C fangen mit 0 Index an, nicht wie bei dir mit 1.
Du verwendest keine sprechenden Variablennamen, und dann sogar noch l, und o im Zusammenspiel mit 0. Bist du masochistisch veranlagt?
#define wird nur für Konstantes benutzt, nicht wie bei dir für Variables.
VLA in Anfängerhand bringen nur Unglück, wie man bei dir sieht.
Weißt du, was TDD ist? Nein? Dann suche mal.Werfe deinen ganzen Codemüll weg.
Schreibe main, die nur Datendefinitionen/Speicherverwaltung (in deinem Fall also dein 2dim-Array) und Funktionsaufrufe enthält.
Definiere für jede sinnvoll kapselbare Funktionalität eine Funktion, an die du jeweils dein Array übergibst.
Arbeite zu Beginn mit einem konstant großen Array mit konstantem Inhalt.
Dann implementiere deine Funktionen (TDD!).
Wenn das läuft, kannst du mit variabel großem dynamischen Speicher mit variablem Inhalt arbeiten.
-
Danke für deine Hinweise! Ich bin ja gerade erst dabei das Programmieren zu lernen. So hab jetzt noch mal alles neu gemacht, leider konnte ich die Funktionen noch nicht wirklich umsetzen, es läuft jetzt schon fast nur leider habe ich noch einen kleinen Fehler drin: Und zwar vergiebt, dass Programm zu früh die Sitze. Wenn die Zeilen gewechselt werden. D.h. Er vergiebt bei Sitz Nr. 3 einen Platz an Partei 1 mit einem Wert von 33.333 jedoch sollte dieser Platz an Partei 2 mit dem Wert 50.00 gehen. Ich weiß gerade nicht wo ich da den Logikfehler drin habe. Hoffentlich kann mir da von euch einer helfen. Danke schon mal.
[code]#include <stdio.h> #include <stdlib.h> //Main-Funktion int main () { int ZEILEN = 4; int SPALTEN = 10; int count_zeilen; int count_spalten; float feld [ZEILEN][SPALTEN]; float x = 0; float S[count_zeilen]; for(count_zeilen=0; count_zeilen<ZEILEN; count_zeilen++) {S[0]=100; S[1]=50; S[2]=20; S[3]=5;} printf ("%f %f %f %f\n", S[0], S[1], S[2], S[3]); for ( count_zeilen = 0; count_zeilen < ZEILEN; count_zeilen++ ) { for ( count_spalten = 1; count_spalten < SPALTEN; count_spalten++ ) { x = S[count_zeilen] / (count_spalten); feld[count_zeilen][count_spalten] = x; } } int N[count_zeilen]; for (count_zeilen = 0; count_zeilen < ZEILEN; count_zeilen++){N[count_zeilen]=0;} int Sitze = 10; float maxzahl = 0; int maxposition = 0; float y = 0; //In diesem Teil liegt der Fehler!!!!! while (Sitze > 0) { printf ("Sitze zu vergeben=%i\n",Sitze); maxzahl = 0; for (count_zeilen = 0; count_zeilen < ZEILEN; count_zeilen++) { for (count_spalten = 1; count_spalten < SPALTEN; count_spalten++) { y = feld [count_zeilen][count_spalten]; if ( y > maxzahl ) { maxzahl = y; maxposition = count_zeilen; N[count_zeilen]=N[count_zeilen]+1; ///Hier sollte immer nur ein Sitz vergeben werden!!! feld [count_zeilen][count_spalten] = 0; Sitze--; } } } } printf ("%i %i %i %i\n", N[0], N[1], N[2], N[3]); { for ( count_zeilen = 0; count_zeilen < ZEILEN; count_zeilen++ ) { for ( count_spalten = 0; count_spalten < SPALTEN; count_spalten++ ) { printf ( "%f\t", feld[count_zeilen][count_spalten] ); } printf ("\n"); } } }
-
Problem gelöst jetzt läuft alles wunderbar. Nochmal Danke für die gegebenen Tipps für meine vorherigen Probleme!