LUNDS TEKNISKA HÖGSKOLA Institutionen för datavetenskap 1(5) M1 V2 L2 K2 TM W Java Tentamen i Programmering 2004-04-17, kl 08.00-13.00 Anvisningar Tillåtna hjälpmedel: Holm, Objektorienterad programmering och Java. Java snabbreferens. Skrivningen innehåller fem uppgifter. Vid varje uppgift står en preliminär maxpoäng för uppgiften. OBS! För att du skall vara tentamensberättigad på denna kurs skall alla övningar och inlämningsuppgifter vara godkända före tentamen. Om du tenterar utan att vara tentamensberättigad annulleras din skrivning. För att undvika att någon skrivning annulleras av misstag anslås vilka som, enligt institutionens noteringar, tenterat utan att vara tentamensberättigade. Namnen anslås senast en vecka efter tentamen på institutionens anslagstavla. Felaktigheter i institutionens noteringar kan därefter påtalas fram till nästa tentamenstillfälle (se nedan) då resterande skrivningar annulleras. Närmaste tentamenstillfällen i kursen: Fredag 20 augusti 2004, kl 14-19 Januari 2005
Uppgift 1 (4 poäng) 2(5) Klassen Article nedan beskriver ett varuslag i en affär. Implementera klassen fullständigt. specification Article { /** Skapar ett varuslag där: ean: är varuslagets artikelnummer (ett unikt heltal) name: är varuslagets namn (max 15 tecken) price: är varuslagets pris i affären (i öre) */ Article(int ean, String name, int price); /** Returnerar varuslagets artikelnummer */ int getean(); /** Returnerar varuslagets namn */ String getname(); /** Returnerar varuslagets pris i öre */ int getprice(); Uppgift 2 (12 poäng) Klassen ArticleReg nedan beskriver ett register där alla varuslag i en affär finns lagrade i godtycklig ordning i en Article-vektor. Implementera klassen fullständigt. class ArticleReg { private Article[] reg; // Osorterad vektor med alla registrets varuslag /** Skapar ett tomt varuslagsregister som kan innehålla maxsize varuslag */ public ArticleReg(int maxsize) { /** Lägger till ett nytt varuslag till registret. Det förutsätts att varan inte redan finns i registret */ public void addarticle(article art) { /** Tar reda på om det finns ett varuslag med artikelnumret ean i registret. Returnerar varuslaget om det finns, annars returneras null */ public Article findarticle(int ean) { /** Tar bort varuslaget med artikelnumret ean ur registret. Varuslaget förutsätts finnas i registret */ public void removearticle(int ean) {
Uppgift 3 (6 poäng) 3(5) Lägg till en metod uploadreg i klassen ArticleReg från uppgift 2. Metoden fyller på registret med affärens varuslag enligt nedan. Implementera metoden. /** Fyller på varuslagsregistret med affärens varuslag */ public void uploadreg() { Varuslagen som skall läggas in i registret läses från tangentbordet (i verkligheten hade man naturligtvis läst från en fil istället). Indata har formen: Först en rad där antalet varuslag står (n) Därefter kommer n st rader med ett varuslag per rad bestående av: varuslagets artikelnummer, varuslagets pris (i öre) samt varuslagets namn Exempel på indata (jfr med kvittoexemplet i uppgift 5): 3 27900 24950 Skjorta, Herr 43500 2630 Mascara 33987 1495 Strumpor, Barn Inledning till uppgift 4 5 Tiffany Persson som äger H&M:s nya klädbutik i Staffanstorp har köpt ett datoriserat kassasystem av enklare modell som består av en kassaapparat, en streckkodsläsare och en datorenhet. Systemet är uppbyggt kring att varje varuslag har ett unikt artikelnummer som finns som en streckkod på alla varor. Artikelnumret används sedan av kassasystemet för att ta reda på priset på ett varuslag (som finns lagrat i datorenheten). För att ta reda på ett varuslags artikelnummer använder man normalt streckkodsläsaren, men i nödfall kan man även knappa in ett artikelnummer manuellt. Kassaapparaten har följande knappsats: 7 8 9 Korr Betalt Ny kund 4 5 6 Manuell 1 0 2 3, OK Nr Total Register ON/OFF Not. Knappen Manuell har ingen funktion i detta kassasystem.
4(5) Man sätter igång kassasystemet genom att trycka på ON/OFF-knappen. Kassasystemet har sedan 8 funktioner, numrerade A H enligt: A) Man kan ta betalt för en vara med hjälp av streckkodsläsaren. Läs av varans streckkod (dvs artikelnumret) med streckkodsläsaren. * B) Man kan ta betalt för en vara utan hjälp av streckkodsläsaren. Tryck in varans artikelnummer, tryck Nr. * C) Man kan korrigera (stryka från kvittot) en vara med hjälp av streckkodsläsaren. Tryck Korr, läs av varans streckkod med streckkodsläsaren. * D) Man kan korrigera (stryka från kvittot) en vara utan hjälp av streckkodsläsaren. Tryck Korr, tryck in varans artikelnummer, tryck Nr. * E) Man kan sammanräkna en kunds totalbelopp. Tryck Total. * F) Man kan beräkna växelbelopp (hur mycket kunden skall ha tillbaka). Tryck in betalt belopp, tryck Betalt, * G) Man kan börja behandla en ny kund. Tryck Ny kund. * H) Man kan stänga av kassaapparaten. Tryck ON/OFF. * *) För varje funktion är detta en beskrivning av hur man går tillväga rent praktiskt för att utföra operationen. Delar av denna information behövs för att lösa uppgift 4. Följande klass för kassaapparaten finns färdigskriven: specification CashRegister { // Kassaapparat heter CashRegister på engelska /** Skapar ett kassaapparatssystem kopplat till kassaapparatens knappsats och streckkodsläsare */ CashRegister(); /** Returnerar kassaapparatens nästa knapptryckning, ett heltal enligt: */ En 1:a returneras om streckkodsläsaren användes En 2:a returneras om knappen Korr användes En 3:a returneras om knappen Manuell användes En 4:a returneras om knappen Nr användes En 5:a returneras om knappen Betalt användes En 6:a returneras om knappen Total användes En 7:a returneras om knappen Ny kund användes En 8:a returneras om knappen ON/OFF användes */ int getlatestbutton(); /** Returnerar senast inmatade artikelnummer(antingen via streckkodsläsaren eller via knappsatsen) */ int getlatestean(); /** Returnerar senast inmatade belopp på knappsatsen (i öre) */ int getlatestamount(); /** Låter kassaapparaten ge ifrån sig en felsignal */ void beep(); /** Skriver ut en rad (som är exakt 30 positioner) på kassaapparatens kvitto enligt: 1. Strängen text vänsterjusterad 2. Om price<0 strängen KORR direkt efter text 3. Ett antal blanktecken (beroende på värdena av text och price) 4. Priset i kronor högerjusterat med exakt två decimaler (price är priset öre)*/ void printreceiptrow(string text, int price);
Uppgift 4 (12 poäng) 5(5) Klassen CRC (CashRegisterController) nedan är kassasystemets hjärta. Det är den klassen som styr expeditens arbete med kassaapparaten. Där finns alla de operationer som expediten behöver för att handha kassaapparaten, t ex behandla en kund. class CRC { private ArticleReg ar = new ArticleReg(10000); private CashRegister cr = new CashRegister(); /** Behandlar en kund och producerar ett kvitto. Anropas när någon tryckt på knappen Ny kund */ public void servecustomer() { // m fl Implementera metoden servecustomer i klassen CRC, dvs producera ett kvitto för kunden (se kvittoexemplet i uppgift 5). Lösningen på denna uppgift kan lätt bli rörig och svår att följa. För full poäng måste lösningen vara lättläst och tydlig. Behandlingen av en kund sker i följande ordning: Ett antal varor behandlas, dvs expediten utför ett antal av funktionerna A D (från sid 2) blandade i godtycklig ordning. Inmatningen av varor avslutas med att expediten trycker på knappen Total (funktion E på sid 2). Därefter tar expediten betalt och beräknar växelbelopp (funktion F på sid 2). Om en felaktig knapptryckning används vid något tillfälle skall felsignal/pip ges. Därefter skall programmet fortsätta som om ingenting hade hänt. Uppgift 5 (6 poäng) Implementera metoden printreceiptrow från klassen CashRegister som finns beskriven i inledningen. Utskriften på kvittot görs genom att skriva till standard output som vanligt. Denna uppgift är främst till för de som eftersträvar betyg 5 och uppgiften kommer att rättas därefter. Exempel på ett kvitto: Skjorta, Herr 249.50 Solkräm (faktor 7) 123.50 Mascara 26.30 Mascara KORR -26.30 Strumpor, Barn 14.95 3 VAROR ATT BETALA --> 387.95 BETALT --> 500.00 TILLBAKA --> 112.05