Help une fonction qui a besoin de vous

cs_natacha86 Messages postés 16 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 9 février 2005 - 8 févr. 2005 à 13:28
cs_natacha86 Messages postés 16 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 9 février 2005 - 9 févr. 2005 à 00:31
Re bonjour a tout le monde,
voila j'ai mis tout le prog si vous voulez tester, en fait le pb viens de la fonctino tri_shell(), je ne sais pas pkoi elle plante!!! :'( sinon quand elle fonctionne elle ne trie pas bien mais bon ca je m'arrangerai, depuis que j'ai mis une fonction init et affich, cette fonction tri_shell ne fonctionne plus alors que les autres oui, VA SAVOIR !!! lol
merci si vous avez le courage de m'aider...

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


#define MAX 1000000
#define taille
int tab[taille];



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


int main()
{
/* déclarations */
int choix=0,cont;
cont=1;
while(cont==1){
/* affichage du menu */
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);
/* menu */
switch(choix)
{
case 1 :
init(tab);
tri_bulle(tab);
affich(tab);
break;


case 2 :
init(tab);
tri_ins(tab);
affich(tab);
break;


case 3 :
init(tab);
tri_ext(tab);
affich(tab);
break;


case 4 :
init(tab);
tri_shell(tab);
affich(tab);
break;


case 5 :
init(tab);
tri_fusion(tab);
affich(tab);
break;


case 6 :
init(tab);
tri_rapide(tab);
affich(tab);
break;


default : cont=0; /* sortie du programme*/
}
}
}


/****************************initialisation du tableau******************/
int init(int tab[]) {


int nb,i; /* 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++) /* Remplissage du tableau aléatoirement */
tab[i]=rand()%1000;


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


/****************************affichage du tableau trié******************/
int affich(int tab[]) {


int nb,i; /* déclarations */


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


system("PAUSE");
}


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


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


for (i=0; i<nb; i++) /* tri */
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; }
}



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


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


for (i=0; i<nb; i++){ /* tri */


v=tab[i];
j=i;
while (tab[j-1]>v) {
tab[j]=tab[j-1];
j--;
}
tab[j]=v;
}
}
/****************************tri par extraction ****************************/


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


for (i=0; i<nb; i++){ /* tri */
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;
}
}


/****************************tri shell ****************************/
int tri_shell(int tab[])
{
int i,b,j,k,l,h,v,n,nb; /* déclarations */
n=nb;


for ( k=1 ; k<=n/9; k=3*k+1); /* tri */
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 ;
}
}

/****************************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);}
}


int tri_fusion(int tab[]) {
int nb;
fusion(tab, 0, nb-1); /* apel de la fonction fusion */
}


/************************ 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]; /* déclarations */



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

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


for(i=bi;i<=bs;i++) /* On place le ou les pivots */
TI[i] = pivot;


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


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

int separe; /* déclarations */


if (a < b) {
separe = permutation(T, a, b); /* apel de la fonction permutation */
rapide(T, a, separe-1); /* apel de la fonction rapide */
rapide(T, separe+1, b); }
}


int tri_rapide(int tab[]) {
int nb; /* déclarations */
rapide(tab, 0, nb-1); /* appel de la fonction rapide */
}



/* FIN*/

10 réponses

cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 févr. 2005 à 14:28
Non de dieu !
Quel fouilli :) lol
Ca te fait pas peur ???

Rien qu'un ptit exemple


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


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


for (i=0; i<nb; i++) /* tri */
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; }
}

le programme est censé deviné c'est quoi les valeur nb, i, j et v ???
J'pense que tout le prog est à revoir malheureusement.
Y'a pas que la fonction tri shell qui ne va pas

ensuite, taille n'est pas défini, tu veux accéder à des fonctions que tu déclares apres. ( 2fois que je te le dis ça )

Fin bref, VRAIMENT BONNE CHANCE !


void Aurevoir( void ); //Bonne journée
0
cs_natacha86 Messages postés 16 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 9 février 2005
8 févr. 2005 à 14:49
au lieu d'enfoncer les gens c'est p'etre mieux de les aider !!! je dois rendre ca demain :'(
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 févr. 2005 à 15:00
Je ne t'enfonce pas. J'te conseille de tout reprendre à 0. Si ça c'est pas aidé !
Donc attend un peu, j'vais regarder ce que tu veux faire en gros :)


void Aurevoir( void ); //Bonne journée
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 févr. 2005 à 15:33
Juste une question.
J'essai de refaire ton prog :)
Mais je ne comprend rien ;)
C'est quoi le but ???
Disons la fonction Tri_Bull ???
Elle sert à quoi ???


