Fortune is een unix/linux programma dat aangeroepen wordt dmv een bevel
fortune
waarop het programma een willekeurig citaat uit een gegeven verzameling van citaten op de de ``standard output'' zal schrijven.
Een vb. citaat:
To err is human - but it feels divine.
- Mae West
Maak een programma ``fortunepp'' in C++ dat voldoet aan de onderstaande functionele1 en niet-functionele2 eisen (``requirements'').
Een demo versie van fortunepp is beschikbaar.
Het programma kan op 2 manieren opgeroepen worden
Dit noemen we de ``index'' functie van het programma. In dit geval accepteert het programma dus minstens 2 (mogelijks meer) argumenten:
Het programma zal dan een ``index structuur'' (zie sectie 3) opbouwen voor alle citaten die in de diverse input files voorkomen. Bovendien zal het programma die structuur wegschrijven op de output file.
De structuur van de input files is eenvoudig: het zijn tekst files met citaten waarbij citaten worden beëindigd door een lijn met in de eerste positie een percent (``%'') teken.
Hieronder een stukje van een mogelijke input file:
A banker is a fellow who lends you his umbrella when the sun is shining and wants it back the minute it begins to rain. -- Mark Twain % A classic is something that everyone wants to have read and nobody wants to read. -- Mark Twain, "The Disappearance of Literature" % A horse! A horse! My kingdom for a horse! -- Wm. Shakespeare, "Henry VI" % A hundred years from now it is very likely that [of Twain's works] "The Jumping Frog" alone will be remembered. -- Harry Thurston Peck (Editor of "The Bookman"), January 1901. % A is for Apple. -- Hester Pryne % A kind of Batman of contemporary letters. -- Philip Larkin on Anthony Burgess % A light wife doth make a heavy husband. -- Wm. Shakespeare, "The Merchant of Venice" %
De index structuur zal het makkelijk maken om, uitgaande van een woord, alle citaten terug te vinden waarin dat woord voorkomt.
Dit noemen we de ``query'' versie van het programma. In dit geval accepteert het programma dus 1 of meer argumenten.
Het eerste argument is de naam van een bestand dat een index bevat zoals aangemaakt door de ``index'' versie van het programma.
De volgende argumenten zijn van een van de volgende vormen:
Het programma zal dan een willekeurig citaat teruggeven dat alle woorden bevat die voorkomen in een van de opgegeven zinsneden. Bovendien zal, voor elk zin argument het citaat de woorden in de zin bevatten, in de zelfde volgorde en zonder andere tussenliggende woorden.
Bvb. kan voor het bevel
fortunepp myindex divine "mae west"(waarbij myindex een eerder aangemaakte index file is) het voorbeeld citaat uit sectie 1 worden getoond.
make clean rm -f fortunepp *.o make fortunepp
Een woord bestaat enkel uit alphabetische tekens (d.w.z. letters). Om een woord in een tekst te herkennen volstaat het te zoeken naar het eerste alphabetische teken en daar alle volgende tekens aan toe te voegen tot er een niet-alphabetisch teken wordt gevonden of tot het einde van de tekst is bereikt.
fortunepp myindex DIVINE "Mae West"precies hetzelfde effect hebben als
fortunepp myindex divine "mae west"
ifstream::seekg(unsigned long)
kan een open ``file stream'' (fstream) op een willekeurige
positie gepositioneerd worden.
Omgekeerd kan je de ``huidige positie'' in een open
ifstream opvragen d.m.v. de functie
unsigned long ifstream::tellg()
Een bepaald aantal bytes inlezen kan door de functie
ifstream::read(char* buffer,unsigned long size).
Het volgende programma leest bytes 100..299 uit file ``input.txt''.
#include <fstream>
int
main(int argc,char*argv[]) {
const char* ifnm = "input.txt";
ifstream ifile(ifnm);
if (!ifile) {
cerr << "Error: cannot open " << ifnm << endl;
exit(1);
}
const int START = 100;
const int BUFSIZE = 200;
char buf[BUFSIZE];
ifile.seekg(START);
if (!ifile) {
cerr << "Error: cannot seek to "
<< START << endl;
exit(2);
}
ifile.read(buf,BUFSIZE);
if (!ifile) {
cerr << "Error: cannot read "
<< BUFSIZE << " bytes" << endl;
exit(3);
}
}
Meer informaties over filestreams in [Stroustrup97].
Bvb. zal bij het bevel
fortunepp myindex divine "Mae West"gelden dat (de namen zijn zoals in de voorbeelden gezien in de cursus):
/export/home3/staff/dvermeir/citatenMen kan deze files gebruiken om te testen.
Een goede test is bvb
fortunepp -i myindex /export/home3/staff/dvermeir/citaten/*die alle vb files in /export/home3/staff/dvermeir/citaten zal indexeren. Dit kan dan gevolgd worden door
fortunepp myindex divine "mae west"
1 Functionele eisen leggen vast wat het programma moet doen.
2 Niet-functionele eisen leggen vast aan welke andere voorwaarden het programma moet voldoen, bvb. onder welk operating system het moet werken, welke programmeertalen of bibliotheken mogen gebruikt worden, etc.