Programmeermethoden 2010
Tweede programmeeropgave: (De)Coderen
De
tweede programmeeropgave van het vak
Programmeermethoden
in het najaar van 2010
heet
(De)Coderen;
zie ook het
vierde werkcollege,
vijfde werkcollege
(de betreffende WWW-bladzijde bevat handige
tips evenals testfiles — te zijner tijd!)
en
zesde werkcollege,
en lees geregeld deze pagina op WWW.
Spreek/Vragenuur in zalen 302 ... 309:
dinsdag 28, woensdag 29, donderdag 30 september, dinsdag 5, woensdag 6, donderdag 7,
dinsdag 12, woensdag 13, donderdag 14
en vrijdag 15 oktober 2010, van circa
15.30 tot 17.00 uur.
De compressietechnieken
GIF en
JPEG
dreigen steeds
duurder te worden. We gaan het nu dus maar zelf doen.
Voor de tweede programmeeropgave moet een programma worden
geschreven dat een file kan coderen en decoderen.
Aan de gebruiker wordt gevraagd of het
om coderen of decoderen gaat en hoe de originele (bestaande) file en de
"doelfile" heten.
De compressierate (de verhouding tussen
het totale aantal karakters van doelfile en oorspronkelijke file)
moet na afloop op het beeldscherm afgedrukt
worden, evenals het totaal aantal regels.
(Overigens, het aantal ingelezen karakters kan wat schelen tussen verschillende systemen.)
Het coderen geschiedt regel voor regel, en gaat als volgt.
Iedere opeenvolging van k (groter dan of gelijk aan 2)
dezelfde karakters binnen een regel
wordt vervangen door dat karakter onmiddellijk gevolgd door het
getal k.
Een enkel karakter blijft onveranderd,
evenals regelovergangen.
Zo wordt de te coderen regel
Eet meer zeeegels gecodeerd als Eet me2r 10ze3gels
(in de originele zin staan blijkbaar tien spaties tussen meer en zeeegels).
Om later te kunnen decoderen hadden we moeten aannemen dat er
geen cijfers in de regel staan,
immers wat zou anders de codering e234 betekenen —
twee e's en vier 3-en of 234 e's?
Om dat probleem op te lossen
worden gecodeerde cijfers voorafgegaan door
een \ (backslash).
De backslash zelf wordt met twee backslashes gecodeerd.
Zo moet ABC11123ddd\efG\\\1
gecodeerd worden als
ABC\13\2\3d3\\efG\\3\1.
Deze codering heet officieel run-length encoding.
Ter verdere inspiratie een tweetal voorbeelden:
Stel eenvoudige vragen om gegevens, zoals filenamen, van de gebruiker te
weten te komen.
Het programma leest dan eenmalig de opgegeven invoerfile,
en schrijft de uitvoer symbool voor symbool weg naar de uitvoerfile.
Elk symbool uit de invoerfile mag en moet
één maal (met invoer.get (...)) gelezen worden.
Opmerkingen
-
We nemen aan dat de gebruiker zo vriendelijk is verder geen
fouten te maken bij het invoeren van gegevens.
De invoerfiles mogen maar één maal gelezen worden.
We nemen verder aan dat karakters niet vaker dan 10000 keer direct
naast elkaar voorkomen.
-
Gebruik de regelstructuur: elke regelovergang in een bestand bestaat
uit een LineFeed
(\n) (in UNIX) of een CarriageReturn gevolgd door een LineFeed
(\r\n) (in DOS/Windows).
Normaal gesproken gaat dit "vanzelf" goed.
We nemen aan dat er voor het EndOfFile-symbool (wat dat ook moge zijn)
een regelovergang staat.
-
Alleen voor de namen van de files
mag een array (of string) gebruikt worden;
voor het lezen
en verwerken van de tekst is slechts het huidige karakter en
enige kennis over de voorgaande karakters nodig.
Alleen de headerfiles iostream en fstream
mogen gebruikt worden (en string
voor de filenamen; denk in dat geval aan het gebruik
van c_str).
Uit een file mag alleen met invoer.get (...) gelezen
worden, vergelijk Hoofdstuk 3.7 uit het dictaat,
gedeelte "aantekeningen bij de hoorcolleges".
Binnen de hoofdloop van het programma staat bij voorkeur maar
één keer een get-opdracht,
vergelijk het voorbeeldprogramma uit dit hoofdstuk
(daar staat twee keer get, één maal
vóór de loop, uiteraard).
Karakters mogen niet worden teruggezet in de
oorspronkelijke file.
-
Denk aan het infoblokje dat aan begin
op het scherm verschijnt. Gebruik enkele geschikte functies,
bijvoorbeeld voor infoblokje, inlezen gegevens van de gebruiker, coderen en decoderen
(zie de tips bij het vijfde werkcollege).
Globale variabelen zijn streng verboden.
Ruwe indicatie voor de lengte van het C++-programma: circa 200 regels.
Uiterste inleverdatum: vrijdag 15 oktober 2010, 17.00 uur.
Haagse studenten: maandagochtend 18 oktober 2010, 11.00 uur.
Manier van inleveren:
- Digitaal de C++-code
inleveren: stuur een email naar
pm@liacs.nl.
Stuur geen executable's,
lever alleen de C++-file digitaal in! Noem deze bij voorkeur zoiets als
rutteverhage2.cc, dit voor de tweede opdracht van het duo Rutte-Verhage.
De laatst voor de deadline ingeleverde versie wordt nagekeken.
- En ook een papieren versie van het verslag
(inclusief de C++-code) deponeren
in de speciaal daarvoor bestemde doos "Programmeermethoden" in de postkamer
van Informatica, kamer 156 van het Snellius-gebouw.
Haagse studenten: bij de docent.
Overal duidelijk datum en namen van de (maximaal twee) makers vermelden,
in het bijzonder als commentaar in de eerste regels van de C++-code.
Lees bij het
zesde werkcollege hoe het verslag
eruit moet zien.
Te gebruiken compiler: als hij maar C++ vertaalt;
het programma moet in principe zowel op een Linux-machine
(met
g++) als onder Visual C++ of DevC++ draaien.
Test dus in principe op beide systemen!
Normering: layout 2; commentaar 2;
overzichtelijkheid/modulariteit 2;
werking 4.
Eventuele aanvullingen en verbeteringen: lees deze WWW-bladzijde:
www.liacs.nl/home/kosters/pm/op2pm.php.