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 :

Fusion de deux tableaux triés en un tableau trié


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut Fusion de deux tableaux triés en un tableau trié
    Bonjour à tous,

    Comme dit dans le titre, à partir de deux tableaux triés distincts, je dois en créer un 3ème qui est la fusion des deux précédents, également trié.

    Voici mon code, pour le tri des deux premiers tableaux ça va, mais c'est plus la fusion qui me pose problème à vrai dire, je pense que mon code n'est pas correct mais je ne vois pas d'autre manière de traiter le problème

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    #include <stdio.h>
    #include <stdlib.h>
     
    int lecture1 (int tab1[])
    {
        int nb;
        int tabtemp1;
        nb=0;
     
        do
        {
             printf("nombre:" );
             scanf("%d",&tabtemp1);
             nb++;
             tab1[nb]=tabtemp1;
        }
        while (tabtemp1!=-1);
        return nb;
    }
     
    int lecture2 (int tab2[])
    {
        int nb2;
        int tabtemp2;
        nb2=0;
     
        do
        {
             printf("nombre:" );
             scanf("%d",&tabtemp2);
             nb2++;
             tab2[nb2]=tabtemp2;
        }
        while (tabtemp2!=-1);
        return nb2;
    }
     
    void tri1 (int tab1[],int nb1)
    {
         int i,j,temp;
     
         for(i=0;i<(nb1-1);i++)
         {
                             for(j=i+1;j<nb1;j++)
                             {
                                               if(tab1[j]<tab1[i])
                                               {
                                                               temp=tab1[i];
                                                               tab1[i]=tab1[j];
                                                               tab1[j]=temp;
                                               }
                             }
         }
    }
     
    void tri2 (int tab2[],int nb2)
    {
         int k,l,temp;
     
         for(k=0;k<(nb2-1);k++)
         {
                             for(l=k+1;l<nb2;l++)
                             {
                                               if(tab2[l]<tab2[k])
                                               {
                                                               temp=tab2[k];
                                                               tab2[k]=tab2[l];
                                                               tab2[l]=temp;
                                               }
                             }
         }
    }
     
    int fusion(int tabf[],int tab1[],int tab2[],int nb1, int nb2)
    {
        for (f=0;f<=nb1;f++)
        {
            if (tab1[f]<tab2[f])
            {
                                tabf[f]=tab1[f];
                                tabf[f+1]=tab2[f];
            }
            else if (tab2[f]<tab1[f])
            {
                 tabf[f]=tab2[f];
                 tabf[f+1]=tab1[f];
            }
        }
        return f;
    }
     
    void affiche(int tab[],int f)
    {
         int i,j;
        printf("le vecteur trie est:\n\n");
        for(i=0;i<=f-1;i++)
        {
                          printf(" %d ",tab[i]);
        }
    }
     
    int main()
    {
        int nb1,nb2,tab1[50],tab2[50],tabf[100],f;
     
        nb1=lecture1(tab1);
        nb2=lecture2(tab2);
        f=fusion(tabf,tab1,tab2,nb1,nb2);
        affiche(tabf,f);
        system("pause");
    }
    Merci!

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    - La fonction lecture1() et la fonction lecture2() sont identiques -> une seule fonction lecture() suffit

    - La fonction tri1() et la fonction tri2() sont identiques -> une seule fonction tri() suffit

    -Fusion :

    Si on n'est pas arrivé à la fin du tableau tab1, il faut copier le prochain élément de tab1 si
    - il n'y a plus d'éléments à copier dans l'autre tableau,
    - OU le prochain élément à copier de l'autre tableau est plus grand
    Le raisonnement est identique pour les éléments du tableau tab2.

    On peut donc procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1- n1 compte le nombre d'éléments de tab1 écrits dans tabf. Initialisé à 0
    2- n2 compte le nombre d'éléments de tab2 écrits dans tabf. Initialisé à 0
    2- nf compte le nombre d'éléments écrits dans tabf. Initialisé à 0
    3-Faire :
              3.1- tant que n1< nb1 ET ( n2>= nb2 OU tab1[n1]<= tab2[n2]) copier tab1[n1] dans le tableau tabf; incrémenter n1 et nf
              3.2- tant que n2< nb2 ET ( n1>= nb1 OU tab2[n2]<= tab1[n1]) copier tab2[n2] dans le tableau tabf; incrémenter n2 et nf
      Tant que n1<nb1 OU n2 <nb2

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Merci beaucoup pour ton aide!

    Mon programme fonctionne maintenant parfaitement. J'ai un petit soucis avec un autre exercice je vais poser ma question ici pour ne pas créer un sujet inutilement.

    Je dois séparer deux tableaux (l'un avec les nombres pair et l'autre les impairs)
    J'ai utilisé des pointeurs pour les indices pairs et impairs (ip et iimp) mais mon programme plante après la fonction lecture

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int lecture (int tab[])
    {
        int nb=0;
        int tabtemp;
     
        do
        {
            printf("Entrez un nombre");
            scanf("%d",&tabtemp);
            nb++;
            tab[nb]=tabtemp;
        }
        while (tabtemp!=-1);
        return nb;
    }
     
    void pairimpair (int tab[],int tabpair[],int tabimpair[],int nb,int *ip,int *iimp)
    {
         int i,temp;
         i=0;
         ip=0;
         iimp=0;
         temp=0;
         for (i=0;i<=nb;i++)
         {
             temp=tab[i];
             if (temp%2==0)
             {
                           tabpair[*ip]=temp;
                           (*ip)++;
             }
             else
             {
                 tabimpair[*iimp]=temp;
                 (*iimp)++;
             }
         }
         ip=ip-1;
         iimp=iimp-1;
    }
     
    void affiche(int tab[],int tabpair[],int tabimpair[],int nb, int ip, int iimp)
    {
         int i;
         i=0;
         for(i=0;i<=ip;i++)
         {
                           printf("%d",tabpair[i]);
         }
         printf("\n\n\n");
         for(i=0;i<=iimp;i++)
         {
                             printf("%d",tabimpair[i]);
         }
         printf("\n\n\n");
    }
     
     
    int main()
    {
        int nb,tab[50],tabpair[50],tabimpair[50],ip,iimp;
     
        nb=lecture(tab);
        pairimpair(tab,tabpair,tabimpair,nb,&ip,&iimp);
        affiche(tab,tabpair,tabimpair,nb,ip,iimp);
        system("pause");
    }
    Il ne doit pas y avoir grand chose à corriger, je pensais à un problème d'initialisation des variables mais ça n'a pas l'air d'être ça

    Merci!

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void pairimpair (int tab[],int tabpair[],int tabimpair[],int nb,int *ip,int *iimp)
    {
    ...
         for (i=0;i<nb;i++)
    ...
         ip=ip-1;       // ces deux lignes ne servent à rien
         iimp=iimp-1;   // ....
    }
    - Erreur sur les bornes du for. Il faut choisir une bonne fois si on envoie le nombre d'éléments du tableau (c'est la solution la plus utilisée parce que la plus naturelle) ou la valeur maximum de l'indice.
    Si je ne me trompe pas, lecture() renvoie le nombre d'éléments.

    - Les deux lignes ne servent à rien parce qu'elles modifient les variables locales ip et iimp qui de toute façon seront détruites à la sortie de la fonction.
    Ce code et celui dans affiche() suggèrent que ip et iimp devrait être l'indice maximum, idée incohérente avec ce qui se passe avec lecture().
    Conseil : supprimer les deux lignes et modifier les bornes des for dans affiche()

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Pour les deux lignes qui ne servent à rien je comprends mais pour les bornes des for dans la fonction affiche je vois pas trop.

    Avec une boucle while ça pourrait fonctionner?

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void affiche(int tab[],int tabpair[],int tabimpair[],int nb, int ip, int iimp)
    {
    ...
         for(i=0;i<=ip;i++)
    ...
         for(i=0;i<=iimp;i++)
    ...
    }
    Le <= implique que le nombre d'éléments des tableaux soit ip+1 et iimp+1( ou plus). Si le nombre d'éléments est ip et iimp on doit avoir <, pas <=

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Oui mais même si je fais comme ceci:

    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
    void affiche(int tab[],int tabpair[],int tabimpair[],int nb, int ip, int iimp)
    {
         int i;
         i=0;
         for(i=0;i<ip;i++)
         {
                           printf("%d",tabpair[i]);
         }
         printf("\n\n\n");
         for(i=0;i<iimp;i++)
         {
                             printf("%d",tabimpair[i]);
         }
         printf("\n\n\n");
    }
    Mon prog plante quand même juste après avoir entré -1 pour quitter la fonction lecture. Désolé c'est sûrement "bête" mais j'avoue que j'ai un peu de mal là^^

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void pairimpair (int tab[],int tabpair[],int tabimpair[],int nb,int *ip,int *iimp)
    {
         int i,temp;
         i=0;
         *ip=0;
         *iimp=0;
         temp=0;

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Mouais effectivement c'était très bête...

    En tout cas merci beaucoup pour ton aide!

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

Discussions similaires

  1. fusion de deux tableaux en un autre tableau
    Par Naswd_94 dans le forum Débuter
    Réponses: 5
    Dernier message: 09/12/2014, 09h20
  2. Fusion de deux tableaux triés
    Par krolis dans le forum Langage
    Réponses: 17
    Dernier message: 15/03/2011, 11h37
  3. Réponses: 4
    Dernier message: 19/03/2008, 19h49
  4. Fusion de deux tableaux
    Par valefor dans le forum VHDL
    Réponses: 0
    Dernier message: 06/10/2007, 15h59

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