(dit is een huiswerktopic)
Hallo allen,
In het volgende C++ programmeerwerkje was het de bedoeling om bestanden dmv Run Length Encoding te compressen. Voor degenen die er niet mee bekend zijn, dit houdt in dat een string als aaaaabbbbbb87324 naar het volgende wordt gecomprimeerd: a5b6\8\7\3\2\4
Dus vijf a'tjes wordt vervangen door a5, zes b'tjes wordt b6 en voor alle getallen en backslashes komt een backslash te staan om het zodoende te kunnen onderscheiden. Voor het gemak heeft onze leraar nog bedacht dat het wel leuk was om die getallen om te keren, dus aaaaaaaaaaaa wordt a21 in plaats van a12.
Nu werkt ons coderen perfect, maar bij het decoderen (line 121-176) gaat het mis zodra er slashes in het spel komen. Wat er gebeurt is het volgende:
- Er wordt bijvoorbeeld een string als a7959dddd gecomprimeerd. Dit geeft als resultaat a\7\9\5\9d4.
- Als we dan weer gaan decoderen, denkt het programma dat \7 betekent dat er 7 slashes moeten komen, waardoor het bestand overspoeld wordt met backslashes
Dit zal ongetwijfeld een klein, dom foutje zijn, maar we komen er niet meer uit (eerstejaars studenten he
)
We hebben hier in ons werkcollege uren mee zitten stoeien, Rosetta heeft ons niet geholpen (die gebruikt een of andere rare library) en ook de student-assistent wist niet precies hoe hij dit nou op kon lossen. We hebben al vooruitgang geboekt, eerst bleef het programma namelijk zevens uitspugen als het een \7 tegenkwam..
Als er iemand is die tijd en zin heeft om een kijkje te nemen en ons een stapje in de goede richting kan helpen (tenslotte moeten we dit wel zelf bedenken op het tentamen), zijn we al heel gelukkig
Alvast bedankt!
Decodeer-functie:
omgekeerd-decodeerfunctie
Hallo allen,
In het volgende C++ programmeerwerkje was het de bedoeling om bestanden dmv Run Length Encoding te compressen. Voor degenen die er niet mee bekend zijn, dit houdt in dat een string als aaaaabbbbbb87324 naar het volgende wordt gecomprimeerd: a5b6\8\7\3\2\4
Dus vijf a'tjes wordt vervangen door a5, zes b'tjes wordt b6 en voor alle getallen en backslashes komt een backslash te staan om het zodoende te kunnen onderscheiden. Voor het gemak heeft onze leraar nog bedacht dat het wel leuk was om die getallen om te keren, dus aaaaaaaaaaaa wordt a21 in plaats van a12.
Nu werkt ons coderen perfect, maar bij het decoderen (line 121-176) gaat het mis zodra er slashes in het spel komen. Wat er gebeurt is het volgende:
- Er wordt bijvoorbeeld een string als a7959dddd gecomprimeerd. Dit geeft als resultaat a\7\9\5\9d4.
- Als we dan weer gaan decoderen, denkt het programma dat \7 betekent dat er 7 slashes moeten komen, waardoor het bestand overspoeld wordt met backslashes
Dit zal ongetwijfeld een klein, dom foutje zijn, maar we komen er niet meer uit (eerstejaars studenten he
We hebben hier in ons werkcollege uren mee zitten stoeien, Rosetta heeft ons niet geholpen (die gebruikt een of andere rare library) en ook de student-assistent wist niet precies hoe hij dit nou op kon lossen. We hebben al vooruitgang geboekt, eerst bleef het programma namelijk zevens uitspugen als het een \7 tegenkwam..
Als er iemand is die tijd en zin heeft om een kijkje te nemen en ons een stapje in de goede richting kan helpen (tenslotte moeten we dit wel zelf bedenken op het tentamen), zijn we al heel gelukkig
Alvast bedankt!
Decodeer-functie:
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
| void decodeer(ifstream &invoer, ofstream &uitvoer){ char prevkar = '$'; //vorige karakter (voor vergelijking); $ = default char kar; //huidig karakter int n = 0; // teller voor hoe vaak een karakter nog uitgevoerd moet worden int aantalTekensUit = 0; //teller voor grootte outputbestand int tellertje = 0; //teller voor voorloopnullen char onthoudLetter = '@'; //als een letter onthouden moet worden gebruiken we deze bool dubbelebackslash = false; //bool voor dubbele backslashes int aantalslash = 0; //aantal slashes dat de decodeerder tegenkomt kar = invoer.get(); while (!invoer.eof()) { if (kar == '0') tellertje++; if (kar == '\\') aantalslash++; else if (prevkar != '\\') aantalslash = 0; if (isGetal(kar) && (prevkar != '\\' || dubbelebackslash)) n = 10*n + kar-'0'; else { n = omgekeerdDecodeer(n, tellertje); tellertje = 0; while (n > 1){ uitvoer << onthoudLetter; n--; cout << "ik zit in de while" << endl; }//while n = 0; onthoudLetter = kar; if (aantalslash != 1) uitvoer.put(kar); }//else if (aantalslash == 2) dubbelebackslash = true; else dubbelebackslash = false; aantalTekensUit++; prevkar = kar; kar = invoer.get(); }//while } |
omgekeerd-decodeerfunctie
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| int omgekeerdDecodeer(int getal, int nullen){ int omkeerhulpje = 0; //zorgt voor afhandeling voorloopnullen while (getal > 0){ omkeerhulpje *= 10; omkeerhulpje += laatsteCijfer(getal); getal /= 10; }//while while (nullen > 0){ omkeerhulpje *= 10; nullen--; }//while return omkeerhulpje; }// omgekeerdDecodeer |
[ Voor 39% gewijzigd door laurenssie op 15-10-2012 16:05 ]