Posez votre question Signaler

Sudoku - C - tableau

Juju - Dernière réponse le 7 avril 2008 à 21:47
Bonjour,
J'aimerais écrire un programme en language C qui permet 'initialiser un tableau à 1 dimension de 81 éléments avec des valeurs aléatoires entre 0 et9.
IL faut utiliser je pense les deux fonctions de stdlib.h : srand(int seed); qui initialise de
générateur de nombres pseudo-aléatoires et int rand(); qui retourne un entier entre 0 et
INT_MAX
quelqun a une idée car je ne sais du tout comment faire pour remplir aléatoirement le tableau ...
merci d'avance les amies
Lire la suite 

Sudoku - C - tableau »

39 réponses
Réponse
+1
moins plus
Bonjour,

Pourquoi ne pas faire un tableau à deux dimensions ?
int tableau[9][9];
int iLigne;
int iColonne;

/*
Initialisation du tableau...
*/



// affichage:

for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
{
   for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque case(/colonne) de la ligne courante
   {
      if ( tableau[iLigne][iColonne] != 0 )
      {
         printf( " %d ", tableau[iLigne][iColonne] );
      }
      else
      {
         printf( "   " );
      }
      printf( "\n" ); // retour à la ligne
   }
}


Y a moyen de faire plus beau en dessinant une belle grille avec des caractères ASCII.
Table ASCII les caractères 185 à 188 et 200 à 206.


M.
juju - 25 mars 2008 à 21:45
Pourquoi ne pas faire un tableau à deux dimensions ?

-> parce que un sudoku a trois dimension

meric pour ce que t'a fais je vais étudier ca
Mahmah - 25 mars 2008 à 22:00
trois dimensions ?

Je ne vois que lignes et colonnes, tu souhaiterais un tableau du genre:

int tableau[9][9][Z]; ?
Quelle est la troisième ?

M.
Ajouter un commentaire
Réponse
+1
moins plus
A partir de la première version de afficher_grille cela devrait être plus simple. Pour générer des grille on a pas besoin que ce soit beau.

Je n'ai pas cherché plus loin mais l'idée d'afficher séparément les trois éléments me parait bizarre, surtout que l'affichage dans la console ne se fait que de gauche à droite puis de haut en bas. (Ligne par ligne en somme)

Aller hop! Je te regarde faire! ^^

void afficher_ligne( int grille[9][9], unsigned int iLigne )
{


}

void afficher_colonne( int grille[9][9], unsigned int iColonne )
{


}

// 0 <= iLigneRegion <= 2
// 0 <= iColonneRegion <= 2
void afficher_region( int grille[9][9], unsigned int iLigneRegion, unsigned int iColonneRegion )
{


}


M.
juju - 1 avril 2008 à 20:05
en fait je pars de ce programme car j'ai pas appris les fonctions encore ( on nous a jsuté donné la fonction main sans onus expliqué )

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
int tableau[9][9];
int iLigne;
int iColonne;

srand( (unsigned int) time(NULL) );

for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
{
for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque colonne de la ligne courante
{
tableau[iLigne][iColonne] = rand()%10;
}
}


for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
{
for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque colonne de la ligne courante
{
if ( tableau[iLigne][iColonne] != 0 )
{
printf( " %d ", tableau[iLigne][iColonne] );
}
else
{
printf( " " );
}

}
printf( "\n" ); // retour à la ligne

}
getchar();
return 0;
}
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

C'est relativement simple : il te suffis de parcourrir le tableau, et de mettre dans chaque case une valeur :

srand( time(NULL) );
for( i=0; i<81; i++ ) // Parcours du tableau
{
   tableau[i] = rand()%10 +1; // Genere un nombre aleatoir entre 0 et 9 et ajoute 1
}


@Bientôt
Ajouter un commentaire
Réponse
+0
moins plus
problème : dans ce cas là il n'y aura aucune case à 0, alors pourquoi ajouter 1 ? :S
Juju - 24 mars 2008 à 12:52
Ah ok

En fait ce que j'aimerais c'est réaliser une grille de sudoku

je pense qu'il faudrait modifier le programme pour qu'il affiche le tableau selon la représentation habituelle d'un grille de S udoku , c'est a dire 9 carrés contenant eux-mêmes 9 carrés ( 9 chiffres tous différents )

soit en résumé une grille de 9 sur 9 chiffres et faire en sorte que seuls les chiffres différents de 0 soient affichés , le 0 apparaissant comme une case vide

