Programmeermethoden 2017
Tweede programmeeropgave: DeCoderen

De tweede programmeeropgave van het vak Programmeermethoden in het najaar van 2017 heet DeCoderen; 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: donderdag 28 september, donderdag 5 en donderdag 12 oktober, van circa 15:15 tot 17:00 uur; en woensdag 27 septmber, woensdag 4 oktober en woensdag 11 oktober, van circa 13:30 tot 15:15 uur; en de deadline-vrijdag 13 oktober vanaf een uur of 11:00..


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. En staan er "Lychrel-getallen" in de file?
Aan de gebruiker wordt gevraagd of het om coderen of decoderen gaat en 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. Elk symbool uit de invoerfile mag en moet precies één maal (met invoer.get (...)) gelezen worden.
De compressierate (de verhouding tussen het totale aantal karakters van doelfile en oorspronkelijke file) moet bij het coderen na afloop in gehele procenten, netjes afgerond, op het beeldscherm afgedrukt worden, evenals het totaal aantal regels. Schrijf hiervoor onder meer een functie die bepaalt hoeveel cijfers een gegeven positief geheel getal heeft. (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 gewoon zichzelf, 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 e434 betekenen — vier e's en vier 3-en of 434 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.

Verder moet het programma van elk geheel getal ongelijk nul dat bij het coderen in de invoerfile voorkomt controleren of dit wellicht een Lychrel-getal is. Op het scherm wordt het desbetreffende getal afgedrukt, en daarnaast wat het aantal iteraties is om tot een palindroom te komen (voor 545 is dit 0, voor 113 is dit 1), of het nummer van de iteratie waarvan het resultaat boven INT_MAX (gebruik include <climits>) uitkomt (voor 196 is dit (waarschijnlijk) 18). Als dit laatste gebeurt, wordt dit erbij vermeld.
De tekst 123abcd-"qqq 5"+++uvw-77.88ddd//vb5656 bevat de gehele getallen 123, 5, 77, 88 en 5656; deze moeten dus gecontroleerd worden. Neem aan dat de getallen in de tekst zelf hooguit INT_MAX zijn.

Ter verdere inspiratie, zie het vijfde werkcollege, en een tweetal voorbeelden:

Let op: kopiëren door met rechter muisknop op de links te klikken, anders (met markeer-copy-paste) gaan spaties/tabs wellicht fout!

Opmerkingen

Uiterste inleverdatum: vrijdag 13 oktober 2017, 17:00 uur.
Manier van inleveren:

  1. Digitaal de C++-code inleveren: stuur een email naar pm@liacs.leidenuniv.nl.
    Stuur geen executable's, lever alleen de C++-file digitaal in! Noem deze bij voorkeur zoiets als bumarutte2.cc, dit voor de tweede opdracht van het duo Rutte-van Buma. De laatst voor de deadline ingeleverde versie wordt nagekeken.
  2. 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.
    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 Windows met Code::Blocks 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.leidenuniv.nl/~kosterswa/pm/op2pm.php.