Tentamen i Programmeringsteknik MN1 010116 Skrivtid : 09.00-14.00 Hjälpmedel : Skansholm, Java direkt eller motsvarande Pärt-Enander mfl, Anv. handledning för Matlab. Matlab-material utdelat på lektion. Tentamen är uppdelad i två delar. Del I består av fem uppgifter och del II av tre uppgifter. Varje uppgift kan ge upp till 5 poäng. För att bli godkänd på tentamen krävs minst 17 av 25 poäng på del I. Eventuella poäng på del II tillgodoräknas inte. För att bli väl godkänd på tentamen krävs dels minst 17 poäng på del I, dels minst 8 poäng på del II. Programmen skall vara skriva i Java om inte annat anges. Programmen skall vara skriva med vettig layout och kommenterade! Skriv varje uppgift på nytt papper. Skriv inte på baksidan av papperet. Lägg uppgifterna i rätt ordning. Skriv namn på alla papper. Skriv INTE med röd färg! Läs uppgiften noga så du vet vad som skall göras. Gör inte mer än det som efterfrågas. Om du inte förstår en uppgift eller om du är tveksam hur den ska tolkas, fråga någon av lärarna. Om inget annat anges får du använda klasser ut paketen java.lang, lava.text, java.awt, java.awt.event, java.io, java.util, java.applet samt Skansholms extra. Resultatet anslås på anslagstavla på plan 1(utanför 2103) och på kursens hemsida om du kryssar i aktuell ruta på försättsbladet. Endast godkända resultat anslås. Lösningsförslag kommer att finnas på kursens hemsida. Lycka till! 1
Del I Uppgift 1 Efter att du klarat denna kurs inleder du en ny karriär som bilhandlare. Du vill då naturligtvis skapa ett datoriserat register över ditt billager. En första åtgärd är att skapa en bilklass som beskriver en bil. Den ser ut som (saknade delar markeras med... nedan, det är inte en del av koden): public class Bil { private String bilmärke; // vilken sorts bil private String modell; // modellnamn private int årsmodell; // årsmodell private String registeringsnummer; // private int grundpris; // pris utan moms private static int momssats = 25; // momssats i procent // konstruktorer public Bil() {... public Bil(String märke, String mod, int år, String reg, int p) {... // hämta (returnera) försäljningspriset public int bilpris() {... // skriv ut public void skrivut() {... // ändra momssats public static void ändra_momssats( int nymoms) {... // och så vidare public static void main(string [] args) { Bil b = new Bil( Ford, Anglia, 1959, ABC456, 5000, 20); b.skrivut(): int p = b.bilpris(); System.out.println( Bilen kostar + p + kronor ); 2
Dina uppgifter är att: a) Skriv metoden bilpris i klassen ovan. Den ska lämna ut bilens pris. Priset ska vara bilens grundpris med momsen pålagd. Se mainmetoden ovan för exempel på hur den ska fungera. b) Som du ser är tillståndsvariabeln momssats deklarerad som static. Förklara vad det betyder. c) Skriv metoden ändra_momssats i klassen. Den skall ändra momssatsen. Visa hur metoden kan användas i mainmetoden. Vad betyder det att den är deklarerad som static? d) Antag att du nu skapar en klass Lager som beskriver alla bilar du har. Den kan se ut som: public class Lager { private Bil [] lager; private int antal; public Lager () {... public void skrivut() {... // mina bilar // antal bilar i lager // standardkonstruktor // skrivut data om alla bilar Skriv standardkonstruktorn i klassen. Den ska skapa plats för ett antal bilar. Du bestämmer själv vad som menas med ett antal (ett heltal större än noll) e) Skriv metoden skrivut i klassen Lager som ska skriva ut data om alla bilar som finns i lager. Använd bilklassens metoder. 3
Uppgift 2 Vi vill skapa ett enkelt gissningsspel där datorn tänker på ett tal, du gissar sedan och datorn talar om ifall du gissar rätt eller om ditt tal är för stort eller för litet. Du fortsätter att gissa tills du gissat rätt. Det kan implementeras så här: public class Game { private int talet; // det tal datorn tänker på public Game() {... // tänk på ett tal i intervallet 1-9 public Game(int min, int max){... // tänk på ett tal i intervallet [min,max] public int guess(int mitt_tal) {... // gissa ett tal public static void main(string [] args) {... Dina uppgifter är att: a) Skriv standardkonstruktorn som med hjälp av en slumptalsgenerator gissar ett tal i intervallet 1-9. Talet spara i objektetets instansvariabel talet. b) Skriv metoden guess som testar din gissning (metodens parameter) och som ger tillbaka ett svar som anger om din gissning var för stor, för liten eller lagom. (2p) c) Skriv metoden main som skapar ett objekt av typen Game och som sedan gissar till det blir rätt. (2p) 4
Uppgift 3 Du har ett Javaprogram som har åstadkommit följande grafiska gränsnitt för en applikation. Den prickskjuter mot ett mål med hjälp av inställningsreglage och en avfyrningsknapp. a) Beskriv vilka komponenter som har använts för att bygga upp detta. Rita och berätta, du behöver inte skriva någon Javakod. Ange också vilka LayoutManagers som använts. b) Skissa på ett Java program som skapar detta gränssnitt. Utgå från en Frame och fyll den med komponenter. (2p) 5
c) Skriv de lyssnare som behövs för att skjutreglagen och avfyrningsknapp ska fungera. (2p) Uppgift 4 Antag att vi anordnar en konståkningstävling. Vi behöver då ett antal domare. De ka vi skapa så här: public class Domare { private String namn; public Domare() {... // standardkonstruktor public double poäng() {... // ge poängen Sedan kan vi skapa en tävlingsklass med 10 domare. Den kan se ut på detta sätt: public class Tävling { private Domare [] jury = new Domare[10]; public Tävling() { for (int i = 0; i < 10; i++) jury[i] = new Domare(); public double resultat() {... // returnerar åkarens totalpoäng public static void main(string [] args) { Tävling t = new Tävling(); double p = t.resultat(); // resultat för första åkaren I ett realistiskt program behöver vi en klass Åkare också men vi bryr oss inte om det nu. Din uppgift är att skriva metoden resultat i klassen Tävling. Den ska fungera på följande sätt: Skapa en array av reella tal med 10 element för domarpoängen. Hämta varje domares poäng och lägga in i arrayen. Summera alla domarsiffrorna i arrayen. Leta upp det största och det minsta värdet bland domarsiffrorna. Dessa tas bort från vår summa. Det som återstår delas med åtta och returneras. (5p) 6
Uppgift 5 En rät linje kan skrivas på formen y = kx + l där k anger linjens lutning och l anges dess intercept (skärning med y-axeln). Deklarera och implementera en klass RätLinje som representerar en rät linje. Lämpliga attribut (tillståndsvariabler, instansvariabler) kan vara linjens lutning och intercept. Klassen ska innehålla en standardkonstruktor och metoder för inläsning och utskrift av en linje. Dessutom ska klassen innehålla en metod som undersöker om linjen är parallel med en annan linje. Två linjer är parallella om de har samma lutning. Skriv ett huvudprogram som deklarerar och skapar två linjer, läser in dessa räta linjer och undersöker om de är parallella. Din klass ska inte på något sätt rita linjen utan bara innehålla dess egenskapen. (5p) 7
Del II Uppgift 6 Antag att du har en klass som innehåller ett antal talpar som representerar punkter i ett x-y system. Varje talpar representeras som ett objekt av typen Point, och alla talparen blir då en array av Point-objekt. public class Koordinater { private Point [] talpar; private int antal; public Koordinater() {... // antal talpar lagrade // standardkonstruktor public Koordinater(int n){... public void läggin(point p) {... public void sortera() {... // osv // plats för n talpar // Lägg in ett talpar // sortera talparen Din uppgift är att skriva samtliga metoder deklarerade ovan. Konstruktorerna skall skapa plats för ett antal talpar. Metoden läggin skall lägga in ett talpar utan hänsyn till ordning, om det är fullt skall arrayen utökas. Metoden sortera skall sortera talparen i stigande ordning med avseende på x-koordinaten. Klassen Point har två publika instansvariabler, x och y. Eftersom klassen Point inte implementerar interfacet Comparable så fungerar ingen av de i Java inbyggda sorteringsmetoderna, exempelvis java.util.arrays.sort. Du måste alltså skriva en egen! Uppgift 7 En stack är en mekanism för att lagra ett antal värden av någon typ. En stack har operationer som av tradition kallas push för att lagra ett nytt värde och pop för att ta ut ett värde. Det som är specellt för stack-mekanismen är att det är det senast inlagda som först kommer ut. Man kan likna en stack vid en hög papper --- man lägger nytt högst upp, push, och tar alltid det översta när något skall hämtas, pop. 8
En stack kan implementeras med hjälp av en klass med en array för att lagra de olika värdena. Man måste hålla reda på hur många element som i varje ögonblick är lagrade i stacken. Detta antal anger då också var nästa element skall lagras vid en push. public class Stack { private int stacksize; // Arraystorlek private double[] theelements; private int top = 0; // Elementen i kön // Antal element tillika // plats att lagra nästa element public Stack(int asize) {... // Konstruktor. Parametern public boolean isempty(){... public push(double val) {... public double thetop (){... // anger arrayens storlek // true om stacken tom // Lagra val på stacken // Returnerar översta public double pop() {... // Returnerar översta och // tar bort det från stacken Vi ska utnyttja en stack för att göra en speciellt sorts kalkylator, en kalkylator som läser och evaluerar aritmetisk uttryck i omvänd polsk notation (RPN). I denna notation skrivs operatorn efter sina operander i stället för mellan. Således skrivs 1 + 2 som 1 2 +. Fördelen med denna notation är att operationerna skrivs i den ordning de skall utföras. Exempel: (1 + 2)*3-4 skrivs som 1 2 + 3 * 4 - För att beräkna värdet av ett uttryck i RPN läser man uttrycket från vänster till höger. Om ett tal kommer lägges de på stacken. När en operator kommer hämtar man de två översta elementen på stacken, utför angiven operation och lägger resultatet på stacken. Skriv ett program som läser uttryck från tangentbordet och utför beräkningarna enligt ovan. När ett p påträffas i inputströmmen skall det översta värdet på stacken skrivas ut och när ett q kommer skall programmet avbrytas. Tips: Skansholms ExtendedReader har mycket användbara metoder för denna uppgift. Se sid 88. Exempel på körning (rader som slutar med p eller q har användaren skrivit --- övriga är skrivna av programmet): 9
kursa$ java Calculator 1 2 + 3 * 4 - p 5 10 + p 15 3 4 + * p 105 q kursa$ Uppgift 8 Antag att du har följande klass deklarerad: public class Matris { private int [][] matris; private int rader; private int kolonner; public Matris() {... public Matris(int r, int k) {... public boolean symmetrisk() {... public boolean enhetsmatris() {... public Matris addera(matris b) {... // antal rader // antal kolonner public Matris subtrahera(matris b) {... // standardkonstruktor // konstruktor med storlek // testa om symmetrisk // testa om enhet // addera två matriser // subtrahera två matriser public Matris multiplicera(matris b) {... // multiplicera - - Skriv metoderna enhetsmatris och addera samt de båda konstruktorerna. Att en matris är en enhetsmatris innebär dels att den är kvadratisk (lika många rader som kolonner), dels att alla element utom huvuddiagonalen har värdet noll, huvuddiagonalen har värdet 1 10
Exempelvis är matrisen nedan en enhetsmatris: 1 0 0 0 1 0 0 0 1 Att addera två matriser kräver att de är exakt lika stora. Resultatmatrisen ska ha samma storlek och elementen ska vara summan av motsvarande element i de två ingående matriserna. Exempelvis gäller 2 4 1 2 5 1 + 1 8 1 4 2 3 = 3 12 0 6 7 2 11