Case suivante d'un tableau

titite -  
 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;
}

}
A voir également:

7 réponses

Jolkdarr
 
Hello !

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 !
0
titite
 
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");
}
0
Jolkdarr
 
Ta fonction ne fonctionne pas bien dans certains cas (par exemple, on peut sortir de la grille !).

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;
            }
        }

    }
}
0
Jolkdarr
 
Mhm... Je suis un peu étourdi, il y a une boucle qui ne sert à rien.

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;
        }
    }
}
0
titite
 
pourquoi quand j'ajoute un
printf("%d %d",i,j);
system("pause");

a la fin de la fonction ca s'affiche pas?
:(
0
titite
 
pourquoi quand j'ajoute un
printf("%d %d",i,j);
system("pause");

a la fin de la fonction ca s'affiche pas?
:(
0
NeoWP > titite
 
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:
 printf("%d %d\n",i,j) ;


mais je te garantis rien
(Ca fait un peu bidouillage je sais désolé...)
0
titite
 
ca existe for(;;)??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jolkdarr
 
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;

}
0
titite
 
Bin en fait dans ma fonction j'arrivais bien a afficher mais en effet je pouvais sortir de la grille...
Mais avec ta fonction Jolkdarr je n'arrive pas faire un printf...
0
Jolkdarr
 
Hello !

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;
}
0
titite > Jolkdarr
 
re bonjour

Ca ne marche pas :( j'obtiens prochaine de [2,2]=[2,2] c'est pas tres normal lol
0
Jolkdarr > Jolkdarr
 
Faut quoi ?
C'est la dernière case et "vaut" -1 ?
0
titite
 
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");
}
0
Jolkdarr
 
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 ?
0
titite
 
Il ne pourra pas y avoir que des cases -1
0
Jolkdarr
 
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          */
    }
0