Tentamen i EDA011 Programmeringsteknik Lördagen den 20 december, 2003 Skrivtid: 8.00 13.00 Tillåtet hjälpmedel: Java-snabbreferens. Anonymt resultat: Om du inte vill ha ditt namn utskrivet i klartext på resultatlistorna kan du skriva en fyr-ställig kod på omslagspapprets framsida. Koden skall ha formen bokstav-bokstav-siffra-siffra, dvs något i stil med AB12 (använd nu inte denna kod!). I resultatlistan som sätts på institutionens anslagstavla kommer vi att skriva ut din kod istället för ditt namn, om du skrivit en kod. För dem med koder kommer vi även att lägga ut en resultatlista på kurshemsidan när tentamen är rättad vi lägger aldrig ut vanliga namnuppgifter på hemsidan. Observera: För att vara behörig att skriva tentamen måste du ha blivit godkänd på alla inlämningsuppgifter. Den som skriver utan att ha blivit godkänd på uppgifterna, och inte fått dispens, kommer att få sin tentamen annullerad. Instruktioner: Tentornas svårighetsgrad kan variera något, men det är alltid lika lätt/svårt att bli godkänd en svårare tenta bedöms snällare än en lätt tenta, och vice versa. Oavsett hur lätt/svår du tycker att denna tenta är gör ditt bästa. För att bli godkänd behöver du inte göra något som du inte redan gjort på inlämningsuppgifterna. Denna tentamen består av två delar: Del 1 består av uppgift 1-3, som alla bör behandla. Del 2 utgörs av uppgift 4, och riktar sig till dem som strävar efter 5:a. Det maximala poängantalet på varje uppgift är angivet vid uppgiften, betygsgränser bestäms i samband med rättningen. Om det är något du är osäker på under tentamen, fråga Christian. Del 1 Denna del av tentamen bör alla behandla efter bästa förmåga. Vår uppgift är att skriva delar av ett program för att hjälpa ett bibliotek hålla reda på böcker, låntagare och lån, och vi kommer att använda oss av följande klasser: Book, som beskriver en bok, Borrower, som beskriver en låntagare, Loan, som beskriver ett lån, och Library, som beskriver ett bibliotek. 1
De tre första klasserna skall ha följande specifikationer: class Book { Book(int idnbr, String title, String author) Skapar en ny bok. idnbr: bokens id-nummer title: bokens titel author: bokens författare int getid() Ger bokens id-nummer. String gettitle() Ger bokens titel. String getauthor() Ger bokens författare. void borrowed(loan loan) Noterar att boken lånas ut. loan: en referens till ett Loan-objekt (som bland annat innehåller information om vem som lånar boken, se nedan) void returned() Noterar att boken är återlämnad. Borrower getborrower() Ger en referens till den låntagare som har boken, null om boken inte är utlånad. class Borrower { Borrower(int idnbr, String name, String address) Skapar en låntagare. idnbr: låntagarens id-nummer name: låntagarens namn address: låntagarens adress int getid() Ger låntagarens id-nummer. String getname() Ger låntagarens namn. String getaddress() Ger låntagarens adress. void adddebt(int amount) Ökar låntagarens skuld. amount: det belopp som skulden ökat med int getdebt() Ger låntagarens sammanlagda skuld. void paydebt(int amount) Låter användaren betala (delar av) sin skuld. amount: det belopp låntagaren betalar class Loan { Loan(Book book, Borrower borrower, int day, int maxnbrofdays) Skapar ett nytt lån. book: den bok som skall lånas ut borrower: den låntagare som skall låna boken day: den dag då boken lånas ut (mer information om hur dagarna räknas får du i uppgift 2) maxnbrofdays: maximalt antal dagar som boken får lånas Book getbook() Ger en referens till den bok som lånats. 2
Borrower getborrower() Ger en referens till låntagaren. int daysleft(int day) Ger antalet återstående lånedagar, ger negativa värden då senaste återlämningsdatum passerats. day: den dag då antalet återstående dagar skall räknas ut Uppgift 1 (10 poäng) Implementera de tre klasserna Book, Borrower och Loan, du får själv bestämma vilka attribut klasserna skall ha. Klassen Library har följande attribut: borrowers, som är en vektor med samtliga låntagare, nbrofborrowers, som är antalet låntagare, books, som är en vektor med samtliga böcker, nbrofbooks, som är antalet böcker, loans, som är en vektor med samtliga utestående lån, nbrofloans, som är antalet utestående lån, och daynbr, som är numret på aktuell dag. I klassen Library vill vi bland annat ha följande operationer: class Library { Library() Skapar ett bibliotek med plats för 1000 böcker, 1000 låntagare och 1000 lån. void addbook(book book) Lägger in en ny bok i biblioteket. book: den bok som skall läggas in void addborrower(borrower borrower) Lägger in en ny låntagare. borrower: låntagaren som skall läggas in int makeloan(int borrowerid, int bookid) Lånar ut en bok med given id till en låntagare med given id, returvärdet anger hur utlåningen gick: 1 om det inte finns någon låntagare med det givna id-numret, 2 om låntagaren finns, men har för stor skuld för att låna (största tillåtna skuld för att få låna är 100 kronor), 3 om det inte finns någon bok med det givna id-numret, 4 om boken finns, men redan är utlånad, och 0 om lånet kunde genomföras borrowerid: låntagarens id-nummer bookid: bokens id-nummer int returnloan(int bookid) Noterar att en bok med ett givet id-nummer återlämnats. Om ingen bok med det givna id-numret var utlånad skall värdet 1 returneras, annars returneras värdet 0. bookid: bokens id-nummer void checkdebts() Går igenom samtliga utestående lån och ser till att eventuella skulder för låntagarna räknas upp om de har kvar böcker som skulle ha lämnats tillbaka. Denna operation skall anropas en gång efter varje dag som gått (du behöver inte själv göra anropet). 3
void printbookinfo(int bookid) Skriver ut information om en bok, mer information om denna operation finns i texten nedan. bookid: id-numret på den bok vi vill ha information om void printborrowerinfo(int borrowerid) Skriver ut information om en låntagare och vilka böcker denne lånat, mer information om denna operation finns i texten nedan. borrowerid: id-numret på den låntagare vi vill ha information om Dagarna i systemet räknas som heltal från nyår, och hela systemet nollställs vid varje årsskifte (vi kan förutsätta att alla böcker lämnas in i slutet av året). Alla böcker på biblioteket får lånas 28 dagar, och man har följande övertidsavgifter: två kronor per bok och dag de första 7 dagarna, fem kronor per bok och dag därefter. Det finns ingen övre gräns för övertidsavgifterna, men man får inte låna fler böcker när skulden överstiger 100 kronor. Utskriften från printbookinfo skall se ut som följder: 101001: Knuth, D. E.: The Art of Computer Programming, vol 1 Tillgänglig (det inledande talet är bokens id-nummer) eller, för en utlånad bok: 101004: Knuth, D. E.: The Art of Computer Programming, vol 4 Utlånad till Parker, Peter Utskriften från printborrowerinfo skall se ut så här: Parker, Peter, Vintergatan 42 Knuth, D. E.: The Art of Computer Programming, vol 4 Darwin, Charles: The Origin of Species eller, om låntagaren inte har lånat någon bok: Karlsson, Bert, Skara sommarland Inga lånade böcker. Om man försöker skriva ut information om en bok eller låntagare som inte finns skall lämplig utskrift göras. Uppgift 2 (15 poäng) Implementera klassen Library. Rita även en figur som visar objekt och referenser i ett bibilotek med fyra böcker och två låntagare, där den ene låntagaren har lånat en och den andre två böcker. Alla attribut skall synas i figuren. Uppgift 3 (5 poäng) På biblioteket vill man börja låna ut CD-skivor och tidskrifter, men dessa har lite andra regler för utlåningstid och böter vid försenad återlämning än vad böckerna har. Beskriv översiktligt hur du skulle modifiera systemet för att möjliggöra även lån av skivor och tidskrifter. Vilka klasser vill du införa, och hur förhåller de sig till varandra? Vilka operationer vill du ha i de nya klasserna? Hur skulle du beräkna övertidsavgifterna? Du behöver inte skriva någon programkod i denna uppgift. 4
Del 2 Denna del av tentamen behöver bara behandlas av dem som eftersträvar 5:a. Om du känner dig osäker på uppgifterna i del 1 är det bättre att du ägnar mer tid till dem innan du börjar arbeta med denna del (om din lösning av del 1 är tillräckligt bra kan du få en 4:a utan att göra del 2 för 5:a måste du dock göra även del 2). På denna del kommer vi att ställa högre krav på att programmet är skrivet i god stil än vi gör i del 1. Biblioteket vill göra en sammanställning över hur stora skulder låntagarna har de vill därför kunna skriva ut ett histogram som visar antalet låntagare med skulder i intervallen 0-24 kronor, 25-49 kronor, 50-74 kronor, 75-99 kronor, samt minst 100 kronor. Man vill dessutom kunna skriva ut en lista över samtliga icke utlånade böcker, sorterade efter i första hand författare, och därefter titel. Uppgift 4 (10 poäng) Implementera i klassen Library operationerna printdebts, som skriver ut ett histogram över låntagarnas skulder enligt beskrivningen ovan, och printavailable, som skriver ut listan över tillgängliga böcker enligt beskrivningen ovan. God Jul och Gott Nytt År! 5