Probleme lors de l'incrémentation du fonction ( C )

Discussion dans 'Web, design' créé par - Lo0, 23 Novembre 2006.

Statut de la discussion:
Fermée.
  1. Offline
    - Lo0 Elite
    Bonjour, tout le monde. Je dois faire une programme de sudoku en C pour l'école et donc la premiere étape est de crée une grille complete de sudoku. Pour ca pas de probleme, je procede de la facon la plus élémentaire qui soit, cad je pioche une nombre au hasard et je vérifie qu'il n'a pas d'équivalent dans la ligne, colone ou sous grille, aux quelle cas je repioche un nombre un certain nombre de fois, s'il ne trouve pas, je recommence la grille a 0.

    Jusque la pas de probleme, je fait cette partie la dans mon main() et ca marche tres bien. Cependant, je dois crée une fonction pour faire ca, donc pas de probleme, je fait copier / coller en écrivant au dessus

    int CreeGrilleSudoku (int tab[][9] );

    /*-----------------------------------------------------------------
    // DESCRIPTION : Crée une grille de sudoku aléatoire
    // IN :
    // OUT : tab = le tableau dans le quelle ont écris les valeur de la grille
    // RETURN : le nombre d'essais pour créer la grille
    //-----------------------------------------------------------------*/
    int CreeGrilleSudoku (int tab[][9] )


    Je suprime le int tab[][9] qui se retrouve redondant. Et la, pouf, ca marche plus. Il éxécute bien la fonction mais il mouline a l'infini ( en évitant d'éxécuter certain if diront on ). =/
    Quelqu'un a pas une idée du probleme ?

    Pour info, voici mes deux programme avant et apres, quand ca marche et quand ca marche pas
    Aussi : Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ; : crée une matrice avec que des 0 dedans
    Affiche_Matrice_i(9, 9, tab ) ; : affiche la matrice

    Donc quand ca marche.

    Code:
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #define MAXESSAIS 50
    #include "..\vecteur.h"
    #include "..\matrice.h"
    
    
    
    main()
    {
    	int i, j, k, a,b, tab[9][10], redonne = 0, compteur = 1, essais = 0, essais2 = 0 ; // compteur = 1 car si réussi premier coup compte 0x 
    	Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
    	srand((unsigned) time(NULL) + rand());
    
    	for( i=0 ; i<9 ; i++ )
    		for ( j=0; j<9 ; j++ )
    		{
    			tab[i][j] = rand() % 9 + 1;
    			if ( j != 0 )
    			for( k = j-1 ; k >= 0 ; k-- ) 
    			{
    				if (tab[i][k] == tab[i][j] )  // A
    				{
    					redonne = 1 ;
    					k = 0 ;
    				}
    			}
    			// printf("test1") ;
    			if (redonne == 0 && i != 0)
    			{
    			//	printf("test2") ;
    				for( k = i-1 ; k >= 0 ; k-- )   // B
    				{
    					if (tab[k][j] == tab[i][j] )
    					{
    						redonne = 1 ;
    						k = 0 ;			// empeche de calculer pour rien, sort de la boucle
    						essais++ ;
    					}
    				}
    			}
    			if ( redonne == 0 && ( i!=0 || j!=0 ) )	   // C
    				for ( a = i - i%3 ; a < i - i%3 + 3 ; a++ )
    					for ( b = j - j%3 ; b < j - j%3 + 3 ; b++ )
    					{
    						if ( ( a != i || b != j ) && tab[a][b] == tab[i][j]) 
    						{
    							 redonne = 1 ;
    							 essais2++ ;
    							 a = 10 ;
    							 b = 10 ;
    					//		 printf( "test") ;
    						}
    					}
    				//printf("tot") ;
    
    
    
    			if(redonne == 1 )
    				j-- ;
    			//else if( redonne == 3 )
    			else if ( redonne == 0 ) 
    				essais = 0 ;
    			
    			redonne = 0 ;
    			if ( essais == MAXESSAIS || essais2 == MAXESSAIS )
    			{
    //				printf("TOTO1") ;
    				Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
    				essais = 0 ;
    				essais2 = 0 ;
    				i = -1 ;
    				j = -1 ;
    				compteur++ ;
    			}
    
    		}
    		Affiche_Matrice_i(9, 9, tab ) ;
    		printf("\n %d ", compteur ) ;
    }
    Quand ca marche pas [IMG]
    Code:
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #define MAXESSAIS 50
    #include "D:\Documents and Settings\ggh\Bureau\module\vecteur.h"
    #include "D:\Documents and Settings\ggh\Bureau\module\matrice.h"
    
    int CreeGrilleSudoku (int tab[][9] ) ;
    
    /*-----------------------------------------------------------------
    // DESCRIPTION : Crée une grille de sudoku aléatoire
    // IN  : 
    // OUT : tab = le tableau dans le quelle ont écris les valeur de la grille
    // RETURN : le nombre d'essais pour créer la grille
    //-----------------------------------------------------------------*/
    
    int CreeGrilleSudoku (int tab[][9] )
    {
    	int i, j, k, a,b,  redonne = 0, compteur = 1, essais = 0, essais2 = 0 ; // compteur = 1 car si réussi premier coup compte 0x 
    	Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
    	Affiche_Matrice_i(9, 9, tab ) ;
    	srand((unsigned) time(NULL) + rand());
    
    	for( i=0 ; i<9 ; i++ )
    		for ( j=0; j<9 ; j++ )
    		{
    			tab[i][j] = rand() % 9 + 1;
    			if ( j != 0 )
    			for( k = j-1 ; k >= 0 ; k-- ) 
    			{
    				if (tab[i][k] == tab[i][j] )  // A
    				{
    					redonne = 1 ;
    					k = 0 ;
    					printf("testKK" ) ;
    				}
    			}
    			 printf("test1") ;
    			if (redonne == 0 && i != 0)
    			{
    				printf("test2") ;
    				for( k = i-1 ; k >= 0 ; k-- )   // B
    				{
    					if (tab[k][j] == tab[i][j] )
    					{
    						redonne = 1 ;
    						k = 0 ;			// empeche de calculer pour rien, sort de la boucle
    						essais++ ;
    					}
    				}
    			}
    			if ( redonne == 0 && ( i!=0 || j!=0 ) )	   // C
    				for ( a = i - i%3 ; a < i - i%3 + 3 ; a++ )
    					for ( b = j - j%3 ; b < j - j%3 + 3 ; b++ )
    					{
    						if ( ( a != i || b != j ) && tab[a][b] == tab[i][j]) 
    						{
    							 redonne = 1 ;
    							 essais2++ ;
    							 a = 10 ;
    							 b = 10 ;
    							 printf( "test") ;
    						}
    					}
    				printf("tot %d", essais) ;
    
    
    
    			if(redonne == 1 )
    				j-- ;
    			//else if( redonne == 3 )
    			else if ( redonne == 0 ) 
    				essais = 0 ;
    			
    			redonne = 0 ;
    			if ( essais == MAXESSAIS || essais2 == MAXESSAIS )
    			{
    				printf("TOTO1") ;
    				Intro_Matrice_i_Aleatoire(9, 9, tab, 0, 0 ) ;
    				essais = 0 ;
    				essais2 = 0 ;
    				i = -1 ;
    				j = -1 ;
    				compteur++ ;
    			}
    			
    
    		}
    		Affiche_Matrice_i(9, 9, tab ) ;
    			return compteur ;
    }
    
    
    
    main()
    {
    	int  tab[9][10], compteur  ;  
    	
    	compteur = CreeGrilleSudoku( tab ) ;
    	Affiche_Matrice_i(9, 9, tab ) ;
    	printf("\n %d ",compteur) ;
    }
    
    - Lo0, 23 Novembre 2006
    #1
  2. Offline
    Dieu Bisounours a.k.a FFS
    Après une première lecture très rapide et n'étant pas expert en C, je dirai que c'est peut-etre un problème de passage de variable à la fonction.
    Quand tu passes par valeur une variable à une fonction il effectue une copie locale à la fonction de la variable et c'est donc une différente qui arrive dans ta fonction! De plus, lorsque la fonction se termine, cette variable "temporaire" est automatiquement détruite.

    Essaye de passer le tableau par référence ( appelfonction(&tableau) ) afin que ca soit sur ton tableau de départ que les changements s'effectuent et non sur un tableau different!

    Maintenant je te dis ca car c'est un problème recurrent dans ce genre de programme mais je suis peut-être complètement à côté de la plaque :-D

    Enfin dis moi quoi :)
    Dieu Bisounours, 23 Novembre 2006
    #2
  3. Offline
    - Lo0 Elite
    Non apparement ca change rien. Tempis je demanderai demain a la prof
    - Lo0, 23 Novembre 2006
    #3
  4. Offline
    .Vinc. Oh, un LamZ !
    Tu fais Prologin2007 ? o_O
    .Vinc., 23 Novembre 2006
    #4
  5. Offline
    - Lo0 Elite
    Non, parcontre je viens d'aller voir sur leur site, premier exercices ils se plantent deja. 2000 n'est pas une année bisextille ;-D
    Puis faut etre francais, non ? J'essayerais bien en fait, mais bon, mes chances sont minces :p-
    - Lo0, 24 Novembre 2006
    #5
  6. Offline
    gogoprog Oprahiste vaudou
    Tu peux y aller meme si tu n'es pas francais ;)
    J'ai fait celui de 2006, selectionné pour la finale a paris mais j'ai pas été ;)
    gogoprog, 24 Novembre 2006
    #6
  7. Offline
    Froggy fake geek
    hein ? o_O

    bien sur que 2000 est une année bissextile :D
    Froggy, 24 Novembre 2006
    #7
  8. Offline
    - Lo0 Elite

    ;-D:oops:;-D

    C'est vrai, je croyais que non parce qu'il y a une subtilité si l'année est divisible par 100 mais pas par 400 elle l'est pas :p

    Au fait j'ai trouvé le probleme ( oui bon, ma prof a trouvé ).

    Le probleme est que dans le main() je int un tableau 9x9 et dans ma fonction je dois avoir un tableau 10x10. J'ai pas trop compris pourquoi, mais voila, c'etait ca.
    - Lo0, 24 Novembre 2006
    #8
  9. Offline
    Liquid Sn@ke Touriste
    tes pas à Gramme à liège par hasard?
    Liquid Sn@ke, 25 Novembre 2006
    #9
  10. Offline
    - Lo0 Elite
    Si en 2ieme :)
    - Lo0, 25 Novembre 2006
    #10
Statut de la discussion:
Fermée.