IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C Discussion :

Inverser elements dans un tableau


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 30
    Par défaut Inverser elements dans un tableau
    Bonjour à tous !
    Je suis confronté à un problème pour inverser l'ordre des éléments d'un tableaux à deux dimensions; notamment pour inverser les lignes. En réalité, j'arrive à inverser l'ordre des éléments de la première ligne et non des suivantes ..

    PS: l'encodage et l'affichage se fait par pointeur, l'inversion n'étant par pointeur car c'est pour me faciliter la tâche, je mettrai l'inversion avec des pointeurs lorsque la version par indice fonctionnera !
    Voici mon code source:

    Et en prime, voilà un screenshot lorsque j'encode et je veux inverser
    [IMG=http://img521.imageshack.us/img521/3608/tabdeux.png][/IMG]
    Uploaded with ImageShack.us

    Merci de prendre mon problème en considération
    Cracko'
    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
     
    #include <stdio.h>
    #define VMAX 10
    void main()
    {
    	int tab[VMAX][VMAX],i,j,nbl,nbc,*pt,temp,etat,k;
    	do
    	{
    		printf("Saisir le meme nbres de lignes et de colonnes");
    		fflush(stdin);
    		scanf("%d",&nbl);
    	}while(nbl<0||nbl>10);
    	nbc=nbl;
    	//encodage tableau
    	printf("\nEncodage du tableau\n");
    	pt=&tab[0][0];
    	for(i=0;i<nbl;i++)
    	{
    		for(j=0;j<nbc;j++)
    		{
    			printf("[%d][%d]",i,j);
    			fflush(stdin);
    			scanf("%d",pt);
    			pt++;
    		}
    	}
    	//Affichage du tableau
    	printf("Affichage du tableau");
    	pt=&tab[0][0];
    	for(i=0;i<nbl;i++)
    	{
    		for(j=0;j<nbc;j++)
    		{
    			printf("\n[%d][%d]:%d",i,j,*pt);
    			pt++;
    		}
    	}
                  //boucle qui inverse l'ordre des lignes du tableau, c'est ici que ça coince
    		for(i=0;i<nbl-1;i++)
    		{
    			for(j=0,k=nbc-1;j<k;j++,k--)
    			{
    				temp=tab[i][j];
    				tab[i][j]=tab[i][k];
    				tab[i][k]=temp;
    			}
    		}
    		printf("\nAffichage\n");
    		//Affichage du tableau inverse
    		pt=&tab[0][0];
    		for(i=0;i<nbl;i++)
    			{
    				for(j=0;j<nbc;j++)
    				{
    					printf("\n[%d][%d]:%d",i,j,*pt);
    					pt++;
    				}
    			}
    		fflush(stdin);
    		getchar();
     
     
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* boucle qui inverse l'ordre des lignes 
    du tableau, c'est ici que ça coince */
      for(i=0;i<nbl-1;i++)
        ..
    Pourquoi nbl-1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0; i < nbl; ++i) {...}
    suffirait.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 30
    Par défaut
    Bonjour, merci pour la réponse rapide !

    J'ai enlevé le
    nbc-1 et nbl-1
    et dès lors j'ai :



    J'obtiens en faisant :
    1
    2
    3
    4
    le résultat suivant:
    3
    2
    1
    4
    Au lieu d'obtenir ce le résultat ci-dessus, je ne devrais pas plutôt obtenir ?:
    4
    3
    2
    1

    Merci

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Il fallait enlever le premier -1, mais garder le second...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* boucle qui inverse l'ordre des lignes 
           du tableau, c'est ici que ça coince */
        for (i = 0; i < nbl; i++) {
            for (j = 0, k = nbc - 1; j < k; j++, k--) {
                temp = tab[i][j];
                tab[i][j] = tab[i][k];
                tab[i][k] = temp;
            }
        }
    En effet, on veut travailler sur toutes les lignes, donc de 0 à N-1 d'où for(i = 0; i < nbl; i++).

    Pour les colonnes, on veut inverser le première (0) avec le dernière (N-1), donc il faut écrire :
    for(j = 0; k = nbc-1; ...)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 30
    Par défaut
    J'ai fait comme exactement comme vous m'aviez dit et la dernière ligne ne s'inverse pas :s

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Crackozor Voir le message
    J'ai fait comme exactement comme vous m'aviez dit et la dernière ligne ne s'inverse pas :s
    Pouvez vous poster le nouveau code ?
    Merci

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 30
    Par défaut
    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
     
    #include <stdio.h>
    #define VMAX 10
    void main()
    {
    	int tab[VMAX][VMAX],i,j,nbl,nbc,temp,*pt,k,;
    	do
    	{
    		printf("Saisir le meme nbres de lignes et de colonnes");
    		fflush(stdin);
    		scanf("%d",&nbl);
    	}while(nbl<0||nbl>10);
    	nbc=nbl;
    	//encodage tableau
    	printf("\nEncodage du tableau\n");
    	pt=&tab[0][0];
    	for(i=0;i<nbl;i++)
    	{
    		for(j=0;j<nbc;j++)
    		{
    			printf("[%d][%d]",i,j);
    			fflush(stdin);
    			scanf("%d",pt);
    			pt++;
    		}
    	}
    	//Affichage du tableau
    	printf("Affichage du tableau");
    	pt=&tab[0][0];
    	for(i=0;i<nbl;i++)
    	{
    		for(j=0;j<nbc;j++)
    		{
    			printf("\n[%d][%d]:%d",i,j,*pt);
    			pt++;
    		}
    	}
    		for(i=0;i<nbl;i++)
    		{
    			for(j=0,k=nbc-1;j<k;j++,k--)
    			{
    				temp=tab[i][j];
    				tab[i][j]=tab[i][k];
    				tab[i][k]=temp;
    			}
    		}
    		printf("\nAffichage\n");
    		//Affichage du tableau
    		pt=&tab[0][0];
    		for(i=0;i<nbl;i++)
    			{
    				for(j=0;j<nbc;j++)
    				{
    					printf("\n[%d][%d]:%d",i,j,*pt);
    					pt++;
    				}
    			}
    		fflush(stdin);
    		getchar();
     
     
    }

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Je vois d'où vient le problème : vous utilisez un pointeur qui ne pointe pas sur ce que vous pensez.

    Vous écrivez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    pt=&tab[0][0];
    for(i=0;i<nbl;i++)
    {
        for(j=0;j<nbc;j++)
        {
            printf("\n[%d][%d]:%d",i,j,*pt);
            pt++;
        }
    }
    à i=0, j=0 pt pointe sur tab[0][0]
    à i=0, j=1 pt pointe sur tab[0][1]
    à i=1, j=0 pt pointe sur tab[0][2]
    à i=1, j=1 pt pointe sur tab[0][3]

    En fait, au mieux, votre tableau tab[10][10] sera vu en mémoire comme un tableau de cent éléments qui se suivent.
    Au pire, il peut y avoir un espace entre les lignes pour des raisons de padding : quand pt pointe sur la fin d'une ligne, on ne sait pas a priori ou va pointer pt+1.

    Solution : quand on utilise des pointeurs, bien faire attention à leur valeur initiale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	
    for(i=0;i<nbl;i++)
    {
        pt = tab[i]; /* ou pt = &tab[i][0], c'est équivalent */
        for(j=0;j<nbc;j++)
        {
            printf("\n[%d][%d]:%d",i,j,*pt);
            pt++;
        }
    }

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 30
    Par défaut
    Merci grandement pour votre aide Mabu !
    Je pense que mon problème est résolu car maintenant j'obtiens
    2
    1
    4
    3

    Je poste le code complet pour ceux qui voudraient profiter de cette solution.
    Juste une dernière question, pour savoir si j'ai bien compris, si j'avais initialisé mon pointeur pt sur le début du tableau, en l'initialisant au dessus de ma première boucle, donc tab[0][0]. Le pointeur aurait pointé sur chaque colonne et non sur une nouvelle ligne ? Dans la mémoire d'un ordinateur, je sais qu'un tableau est représenté comme une suite de vecteurs contigus, alors pourquoi est-ce qu'il faut indiquer sur la ligne sur laquelle on se trouve ? Car on sera toujours sur la même ligne non ? on ne changera que de colonnes?
    J'espère me faire comprendre :s

    Merci encore !

    Code qui fonctionne:
    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
     
    #include <stdio.h>
    #define VMAX 10
    void main()
    {
    	int tab[VMAX][VMAX],i,j,nbl,nbc,*pt,temp,k;
    	do
    	{
    		printf("Saisir le meme nbres de lignes et de colonnes");
    		fflush(stdin);
    		scanf("%d",&nbl);
    	}while(nbl<0||nbl>10);
    	nbc=nbl;
    	//encodage tableau
    	printf("\nEncodage du tableau\n");
    	for(i=0;i<nbl;i++)
    	{
    		pt=&tab[i][0];
    		for(j=0;j<nbc;j++)
    		{
    			printf("[%d][%d]",i,j);
    			fflush(stdin);
    			scanf("%d",pt);
    			pt++;
    		}
    	}
    	//Affichage du tableau
    	printf("Affichage du tableau");
    	for(i=0;i<nbl;i++)
    	{
    		pt=&tab[i][0];
    		for(j=0;j<nbc;j++)
    		{
    			printf("\n[%d][%d]:%d",i,j,*pt);
    			pt++;
    		}
    	}
    		for(i=0;i<nbl;i++)
    		{
    			for(j=0,k=nbc-1;j<k;j++,k--)
    			{
    				temp=tab[i][j];
    				tab[i][j]=tab[i][k];
    				tab[i][k]=temp;
    			}
    		}
    		printf("\nAffichage\n");
    		//Affichage du tableau
    		for(i=0;i<nbl;i++)
    			{
    				pt=&tab[i][0];
    				for(j=0;j<nbc;j++)
    				{
    					printf("\n[%d][%d]:%d",i,j,*pt);
    					pt++;
    				}
    			}
    		fflush(stdin);
    		getchar();
     
     
    }

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Crackozor Voir le message
    Juste une dernière question, pour savoir si j'ai bien compris, si j'avais initialisé mon pointeur pt sur le début du tableau, en l'initialisant au dessus de ma première boucle, donc tab[0][0]. Le pointeur aurait pointé sur chaque colonne et non sur une nouvelle ligne ? Dans la mémoire d'un ordinateur, je sais qu'un tableau est représenté comme une suite de vecteurs contigus, alors pourquoi est-ce qu'il faut indiquer sur la ligne sur laquelle on se trouve ? Car on sera toujours sur la même ligne non ? on ne changera que de colonnes?
    J'espère me faire comprendre :s
    Alors, c'est un sujet délicat... Pour commencer je te conseille la lecture de : http://emmanuel-delahaye.developpez....age=Page5#LXXI

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 30
    Par défaut
    D'accord merci pour le tuyau, je vais à lire tout cette documentation ! merci encore a bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/11/2009, 15h49
  2. Réponses: 2
    Dernier message: 05/02/2007, 16h16
  3. Comment faire afficher la position d'un element dans un tableau
    Par IDE dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 04/11/2006, 12h44
  4. [VB6] Nombre d'element dans un tableau ?
    Par belfaigore dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 20/09/2006, 22h23
  5. [langage] Compter des éléments dans un tableau
    Par helene22500 dans le forum Langage
    Réponses: 29
    Dernier message: 23/05/2005, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo