Tableau en C

Bonjour,

j'ai initialisé un tableau de 81 indices. Ensuite, j'affiche ce tableau (T[80]) comme une matrice

123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789

j'ai une deuxième fonction qui demande à l'utilisateur d'entrer un numero de colonne (les colonnes vont de 0 à 8) et la fonction regradre si le chiffre se trouve dans cette colonne (ex : chiffre 5 (N) à l'ince (col) de la colonne 4 )

j'ai toujours comme retour 1 et jamais 121 (pour condition vrai). Je ne vois pas mon erreur...
Voici mon code

#include <stdio.h>
#include <stdlib.h>
int TT[80];

int CheckCC (int, int);
void EncodeTT();
int main()
{
    int N, col;


    EncodeTT();
    printf("\nnombre a verifier : ");
    scanf("%d", &N);
    printf("\ncolonne ou se trouve le nombre : ");
    scanf("%d", &col);
    printf("\n%d", CheckCC(col, N));

    return 0;
}

void EncodeTT()
{
    int i=0, j=0, k=1;
    for (i=0; i<=8;i++)
    {
        for (j=0;j<=8; j++)
        {
            printf("%d\t", TT[i]=k++);
        }
        printf("\n");
        k=1;
    }

}

int CheckCC (int c, int nombre)
{
    int j;



    for (j=c;j<=80;j+=9)
    {
        if (TT[j]==nombre)

            return 121;
    }

    return 1;
}


Configuration: Linux
Firefox 3.0.3

