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
{
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]);
}
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
17/03/2009 - 17h29
hindou90
Date d'inscription
novembre 2008
Messages
156
Re : fusion des deux tableaux tries
une balise Code ?
comment je peux le faire
Dernière modification par hindou90 ; 17/03/2009 à 17h33.
17/03/2009 - 17h35
hindou90
Date d'inscription
novembre 2008
Messages
156
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();
}
Dernière modification par hindou90 ; 17/03/2009 à 17h39.
17/03/2009 - 17h58
JPL
Date d'inscription
septembre 2003
Localisation
Banlieue bordelaise
Messages
46 978
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
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).
The only limiting factor of the Linux operating system, is his user. - Linus Torvalds
17/03/2009 - 22h02
Towl
Date d'inscription
janvier 2008
Messages
1 327
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 )
The only limiting factor of the Linux operating system, is his user. - Linus Torvalds
18/03/2009 - 08h27
Philou67
Date d'inscription
janvier 2006
Localisation
Krùmm Elsàss
Âge
47
Messages
17 037
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.