source: liacs/pm/backup/opdr2-3.cc@ 2

Last change on this file since 2 was 2, checked in by Rick van der Zwet, 15 years ago

Initial import of data of old repository ('data') worth keeping (e.g. tracking
means of URL access statistics)

  • Property svn:executable set to *
File size: 10.0 KB
RevLine 
[2]1#include <iostream>
2#include <string>
3#include <fstream>
4
5using namespace std;
6
7
8
9void Intro()
10{
11
12 cout << "---------------------------------------------------" << endl
13 << "| University of Leiden |" << endl
14 << "| Programmeermethoden opdracht 2 |" << endl
15 << "| |" << endl
16 << "| Gemaakt door: |" << endl
17 << "| Rick van der Zwet |" << endl
18 << "| Pascal de Vos |" << endl
19 << "| |" << endl
20 << "| |" << endl
21 << "| Getest op: Unix systeem (Sun OS) |" << endl
22 << "| Windows XP (Dev-C++ 4.9.9.0) |" << endl
23 << "| Freebsd 5.2.1-r11 gcc version 3.3.3 |" << endl
24 << "---------------------------------------------------" << endl
25 << endl;
26}
27
28
29//Laat de statistieken op het scherm zien
30void Statistiek(double TotaalCodeTekens, double TotaalGewoneTekens, double TotaalGewisteTekens, int RegelNummers, int LangsteRegelNummer, int LangsteRegelAantalTekens)
31{
32 cout << "Aantal gecopierde tekens : " << TotaalGewoneTekens << endl
33 << "Aantal gecodeerde tekens : " << TotaalCodeTekens << endl
34 << "Aantal gewiste tekens : " << TotaalGewisteTekens << endl
35 << "Aantal Regels : " << RegelNummers <<endl
36 << "Langste Regels : " << LangsteRegelNummer << " heeft " << LangsteRegelAantalTekens << " tekens" << endl;
37
38}
39
40//SoortCrypt 1 = Encoderen, 2 = Decoderen
41
42int Crypt(int SoortCrypt, string FileName, string FileNameOutput, string passwd, bool Statistieken, int RegelBegin, int RegelEind)
43{
44 //encode variablen
45 char ch = ' ';
46 int LetterPositie = 0;
47 int StringLengte = passwd.length() - 1;
48 int SlashAantal = 0;
49 bool Loop = false;
50
51 //decode variablen
52 int DecodedChar = 0;
53
54 //statistieken gedeelde
55 int AantalTekens = 0;
56 int LangsteRegelAantalTekens = 0;
57 int RegelNummer = 1;
58 int LangsteRegelNummer = 1;
59
60 double TotaalGewisteTekens = 0;
61 double TotaalCodeTekens = 0;
62 double TotaalGewoneTekens = 0;
63 if (RegelEind < RegelBegin)
64 {
65 cout << "ERROR in invoer van regelnummers" << endl;
66 return(0);
67 }
68
69 ifstream Invoer(FileName.c_str(), ios::in);
70 ofstream Uitvoer(FileNameOutput.c_str(), ios::out);
71
72 //deel 1
73 //niet coderen zolang gewenste niet bereikt is while (RegelNummer < RegelBegin)
74 while (RegelNummer < RegelBegin)
75 {
76 if (Invoer.get(ch))
77 {
78 TotaalGewoneTekens++; //Tekens tellen
79 if (ch == 10)
80 {
81 RegelNummer++; // Regels Tellen
82 }
83 Uitvoer.put(ch); // code copieren
84 }
85 else // alle tekens van de file gehad of error in ophalen, netjes afsluiten
86 {
87 Invoer.close();
88 Uitvoer.close();
89 if (Statistieken)
90 {
91 Statistiek(TotaalCodeTekens, TotaalGewoneTekens, TotaalGewisteTekens, RegelNummer, LangsteRegelNummer, LangsteRegelAantalTekens);
92 return(0);
93 }
94 }
95 } //end deel1
96
97
98 //deel 2
99 //coderen of decoderen al naargelang gewenst is.
100 if (SoortCrypt == 1)
101 {
102 while (RegelNummer <= RegelEind) //dit is het gedeelte wat versleuteld moet worden.
103 {
104 if (Invoer.get(ch))
105 {
106 //statistieken gedeelde
107 AantalTekens++;
108 if ( ch == 10)
109 {
110 RegelNummer++;
111 TotaalCodeTekens += AantalTekens;
112 if (AantalTekens > LangsteRegelAantalTekens)
113 {
114 LangsteRegelAantalTekens = AantalTekens;
115 LangsteRegelNummer = RegelNummer;
116 }
117 AantalTekens = 0;
118 }
119 if (ch == 47) //char is een slash
120 {
121 SlashAantal++;
122 if (SlashAantal == 2) //als er 2 slashjes achter elkaar staan
123 {
124 Loop = true;
125 TotaalGewisteTekens += 2;
126 while(Loop == true) // ga net zolang char's uitlezen tot je aan het eind van de regel bent
127 {
128 TotaalGewisteTekens++;
129 Invoer.get(ch);
130 if (ch == 13)
131 {
132 Uitvoer.put(ch);
133 Invoer.get(ch); //aanname LF na CR (Windows)
134 }
135 if (ch == 10)
136 {
137 Uitvoer.put(ch);
138 Loop = false;
139 RegelNummer++;
140 TotaalCodeTekens += AantalTekens;
141 if (AantalTekens > LangsteRegelAantalTekens)
142 {
143 LangsteRegelAantalTekens = AantalTekens;
144 LangsteRegelNummer = RegelNummer;
145 }
146 AantalTekens = 0;
147 }
148 }
149 SlashAantal = 0;
150 }
151 }
152 else //char is geen slash
153 {
154 if (SlashAantal == 1) // er is maar een slash gevonden. Zorg er voor dat die toegevoegd aan de file wordt
155 {
156 Uitvoer.put(passwd[LetterPositie] - 'a' + '/');
157 if (LetterPositie < StringLengte) { LetterPositie++; } else { LetterPositie = 0; }
158 SlashAantal = 0;
159 }
160
161 if (( ch <= '~' ) && ( ch >= ' '))
162 {
163 int EncodedChar = int(passwd[LetterPositie] - 'a' + ch);
164 if (EncodedChar > 126 )
165 {
166 EncodedChar = EncodedChar - 95;
167 }
168 Uitvoer.put(EncodedChar);
169 if (LetterPositie < StringLengte) { LetterPositie++; } else { LetterPositie = 0; }
170 }
171 else
172 {
173 Uitvoer.put(ch);
174 }
175 }
176 }
177 else //File is klaar
178 {
179 Invoer.close();
180 Uitvoer.close();
181 if (Statistieken)
182 {
183 Statistiek(TotaalCodeTekens, TotaalGewoneTekens, TotaalGewisteTekens, RegelNummer, LangsteRegelNummer, LangsteRegelAantalTekens);
184 }
185 return(0);
186 }
187
188 }
189 }
190 else if (SoortCrypt == 2)
191 {
192 while (RegelNummer <= RegelEind) // zolang gewenste regel nog niet is bereikt
193 {
194 if (Invoer.get(ch))
195 {
196 AantalTekens++;
197 if ( ch == 10)
198 {
199 RegelNummer++;
200 TotaalCodeTekens += AantalTekens;
201 if (AantalTekens > LangsteRegelAantalTekens)
202 {
203 LangsteRegelAantalTekens = AantalTekens;
204 LangsteRegelNummer = RegelNummer;
205 }
206 AantalTekens = 0;
207 }
208
209 if (( ch <= '~' ) && ( ch >= ' '))
210 {
211 DecodedChar = int( ch - (passwd[LetterPositie] - 'a'));
212
213 if (LetterPositie < StringLengte) { LetterPositie++; } else { LetterPositie = 0; }
214
215 if (DecodedChar < 32 )
216 {
217 DecodedChar = DecodedChar + 95;
218 }
219 cout << ch << " wordt " << DecodedChar << " wat is " << char(DecodedChar) << endl;
220 Uitvoer.put(DecodedChar);
221 }
222 else
223 {
224 Uitvoer.put(ch);
225 }
226 }
227 else
228 {
229 Invoer.close();
230 Uitvoer.close();
231 if (Statistieken)
232 {
233 Statistiek(TotaalCodeTekens, TotaalGewoneTekens, TotaalGewisteTekens, RegelNummer, LangsteRegelNummer, LangsteRegelAantalTekens);
234 }
235
236 return(0);
237 }
238 }
239 }
240
241 while (Invoer.get(ch)) // Laatste deel wegschrijven
242 {
243 TotaalGewoneTekens++;
244 if (ch == 10)
245 {
246 RegelNummer++;
247 }
248 Uitvoer.put(ch);
249 }
250 Invoer.close();
251 Uitvoer.close();
252 if (Statistieken)
253 {
254 Statistiek(TotaalGewoneTekens, TotaalCodeTekens, TotaalGewisteTekens, RegelNummer, LangsteRegelNummer, LangsteRegelAantalTekens);
255 }
256return(0);
257} //end Crypt
258
259
260//INVOER: Bestandnaam, woord te controleren, Of het woord vrij moet staan of niet.
261//UITVOER: Aantal keer dat het voorkomt.
262
263
264int WoordZoeken(string FileName, string Woord)
265{
266 int AantalKeerWoord = 0;
267 int LetterPositie = 0;
268 char ch = ' ';
269 bool GeldigeChar = true; //Als deze true is dan is er een geldig teken dat voor een woord mag staan
270
271 const int WoordLengte = Woord.length(); //deze blijft altijd identiek dus geen variable
272
273 ifstream Invoer(FileName.c_str(),ios::in);
274
275 while (Invoer.get(ch)) //zolang file invoer heeft
276 {
277 if (LetterPositie == WoordLengte) //controleer of er een match is.
278 {
279 if ((ch < 'A') || ((ch > 'Z') && (ch <'a')) || ch > 'z') //er geen [a-z,A-Z] achter staat.
280 {
281 AantalKeerWoord++;
282 }
283 LetterPositie = 0;
284
285 }
286
287 if ((ch == char(Woord[LetterPositie])) && GeldigeChar) //kijk of een character overeen komt met de gezochte in het woord
288 {
289 LetterPositie++;
290 }
291 else if (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z'))) //anders teller resetten
292 {
293 LetterPositie = 0;
294 GeldigeChar = false;
295 }
296 else
297 {
298 GeldigeChar = true;
299 }
300 }
301 Invoer.close();
302 return(AantalKeerWoord);
303
304} //end WordCheck
305
306int main()
307{
308 char GekozenOptie = ' ';
309 string FileName = "";
310 int BeginRegel = 0;
311 int EindRegel = 0;
312 string FileNameOutput = "";
313 string Passwd = "";
314 string ZoekWoord = "";
315 // Menu opties: (1) Encoderen
316 // (2) Decoderen
317 // (1) --> FileName invoeren --> encodeer sleutel invoeren
318 // (2) --> FileName invoeren --> decodeer sleutel invoeren
319
320 Intro();
321 cout << "Kies uit de volgende opties:" << endl
322 << "Encodeer een file (1)" << endl
323 << "Decodeer een file (2)" << endl
324 << "Beeindig het programma (q)" << endl
325 << endl;
326
327 cout << "Keuze: ";
328
329 cin >> GekozenOptie;
330
331 if ((GekozenOptie != '1') && (GekozenOptie != '2'))
332 {
333 cout << "\nGoodbye\n";
334 return(0);
335 }
336
337 cout << endl << "Voer Invoer Bestandsnaam in: ";
338 cin >> FileName;
339 cout << endl << "Voer beginregel in: ";
340 cin >> BeginRegel;
341 cout << endl << "Voer eindregel in: ";
342 cin >> EindRegel;
343 cout << endl << "Voer Uitvoer Bestandsnaam in: ";
344 cin >> FileNameOutput;
345 cout << endl << "Voer uw wachtwoord in: ";
346 cin >> Passwd;
347 cout << endl << "Voor uw zoekwoord in (if) : "; //oftewel 'if teller'
348 cin >> ZoekWoord;
349
350 //Het woord moet geteld worden voordat er geencodeerd wordt, bij decoderen moet het na het decoderen gebeuren
351
352 if (GekozenOptie == '1') //door naar encoderen, filenamevrag in encoderen verwerken
353 {
354 Crypt(1, FileName, FileNameOutput, Passwd, "true", BeginRegel, EindRegel);
355 cout << "Het woord '" << ZoekWoord << "' komt "<< WoordZoeken(FileName, ZoekWoord) << " keer voor in "<< FileName << endl;
356 }
357 else
358 {
359 Crypt(2, FileName, FileNameOutput, Passwd, "true", BeginRegel, EindRegel);
360 cout << "Het woord '" << ZoekWoord << "' komt "<< WoordZoeken(FileNameOutput, ZoekWoord) << " keer voor in " << FileNameOutput << endl;
361 }
362 //windows hack
363 cin.clear();
364 cin.ignore(30, '\n');
365 return(0);
366}
367
368
Note: See TracBrowser for help on using the repository browser.