fehlersuche...
-
klar schrieb:
Debugger.
Bye, TGGC
mit es kommen keine fehlermeldungen meinte ich auch das ich beim debuggen keinen erfolg hatte
MFK schrieb:
i wird nicht initialisiert.
i wird nicht initalisiert weil es in diesem "abschnitt" nicht gebraucht wird.
MFK schrieb:
Ganz nebenbei halte ich den Ansatz mit rand für ziemlich ungeeignet.
das bringt mir so wenig und ist nicht sehr produktiv...
vlt hat jemand anderes ja noch ideen
lg icepacker
-
icepacker schrieb:
i wird nicht initalisiert weil es in diesem "abschnitt" nicht gebraucht wird.
if (array_4[j] != code) { i++; puts("schritt 2"); //überprüfung wo das progg ist getchar(); if (i==24)
Dann ist der obige code wohl ein Irrtum.
Kurt
-
icepacker schrieb:
i wird nicht initalisiert weil es in diesem "abschnitt" nicht gebraucht wird.
Komisch. Ich sehe da, wie du i hochzählst und mit 24 vergleichst. Das könnte problematisch werden, wenn du i nirgends initialisiert. "//bis hierhin hab ichs noch nie geschafft :(", und so.
Aber du wirst es besser wissen.das bringt mir so wenig und ist nicht sehr produktiv...
Das tut mir so leid. Wahrscheinlich habe ich deine Frage "habe ich das problem gar ganz falsch angefangen" falsch verstanden. Die wollte ich nämlich beantworten.
Natürlich kannst du dich beim Forenbetreiber wegen mangelnder Produktivität der Mitarbeiter beschweren.PLONK.
-
hi
soory wenn ich hier jemanden beleidigt habe(und das auch noch als neuling wie mich) , es war ganz klar ein fehler meinerseits...
mithilfe eurer ratschläge und ein paar verbsesserungen meinerseits habe ich es jetzt geschafft
.
#include <stdio.h> #include <stdlib.h> int main(void) { int z1, z2, z3, z4, array_4[24]={ 0 }; int i=0, count=0, j, k, wuerfel, ende=0, code=0; puts("geben sie 4 zahlen ein."); scanf("%d", &z1); scanf("%d", &z2); scanf("%d", &z3); scanf("%d", &z4); puts("moegliche kombinationen von zahlen:"); while (ende < 24) { while (code < 1000) { count++; srand(count); wuerfel=rand()%9+1; if (wuerfel==z1) { code=code * 10 + z1; } else if (wuerfel==z2) { code=code * 10 + z2; } else if (wuerfel==z3) { code=code * 10 + z3; } else if (wuerfel==z4) { code=code * 10 + z4; } } for (j=0; j < 24; j++) { if (array_4[j] != code) { i++; if (i==24) { array_4[ende]=code; ende++; code=0; i=0; } } } } for (k=0; k < 24; k++) { printf("%d. = %d\n", k +1, array_4[k]); } puts("juhu es hat geklappt!!"); return EXIT_SUCCESS; }
natürlich ist das mit rand() und so nicht prozessor schonend, aber so bleibt das programm flexibel.
verbesserungs vorschläge sind natürlich immer noch erwünscht.
und nochmal vielen dank an euch (klar, zuk, mfk)lg icepacker
-
Deine Verwendung von rand() und srand() ist wirklich nicht ideal. Wie du das machst bekommst du trotz srand bei jedem Programmdurchlauf das gleiche Ergebnis.
Also srand nur einmal am Anfang des Programmes aufrufen und am besten mit time(0) initialisieren.
Kurt
-
icepacker schrieb:
natürlich ist das mit rand() und so nicht prozessor schonend, aber so bleibt das programm flexibel.
Zufall hat in so einem Programm nichts zu suchen. Hinzu kommt, dass dein Zufalls-Permutationsalgorithmus nicht richtig arbeitet. Bei deinem Programm kann eine Zahl mehrfach vorkommen, damit hast du nicht mehr 24, sondern 256 Möglichkeiten - wenn alle Zahlen unterschiedlich sind, ansonsten weniger.
-
MFK schrieb:
Zufall hat in so einem Programm nichts zu suchen.
sorry kanns halt nicht besser...
MFK schrieb:
Hinzu kommt, dass dein Zufalls-Permutationsalgorithmus nicht richtig arbeitet. Bei deinem Programm kann eine Zahl mehrfach vorkommen, damit hast du nicht mehr 24, sondern 256 Möglichkeiten - wenn alle Zahlen unterschiedlich sind, ansonsten weniger.
wieso kann eine zahl mehrfach vorkommen, das verstehe ich nicht kannst du das vlt genauer sagen ?
-
icepacker schrieb:
wieso kann eine zahl mehrfach vorkommen, das verstehe ich nicht kannst du das vlt genauer sagen ?
Eine Zahl, nicht eine Kombination. Was passiert denn, wenn du viermal nacheinander die gleiche Zahl würfelst?
-
öhm nichts
-meinst du wenn der anwender 4 gleiche ziffern eingibt, dann gibts halt 24* die selbe kombination.
-wenn alle ziffern unterschielich sind komm ich auf 24 ?
-wenn bei der rand() funktion 4* hintereinander die selbe zahl rauskommt passiert auch nichts, entweder die zahl gehört dazu und kommt ins arry oder nicht.
-
icepacker schrieb:
-wenn alle ziffern unterschielich sind komm ich auf 24 ?
Wie kommst du darauf? Für jede Ziffer gibt es vier Möglichkeiten. Bei vier Stellen macht das 4 hoch 4 = 256 Kombinationen. 24 hättest du nur, wenn jede Zahl genau einmal vorkommen soll. Das prüft dein Algorithmus aber nicht.
wenn bei der rand() funktion 4* hintereinander die selbe zahl rauskommt passiert auch nichts, entweder die zahl gehört dazu und kommt ins arry oder nicht.
Was heißt denn "gehört dazu"? Angenommen, der Benutzer gibt 1, 2, 3 und 4 ein. Gehört 1111 dann dazu? Falls ja, hast du mehr als 24 Kombinationen. Falls nein, fängt das dein Algorithmus nicht ab.
-
waenn du abfragen willst ob eine zahl schon mal vorgekommen ist bei 4 wuerfen koenntes du einen array mit 4 elementen anlegen dann nach folgenden algorythmus vorgehen
generiere eine zahl gehe den array durch pruefe ob zahl im array vorhanden falls ja generiere eine zahl durchlaufvariable = 0 schleife von forne beginnen falls nein schreibe zahl in array und verwaende die zahl
-
MFK schrieb:
Was heißt denn "gehört dazu"? Angenommen, der Benutzer gibt 1, 2, 3 und 4 ein. Gehört 1111 dann dazu? Falls ja, hast du mehr als 24 Kombinationen. Falls nein, fängt das dein Algorithmus nicht ab.
ah
jetzt hats klick gemacht
. 1111 soll halt nicht dazu gehöhren.
ginge ja so zu vermeiden oder ?int doppelt=0; if (wuerfel==z1 && doppelt==0) //ich denke es ist klar wo im programm das steht { code=code * 10 + z1; doppelt=1; }
@--linuxuser--
bin mir noch nicht sicher ob ich deinen vorschlag verstanden habe, naja mal schauen^^lg icepacker
-
icepacker schrieb:
ah
jetzt hats klick gemacht
Gut.
icepacker schrieb:
1111 soll halt nicht dazu gehöhren. ginge ja so zu vermeiden oder ?
Du würdest jeweils einen dieser Merker für jede Position brauchen.
Ich rate dir dringend, dich von diesem Zufallsalgorithmus zu verabschieden. Stell dir doch mal vor, wie du an einem Kombinationsschloss jede Kombination ausprobieren würdest. Dann übertrag diesen Algorithmus in C. Stichwort verschachtelte Schleife.
-
@icepacker waenn du verschachtelte schleifen verstehen willst musst du auch das blockkonszept in c verstehen:
int main(){ int i = 0; {/*anfang block*/ int i = 4; int y = 0; {/*anfang block*/ printf("%d\n", y); /*---> FEHLER*/ }/*end block*/ printf("%d, %d\n", i, y); }/*end block*/ printf("%d\n", i); }/*end main*/
-
--linuxuser-- schrieb:
int main(){
Seit ANSI C von 1990 gibt es folgende Formen fuer main:
int main( int argc, char** argv ); int main( void );
die Konstruktion
int main();
ist identisch mit:
int main( int, ... );
Manche ANSI C konforme Compiler geben bei falscher Formulierung von main zumindest eine Warnung aus.
-
ok schuldigung
-
--linuxuser-- schrieb:
int y = 0; {/*anfang block*/ printf("%d\n", y); /*---> FEHLER*/ }/*end block*/ printf("%d, %d\n", i, y);
Kein Fehler. "y" ist innerhalb des Blocks definiert, weil Bezeichner von aeusseren Geltungsbereichen (scopes) an innere Geltungsbereiche weitergeleitet werden.
-
--linuxuser-- schrieb:
@icepacker waenn du verschachtelte schleifen verstehen willst musst du auch das blockkonszept in c verstehen:
Eigentor... (wie PowerOff ja auch schon gemerkt hat)
... int y = 0; {/*anfang block*/ printf("%d\n", y); /*---> FEHLER*/ }/*end block*/ ...
-
ja weis PEINLICH PEINLICH das passiert immer im unguenstigsten augenblick
-
MFK schrieb:
Ich rate dir dringend, dich von diesem Zufallsalgorithmus zu verabschieden. Stell dir doch mal vor, wie du an einem Kombinationsschloss jede Kombination ausprobieren würdest. Dann übertrag diesen Algorithmus in C. Stichwort verschachtelte Schleife.
ja also verschachtelte schleifen und blöcke sind, von der syntax her, kein problem
aber wie ich das programm machen soll ohne die funktion mit der zufallsmethode habe ich keine ahnung, da steh ich grad uff'm schlauch
und das progg mit dem kombination schloss würde ich so lösen:#include <stdio.h> int main(void) { int z1=2, //die einzelnen ziffern z2=5, z3=7, z4=3, code=0, //die kombination count, d1=0, d2=0, d3=0, d4=0 ; for (count=1; code < 1000; count++) { if ((count==z1) && (d1==0)) { code=code * 10 + z1; d1=1; } else if ((count==z2) && (d2==0)) { code=code * 10 + z2; d2=1; } else if ((count==z3) && (d3==0)) { code=code * 10 + z3; d3=1; } else if ((count==z4) && (d4==0)) { code=code * 10 + z4; d4=1; } } printf("die kombination lautet: %d\n", code); return 0; }
allerdings weiß ich net wie mir das helfen soll ?
vlt ein beispiel oder so?
lg icepacker
Ps: ich seh grad das progg oben, funzt net einwandfrei, aber vom prinzip her bringts mirs trotzdem nichts...