Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Vérifier qu'un tableau est symétrique en utilisant les pointeurs
    Bonjour, je suis un étudiant en informatique est comme mentionné dans le titre j'éprouve une difficulté à résoudre un exercice avec les pointeurs et le voici :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <stdio.h>
    #include <stdlib.h>
    #define maxcol 50
    #define maxlig 50
     
     
    int main()
    {
     
       int j,i,tab[maxlig][maxcol];
       int symetrie=0;
       int c,l;
       int *ptab;
       int *pt;
       int *pt2;
       int pttab;
       int k=1;
     
        do
    {
        printf("entrer un nombre de ligne :");
        scanf("%d",&l);
    }while(l<0 || l>maxlig);
    do
    {
        printf("entrer un nombre de colone :");
        scanf("%d",&c);
    }while(c<0 || c>maxcol);
     
     
    for(i=0,ptab=&tab[0][0];i<l;i++)
    {
        pt=ptab+i*maxcol;
        for(j=0;j<c;j++)
        {
            printf("entre l'element du vecteur [%d] [%d] ",i,j);
            scanf("%d",pt);
            pt++;
        }
    }
    for(i=0,ptab=&tab[0][0];i<l;i++)
    {
        pt=ptab+i*maxcol;
        for(j=0;j<c;j++)
        {
            printf("[%d\t]",*pt);
           pt++;
        }
        printf("\n");
    }
    ptab=&tab[0][0];
    for(i=0;i<l;i++)
    {
     
     pt=ptab+(i+1)+i*maxcol;
        for(j=0;j<c;j++)
        {
            pt2=ptab+(i+1)*maxcol+i;
            if(*pt==*pt2)
            {
     
                pt++;
                pt2=pt2+maxcol;
                symetrie=0;
     
            }
            else
            {
                symetrie=1;
                j=n;
     
            }
        }
     
    }
    if(symetrie==0)
    {
        printf("le tableau est symetrique ");
    }
    else
    {
        printf("le tableau n'es pas symetrique");
    }
    return 0;
     
     
     
     
    }

    Mon raisonement me parait parfaitement logique mais je n'arrive pas trouver la solution si quelqu'un a pourrait m'aider je lui en serais fort reconnaissant...

  2. #2
    Membre habitué
    Bonjour,

    Ligne 70, est-ce que n doit-être déclaré ?

  3. #3
    Futur Membre du Club
    Ligne 70, est-ce que n doit-être déclaré ?
    Je ne vois pas de quoi vous parlez car je n’es jamais declarer de variable n ou bien utiliser cette variable la ligne 70 est par rapport a mon pointeur qui me permet de pointer des valeur dans le tableau du coter droit de la diagonale du tableau

  4. #4
    Expert éminent sénior
    Bonjour
    Citation Envoyé par sogeking4460 Voir le message
    Je ne vois pas de quoi vous parlez car je n’es jamais declarer de variable n
    Ben justement. En C on déclare une variable avant de l'utiliser. D'ailleurs ton code ne compile même pas (le compilateur bloque sur ce j=n de la ligne 70).
    Par ailleurs, "n" non déclaré implique "n" non initialisé. Autrement dit, tu copies dans "j" une valeur que tu ne connais pas et que tu ne maitrises pas.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  5. #5
    Futur Membre du Club
    Bien vus ^^ envoyer de mettre mon upload et j'avais effectuer une petite modification or a ce moment la j'avais oublier que je n’utilisais plus la variable "n"... Ce que je voulais mettre c’était " j=c;" pour pouvoir sortir de la boucle si le tableau n'es pas symétrique mais cela ne résout malheureusement pas mon problème car celui est dans la manipulation des pointeur...


    Cependant merci pour votre réponse Sogeking.

  6. #6
    Expert éminent sénior
    Ok, j=c ça compile.
    Maintenant il faudrait que tu nous définisses ce que tu entends par "symétrique". Car dans le monde mathématique, des symétries il n'y en n'a pas qu'une. Toutefois je pense que le souci se situe quand tu places le flag "symétrie". Car ce flag, tu le places à chaque case testée. Autement dit, si la dernière case est bonne, même si les autres ne le sont pas, ton tableau est dit "symétrique" alors que ce n'est pas le cas.

    En informatique, si on veut tester qu'un ensemble vérifie une propriété quelconque, on part du principe qu'il l'a et on cherche un cas qui ne l'a pas. Et si on ne le trouve pas, alors l'ensemble vérifie bien la propriété.
    Donc dans ton cas, tu dois partir du principe que le tableau est symétrique, et chercher un cas où il ne l'est pas.

    Ensuite concernant le traitement d'un tableau par un pointeur, tu n'as pas besoin de calculer la position du pointeur par rapport au nombre de colonnes. Car que le tableau soit en 1D ou en 25D, toutes ses cases se suivent en mémoire.
    Donc te suffit de placer le premier pointeur au début, le second à la fin (là effectivement le nombre de colonnes joue pour trouver cette fin), et d'incrémenter simplement le premier et décrémenter le second jusqu'à ce qu'ils se croisent (ou, pour aller plus vite, jusqu'à trouver un cas non symétrique).
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  7. #7
    Expert éminent
    Citation Envoyé par Sve@r Voir le message
    Ok, j=cMaintenant il faudrait que tu nous définisses ce que tu entends par "symétrique". Car dans le monde mathématique, des symétries il n'y en n'a pas qu'une.
    Effectivement je me suis fait la même réflexion

    Mais je n'ai jamais eu de symétrie centrale sur un tableau ou
    Et à chaque qu'on parle de symétrie avec une matrice, c'est toujours par rapport à la diagonale (coin supérieur gauche <-> coin inférieur droit).
    Et dans ce cas là, tu as juste à vérifier array[i, j] == array[j, i] ... le truc le plus basique du monde sauf éventuellement le parcours supérieur/ inférieur de ton tableau.

    Je pense qu'@sogeking4460 a juste paniqué lorsqu'on lui a dit "pointeur". Les premiers exercices que j'ai fait sur les pointeurs en tant que noob, moi aussi j'ai été largué

    Et @sogeking4460 en C :
    • array[i] équivaut à *(array + i)
    • array[i][j] équivaut à *(array + i * nb_columms + j)

  8. #8
    Futur Membre du Club
    J'y suis enfin parvenue avec de la persévérance
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <stdio.h>
    #include <stdlib.h>
    #define maxcol 50
    #define maxlig 50
    int sym(int *,int);
     
     
    int main()
    {
     
       int j,i,tab[maxlig][maxcol];
       int symetrie=0;
       int c,l;
       int *ptab
       int k=1;
     
        do
    {
        printf("entrer un nombre de ligne :");
        scanf("%d",&l);
    }while(l<0 || l>maxlig);
    do
    {
        printf("entrer un nombre de colone :");
        scanf("%d",&c);
    }while(c<0 || c>maxcol);
     
     
    for(i=0,ptab=&tab[0][0];i<l;i++)
    {
        pt=ptab+i*maxcol;
        for(j=0;j<c;j++)
        {
            printf("entre l'element du vecteur [%d] [%d] ",i,j);
            scanf("%d",pt);
            pt++;
        }
    }
    for(i=0,ptab=&tab[0][0];i<l;i++)
    {
        pt=ptab+i*maxcol;
        for(j=0;j<c;j++)
        {
            printf("[%d\t]",*pt);
           pt++;
        }
        printf("\n");
    }
    if(sym(tab,l)==1)
        printf("Le tableau est symetrique ");
    else
        printf("le tableau n'es pas symetrique ");
    return 0;
     
     
     
     
    }
    int sym(int *tab, int l)
    {
        int i,j,ok=1;
        for(i=0;i<l && ok==1;i++,tab+=maxcol-l)
        {
            for(j=i+1,tab+=i+1;j<l && ok==1;j++,tab++)
            {
                if(*(tab) !=*(tab+(maxcol *(j-i))-j+i))
                    ok=0;
            }
        }
        return ok;
    }

    je le mets pour ceux qui auraient le même problème que moi XD.

  9. #9
    Expert éminent sénior
    Citation Envoyé par sogeking4460 Voir le message
    J'y suis enfin parvenue avec de la persévérance
    Ton code ne compile pas (manque la déclaration de "pt" et le point-virgule après "ptab"). Les variables "k" et "symetrie" sont inutiles. Sinon c'est bien d'avoir pensé à déporter la recherche dans une fonction. Faut toutefois penser à caster "tab" quand tu le passes à la fonction car un int[][] n'est pas un int*. C'est cependant dommage que tu aies pensé à une fonction pour la vérification de la symétrie mais pas pour la saisie des dimensions (qui étant identique pour les lignes et colonnes aurait gagné à être factorisée)

    Tu peux éviter ce "ok" en faisant quitter la fonction (return 0) dès que tu trouves une asymétrie mais certains profs puristes n'aiment pas cette façon de faire (pour ces inquisiteurs du C, une fonction doit n'avoir qu'un point de sortie) donc à toi de voir si tu tentes cette solution. Et quand tu auras un peu l'habitude tu remplaceras un test "== 1" par un test "!= 0" (voire même pas de test du tout, laissant l'effet booléen automatique pour toute valeur différente de 0 faire le job)

    Toutefois apprends à aérer ton code, tu y gagneras en lisibilité sans perdre en rapidité (le compilo il s'en bat le steak des espaces). Et apprends aussi à indenter.
    Voici ton code un peu repris dans ce sens
    Code c :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <stdio.h>
    #include <stdlib.h>
    #define maxcol 50
    #define maxlig 50
     
    int sym(int*, int);
    int saisieDim(char*, int);
     
    int main() {
    	int j,i,tab[maxlig][maxcol];
    	int c,l;
    	int *ptab;
     
    	l=saisieDim("ligne", maxlig);
    	c=saisieDim("colonne", maxcol);
     
    	for (i=0, ptab=&tab[0][0]; i<l; i++) {
    		int *pt;
    		for (j=0, pt=ptab+i*maxcol; j < c; j++, pt++) {
    			printf("entre l'element du vecteur [%d] [%d] ",i,j);
    			scanf("%d",pt);
    		}
    	}
    	for (i=0, ptab=&tab[0][0]; i<l; i++) {
    		int *pt;
    		for (j=0, pt=ptab+i*maxcol; j < c; j++, pt++)
    			printf("[%d\t]",*pt);
    		printf("\n");
    	}
    	if (sym((int*)tab, l))
    		printf("Le tableau est symetrique ");
    	else
    		printf("le tableau n'es pas symetrique ");
    	return 0;
    }
     
    int saisieDim(char *info, int d) {
    	int v;
    	do {
    		printf("entrer un nombre de %s :", info);
    		scanf("%d", &v);
    	} while (v < 0 || v > d);
    	return v;
    }
     
    int sym(int *tab, int l) {
    	int i,j;
    	for (i=0; i<l; i++, tab+=maxcol-l) {
    		for (j=i+1, tab+=i+1; j<l; j++, tab++) {
    			if (*(tab) != *(tab+(maxcol * (j-i))-j+i))
    				return 0;
    		}
    	}
    	return 1;
    }
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  10. #10
    Futur Membre du Club
    Merci beaucoup tous vous m’avais ete d’une grande aide &#128591;&#127995;

###raw>template_hook.ano_emploi###