fehlersuche...



  • hi
    ich versuche ein programm zu schreiben, dass (in diesem beispiel 4) ziffern vom user entgegenimmt und alle kombinationen der anordnung der ziffern zurückgibt. hier jetzt erst mal der code

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	int z1, z2, z3, z4, array_4[24]={ 0 };                                                                //die vier zahlen
    	int i, count=0, j, k, wuerfel, ende=0, code=0;                                                                      //hilfsvariablen
    
    	puts("geben sie 4 zahlen ein.");
    	scanf("%d", &z1);
    	scanf("%d", &z2);
    	scanf("%d", &z3);
    	scanf("%d", &z4);
    
    	puts("moegliche kombinationen von zahlen:");
    
    // schnipp
    //hier kommt weiterer code
    //schnapp
    
     		while (ende < 24)
    		{
    			while (code < 1000)					// gibts eine vierstellige kombination ? 
    			{
    				count++;
    
    				srand(count);
    				wuerfel=rand()%9+1;
    
    				if (wuerfel==z1)
    				{
    					code=code * 10 + z1;
    					printf("%d\n", code);					//überprüfung wo das progg ist
    				}
    				else if (wuerfel==z2)
    				{
    					code=code * 10 + z2;
    					printf("%d\n", code);					//überprüfung wo das progg ist
    				}
    				else if (wuerfel==z3)
    				{
    					code=code * 10 + z3;
    					printf("%d\n", code);					//überprüfung wo das progg ist
    				}
    				else if (wuerfel==z4)
    				{
    					code=code * 10 + z4;
    					printf("%d\n", code);					//überprüfung wo das progg ist
    				}
    				else
    				{
    					puts("nochmal die schleife");
    				}     				
    			}
    
    			puts("schritt 1");								//überprüfung wo das progg ist
    			getchar();
    
    			for (j=0; j < 24; j++)
    			{
    				if (array_4[j] != code)
    				{
    					i++;
    					puts("schritt 2");						//überprüfung wo das progg ist
    					getchar();
    
    					if (i==24)
    					{
    						array_4[ende]=code;
    						ende++;
    						puts("schritt 3");					//bis hierhin hab ichs noch nie geschafft :(
    						getchar();
    					}
    				}				
    			}	
    		}
    
    		for (k=0; k < 24; k++)
    		{
    			printf("%d\n", array_4[k]);
    		}  
    
    	puts("juhu es hat geklappt!!");
    
    	return EXIT_SUCCESS;
    }
    

    das progg geht bis schritt 1, die variable code hat also 4 ziffern, danach kommt immer 24* schritt 2 dann einmal schritt 1 dann wieder 2... 😕
    ich compiliere mit dem gcc unter ubuntu linux, fehlermeldungen kommen in soweit keine.
    könnt ihr fehler im programm finden oder habe ich das problem gar ganz falsch angefangen und es ist alles unsinn ?
    wie man sicherlich erkennt bin ich anfänger, also achtung !

    lg icepacker



  • Debugger.

    Bye, TGGC



  • i wird nicht initialisiert.

    Ganz nebenbei halte ich den Ansatz mit rand für ziemlich ungeeignet.



  • 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*/
    ...
    

Anmelden zum Antworten