Pb en c urgenttttttttttttttttt

cs_natacha86 Messages postés 16 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 9 février 2005 - 5 févr. 2005 à 14:40
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 7 févr. 2005 à 15:08
bonjour, j'ai un probleme avec mon programme,
il ne veut pas sortir, j'ai fais un menu et apparement ya un bug mais je ne comprend rien.
le code est assez long, je vous conseil si vous voulez m'aider de le copier de regarde ce que ca fait (lancer un tri de 1 à 5 et essayer de sortir avec 7 vous verrez ce que ca fait, le 6 marche je ne sais pas pkoi non plus il est comme les autres)
merci d'avance...

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>


#define MAX 1000000


/****************************tri bulle*********************************/


void tri_bulle()
{
int nb,i,j,v,tab[MAX]; /* déclarations */


srand(time(NULL)); /* Initialisation du générateur aléatoire avec la fontion time */
printf("\n\n Nombre de valeurs a trier (du tableau) : ");
scanf("%d", &nb); /* Demande le nombre d'éléments à trier */
printf("\n");


for(i=0;i<nb;i++)
tab[i]=rand();


printf("Les valeurs avant le tri : ");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);


for (i=0; i<nb; i++)
for (j=nb-1; j>i; j--)
if (tab[j-1]>tab[j])
{
v=tab[j-1];
tab[j-1]=tab[j];
tab[j]=v;
}
printf("\n\nLes valeurs apres le tri :");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);
system("PAUSE");
main();
}


/****************************tri par insertion ****************************/


void tri_ins()
{
int nb,i,j,v,tab[MAX]; /* déclarations */


srand(time(NULL)); /* Initialisation du générateur aléatoire avec la fontion time */
printf("\n\n Nombre de valeurs a trier (du tableau) : ");
scanf("%d", &nb); /* Demande le nombre d'éléments à trier */
printf("\n");


for(i=0;i<nb;i++)
tab[i]=rand();


printf("Les valeurs avant le tri : ");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);


for (i=0; i<nb; i++)
{
v=tab[i];
j=i;
while (tab[j-1]>v)
{
tab[j]=tab[j-1];
j--;
}
tab[j]=v;
}


printf("\n\nLes valeurs apres le tri :");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);
system("PAUSE");
main();
}


/****************************tri par extraction ****************************/


void tri_ext()
{
int nb,i,j,v,min,tab[MAX]; /* déclarations */


srand(time(NULL)); /* Initialisation du générateur aléatoire avec la fontion time */
printf("\n\n Nombre de valeurs a trier (du tableau) : ");
scanf("%d", &nb); /* Demande le nombre d'éléments à trier */
printf("\n");


for(i=0;i<nb;i++)
tab[i]=rand();


printf("Les valeurs avant le tri : ");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);


for (i=0; i<nb; i++)
{
min=i;
for(j=i;j<nb;j++)
if (tab[j]<tab[min])
min=j;
v=tab[min];
tab[min]=tab[i];
tab[i]=v;
}


printf("\n\nLes valeurs apres le tri :");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);
system("PAUSE");
main();
}


/****************************tri shell ****************************/
void tri_shell ()
{
int i,j,k,l,p,n,nb,tab[MAX];
int b;


srand(time(NULL)); /* Initialisation du générateur aléatoire avec la fontion time */
printf("\n\n Nombre de valeurs a trier (du tableau) : ");
scanf("%d", &nb); /* Demande le nombre d'éléments à trier */
printf("\n");


for(i=0;i<nb;i++)
tab[i]=rand();
n=nb;
printf("Les valeurs avant le tri : ");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);


for ( k=1 ; k<=n/9; k=3*k+1);
for ( ; k>0 ; k /=3)
for ( i=k ; i<n ; i++ )
{
l = tab[i] ;
j = i ;
while (j>k && tab[j-k]>l)
{
tab[j] = tab[j-k] ;
j -= k ;
}
tab[j] = l ;
}



printf("\n\nLes valeurs apres le tri :");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);
system("PAUSE");
main();
}

/****************************tri fusion ****************************/


void interclasse(int tab[], int inf, int mid, int sup)
{
int tab_aux[sup]; /* Tableau auxiliaire */


int i=inf,j=mid+1,k=inf;


/* Fusion dans le tableau auxiliaire */
while(i<=mid && j<=sup)
{
if (tab[i]<tab[j])
tab_aux[k++]=tab[i++];
else
tab_aux[k++]=tab[j++];
}


if (i>mid)
while(j<=sup)
tab_aux[k++]=tab[j++];
else
while(i<=mid)
tab_aux[k++]=tab[i++];


/* Recopie du tableau auxiliaire dans tab */
for(i=inf;i<=sup;i++)
tab[i]=tab_aux[i];





}