void Aurevoir( void ); //Bonne journée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_natacha86 Messages postés 16 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 9 février 2005
8 févr. 2005 à 15:41
ca sert a rien d'autre qu'a trier,
c'set pour comparer toutes les sortes de tris, et calculer le temps, faire des graphiques..
j'ai essayer de mettre des commentaires, et de le rendre plus lisibles, je c pas si je peux faire plus ...

tout les tris fonctionne mem avec taille, j'ai mis comme le prof a dis, c'est bizzar, ya que shell qui tri pas bien !

sinon laisse tomber, t'facon je crois que j'v abandonné l'informatique ca me saoule, g deja mon bts c pas mal ;-) lol

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


#define taille
int tab[taille];



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


int main()
{
/* déclarations */
int choix=0,cont;
cont=1;
while(cont==1){
/* affichage du menu */
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);
/* menu */
switch(choix)
{
case 1 :
init(tab);
tri_bulle(tab);
affich(tab);
break;


case 2 :
init(tab);
tri_ins(tab);
affich(tab);
break;


case 3 :
init(tab);
tri_ext(tab);
affich(tab);
break;


case 4 :
init(tab);
tri_shell(tab);
affich(tab);
break;


case 5 :
init(tab);
tri_fusion(tab);
affich(tab);
break;


case 6 :
init(tab);
tri_rapide(tab);
affich(tab);
break;


default : cont=0; /* sortie du programme*/
}
}
}


/****************************initialisation du tableau******************/


