Case suivante d'un tableau
titite
-
Jolkdarr -
Jolkdarr -
J'ai une grille de 3x3 ou j'ai des cases noires représentées par des -1.
Je veux créer une fonction qui me renvoie la case suivante en prenant en compte les cas suivant :
si la case suivante est une case noire (contenu =-1) alors il faut renvoyer la case d'apres.
si on arrive a la derniere case de la ligne il faut renvoyer a la premiere case de le ligne suivante.
Pour l'instant ma fonction me renvoie bien la case suivante et retourne bien a la premiere case de la ligne suivante mais ne prends pas en compte les cases -1. et je ne sais pas ou ajouter cette condition.
Merci pour votre aide
Voila ma fonction :
typedef struct
{
int ligne;
int colonne;
} couple;
#define taille_ligne 3
#define taille_colonne 3
int maGrille[3][3];
couple prochaineCase(couple uneCase)
{
int l,c;
couple temp={l,c};
int i=uneCase.ligne;
int j=uneCase.colonne;
while((maGrille[i][j+1] !=-1) && (i*j<=4))
{
if(j<2)
{
j++;
}
else
{
i++;
j=j-2;
}
temp.ligne=i;
temp.colonne=j;
printf("%d %d ",i,j);
system("pause");
return temp;
}
}
Je veux créer une fonction qui me renvoie la case suivante en prenant en compte les cas suivant :
si la case suivante est une case noire (contenu =-1) alors il faut renvoyer la case d'apres.
si on arrive a la derniere case de la ligne il faut renvoyer a la premiere case de le ligne suivante.
Pour l'instant ma fonction me renvoie bien la case suivante et retourne bien a la premiere case de la ligne suivante mais ne prends pas en compte les cases -1. et je ne sais pas ou ajouter cette condition.
Merci pour votre aide
Voila ma fonction :
typedef struct
{
int ligne;
int colonne;
} couple;
#define taille_ligne 3
#define taille_colonne 3
int maGrille[3][3];
couple prochaineCase(couple uneCase)
{
int l,c;
couple temp={l,c};
int i=uneCase.ligne;
int j=uneCase.colonne;
while((maGrille[i][j+1] !=-1) && (i*j<=4))
{
if(j<2)
{
j++;
}
else
{
i++;
j=j-2;
}
temp.ligne=i;
temp.colonne=j;
printf("%d %d ",i,j);
system("pause");
return temp;
}
}
A voir également:
- Case suivante d'un tableau
- Tableau word - Guide
- Trier un tableau excel - Guide
- Imprimer un tableau excel - Guide
- Tableau ascii - Guide
- Tableau croisé dynamique - Guide
7 réponses
Hello !
T'as pas oublié d'initilialiser ta grille ?
Par exemple :
Take care !
T'as pas oublié d'initilialiser ta grille ?
Par exemple :
int maGrille[taille_ligne][taille_colonne] =
{
{ -1, 0, -1 },
{ 0, -1, 0 },
{ -1, 0, -1 }
};
Take care !
non non ca je l'ai fait dans le main ;)
C'est la condition sur les cases noires que j'arive pas a mettre en place.
int main()
{
int l ,c ,nbCasesnoire;
couple uneCase = {0,2};
couple case1 = {1,1};
couple casen = {1,3};
int nb;
//positionnement des cases noires
maGrille[0][1]=-1;
maGrille[2][0]=-1;
nbCasesnoire=2;
affichage(maGrille);
miseAzeroGrille(maGrille);
prochaineCase(uneCase);
return 0 ;
system("pause");
}
C'est la condition sur les cases noires que j'arive pas a mettre en place.
int main()
{
int l ,c ,nbCasesnoire;
couple uneCase = {0,2};
couple case1 = {1,1};
couple casen = {1,3};
int nb;
//positionnement des cases noires
maGrille[0][1]=-1;
maGrille[2][0]=-1;
nbCasesnoire=2;
affichage(maGrille);
miseAzeroGrille(maGrille);
prochaineCase(uneCase);
return 0 ;
system("pause");
}
Ta fonction ne fonctionne pas bien dans certains cas (par exemple, on peut sortir de la grille !).
Proposition :
Proposition :
couple prochaine_case(couple uneCase)
{
couple case_suivante = uneCase;
int i = uneCase.ligne;
int j = uneCase.colonne;
for (i = uneCase.ligne; ;)
{
/* deplacement dans la grille : */
for (j = uneCase.colonne; ;)
{
if (j == taille_colonne - 1)
{
if (i == taille_ligne - 1)
{
/* on est a la derniere case : */
case_suivante.ligne = i;
case_suivante.colonne = j;
return case_suivante;
}
else
{
j = 0; /* premiere case */
i++; /* ligne suivante */
}
}
else
{
j++; /* colonne suivante */
}
/* test : */
if (maGrille[i][j] != -1)
{
case_suivante.ligne = i;
case_suivante.colonne = j;
return case_suivante;
}
}
}
}
Mhm... Je suis un peu étourdi, il y a une boucle qui ne sert à rien.
Proposition (version 2) :
Proposition (version 2) :
couple prochaine_case(couple uneCase)
{
couple case_suivante = uneCase;
int i = uneCase.ligne;
int j = uneCase.colonne;
/* deplacement dans la grille : */
for (;;)
{
if (j == taille_colonne - 1)
{
if (i == taille_ligne - 1)
{
/* on est a la derniere case : */
case_suivante.ligne = i;
case_suivante.colonne = j;
return case_suivante;
}
else
{
j = 0; /* premiere case */
i++; /* ligne suivante */
}
}
else
{
j++; /* colonne suivante */
}
/* test : */
if (maGrille[i][j] != -1)
{
case_suivante.ligne = i;
case_suivante.colonne = j;
return case_suivante;
}
}
}
Salut,
Euh je suis pas vraiment sur de ce que je vais avancer, mais il doit y avoir une histoire de sortie standard bufferisée qui fait qu'en fait le buffer est pas affiché à l'écran.
Enfin toujours est-il que j'ai déjà eu un problème similaire qui s'était résolu en rajoutant un '\n'
Alors je te conseille:
mais je te garantis rien
(Ca fait un peu bidouillage je sais désolé...)
Euh je suis pas vraiment sur de ce que je vais avancer, mais il doit y avoir une histoire de sortie standard bufferisée qui fait qu'en fait le buffer est pas affiché à l'écran.
Enfin toujours est-il que j'ai déjà eu un problème similaire qui s'était résolu en rajoutant un '\n'
Alors je te conseille:
printf("%d %d\n",i,j) ;
mais je te garantis rien
(Ca fait un peu bidouillage je sais désolé...)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Regarte bien dans ton code, Titite, tu as une { mal placée :
couple prochaineCase(couple uneCase)
{
int l,c;
couple temp={l,c};
int i=uneCase.ligne;
int j=uneCase.colonne;
while((maGrille[i][j+1] !=-1) && (i*j<=4))
{
if(j<2)
{
j++;
}
else
{
i++;
j=j-2;
}
}
temp.ligne=i;
temp.colonne=j;
printf("%d %d ",i,j);
system("pause");
return temp;
}
Hello !
Essaie le programme suivant :
Essaie le programme suivant :
#include <stdio.h>
typedef struct
{
int ligne;
int colonne;
} couple;
couple prochaine_case(couple uneCase);
#define taille_ligne 3
#define taille_colonne 3
const int maGrille[taille_ligne][taille_colonne] =
{
{ -1, 0, -1 },
{ 0, -1, 0 },
{ -1, 0, -1 }
};
couple prochaine_case(couple uneCase)
{
couple case_suivante;
int i = uneCase.ligne;
int j = uneCase.colonne;
for (;;)
{
/* deplacement dans la grille : */
if (j == taille_colonne - 1)
{
if (i == taille_ligne - 1)
/* on est a la derniere case : */
break;
else
{
j = 0; /* premiere case */
i++; /* ligne suivante */
}
}
else
{
j++; /* colonne suivante */
}
/* test : */
if (maGrille[i][j] != -1)
break; /* case valide */
}
case_suivante.ligne = i;
case_suivante.colonne = j;
return case_suivante;
}
int main()
{
int i, j;
for (i = 0; i < taille_ligne; i++)
for (j = 0; j < taille_colonne; j++)
{
couple c;
couple s;
c.ligne = i, c.colonne = j;
s = prochaine_case(c);
printf("suivante[%d][%d] = [%d,%d]\n", i, j, s.ligne, s.colonne);
}
return 0;
}
je ne m'en sort pas avec ton code ...alors dans la mienne la condition sur la sortie de la grille est reglée mais il me reste la condition sur les cases -1. il faudrait que j'ajoute quelque chose du style
if(maGrille[i][j]==-1)
{
couple prochaine;
prochaine=prochaineCase(temp);
}
Le probleme c'est que je ne sais pas ou l'ajouter j'ai essayer apres le while.pour qu'il fasse le teste apres avoir trouvé la case suivante mais ca ne fonctionne pas.
couple prochaineCase(couple uneCase)
{
int l,c;
couple temp={l,c};
int i=uneCase.ligne;
int j=uneCase.colonne;
while((maGrille[i][j+1] !=-1) && (i*j<3))
{
if(j<2)
{
j++;
}
else
{
i++;
j=j-2;
}
temp.ligne=i;
temp.colonne=j;
printf("%d %d ",i,j);
system("pause");
return temp;
}
printf("sortie de grille \n");
system("pause");
}
if(maGrille[i][j]==-1)
{
couple prochaine;
prochaine=prochaineCase(temp);
}
Le probleme c'est que je ne sais pas ou l'ajouter j'ai essayer apres le while.pour qu'il fasse le teste apres avoir trouvé la case suivante mais ca ne fonctionne pas.
couple prochaineCase(couple uneCase)
{
int l,c;
couple temp={l,c};
int i=uneCase.ligne;
int j=uneCase.colonne;
while((maGrille[i][j+1] !=-1) && (i*j<3))
{
if(j<2)
{
j++;
}
else
{
i++;
j=j-2;
}
temp.ligne=i;
temp.colonne=j;
printf("%d %d ",i,j);
system("pause");
return temp;
}
printf("sortie de grille \n");
system("pause");
}
Que se passe-t-il si on a atteint la dernière case sans trouver de case valide (ne valant pas -1) ?
Que se passe-t-il si toutes les cases valent -1 ?
Que se passe-t-il si toutes les cases valent -1 ?
Si il faut reboucler à la première case de la première ligne, il faut modifier le code de la boucle comme suit (en gras) :
for (;;)
{
/* deplacement dans la grille : */
if (j == taille_colonne - 1)
{
if (i == taille_ligne - 1)
/* on est a la derniere case : */
/*break;*/
j = 0, /* premiere case */
i = 0; /* premiere ligne */
else
{
j = 0; /* premiere case */
i++; /* ligne suivante */
}
}
else
{
j++; /* colonne suivante */
}
/* test : */
if (maGrille[i][j] != -1)
break; /* case valide */
}