Tableau en C

Fermé
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 8 nov. 2008 à 17:03
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 - 9 nov. 2008 à 22:11
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;
}


14 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 nov. 2008 à 17:57
Salut,
Ton tableau est mal rempli.
Remplace :
printf("%d\t", TT[i]=k++);

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

Cdlt.
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
8 nov. 2008 à 18:10
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 nov. 2008 à 18:20
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
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
8 nov. 2008 à 18:30
donc c'est pas un pointeur, c'est juste i fois neuf plus j , c'est ça?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 nov. 2008 à 18:37
Oui une simple multiplication. Sois pas traumatisé par les pointeurs ;)
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
8 nov. 2008 à 19:03
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

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 nov. 2008 à 20:02
Dans ta fonction EncodeTT(), remplace le printf par :
printf("%d\t",TT[i+j*9]=1+(3*j+i%3)%9);
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
9 nov. 2008 à 11:59
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
9 nov. 2008 à 12:20
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
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
9 nov. 2008 à 19:18
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
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
9 nov. 2008 à 19:36
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
9 nov. 2008 à 19:42
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
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
9 nov. 2008 à 21:18
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
9 nov. 2008 à 21:35
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
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
9 nov. 2008 à 21:50
ça veut dire quoi cette ligne ci :
 if(! i%9) puts("");
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
9 nov. 2008 à 22:10
Si i est un multiple de 9, alors tu sautes une ligne.
puts("blabla") signifie printf("blabla\n")
Cdlt
0
limbergh Messages postés 658 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 29 juin 2010 140
9 nov. 2008 à 22:11
ok, et encore merci pour ton aide...
0