Programmeermethoden 2011
Tweede programmeeropgave: Lekken
De
tweede programmeeropgave van het vak
Programmeermethoden
in het najaar van 2011
heet
Lekken;
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 27, woensdag 28, donderdag 29 september, dinsdag 4, woensdag 5, donderdag 6,
dinsdag 11, woensdag 12, donderdag 13
en vrijdag 14 oktober 2011, van circa
15.30 tot 17.00 uur.
Om te voorkomen dat alle geheimen uit miljoenennota's en dergelijke vroegtijdig weglekken, gaan we
onze files enigszins versluieren.
Voor de tweede programmeeropgave moet daarom een programma worden
geschreven dat een file kan verminken, volgens speciale regels.
Aan de gebruiker wordt gevraagd hoe de originele (bestaande) file en de
"doelfile" heten. De veranderde invoerfile komt in deze doelfile terecht;
de invoerfile zelf blijft onveranderd.
Stel eenvoudige vragen om deze gegevens 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.
We definiëren eerst een aantal begrippen
(waarbij een "aaneengesloten serie" altijd
uit minstens één karakter bestaat):
- een naam is een aaneengesloten serie kleine letters en hoofdletters,
voorafgegaan en gevolgd door een niet-letter (bijvoorbeeld een spatie, regelovergang, cijfer, punt, vraagteken
of zelfs het begin van de file);
- een getal is een aaneengesloten serie cijfers, voorafgegaan en gevolgd door
een niet-cijfer;
- een emailadres is —iets vereenvoudigd— een aaneengesloten
serie kleine letters, hoofdletters en cijfers, gevolgd door een @,
gevolgd door het domein: een aaneengesloten serie kleine letters, hoofdletters, cijfers en punten,
gevolgd door een karakter dat geen kleine letter, hoofdletter, cijfer of punt is.
De volgende zaken moeten allemaal verricht worden:
- Voor elke naam die begint met een hoofdletter
(behalve als de naam voorkomt in het domein van een emailadres),
moeten alle letters in de bij de eerste letter horende kleine letter worden veranderd.
Zo moet abC DeF worden abC ddd.
- Voor elk getal moeten de cijfers in omgekeerde volgorde uitgevoerd worden.
Zo wordt ab-123.4500def in de doelfile
ab-321.0054def.
Let op: getallen kunnen met één of meer nullen beginnen.
- Voor elk emailadres moet ieder karakter van het domein
als een x worden afgedrukt, behalve getallen
(die worden net als boven behandeld). Namen in het domein van een emailadres worden
ook door x-en vervangen.
Als voorbeeld: Ab42@Leuk456hoor.nl% wordt aa24@xxxx654xxxxxxx%.
En foo@bar@baz wordt foo@xxx@xxx.
Het totaal aantal karakters van de 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.)
Op het beeldscherm moet na afloop ook het gemiddelde van alle oorspronkelijke getallen
die voorkomen
(uitgezonderd de getallen die deel uitmaken van het domein van een emailadres;
afgerond naar het dichtstbijzijnde gehele getal)
worden afgedrukt. Neem aan dat de voorkomende getallen en hun som niet al te groot zijn. (Maar misschien komen er wel helemaal geen getallen voor!)
De bedoeling is, zoals gezegd, de invoertekst karakter voor karakter te lezen.
Onthoud precies genoeg, bijvoorbeeld het vorige karakter,
de getalswaarde van het laatste getal, het aantal cijfers daarvan,
en of je in een naam of domein zit.
Elk symbool uit de invoerfile mag en moet
één maal (met invoer.get (...)) gelezen worden.
Ter verdere inspiratie: zie de voorbeelden
bij het vijfde werkcollege.
Opmerkingen
-
We nemen aan dat de gebruiker zo vriendelijk is verder geen
fouten te maken bij het invoeren van gegevens.
-
Gebruik zonodig 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 — zie boven.
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.
Schrijf zelf functies die testen of een karakter een kleine letter is,
of een cijfer, etcetera. Er mogen geen andere functies dan die
uit fstream gebruikt worden, en c_str.
-
Denk aan het infoblokje dat aan begin
op het scherm verschijnt. Gebruik enkele geschikte functies,
bijvoorbeeld voor infoblokje, inlezen gegevens van de gebruiker,
omkeren van het getal en testen of iets een letter is
(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 14 oktober 2011, 17.00 uur.
Haagse studenten: maandagochtend 24 oktober 2011, 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 en wat er in moet staan.
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.