Rechercher : dans
Par :

Trier une fichier en langage c

Dernière réponse le 17 nov 2009 à 09:45:53 bolbolll, le 27 avr 2007 à 20:51:34 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « trier une fichier en langage c » dans :
Caractéristiques du langage C VoirLe fichier source Le fichier source d'un programme écrit en langage C est un simple fichier texte dont l'extension est par convention .c. Note d'un visiteur (J.Grondin) : L'extension est en minuscules. Le .C (majuscule) est interprété par...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

ekra, le 28 avr 2007 à 02:35:28

< code>CODE....<code> est très utile. Ceci est une signature.

Répondre à ekra

2

bolbolll, le 28 avr 2007 à 02:43:03

Merci de votre reponse mais franchement je sais pas qu'est ce que tu veux dire

Répondre à bolbolll

3

ekra, le 28 avr 2007 à 12:41:54

Mets ton code en tre balises < code> parce que sinon ça devient vite illisible ! Ceci est une signature.

Répondre à ekra

4

bolbolll, le 29 avr 2007 à 02:20:32

Merci pour votre aide

Répondre à bolbolll

5

tatou_38, le 29 avr 2007 à 16:42:12

Ton source C est passionnant, mais quelle est ta question ??

Répondre à tatou_38

6

bolbolll, le 29 avr 2007 à 16:46:41

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

Répondre à bolbolll

7

tatou_38, le 29 avr 2007 à 18:31:36

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.

Répondre à tatou_38

8

bolbolll, le 29 avr 2007 à 19:55:47

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.

Répondre à bolbolll

9

la rose, le 18 oct 2007 à 19:26:06

Bonjour,
je suis une étudiante en 2 éme année informatique et j'ai des problémes en language c

Répondre à la rose

10

tatou_38, le 18 oct 2007 à 20:53:15

Bonjour Rose,

et bien expose-moi ton problème en langage C, et je tacherai de te répondre le plus clairement possible !

tatou_38
Angers

Répondre à tatou_38

11

la rose, le 20 oct 2007 à 17:06:28

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

Répondre à la rose

12

tatou_38, le 20 oct 2007 à 17:50:48

Bonjour,

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

@++
tatou_38
Angers

Répondre à tatou_38

13

la rose, le 20 oct 2007 à 18:16:21

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.

Répondre à la rose

14

tatou_38, le 20 oct 2007 à 19:18:00
  • +3

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.

@++

tatou_38
Angers

Répondre à tatou_38

15

la rose, le 20 oct 2007 à 20:09:43

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

Répondre à la rose

16

tatou_38, le 20 oct 2007 à 22:33:53

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 ?

@++
}

tatou_38
Angers

Répondre à tatou_38

17

la rose, le 21 oct 2007 à 11:05:40

Merci bien pour votre aide

Répondre à la rose

18

a.mech, le 1 mar 2008 à 19:37:13

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

Répondre à a.mech

19

gazinet, le 2 mar 2008 à 17:54:42

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

Répondre à gazinet

20

 JuseN, le 17 nov 2009 à 09:45:53

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 ?

Répondre à JuseN