int init(int tab[]) {


int nb,i; /* 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++) /* Remplissage du tableau aléatoirement */
tab[i]=rand()%1000;


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





/****************************affichage du tableau trié******************/


int affich(int tab[]) {


int nb,i; /* déclarations */


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


system("PAUSE");
}





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


int tri_bulle(int tab[])
{
int der,i,j,permut; /* Déclarations */


for (i=0; i<der; i++) /* tri */
for (j=der-1; j>i; j--) /* on compare un à un */
if (tab[j-1] > tab[j]) {


permut = tab[j-1]; /* permutation */
tab[j-1] = tab[j];
tab[j] = permut;
}
}



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


int tri_ins(int tab[])
{
int der,i,j,temp; /* Déclarations */
/* tri */
for (i=0; i<der; i++){


temp=tab[i];
j=i;
while (tab[j-1] > temp) { /*on decale les éléments */
tab[j] = tab[j-1];
j--;
}
tab[j]=temp;
}
}



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


int tri_ext(int tab[])
{
int der,i,j,permut,temp; /* déclarations */


for (i=0; i<der; i++){ /* tri */
temp=i;
for(j=i+1;j<der;j++)
if (tab[j]<tab[temp]) /* on compare les élément du tableau */
temp = j;


permut = tab[temp]; /* permutation */
tab[temp] = tab[i];
tab[i] = permut;
}
}





/****************************tri shell **********************************/


int tri_shell(int tab[])
{
int i,j,pas,temp,n,nb; /* déclarations */
n=nb;


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




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


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


int i=g, j=mid+1 , ga=g;
/* Fusion dans le tableau auxiliaire */
while(i<=mid && j<=d)
if (tab[i]<tab[j])
tab_aux[ga++]=tab[i++];
else
tab_aux[ga++]=tab[j++];


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


/* Recopie du tableau auxiliaire dans tab */
for(i=g;i<=d;i++)
tab[i]=tab_aux[i];
}


void fusion(int T[], int g, int d) {
int i,m;

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


int tri_fusion(int tab[]) {
int nb;
fusion(tab, 0, nb-1); /* appel de la fonction fusion */
}





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


/* réordonne le tableau et rend l'indice de séparation */
int permutation(int T[], int g, int d) {


int i, j, pivot, bi g, bs d, r, TI[d]; /* déclarations */



pivot = T[g]; /* choix du pivot*/

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


for(i=bi;i<=bs;i++) /* On place le ou les pivots */
TI[i] = pivot;


for(i=g;i <= d;i++) { /* recopie de TI */
T[i] = TI[i];
if (T[i] == pivot)
r = i;
}
return r;
}


void rapide(int T[], int g, int d) {

int separe; /* déclarations */


if (g < d) {
separe = permutation(T, g, d); /* apel de la fonction permutation */
rapide(T, g, separe-1); /* apel de la fonction rapide */
rapide(T, separe+1, d); }
}


int tri_rapide(int tab[]) {
int nb; /* déclarations */
rapide(tab, 0, nb-1); /* appel de la fonction rapide */
}



/* FIN*/
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 févr. 2005 à 16:02
#include <stdlib.h>
#include <stdio.h>
#include <time.h>


/*
Prototypes
*/
void InitTab( int );
void AfficheTab();
void Tri_Bull();
void Tri_Ins();
void Tri_Ext();
void Tri_Shell();



/*
Variables Globales
*/
int Tab[256];
int EspaceOccupe;


int main()
{
menu:
system("cls");
int choix;
int NbrRempli;
printf("\n\n\t\t\t ****************\n");
printf("\t\t\t *MENU PRINCIPAL*\n");
printf("\t\t\t ****************\n\n\n\n");
printf("1: Lancer le prog de tri a bulle\n");
printf("2: Lancer le prog de tri par insertion\n");
printf("3: Lancer le prog de tri par ext\n");
printf("4: Lancer le prog de tri shell\n");
printf("5: Lancer le prog de tri fusion\n");
printf("6: Lancer le prog de tri rapide\n");
printf("7: Quitter le programme\n\n\n");
printf("Choix : ");
scanf("%i",&choix);
printf("Nombre de case à remplir :");
scanf("%i",&NbrRempli);
InitTab(NbrRempli);

switch(choix)
{
case 1:
AfficheTab();
Tri_Bull();
system("pause");
goto menu;
break;
case 2:
AfficheTab();
Tri_Ins();
system("pause");
goto menu;
break;
case 3:
AfficheTab();
Tri_Ext();
system("pause");
goto menu;
break;
case 4:
AfficheTab();
Tri_Shell();
system("pause");
goto menu;
break;
case 5:
printf("\nTri fusion\n");
system("pause");
goto menu;
break;
case 6:
printf("\nTri rapide\n");
system("pause");
goto menu;
break;
case 7:
goto quitter;
break;
default:
goto menu;
break;
}
quitter:
printf("\nMerci...\n");
system("Pause");
return 0;

}



void InitTab(int Nbr)
{
EspaceOccupe = Nbr;
srand(time(NULL));
int i=0;

while(i<Nbr)
{
Tab[i] = rand()%1000;
i++;
}
}


void AfficheTab()
{
int i=0;
while(i<EspaceOccupe)
{
printf("Tab[%i] : \t%i\n", i, Tab[i]);
i++;
}
}


void Tri_Bull()
{
int i,j,v; /* Déclarations */


for (i=0; i<EspaceOccupe; i++) /* tri */
for (j=EspaceOccupe-1; j>i; j--)
if (Tab[j-1]>Tab[j])
{
v=Tab[j-1];
Tab[j-1]=Tab[j];
Tab[j]=v;
}
printf("\nApres le tri : \n");
AfficheTab();
}



void Tri_Ins()
{
int i,j,v;

for (i=0; i<EspaceOccupe; i++)
{
v=Tab[i];
j=i;
while (Tab[j-1]>v)
{
Tab[j]=Tab[j-1];
j--;
}
Tab[j]=v;
}
printf("\nApres le tri : \n");
AfficheTab();
}


void Tri_Ext()
{
int i,j,v,min;


for (i=0; i<EspaceOccupe; i++)
{
min=i;
for(j=i;j<EspaceOccupe;j++)
if (Tab[j]<Tab[min])
min=j;
v=Tab[min];
Tab[min]=Tab[i];
Tab[i]=v;
}
printf("\nApres le tri : \n");
AfficheTab();
}


void Tri_Shell()
{
int i,b,j,k,l,h,v,n;
n=EspaceOccupe;


for ( k=0 ; 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("\nApres le tri : \n");
AfficheTab();


}

J'ai pas fait les autres fonctions de tri car ça devenait en effet incompréhensible ;)
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 févr. 2005 à 16:05
Et ya aucun commentaire :)
Tu verras comment ça aide :)
Biensur le mien est tout aussi crapet, mais bon il marche !


void Aurevoir( void ); //Bonne journée
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 févr. 2005 à 17:33
Un vrai sketch à vous 2, vivement le prochain épisode.

ciao...
BruNews, MVP VC++
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 févr. 2005 à 17:40
Lol
Rire ça entretient le corp :)
Longue vie à tous :p

Au plaisir de vous faire rire :s
Même si ma carriere en dépend :)
Et quelle carriere !!!


void Aurevoir( void ); //Bonne journée
0
cs_natacha86 Messages postés 16 Date d'inscription samedi 5 février 2005 Statut Membre Dernière intervention 9 février 2005
9 févr. 2005 à 00:31
merci pour ton aide, je n'ai pas pu venir plus tot, je travaillais :-)
bon j'ai essayé de faire de mon mieux, avec ton aide heureusement,
a bientot !!
chao
0