UMEÅ UNIVERSITET Datavetenskap 010824 TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET Datum : 010824 Tid : 9-15 Hjälpmedel : Inga Antal uppgifter : 7 Totalpoäng : 40 (halva poängtalet krävs normalt för godkänt) Börja varje uppgift på nytt papper. Skriv ditt namn och uppgiftens nummer på varje papper. Skriv bara på ena sidan av papperet. Sortera dina papper efter uppgiftsnummer. Kryssa för de uppgifter du lämnar in. Lösningarna skall vara snyggt och prydligt nedskrivna. Tankegången skall vara lätt att följa. Alla antaganden som inte är uppenbara skall redovisas. Javakod krävs där implementation uttryckligen anges. Tips! Försök på alla uppgifter! Observera att uppgifterna inte nödvändigtvis är ordnade efter svårighetsgrad. Uppgifter kan vara felformulerade, fråga om du är osäker eller tycker att något verkar konstigt. Redovisa dina resonemang så är det lättare att bortse från skrivfel. Om du inte kommer ihåg den exakta syntaxen, så gör ett antagande och redovisa detta. Det är viktigt att du löser den givna uppgiften! Lycka till! UMEÅ UNIVERSITET 901 87 UMEÅ Tel.: 090-786 67 35, 62 59, 77 08 e-mail: jubo@cs.umu.se, thomasj@cs.umu.se, marie@cs.umu.se
Uppgift 1 (4 poäng) Evaluera följande boolska uttryck. För varje uttryck utgå från att x=10, y=20 och z=30. 1) x < 10 x > 10 2) x > y && y > x 3) (x < y + z) && (x + 10 <= 20) 4) z - y == x && Math.abs(y - z) == x 5) x < 10 && x > 10 6) x > y y > x 7)!( x < y + z)!(x + 10 <= 20) 8)!(x == y) && (x!= y) && (x > y y > x) Uppgift 2 (1+1+1+1=4 poäng) Vilket värde kommer variabeln sum att ha efter respektive nästade loop? Redovisa hur du kommer fram till ditt svar. a) int sum = 0; for (int i = 0; i <= 5; i++) for (int j = 0; j <= 5; j++) sum = sum + i; b) int sum = 0; int j = 0; do j++; for (int i = 5; i > j; i--) sum = sum + (i+j); while (j < 11); c) int sum = 0; int j; int i = 0; while (i < 5) j = 5; while (i!= j) sum = sum + j; j--; i++; d) int sum = 0; for (int i = 0; i <= 10; i++) for (int j = 10; j > 2*i; j--) sum = sum + (j-i); 2(7)
Uppgift 3 (4 poäng) I Java sker all parameteröverföring med s.k. pass-by-value. Effekten blir dock olika beroende på om parametern är av primitiv typ eller en referens. Utred hur parameteröverföringen fungerar med avseende på denna skillnad, gärna med kompletterande exempel. Uppgift 4 (6 poäng) I denna uppgift ska du göra en objektorienterad design för spelet sänka skepp. I spelet skall datorn spela emot en mänsklig användare. I sänka skepp har varje spelare en spelplan med 10x10 rutor där spelaren placerar ut fem stycken skepp : ett hangarfartyg som tar upp fem rutor, ett slagskepp på fyra rutor, två kryssare på tre rutor var och en ubåt på två rutor. 1 2 3 4 5 6 7 8 9 10 A B C D E F G H I J Spelet spelas sedan i omgångar. Varje spelare får gissa en ruta (t ex B5) där den förmodar att motspelaren har gömt ett skepp. Om spelaren träffar ett skepp får spelaren gissa en gång till tills den missat. Den spelaren som först har sänkt motspelarens alla skepp har vunnit. Du ska inte implementera metoderna. Varje klass, metod och attribut måste dock beskrivas på en sådan nivå att syftet blir lätt att förstå. 3(7)
Uppgift 5 (2+2+2+4=10 poäng) Följande applet, som ritar ut geometriska former, är given: import java.applet.*; import java.awt.*; import java.util.random; // This applet creates and draws // multiple random shapes. public class RandomDraw extends Applet final int MAX_SHAPE = 50; Shape[] shapes = new Shape[MAX_SHAPE]; // Creates and stores multiple shapes. public void init() shapes = new Shape[MAX_SHAPE]; for (int index = 0; index < MAX_SHAPE; index++) shapes[index] = ShapeFactory.getRandomShape(); // method init // Draws all of the shapes on the applet. public void paint (Graphics page) for (int index = 0; index < MAX_SHAPE; index++) shapes[index].draw (page); // method paint // class Random_Draw Din uppgift blir att implementera klasser som representerar och skapar dessa geometriska former. Till ditt förfogande har du följande klass : public class Shape private Color color; public Shape (Color color) // Specifies the color. this.color = color; // constructor Shape public Color getcolor () // Return the color of this shape. return color; // method getcolor Obs! Fortsättning på nästa sida public void draw (Graphics page) // Draws the shape. 4(7)
// method draw // class Shape a) Härled från Shape en klass Square som har sitt övre vänstra hörn i en angiven punkt och önskad bredd (=höjd). b) Härled från Shape en klass Circle som är en oval med origo i en angiven punkt och önskad radie (höjd = bredd). c) Implementera klassen ColorFactory med en statisk metod getrandomcolor som levererar en slumpmässig färg. d) Implementera klassen ShapeFactory som tar fram en slumpmässig geometrisk figur (här bara Square eller Circle) med slumpmässig färg och storlek. ShapeFactory skall använda ColorFactory och fungera i ovanstående Applet. Du får gärna använda följande kod för att generera slumptal i ShapeFactory och ColorFactory: Random rand = new Random(); // Returns a random integer between 1 and max. public int random_int (int max) return Math.abs(rand.nextInt()) % max + 1; // method random_int För att slumpa ut färgen kan man då göra på följande sätt final int COLOR_MAX = 255; // Creates a random color using random RGB // values. Color c = new Color (random_int (COLOR_MAX), random_int (COLOR_MAX), random_int (COLOR_MAX)); Se även medföljande utdrag ur API-dokumentationen om klassen Graphics. 5(7)
Uppgift 6 (2+1+1+1=5 p) a) Varje Java-applikation måste innehålla en metod med följande metodhuvud public static void main(string[] args) Varför måste den se ut på detta sätt? b) Om en klass är abstrakt så kan den inte samtidigt vara deklarerad final. Varför? c) Det reserverade ordet super används för att referera till basklassen (superklassen). Vad är det för skillnad mellan att skriva super( ); och super.metod( ); d) Ge motsvarande förklaring för det reserverade ordet this. Uppgift 7 (5+1+1=7 p) En vanligt sätt att implementera datastrukturer i programspråk är att använda så kallade länkade listor. En länkad lista består av ett antal noder, som innehåller dels det data som man vill lagra i datastrukturen, dels en eller flera referenser till andra noder. En nod i en enkellänkad lista har en referens till nästföljande nod, såsom visas i bilderna nedan. Observera att den sista referensen är null för att markera slutet på listan. Klassdiagram för klassen Nod, som kan innehålla heltal: Nod int data Nod next Så här kan ett antal noder vara länkade under körningen av ett program: head data: 7 data: -44 data: 34 next next next null Referensen 'head' pekar på listans början, och är av typen 'referens till Nod'. 6(7)
En stack är en datastruktur som kan implementeras med hjälp av en enkellänkad lista. En stack fungerar som en trave böcker: det går att lägga till och ta bort saker ur den, men det är bara det översta elementet som är åtkomligt. Om man vill komma åt ett element längre ned så måste man ta bort alla ovanför, ett och ett. De funktioner man kan utföra på en stack är bland annat: push pop isempty lägger till ett element överst läser av (och tar bort) översta elementet kollar om stacken är tom a) Skriv en implementation för klassen Nod, som skall kunna innehålla ett heltal. Skriv sedan klassen Stack, med ovanstående metoder, som använder en lista av noder för att lagra heltal. Följande huvudprogram skall fungera: public static void main(string [] args) Stack s = new Stack(); s.push(34); s.push(-44); s.push(7); while (!s.isempty()) System.out.println(s.pop()); b) Vad blir utskriften från ovanstående program? c) Vad händer i ditt program om man gör pop på en stack som är tom? Hur tycker du att man borde ta hand om detta problem? 7(7)