Instructie Programmeren Task 5

10
Instructie Programmeren Task 5 5JJ70

description

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. - PowerPoint PPT Presentation

Transcript of Instructie Programmeren Task 5

Page 1: Instructie Programmeren Task 5

Instructie Programmeren

Task 55JJ70

Page 2: Instructie Programmeren Task 5

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!

PAGE 2

Page 3: Instructie Programmeren Task 5

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)

PAGE 3

Page 4: Instructie Programmeren Task 5

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?

PAGE 4

D i t i s e D i t i s e e

Gedetecteerde dubbele spatie Waar blijft deze pointer/index?

Page 5: Instructie Programmeren Task 5

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

}

PAGE 5

Page 6: Instructie Programmeren Task 5

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).

PAGE 6

Page 7: Instructie Programmeren Task 5

Task 5: Spelling checker – Spellingsfouten

• De procedure die je moet bouwen ziet er ongeveer zo uit:1. Detecteer het begin van een woord ( begin van de zin of een spatie)

2. Detecteer het eind van een woord ( spatie, leesteken of eind van de zin)

3. 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

4. Ga terug naar stap 1, tot het eind van de zin bereikt is

PAGE 7

Page 8: Instructie Programmeren Task 5

Task 5: Spelling checker – Dubbele woorden

PAGE 8

• De dubbele-woorden-verwijder-routine komt erg overeen met de spelfouten routine ( kun je code hergebruiken? ):

1. Detecteer het begin van een woord ( begin van de zin of een spatie)

2. Detecteer het eind van een woord ( spatie, leesteken of eind van de zin)

3. 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”

4. 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.

Page 9: Instructie Programmeren Task 5

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

PAGE 9

D i t i s i s

i – strlen(Prev_Word)

i s \0

Line:

Prev_Word:

D i t i s i s

i == 9

Page 10: Instructie Programmeren Task 5

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!

PAGE 10