Problème avec des listes > 30 éléments

Résolu
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007 - 25 sept. 2005 à 20:46
romit Messages postés 160 Date d'inscription jeudi 28 août 2003 Statut Membre Dernière intervention 30 juin 2011 - 5 nov. 2005 à 18:09
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

6 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
26 sept. 2005 à 09:37
il faut réinitialiser div avant chaque boucle sinon, tu fait des multiplications par 10 indéfiniement. Mais comme les int ont une borne max, il y a overflow et tu repart modulo la borne max => à un momment, tu tombe sur 0 et boom division par 0 ça plante.

for(i=0;i<max;i++)
{
buff=tab[i];
temp=0;
div = 1;
do
{
buff=buff/div;
temp=temp+1;
div=div*10;
}while(buff!=0);
if(temp+1>c)
c=temp+1;
temp=0;
}
3
romit Messages postés 160 Date d'inscription jeudi 28 août 2003 Statut Membre Dernière intervention 30 juin 2011
5 nov. 2005 à 18:09
Réponsé acceptée ???

Romit.
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
25 sept. 2005 à 21:26
Un peu d'aide t'aiderait beaucoup :o

Bé dis donc lol

if(!Meilleur("Joky")) return ERREUR;<
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
25 sept. 2005 à 21:34
Ben ouai,

c'est quand même bizare cette affaire non?
Pourquoi il ne plante pas pour 29 valeurs et à partir de 30 valeurs ca plante!!

Thomas
0

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

Posez votre question
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
25 sept. 2005 à 21:35
Ben ouai,

c'est quand même bizare cette affaire non?
Pourquoi il ne plante pas pour 29 valeurs et à partir de 30 valeurs ca plante!!

Thomas
0
tomalille Messages postés 52 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 5 juin 2007
25 sept. 2005 à 21:35
Ben ouai,

c'est quand même bizare cette affaire non?
Pourquoi il ne plante pas pour 29 valeurs et à partir de 30 valeurs ca plante!!

Thomas
0
Rejoignez-nous