void fusion(int T[], int a, int b) {
int i,m;

if (a < b) {
m = (a+b)/2;
fusion(T, a, m); // m tjs < b
fusion(T, m+1, b); // m+1 tjs > a donc pas de bouclage possible


interclasse(T, a, m, b);
}
}


void tri_fusion() {


int i,nb,tab[MAX];



srand(time(NULL)); /* Initialisation du générateur aléatoire avec la fontion time */
printf("\n\n Nombre de valeurs a trier (du tableau) : ");
scanf("%d", &nb); /* Demande le nombre d'éléments à trier */
printf("\n");


for(i=0;i<nb;i++)
tab[i]=rand();


printf("Les valeurs avant le tri : ");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);



fusion(tab, 0, nb-1);


printf("\n\nLes valeurs apres le tri :");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);


system("PAUSE");
main();
}





/************************ tri rapide ****************************/


// réordonne le tableau et rend l'indice de séparation
int permutation(int T[], int a, int b) { int i, j, pivot, bi a, bs b, r, TI[b];

// choix du pivot
pivot = T[a];

for(i=a;i <= b;i++) {
if (T[i] < pivot) { TI[bi] = T[i]; bi++; }
if (T[i] > pivot) { TI[bs] = T[i]; bs--; }
}


/* On place le ou les pivots */


for(i=bi;i<=bs;i++) { TI[i] = pivot; }


/* recopie de TI */


for(i=a;i <= b;i++) {
T[i] = TI[i];
if (T[i] == pivot) { r = i; }
}
return r;
}


void rapide(int T[], int a, int b) {

int separe;


if (a < b) {
separe = permutation(T, a, b);
rapide(T, a, separe-1);
rapide(T, separe+1, b);
}
}


void tri_rapide() {


int i,nb,tab[MAX];



srand(time(NULL)); /* Initialisation du générateur aléatoire avec la fontion time */
printf("\n\n Nombre de valeurs a trier (du tableau) : ");
scanf("%d", &nb); /* Demande le nombre d'éléments à trier */
printf("\n");


for(i=0;i<nb;i++)
tab[i]=rand();


printf("Les valeurs avant le tri : ");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);


rapide(tab, 0, nb-1);


printf("\n\nLes valeurs apres le tri :");
for(i=0; i<nb;i++)
printf("\n%d ",tab[i]);


system("PAUSE");
main();


}



/************************ programme principal ****************************/


int main()
{
/* déclarations */
int choix=0;


printf("\n\n\t\t\t ****************\n");
printf("\t\t\t *MENU PRINCIPAL*\n");
printf("\t\t\t ****************\n\n\n\n");
printf("\t TAPEZ :\n\n\n\n");
printf("\t\t1\t Pour :\t Lancer le prog de tri a bulle\n\n");
printf("\t\t2\t Pour :\t Lancer le prog de tri par insertion\n\n");
printf("\t\t3\t Pour :\t Lancer le prog de tri par ext\n\n");
printf("\t\t4\t Pour :\t Lancer le prog de tri shell\n\n");
printf("\t\t5\t Pour :\t Lancer le prog de tri fusion\n\n");
printf("\t\t6\t Pour :\t Lancer le prog de tri rapide\n\n");
printf("\t\t7\t Pour :\t Quitter le programme\n\n\n");
printf("\t CHOIX : ");
scanf("%d",&choix);


switch(choix)
{
case 1 : tri_bulle();


case 2 : tri_ins();


case 3 : tri_ext();


case 4 : tri_shell();


case 5 : tri_fusion();


case 6 : tri_rapide();


case 7 : break;


}


}

2 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 25
5 févr. 2005 à 16:49
salut,

pour chaque case, il faut finir par un break; , sinon tu executes tous les cases qui suivent celui sélectionné...

ShareVB
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
7 févr. 2005 à 15:08
Et ca t'évitera d'appeler main à la fin de chaque fonction car c'est pas terrible comme méthode....

Parce en fait quand tu fait 7, tu sort bien du main, mais comme il est appelé récursivement, et bah sortir du main sort de la dernière fonction qui l'a appelé, puis continu dans le main précédent à la suite du switch...

en gros si au premier choix tu tape 1 et 7 au 2ème, il va s'exécuter :
- entrée du prog -> main- choix 1> tri_bulle();
- fin de tri_bulle() => tu retourne dans main.
- 2ème main imbriqué- choix 7> tu sort bien du switch et du main mais tu ressort à la fin de tri_bulle.
- à la fin de tri_bulle, tu retombe dans le switch du premier main mais comme il n'y a pas de break, tu continue ce qu'il y a après
0