GJØVIK INGENIØRHØGSKOLE Postboks 191-2801 GJØVIK KANDIDATNUMMER: E K S A M E N FAGNAVN: FAGNUMMER: Programmering i C++ / Pascal / C LO154A, LO151A og LO142A EKSAMENSDATO: 7. juni 1994 TID: 09.00-14.00 FAGLÆRER: Frode Haug KLASSE: AA/AE ANTALL SIDER UTLEVERT: TILLATTE HJELPEMIDLER: 6 (inkludert denne forside) Alle trykte og skrevne. NB! - Det er tillatt å føre med blyant (men skriv pent). - Kladd og oppgavearkene leveres sammen med besvarelsen. Kladd merkes med "KLADD". - Kontroller at alle oppgavearkene er tilstede. - Les hele oppgaveteksten nøye, før du begynner å besvare noe som helst. - IKKE SKRIV NOE AV DIN BESVARELSE PÅ OPPGAVEARKENE. - HUSK KANDIDATNUMMER PÅ ALLE ARK.
NB: Denne eksamenoppgave er felles for tre ulike kurs (nemlig programmering i C++, Pascal og C). Disse har også ulike kursnumre. Besvar derfor i det språket som er relevant for den eksamenen du skal ta. Oppgaveteksten er utformet såpass generell at den skal være uavhengig av programmeringsspråket som blir brukt. Der det allikevel har vært nødvendig å skille, er dette markert med et innrykket avsnitt, som starter med "C++:", "Pascal:" og/eller "C:". F.eks: C++: Dette er en tekst som kun gjelder de som løser oppgaven i C++. Oppgaven i korthet Oppgaven går i korthet ut på å lage en indeks for et dokument. Hvilke nøkkelord som skal være med i indeksen er lagret på filen "KEYWORD.DTA", ett på hver linje (se vedlegg 1). Programmet spør brukeren om hvilket dokument som skal leses (se vedlegg 3). Ut fra dette dokumentet og de aktuelle nøkkelord, så lages en indeks (som skrives til fil) med angivelse av hvilke sider de ulike nøkkelordene forekommer på (se vedlegg 2). Filen "KEYWORD.DTA" inneholder maksimalt 50 ulike ord. Disse er usortert. Nøkkelordene er alltid skrevet med store bokstaver, både i "KEYWORD.DTA" (jfr. vedlegg 1) og i den filen det skal leses fra/lages indeks for (jfr. vedlegg 3). Antall sider ett og samme nøkkelord forekommer på er ukjent/"ubegrenset". Sideskift er i filen markert med tegnet ''. Dette tegnet forekommer ikke andre steder i dokumentet. Din oppgave er å lage et program med hovedprogram, datastruktur og funksjoner som tilfredsstiller det nedenfor skrevne. LES HELE TEKSTEN NØYE FØR DU BEGYNNER Å BESVARE OPPGAVENE. Oppgave 1 - Datastruktur og hovedprogram: a) Skriv de class'er / record'er / struct'er og deres innmat (data) som du har bruk for. b) Skriv andre globale variable som du trenger (f.eks: arrayer/tabeller og filnavnet til det dokumentet som skal leses inn). c) Tegn opp datastrukturen. (Gjør dette ordentlig!) d) Skriv hovedprogrammet som: - gjør kall til funksjonene i oppgave 2-5. - ber om og leser filnavnet som input-dokumentet er å finne på. Denne teksten er kun det før '.' i filnavnet. F.eks: "DOK1" i filnavnet "DOK1.DTA". 2
NB: For å få et fullverdig program, så er det ikke sikkert at det er nok at du kun koder de funksjonene som er angitt i de nedenforstående oppgavene. Det er mye mulig at du også må lage noen tilleggsfunksjoner. Spesielt gjelder dette for de som løser oppgaven i C++, der det vil være naturlig med funksjoner inni class'ene. Alle disse nødvendige funksjonene skal også angis som en del av besvarelsen. Oppgave 2 - Lesing av filen "KEYWORD.DTA": Lag funksjonen "les_nokkelord". Funksjonen skal lese alle nøkkelordene fra filen "KEYWORD.DTA", og legge disse inn i den valgte datastrukturen (jfr. oppgave 1). Det ligger ett ord på hver linje, og maksimalt 50 stk. på filen. C++: Pascal/C: Husk at setningen "innfil >> tekst" vil hente den neste tegnsekvensen (uten blanke) fra filen referert til av 'innfil' inn i bufferen 'tekst'. For enkelthets skyld så antar vi at du har tilgjengelig en funksjon som heter "hent_ord(...)" som henter neste tegnsekvensen (uten blanke) fra filen som er angitt av parametreen '...'. Hvordan denne parameteren brukes trenger du ikke å bry deg om, bare skriv "hent_ord(...)" inni den løkka som går og leser fra den aktuelle åpne filen. Oppgave 3 - Lesing av dokumentfilen: Lag funksjonen "les_dokument". Funksjonen skal lese inn ett og ett ord fra filen som brukeren angav i hovedprogrammet (jfr. oppgave 1d). Denne filen har alltid extension lik ".DTA". Dersom det innleste er et av nøkkelordene, og det ikke allerede er funnet på den aktuelle siden, så skal du registrere dette i datastrukturen din. Sidenumre skal komme i stigende rekkefølge. Husk at: - et nøkkelord kan forekomme på et ukjent antall sider. - sideskift er markert med tegnet ''. - det er kun nøkkelord skrevet med store bokstaver som gjelder. (Dvs. at ordene på "KEYWORD.DTA" og input-fila er helt identiske.) - når du leser fra filen, må til selv bygge sammen filnavnet ut fra det innlest i oppgave 1d og tillagt extension ".DTA". Hint: Bruk samme metode for innhenting av neste tegnsekvens som under oppgave 2. 3
Oppgave 4 - Skriving av filen med indeks: Lag funksjonen "skriv_indeks". Funksjonen skal gå gjennom datastrukturen og skrive ut alle nøkkelordene og sidene de forekom på. Sidenumrene skal adskilles med ',', unntatt etter den siste (jfr. vedlegg 2). Hele utskriften skal gå til filen angitt av navnet i oppgave 1d + extension ".RES". Vi antar at vi får plass til alle sidenumrene på en og samme linje. (Dette med sorterte nøkkelord og '-' kommer vi tilbake til i de to neste oppgavene.) Oppgave 5 - Sortering av nøkkelordene: Lag funksjonen "sorter_nokkelord". Ordene på filen "KEYWORD.DTA" ligger usortert (jfr. vedlegg 1). Lag en funksjon som sorterer disse. Denne kalles etter at funksjonen i oppgave 2 er utført, men før at funksjonen i oppgave 3 kalles. Oppgave 6 - Forbedret indeks: Endre funksjonen "skriv_indeks". Når ett og samme nøkkelord forekommer på flere etterfølgende sider, så kunne det være fint å ikke bare liste opp alle disse sidene (som i oppgave 4), men skrive dette noe mere kompakt. Når et nøkkelord derfor forekommer på to eller flere etterfølgende sider så skal dette istedet skrives som: <nummeret på første side i sekvensen> - <nummeret på siste side i sekvensen> (jfr. vedlegg 2). Endre funksjonen "skriv_indeks" slik at den ivaretar dette. Diverse: - Vi antar at de to filene det skal leses fra virkelig finnes, at de har et innhold (dvs. ikke er tomme), og at deres format (utseende) er som beskrevet ellers i oppgaven. - Gjør dine egne forutsetninger dersom du finner oppgaveteksten upresis eller ufullstendig. Gjør i så fall rede for disse forutsetningene. - C++: Skulle det være nødvendig, så bruk gjerne LISTTOOL.H. Lykke til (og god sommer)! FrodeH 4
Vedlegg 1: Filen "KEYWORD.DTA": PRIVATE CHAR CLASS CONST ELSE PROTECTED PUBLIC BREAK CASE ENUM FLOAT NEW DO RETURN VITUAL VOID SHORT STATIC STRUCT FOR IF INT LONG SWITCH WHILE Vedlegg 2: Eksempel på resultatfilen (indeksen): BREAK 5-6, 9, 11 CASE 2-3, 5-6, 9, 11 CHAR 1, 4, 7-9, 12, 14 CLASS 4, 9, 12, 14 CONST 9, 12, 14 DO 1, 3-9, 13 ELSE 3, 5, 9, 12, 14 ENUM 1-3, 5, 7, 9, 11, 13 FLOAT 1-3, 5, 7, 9-11, 13 FOR 4, 9-10, 13 IF 4, 7, 9-10, 13 INT 2, 4, 7, 9, 11, 13 LONG 2-4, 6-7, 9, 11, 13 NEW 1-5, 7, 9-11, 13 PRIVATE 1, 4, 7-9, 12, 14 PROTECTED 3, 5-6, 9, 12 PUBLIC 5-6, 9, 12 RETURN 1, 3, 5-9, 13 SHORT 9, 13 STATIC 9-10, 13 STRUCT 9-10, 13 SWITCH 1-4, 6-7, 9, 11, 13 VITUAL 1, 3, 5-6, 9, 13 VOID 5-6, 9, 13 WHILE 1-4, 6-7, 9, 11, 13 5
Vedlegg 3: Eksempel på filen som leses (er input til programmet): PRIVATE CHAR dette er meningsløst ENUM FLOAT NEW ENUM NEW. DO dette er meningsløst RETURN VITUAL SWITCH WHILE. CASE ENUM FLOAT NEW dette er meningsløst dette er meningsløst. INT dette er meningsløst LONG SWITCH WHILE LONG. ELSE. PROTECTED. CASE. ENUM dette er meningsløst FLOAT NEW. DO dette er meningsløst RETURN VITUAL LONG SWITCH dette er meningsløst WHILE. dette er meningsløst dette er meningsløst PRIVATE CHAR CLASS NEW. DO dette er meningsløst FOR IF INT LONG SWITCH WHILE FORTE. ELSE PROTECTED PUBLIC BREAK CASE ENUM FLOAT NEW. DO RETURN VITUAL VOID dette er meningsløst dette er meningsløst. PROTECTED PUBLIC BREAK dette er meningsløst dette er meningsløst CASE. DO RETURN dette er meningsløst VITUAL VOID LONG SWITCH WHILE. PRIVATE CHAR ENUM FLOAT NEW dette er meningsløst dette er meningsløst. DO RETURN dette er meningsløst IF INT LONG SWITCH WHILE. PRIVATE dette er meningsløst dette er meningsløst dette er meningsløst CHAR. DO dette er meningsløst dette er meningsløst. dette er meningsløst RETURN. PRIVATE CHAR CLASS CONST ELSE PROTECTED PUBLIC BREAK CASE ENUM FLOAT NEW DO RETURN. VITUAL VOID SHORT STATIC. STRUCT FOR IF INT LONG SWITCH WHILE. dette er meningsløst dette er meningsløst FLOAT NEW. STATIC dette er meningsløst dette er meningsløst STRUCT FOR IF BREAK CASE dette er. meningsløst dette er meningsløst ENUM. FLOAT NEW. INT LONG dette er meningsløst dette er meningsløst SWITCH WHILE. PRIVATE CHAR CLASS. CONST ELSE PROTECTED PUBLIC dette er meningsløst BREAK. ENUM dette er. meningsløst FLOAT NEW NEW NEW NEW NEW IF IF IF IF DO RETURN VITUAL VOID SHORT STATIC STRUCT FOR IF INT LONG SWITCH WHILE. PRIVATE CHAR CLASS. dette er meningsløst CONST ELSE. dette er meningsløst dette er meningsløst DO RETURN VITUAL. 6