Ik ben een programma aan het schrijven om het verbeteren van dactylo oefeningen gemakkelijker te maken maar ik ben ergens in de mist gegaan met het doorgeven van waardes aan functies.
Het programma werkt als volgt :
Eerst word het orginele bestand ingelezen in een array van woorden.
Dan word het te verbeteren bestand gefiltert om het te veel aan spaties te verwisselen door _. Dit omdat ook spaties een fout moet zijn.
Dan word de te verbeteren tekst ook in een array van woorden gezet
vervolgens ga ik alle woorden controleren en indien nodig fouten bijhouden.
Nu het probleem zit hem volgens mij in het feit dat die array's, die overigens dynamisch worden gemaakt, by value worden doorgegeven ipv by reference want in de functie fillarray worden ze gevult maar ik kan in mijn main geen waarde meer uit die array krijgen. Dit geldt ook voor checkArray en compareWord. Volgens mij word er iedere keer een copie van mijn array's gemaakt ipv mijn orginele te gebruiken die in main zijn aangemaakt.
Ik weet dat dit waarschijnlijk een slecht geprogrammeerd en waarschijnlijk buggy programma is maar dit is de eerste keer dat ik in C iets maak en ken er dus ook niet al te veel van.
Hieronder de code van het programma :
Hier vind je de bestanden van het programma even allemaal.
Het programma werkt als volgt :
Eerst word het orginele bestand ingelezen in een array van woorden.
Dan word het te verbeteren bestand gefiltert om het te veel aan spaties te verwisselen door _. Dit omdat ook spaties een fout moet zijn.
Dan word de te verbeteren tekst ook in een array van woorden gezet
vervolgens ga ik alle woorden controleren en indien nodig fouten bijhouden.
Nu het probleem zit hem volgens mij in het feit dat die array's, die overigens dynamisch worden gemaakt, by value worden doorgegeven ipv by reference want in de functie fillarray worden ze gevult maar ik kan in mijn main geen waarde meer uit die array krijgen. Dit geldt ook voor checkArray en compareWord. Volgens mij word er iedere keer een copie van mijn array's gemaakt ipv mijn orginele te gebruiken die in main zijn aangemaakt.
Ik weet dat dit waarschijnlijk een slecht geprogrammeerd en waarschijnlijk buggy programma is maar dit is de eerste keer dat ik in C iets maak en ken er dus ook niet al te veel van.
Hieronder de code van het programma :
C:
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
| /* Created by Anjuta version 1.2.2 */ /* This file will not be overwritten */ #include <stdio.h> #include <stdlib.h> #include <string.h> // misch is dit niet zo'n schone oplossing maar het vergemakkelijkt de oplossing // wel. Nu moet ik geen dynamische 2 dimensionale array gaan maken om die // woorden op te slaan :) typedef struct woord { char woord[50]; } woord; FILE *fjuist; // het bestand met de juiste versie FILE *fteverbeteren; // het bestand dat moet verbeterd worden FILE *fout; FILE *fres; // hier worden de resultaten naartoe geschreven char foutFileName[20] = "teverbeteren.txt"; char juistFileName[20] = "origineel.txt"; char outputFileName[20] = "out.txt"; char outputResFileName[20] = "resultaten.txt"; char spatie = '_'; // prototypes van de functies :) void filterSpaces(FILE *file, FILE *outfile, char spaceVar); short fillArray(FILE *file, woord *array); void checkArray(woord *arrayFout,short narrayFout, woord *arrayOrgineel, short narrayOrgineel, FILE *output); short compareWord(char orgineel[50],char fout[50]); int main(void) { // geheugen vrijmaken voor het eerste element van de array woord *foutarray = (woord *) malloc(sizeof(woord)); short nfoutarray = 1; woord *juistarray = (woord *) malloc(sizeof(woord)); short njuistarray = 1; // het orgineel in een array steken if ( (fjuist = fopen(juistFileName,"r")) != NULL ) { njuistarray = fillArray(fjuist,juistarray); fclose(fjuist); } // te verbeteren openen if ( (fteverbeteren = fopen(foutFileName,"r") ) != NULL && (fout = fopen(outputFileName,"w+")) != NULL && (fres = fopen(outputResFileName,"w+")) != NULL) { filterSpaces(fteverbeteren,fout,spatie); rewind(fout); nfoutarray = fillArray(fout,foutarray); printf("aantal woorden :) %d\n",nfoutarray); checkArray(foutarray,nfoutarray,juistarray,njuistarray,fres); } return (0); } /* Naam functie : filterSpaces Auteur : Ti_Uhl Argumenten : *file : het bestand dat moet gefilterd worden *outfile : bestand naarwaar de gefilterde tekst moet geschreven worden spaceVar : karakter dat de spaces moet verangen Doel : Vervangt de spaties die te veel zijn in $file met spaceRep en schrijft het bestand weg naar *outfile */ void filterSpaces(FILE *file, FILE *outfile, char spaceVar) { // local vars long currentPointer; char currentChar; char nextChar; while ( !feof(file) ) { currentChar = fgetc(file); if ( currentChar == ' ' ) { // we onthouden de filepointer en kijken eerst ff na of de volgende // ook een spatie is :) currentPointer = ftell(file); nextChar = fgetc(file); if (nextChar == ' ') { // we gaan de vorige op _ zetten :) currentChar = spaceVar; } // we gaan terug op de juiste pos staan :) fseek(file,currentPointer,SEEK_SET); } fputc((int)currentChar,outfile); } } /* Naam functie : fillArray Auteur : Ti_Uhl Argumenten : *file : het bestand dat in de array moet geplaatst worden *array : de array waarin het bestand moet gestoken worden Doel : Deze functie leest het bestand in en plaatst alle woorden in een array. TODO : Deze functie moet nog aangepast worden zodat de woorden niet meer in een char[50] worden gestoken want dit kan wel eens veel te veel geheugen gaan vreten dan nodig :) */ short fillArray(FILE *file, woord *array) { short i=0; short n = 1; // voor een of andere reden moet ik die while zo schrijven anders probeert // nog verder te lezen dan de tekst lang is :) while ( ( (fscanf(file,"%s",array[i].woord)) != 0 ) && !feof(file) ) { //fscanf(file,"%s",array[i].woord); printf("%s\n",array[i].woord); array = ( woord *) realloc(array,(++i +1) * sizeof(woord)); n++; } return(n); } /* Naam functie : checkArray Auteur : Ti_Uhl Argumenten : *arrayfout : de array met de te verbeteren woorden *narrayfout : element count van arrayfout *arrayorgineel : de array met de orginele woorden *narrayorgineel : element count van arrayorgineel *output : het bestand naarwaar de resultaten moeten geschreven worden Doel : Controleert alle woorden op fouten en schrijft de resultaten weg naar output */ void checkArray(woord *arrayFout, short narrayFout, woord *arrayOrgineel, short narrayOrgineel, FILE *output) { short i=0; short totSpatieFout = 0; short totCharFout = 0; short foutcode = 0; short aangSpatieFout = 0; short aangCharFout = 0; short tempSpatieFout = 0; short tempCharFout = 0; for (i=0;i<narrayFout;i++) { foutcode = compareWord(arrayFout[i].woord,arrayOrgineel[i].woord); tempSpatieFout = foutcode / 10; tempCharFout = foutcode % 10; printf("%d : %s : %s\n",i,arrayOrgineel[i].woord,arrayFout[i].woord); printf("Spatiefout : %d ",tempSpatieFout); printf("Charfout : %d\n",tempCharFout); if (tempSpatieFout != 0) { aangSpatieFout++; } if (tempCharFout != 0) { aangCharFout++; } totSpatieFout += tempSpatieFout; totCharFout += totCharFout; } // ff alles naar res bestand schrijve ;) fprintf(output,"----------------------------------------------\n"); fprintf(output,"Bestandsnaam : %s\n",outputResFileName); fprintf(output,"tijdstip creatie : %s\n",outputResFileName); fprintf(output,"tijdstip correctie : %s\n",outputResFileName); fprintf(output,"Filesize : %s\n",outputResFileName); fprintf(output,"Aantal karakters : %s\n",outputResFileName); fprintf(output,"Aantal effectieve fouten.\n"); fprintf(output,"---------------------------\n"); fprintf(output,"spatiefouten : %d\n",totSpatieFout); fprintf(output,"karakter fouten : %d\n",totCharFout); fprintf(output,"Aantal aangerekende fouten.\n"); fprintf(output,"---------------------------\n"); fprintf(output,"spatiefouten : %d\n",aangSpatieFout); fprintf(output,"karakter fouten : %d\n",aangCharFout); } /* Naam functie : compareWord Auteur : Ti_Uhl Argumenten : orgineel : het orginele woord fout : het foute woord Doel : Deze functie controleert of 2 woorden juist zijn. Return value : 0 : de woorden zijn identiek en juist 1 : en zijn karakters verkeerd in het woord 2 : er is een spatie fout. Let er op dat 2 spaties na een . juist zijn volgens de criteria van de opgave !! :) */ short compareWord(char orgineel[50],char fout[50]) { int i = 0; int retVal =0; int loops = 0; printf("cmpw : %s : %s\n",orgineel,fout); // aantal loops bepalen :) if ( strlen(orgineel) > strlen(fout) ) { loops = strlen(orgineel); } else { loops = strlen(fout); } for (i=0;i<loops;i++) { if (fout[i] != orgineel[i]) { if (fout[i] == spatie && i != 0) { if ( fout[i-1] == '.' || fout[i-2] == '.' ) { retVal = 0; } else { retVal +=10 ; } } else { retVal += 1; } } } return(retVal); } |
Hier vind je de bestanden van het programma even allemaal.