Problème avec des listes > 30 éléments [Résolu]

Signaler
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007
-
Messages postés
160
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
30 juin 2011
-
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

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
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;
}
Messages postés
160
Date d'inscription
jeudi 28 août 2003
Statut
Membre
Dernière intervention
30 juin 2011

Réponsé acceptée ???

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

Bé dis donc lol

if(!Meilleur("Joky")) return ERREUR;<
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

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
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

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
Messages postés
52
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
5 juin 2007

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