Tentamen, EDAA10 Programmering i Java

Relevanta dokument
Tentamen i Programmering

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDA017, Programmeringsteknik för C, E, I och Pi

Tentamen EDA501/EDAA20 M L TM W K V

Tentamen, EDA501 Programmering M L TM W K V

Tentamen, EDAA10 Programmering i Java

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDA501 Programmering M L TM W K V

Tentamen, EDAA10 Programmering i Java

Tentamen, EDAA20/EDA501 Programmering

Tentamen Programmeringsteknik för BME, C, D, E, F, I, N & Pi

Tentamen i EDA011 Programmeringsteknik för F, E, I, π och N

Tentamen, Programmeringsteknik för BME, F och N

DAT043 Objektorienterad Programmering

Tentamen OOP

Tentamen, EDAA20/EDA501 Programmering

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TENTAMEN OOP

Grundläggande programmering med C# 7,5 högskolepoäng

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen, Algoritmer och datastrukturer

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

OOP Tentamen

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

TENTAMEN OOP

TENTAMEN OOP

OOP Objekt-orienterad programmering

OOP Tentamen

Tentamen i EDAF oktober Skrivtid: Skriv bara på ena sidan av pappret tentorna kommer att scannas in, och endast framsidorna rättas.

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

OOP Tentamen

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen EDAA45 Programmering, grundkurs

Lösningsförslag tentamen FYTA11 Java

OOP Tenta

Tentamen i Objektorienterad programmering

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Tentamen i Grundläggande programmering STS, åk 1 fredag

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Laboration A Objektsamlingar

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Tentamen. Lösningsförslag

Föreläsning 3-4 Innehåll

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Malmö högskola 2008/2009 CTS

Malmö högskola 2007/2008 Teknik och samhälle

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Tentamen i Programmeringsteknik I

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Tentamen i Programmeringsteknik I,, KandMa/Fy,

Malmö högskola 2007/2008 Teknik och samhälle

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen TEN1 HI

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Objektorienterad programmering D2

Tentamen ID1004 Objektorienterad programmering April 7, 2015

Föreläsning 14. Filhantering

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Föreläsning 8: Exempel och problemlösning

Tentamen i Grundläggande programmering STS, åk 1 fredag

Tentamen EDAA45 Programmering, grundkurs

Redovisning av inlämningsuppgifter

PROGRAMMERING-Java TENTAMINA

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Grundläggande programmering med C# 7,5 högskolepoäng. Provmoment: Ladokkod: Tentamen ges för: TEN1 NGC011 ADAEK17, ASYST17 samt öppen för alla

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

OOP Omtenta

Chapter 3: Using Classes and Objects

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen, EDAA10 Programmering i Java 2019 08 21, 08.00 13.00 Anvisningar: Preliminärt ger uppgifterna 25 + 15 + 5 = 45 poäng. För godkänt betyg krävs 22, 5 poäng. Kommentarer från specifikationerna (/**... */) behöver inte skrivas i lösningen. Svara enbart på lösblad och numrera de blad ni lämnar in, själva tentan ska inte lämnas in. Tillåtet hjälpmedel: Java-snabbreferens. Lösningsförslag kommer att finnas på kursens hemsida senast dagen efter tentamen. Resultatet läggs in i Ladok när rättningen är klar och anslås inte på anslagstavlan. Tentamensvillkor: Om du tenterar utan att vara tentamensberättigad annulleras din skrivning. För att undvika att någon skrivning annulleras av misstag kommer alla som, enligt institutionens noteringar, tenterat utan att vara tentamensberättigade att kontaktas via epost. Felaktigheter i institutionens noteringar kan därefter påtalas fram till nästa tentamenstillfälle då resterande skrivningar annulleras.

2(6) Som ni säkert har märkt så arbetar en stor mängd studenter som handledare på laborationerna i programmering. Låt oss kalla dessa arbetande studenter för labbhandledare (eng. teaching assistant). Det är ett omfattande arbete att se till att alla labbhandledare får rätt lön. Kursansvarig måste varje månad lämna in listor på de arbetade timmarna och dessa listorna måste se ut på ett visst sätt (mer om det nedan). Uppgiften för denna tentan är att skriva ett program som, givet labhandledarnas schema, kan skriva ut lönelistor för en given månad. Uppgifterna hänger ihop och först på slutet pratar vi om hur programmet ska köras - därför kan du ha mycket att vinna på att läsa igenom hela tentan innan du sätter igång. Det finns några speciella regler som är bra att känna till: 1. Det finns två olika lönenivåer för labbhandledare. Dels kan de få betalt för salstid (undervisningstid) och dels kan de få betalt för arbete som utförs hemma (t.ex. granskning av inlämningar etc.). 2. Varje lönerapport ska tydligt dela upp hemarbetspassen och undervisningstiden så att dessa tider listas separat (se exakt format för detta nedan). 3. Enligt lag måste vi redovisa hur många dagar som arbetats under varje månad. Det räcker alltså inte att lista exakta datum och tider utan vi måste också tydligt ange hur många dagar som berörts. Antalet dagar är inte antalet hela dagar utan istället antalet dagar som något arbete har skett. Även om handledaren en dag endast jobbar en timme räknas den dagen alltså som arbetad. Klassen WorkShift beskriver ett arbetspass och innehåller information om arbetspassets längd, tider, datum och om det är ett hemarbetspass eller undervisning i sal. I denna tentan anges alla tider i hela timmar. Klassen WorkShift är färdigskriven och har följande specifikation: /** Skapar ett nytt arbetspass där isathome är true om det gäller hemarbete och false annars. Passet är schemalagt till datumet date kl from till to. */ WorkShift(boolean isathome, String date, int from, int to); /** Returnerar true om passet är ett hemarbetespass, false annars */ boolean isathome(); /** Returnerar numret på den dag (1-31) då passet arbetades */ int getday(); /** Returnerar numret på den månad (1-12) då passet arbetades */ int getmonth(); /** Returnerar arbetspassets längd i timmar */ int getlength(); /** Returnerar arbetspassets datum på formen yyyy-mm-dd */ String getdateasstring(); /** Returnerar en läsbar representation av detta arbetspass. Retursträngen kommer följa följande format: 2019-06-24 kl 10-12 (2 timmar) */ String tostring();

3(6) Varje labbhandledare ska i programmet representeras av ett objekt av typen TeachingAssistant. Varje TeachingAssistant-objekt ska kunna lagra de arbetspass handledaren har arbetat och den som använder klassen ska kunna få ut den information som behövs för att skriva ut en lönelista enligt reglerna som nämns ovan. Klassen TeachingAssistant har följande specifikation: /** Skapar en ny labbhandledare med namnet name och personnumret personalidnbr */ TeachingAssistant(String name, String personalidnbr); /** Lägger till ett nytt arbetspass för denna handledare. Arbetspasset ska bli ett hemarbetspass om isathome är true (annars salsarbetspass) och passet arbetades dagen date från kl from till klockan to */ void addshift(boolean isathome, String date, int from, int to); /** Returnerar en lista med de hemarbetspass som denna labbhandledare arbetat i månad monthnbr, sorterade i datumordning. Om inga sådana pass arbetats returneras en tom lista */ ArrayList<WorkShift> gethomeshiftsformonth(int monthnbr); /** Returnerar en lista med de salsarbetspass som denna labbhandledare arbetat i månad monthnbr, sorterade i datumordning. Om inga sådana pass arbetats returneras en tom lista */ ArrayList<WorkShift> getteachingshiftsformonth(int monthnbr); /** Räknar ut hur många olika dagar labbhandledaren har arbetat under månaden med nummer monthnbr. En dag räknas som arbetad om det, oavsett längd, finns minst ett arbetspass registrerat för dagen */ int getnbrofdaysformonth(int monthnbr); /** Returnerar handledarens totala lön (baserat på arbetade pass, typ av pass samt aktuell timlön) för månad monthnbr */ double gettotalpaymentformonth(int monthnbr); /** Returnerar sträng som representerar denna handledares lönelista för månad monthnbr. OBS! Färdigskriven */ String getstringformonth(int monthnbr); 1. Uppgift: Implementera klassen TeachingAssistant enligt specifikationen ovan samt anvisningarna nedan. Månaderna är numrerade från 1 till 12. Du får lov att anta att det månadsnummer som kommer in till metoderna är giltigt. Vi vill hålla all utdata från klassen sorterad och det ska göras genom att add-metoden lägger in det nya arbetspasset på rätt ställe så att listan alltid hålls sorterad i stigande ordning med avseende på datum (skulle två datum vara samma spelar det inte någon roll vilken tid som hamnar först). Vi kan inte anta att add-metoden anropas i någon specifik ordning. Du kommer märka att två av metoderna är väldigt lika. För full poäng på denna uppgift ska den gemensamma funktionaliteten brytas ut till en privat hjälpmetod varpå den privata hjälpmetoden anropas från båda ställena. Lönen för ett pass beräknas genom att multiplicera den arbetade tiden (i timmar) med timlönen. Metoden getstringformonth är färdigskriven och ingår alltså inte i uppgiften att implementera. De aktuella lönenivåerna ligger lagrade som statiska konstanter i en annan klass (PaymentGenerator, se kod nedan). För full poäng ska dessa konstanter användas för löneberäkning.

4(6) public class PaymentGenerator { public static final double TEACHING_SALARY = 264; public static final double HOME_SALARY = 130; } //Övrig kod som kommer senare i tentan 2. Nu behöver vi en klass som klarar av att läsa in information om samtliga arbetade pass och som baserat på det klarar av att skriva ut lönelistor på det format som vi önskar. För att göra detta ska klassen administrera en lista av handledare och använda de metoder som behövs från de tidigare två klasserna. Information om labhandledarna och dess arbetspass ska läsas från en Scanner. Indata kan t.ex. antas vara lagrat i en fil. Formatet på data kommer alltid att vara enligt följande: # Nina Kaninsson 780605-4343 H 2019-07-18 10 12 T 2019-07-19 13 15 T 2019-07-24 9 12 T 2019-08-19 14 17 # Krösus Sorksson 770413-2134 T 2019-06-09 13 15 H 2019-06-24 10 12 H 2019-07-09 10 12 T 2019-07-09 14 17 Filen ska tolkas så här: En rad som inleds med # innehåller alltid information om en labbhandledare. Ni får anta att det alltid finns tre saker på denna raden: förnamn, efternamn och personnummer (ni får alltså bortse från att någon ev. kan ha fler namn). De rader som kommer efter raden som börjar med # är alltid samtliga pass som handledaren arbetat. Alla dessa rader börjar alltid med T eller H och det är en rad per pass. T står för teaching det vill säga att handledaren arbetat med salsundervisning den angivna tiden. H står för home och anger att handledaren har utfört hemarbete den angivna tiden. Resten av raden innehåller data om arbetspasset på formen: datum starttid sluttid Datumet anges alltid på ovan form och tiderna är alltid hela timmar (antag att alla arbetspass börjar prick). När en ny rad som inleds med # dyker upp har vi hittat en ny handledare. Du får anta att varje handledare bara förekommer en gång men hen kan ha hur många tillhörande pass som helst (även noll). Du får alltid anta att inga pass sträcker sig över midnatt. Du får lov att anta att filen inte innehåller några tomma rader och att varje rad är korrekt formaterad. beskrivningen av uppgiften fortsätter på nästa sida...

5(6) När lönelistorna sen ska skrivas ut ska det inte se ut på samma sätt. Filen ovan ska för juli (månad 7) generera följande lönelista: Löneutbetalning för: Nina Kaninsson Hemarbete: 2019-07-18 kl 10-12 (2 timmar) Salsarbete: 2019-07-19 kl 13-15 (2 timmar) 2019-07-24 kl 9-12 (3 timmar) Totalt arbetade dagar: 3 Total lön: 1580.0 Löneutbetalning för: Krösus Sorksson Hemarbete: 2019-07-09 kl 10-12 (2 timmar) Salsarbete: 2019-07-09 kl 14-17 (3 timmar) Totalt arbetade dagar: 1 Total lön: 1052.0 Klassen som ska hantera detta heter PaymentGenerator och har följande specifikation: /** Skapar en PaymentGenerator och läser in information om samtliga arbetspass, för samtliga labbhandledare, från Scannern scan (och sparar informationen för framtida utskrift av lönelistor) */ PaymentGenerator(Scanner scan); /** Skriver ut lönelistorna för månad monthnbr. Endast de handledare som har registrerade arbetspass kommer med i utskriften. Labhandledarnas inbördes utskriftsordning är godtycklig. */ void printshiftsformonth(int monthnbr); Uppgift: Implementera klassen PaymentGenerator enligt specifikationen och beskrivningen ovan samt anvisningarna nedan. Vid utskrift av lönelistor ska endast de labbhandledare komma med som faktiskt har arbetat något pass den givna månaden. Om ingen handledare har arbetat något pass den givna månaden ska istället följande text skrivas ut: Inga registrerade pass hittades för månad 3 (om vi efterfrågar lönelistor för mars alltså. Mars är ju, enligt filen i exemplet ovan, en av de månader som inte har några arbetade pass för någon handledare). Metoden getstringformonth i klassen TeachingAssistant lämnar, för en given labbhandledare och månad, tillbaks en sträng vars format exakt följer det som anges i exemplet på utskrift av lönelista ovan. Strängen som returneras från getstringformonth avslutas med en ny rad. Det ska vara två blankrader efter varje handledare, innan nästa handledares utskrift påbörjas. PaymentGenerator innehåller även lönekonstanterna enligt uppgift 1, men de behöver du inte skriva.

6(6) 3. Slutligen behöver vi även en main-metod. Main metoden ska skapa en Scanner (kod given nedan) som läser från en fil varpå filen ska användas för att läsa in arbetspassen. Därefter ska programmet fråga användaren vilken månads lönelistor som ska genereras och därefter ska lönelistorna skrivas ut. Lite skissartat kan main-metoden se ut så här: public static void main(string[] args) { Scanner scan = null; try { scan = new Scanner(new File("input.txt")); } catch (FileNotFoundException e) { System.out.print("Filen finns inte, programmet avslutas"); System.exit(0); } } PaymentGenerator pay = new PaymentGenerator(scan); //Fråga användaren vilken månads lönelista som ska genereras. //Se till så att inmatat månadsnummer är korrekt, annars fråga igen tills det är korrekt //Skriv ut lönelistorna för inmatad månad Uppgift: Implementera klart main-metoden ovan (du behöver inte inkludera den kod som redan är skriven, det räcker att i svaret skriva den kod som saknas) enligt anvisningarnan nedan. Du ska använda PaymentGenerator för att skriva ut lönelistorna. Kommunikationen med användaren ska fungera enligt exemplet nedan. Efter utskriften ska programmet avsluta. Du behöver alltså inte loopa för att fråga igen efter en ny månad efter att en månads lönelistor skrivits ut. Du får anta att användaren alltid anger ett heltal, ditt program behöver alltså inte hantera fallet där användaren av misstag skriver in en sträng i stället. Vilken månads lönelistor vill du generera? (ange månadsnummer 1-12) 0 Ogiltigt värde, ange ett nytt månadsnummer 13 Ogiltigt värde, ange ett nytt månadsnummer 6 Löneutbetalning för: Krösus Sorksson Hemarbete: 2019-06-24 kl 10-12 (2.0 timmar) Salsarbete: 2019-06-09 kl 13-15 (2.0 timmar) Totalt arbetade dagar: 2 Total lön: 788.0