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

Last change on this file since 150 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
Line 
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.