Et bien ça fonctionne à merveille.
Encore merci de ton aide Thierry
Et bien ça fonctionne à merveille.
Encore merci de ton aide Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
en effet je me suis emballé pour rien.
Me revoilà dans le pétrin.
Non, il te faut juste comprendre mon code et l'adapter en conséquence. ca ne fonctionne pas, car je ne compare les deux chaines que tant que ville1[i] et ville2[i] sont des lettres (reconnus comme tels par isalpha()). Il faut modifier la condition pour la comparaison s'arrête uniquement lorsque ville1[i] et ville2[i] contiennent '\0' ou ';'.
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
je pense avoir trouver en mettant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (tab[i].ville[j] == buffer[j] && strchr(buffer, ';') )
Reste plus qu'a faire quelques testes.
Erf ça ne fonctionne pas.
Je cherche toujours
Je n'ai pas beaucoup de temps maintenant, mais est-ce que le code qui suit fonctionne:
A première vue, selon les quelques tests, cela semble OK.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int comparer_villes(char const *ville1, char const *ville2) { int ret = 0; if (ville1 != NULL && ville2 != NULL) { size_t i = 0; while (ville1[i] == ville2[i] && ville1[i] != 0 && ville1[i] != ';' && ville2[i] != 0 && ville2[i] != ';') { i++; } if ((ville1[i] == 0 || ville1[i] == ';') && (ville2[i] == 0 || ville2[i] == ';')) { ret = 1; } } return ret; } /* -tc- Tests */ #define ARRAY_SIZE(a) ( sizeof (a) / sizeof *(a) ) struct Test { char v1[32]; char v2[32]; int resultat; }; int main(void) { struct Test data[]= { {"Fribourg", "Fribourg; 20", 1}, {"Fribourg; 20", "Fribourg", 1}, {"Fribourgx", "Fribourg; 20", 0}, {"Fribourg", "Fribourgx; 20", 0}, {"Fribourgx", "Fribourgx; 20", 1}, {"Fribourg", "Fribourg", 1}, {"Granges-Paccot", "Granges-Paccot; 20", 1}, {"Granges-Paccot", "Granges-Paccotx", 0}, {"La Conversion", "La Conversion; 20", 1}, {"L'Isle", "L'Isle; 20", 1}, }; size_t i; int ret = EXIT_SUCCESS; for (i = 0; i < ARRAY_SIZE(data); i++) { int rv; printf("Test%u: comparaison de \"%s\" et de \"%s\"... ", i+1, data[i].v1, data[i].v2); rv = comparer_villes(data[i].v1, data[i].v2); if (rv == data[i].resultat) { printf("REUSSI\n"); } else { printf("ECHOUE!\n"); ret = EXIT_FAILURE; } } return 0; }
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Salut Thierry,
Excuse moi du retard mais j'ai eu la crève et je n'ai pas eu le temps d'essayer ton code.
Et bien apparemmment il fonctionne à merveille. Il me reste à faire différent test.
Encore merci.
Tu es un
Bon mon programme est maudit.
Ton code fonctionne bien a part pour 4 villes.
BOUSIGNIES SUR ROC
DIMECHAUX
RAUCOURT AU BOIS
RUESNES
Pourtant lorsque je les copies dans un autre fichier texte (seulement ces 4 là) cela fonctionne. Je ne vois vraiment pas d'où provenir le problème.
Est ce que je peux te donner mon code pour le tester chez toi?
merci
En tous les cas, ici, ils passent les tests:
donne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int comparer_villes(char const *ville1, char const *ville2) { int ret = 0; if (ville1 != NULL && ville2 != NULL) { size_t i = 0; while (ville1[i] == ville2[i] && ville1[i] != 0 && ville1[i] != ';' && ville2[i] != 0 && ville2[i] != ';') { i++; } if ((ville1[i] == 0 || ville1[i] == ';') && (ville2[i] == 0 || ville2[i] == ';')) { ret = 1; } } return ret; } /* -tc- Tests */ #define ARRAY_SIZE(a) ( sizeof (a) / sizeof *(a) ) struct Test { char v1[32]; char v2[32]; int resultat; }; int main(void) { struct Test data[]= { {"BOUSIGNIES SUR ROC", "BOUSIGNIES SUR ROC; 20", 1}, {"BOUSIGNIES SUR ROC", "Bousignie sur Roc; 20", 0}, {"DIMECHAUX", "DIMECHAUX; 20", 1}, {"DIMECHAUX", "BOUSIGNIES SUR ROC; 20", 0}, {"RAUCOURT AU BOIS", "RAUCOURT AU BOIS; 20", 1}, {"RAUCOURT AU BOIS; 20", "RAUCOURT AU BOIS", 1}, {"RUESNES", "RUESNES; 20", 1}, }; size_t i; int ret = EXIT_SUCCESS; for (i = 0; i < ARRAY_SIZE(data); i++) { int rv; printf("Test%u: \"%s\" %s \"%s\"... ", i+1, data[i].v1, (data[i].resultat) ? "est egal a":"n'est pas egal a", data[i].v2); rv = comparer_villes(data[i].v1, data[i].v2); if (rv == data[i].resultat) { printf("REUSSI\n"); } else { printf("ECHOUE!\n"); ret = EXIT_FAILURE; } } return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Test1: "BOUSIGNIES SUR ROC" est egal a "BOUSIGNIES SUR ROC; 20"... REUSSI Test2: "BOUSIGNIES SUR ROC" n'est pas egal a "Bousignie sur Roc; 20"... REUSSI Test3: "DIMECHAUX" est egal a "DIMECHAUX; 20"... REUSSI Test4: "DIMECHAUX" n'est pas egal a "BOUSIGNIES SUR ROC; 20"... REUSSI Test5: "RAUCOURT AU BOIS" est egal a "RAUCOURT AU BOIS; 20"... REUSSI Test6: "RAUCOURT AU BOIS; 20" est egal a "RAUCOURT AU BOIS"... REUSSI Test7: "RUESNES" est egal a "RUESNES; 20"... REUSSI
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Oui c'est bien ce que je te dis. Si je met les 4 nom de ville dans un fichier à part cela fonctionne mais si je met la liste entière il me les laisse à 0.
C'est Fou
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define MY_BUFFER_SIZE 1024 /* définitions des types et variables associées */ typedef struct { char ville[100]; int nb; } rmi; rmi tab[160]; //Fonction qui recopie un fichier contenant les noms des villes int file_copy(char nomfich[],rmi tab[]) { FILE *fiche = NULL; char buffer[MY_BUFFER_SIZE]; int i = 0; int cpt = 0; /* ----- Ouverture du fichier ----- */ fiche = fopen (nomfich, "r"); if (!fiche) { /* Erreur: impossible d'ouvrir le fichier. */ printf("Erreur: impossible d'ouvrir le fichie"); return -1; } while (fgets(buffer,MY_BUFFER_SIZE,fiche) && i<160) { char *pLF = NULL; pLF = strchr(buffer, '\n'); if (pLF != NULL) *(pLF) = '\0'; strcpy(tab[i].ville,buffer); tab[i].nb = 0; //printf("%s\n",tab[i].ville); cpt ++; i++; } fclose(fiche); return cpt; } //fonction qui affiche le tableau RMI void affichage_tab(rmi tab[], int cpt) { int i=0; printf("\n____________________________________________________\n"); printf("| Ville Nombre de RMI |\n"); printf("|__________________________________________________|\n"); while (i < cpt) { printf("| %-37s",tab[i].ville); printf("%-4d |\n",tab[i].nb); i++; } printf("|__________________________________________________|\n\n"); } //fonction qui remplie le tableau celon le fichier de valeur int maj_tab(rmi tab[],char nomfich[], int cpt) { FILE *fiche; char buffer[MY_BUFFER_SIZE]; int i = 0; fiche = fopen(nomfich,"r"); if (!fiche) { /* Erreur: impossible d'ouvrir le fichier. */ printf("Erreur: impossible d'ouvrir le fichie"); return -1; } /* On parcour le fichier */ while (fgets(buffer,MY_BUFFER_SIZE,fiche)) { /*On parcour le tableau de structure RMI pour mettre à jours Tab.nb*/ for (i; i<cpt; i++) { /*On compare les deux villes dans le buffer et le tableau*/ int ret = 0; if (tab[i].ville != NULL && buffer != NULL) { size_t j = 1; while (tab[i].ville[j] == buffer[j] && tab[i].ville[j] != 0 && tab[i].ville[j] != ';' && buffer[j] != 0 && buffer[j] != ';') { j++; } if ((tab[i].ville[j] == 0 || tab[i].ville[j] == ';')&&( buffer[j] == 0 || buffer[j] == ';')) { ret = 1; } } /* Si on trouve la ville on recherche le caractère ;*/ if(ret == 1) { /*On supprime le retour à la ligne*/ char *pLZ = NULL; pLZ = strchr(buffer, '\n'); if (pLZ != NULL) { *pLZ = '\0'; } else { /*On finit de lire la ligne jusqu'au LF*/ int c; while ((c=fgetc(fiche)) != '\n' && c != EOF) {} } char *pLF = NULL; pLF = strchr(buffer, ';'); int *pINT = NULL; int convert = 0; /*Si on trouve le ; alors on remplie le champ tab.nb*/ if (pLF != NULL) { /*On converti la chaine de chiffre en entier et on l'enregistre dans le tableau*/ convert = atoi((pLF + 1)); tab[i].nb = tab[i].nb + convert; } } } /*on réinitialise le compteur de la boucle*/ i = 0; } fclose(fiche); return 0; } //création du fichier en sortie avec toutes les communes complétées int fichier_sortie(rmi tab[], int cpt) { FILE *dst = NULL; int rec,i; dst = fopen ("Denombrement_RMI.txt", "w"); if (dst) { for(i=0; i<cpt; i++) { fprintf (dst, "%s;%d\n", tab[i].ville, tab[i].nb); } if (ferror (dst)) { printf("Erreur lors de l'ecriture du fichier dst : %s\n"); } fclose (dst); } } /*Partie statistique*/ void affichage_stat(int cpt, rmi tab[]) { int total_rmi = 0; int i = 0; for (i; i<cpt; i++) { if(tab[i].nb > 0) total_rmi += tab[i].nb; } printf("Ce mois ci, nous avons %d allocataires percevant le RMI pour %d communes\n\n", total_rmi, cpt); } //Menu int main() { char nomfich[20]; int cpt,val; printf ("Entrer le nom du fichier modele: "); scanf ("%s",&nomfich); cpt = file_copy(nomfich,tab); if (cpt > 0) { affichage_tab(tab,cpt); printf ("\nEntrer le nom du fichier RMI: "); scanf ("%s",&nomfich); val = maj_tab(tab, nomfich, cpt); if (val != -1) { affichage_tab(tab,cpt); fichier_sortie(tab,cpt); } affichage_stat(cpt,tab); _getch(); } }
As-tu un exemple de fichier modèle et de fichier RMI?
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Liste RMI
Les Villes qui servent à remplir le tableau
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 AIBES ;0 AIBES ;9 AMFROIPRET ;3 ANICHE ;1 ANOR ;95 ANZIN ;1 ASSEVENT ;0 ASSEVENT ;48 AUDIGNIES ;1 AULNOYE AYMERIES ;0 AULNOYE AYMERIES ;348 AVESNELLES ;49 AVESNES SUR HELPE ;329 AVESNES SUR HELPE ;1 AVESNES SUR HELPE ;1 BACHANT ;64 BAIVES ;2 BAPAUME ;1 BAS LIEU ;3 BAVAY ;90 BAVAY ;2 BEAUDIGNIES ;6 BEAUFORT ;12 BEAUREPAIRE SUR SAMBRE ;6 BEAURIEUX ;2 BELLIGNIES ;12 BERELLES ;2 BERLAIMONT ;89 BERMERIES ;11 BERSILLIES ;1 BETTIGNIES ;4 BETTRECHIES ;2 BEUGNIES ;7 BOULOGNE SUR HELPE ;2 BOUSIES ;41 BOUSIGNIES SUR ROC ;4 BOUSSIERES SUR SAMBRE ;6 BOUSSOIS ;106 BRY ;1 CAEN ;1 CARTIGNIES ;8 CERFONTAINE ;7 CHAMBERY ;1 CHASSE SUR RHONE ;1 CHOISIES ;1 CLAIRFAYTS ;10 COLLERET ;32 COMPIEGNE ;1 CONDOM ;1 COUSOLRE ;63 CROIX CALUYAU ;3 DAMOUSIES ;3 DIMECHAUX ;1 DIMONT ;1 DOMPIERRE SUR HELPE ;17 DOUCHY LES MINES ;1 DOURLERS ;10 DOUZIES ;6 ECCLES ;1 ECLAIBES ;4 ECUELIN ;1 ELESMES ;3 ENGLEFONTAINE ;28 ENGLEFONTAINE ;1 EPPE SAUVAGE ;7 ETH ;1 ETROEUNGT ;28 FEIGNIES ;174 FELLERIES ;18 FERON ;6 FERRIERE LA GRANDE ;169 FERRIERE LA PETITE ;20 FLAUMONT WAUDRECHIES ;1 FLEURY D AUDE ;1 FLOURSIES ;4 FLOYON ;7 FONTAINE AU BOIS ;1 FOREST EN CAMBRESIS ;9 FOURMIES ;0 FOURMIES ;736 FRASNOY ;4 GHISSIGNIES ;1 GLAGEON ;51 GOGNIES CHAUSSEE ;7 GOMMEGNIES ;29 GRAND FAYT ;6 GUSSIGNIES ;2 HARGNIES ;6 HAUT LIEU ;1 HAUTMONT ;0 HAUTMONT ;814 HECQ ;3 HELLEMMES LILLE ;1 HERBIGNIES VILLEREAU ;1 HESTRUD ;8 HIRSON ;2 HON HERGIES ;9 HOUDAIN LEZ BAVAY ;10 JENLAIN ;19 JEUMONT ;0 JEUMONT ;564 JOLIMETZ ;5 LA FLAMENGRIE ;7 LA LONGUEVILLE ;24 LANDRECIES ;142 LAROUILLIES ;2 LE FAVRIL ;10 LE PUY EN VELAY ;1 LE QUESNOY ;0 LE QUESNOY ;130 LEVAL ;53 LEZ FONTAINE ;2 LIESSIES ;7 LILLE ;2 LIMONT FONTAINE ;7 LOCQUIGNOL ;5 LOUVIGNIES QUESNOY ;16 LOUVROIL ;0 LOUVROIL ;417 MAIRIEUX ;5 MARBAIX ;5 MARESCHES ;10 MARGNY LES COMPIEGNE ;1 MAROILLES ;31 MARPENT ;108 MAUBEUGE ;0 MAUBEUGE ;1709 MECQUIGNIES ;7 MEILLERIE ;1 MONCEAU ST WAAST ;8 MONTPELLIER FACULTES CCT1 ;0 MOUSTIER EN FAGNE ;2 NEUF MESNIL ;45 NEUVELLE LES CROMARY ;1 NOYELLES SUR SAMBRE ;3 OBIES ;9 OBRECHIES ;1 OHAIN ;17 ORSINVAL ;4 PELUSSIN ;1 PERPIGNAN ;2 PETIT FAYT ;2 POIX DU NORD ;38 PONT ST ESPRIT ;1 PONT SUR SAMBRE ;56 POTELLE ;3 PREUX AU BOIS ;0 PREUX AU BOIS ;13 PREUX AU SART ;4 PRISCHES ;12 QUIEVELON ;7 RAINSARS ;2 RAISMES ;1 RAMOUSIES ;1 RAUCOURT AU BOIS ;2 RECQUIGNIES ;0 RECQUIGNIES ;84 REIMS ;1 RIVESALTES ;1 ROBERSART ;3 ROUSIES ;89 RUESNES ;3 SAINS DU NORD ;87 SALESCHES ;2 SARS POTERIES ;45 SASSEGNIES ;2 SEMERIES ;6 SEMOUSIES ;2 SEPMERIES ;1 SOLRE LE CHATEAU ;41 SOLRINNES ;3 ST AMAND MONTROND ;1 ST AUBIN ;3 ST HILAIRE SUR HELPE ;11 ST REMY CHAUSSEE ;10 ST REMY DU NORD ;13 ST WAAST LA VALLEE ;8 TAISNIERES EN THIERACHE ;6 TAISNIERES SUR HON ;13 TRELON ;0 TRELON ;72 VALENCIENNES ;2 VENDEGIES AU BOIS ;5 VIEUX MESNIL ;4 VIEUX RENG ;13 VILLEREAU ;9 VILLERS POL ;13 VILLERS SIRE NICOLE ;15 WALLERS TRELON ;3 WARGNIES LE GRAND ;19 WARGNIES LE PETIT ;5 WATTIGNIES LA VICTOIRE ;1 WIGNEHIES ;116 WILLIES ;7
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 AIBES AMFROIPRET ANOR ASSEVENT AUDIGNIES AULNOYE AYMERIES AVESNELLES AVESNES SUR HELPE BACHANT BAIVES BAS LIEU BAVAY BEAUDIGNIES BEAUFORT BEAUREPAIRE SUR SAMBRE BEAURIEUX BELLIGNIES BERELLES BERLAIMONT BERMERIES BERSILLIES BETTIGNIES BETTRECHIES BEUGNIES BOULOGNE SUR HELPE BOUSIES BOUSIGNIES SUR ROC BOUSSIERES SUR SAMBRE BOUSSOIS BRY CARTIGNIES CERFONTAINE CHOISIES CLAIRFAYTS COLLERET COUSOLRE CROIX CALUYAU DAMOUSIES DIMECHAUX DIMONT DOMPIERRE SUR HELPE DOURLERS ECCLES ECLAIBES ECUELIN ELESMES ENGLEFONTAINE EPPE SAUVAGE ETH ETROEUNGT FEIGNIES FELLERIES FERON FERRIERE LA GRANDE FERRIERE LA PETITE FLAUMONT WAUDRECHIES FLOURSIES FLOYON FONTAINE AU BOIS FOREST EN CAMBRESIS FOURMIES FRASNOY GHISSIGNIES GLAGEON GOGNIES CHAUSSEE GOMMEGNIES GRAND FAYT GUSSIGNIES HARGNIES HAUT LIEU HAUTMONT HECQ HESTRUD HON HERGIES HOUDAIN LEZ BAVAY JENLAIN JEUMONT JOLIMETZ LA FLAMENGRIE LA LONGUEVILLE LANDRECIES LAROUILLIES LE FAVRIL LE QUESNOY LEVAL LEZ FONTAINE LIESSIES LIMONT FONTAINE LOCQUIGNOL LOUVIGNIES QUESNOY LOUVROIL MAIRIEUX MARBAIX MARESCHES MAROILLES MARPENT MAUBEUGE MECQUIGNIES MONCEAU ST WAAST MOUSTIER EN FAGNE NEUF MESNIL NEUVILLE EN AVESNOIS NOYELLES SUR SAMBRE OBIES OBRECHIES OHAIN ORSINVAL PETIT FAYT POIX DU NORD PONT SUR SAMBRE POTELLE PREUX AU BOIS PREUX AU SART PRISCHES QUIEVELON RAINSARS RAMOUSIES RAUCOURT AU BOIS RECQUIGNIES ROBERSART ROUSIES RUESNES SAINS DU NORD SALESCHES SARS POTERIES SASSEGNIES SEMERIES SEMOUSIES SEPMERIES SOLRE LE CHATEAU SOLRINNES ST AUBIN ST HILAIRE SUR HELPE ST REMY CHAUSSEE ST REMY DU NORD ST WAAST LA VALLEE TAISNIERES EN THIERACHE TAISNIERES SUR HON TRELON VENDEGIES AU BOIS VIEUX MESNIL VIEUX RENG VILLEREAU VILLERS POL VILLERS SIRE NICOLE WALLERS TRELON WARGNIES LE GRAND WARGNIES LE PETIT WATTIGNIES LA VICTOIRE WIGNEHIES WILLIES
Ceci fonctionne correctement:
Du point de vue de la performance, tu aurais avantage à remplacer ton tableau tab par un tableau trié (de manière à pouvoir effectuer une recherche dicotomique) ou par une table de hachage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define MY_BUFFER_SIZE 1024 #define NB_COMMUNES_MAX 160 /* définitions des types et variables associées */ typedef struct { char ville[100]; int nb; } rmi; /* -tc- Pourquoi tab est-il une variable locale. Je le passe dans main() rmi tab[160]; */ /* -tc- Elimine le caractere de fin de ligne saisi par fgets() et fait le menage sur le flux entrant en cas de saisie tronquee. */ void fclean(char *buffer, FILE *fp) { if (buffer != NULL && fp != NULL) { char *pc = strchr(buffer, '\n'); if (pc != NULL) { *pc = 0; } else { } } } /* -tc- Elimine les caracteres d'espacement en queue de chaine. */ char * str_rstrip(char *s) { if (s != NULL) { size_t len = strlen(s); size_t i = len - 1; while (i > 0 && isspace(s[i])) { i--; } s[i + 1] = 0; if (isspace(s[i])) { s[i] = 0; } } return s; } /* Fonction qui recopie un fichier contenant les noms des villes */ int file_copy(char nomfich[], rmi tab[], int taille) { FILE *fiche = NULL; char buffer[MY_BUFFER_SIZE] = ""; int i = 0; int cpt = 0; /* ----- Ouverture du fichier ----- */ fiche = fopen (nomfich, "r"); /* -tc- C'est un question de gout personnel, mais je prefere un test explicite tel que fichier == NULL a !fiche. */ if (!fiche) { /* Erreur: impossible d'ouvrir le fichier. */ fprintf(stderr, "Erreur: impossible d'ouvrir le fichie\n"); /* -tc- En general, je ne recommande poas l'emploi de return sauvages, mais c'est un style */ return -1; } while (fgets(buffer, MY_BUFFER_SIZE, fiche) && i < taille) { fclean(buffer, fiche); /* -tc- Attention a securiser la copie pour eviter les debordements. Pour ce faire, j'utilise strncat(). strcpy(tab[i].ville, buffer); */ tab[i].ville[0] = 0; strncat(tab[i].ville, buffer, sizeof tab[i].ville - 1); tab[i].nb = 0; cpt++; i++; } fclose(fiche); return cpt; } /* fonction qui affiche le tableau RMI */ void affichage_tab(rmi tab[], int cpt) { int i = 0; printf("____________________________________________________\n"); printf("| Ville Nombre de RMI |\n"); printf("|__________________________________________________|\n"); while (i < cpt) { printf("| %-37s", tab[i].ville); printf("%-4d |\n", tab[i].nb); i++; } printf("|__________________________________________________|\n\n"); } /* Fonction qui remplie le tableau celon le fichier de valeur */ int maj_tab(char nomfich[], rmi tab[], int cpt) { FILE *fiche = NULL; char buffer[MY_BUFFER_SIZE]; int i = 0; fiche = fopen(nomfich, "r"); if (!fiche) { /* Erreur: impossible d'ouvrir le fichier. */ fprintf(stderr, "Erreur: impossible d'ouvrir le fichien\n"); return -1; } /* On parcour le fichier */ while (fgets(buffer, MY_BUFFER_SIZE, fiche)) { char *ville = NULL; char *nombre = NULL; int nb; char *pend = NULL; fclean(buffer, fiche); /* -tc- On recupere le nom de la ville */ ville = strtok(buffer, ";"); str_rstrip(ville); /* -tc- On recupere le nombre */ nombre = strtok(NULL, ""); nb = strtol(nombre, &pend, 0); if (*pend != 0) { /* Erreur de format du fichier RMI */ fprintf(stderr, "Erreur de format du fichier RMI\n"); return -1; } /* On parcour le tableau de structure RMI pour mettre a jour Tab.nb */ for (i = 0; i < cpt; i++) { if (strcmp(tab[i].ville, ville) == 0) { tab[i].nb = nb; } } } fclose(fiche); return 0; } /* creation du fichier en sortie avec toutes les communes completees */ void fichier_sortie(rmi tab[], int cpt) { FILE *dst = NULL; int i; dst = fopen ("Denombrement_RMI.txt", "w"); if (dst) { for (i = 0; i < cpt; i++) { fprintf (dst, "%s;%d\n", tab[i].ville, tab[i].nb); } if (ferror (dst)) { fprintf(stderr, "Erreur lors de l'ecriture du fichier dst\n"); } fclose (dst); } } /* Partie statistique */ void affichage_stat(int cpt, rmi tab[]) { int total_rmi = 0; int i = 0; for (i = 0; i < cpt; i++) { if (tab[i].nb > 0) { total_rmi += tab[i].nb; } } printf("Ce mois ci, nous avons %d allocataires percevant le RMI pour %d communes\n", total_rmi, cpt); } int main(void) { char nomfich[20] = ""; int cpt; int val; rmi tab[NB_COMMUNES_MAX] = {{"", 0}}; printf ("Entrer le nom du fichier modele: "); /* -tc- On force l'affichage de l'invide en vidant le tampon du flux de sortie standard */ fflush(stdout); /* -tc- le spécificateur de format %s de scanf() attend qu'on lui passe un argument de type pointeur sur char. &nomfich n'est pas de type pointeur sur char (char *) mais pointeur sur tableau de 20 char. Ces type sont incompatibles et le compilateur gueule... avec raison! Pour des raisons de securite et de robustesse du code, je pense que scanf() n'est pas la fonction la plus adaptee pour saisir du texte a partir de stdin. La grande majorite du temps, il existe une meilleure solution: fgets(). scanf ("%s", nomfich); */ fgets(nomfich, sizeof nomfich, stdin); fclean(nomfich, stdin); cpt = file_copy(nomfich, tab, NB_COMMUNES_MAX); if (cpt > 0) { affichage_tab(tab, cpt); printf ("Entrer le nom du fichier RMI: "); /* -tc- On force l'affichage de l'invide en vidant le tampon du flux de sortie standard */ fflush(stdout); fgets(nomfich, sizeof nomfich, stdin); fclean(nomfich, stdin); val = maj_tab(nomfich, tab, cpt); if (val != -1) { affichage_tab(tab, cpt); fichier_sortie(tab, cpt); } affichage_stat(cpt, tab); /* -tc- Cette fonction n'appartient pas à la bibliothèque standard _getch(); */ } return 0; }
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Je te remercie.
Je viens de tester ton code mais ca me retourne un fichier qu'avec des 0 pour le nombre des rmi.
le probleme ne viendrais pas de?
Code : Sélectionner tout - Visualiser dans une fenêtre à part nombre = strtok(NULL, "");
Chez moi je n'ai pas de problème. D'abord, il te retourne le tableau avec des 0 partout. Ensuite, le programme te demande de saisir le nom du fichier RMI, puis afficher le contenu de tab mis à jour. Enfin, le programme enregiste le contenu de tab dans le fichier Denombrement_RMI.txt. Voici le fichier Denombrement_RMI.txt que j'obtient:
Ca me semble OK.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 AIBES;9 AMFROIPRET;3 ANOR;95 ASSEVENT;48 AUDIGNIES;1 AULNOYE AYMERIES;348 AVESNELLES;49 AVESNES SUR HELPE;1 BACHANT;64 BAIVES;2 BAS LIEU;3 BAVAY;2 BEAUDIGNIES;6 BEAUFORT;12 BEAUREPAIRE SUR SAMBRE;6 BEAURIEUX;2 BELLIGNIES;12 BERELLES;2 BERLAIMONT;89 BERMERIES;11 BERSILLIES;1 BETTIGNIES;4 BETTRECHIES;2 BEUGNIES;7 BOULOGNE SUR HELPE;2 BOUSIES;41 BOUSIGNIES SUR ROC;4 BOUSSIERES SUR SAMBRE;6 BOUSSOIS;106 BRY;1 CARTIGNIES;8 CERFONTAINE;7 CHOISIES;1 CLAIRFAYTS;10 COLLERET;32 COUSOLRE;63 CROIX CALUYAU;3 DAMOUSIES;3 DIMECHAUX;1 DIMONT;1 DOMPIERRE SUR HELPE;17 DOURLERS;10 ECCLES;1 ECLAIBES;4 ECUELIN;1 ELESMES;3 ENGLEFONTAINE;1 EPPE SAUVAGE;7 ETH;1 ETROEUNGT;28 FEIGNIES;174 FELLERIES;18 FERON;6 FERRIERE LA GRANDE;169 FERRIERE LA PETITE;20 FLAUMONT WAUDRECHIES;1 FLOURSIES;4 FLOYON;7 FONTAINE AU BOIS;1 FOREST EN CAMBRESIS;9 FOURMIES;736 FRASNOY;4 GHISSIGNIES;1 GLAGEON;51 GOGNIES CHAUSSEE;7 GOMMEGNIES;29 GRAND FAYT;6 GUSSIGNIES;2 HARGNIES;6 HAUT LIEU;1 HAUTMONT;814 HECQ;3 HESTRUD;8 HON HERGIES;9 HOUDAIN LEZ BAVAY;10 JENLAIN;19 JEUMONT;564 JOLIMETZ;5 LA FLAMENGRIE;7 LA LONGUEVILLE;24 LANDRECIES;142 LAROUILLIES;2 LE FAVRIL;10 LE QUESNOY;130 LEVAL;53 LEZ FONTAINE;2 LIESSIES;7 LIMONT FONTAINE;7 LOCQUIGNOL;5 LOUVIGNIES QUESNOY;16 LOUVROIL;417 MAIRIEUX;5 MARBAIX;5 MARESCHES;10 MAROILLES;31 MARPENT;108 MAUBEUGE;1709 MECQUIGNIES;7 MONCEAU ST WAAST;8 MOUSTIER EN FAGNE;2 NEUF MESNIL;45 NEUVILLE EN AVESNOIS;0 NOYELLES SUR SAMBRE;3 OBIES;9 OBRECHIES;1 OHAIN;17 ORSINVAL;4 PETIT FAYT;2 POIX DU NORD;38 PONT SUR SAMBRE;56 POTELLE;3 PREUX AU BOIS;13 PREUX AU SART;4 PRISCHES;12 QUIEVELON;7 RAINSARS;2 RAMOUSIES;1 RAUCOURT AU BOIS;2 RECQUIGNIES;84 ROBERSART;3 ROUSIES;89 RUESNES;3 SAINS DU NORD;87 SALESCHES;2 SARS POTERIES;45 SASSEGNIES;2 SEMERIES;6 SEMOUSIES;2 SEPMERIES;1 SOLRE LE CHATEAU;41 SOLRINNES;3 ST AUBIN;3 ST HILAIRE SUR HELPE;11 ST REMY CHAUSSEE;10 ST REMY DU NORD;13 ST WAAST LA VALLEE;8 TAISNIERES EN THIERACHE;6 TAISNIERES SUR HON;13 TRELON;72 VENDEGIES AU BOIS;5 VIEUX MESNIL;4 VIEUX RENG;13 VILLEREAU;9 VILLERS POL;13 VILLERS SIRE NICOLE;15 WALLERS TRELON;3 WARGNIES LE GRAND;19 WARGNIES LE PETIT;5 WATTIGNIES LA VICTOIRE;1 WILLIES;7 WIGNEHIES;116
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
En effet tes résultats me semble correcte.
Tu utilises quel compilateur? J'utilise dev c++.
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager