Trier une fichier en langage c

Fermé
bolbolll Messages postés 6 Date d'inscription vendredi 27 avril 2007 Statut Membre Dernière intervention 29 avril 2007 - 27 avril 2007 à 20:51
 iris - 11 mars 2021 à 22:28
salut à tous, voici un code source ecrit en langage c qui permet de trier une fichier donnée avec l'usage des listes;
<souligne>remarque:
1-vous de vez bien donner l'extension de la fichier a trier avec le nom ex: "salut.txt";
2-votre fichier doit contenir un nom sur chaque ligne; exp: "bolbol" ou "mallouli boulbeba" ou meme "mallouli boulbeba 200000" mais pas une ligne entiere
voici le code:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

typedef struct liste liste;//definition de la liste
struct liste
{
char ch[100];
liste *next;
};
liste* ajout(liste **l,char *t)/*permet l'ajout d'une mot a la liste (ajout en tete)*/
{
liste *p;
p=(liste *) malloc(sizeof(liste));
strcpy(p->ch,t);
p->next=*l;
*l=p;
}
liste* charger(liste **l)/*permet de charger les mots de la fichier dans une liste*/
{
FILE *fp;
char t[100],s[100];
puts("dooner le nom de fichier source(a trier)");
retour:
gets(s);
fp=fopen(s,"r");
if(!fp)
{
puts("\ncette fichier n'existe pas");
puts("si vous desirer resseayer tappuiez sur entrer sinon autre caractere puis entrer");
if(getchar()=='\n')
{
puts("donner le nom de fichier source(a trier)");
goto retour;
}
else exit(0);
}
while(fgets(t,100,fp))
ajout(l,t);
}
void liberer(liste *l)// liberer la liste
{
liste *p,*t;
for(p=l;p;)
{
t=p->next;
free(p);
p=t;
}
}
FILE* remplir(char *s,liste *l)/*permet de remplir le fichier destination*/
{
FILE *fp;
liste *p=l;
fp=fopen(s,"w");
while(l)
{
fputs(l->ch,fp);
l=l->next;
}
fclose(fp);
liberer(p);
}
liste* trier(liste **l)// trier une liste
{
liste *p;
char s[100];
if(*l)
{
for(p=(*l)->next;p;p=p->next)
if(strcmp((*l)->ch,p->ch)>0)
{
strcpy(s,(*l)->ch);
strcpy((*l)->ch,p->ch);
strcpy(p->ch,s);
}
trier(&((*l)->next));
}
}
main()
{
char s[100];
liste *l=NULL;
charger(&l);
trier(&l);
puts("dooner le nom de fichier destination (triee)");
gets(s);
remplir(s,l);
puts("merci, consulter votre dossier vous trouverez votre fichier");
getch();
}
//merci, j'attend vos commentaire
A voir également:

14 réponses

tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 120
20 oct. 2007 à 19:18
1. Tu commences par réaliser un petit gestionnaire de paramètres d'entrée pour analyser ce que souhaite faire l'utilisateur.
main( int argc , char **argv ) où argc = Nombre d'arguments, argv = liste des arguments

2. Pour le premier choix, si j'ai bien compris, il faut trier le fichier selon une des colonnes. Un algorithme simple mais bestial, admissible pour des fichiers pas trop long, serait de :

i. Lire les enregistrements du fichier d'entrée ligne par ligne en mémorisant la ligne lue si elle est plus grande selon le critère de tri que celle mémorisée. Après avoir balayétout le fichier, la ligne mémorisée sera donc celle en tête de liste, à écrire dans le fichier de sortie. Il suffit alors de rebalayer le fichier d'entrée pour avoir la ligne suivante, à ajouter au fichier de sortie, et ainsi de suite jusqu'à avoir transféré toutes las lignes. L'inconvénient est qu'il faut relire N fois le fichier d'entrée, N étant le nombre de lignes de ce fichier. Méthode devient vite longue si fichier long !

ii. Le + simple est de créer une structure qui mappe une ligne, comme :

typedef struct {
char code[3];
char designation[20];
char prix[7];
char stock[5];
char fournisseur[10];
} tEnregistrement;

Tu peux alors créer un tableau de structures tEnregistrement et y transférer les données du fichier d'entrée :

tEnregistrement Enr[100]; en supposant que tu n'aies pas plus de 100 enregistrements. Si ce nombre est inconnu, alors il faut faire une allocation dynamique de mémoire (malloc() puis des realloc())

Une fois que tu as tranféré le fichier d'entrée dans le tableau Enr[], il ne te suffit plus que de faire un petit tri bulle su le tableau, puis de vider le tableau dans le fichier de sortie. Simple et rapide car tu travailles en mémoire.

Pour ta gouverne, le tri bulle : Tu balaye le tableau, et à chaque ligne tu la compares avec la suivante, si elles sont dans le bon ordre, ok, sinon tu echange leur contenu. Tu rebalaye alors le tableau jusqu'à ce qu'il n'y ait plus de permutation.


Je ne veux pas t'écrire le programme car cela ne t'apprendrai rien, mais si tu veux des conseils, poses moi des questions ou envoie moi ton code et je t'aiderai bien volontiers.

@++
4
Merci pour cette explication..
0
Merci beaucoup pour la clarté apportée
0
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
28 avril 2007 à 02:35
< code>CODE....<code> est très utile.
3
tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 120
18 oct. 2007 à 20:53
Bonjour Rose,

