Instructie Programmeren Task 5 5JJ70
Task 5: Spelling checker Het doel van deze opdracht is het schrijven van een kleine spelling checker Dit is de lastigste opdracht tot nu toe!
Task 5: Spelling checker - Hints De volgorde waarin je de verschillende correctie functies aanroept is van groot belang: Je gebruikt spaties om de grenzen van woorden te vinden, verwijder dus eerst dubbele spaties Je vergelijkt aangrenzende woorden bij het verwijderen van dubbele woorden, zorg dus dat je eerst de spelling van de woorden verbeterd Leestekens en hoofdletters toevoegen kan helemaal op het eind, dus: Spaces > spelling > double words > capital & punctuation Een zin inlezen met scanf(“ %s”, line) werkt niet! Gebruik getchar() of een variant hierop ( zie opdracht)
Task 5: Spelling checker – Spaties verwijderen Een functie die 1 karakter (of x karakters) vanaf een bepaalde locatie verwijdert is zeer nuttig bij deze opdracht! Realiseer je dat iedere keer dat je een karakter verwijdert, de stringlengte van je regel verandert Bedenk goed wat je doet nadat je een spatie hebt weggehaald: Waar staat het eerstvolgende karakter dat eventueel een spatie zou kunnen zijn? D i t s e D i t s e Gedetecteerde dubbele spatie Waar blijft deze pointer/index?
Task 5: Spelling checker – Spaties verwijderen 2 (of meer) spaties achter elkaar is fout Spaties aan het begin van de zin zijn fout Spaties voor leestekens ( :,;!?.) zijn fout Er zijn functies die detecteren of een karakter een leesteken, spatie, hoofdletter etc. is: Header: ctype.h Documentatie: http://www.cplusplus.com/reference/clibrary/cctype Voorbeeld: if(ispunct(line[i])){ // hier de acties als line[i] een leesteken is } else{ // geen leesteken op plek i in string line
Task 5: Spelling checker – Spellingsfouten Voor ieder fout woord (“teh”, “eb”, “si”, “ceratief”, etc) moet je dezelfde acties uitvoeren, gebruik dus een loopje waar je één voor één je foute woorden afgaat. Het is handig je foute en verbeterde woorden op te slaan in een array van strings: char* errors[3] = {"teh", "eb", "si"}; (Dit declareert een array van 3 poiners naar chars. Vervolgens worden deze pointers geïnitialiseerd met de adressen van de constantes "teh", "eb", en "si“) Je kunt een tijdelijke variabele gebruiken om het huidige ingelezen woord in op te slaan, of je kan de begin en eindindex van het woord opslaan Vergeet niet dat uit strcmp() nul komt wanneer de 2 strings gelijk zijn! Om zeker te weten dat je alle fouten vindt, kun je de ingelezen woorden naar lowercase of uppercase converteren voor je ze vergelijkt (tolower() en toupper(), of vergelijken met strcmpi() (die case insensitive is).
Task 5: Spelling checker – Spellingsfouten De procedure die je moet bouwen ziet er ongeveer zo uit: Detecteer het begin van een woord ( begin van de zin of een spatie) Detecteer het eind van een woord ( spatie, leesteken of eind van de zin) Vergelijk het woord met elk van de foute woorden Komt het woord overeen met een fout woord, kopieer dan het verbeterde woord naar de plaats van het foute woord Ga terug naar stap 1, tot het eind van de zin bereikt is
Task 5: Spelling checker – Dubbele woorden De dubbele-woorden-verwijder-routine komt erg overeen met de spelfouten routine ( kun je code hergebruiken? ): Detecteer het begin van een woord ( begin van de zin of een spatie) Detecteer het eind van een woord ( spatie, leesteken of eind van de zin) Vergelijk het woord met het vorige woord (indien aanwezig) Komt het woord overeen met het vorige woord, verwijder het dan uit de zin (of voeg het niet toe aan de output) Komt het woord niet overeen, dan wordt het “vorige woord” het “huidige woord” Ga terug naar stap 1, tot het eind van de zin bereikt is Na een leesteken mag een woord herhaald worden! Bijvoorbeeld: It took a very, very long time to program this.
Task 5: Spelling checker - Hints Een string van lengte L mag je maar tot L-1 adresseren! char str[10]; s[10] = ‘a‘; // FOUT! Gaat er iets mis, zet dan een breakpoint neer en stap door je programma heen Het is vaak handig en verhelderend op papier even uit te tekenen wat er gebeurt: Vergeet de ‘\0’ en de ruimte die dit karakter inneemt nooit! Access violations? Zie de hint slides over Debuggen Line: D i t s D i t s Prev_Word: i == 9 i – strlen(Prev_Word) i s \0
Task 5: Spelling checker - Hints Je spatie-verwijder functie 10x aanroepen “omdat dan pas alle spaties weg zijn” is niet toegestaan: schrijf degelijke functies die altijd werken! De output van je programma moet exact gelijk zijn als die bij de voorbeelden op het opdracht blad Daarnaast moet onderstaande zin goed worden verbeterd ( spaties worden ter illustratie weergegeven met -) ---eb---eb--eb---be-eb-a--a--good--,---good-good-program--and---work---!--- Corrected: Be a good, good program and work! Je programma mag niet crashen wanneer er geen input wordt ingegeven! Je programma is niet af voordat het aan de bovenstaande eisen voldoet. Proberen af te laten tekenen heeft geen zin, voordat alle voorbeelden en bovenstaande zin correct worden verbeterd. Tip: Laat je buur- man/vrouw je programma testen!