fusion des deux tableaux tries
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

fusion des deux tableaux tries



  1. #1
    invitee2f3230c

    Talking fusion des deux tableaux tries


    ------

    bonjour les amis
    </couleur>
    voila un exercice que je n'arrive pas à l'executer correctement .
    il s'agit de :
    exercice:
    on dispose e deux tableaux A et B ( de dimension N et M ), triés par ordre croissant .fusionner les éléments de A et B dans un troisieme tableau F trie par ordre croissant.
    Réaliser le rogramme permettant :
    *La saisi de deux tableaux .
    *le tri dans l'ordre croissant des deux tableaux:
    *la fusion des deux tableaux selon la méthodes cité si dessus .
    -comparer a[i]et b[j];
    -remplacer c[k] par le plus petit des deux éléments ; avancer dans tab C et dans le tableau qui a contribué son élément .
    -lorsque l'un des deux tableaux A ou B est epuisé ,il suffit de recopier les éléments restant de l'auter tableau dans le tableau C.
    *afficher les trois tableux .
    voici non essai , le probléme que j'ai rencontré c'est au niveau du fusion de deux tabs ,il se peut que j'ai mal raisonné,mais le 3 tab ne s'affiche pas correctement .
    code source:

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    int a[100];b[100];c[100],j,k,n,i,m,aux,permt,tdec;
    void main ()
    {
    clrscr();
    textbackground(217);

    do
    {
    printf("taper n ");
    scanf("%d",&n);
    }
    while((n<1)||(n>100));
    do
    {
    printf("taper m ");
    scanf("%d",&m);
    }
    while((m<1)||(m>100));
    //remplissage
    for(i=0;i<n;i++)
    {
    printf("taper l'element %d = ",i+1);
    scanf("%d",&a[i]);
    }
    for(j=0;j<m;j++)
    {
    printf("taper l'element %d = ",j+1);
    scanf("%d",&b[j]);
    }
    //trie d'ordre croissante du tab A
    do
    {


    permt=0;
    for(i=0;i<n-1;i++)
    {
    if(a[i]>a[i+1])
    {
    aux=a[i];
    a[i]=a[i+1];
    a[i+1]=aux;
    permt=1;
    }
    }
    }
    while(permt==1);
    //TRI DU tab B
    do
    {
    permt=0;
    for(j=0;j<m-1;j++)
    {
    if(b[j]>b[j+1])
    {
    aux=b[j];
    b[j]=b[j+1];
    b[j+1]=aux;
    permt=1; //permutation
    }
    }
    }
    while(permt==1);
    printf("\n");
    //affichage

    printf("\n table 1 \n ");
    for(i=0;i<n;i++)
    {
    printf("\t %d ",a[i]);
    }

    printf("\n table 2 \n ");
    for(j=0;j<m;j++)
    {
    printf("\t %d ",b[j]);
    }
    //fusion
    k=0;
    i=0;
    j=0;

    do
    {
    if(a[i]<=b[j])// comparaison de deux tableaux
    {
    c[k]=a[i];
    k++;
    i++;
    }
    else
    {
    c[k]=b[j];
    k++;
    j++;
    }
    }
    while((i<n)||(j<m));

    if(i==n-1)// le tab A est epuise
    {
    j--;
    k--;
    do
    {
    j++;
    k++;
    c[k]=b[j]; // recopier le reste du tab b dans le tab de fusion
    }
    while (j<n); // tant que le tab B n'est pas epuise
    }

    if(j==m-1) // le tab B est epuis‚
    {
    i--;
    k--;
    do
    {
    i++;
    k++;
    c[k]=a[i];// recoier le reste du tab b dans le tab de fusion
    }
    while (i<n);// tant que le tab A n'est pas epuis‚
    }
    tdec=k+1; // la taille du tab fusion
    printf("\n tab de fusion \n ");
    //afichge du tab fusion
    for(k=0;k<tdec;k++)
    {
    printf("\t %d ",c[k]);
    }

    getch();
    }

    MERCI de m'aider .

    -----

  2. #2
    JPL
    Responsable des forums

    Re : fusion des deux tableaux tries

    Peux-tu poster à nouveau le code en le mettant dans une balise Code ?
    Cela permettra de garder les indentations et de le rendre plus lisible.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  3. #3
    invitee2f3230c

    Re : fusion des deux tableaux tries

    une balise Code ?
    comment je peux le faire

  4. #4
    invitee2f3230c

    Re : fusion des deux tableaux tries

    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    int a[100];b[100];c[100],j,k,n,i,m,aux,permt,tdec;
    void main ()
    {
    clrscr();
    textbackground(217);
    
    do
    {
    printf("taper n ");
    scanf("%d",&n);
    }
    while((n<1)||(n>100));
    do
    {
    printf("taper m ");
    scanf("%d",&m);
    }
    while((m<1)||(m>100));
    //remplissage
    for(i=0;i<n;i++)
    {
    printf("taper l'element %d = ",i+1);
    scanf("%d",&a[i]);
    }
    for(j=0;j<m;j++)
    {
    printf("taper l'element %d = ",j+1);
    scanf("%d",&b[j]);
    }
    //trie d'ordre croissante du tab A
    do
    {
    
    
    permt=0;
    for(i=0;i<n-1;i++)
    {
    if(a[i]>a[i+1])
    {
    aux=a[i];
    a[i]=a[i+1];
    a[i+1]=aux;
    permt=1;
    }
    }
    }
    while(permt==1);
    //TRI DU tab B
    do
    {
    permt=0;
    for(j=0;j<m-1;j++)
    {
    if(b[j]>b[j+1])
    {
    aux=b[j];
    b[j]=b[j+1];
    b[j+1]=aux;
    permt=1; //permutation
    }
    }
    }
    while(permt==1);
    printf("\n");
    //affichage
    
    printf("\n table 1 \n ");
    for(i=0;i<n;i++)
    {
    printf("\t %d ",a[i]);
    }
    
    printf("\n table 2 \n ");
    for(j=0;j<m;j++)
    {
    printf("\t %d ",b[j]);
    }
    //fusion
    k=0;
    i=0;
    j=0;
    
    do
    {
    if(a[i]<=b[j])// comparaison de deux tableaux
    {
    c[k]=a[i];
    k++;
    i++;
    }
    else
    {
    c[k]=b[j];
    k++;
    j++;
    }
    }
    while((i<n)||(j<m));
    
    if(i==n-1)// le tab A est epuise
    {
    j--;
    k--;
    do
    {
    j++;
    k++;
    c[k]=b[j]; // recopier le reste du tab b dans le tab de fusion
    }
    while (j<n); // tant que le tab B n'est pas epuise
    }
    
    if(j==m-1) // le tab B est epuis‚
    {
    i--;
    k--;
    do
    {
    i++;
    k++;
    c[k]=a[i];// recoier le reste du tab b dans le tab de fusion
    }
    while (i<n);// tant que le tab A n'est pas epuis‚
    }
    tdec=k+1; // la taille du tab fusion
    printf("\n tab de fusion \n ");
    //afichge du tab fusion
    for(k=0;k<tdec;k++)
    {
    printf("\t %d ",c[k]);
    }
    
    getch();
    }

  5. A voir en vidéo sur Futura
  6. #5
    JPL
    Responsable des forums

    Re : fusion des deux tableaux tries

    Normalement tout programme bien écrit (pour la lisibilité) doit être indenté, par exemple pour bien distinguer le début, le corps et la fin des boucles...
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  7. #6
    invite4ad25ccf

    Re : fusion des deux tableaux tries

    Essaye d'utiliser des fonctions, cela rendra le code plus lisible (surtout que tu fais 2 tri, 3 affichages..)

    Pour l'erreur, regarde ce morceau de code
    Code:
    do
    	{
    		if(a[i]<=b[j])// comparaison de deux tableaux
    		{
    			c[k]=a[i];
    			k++;
    			i++;
    		}
    		else
    		{
    			c[k]=b[j];
    			k++;
    			j++;
    		}
    	}
    	while((i<n)||(j<m));
    Prends un tableau qui contient [1, 2] et l'autre [3, 4], et déroule ton algo à la main.
    Tu te rendras vite compte du problème

    Pour le reste, a vue de nez, cela semble OK (pas la meilleure implémentation, mais ce n'est pas forcément le but).

  8. #7
    invite4ad25ccf

    Re : fusion des deux tableaux tries

    Bon comme d'hab, tourner 7 fois le clavier dans sa bouche (et trop tard pour editer)... Cette partie ne semble pas contenir d'erreur :s

    Pour le tri dans le 3eme tableau, un peu trop crevé pour regarder l'erreur en détail, mais déjà je suis moyennement fan des coups de je fais un n++ suivit d'un n-- resuivit d'un n++ (fin de boucle 1, et B vidé). Pleins de petits trucs qui peuvent vite etre source d'erreur (la preuve )

  9. #8
    Philou67

    Re : fusion des deux tableaux tries

    Voila les quelques erreurs que j'ai relevé :
    - la déclaration des variables est incorrecte :
    Code:
    int a[100];b[100];c[100],j,k,n,i,m,aux,permt,tdec;
    Il faut mettre des virgules en lieu est place des points-virgules qui séparent les tableaux (une warning du compilateur aurait du donner l'alarme).
    - le test de fin de la boucle pour remplir C lorsque A est épuisé est incorrect (j<n) :
    Code:
    while (j<n); // tant que le tab B n'est pas epuise
    Il faut mettre j<m
    - le test de fin de boucle de la fusion des tableaux est incorrect :
    Code:
    while((i<n)||(j<m));
    En effet, la boucle s'arrête si les deux conditions i == n ET j == m.
    Or on souhaite qu'elle s'arrête seulement si l'un des tableaux est épuisé, donc si i == n OU j == m, ce qui équivaut à dire qu'elle continue tant que (while) i < n ET j < m
    - les tests d'épuisement sont incorrectement écrits. Lorsqu'un tableau est épuisé, c'est que la condition i < n ou j < m n'est plus respectée.
    Ce qui veut dire, que soit i == n, soit j == m (et non n - 1 ou m - 1).

    De plus, la boucle permettant de remplir le tableau non épuisé est mal écrite, car la condition de fin expire lorsque i (resp. j) est > n (resp. m), ce qui provoque un dépassement de tableau.
    Il convient de l'écrire ainsi :
    Code:
      if(i==n)// le tab A est epuise
        {
          do
    	{
    	  c[k]=b[j]; // recopier le reste du tab b dans le tab de fusion
    	  j++;
    	  k++;
    	}
          while (j<m); // tant que le tab B n'est pas epuise
        }
    La conséquence de cette correction est que la taille du tableau c (tdec) est k et non plus k+1.

    EDIT : J'oubliais l'essentiel : afin de déverminer un programme, rien de tel que d'ajouter des points de contrôle (par exemple, en affichant des données à l'écran pendant l'exécution), ou d'utiliser un débugueur.
    :'( Plus j'apprends, et plus je mesure mon ignorance

Discussions similaires

  1. Isolation des tableaux(entourage) de fenêtres
    Par invite6b21bb37 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 1
    Dernier message: 16/11/2008, 10h18
  2. [Divers] Conformité des Tableaux éléctriques dans le commerces
    Par inviteeed085df dans le forum Dépannage
    Réponses: 1
    Dernier message: 21/03/2008, 17h24
  3. fusion de deux étoiles
    Par inviteebd74612 dans le forum Archives
    Réponses: 10
    Dernier message: 31/07/2006, 18h56
  4. problème de programmation linéaire par la méthode des tableaux réduits
    Par invite9e4aef14 dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 12/04/2005, 04h58
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...