et bien expose-moi ton problème en langage C, et je tacherai de te répondre le plus clairement possible !
1
salut ,
merci bien pour votre attention ,concernant mon probléme j'ai un programme trés important sur les fichiers que j'ai pas pu le réaliser si vraiment tu peux m'aider je vais t 'écrire l'ennoncé sinon merci de me répondre
0

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

Posez votre question
tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 120
20 oct. 2007 à 17:50
Bonjour,

Et bien ok, envoie moi les données du problème et/ou ce que tu as déjà fait !

@++
0
oui j'AI essayé et j'ai fait tout ce que j'ai pu faire mais j'ai pas terminé encore voila` l'ennoncé:
écrire un prog en c qui permet d'accepter le nom d'un fichier texte de longeur constante concernant des articles en stock.
chaque ligne contient:
-code [3 caractére]
-désignation [20 car]
-prix [7car]
-stock [5 car]
-fournisseur [10]
le programme offre un menu qui permet de :
-trier le fichier sur l'un des champs(au choix) et l'affiche sur écran.
-le charger dans un tableau de structure et le trier au choix sur l'un des champs.
-le charger ds une liste chainéé et le trier sur l'un des critéres au choix.
svp j'aurai besoin de ça avant lundi sans la 3 éme partie car on a pas encore la traitéé en classe et merci une autre fois.
0
la rose Messages postés 2 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 21 octobre 2007
20 oct. 2007 à 20:09
svp ,comment je fais le tri du tableau sur le champ designation par exemple qui est de type caractére ?c'est ça mon probléme
0
tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 120
20 oct. 2007 à 22:33
tu fais un tri bulle (par exemple d'autres algo sont possibles)

static int sNbPermut;

int Comparaison( tEnregistrement *pA , tEnregistrement *pB ) {
tEnregistrement T;

if (memcmp( pA->Designation , pB->Designation , sizeof( pA->Designation) )) {
memcpy( &T , pA , sizeof(tEnregistrement) );
memcpy( pA , pB , sizeof(tEnregistrement) );
memcpy( pB , &T , sizeof(tEnregistrement) );
sNbPermut++;
}
return( 0 );
}

int TriBulle( tEnregistrement *pE , int NbEnr ) {
for ( sNbPermut = 1 ; sNbPermut ; ) {
sNbPermut = 0;
for ( i = 0 ; i < NbEnr-1 ; i++ ) Comparaison( pE+i , pE+i+1 );
}
return( 0 );

J'ai écrit ce bout de code ex abrupto, sans tester, mais ce ne devrait pas être loin de tourner.

Te voilà avancée ?

@++
}
0
la rose Messages postés 2 Date d'inscription samedi 20 octobre 2007 Statut Membre Dernière intervention 21 octobre 2007
21 oct. 2007 à 11:05
merci bien pour votre aide
0
slm bolboll
j'aime bien savoir comment modifier un fichier en plus j'ai un pb en affichage en un affichant un fichier deja cree
il apparait par des code ascii
0
Salut boboll, mais ton programme ne permet pas d'ouvrir le fichier txt que je veux trié, il ne le trouve pas et pourtant il est dans le meme dossier que mon programme ... tu sais pourquoi stp ?
0
bolbolll Messages postés 6 Date d'inscription vendredi 27 avril 2007 Statut Membre Dernière intervention 29 avril 2007
28 avril 2007 à 02:43
merci de votre reponse mais franchement je sais pas qu'est ce que tu veux dire
-2
bolbolll Messages postés 6 Date d'inscription vendredi 27 avril 2007 Statut Membre Dernière intervention 29 avril 2007 > ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014
29 avril 2007 à 02:20
merci pour votre aide
0
tatou_38 > bolbolll Messages postés 6 Date d'inscription vendredi 27 avril 2007 Statut Membre Dernière intervention 29 avril 2007
29 avril 2007 à 16:42
Ton source C est passionnant, mais quelle est ta question ??
0
bolbolll Messages postés 6 Date d'inscription vendredi 27 avril 2007 Statut Membre Dernière intervention 29 avril 2007 > tatou_38
29 avril 2007 à 16:46
bon je n'ai pas de question, juste j'ai voulu posté mon code et savoir si quelqu'un à quelques idées d'amélioration. merci
0
tatou_38 > tatou_38
29 avril 2007 à 18:31
Et bien une première amélioration nécessaire serait un minimum de gestion des erreurs, par exemple malloc(), fopen() ... peuvent ne mas marcher comme prévu ! Sinon quelques commentaires ne nuisent pas à la compréhension.
0
bolbolll Messages postés 6 Date d'inscription vendredi 27 avril 2007 Statut Membre Dernière intervention 29 avril 2007 > tatou_38
29 avril 2007 à 19:55
merci, est ce que je dois le refomuler et le poster d'une façon plus formulée t plus lisible? si tu veux je suis prés de faire ça.
0
Bonjour,
je suis une étudiante en 2 éme année informatique et j'ai des problémes en language c
-2
a.mech Messages postés 2 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 1 mars 2008
1 mars 2008 à 19:37
bonjour voisi mon probleme je débute ds le c et il faux ke je trouve la soluc de ce prblm
ecrir e un programme principale en C qui:
1- lit 10 entier a partir de clavier .
2- construit une liste chéner de ses entier .
3- trier ses enties on utilisant la fonction TRIER et affiche le resultat sur une ligne d'ecran.
svp curg
-2