14 réponses

  1. Contributeur
    Salut,
    Ton tableau est mal rempli.
    Remplace :
    printf("%d\t", TT[i]=k++);

    Par :
    printf("%d\t", TT[i*9+j]=k++);

    Cdlt.
    0
    1. Salut, merci pour ta réponse mais je n'ai pas comprs ce que ça fait ,

      ========> [i*9+j] C'est ça que je comprend pas...

      Merci d'avnce
      0
      1. Contributeur
        Toi, tu as juste mis i. Or, cette variable est dans ta boucle for et prends ses valeurs entre 0 et 8 compris. Du coup, seule la première partie de ton tableau sera initialisée.
        Or en faisant i*9+j, tu vas prendre successivement tous les indices du tableau.
        0
    2. donc c'est pas un pointeur, c'est juste i fois neuf plus j , c'est ça?
      0
      1. Contributeur
        Oui une simple multiplication. Sois pas traumatisé par les pointeurs ;)
        0
    3. c'est encore moi. Ppour l'instant, mon tableau est inititalisé de la sorte :

      123456789
      123456789
      123456789
      123456789
      123456789
      123456789
      123456789
      123456789
      123456789


      j'aimerais l'initialisé de cette façon
      123123123
      456456456
      789789789
      123123123
      456456456
      789789789
      123123123
      456456456
      789789789
      

      mais je ne vois pas trop par ou commencer... Si tu as une idée à me suggérer je suis preneur.
      0
      1. Contributeur
        Dans ta fonction EncodeTT(), remplace le printf par :
        printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);
        0
        1. Salut, super ça foncitonne mais je ne vois pas comment.... J'ai juste changer de place i et j

          printf("%d\t",TT[i+j*9]=1+(3*i+j%3)%9);


          Pour encoder le premier chiffre, on fait 1 + 3 fois i (qui vaut 0) + j (qui vaut 0) modulo 3 et après modulo 9 ça fait donc 1
          Pour encoder le deuxième chiffre, on fait 1 + 3 fois i (qui vaut donc 1) + j(qui vaut 0 ) modulo 3 et après modulo 9.===> seulement je ne comprend pas le calcul. 1+ 3*1+0%3%9 car quand je calcul ça je devrais trouver 2 et moi je trouve 4,
          3*1=3 , +o%3=0 ==> 3%9= 3 ==> 1+3 = 4
          donc j'ai une erreur de compréhension.

          Merci d'avance
          0
          1. Contributeur
            Salut,
            Ah, désolé. J'ai oublié de te dire d'inverser i et j dans les boucles for.
            Ce qui donne en fait :
            for(j=0;j<9;j++)
                for(i=0;i<9;i++)
                     printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);
            

            Et là, tu devrais mieux comprendre en refaisant les calculs.
            Sinon je t'explique pourquoi. En fait, ton calcul est bon, et celui de l'ordi aussi. Mais tu n'affiches pas à l'écran ton tableau (en matrice) tel qui l'est vraiment. Dans ta version, tu calcules en colonnes, et tu affiches en ligne. D'où le quiproquo.
            Sinon, je te conseille de séparer le printf de ta fonction EncodeTT(), et de faire une fonction d'affichage.
            Car, comme je t'ai expliqué, tu ne remplis pas forcément de la même façon que tu souhaites l'afficher à l'écran, donc tu risques d'avoir des problèmes de visualisations du tableau si tu fais pas attention.
            Cdlt
            0
            1. Salut,

              si j'ai bien compris, comme c'est indiqué, ça rempli le tableau verticalement... C'est ça non? Seulement avec cette façon :

              for(j=0;j<9;j++)
                  for(i=0;i<9;i++)
                       printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);
              


              ça rempli le tableau comme suit :

              147147147
              258258258
              369369369
              147147147
              258258258
              369369369
              147147147
              258258258
              369369369
              


              et mes deux fonctions pour trouver la ligne ou la colonne fonctionnent

              fonctions :

              int CheckCC (int c, int nombre)
              {
                  int j;
              
              
              
                  for (j=c;j<=80;j+=9)
                  {
                      if (TT[j]==nombre)
              
                          return 1;
                  }
              
                  return 0;
              }
              
              int CheckCL (int l, int nombre)
              {
                  int j;
              
              
              
                  for (j=l*9;j<=l+9;j++)
                  {
                      if (TT[j]==nombre)
              
                          return 1;
                  }
              
                


              Seulement quand je change l'ordre des boucles dans l'encodage du tableau, mes deux fonctions ne focntionnes plus... Je comprend pas pourquoi, qu'est ce qui change?

              changement des boucles
              for(i=0;i<9;i++)
                  for(j=0;j<9;j++)
                       printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);


              ça donne comme affichage :

              123123123
              456456456
              789789789
              123123123
              456456456
              789789789
              123123123
              456456456
              789789789
              


              Merci d'avance pour tes explications
              0
              1. En fait j'ai compris pour mes fonctions, comme ça rempli le tableau verticalement, c'est normal que je ne trouve pas le nombre demandé comme si le tableau était encodé horizontalement.

                Par contre, je ne vois pas comment remplir ce tableau horizontalement comme verticalement.
                0
                1. Contributeur
                  Non,
                  for(j=0;j<9;j++)
                      for(i=0;i<9;i++)
                           printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);


                  Regarde bien. i évolue plus souvent, et il n'est pas multiplié par 9. Donc tu restes le long de la ligne.
                  Donc tu le remplis horizontalement. Et ça m'étonnerait fort que ça donne donne le résultat que t'as donné.
                  Ca te donne plutôt :
                  1 2 3 1 2 3 ...
                  4 ...
                  

                  Autrement dit le bon résultat.

                  for(i=0;i<9;i++)
                      for(j=0;j<9;j++)
                           printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);
                  

                  Là j s'incrémente plus souvent et est multiplié par 9. Donc on remplit en colonne. Et les colonnes s'affiche en ligne.
                  Car avec le printf, tu affiches le nombre, puis tabulation, puis tu affiches l'autre terme (celui de l'autre colonne).
                  Donc le tableau n'est pas conforme à ce que tu vois à l'écran. En gros, ce que tu vois à l'écran c'est ce que tu veux. Mais en fait ton tableau est différent.

                  C'est pour ça que je te conseille de ne pas mettre de printf dans ta fonction et d'utiliser seulement l'affectation. (TT[...]=...).
                  Et tu fais une autre fonction d'affichage. Comme ça tu n'auras pas ce problème.
                  0
                  1. rebonsoir,

                    je t'affiche mes deux fonctions car je n'ai rien changé de ça
                    for(j=0;j<9;j++)
                        for(i=0;i<9;i++)
                             printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);


                    et tout fonctionne correctement, j'ai bien à l'affichage ça :
                    123123123
                    456456456
                    789789789
                    123123123
                    456456456
                    789789789
                    123123123
                    456456456
                    789789789
                    


                    par contre dans ma fonction AfficheTT() j'ai utilisé des conditions if, y'aurait pas plus court tu penses???
                    void EncodeTT()
                    {
                        int i=0, j=0;
                        for (j=0;j<=8; j++)
                    
                        {
                            for (i=0; i<=8;i++)
                            {
                                TT[i*9+j]=1+(3*i+j%3)%9;
                            }
                    
                    
                        }
                    
                    }
                    
                    void AfficheTT()
                    {
                        int i;
                    
                    
                        for (i=0; i<=80; i++)
                        {
                            printf("%d\t", TT[i]);
                            if (i==8%17)
                            printf("\n");
                            if (i==17%26)
                            printf("\n");
                            if (i==26%35)
                            printf("\n");
                            if (i==35%44)
                            printf("\n");
                            if (i==44%53)
                            printf("\n");
                            if (i==53%62)
                            printf("\n");
                            if (i==62%71)
                            printf("\n");
                            if (i==71%80)
                            printf("\n");
                    
                    
                        }
                    }
                    0
                    1. Contributeur
                      Ouh là, si si, il y a plus court lool.

                      int i;
                      for(i=0;i<81;i++){
                          if(! i%9) puts("");
                          printf("%d\t",TT[i]);
                      }
                      

                      Ou tu peux aussi avec deux boucles for, en t'inspirant de ta fonction de remplissage de tableau.
                      Cdlt
                      0
                      1. ça veut dire quoi cette ligne ci :
                         if(! i%9) puts("");
                        
                        0
                        1. Contributeur
                          Si i est un multiple de 9, alors tu sautes une ligne.
                          puts("blabla") signifie printf("blabla\n")
                          Cdlt
                          0
                      2. ok, et encore merci pour ton aide...
                        0