Bonjour,
je finalise un programme qui fonctionne parfaitement sauf que je ne peux pas travailler avec une liste de plus de 30 éléments pour le tri par base. Sinon Windows plante!!
Apparemment, le pb vient de cette petite partie de code:
do
{
buff=buff/div;
temp=temp+1;
div=div*10;
}while(buff!=0);
où je cherche sur combien de chiffre un nombre est représentée. Je trouve cela vraiment bizare!!
Voici mon code au complet:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void bulle(int* tab,int max);
void base(int* tab,int max);
int* denombrement(int* tab,int c,int max);
void main(void)
{
//Initialisation des variables
int max =5;
int i = 0;
int temp = 0;
int* tab = NULL;
printf("\n Entrer la longueur du tableau \n");
scanf("%d",&max);
tab = (int*)malloc(max*sizeof(int));
//valeur au hasard
srand( (unsigned)time( NULL ));
for( i = 0;i < max;i++ )
tab[i]=rand();
//Présentation du tableau
printf("\n **** Tableau de depart **** \n");
for(i=0;i<max;i++)
printf("%d \n",tab[i]);
// bulle(tab,max);
base(tab,max);
// denombrement(tab,1,max);
free(tab);
}
//Tri par bulles
void bulle(int* tab,int max)
{
int i =0;
int ok = 1;
int temp = 0;
do
{
ok=1;
for(i=1;i<max;i++)
{
if(tab[i-1]>tab[i])
{
ok=0;
temp=tab[i-1];
tab[i-1]=tab[i];
tab[i]=temp;
}
}
}while(!ok);
//Résultat final
printf("\n **** Tableau final **** \n");
for(i=0;i<max;i++)
printf("%d \n",tab[i]);
printf("\n");
}
int* denombrement(int* tab,int c,int max)
{
int i = 0;
int k = 9;
int lg = max;
int div = 1;
int* tab1 = NULL; // Tableau de compte
int* tab2 = NULL; // Tableau de résultats
int* inter = NULL; //tableau de travail
//construction du div
for(i=1;i<=c;i++)
{
div=div*10;
}
//construction du tableau de travail
inter = (int*)malloc((max)*sizeof(int));
for(i=0;i<max;i++)
{
inter[i]=tab[i]%div/(div/10);
}
//Construction du "tableau de compte"
tab1 = (int*)malloc((k+1)*sizeof(int));
for(i=0;i<=k;i++)
{
tab1[i]=0;
}
for(i=0;i<max;i++)
{
tab1[inter[i]]=tab1[inter[i]]+1;
}
for(i=1;i<k+1;i++)
{
tab1[i]=tab1[i]+tab1[i-1];
}
//Construction du tableau de résultats
tab2 = (int*)malloc(lg*sizeof(int));
for(i=0;i<lg;i++)
{
tab2[i]=0;
}
for(i=lg-1;i>=0;i--)
{
tab2[tab1[inter[i]]-1]=tab[i];
tab1[inter[i]]=tab1[inter[i]]-1;
}
return tab2;
free(inter);
free(tab2);
free(tab1);
}
//Tri par base
void base(int* tab,int max)
{
int i=0;
int j=0;
int temp=0;
int buff = 0;
int div=1;
int c=1; //Nombre de chiffres max de représentation des valeurs à tester
for(i=0;i<max;i++)
{
buff=tab[i];
temp=0;
do
{
buff=buff/div;
temp=temp+1;
div=div*10;
}while(buff!=0);
if(temp+1>c)
c=temp+1;
temp=0;
}
//Algorithme de tri
for(i=1;i<=c;i++)
{
tab=denombrement(tab,i,max);
}
for(i=0;i<max;i++)
{
printf("\n %d -> %d\n",i+1,tab[i]);
}
}
Une petite aide m'aiderai beaucoup!
Merci d'avance
Thomas