UMEÅ UNIVERSITET Datavetenskap 010530 LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p Betygsgränser 3 21,5-27 4 27,5-33,5 5 34-43 Uppgift 1. (4p) Hitta de fel som finns i nedanstående klass (det är inte meningen att klassen skall göra något vettigt; förutom att fungera som tentauppgift). Beskriv för varje fel vad som är fel samt ge ett förslag på vad man skulle kunna göra för att åtgärda det. Radnummren är bara till för att ni skall ha något att hänvisa till och räknas ej som ett fel. Observera också att antal poäng inte med säkerhet har något (direkt iallafall) med antal fel att göra. 1. public class MångaFel extends Object 2. 3. float etttal; 4. final int numfel=5; 5. public MångaFel() 6. 7. numfel=6; //Ändrar värdet på en konstant 8. etttal=1.0; //float tilldelas double 9. 10. public tostring() //Returtyp (String) saknas 11. 12. return("fel"); 13. 14. int enmetod() 15. 16. private int enlokalvariabel=1; 17. 18. //Modifierare på lokal variabel enidentifierare++; //Ej deklarerad variabel 19. return enlokalvariabel/2; 20. 21. UMEÅ UNIVERSITET 901 87 UMEÅ Johan Eliasson Tel.: 070-2378695 e-mail: johane@cs.umu.se
Uppgift 2. (4p) Skriv en metod som vänder på en lista av tal som lagras i ett fält och returnerar listan vänd i samma fält. Om listan tex är 1,2,3, skall den efter exekveringen innehålla 3,2,1. Metoden skall klara av listor av varierande längd. int [] flip(int [] list) int temp; for(int i=0;i<list.length/2;i++) temp=list[i]; list[i]=list[list.length-1-i]; list[list.length-1-i]=temp; return list; Uppgift 3. (2+2=4p) a) Skriv om följande for-loop som en while-loop. for (x=0;x<10;x+=3) System.out.println(x); x=0; while(x<10) System.out.println(x); x+=3; b) Skriv en rekursiv metod som beräknar summan av alla udda tal mellan 0 och n. Talet n skall tas som en parameter av metoden. public int oddsum(int n) if(n<2) return n; else if(n%2==0) n--; return (n+oddsum(n-2); Uppgift 4. (2+2+2+1+2=9p) a) Component och Container är två klasser som finns i AWT paketet. Beskriv syftet med dessa klasser. Component klassen är basklass till de grafiska element som finns i AWT paketet, som tex knappar mm. Och innehåller metoder för att underlätta programering av sådanna klasser. Component klassen är basklass till de klasser som kan innehålla/visa upp komponenter (Component), som tex Frame, Panel mm. Och tillhandahåller metoder som underlättar sådan hantering. b) Ge exempel på minst två stycken olika Layout managers och förklara hur de placerar ut komponenterna. 2
Se boken c) Vad används en konstruktor till? Hur definieras den? Konstruktorn används till att skapa objekt. Den anropas då ett nytt objekt skapas och har då möjlighet att initialisera (sätta startvärden på attribut osv). Den definieras som en metod i klassen med vissa särskilda krav: Namnet måste vara detsamma som klassens och den får inte ha någon returtyp (inte ens void). d) Varför skriver man vanligtvis inte någon konstruktor för applets? Därför att appleten inte är garanterad en korrekt miljö då konstruktorn anropas. Istället fins metoden init, som anropas så snart en korrekt miljö kan garanteras. e) Java-program skall gå att köra på olika datorer och under olika operativsystem utan att behöva kompileras om. Hur åstadkoms detta? Programmet kompileras först till "bytecode" som fungerar på alla plattformar som har en java interpretator. Denna tolkar sedan programmet på de olika plattformarna. Uppgift 5. (6p) Förklara följande begrepp (i java): a) Arv Man skapar en är en relation mellan klasser. Barnet får tillgång till de metoder och attribut i föräldraklassen som inte är deklarerade private (som om de hade varit deklarerade i den egna klassen). Används för att kunna återanvända kod. Man kan bara ärva från en klass i Java. Skrivs med det reserverade ordet extends. b) Interface Ett interface är en samling abstrakta metoder och konstanter. En klass kan implementera ett interface och måste då definiera alla metoderna i interfacet (om klassen inte ska bli abstrakt). Finns bla på grund av att multipelt arv ej är tillåtet i Java, det är dock tillåtet att implementera flera interface. c) Garbage collection Då ett objekt inte längre har någon referens till sig (och alltså inte längre kan nås mer så kommer java att,automatiskt, plocka bort objektet ur minnet för att göra detta tillgängligt för annat. d) Undantag (Exception) Undantag kastas ofta då något oväntat inträffar i programmet. Det normala kontrollflödet avbryts då, och om man för tillfället exekverar inne i ett try-block så kommer exekveringen iställt att fortsätta i catch-blocket (förutsatt att det hanterar eundantag av rätt typ). Finns inget catch bock så fortsätter man att leta efter ett sådant i den anropande metoden. Denna process fortsätter tills dess undantaget når toppnivån, då detta sker avbryts programmet och ett felmeddelande skrivs ut. e) Abstrakt klass En klass som kan innehålla abstrakta metoder (metoder utan definition). Abstrakta klasser kan inte instantieras (man kan ej skapa objekt från dem). Man använder dem genom att ärva dem vidare till andra klasser, som om de inte också skall bli abstrakta måste implementera alla eventuella abstrakta metoder. 3
Används ibland för att markera att en klass är för generell för att kunna användas direkt. f) Paket En samling klasser. Klasserna i paketet måste ligga i samma katalog (med samma namn som paketet). Alla klasser måste också börja med en sats package paketnamn; Oftast sammlar man saker som på ett eller annat sätt hör ihop i ett paket.exempel på paket: java.awt och java.lang. Ett paket kan göras tillgängligt i ett programm (vilket gör att man kan använda klasserna i det) genom att man skriver import paketnamn; i sin klass. Uppgift 6. (3p) Vad skrivs ut då man kör main metoden i klassen Child nedan? Förklara också varför just detta skrivs ut. public class Parent private String attrib; public Parent() this("ett Ord"); public Parent(String attrib) this.attrib=attrib; void printmessage() System.out.println("Här kommer " + attrib); public class Child extends Parent public Child(String arg) super(arg); public static void main(string args[]) Parent hej=new Child("hej"); Parent dej=new Parent("dej"); hej.printmessage(); hej=new Parent(); hej.printmessage(); dej.printmessage(); 4
void printmessage() super.printmessage(); System.out.println("Hur går det?"); (siffrorna är bara till för förklaringen) 1. Här kommer hej 2. Hur går det? 3. Här kommer Ett Ord 4. Här kommer dej 1 och 2: Dessa utskrifter kommer från den första hej.printmessage(). Hejobjektet är denna gång av typen child (trots att referensen är av typen parent. Därför så kommer Childs printmessage metod att anropas. Denna Anropar super.printmessage det första den gör (dvs printmessage metoden i Parent klassen. Därifrån härstammar rad 1. Sedan skrivs rad 2 ut. 3: Denna rad skrivs ut av den andra hej.printmessage anropet. Denna gång så är hej ett objekt av typen parent, så parents metod anropas. Detta objekt skapades mha konstruktorn som inte tar någon parameter i Parentklassen. Denna anropar i sin tur konstruktorn som tar en sträng (med strängen Ett Ord ), därav det som följer efter Här kommer. 4: Härstammar från anropet dej.printmessage. Inte så mkt konstigt med denna utskrift. Dej är av typen Parent och skapades med konstruktorn som tog en sträng. Uppgift 7. (10p) Skriv en klass för att hantera rationella tal (Du minns att rationella tal skrivs som en täljare och nämnare, exempelvis 5/8, eller hur?). Klassen skall åtminstone innehålla metoder för att addera två tal, multiplicera två tal, och jämföra om två tal är lika (tänk på att 1/3=2/6 osv). För att objekt av din klass skall kunna skrivas ut (mha System.out.println tex) så måste du också omdefiniera metoden tostring. Om man försöker skapa ett rationellt tal med 0 i nämnaren skall ett ArithmeticException kastas (ArithmeticException har en konstruktor som inte tar några parametrar). Skriv även ett litet testprogram som testar din klass och de metoder som finns i den. public class Rational private int denom; private int num; public Rational(int num, int denom) if (denom==0) throw(new ArithmeticException()); this.denom=denom; 5
this.num=num; public Rational add(rational second) return (new Rational(denom*second.num+num*second.denom, denom*second.denom)); public Rational multiply(rational second) return (new Rational(num*second.num, denom*second.denom)); public boolean compare(rational second) return (denom*second.num==num*second.denom); public String tostring() return (num+"/"+denom); public static void main(string args[]) Rational test1=new Rational(1,2); Rational test2= new Rational(2,4); System.out.println("Add test: 1?"+test1.add(test2)); System.out.println("Mult test: 1/4?" +test1.multiply(test2)); if(test1.compare(test2)) System.out.println("test1=test2"); 6
Uppgift 8. (3p) Vad skrivs ut när man kör main-metoden i klassen Uppg8? Förklara också hur parametrar av olika typer skickas till metoder. public class Num public int value; public Num (int v) value = v; public String tostring() //Denna metod saknades return (""+v); //Num public class Uppg8 static int x = 1; static int y = 2; static Num z =new Num(3); public static void f(int x,num z) x = 4; z.value=5; y = 6; System.out.println("x = "+x+" y = "+y+" z = "+z); public static void main(string[] args) f(x,z); System.out.println("x= "+x+" y = "+y+" z = "+z); x=4 y=6 z=5 x=1 y=6 z=5 För parametrar som är objekt så kopieras en referens till objektet till metoden För primitiva typer så kopieras värdet på variabeln. 7