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 :

Copier deux tableaux dans un même tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Par défaut Copier deux tableaux dans un même tableau
    Bonjour
    J'essais de copier deux tableau dans un même tableau, j'ai fait une allocation de mémoire pour les trois tableaux
    Voici mon code source
    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
    int main(int argc, char *argv[])
    {
        int N = 0, M = 0, i = 0, j = 0;
        int *tableau_A = NULL, *tableau_B = NULL, *tableau_C = NULL, taille = 0;
        tableau_A = malloc(N*sizeof(int));
        tableau_B = malloc(M*sizeof(int));
        tableau_A[N] = 0, tableau_B[M] = 0;
        printf("Entrez la dimension du tableau A : ");
        scanf("%d", &N);
        printf("Entrez la dimension du tableau B : ");
        scanf("%d", &M);
        taille = N+M;
        tableau_C = malloc(taille*sizeof(int));
        tableau_C[taille] = 0;
        for(i = 0; i < N; i++)
        {
            printf("Entrez les valeurs du tableau A : ");
            scanf("%d", &tableau_A[i]);
        }
        for(i = 0; i < N; i++)
        {
            printf("\n%d\n", tableau_A[i]); // Vérification des valeurs entrées dans B
     
        }
        for(i = 0; i < M; i++)
        {
            printf("Entrez les valeurs du tableau B : ");
            scanf("%d", &tableau_B[i]);
        }
        for(i = 0; i < M; i++)
        {
            printf("\n%d\n", tableau_B[i]); // Vérification des valeurs entrées dans B
        }
        for(i = 0; i < taille; i++)
        {
            if(i < N)
            tableau_C[i] = tableau_A[i];
            else if(i >= N && i < taille)
            {
            tableau_C[j] = tableau_B[i];
            j++;
            }
        }
        printf("Les valeurs du tableau C sont :\n");
        for(i = 0; i < taille; i++)
        {
            printf("%d\n", tableau_C[i]);
        }
        free(tableau_A);
        free(tableau_B);
        free(tableau_C);
     
        return 0;
     
    }
    A La fin l'orsqu'il devrait afficher les valeurs du tableau C, Il m'affiche d'autres valeurs différentes de celles tapez au clavier, des valeurs qui me semblent être les adresses des valeurs de tableau A et tableau B.
    Merci d'avance.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Bonjour,

    Cette ligne n'est pas bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau_C[j] = tableau_B[i];
    lire la position "i" de "tableau_B" n'a pas de sens (il faut lire ce tableau de "0" à sa taille - 1), pareil pour le "j" es-tu sûr qu'il est utile ou qu'il faut réécrire dans ton tableau résultat en repartant de la position "0" (et donc en écrasant ce que tu as déjà mis?

    Déjà comme ça, ça devrait mieux marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau_C[i] = tableau_B[i-N];

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Par défaut
    Citation Envoyé par pythéas Voir le message
    Bonjour,

    Cette ligne n'est pas bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau_C[j] = tableau_B[i];
    lire la position "i" de "tableau_B" n'a pas de sens (il faut lire ce tableau de "0" à sa taille - 1), pareil pour le "j" es-tu sûr qu'il est utile ou qu'il faut réécrire dans ton tableau résultat en repartant de la position "0" (et donc en écrasant ce que tu as déjà mis?

    Déjà comme ça, ça devrait mieux marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau_C[i] = tableau_B[i-N];
    Je vois maintenant d'ou vient mon erreur
    En utilisant le "j" dans mon code, On a ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tableau_C[i] = tableau_B[j];
    j++;
    qui resout aussi le probléme
    Merci

  4. #4
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut
    Il y a plusieurs soucis dans ton code.

    En premier lieu, tu tentes d'allouer la mémoire nécessaire à tes tableaux avant d'avoir obtenu la dimension de ces tableaux !

    Puis tu essaies de mettre à zéro le contenu d'une case située après la mémoire allouée !

    Il y a aussi un test inutile sur i dans la boucle de copie (mais je l'ai laissé parce qu'il ne pose pas de problème), ainsi qu'une inversion de i et j aboutissant à une recopie incorrecte de B dans C (ainsi que l'a signalé Pytheas pendant que j'écrivais ma réponse).

    Voici ton code très légèrement corrigé et qui fonctionne tel quel :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main()
    {
      int N = 0, M = 0, i = 0, j = 0;
      int *tableau_A = NULL, *tableau_B = NULL, *tableau_C = NULL, taille = 0;
     
      printf("Entrez la dimension du tableau A : ");
      scanf("%d", &N);
     
      printf("Entrez la dimension du tableau B : ");
      scanf("%d", &M);
     
      tableau_A = malloc(N*sizeof(int));
      tableau_B = malloc(M*sizeof(int));
     
      taille = N+M;
      tableau_C = malloc(taille*sizeof(int));
     
      for(i = 0; i < N; i++)
        {
          printf("Entrez les valeurs du tableau A : ");
          scanf("%d", &tableau_A[i]);
        }
     
      for(i = 0; i < N; i++)
        {
          printf("\n%d\n", tableau_A[i]); // Vérification des valeurs entrées dans B
     
        }
     
      for(i = 0; i < M; i++)
        {
          printf("Entrez les valeurs du tableau B : ");
          scanf("%d", &tableau_B[i]);
        }
     
      for(i = 0; i < M; i++)
        {
          printf("\n%d\n", tableau_B[i]); // Vérification des valeurs entrées dans B
        }
     
      for(i = 0, j = 0; i < taille; i++)
        {
          if(i < N)
            tableau_C[i] = tableau_A[i];
          else if(i >= N && i < taille) // test inutile
            {
              tableau_C[i] = tableau_B[j];
              j++;
            }
        }
     
      printf("Les valeurs du tableau C sont :\n");
      for(i = 0; i < taille; i++)
        {
          printf("%d\n", tableau_C[i]);
        }
     
      free(tableau_A);
      free(tableau_B);
      free(tableau_C);
     
      return 0;
    }

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Par défaut
    Citation Envoyé par Ngork Voir le message
    Il y a plusieurs soucis dans ton code.

    En premier lieu, tu tentes d'allouer la mémoire nécessaire à tes tableaux avant d'avoir obtenu la dimension de ces tableaux !

    Puis tu essaies de mettre à zéro le contenu d'une case située après la mémoire allouée !

    Il y a aussi un test inutile sur i dans la boucle de copie (mais je l'ai laissé parce qu'il ne pose pas de problème), ainsi qu'une inversion de i et j aboutissant à une recopie incorrecte de B dans C (ainsi que l'a signalé Pytheas pendant que j'écrivais ma réponse).

    Voici ton code très légèrement corrigé et qui fonctionne tel quel :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main()
    {
      int N = 0, M = 0, i = 0, j = 0;
      int *tableau_A = NULL, *tableau_B = NULL, *tableau_C = NULL, taille = 0;
     
      printf("Entrez la dimension du tableau A : ");
      scanf("%d", &N);
     
      printf("Entrez la dimension du tableau B : ");
      scanf("%d", &M);
     
      tableau_A = malloc(N*sizeof(int));
      tableau_B = malloc(M*sizeof(int));
     
      taille = N+M;
      tableau_C = malloc(taille*sizeof(int));
     
      for(i = 0; i < N; i++)
        {
          printf("Entrez les valeurs du tableau A : ");
          scanf("%d", &tableau_A[i]);
        }
     
      for(i = 0; i < N; i++)
        {
          printf("\n%d\n", tableau_A[i]); // Vérification des valeurs entrées dans B
     
        }
     
      for(i = 0; i < M; i++)
        {
          printf("Entrez les valeurs du tableau B : ");
          scanf("%d", &tableau_B[i]);
        }
     
      for(i = 0; i < M; i++)
        {
          printf("\n%d\n", tableau_B[i]); // Vérification des valeurs entrées dans B
        }
     
      for(i = 0, j = 0; i < taille; i++)
        {
          if(i < N)
            tableau_C[i] = tableau_A[i];
          else if(i >= N && i < taille) // test inutile
            {
              tableau_C[i] = tableau_B[j];
              j++;
            }
        }
     
      printf("Les valeurs du tableau C sont :\n");
      for(i = 0; i < taille; i++)
        {
          printf("%d\n", tableau_C[i]);
        }
     
      free(tableau_A);
      free(tableau_B);
      free(tableau_C);
     
      return 0;
    }
    Merci, mais pourquoi avoir inclut string.h ?

  6. #6
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut
    Citation Envoyé par BStylene Voir le message
    Merci, mais pourquoi avoir inclut string.h ?
    C'est juste que tu n'avais pas mis les include dans ton code, alors j'ai mis mon en-tête minimale habituelle pour compiler, mais tu as raison, le string.h n'est pas nécessaire dans ce code.

    Si les corrections qui te sont proposées te conviennent, c'est sympa de mettre un +1, et si cela résoud ton problème, n'oublie pas de marquer le sujet comme résolu !

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

Discussions similaires

  1. [XL-2010] Imbricaion de deux tableaux dans un même classeur
    Par sect83 dans le forum Excel
    Réponses: 0
    Dernier message: 17/07/2013, 16h52
  2. Réponses: 0
    Dernier message: 15/11/2012, 19h47
  3. itération sur deux tableaux dans la même boucle
    Par romson2 dans le forum Struts 2
    Réponses: 0
    Dernier message: 06/06/2012, 09h06
  4. [XL-2007] lier deux tableaux dans la même feuille
    Par mobiclick dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/04/2010, 17h49
  5. Differencier deux dates dans un même tableau
    Par sarmerou08 dans le forum Débuter
    Réponses: 3
    Dernier message: 15/01/2010, 15h23

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