//declaration des fonctions
short dichotomie(char dico[MAXMOTS][LONGMOT],char *mot,short nb_mot);
int lecture(char tab[], int taille);
static int compare (void const *a, void const *b) /* ----- a mon avis là il y a un problème */ {
/* definir des pointeurs type's et initialise's
avec les parametres */
char const *const *pa = a;
char const *const *pb = b;
/* evaluer et retourner l'etat de l'evaluation (tri croissant) */
return strcmp (*pa, *pb);
}
//Fonction principale
int main(int argc,char*argv[])
{
int res,i;
short nb_mot=0;
char touche;
char buf[30];
int nb=0;
//ouverture du dictionnaire
//Test que le fichier dico s'ouvre bien
if ((fd=fopen("dico.dat","a+")) == NULL)
{
fprintf(stderr,"\nImpossible d'ouvrir le fichier Dico, creation d'un nouveau Dico");
exit(EXIT_FAILURE);
}
/*Puisqu'il est impossible d'ouvrir le fichier dico, la fin du programme permetra
d'en créé un nouveau avec fopen("dico.dat","w")*/
printf("Combien de mot, voulez-vous entrer ? ");
scanf("%d",&nb);
do
{
lecture(buf, sizeof(buf));
strcpy(dico[nb_mot],buf);
nb_mot++;
} while(nb_mot<nb);
/*tri en mémoire du tableau Dico*/
qsort(dico,nb,sizeof(dico),compare); /*------------------- et là aussii il y a un problème */
for (i =0;i<nb_mot;i++)
fprintf(fd,"%s\n",dico[i]);
//Fermeture du fichier dico
fclose(fd);
printf("Mot a rechercher : ");
scanf("%s",mot);
system("pause");
return 0;
}
//FONCTION DICHOTOMIE
short dichotomie(char dico[MAXMOTS][LONGMOT],char *mot, short nb_mot)
{
//déclaration des variables
int i=0,j=nb_mot,k,res;
//Traitement
while ((j-i)>1 && res!=0)
{
k=(i+j)/2;
res=strcmp(dico[k],mot);
if (res>0)
j=k;
else
i=k;
/*ce if afin d'atteindre le mot du tableau dico[0]
puisque j-i ne peut qu'être strictement supérieur à 1*/
if (k==0 && res!=0)
res=strcmp(dico[0],mot);
}
//Affectation des valeurs retournées
if (res!=0)
res=0;
else
res=1;
return res;
}
/*Fonction saisie des caractères */
int lecture(char tab[], int taille)
{
char car; /*Initialisation des variables */
int i = 0;
/* on met le caractère tapé dans la variable car */
car=getchar();
do {
/* on place le caractere dans le tableau */
tab[i++] = tolower(car);
/* on continue jusqu'a fin du tableau ou caractere fin de ligne */
} while ( (i<taille-1)&&( (car=getchar()) != '\n'));
/* et on n'oublie pas le caractère de fin de chaine */
tab[i] = '\0';
if (car != '\n') {
/* il faut vider le buffer car trop de caracteres ont ete saisis
par l'utilisateur. Si on les laisse, ils seraient utilises
par le prochain appel a saisieChaine.
*/
while (getchar() != '\n')
;
}
}
A voir également:
Problème avec tri de tableau de chaine - Aidez-moi svp
gaspos
Messages postés17Date d'inscriptionjeudi 9 décembre 2004StatutMembreDernière intervention20 février 2009 5 févr. 2009 à 18:41
Bonjour,
sans lire très en détail ton code, je pense que les problèmes sont là où tu l'imagine :
Il faut que tu revoies l'usage de strcmp et de qsort !
voici un bout de code qui devrait t'aider :
int inf_string ( const void * a , const void * b )
{
return( strcmp( a,b ) > 0 ) ; // pas de cast / la valeur de retour de strcmp n'est pas ce que tu crois }
jaguar57
Messages postés4Date d'inscriptionvendredi 6 février 2009StatutMembreDernière intervention 6 février 2009 6 févr. 2009 à 09:16
Après test, c'est vrai que ton prog fonctionne en entrant les mots comme tu l'a fais mais dès que tu remplis le tableau au clavier le tri ne se fait pas correctement :
Merci pour ton aide
#include<stdio.h>
#include<conio.h>
#include<string.h>
int inf_string ( const void * a , const void * b )
{
return( strcmp( a,b ) > 0 ) ; // pas de cast / la valeur de retour de strcmp n'est pas ce que tu crois
}
/*Fonction saisie des caractères */
int lecture(char tab[], int taille)
{
char car; /*Initialisation des variables */
int i = 0;
/* on met le caractère tapé dans la variable car */
car=getchar();
do {
/* on place le caractere dans le tableau */
tab[i++] = tolower(car);
/* on continue jusqu'a fin du tableau ou caractere fin de ligne */
} while ( (i<taille-1)&&( (car=getchar()) != '\n'));
/* et on n'oublie pas le caractere de fin de chaine */
tab[i] = '\0';
if (car != '\n') {
/* il faut vider le buffer car trop de caracteres ont ete saisis
par l'utilisateur. Si on les laisse, ils seraient utilises
par le prochain appel a saisieChaine.
*/
while (getchar() != '\n')
;
}
}
void main ()
{
#define MAXMOTS 100
#define LONGMOT 20
char dico[MAXMOTS][LONGMOT];
char test[MAXMOTS][LONGMOT];
char buf[MAXMOTS][LONGMOT];
int i=0;
int nb=0;
short nb_mot=0;
/* ici je n'utilise que les 5 premières lignes de ton tableau
strcpy( dico [0],"comment" ) ;
strcpy( dico [1],"allez" ) ;
strcpy( dico [2],"vous" ) ;
strcpy( dico [3],"les" ) ;
strcpy( dico [4],"gars" ) ;*/
printf("Combien de mots : ");
scanf("%d",&nb);
while(nb_mot<nb)
{
lecture(buf, sizeof(buf)); /*---------------------------J'entre mes mots de cette manière*/
strcpy( dico [nb_mot],buf); /*------------je copie ma saisie comme cela-----*/ nb_mot++;
}
// paramètres : tableau ; nombre de cases à trier ; taille des cases ; fonction qui teste l'inferiorité
qsort( dico,nb,LONGMOT,inf_string ) ; /*----le tri ne se fait pas correctement*/