Je m'arrache les cheveu avec mes tableau [Résolu]

Signaler
Messages postés
2
Date d'inscription
samedi 20 novembre 2004
Statut
Membre
Dernière intervention
25 novembre 2004
-
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
-
bonjour
je dois faire un exo qui est la fusion de 2 tableau triés dans un troisieme tableau.
Je sais qu'il y a sur le net plein de solution mais ce que j'aimerai c'est savoir pourquoi mon code ne marche pas alors qu'il semble bien tourner "a la main". J'ai une boucle inifini lors de l'execution machine a l'action fusion
merci de m'aider

voici le code

#include

const int TAILLEMAX = 1000;
typedef struct STtab{
int taille;
int tab[TAILLEMAX];
};

void init(STtab &t1,STtab &t2)
{


t1.tab[0]=4;
t1.tab[1]=5;
t1.tab[2]=6;
t1.tab[3]=9;
t1.tab[4]=12;
t1.tab[5]=14;
t1.tab[6]=15;

t2.tab[0]=0;
t2.tab[1]=1;
t2.tab[2]=2;
t2.tab[3]=3;
t2.tab[4]=7;
t2.tab[5]=8;
t2.tab[6]=10;
t2.tab[7]=11;
t2.tab[8]=13;
}

void affichage(STtab t)
{
int i;
for(i=0;i<t.taille;i++)
cout<<"case "<<i<<" : "<<t.tab[i]<<endl;

cout<<endl;

}
void fusion(STtab t1,STtab t2,STtab &t3)
{
int i=1,k=0,j=0;
int tab,temp;




if(t1.tab[0]<t2.tab[0])
{
tab = 1;
k = 1;
t3.tab[0] = t1.tab[0];
temp = t2.tab[0];
}
else {
tab = 2;
j = 1;
t3.tab[0] = t2.tab[0];
temp = t1.tab[0];
}

while(i<t3.taille-1)
{
switch(tab){
case 1 :
while((k<t1.taille)&&(t1.tab[k]<temp))
{
t3.tab[i] = t1.tab[k];
i++;
k++;
}

tab = 2;
temp = t1.tab[k];



break;
case 2 :
while((j<t2.taille)&&(t2.tab[j]<temp))
{
t3.tab[i] = t2.tab[j];
j++;
i++;
}
tab = 1;
temp = t2.tab[j];


break;
default : cout<<"pas possible"<<endl;
}
}
}
int main()
{
STtab t1,t2,t3;

t1.taille = 7;
t2.taille = 9;
t3.taille = t1.taille + t2.taille;


init(t1,t2);
affichage(t1);
affichage(t2);

cout<<t3.taille<<endl;
fusion(t1,t2,t3);
affichage(t3);
}

10 réponses

Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
je n'ai compris toutes les phases du code, seulement je crois comprendre que tu insères les nombres dans le troisième tableau en les comparant. Ce ne serai pas plus simple de fusionner directement tes tableaux avec un truc du genre :

void Fusion(STtab t1, STtab t2, STtab t3)
{
for(i=0;i<t1;i++)
t3.tab[i] = t1.tab[i];
for(i=t1.taille+1;i<t2;i++)
t3.tab[i] = t1.tab[i];
}

Et ensuite faire un petit algorythme de trie qui va trier le tableau 3 :

void Tri(STtab t3)
{
int Tmp = 0;
for(int i=0;i<t3.taille;i++)
{
for(int j=0;j<(t3.taille-1);j++)
{
if(t3.tab[j]>=t3.tab[j+1])
{
Tmp = t3.tab[j];
t3.tab[j] = t3.tab[j+1];
t3.tab[j+1] = Tmp;
}
}
}

pour moi c'est beaucoup plus clair et comprehensible.
Messages postés
114
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
5 avril 2012
1
à première vue, il semblerait que tu n'incrémentes pas i aussi souvent qu'il le faut...

à ajouter dans ton code :

...while(i<t3.taille)
{

if (t1.tab[k]>temp || t2.tab[j]>temp)
i++;

switch(tab){
case 1 :...

ça devrait fonctionner (à peu près)

6co
Messages postés
38
Date d'inscription
jeudi 17 juillet 2003
Statut
Membre
Dernière intervention
16 février 2005

regarde un peu du coté de la declaration de fusion et de ton appel ..
void fusion(STtab t1,STtab t2,STtab &t3)
et tu fait
fusion(t1,t2,t3)
alors que ton t3 n'est pas le même
enfin j'ai juste vite vu
essai plutot avec :
fusion(t1,t2,&t3)

Ce sont les tonneaux vides et les hommes pleins qui font le plus de bruit
:big)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
non, fusion(t1,t2,t3) est correcte

STtab &t3, t3 est une reference sur un objet STtab
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
oui c 'est plus claire, mais ca ne tire pas profit du langage, c'est vraiment l'algo détaillé (c'est peut etre le but de l'exercice)

par exemple Fusion se resume à 2 memcpy, en c++ avec la stl le tout se fait en quelquel lignes...
Messages postés
2
Date d'inscription
samedi 20 novembre 2004
Statut
Membre
Dernière intervention
25 novembre 2004

ouai bien sur c'est plus simple
mais c'est plus couteu en operation ...
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
je ne vois pas pourquoi ce serai plus couteu en opération, il est très court, bien qu'il y ait des boucles.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
le code de minet03 est largement plus claire, c'est le plus important (sinon tu seras chauve avant d'avoir fais un prog de + de 500 lignes)

l'optimisation ca vient apres, en tirant profits du langage

en c++

void Fusion ==> std::copy
void Tri ==> std::sort

en c

void Fusion ==> memcpy
void Tri ==> qsort

et surtout en c++ pensez à déclaré vaut variable uniquement quand vous en avez besoin, de maniere à pouvoir l'initialiser de suite
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
3
Je suis content que mon morceau de code soit aprécié. Ce n'est pas souvent dans le quotidien d'un débutant comme moi. Mais comme on dit, y a un début à tout ! Merci
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
c'est vraiment un plus de rester clair et de bien modeliser un probleme en terme de design fonctionnel (je suppose que tu connais pas la poo?)

question d'efficacité et de sécurité (plus facile de répérer un bug ou autre disfonctionnement, plus modulable, reutilisable,...)

fais attention, quand tu passes tes objets en parametre, passe les par reference, surtout ceux la qui sont tres volumineux ( 1000 int ), sinon ils sont copier sur la pile à chaque appel (beaucoup plus lent et tu risques un stackoverflow)