Le porbléme c'est que je suis nulle en C ( mais une fois que j'aurai le programme je pourrais faire des grilles plus ou moins difficile pour mes amies )

meric d'avance
Juju - 24 mars 2008 à 13:17
srand( time(NULL) );
for( i=0; i<81; i++ ) // Parcours du tableau
{
tableau[i] = rand()%10 +1; // Genere un nombre aleatoir entre 0 et 9 et ajoute 1
}

dans le compilateur j'ai mis ::
int main (void)
{
int tableau , i ;
srand( time(NULL) );
for( i=0; i<81; i++ ) // Parcours du tableau
{
tableau[i] = rand()%10 +1; // Genere un nombre aleatoir entre 0 et 9 et ajoute 1
}

mais il me met une erreur (
subscripted value is neither array nor pointer et
parse error at end of input )
Ajouter un commentaire
Réponse
+0
moins plus
Ta variable tableau n'est pas un tableau de int ...

int tableau[], i;
juju - 24 mars 2008 à 14:17
j'ai mis ca :

#include <stdio.h>
#include <stdlib.h>

int rand ()
{
int tableau[90], i;
srand( time(NULL) );

for( i=0; i<81; i++ ) // Parcours du tableau
{
tableau[i] = rand()%10 +1; // Genere un nombre aleatoir entre 0 et 9 et ajoute 1

}
return(0)
}

ca me met
parse error before `}' ( a la derniere ligne )
juju - 24 mars 2008 à 20:22
personne n'a une solution aux probléme , ca doit etre une erreur de parenthése , non ?
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

il manque un point-virgule

}
return(0); /*<--------------*/
}
juju - 25 mars 2008 à 20:17
MERCI BEAUCOUP AMIGO

Par contre est ce que quelqun sait -comment afficher le tableau dans un compilateur

et - modifiez le programme que j'ai fais pour qu'il affiche le tableau sous forme de 9 carrées

merci d'avance
juju - 25 mars 2008 à 20:47
alors personne n'a une idée ? amigo ?
Ajouter un commentaire
Réponse
+0
moins plus
bonjoure
ben j'ai le programme de sudoku qi permet de controler les lignes et les colonnes et la region et qui permet de donner la solution avec backtraking si tu a bien cassé la tête j peu te donner la réponse :)
Ajouter un commentaire
Réponse
+0
moins plus
Quelqu'un m'avait demandé une petite explication sur le back-tracking, je mets le lien mais si j'ai bien compris tu souhaites seulement pouvoir générer des grilles sans pouvoir jouer ou obtenir la solution.

M.
juju - 26 mars 2008 à 06:47
Oui voila mahmah je veux juste cré des grilles soduku

mais je voudrais séparés le tableau en 9 carrés
Mahmah - 26 mars 2008 à 10:02
Ah ok, plus du style:

int tableau[3][3][3][3]; // 3 lignes sur 3 colonnes de "pâtés" de 3 sur 3 cases.

Pourquoi pas après tout. Je pense que ça complique un petit peu, je trouve plus naturel de dire la case (7,2) que la case (3,1,1,2).

On peut simplifier un mini poil avec


typedef int Carre[3][3];
Carre lesCarres[3][3];

Mais l'accès reste du type lesCarres[3][1][1][2];

M.
Ajouter un commentaire
Réponse
+0
moins plus
un sudoku générer aléatoirement ?? j'y crois pas trop sur le fonctionnement.
Je ne comprends pas trop ce que tu veux faire.
pour afficher sous forme de carré, il faut se prendre la tête pour utiliser le printf et afficher les éléments dans le bon sens sachant que le printf écrit de gauche à droite et de haut en bas.
Juju - 27 mars 2008 à 20:03
C'est bon j'ais fais le début

# include < stdio.h >
#include<time.h>
#include<stdlib.h>

int main ( ) {

int i;
int tableau[81];
int rand () ;

srand( time(NULL) );
i=0;
while ( i<81 )
{
tableau[i] = rand()%10 +1;
i++;
}
i=0
while ( i< 81 )
{

printf ( "%d " , tableau[i] );
if ( i%9==8) {
printf("/n");
i++
}
return(0);
}


le programme marche MAINTENANT :

Modifiez le programme pour qu'il affiche le tableau selon la représentation habituelle d'une grille
de Sudoku, c'est à dire 9 carrés (9 régions) contenant eux-mêmes 9 carrés (9 chiffres tous
différents), soit une grille de 9 sur 9 chiffres.

et faire en sorte que seuls les chiffres différents de 0 soient affichés, le 0 apparaissant comme une
case vide.

Si quelqun a une idée pour modifier mon programme initiale ( ca m'est égal finalement que ca soit a 2 dimensions ou pas )

MERCI DAVANCE ^_-
Ajouter un commentaire
Réponse
+0
moins plus
Re ^^

Et bien la solution à deux dimensions est un peu au dessus, celle à une dimension ressemble beaucoup, il n'y a que l'accès à la valeur qui change

tableau[ iLigne * 9 + iColonne ]

Si toutefois tu souhaites stocker les lignes les unes à la suite des autres...

Tu auras le temps de voir cela après mais comme le disait Char Snipeur ci-dessus, la génération automatique demandera un petit peu de travail aussi. Pas grand chose, juste de quoi assurer que la grille est cohérente. Il faudra encore un petit peu de travail pour s'assurer qu'une solution est trouvable par déduction. (on dira humainement)

M.
juju - 28 mars 2008 à 22:54
Mais genre quelqun ne pourrais pas essayer d'incruster ce qu'a fais mahmah dans mon programme car je maitrise pas du tout les matrices ( je vias essayer de faire un truc vite fais )

ca ferais un truc du genre tableau[i][j]
juju - 28 mars 2008 à 23:33
En fait j'aimerais savoir dans le programme :

# include < stdio.h >
#include<time.h>
#include<stdlib.h>

int main ( ) {

int i;
int tableau[81];
int rand () ;

srand( time(NULL) );
i=0;
while ( i<81 )
{
tableau[i] = rand()%10 +1;
i++;
}
i=0
while ( i< 81 )
{

printf ( "%d " , tableau[i] );
if ( i%9==8) {
printf("/n");
i++
}
return(0);
}


int tableau[9][9];
int iLigne;
int iColonne;

/*
Initialisation du tableau...
*/



// affichage:

for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
{
for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque case(/colonne) de la ligne courante
{
if ( tableau[iLigne][iColonne] != 0 )
{
printf( " %d ", tableau[iLigne][iColonne] );
}
else
{
printf( " " );
}
printf( "\n" ); // retour à la ligne
}
}


COMMENT INTEGRER TON PROGRAMME DANS LE MIEN ?
Ajouter un commentaire
Réponse
+0
moins plus
D'ailleurs je m'étais planté, je faisais un retour à la ligne à chaque nombre affiché et non pas tous les neuf chiffres.


int tableau[9][9];
int iLigne;
int iColonne;

/*
Initialisation du tableau...
*/



// affichage:

for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
{
   for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque colonne de la ligne courante
   {
      if ( tableau[iLigne][iColonne] != 0 )
      {
         printf( " %d ", tableau[iLigne][iColonne] );
      }
      else
      {
         printf( "   " );
      }

   }
   printf( "\n" ); // retour à la ligne
}


M.
Juju - 30 mars 2008 à 20:47
Meric mahmah mais j'aimerais intégrer ton programme dans le mien de sorte que mon d'affiche selon la représentation habituelle d'une grille de sudoku et faire en sorte que le 0 apparaise come une case vide

j'avais pensé à :

# include <stdio.h>
#include<time.h>
#include<stdlib.h>

int main ( ) {

int i;
int tableau[9][9];
int iLigne;
int iColonne;
int rand () ;

srand( time(NULL) );
i=0;
while ( i<81 )
{
tableau[iLigne][iColonne] = rand()%10;
i++;
}
i=0

while ( i< 81 )
{

printf ( "%d " ,tableau[iLigne][iColonne] );
if ( i%9==8) {
printf("/n");
i++
}

for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
{
for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque colonne de la ligne courante
{
if ( tableau[iLigne][iColonne] != 0 )
{
printf( " %d ", tableau[iLigne][iColonne] );
}
else
{
printf( " " );
}

}
printf( "\n" ); // retour à la ligne
}
return (0 )
}
Ajouter un commentaire
Réponse
+0
moins plus
Bah alors, on poste un code qui compile pas ? Il manque des ";" etc.

J'ai taillé dans le code, une fois le choix fait entre un tableau de 81 ou un tableau de 9 par 9, la moitié des boucles ne servaient plus. J'ai aussi déplacé le code d'affichage dans une autre fonction. Tu pourras faire de même avec l'initialisation afin d'avoir un code plus clair.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void afficher_grille( int grille[9][9] )
{
	int iLigne;
	int iColonne;

	for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
	{
		for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque colonne de la ligne courante
		{
			if ( grille[iLigne][iColonne] != 0 )
			{
				printf( " %d ", grille[iLigne][iColonne] );
			}
			else
			{
				printf( "   " );
			}

		}
		printf( "\n" ); // retour à la ligne
	}
}

int main()
{
	int tableau[9][9];
	int iLigne;
	int iColonne;

	srand( (unsigned int) time(NULL) );

	for ( iLigne = 0 ; iLigne != 9 ; iLigne++ ) // pour chaque ligne...
	{
		for ( iColonne = 0 ; iColonne != 9 ; iColonne++ ) // Pour chaque colonne de la ligne courante
		{
			tableau[iLigne][iColonne] = rand()%10;
		}
	}

	afficher_grille( tableau );

	getchar();
	return 0;
}



La grille est bien aléatoire mais pas forcément correcte :-/

M.
Ajouter un commentaire
Réponse
+0
moins plus
Nouvelle version de l'affichage, c'est cadeau!

void afficher_ligne( int ligne[9] )
{
	unsigned int iColonne;

	for ( iColonne = 0 ; iColonne != 9 ; iColonne++ )
	{
		if ( ( iColonne % 3 ) == 0 )
			printf( "\xBA" );
	
		if ( ligne[iColonne] != 0 )
		{
			printf( " %d ", ligne[iColonne] );
		}
		else
		{
			printf( "   " );
		}
	}
	printf( "\xBA\n" );
}

void afficher_grille( int grille[9][9] )
{
	int iLigne;

	printf( "\xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCB\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCB\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB\n" );
	for ( iLigne = 0 ; iLigne != 3 ; iLigne++ )
		afficher_ligne( grille[iLigne] );
	printf( "\xCC\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCE\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCE\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xB9\n" );

	for (  ; iLigne != 6 ; iLigne++ )
		afficher_ligne( grille[iLigne] );
	printf( "\xCC\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCE\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCE\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xB9\n" );

	for (  ; iLigne != 9 ; iLigne++ )
		afficher_ligne( grille[iLigne] );
	printf( "\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCA\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCA\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC\n" );
}


^^
M.

PS:
Pense aux balises < code> < /code> entre le bouton souligné et le bouton lien.
juju - 31 mars 2008 à 20:11
T'es magique mahmah merci beaucoup

j'ai encore trop de chose à faire si tu passes un de ces jours jette un coup d'oeil à ce que je fais
Ajouter un commentaire
Réponse
+0
moins plus
En fait maintenant j'aimerais écrire 3 programes

dont un un programe qui permet d'afficher uniquement la i-ème ligne.

un autre qui permet d'afficher uniquement la j-ème colonne.

et enfin un programe qui permet d'afficher uniquement la n-ème région dont le numéro est

donné par l'utilisateur.

( il faut partir du programme qu'on a fait je pense )
Ajouter un commentaire
Réponse
+0
moins plus
Allons allons...

Les fonctions tu en utilises déjà plein, il n'y a plus qu'à écrire les tiennes. (En plus tu as mon exemple)

une fonction peut être déclarée et doit être définie.

La déclaration c'est que tu vois partout, dans stdio.h il n'y a que ça par exemple. C'est dire voilà, il y a une fonction qui existe et qui ressemble à ça. A partir de ce moment elle devient utilisable même si elle n'est pas encore connue complètement. On appelle aussi ça la "déclaration courte". En pratique cela consiste en la reprise du prototype de la fonction (-> [type de la valeur de retour] + nom + types des paramètres) sauf qu'on le termine par un ; au lieu de la définir.

void afficher_ligne( int grille[9][9], unsigned int iLigne );

A partir de maintenant je peux écrire du code qui appelle cette fonction car on connaît tous les élément nécessaires à son utilisation.

Cela sert aussi quand on veut écrire deux fonction qui s'appelle l'une l'autre. Il faut nécessaire que chacune soit écrit avant l'autre donc pour éviter ce problème insoluble (même avec un bon solvant. Oups désolé...) -> déclaration courte et hop, ça marche.

Il n' y a pas vraiment de piège dans les fonctions. Le seule truc à savoir c'est que les paramètres sont passés par copie. (/par valeur)
int GetNumberPlusOne( int n )
{
   return n + 1;
}

void GetNumberPlusTwo( int n ) // interdiction d'avoir le même nom en C.
{
   n = n + 2;
}


void GetNumberPlusThree( int *pN ) // interdiction d'avoir le même nom en C.
{
   *pN = *pN + 3;
}


La première marche.
La deuxième ne fait rien car n est une copie de la valeur passée en paramètre et on ne modifie que la copie interne à la fonction.
La troisième est un passage par pointeur (/par adresse dira-t-on plus élégamment) La valeur passée par copie est une adresse mémoire. Connaissant cette adresse on peut modifier l'entier qui se trouve à cette adresse. Donc ça marche.

Autre intérêt de passer un paramètre par adresse : Si on a définit une structure de 400 octects, on ne les recopie pas à chaque appelle de fonction ou récupération de la valeur de retour.

Voilà, plus d'excuse! ^^
(En plus je les avais préparées avec amour)

M.
Ajouter un commentaire
Réponse
+0
moins plus
merci mahmah je vias lire tout ca
Ajouter un commentaire
Réponse
+0
moins plus
j'arrive pas à trouver les erreur dans ce programme



#include <stdio.h>
#include <time.h>
#include <stdlib.h>

typedef struct

{
int valeur;
int candidats[9];
int size;
}
Case ;

typedef Case grille[9][9];

int main () {

int grille g;
int ligne;
int colonne;
int i;
int j;

i=0;
printf ( " donnez les valeurs " );
for ( i=0; i<8; i++ )
for ( j=0; j<8; j++ ) {

scanf ( "%d" , &g[i][j].val );

if g[i][j].val=0

{ g[i][j].size=0 }

else {

g[i][j].size=9

}

return (0);
}
Ajouter un commentaire
Réponse
+0
moins plus
Tu as déclaré g avec deux types, int et grille.

Il manque quelques ';' des "valeur" à la place de "val" et une ligne est bizarre:

if g[i][j].val=0

Je suppose que c'est

if ( g[i][j].valeur == 0 )

Voilou ^^
M.
Juju - 6 avril 2008 à 20:24
en fait j'ai 2 erreur au niveau de cette partie :

if (g[i][j].valeur == 0)
{g[i][j].size=0}
else {g[i][j].size=9}

ca me met : ( 2 erreur j'ai )
parse error before `}'

