LULEÅ TEKNISKA UNIVERSITET Tentamen i Objektorienterad programmering och design Totala antalet uppgifter: 5 Lärare: Håkan Jonsson, Tomas Johansson, 491000 Resultatet offentliggörs senast: 2009-05-25. Kurskod D0010E Datum 2009-05-15 Skrivtid 5 tim Tillåtna hjälpmedel: Inga. Javas standardbibliotek får endast användas i den utsträckning detta uttryckligen tillåts. 1. Teori a) Ange två goda anledningar till att arv finns i objektorienterade språk (t ex Java). (2p) b) Hur ska man deklarera en klass i Java så att . . . 1) . . . det inte går att skapa dynamiska objekt av den? (1p) 2) . . . den inte går att ärva? (1p) c) G är ett publikt deklarerat gränssnitt i paketet p1 som innehåller en metod m() deklarerad protected. Paketet p2 innehåller 1200 klasser A1 ,A2 , . . . ,A1200 sådana att A1 implementerar G och Ai ärver Ai−1 för 2 ≤ i ≤ 1200. Slutligen finns ett tredje paket p3 i vilket det ligger en klass X som ärver A1200 . I vilka av alla klasserna syns m()? (1p) d) Skriv en rekursiv metod som tar en sträng som argument, samt returnerar den reverserade strängen. I bilagan listas tillåtna strängfunktioner. (1p) 2. Naturliga tal (6p) Ett naturlig tal kan sägas vara ett heltal som inte är negativt. Implementera en klass Nat för att representera muterbara naturliga tal och med följande innehåll: public Nat(int n) skapar ett naturligt tal med värdet n. Om n < 0 ska ett undantag med lämpligt felmeddelande kastas. public Nat() skapar ett naturligt tal med värdet 0. public void add(Nat n) adderar n till talet. public void sub(Nat n) subtraherar n från talet. Om resultatet blir negativt ska ett undantag med lämpligt felmeddelande kastas. public int toInt() ger talet som ett int. 3. Polynom (6p) Ett polynom i x är en summa där termerna är potenser med basen x och den största exponenten anger polynomets gradtal. Polynomet 2x4 + x3 − 8x2 + 4x + 7 har t ex gradtalet 4. Polynom adderas genom att kooefficienterna adderas. Om t ex f1 (x) = 2x3 + 3x2 − 8x + 4 och f2 (x) = 6x2 − 2x + 7, så är f1 (x) + f2 (x) = (2 + 0)x3 + (3 + 6)x2 + (−8 − 2)x + (4 + 7) = 2x3 + 9x2 − 10x + 11. Skriv en metod som adderar två polynom och returnerar resultatet. ! Antag att ett polynom f (x) = ni=0 ci xi representeras med en array med doubles, där arrayelementet på index i är ci och arrayens längd minus 1 således är polynomets gradtal. 4. Grindar En grind är en digital elektronisk komponent som ger en boolsk utsignal som beror av boolska insignaler1 . Välkända grindar beräknar logiska funktioner som AND, OR och NOT men även andra är möjliga. Grindar kopplas ihop till kretsar genom att utsignaler från vissa grindar används som insignaler till andra. I exemplet i Fig. 1 x AND u OR y z AND NOT Figur 1: Kretsexempel. finns en krets med fyra grindar varav två AND, en OR och en NOT. Signaler överförs längs streck och alltid in på vänster sida om en figur och ut på höger sida. T ex så består den ena av insignalerna till OR-grinden av utsignalen från NOT-grinden. Vidare är x, y och z insignaler till kretsen samtidigt som u är hela kretsens utsignal. Kretsen motsvarar (x ∧ (y ∧ z)) ∨ (¬(y ∧ z)). a) Implementera klasserna i UML-diagrammet i Fig. 2 så att de representerar de välkända grindarna samt klassen Input. (4p) Konstruerarna för de välkända grindarna tar som argument grindar vars utsignaler ska användas som insignaler. <<abstract>> Gate + boolean output() Input +Input(boolean a) +void set() +void clear() And +And(Gate a, Gate b) Or +Or(Gate a, Gate b) Not +Not(Gate a) Figur 2: UML-diagram till uppgift 4. Input används för en speciall slags grindar som saknar insignaler men som ändå ger en utsignal. Utsignalen ges som argument till konstruktorn men kan även ändras genom anrop till metoderna set (som gör utsignalen till true) och clear (som gör den till false). Metoden output beräknar då den anropas en grinds utsignal, som förstås beror av vad insignalerna är just då. Om x, y och z alla är sanna kan exemplet i Fig. 1 kodas så här: ... Input x Input y Input z And and Or or = ... 1 = new Input(true); = new Input(true); = new Input(true); = new And(y,z); new Or(new And(x,and), new Not(and)); Ibland använder man 1 och 0 istället för true och false. (Notera den dubbla användningen av and.) Kretsens utsignal, som är densamma som utsignalen från grinden or, ges av or.output(). b) Antag att vi vill kunna ändra i kretsar under programkörningen och därför tillför metoder i grindklasserna som byter ut insignalkällorna. Hur skulle du ändra/vad skulle du lägga till för att det inte skulle gå att skapa en krets i vilken en insignal till en grind direkt eller indirekt beror av dess egen utsignal (en slags ”rundgång”)? (2p) 5. Lista (6p) Implementera en klass för godtyckligt långa listor. Förutom en konstruktor ska det finnas metoder för att (a) stoppa in ett element, (b) ta ut det äldsta elementet (det som funnits i listan längst tid vid anropet) samt (c) få reda på antalet element i listan. Skapa internt en länkad lista genom att använda en intern nodklass; du får inte använda arrayer eller färdiga klasser ur Javas standardbibliotek. Strängfunktioner till 1d Följande strängfunktioner får användas i uppgift 1d: • public int length(): Returns the length of this string. • public char charAt(int index): Returns the character at the specified index. An index ranges from 0 to length() - 1. The first character of the sequence is at index 0, the next at index 1, and so on, as for array indexing. • public String substring(int beginIndex, int endIndex): Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex. Examples: "hamburger".substring(4, 8) returns "urge" "smiles".substring(1, 5) returns mile" Sanningstabeller AND a true true false false b true false true false a∧b true false false false a true true false false b true false true false a∨b true true true false OR NOT a true false ¬a false true