II ~ høgskolen i oslo Emne: Programmering i C++ Gruppe(r): EksamensoppgavenAntall sider (inkl. består av: forsiden):5 Emnekode: LV121A Dato: 03.03.2005 Antall oppgaver:3 Faglig veileder: Simen Hagen Eksamenstid: 3 timer Antall vedlegg:o Tillatte hjelpemidler: Alle skrevne og trykte hjelpemidler Kandidaten må selv kontrollere at oppgavesettet er fullstendig. Ved eventuelle uklarheter i oppgaveteksten skal du redegjøre for de forutsetninger du legger til grunn for løsningen. Avdeling for ingeniørutdanning. Cort Adelersgate 30. 0254 Oslo. tlf: 22 45 3200. faks: 22 45 32 05. iu@hio.no
Innledning Du skal svare på alle oppgavene. Hver oppgave teller likt for den endelige karakteren. Det er selvsagt viktig at du svarer på alt som oppgaven spør om. Koden bør følge god programmeringsskikk for å få full uttelling. For eksempel er det viktig at du sletter alt minne du har allokert, selv om oppgaven ikke sier at du må gjøre dette. Pass også på å bruke innrykk og kommentarer. Oppgave 1 I denne oppgaven skal du jobbe med ASCII-tegn. Derfor har jeg lagt ved ASCIItabellen, og du kan finne den bakerst i oppgavesettet. A) Lag en funksjon is_capita! som tar et tegn (en char) som parameter og returnerer true hvis tegnet er en stor bokstav. Du trenger bare å ta hensyn til de engelske bokstavene (A til l). Lag en funksjon capitalize som tar inn en streng (char*) og som endrer denne slik at det er stor bokstav etter punktum (.), spørsmålstegn (?) og utropstegn (!). Den første bokstaven i strengen skal også være stor. Resten av teksten skal være uendret. Funksjonen skal ikke ha noen returverdi. Koden du skriver skal kunne ta inn denne strengen: "er dette siste eksamen? mest sansynlig. hurra hurra!" og endre denne etter reglene ovenfor. Oppgave 2 Du skal lage en klasse Dato. Denne klassen skal holde på en dato og gjøre enkle operasjoner på denne. Du ta hensyn til skuddår og at månedene har forskjellig antall dager når du lager klassen. Operasjonene du skal lage er gitt nedenfor. Selv om du skal lage en klasse Dato, trenger ikke alle funksjonene å være implementert som medlemsfunksjoner, men her blir det opp til deg å bestemme hva som er mest hensiktsmessig. A) Lag en klassedeklarasjon for Dato klassen. Sørg for å deklarere alle funksjoner og variabler som er nødvendig for funksjonaliteten du skal lage. Lag en defaultkonstruktør, og en konstruktør som tar parameterene dag, måned og år, og som lagrer dem i klassen. Lag også en kopieringskonstruktør og en destruktør dersom det er nødvendig (men ikke ellers).
C) Lag nødvendige aksessfunksjoner for å hente ut og sette informasjonen i klassen D) Lag en funksjon (ikke operator) som kan legge til et gitt antall månder. Du skal håndtere årskifte korrekt. E) Lag en operator> som sjekker om en dato er større enn en annen. For eksempel skal 21.2.2005 > 20.2.2005 gi true. F) Lag en funksjon som tar inn ett årstall som parameter, og som returnerer true hvis dette årstallet er et skuddår. Reglene for skuddår er som følger: Alle år som er delelig med fire er et skuddår (dvs. at februar har 29 dager istedenfor 28, som den vanligvis har). Unntatt fra denne regelen er år som er delelig med 100 (hele hundreår), bortsett fra år som er delelig med 400. 2004 (i fjor) var altså et skuddår, fordi det er delelig med 4. Det samme gjelder 1996. Ar 1900 var ikke et skuddår, for selv om det er delelig med 4, er det også delelig med 100, og det blir derfor ikke et skuddår. År 2000 var derimot et skuddår, fordi det er delelig med 400. G) Lag en funksjon som returnerer hvor mange dager det er i en måned. Fuksjonen skal ta årstall og måned som innparametere, slik at den kan ta hensyn til om det er skuddår. H) Lag en operator+ som kan legge til et gitt antall dager. Dersom d1 er en instans av datoklassen skal det være mulig å skrive 14 + dl i koden. I) Lag en operator- som regner ut hvor mange dager det er mellom to Datoer. Dersom d1 og d2 begge er instanser av datoklassen skal det være mulig å skrive dl - d2 i koden. La funksjonen returnere et positivt antall dager dersom d1 > d2 er sant, og et negativt antall dager dersom det ikke er sant. J) Lag en operator«som kan skrive ut klassen på en fornuftig måte Oppgave 3 Svar kort på følgende spørsmål' 3
A) I C++ er det en liten forskjell mellom det å allokere minne for et enkelt objekt eller for et array med objekter. Forklar kort hva forskjellen er, og hvilke funksjoner som blir kalt når en allokerer. Gi eksempel på hvordan en allokerer både et enkelt objekt og et array med objekter. På samme måte som når en allokerer minne, er det to måter å slette (deallokere) minne på. Forklar kort hva forskjellen er I og hvilke funksjoner som blir kallt når en sletter minnet. I oppgave 3A allokerte du to objekter, gi nå eksempel på hvordan du kan slette disse to objektene. 4