Lunds universitet FYTA11 Institutionen för Teoretisk fysik HT 10 Lösningsförslag tentamen FYTA11 Java Måndag 10:e januari 2011, 09:00 13:00 Instruktioner Hjälpmedel: enkla ritverktyg och Javadoc-genererade referensblad som delas ut med tentan. Behandla högst en uppgift per papper och sätt ditt namn på varje papper. 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 vardera kan ge upp till tio poäng. Uppgift 1: Korrigera felen i följande kodsnuttar. a. String s = "Hello!"; // System.out.println(s + ": " + s.length); System.out.println(s + ": " + s.length()); b. class A { protected Integer val; A(int v) {val = new Integer(v); static class B extends A { // B() {val = new Integer(0); B() {super(0); c. d. try { int b = 1000/a; // catch(arithmeticexception) { catch(arithmeticexception e) { System.err.println("Heltalsdivision med 0"); System.exit(-1); import java.awt.*; import java.awt.geom.*;... Point p = new Point(8, 20); // Point2D q = p.clone(); Point2D q = (Point2D)p.clone();
e. f. g. h. i. j. public class FixedPrec2D extends java.awt.geom.point2d { private long x, y; private final long denom = 1000000; public double getx() {return (double)x/denom; public double gety() {return (double)y/denom; //this line was inserted public void setlocation(double x, double y) { this.x = Math.round(x*denom); this.y = Math.round(y*denom); class SillyVec { // public java.util.vector<int> content; public java.util.vector<integer> content; final int N = 8; // System.out.println((int)Math.random()*N); System.out.println((int)(Math.random()*N)); int i; // for(i = 0; i < 4; ++i); for(i = 0; i < 4; ++i) System.out.print(" " + i); System.out.println(); class Hello { // public void main(string[] a) { public static void main(string[] a) { System.out.println("Hello!"); import java.awt.*; import java.awt.geom.*;... Point2D p = new Point(4, 8); System.out.println(p); // p = new Point2D(5.43, 2.9); p = new Point2D.Double(5.43, 2.9);
Uppgift 2: Kontrollera sudoku En sudoku består av ett rutnät med 9 9 rutor som skall fyllas med en siffra i vardera ruta. Vissa rutor har siffror som är givna på förhand och utmaningen består i att fylla de tomma rutorna så att följande regler uppfylls: I var och en av de 9 raderna i rutnätet skall siffrorna 1 till 9 vara ifyllda med exakt en förekomst av varje siffra. Samma villkor som ovan fast tillämpat på de 9 kolumnerna i rutnätet. Rutorna i rutnätet delas också in i 9 grupper om vardera 3 3 angränsande rutor. Varje sådan grupp skall också vara fylld med siffrorna 1 till 9 så att varje siffra förekommer exakt en gång inom gruppen. Din uppgift här är att skriva en publik instansmetod issolved till en given klass Sudoku. Klassen Sudoku har en privat instansvaribel state av typen char[][] sådan att state[r][c] anger tecknet som finns i ruta c i rad r. Metoden issolved tar inga argument och returnerar en boolean som är sann om och endast om innehållet i state uppfyller ovanstående regler. Du kan utgå ifrån att storleken på fälten i state matchar en 9 9-matris men tecknen som lagrats i state är inte nödvändigtvis inom intervallet 1 till 9. public boolean issolved() { for(int i = 0; i < 9; ++i) { int[] s = new int[3]; boolean[][] used = new boolean[3][9]; for(int j = 0; j < 9; ++j) { s[0] = state[i][j] - 1 ; s[1] = state[j][i] - 1 ; s[2] = state[3*(i/3) + j/3][3*(i%3) + j%3] - 1 ; for(int m = 0; m < 3; ++m) { if(s[m] < 0 s[m] >= 9 used[m][s[m]]) return false; used[m][s[m]] = true; return true;
Uppgift 3: Lyssna på JButtons Ett ofullständigt huvudprogram till Sudoku-klassen i föregående uppgift är givet. Din uppgift består i att komplettera klassen SudokuFrame med en main-metod för att starta programmet och en lyssnar-metod för att fånga tryckningarna på de JButtons som lagts till i konstruktorn. Knapparna Ny sudoku och Börja om skall leda till anrop av metoderna sudoku.picksudoku() respektive sudoku.reset(). Knappen Rätta skall ge ett anrop till metoden issolved som beskrivs i föregående uppgift och en dialogruta med lämpligt meddelande beroende på returvärdet skall visas. Observera att du inte får göra ändringar i den givna konstruktorn. Tips: I ovanstående kod blir kommandosträngen för den händelse som genereras av en knapptryckning densamma som den sträng som visas på knappen. public void actionperformed(actionevent e) { String cmd = e.getactioncommand(); if(cmd.equals(newstr)) sudoku.picksudoku(); else if(cmd.equals(resetstr)) sudoku.reset(); else if(cmd.equals(checkstr)) JOptionPane.showMessageDialog (this, sudoku.issolved()? "Korrekt!": "Felaktig eller ofulständig lösning.", "Rättning", JOptionPane.PLAIN_MESSAGE); sudoku.requestfocus(); public static void main(string[] a) { new SudokuFrame();
Uppgift 4: Hantera tangenttryckningar Sudoku-klassen från uppgift 2 behöver hantera utritning, musklick och tangenttryckningar. Din uppgift består i att fylla definitionen av en anonym KeyAdapter-klass med meningsfull kod. En tryckning på en siffertangent 1 till 9 skall sätta state[row][col] till tecknet för den nedtryckta siffran om locked[row][col] är falsk. (Instansvariabeln locked är sann för de rutor vars siffror är givna från början.) En tryckning på mellanslag, backspace eller delete skall sätta state[row][col] till mellanslag om locked[row][col] är falsk. En tryckning på en piltangent skall uppdatera row och col på lämpligt sätt. Kolumnerna går från vänster till höger och raderna går uppifrån och ner. Variablerna row och col måste alltid ha värden i intervallet 0 till och med 8. Slutligen skall metoden repaint() anropas om och endast om state, row eller col har ändrats. public void keypressed(keyevent e) { char ch = e.getkeychar(); if(ch >= 1 && ch <= 9 ) { if(locked[row][col] state[row][col] == ch) return; state[row][col] = ch; else switch(e.getkeycode()) { case KeyEvent.VK_SPACE: case KeyEvent.VK_DELETE: case KeyEvent.VK_BACK_SPACE: if(locked[row][col] state[row][col] == ) return; state[row][col] = ; break; case KeyEvent.VK_RIGHT: case KeyEvent.VK_KP_RIGHT: if(col == 8) return; ++col; break; case KeyEvent.VK_LEFT: case KeyEvent.VK_KP_LEFT: if(col == 0) return; --col; break; case KeyEvent.VK_DOWN: case KeyEvent.VK_KP_DOWN: if(row == 8) return; ++row; break; case KeyEvent.VK_UP: case KeyEvent.VK_KP_UP: if(row == 0) return; --row; break; default: return; repaint();