merci beaucoup pour ton aide mahmah
Ajouter un commentaire
Réponse
+0
moins plus
C'est l'accolade du for précédent qui n'est pas refermée.

Il manque deux ; aussi pour tes instructions qui sont dans les { }

M.
Juju - 7 avril 2008 à 20:17
Je suis vraiment trop nulle mais je n'y arrive pas

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

typedef struct

{
int val;
int candidats[9];
int size;
}
Case ;

typedef Case grille[9][9];

int main () {

grille g;
int ligne;
int colonne;
int i;
int j;

i=0;
printf ( " donnez les valeurs " );
for ( i=0; i<8; i++ ) {
for ( j=0; j<8; j++ ) {

scanf ( "%d" , & g[i][j].val );

if ( g[i][j].val == 0 )
{ g[i][j].size = 0 } <-------- parse error before `}'

else { g[i][j].size=9 } <--------- parse error before `}'

}
}
return (0);
}


ça me met toujours 2 erreurs aux fléches que j'ai mise ( pourtant j'ai vérifié les acolades ... )
Ajouter un commentaire
Réponse
+0
moins plus
Ah, oui. Mais le compilateur est très joueur. ^^

C'est les ;

	if ( g[i][j].val == 0 )
	{
		g[i][j].size = 0 ;
	}
	else
	{
		g[i][j].size = 9 ;
	}



Il y en a toujours sauf dans les conditions (dans le if, le while) et au bout du for ou d'un while. Par contre il y en a un à la fin d'un do { ... } while ( ... ) ;

Il n'y a pas à dire que t'es nulle. Ca ne se devine pas et le compilateur est pas trop sympa en général. Il faut apprendre à moitié dans un cours/livre/site internet et à moitié en pratiquant.

M.


EDIT. :
J'ai croisé la page de CCM sur les fonctions. ;-)
Pas de panique, moi non plus je n'ai pas compris leur intro ! ^^"
Juju - 7 avril 2008 à 21:47
t'es trop fort ca marche , merci encore je t'adore
Ajouter un commentaire
Ce document intitulé « Sudoku - C - tableau » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook