Danmarks Tekniske Universitet Side 1 af 8 sider Skriftlig prøve, den 15. december 2007 Kursus navn: Indledende programmering Kursus nr. 02101 Tilladte hjælpemidler: Alle skriftlige hjælpemidler Vægtning Opgave 1: 15% Opgave 3: 10% Opgave 5: 35% Opgave 2: 10% Opgave 4: 10% Opgave 6: 20% Opgave 1 For en række DTU-kurser der afholdes over flere semestre ønskes foretaget et kursusudtræk. Oplysningerne om kurserne stammer fra en fil med én linie pr. kursus. Her er vist fire linier fra filen: 01005 E F 02121 E Januar 02122 F Juni 41205 F E Der er givet følgende erklæringer: HashSet<String> kurser = new HashSet<String>(); HashSet<String> semestre; Iterator<String> it; String nr; boolean tagmed; Nedenfor er vist en stump Java-kode svarende til behandlingen af en linie. Det kan antages, at iteratoren it er blevet initialiseret svarende til samlingen af ord (String) i den aktuelle linie: it =... ; nr = it.next(); semestre = new HashSet<String>(); while (it.hasnext()) semestre.add(it.next()); tagmed =!semestre.contains("januar") &&!semestre.contains("juni"); if (tagmed) kurser.add(nr); Kodestumpen tænkes udført fire gange svarende til at de fire linier i filen behandles én ad gangen i den rækkefølge hvori de står.
Angiv efter hver udførelse værdierne for de variable på tabelform (se nedenfor). Side 2 af 8 sider Elementerne i et HashSet<String> skrives i tabellen som en mængde. Fx skrives et HashSet<String> med elementerne "A" og "B" som mængden {A, B nr semestre tagmed kurser 01005 Opgave 2 Der er givet følgende to klasser: public class Biler { ArrayList<Bil> samling; public Biler() { samling = new ArrayList<Bil>(); samling.add(new Bil(Color.blue, "XL 53 418")); samling.add(new Bil(Color.red, "TA 45 917")); public class Bil { Color farve; String nummer; public Bil(Color farve, String nummer) { this.farve = farve; this.nummer = nummer; Beskriv hvad begrebet en tilstand - state - er og angiv så tilstanden for minebiler, idet Biler minebiler = new Biler();
Side 3 af 8 sider Opgave 3 Der er givet klassen CalcTest, her vist med konstruktoren udeladt: public class CalcTest { private int s = 20; private double[] a; public double average(int number) { double d = 0; for(int i=0; i < number; i++) d+= a[i]; return d/number; For hver af størrelserne s, a, number, d og i ønskes angivet om de er lokale størrelser, felter eller parametre. Angiv signaturen for metoden average() Opgave 4 Forklar og ret fejlene i nedenstående tostring()-metode: public class ClockDisplay { private NumberDisplay hours; private NumberDisplay minutes; public ClockDisplay(NumberDisplay h, NumberDisplay m) { hours = h; minutes = m; public String tostring() { return h + "." + m; hvor klassen NumberDisplay i uddrag ser sådan ud: public class NumberDisplay { private int value;... public String tostring() {...
Side 4 af 8 sider Opgave 5 Denne opgave drejer sig om ur-eksemplet fra lærebogens kapitel 3. På denne og den næste side er vist klasserne fra lærebogens Code 3.4 og Code 3.3 i forkortet form og uden kommentarer: public class ClockDisplay { private NumberDisplay hours; private NumberDisplay minutes; private String displaystring; public ClockDisplay(int hour, int minute) { hours = new NumberDisplay(24); minutes = new NumberDisplay(60); settime(hour, minute); public void timetick() { minutes.increment(); if(minutes.getvalue() == 0) hours.increment(); updatedisplay(); public void settime(int hour, int minute) { hours.setvalue(hour); minutes.setvalue(minute); updatedisplay(); public String gettime() { return displaystring; private void updatedisplay() { displaystring = hours.getdisplayvalue() + ":" + minutes.getdisplayvalue();
Side 5 af 8 sider public class NumberDisplay { private int limit; private int value; public NumberDisplay(int rolloverlimit) { limit = rolloverlimit; value = 0; public int getvalue() { return value; public String getdisplayvalue() { if(value < 10) return "0" + value; else return "" + value; public void setvalue(int replacementvalue) { if((replacementvalue >= 0) && (replacementvalue < limit)) value = replacementvalue; public void increment() { value = (value + 1) % limit; Til klassen ClockDisplay vil vi nu tilføje metoden: /** * Advance the clock by m minutes */ public void advance(int m) { for(int i=0; i<m; i++) timetick();
Side 6 af 8 sider Besvar følgende spørgsmål: 5.A: Hvilken værdi udskrives efter udførelsen af følgende tre sætninger: ClockDisplay clock = new ClockDisplay(15,59); clock.advance(3); System.out.println(clock.getTime()); 5.B: Erklær til brug i klassen NumberDisplay en public-metode med følgende signatur: public void increment(int i) sådan at value tælles frem med i modulo limit Hvad kalder man en metode der som increment findes i to (eller flere) forskellige udgaver? 5.C: Hvad kalder man størrelsen limit, hvis erklæringen i klassen NumberDisplay ændres til public final int limit; 5.D: Begrund om det med erklæringen fra spørgsmål 5.C er tilladt eller ej i klassen NumberDisplay at erklære følgende metode: public void setlimit(int rollover) { limit = rollover; 5.E: Hvordan ville det påvirke koblingen mellem klasserne NumberDisplay og ClockDisplay hvis der som i spørgsmål 5.C benyttes et public felt i stedet for at indføre en metode public int getlimit() { return limit; Altså argumentér for om koblingen herved bliver looser, the same, eller stronger sammenlignet med brug af en get-metode.
Side 7 af 8 sider Klassen ClockDisplay skal nu have to nye metoder til at stille uret frem. Disse metoder må ikke benytte timetick(), men gerne løsningerne fra spørgsmålene ovenfor. 5.F: Skriv de to metoder: /** * Advance the clock by m minutes */ public void myadvance(int m) {... /** * Advance the clock by h hours and m minutes */ public void myadvance(int h, int m) {... Opgave 6 I denne opgave ønskes foretaget en exception håndtering (exception handling). Den exception der ønskes fanget (catched) er RunTimeException en ArithmeticException. Udførelse af en division som fx 17/0 giver fejlmeldingen: Arithmetic Exception: / by zero fordi der divideres med nul.
Side 8 af 8 sider Der er givet følgende to klasser: public class Aritmetik { public Aritmetik() { public double kvotient(int t, int n) { return t/n; public class BrugAritmetik { public static void main(string[] args) { int t=17, n=0; Aritmetik a = new Aritmetik(); System.out.println(a.kvotient(t, n)); Besvar følgende spørgsmål: 6.A: Er en ArithmeticException en checked eller unchecked exception? 6.B: En repræsentation af indenfor klassen Double er værdien Double.MAX_VALUE (af størrelsesordenen 2 1023 ). I klassen Double er ovennævnte værdi erklæret som public static final double MAX_VALUE Hvad betegnes en størrelse der er specificeret som static final? 6.C: Exceptionen ArithmeticException ønskes fanget på to måder. Den første måde er at fange den i klassen Aritmetik ved udførelse af sætningen return t/n; Hvis divisionen t/n kaster en exception ønskes givet en fejlmelding og returneret værdien eller afhængigt af om t er positiv eller negativ, jfr. spørgsmål 6.B Indfør denne fejlhåndtering. 6.D: Samme spørgsmål som i 6.C men exceptionen ønskes i stedet fanget i klassen BrugAritmetik dér hvor metoden kvotient() bliver kaldt. Men til forskel for spørgsmål 6.C skal der her kun gives en passende fejlmelding.