Lunds universitet FYTA11 Institutionen för Teoretisk Fysik HT 08 Omentamen FYTA11 Javaprogrammering Onsdag 4:e februari 2009, 13:00 17:00 Instruktioner Inga hjälpmedel är tillåtna. Behandla högst en uppgift per sida, och sätt ditt namn och personnummer på varje sida. Skriv läsligt och kommentera utförligt vad du gör det kan ge dig poäng även om resultatet blir fel. Tentamen omfattar fyra uppgifter som alla kan ge upp till tio poäng. Uppgift 1: En liten klasshierarki Nedan visas några enkla klasser för att representera anställda på ett företag. Basklassen är Employee som har ett namn och en lön. En chef, som är också en anställd, representeras av klassen Boss och har, förutom ett namn och en lön, också en månatlig bonus. Skriv färdigt konstruktorn och paycheque metoden i klassen Boss så att de fungerar enligt kommentarerna (Employee klassen får ej modifieras). Klassen PayCheques på nästa sida används för att skriva ut en lönelista i det väldigt lilla företaget PytteMjuk. Vad skrivs ut om man kör main metoden? Skriv om hela klassen PayCheques så att utskriftsmetoden får signaturen. public static void printcheques(collection<employee> payroll); men i övrigt fungerar som innan. Använd en lämplig kontainerklass från standardbiblioteket och använd en iterator eller förenklad for-sats till loopen i utskriftsmetoden. Om du är osäker på hur metoder i standardbiblioteket är deklarerade är det tillåtet att göra välmotiverade och väldokumenterade antaganden. 1
/** This class represents an employee of * a company. public class Employee { private String thename; private double thesalary; /** Create an employee with a name and * a salary. public Employee(String name, double salary) { thename = name; thesalary = salary; /** Return the monthly amount to be payed to * the employee. public double paycheque() { return thesalary; /** Return the name of the employee. public String name() { return thename; /** This class represents an employee of a company * in a managerial position. public class Boss extends Employee { private double thebonus; /** Create an employee with a name, salary and * a monthly bonus. public Boss(String name, double salary, double bonus) { // name och salary ska sättas i superklassen // bonus skall tilldelas denna klass /** Return the monthly amount to be payed to the * employee, which in the Boss case should * include the bonus. public double paycheque() { // returnera bonusen plus lönen från // superklassen. /** Return the bonus. public double bonus() { return thebonus; public class PayCheques { public static void main(string[] args) { Employee[] staff = new Employee[3]; staff[0] = new Employee("John Doe", 10000.0); staff[1] = new Employee("Per Persson", 12000.0); staff[2] = new Boss("Jill Bates", 30000.0, 55000.0); printcheques(staff); /** Write out a payroll given a field of employees. public static void printcheques(employee[] payroll) { for ( int i = 0; i < payroll.length; ++i ) System.out.println("Name: " + payroll[i].name() + ", amount: " + payroll[i].paycheque()); 2
Uppgift 2: Sortera Klassen BubbleSort nedan kan användas för att sortera ett godtyckligt fält med heltal. Skriv om klassen så att den istället sorterar ett fält med godtyckliga objekt med hjälp av ett Comparator objekt. Sorteringsmetoden skall ha signaturen public static void sort(object [] v, Comparator cmp). Gränssnittet Comparator är deklarerat i paketet java.util enl. nedan. Om Comparator argumentet är null ska metoden ändå sortera vektorn under antagandet att objekten i fältet implementerar standardgränssnittet Comparable. public class BubbleSort { public static void sort(int [] v) { for ( int i = v.length - 1; i > 0 ; --i ) for ( int j = 0; j < i; ++j ) if ( v[j] > v[j + 1] ) swap(v, j, j + 1); public static void swap(int [] v, int i, int j) { int tmp = v[i]; v[i] = v[j]; v[j] = tmp; public interface Comparable { /** Jämför detta objekt med objektet o. * @param o objektet att jämföra med. * @return 0 om this är ekvivalent med o, * -1 om this kan anses vara mindre än o, * 1 om this kan anses vara större än o. public int compareto(object o); package java.util; public interface Comparator { /** Jämför två objekt. * @param o1 första objektet i jämförelsen. * @param o2 andra objektet i jämförelsen. * @return 0 om o1 är ekvivalent med o2, * -1 om o1 kan anses vara mindre än o2, * 1 om o1 kan anses vara större än o2. public int compare(object o1, Object o2); Uppgift 3: Medelvärde Skriv ett program som skriver ut medelvärdet och variansen av de argument som ges när det startas. Exempelvis ska % java Medel 0.25 10 3-25 0 ge en utskrift liknande Average: -2.35, Variance: 11.886547017532047 Om ett argument inte är ett tal ska ett snällt felmeddelande skrivas ut men medelvärdet av övriga numeriska argument ska ändå vara korrekt. Följande metod i klassen Double kan vara bra att känna till /** Returns a double value initialized to the value represented by * the specified String. * @param s the string to be parsed. * @return the double value represented by the string argument. * @throws NumberFormatException if the string does not contain a * parsable double. public static double parsedouble(string s) throws NumberFormatException; 3
Uppgift 4: Voff! Följande klass ritar en hundliknande form på en Canvas: import java.awt.*; import java.applet.*; import java.net.*; class Dog extends Canvas { AudioClip bark; Polygon dog; public Dog() { setsize(300,300); int [] x = {100, 100, 110, 110, 115, 115, 120, 120, 125, 125, 180, 180, 185, 185, 190, 190, 195, 195, 200, 190, 120, 115, 110; int [] y = {110, 120, 120, 140, 140, 130, 130, 140, 140, 130, 130, 140, 140, 130, 130, 140, 140, 120, 110, 120, 120, 105, 110; dog = new Polygon(x, y, x.length); try { bark = Applet.newAudioClip(new URL("http://www.dog.org/sounds/bark/wienerdog.au")); catch (MalformedURLException e) { bark = null; addmouselistener(/* lägg till din kod här ); public void paint(graphics g) { g.drawpolygon(dog); g.drawstring("dog", 140, 155); Skapa ett objekt av en anonym klass i anropet till addmouselistener så att hunden skäller varje gång man klickar på den (det räcker altså inte att man klickar i fönstret i allmänhet, man ska behöva klicka på själva hunden). Behövs det någon annan kod för att klassen ska fungera? Det går att lösa uppgiften utan att använda en anonym klass, men då får man inte full poäng. Nedan följer beskrivningar av diverse metoder i diverse klasser som kan vara bra att känna till: 4
package java.applet; public interface AudioClip { /** Starts playing this audio clip. Each time this method is called, the clip is restarted from the beginning. void play(); /** Starts playing this audio clip in a loop. void loop(); /** Stops playing this audio clip. void stop(); package java.awt; public class Polygon implements Shape, java.io.serializable { // Lots of constructors and other methods. /** Determines whether the specified Point is inside this Polygon. public boolean contains(point p); /** Determines whether the specified coordinates are contained in this Polygon. public boolean contains(int x, int y); public class MouseEvent extends InputEvent { // Constructors and other methods. /** Returns the horizontal x position of the event relative to the source public int getx(); /** Returns the vertical y position of the event relative to the source public int gety(); /** Returns the x,y position of the event relative to the source public Point getpoint(); public interface MouseListener extends EventListener { /** Invoked when the mouse has been clicked on a public void mouseclicked(mouseevent e); pressed on a public void mousepressed(mouseevent e); released on a public void mousereleased(mouseevent e); /** Invoked when the mouse enters a public void mouseentered(mouseevent e); /** Invoked when the mouse exits a public void mouseexited(mouseevent e); public abstract class MouseAdapter implements MouseListener { /** Invoked when the mouse has been clicked on a public void mouseclicked(mouseevent e) { pressed on a public void mousepressed(mouseevent e) { released on a public void mousereleased(mouseevent e) { /** Invoked when the mouse enters a public void mouseentered(mouseevent e) { /** Invoked when the mouse exits a public void mouseexited(mouseevent e) { /** Return the number of mouse clicks associated with this event. public int getclickcount(); 5