Malmö högskola 1 Tentamen på kursen DA7800, Programmering med Java del II 070602 kl 10.15-15.15 Tillåtna hjälpmedel: En valfri Javabok Vid bedömning av lösningarna tas hänsyn till om dessa uppfyller de krav på programkvalitet (strukturering, indenteringar (indragningar) och meningsfulla variabelnamn etc) som meddelats på kursen. Om en uppgift är oklart formulerad ska du förklara hur du uppfattat uppgiften. I bilagan finns javadoc för några interfaces i Javas standardbibliotek, kontrollera vad bilagorna handlar om. Här hittar du dessutom metoder i klasserna Input och Output vilka får användas på skrivningen. Skrivningen omfattar fem uppgifter och en bilaga (totalt 60 p och 10 sidor).
Malmö högskola 2 Uppgift 1 (20p) Besvara nedanstående frågor kortfattat. 1a. (1p) Vad ger nedanstående kod för körresultat? int a = 23; int b = 10; if( ( a > b ) && ( b < 10 ) ) System.out.println( '1' ); else if( ( a > b ) ( b < 10 ) ) System.out.println( '2' ); else System.out.println( '3' ); 1b. (1p) En Citroen av modellen Evasion har 138 hästkrafter. I ett program exekveras raden: Bil bil = new Bil( "Citroen", 138 ); Vilken av nedanstående konstruktorer kommer att exekveras i klassen Bil? Motivera ditt svar. a) public Bil( String str, double d) { b) public Bil( String str ) { c) public Bil( long l, String str ) { d) public Bil( String str, int i ) { 1c. (1p) Vilken av nedanstående objektsamlingar väljer du om du vill kunna söka efter lagrade objekt så snabbt som möjligt? a) LinkedList b) HashMap c) Vector d) Object-array 1d. (2p) Vad ger nedanstående kod för körresultat? Förklara ditt svar. int a = 0; while( true ) { a++; if( a == 5 ) break; if( a % 3 == 0 ) continue; System.out.println( a ); 1e. (2p) Vad ger nedanstående kod för körresultat? for( int i = 18; i >= 10; i -= 4 ) { for( int j = 10; j < i; j++ ) System.out.print( j + " " ); System.out.println(" Ny rad -");
Malmö högskola 3 1f. (3p) Vad ger nedanstående kod för körresultat? public class Uppgift1f { public int a = 5; public void metod( int a, int b, String c ) { a = a + 1; b = b + 1; c = c + " på dig"; public static void main( String[] args ) { Uppgift1f prog = new Uppgift1f(); int heltal = 10; String str = " hej"; prog.metod( prog.a, heltal, str ); System.out.println( prog.a + ", " + heltal + ", " + str ); 1g. (2p) Vad innebär det att en instansvariabel deklareras som private? 1h. (2p) Följande rad med kod är given: int[] arr = new int[10]; Vilka av följande påståenden är korrekta? 1. arr[10] har värdet 0 2. arr[9] har värdet 0 3. arr[5] har värdet null 4. arr[0] har värdet 0 5. arr[3] har värdet 3 1i. (2p) Arvshierarkin till höger är given. Ett objekt av typen Bil skapas: Bil bil = new Bil("Volvo"); Vilka av följande tilldelningar är korrekta? 1. Object obj = bil; 2. Fordon for = bil; 3. Bil car = bil; 4. Lastbil last = bil; Fordon Bil Lastbil 1j. (2p) Hur avbryter man exekveringen av en tråd i 0,5 sekunder? Komplettera med kod i runmetoden nedan: public void run() { // rader med kod // komplettera med kod som pausar tråden 0,5 sekunder // rader med kod 1k. (2p) Du får ett NullPointerException vid körning av ett program? Vilka av nedanstående rader med kod kan generera ett NullPointerException? 1. Uppgift1f upp1f = new Uppgift1f(); // se deluppgift 1f 2. String str = label.gettext(); 3. int kapacitet = array.length; 4. int value = array[23] + 7; 5. int tal = 65;
Malmö högskola 4 Uppgift 2a (4p) Du ska skriva klassen Track vilken ska representera en låt på en CD-skiva. De attribut som definierar en låt är: title (String) t.ex. Blowin in the Wind time (int) speltiden i sekunder, t.ex. 168 Skriv klassen Track så att följande testprogram blir körbart: public static void main(string[] args) { Track t = new Track("Blowin' in the Wind", 168); System.out.println("Namn: " + t.gettitle()); System.out.println("Speltid: " + t.gettime()+ " sekunder"); System.out.println(t); Samtliga attribut i klassen ska vara private-deklarerade. Körresultat: Namn: Blowin' in the Wind Speltid: 168 sekunder Blowin in the Wind, 168 sec Uppgift 2b (3p) Du ska skriva klassen CD vilken ska representerar en CD-skiva. De attribut som definierar en skiva är: title (String) artist (String) tracks (Track[ ]) t.ex. The Freewheelin Bob Dylan t.ex. Bob Dylan en array med låtarna på albumet. Skriv klassen CD så att följande testprogram blir körbart: public static void main(string[] args) { Track[] tracks = { new Track("Blowin' in the Wind", 168), new Track("Girl From the North Country", 202), new Track("Masters of War", 274) ; CD cd = new CD("The Freewheelin' Bob Dylan", "Bob Dylan", tracks); System.out.println("Album: " + cd.gettitle()); System.out.println("Artist: " + cd.getartist()); Tracks[] t = cd.gettracks(); for(int i = 0; i < t.length; i++) System.out.println((i+1) + ". " + t[i]); Samtliga attribut i klassen ska vara private-deklarerade. Körresultat: Album: The Freewheelin' Bob Dylan Artist: Bob Dylan 1. Blowin' in the Wind, 168 sec 2. Girl From the North Country, 202 sec 3. Masters of War, 274 sec Uppgift 2c ( 3p) Implementera interfacet Comparable i klassen CD på så sätt att CD-skivor vid sortering ordnas växande efter artist. Om två CD-skivor har samma artist ska skivorna ordnas växande efter albumets namn (title).
Malmö högskola 5 Uppgift 3a (5p) Komplettera klassen Uppgift3. så att ett fönster liknande det nedan skapas när man exekverar följande kod: JFrame frame = new JFrame(); frame.getcontentpane().add( new Uppgift3(), BorderLayout.CENTER ); frame.setsize( 400, 300 ); frame.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); frame.setvisible( true ); JTextArea JTextField Klass att komplettera: 1 import javax.swing.*; 2 import java.awt.*; 3 import java.awt.event.*; // Uppgift 3b 4 5 public class Uppgift3 extends JPanel { 6 private JButton add = new JButton("Lägg till"); 7 private JButton clear = new JButton("Rensa"); 8 private JButton close = new JButton("Avsluta"); 9 private JTextArea tarea = new JTextArea(); 10 private JTextField tfield = new JTextField(); 11 12 public Uppgift3() { 13 14 15 16 Uppgift 3b (5p) Komplettera klassen Uppgift3 med kod så att texten som skrivits i JTextField-komponenten läggs till på ny rad i JTextArea-komponenten när användaren klickar på Lägg till. Om JTextField-komponenten inte innehåller några tecken blir det en tom rad i JTextArea-kompnenten. Med \n kan du radbryta texten i JTextAreakomponenten. JTextArea-komponenten töms på innehåll om man klickar på Rensa programmet avslutas när man klickar på Avsluta.
Malmö högskola 6 Uppgift 4a (6p) Din uppgift är att skriva klasserna Forsandelse och Brev vilka ingår i en klasshierarki som hanterar försändelser. Klasserna ska innehålla angivna instansvariabler och metoder. Du ska själv lägga till nödvändiga konstruktorer så att testprogrammet blir körbart. Körresultatet visar hur metoder och konstruktorer ska fungera. OBS! Lägg märke till att samtliga instansvariabler ska vara private-deklarerade. Klassen Adress är given och används i klassen Forsandelse: - gata : String - postnummer : String; - postadress : String + Adress( String gata, String postnummer, String postadress ) + getgata() : String + getpostnummer : String + getpostadress : String Klasser att skriva: Klassen Forsandelse - mottagare : String - adress : Adress + getmottagare() : String + getadress : Adress Klassen Brev (ärver av Forsandelse) - vikt : int + getvikt() : int + getporto() : double // se info nedan om portot + tostring() : String Portot på ett brev beror enbart på vikten i gram: Om brevet väger högst 5 g: 5 kr. Om brevet väger mer än 5 g men högst 50 g: 10 kr. Om brevet väger mer än 50 g men högst 500 g: 30 kr. Om brevet väger mer än 500 g: 50 kr. Klasshierarkin måste kunna köras med testprogrammet som ser ut så här: public static void main(string[] args){ Adress adr1 = new Adress("Storgatan 11", "35199", "Storstad"); Adress adr2 = new Adress("Lillgatan 10", "60129", "Småstad"); Brev brev1=new Brev("Gunnar Sturesson", adr1, 12); Brev brev2=new Brev("Elin Svensson", adr2, 79); System.out.println("-------------------------------"); System.out.println(brev1); System.out.println("-------------------------------"); System.out.println(brev2); System.out.println("-------------------------------"); System.out.println("Porto: " + brev2.getporto() ); System.out.println("-------------------------------"); Körresultat av testprogrammet är på nästa sida
Malmö högskola 7 Körresultat av testprogrammet ------------------------------- BREV Gunnar Sturesson Storgatan 11 35199 Storstad Vikt: 12 g Porto: 10.0 kr ------------------------------- BREV Elin Svensson Lillgatan 10 60129 Småstad Vikt: 79 g Porto: 30.0 kr ------------------------------- Porto: 30.0 ------------------------------- Uppgift 4b (2p) Kan man byta raden Brev brev1=new Brev("Gunnar Sturesson", adr1, 12); mot raden Forsandelse brev1=new Brev("Gunnar Sturesson", adr1, 12); utan att kompileringsfel uppstår i programmet? Du måste motivera ditt svar för att få poäng. Uppgift 4c (2p) Det ska inte gå att skapa ett objekt som är en Forsandelse men inte är ett Brev. Hur gör du?
Malmö högskola 8 Uppgift 5a (6p) Skriv klassen DateTime vilken ska visa datum- och tidsinformation i en JLabel-komponent (se figuren). Följande gäller för klassen DateTime: Klassen ska ärva klassen JLabel. Tidsinformationen, vilken placeras i JLabel-komponenten, ges genom att skapa ett nytt Date-objekt och sedan använda tostring-metoden: String info = new Date().toString(); Klassen ska innehålla metoden start. Vid anrop till startmetoden ska en tråd skapas vilken uppdaterar datum- och tidsinformationen 10 gånger varje sekund. Vid varje uppdatering måste du skapa ett nytt Date-objekt. Klassen ska innehålla metoden stop. Vid anrop till stopmetoden ska tråden, som uppdaterar datum- och tidsinformationen, avslutas. Informationen ska visas centrerat i JLabel-komponenten. Testprogram import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Uppgift5 extends JFrame implements ActionListener { private DateTime dt = new DateTime(); private JButton start = new JButton("Starta klocka"); private JButton stop = new JButton("Stoppa klocka"); public Uppgift5() { JPanel panel = new JPanel( new GridLayout( 1, 2 ) ); start.addactionlistener( this ); stop.addactionlistener( this ); panel.add( start ); panel.add( stop ); setsize( 300, 300 ); setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); add( dt, BorderLayout.NORTH ); add( panel, BorderLayout.SOUTH ); setvisible( true ); public void actionperformed( ActionEvent e ) { if( e.getsource() == start ) dt.start(); else if( e.getsource() == stop ) dt.stop(); public static void main(string[] args) { new Uppgift5(); Körresultat Se figuren uppe till höger.
Malmö högskola 9 Uppgift 5b (2p) Nu ska du se till att DateTime-komponenten blir mer flexibel vad det gäller informationen som visas. Detta ska ske genom att klassen utökas med en konstruktor: public DateTime( TimeFormat format ) TimeFormat är ett givet interface: interface TimeFormat { public String format( String datestring ); Tanken är att datum- och tidssträngen, dvs. new Date().toString(), är argument vid anrop till metoden och strängen som returneras är den som visas i DateTime-komponenten. Nu ska du göra nödvändiga ändringar i klassen DateTime så att: om konstruktorn DateTime() används ska all datum- och tidsinformation visas (som i Uppgift 5a). om konstruktorn DateTime( TimeFormat ) används ska den anpassade strängen visas. Exempel Klassen Time implementerar TimeFormat: class Time implements TimeFormat { public String format( String str ) { String[] parts = str.split(" "); return parts[3]; Om du ändrar konstruktorn i testprogrammet till private DateTime dt = new DateTime(new Time()); så ska DateTime-komponenten se ut som i figuren till höger. Uppgift 5c (2p) Skriv klassen TimeInfo vilken ska implementera TimeFormat. Följande gäller för klassen TimeInfo: Klassen ska innehålla konstruktorn TimeInfo( int[] ) Klassen ska innehålla konstanterna DAY_OF_WEEK = 0, MONTH = 1, DAY_OF_MONTH = 2, TIME = 3, TIME_ZONE = 4 och YEAR = 5 (motsvarar delarna i datum- och tidssträngen). Vid anrop till format-metoden ska retursträngen innehålla de delar som anges i int-arrayen. Exempel: new DateTime( new TimeInfo( new int[]{ TimeInfo.YEAR, TimeInfo.TIME ) ) ger att retursträngen ser ut så här: "2007 18:34:21" new DateTime( new TimeInfo( new int[]{ TimeInfo.YEAR, TimeInfo.TIME, TimeInfo.YEAR ) ) ger att retursträngen ser ut så här: "2007 18:34:21 2007" new DateTime( new TimeInfo( new int[]{ 11, TimeInfo.TIME ) ) ger att ett ArrayIndexOutOfBoundsException kastas.
Malmö högskola BILAGA 1 10 Class Input public static String readline(string) public static int readint(string) public static double readdouble(string) public static String readline() public static int readint() public static double readdouble() public static void delay(long millisek) Class Output public static void meddelande(string) public static void print(int tal, int bredd) public static void print(double tal, int bredd, int decimaler) public static String format(int tal, int bredd) public static String format(double tal, int bredd, int decimaler) java.lang Interface Comparable All Known Implementing Classes: Character, File, Long, ObjectStreamField, Short, String, Float, Integer, Byte, Double, BigInteger, BigDecimal, Date, CollationKey Method Summary int compareto(object o) Compares this object with the specified object for order. java.util Interface Comparator Method Summary int compare(object o1, Object o2) Compares its two arguments for order.