Pb en c urgenttttttttttttttttt

Signaler
Messages postés
16
Date d'inscription
samedi 5 février 2005
Statut
Membre
Dernière intervention
9 février 2005
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
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

Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
16
salut,

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

ShareVB
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
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