Tentamen i Imperativ Programmering med Grundläggande

Tentamen i Imperativ Programmering
med Grundläggande Objektorientering,
DIT012
Joachim von Hacht
Datum: 2017-01-10
Tid: 14.00-18.00
Hjälpmedel: Engelskt-Valfritt språk lexikon
Betygsgränser:
•
U: -23
•
G: 24-43
•
VG: 44-60 (max 60)
Lärare: Joachim von Hacht, tel. 031/772 10 03. Någon besöker ca 15.00 och 16.00,
Granskning: Tentamen kan granskas på studieexpeditionen. Vi ev. åsikter om rättnin-
gen eposta mig och ange noggrant vad du anser är fel så återkommer jag (ev. ta
en bild och skicka).
Instruktioner:
•
För full poäng på essä-frågor krävs ett läsbart, begripligt och heltäckande svar.
Generellt 1p för varje relevant aspekt av problemet. Oprecisa eller alltför generella
(vaga) svar ger inga poäng. Konkretisera och/eller ge exempel. Det är aldrig någon
risk att vara övertydlig!
•
Det räcker med enbart relevanta kodavsnitt, övrig kod ersätts med ...
(aldrig
import, main-metod, etc....)
•
Överkomplicerade lösningar kan ge poängavdrag.
•
Vi utgår från att användaren alltid skriver rätt och/eller gör rätt (d.v.s ingen
felhantering behövs). Om felhantering skall ingå anges detta specikt.
LYCKA TILL...
1
GU
DIT012
D&IT
Joachim von Hacht
1. Förklara med en eller ett par meningar:
4p
a) Aktuell och formell parameter.
b) Klass och objekt.
2. Vilka rader 1-8 nedan ger kompileringsfel? Motivera kortfattat.
int i = 1;
char ch = '1';
double d = 1.0;
i = d;
i = ch;
ch = i;
ch = d;
d = i;
d = ch;
d = doIt(ch);
//
//
//
//
//
//
//
4p
1
2
3
4
5
6
7
int doIt(int i){ return (double) i;}
// 8
3. Skriv en metod digitSum( int n ) som ger siersumman för något positivt heltal n.
Exempel:
n
123
444
9
4p
siffersumma
6
( = 1 + 2 + 3)
12
( = 4 + 4 + 4)
9
(= 9)
4. Skriv en metod secondLargest( int[] a) som givet en heltalsarray a returnerar det
näst största talet i arrayen. Vi antar att
a
[1,5,3,7,2]
[9,2]
[3, 5, 7, 5]
[7,7,7]
resultat
5
2
5
7
2
a.length ≥ 2.
Exempel:
6p
GU
DIT012
D&IT
Joachim von Hacht
5. Skapa en klass för cirklar och visa hur du instansierar två cirkelobjekt samt slår
ihop dessa med hjälpa av metoden merge, se nedan. Alla cirklar har en position (i
2D) samt en radie. Följande gäller:
•
10p
Klassen skall ha en konstruktor som givet position och radie initierar objektet
med aktuella värden.
•
Klassen skall ha en metod som returnerar cirkelns area (A
= πr2 ).
För
π
kan
Math.PI användas. Metoderna Math.pow(base,exp) och Math.sqrt() (kvadratrot) får användas.
•
Klassen skall ha en metod merge som slår ihop aktuell cirkel med en annan
cirkel. Sammanslagningen skall skapa en ny cirkel med arean lika med summan
av de sammanslagna cirklarnas areor och med position som cirkeln med störst
area.
6. Skriv en metod, String rle( String str ), som returnerar en komprimerad version
strängen str.
Komprimeringen ersätter följder av lika tecken med ett numeriskt
8p
värde för antalet tecken samt tecknet, se nedan. Strängen består bara av de engelska
bokstäver (a-z, A-Z).
str
aaaaaeeeeefffw
qqqqqqqqqqqq
komprimerad
5a4e3f1w
12q
Färdiga metoder (från olika klasser) som får användas.
String
- charAt(int i), ger tecknet vid index i.
- indexOf(char ch), ger index för tecknet ch, -1 om tecknet saknas.
- length() ger längden av strängen.
- subString(int start, int end), ger en delsträng från
start (inkl.) till end-1.
- subString(int start), ger en delsträng från start (inkl.)
till strängens slut.
- toCharArray(), gör om strängen till en array med tecken
StringBuilder
- append(String s), lägger till strängen s sist i Stringbuilder-objektet.
- append( char ch ), som ovan
- setLength(), sätter aktuell längd, setLength(0) raderar alla tecken.
- toString(), omvandlar StringBuilder-objektet till en String.
Character
- isDigit(ch) (klassmetod). Metoden returnerar sant om ch är 0-9.
Integer
- valueOf(String s) (klassmetod). Metoden omvandlar en sträng till
ett heltal. OBS! Att metoden kastar ett undantag för tomma strängen.
3
GU
DIT012
D&IT
Joachim von Hacht
7. Vad kommer programmet nedan att skriva ut? Förklara i detalj genom att rita en
bild med variabler, referenser och objekt (lådor, pilar, ...). Du måste rita!
N n1 = new N(1);
N n2 = new N(2, n1);
N n3 = new N(3, n2);
N n = n3;
while (n != null) {
out.print(n.i);
n = n.n;
}
8p
// Now, how will this look?
// What happens here?
public class N {
int i;
N n;
public N(int i) { this.i = i; }
public N(int i, N n) { this.i = i; this.n = n; }
}
8. Skriv en metod som givet en array av heltal, sorterade i stigande ordning, försöker
avgöra om summan av tre godtyckliga element blir 0. Om en sådan summa hittas
returneras en array med index till de tal som ingick i summan. Annars returneras
en tom array. Metoden behöver bara returnera någon (första funna) lösning. Vi
anta att längden på arrayen är
≥ 3.
Exempel:
Array
[-9, -4, 0]
[0, 0, 0, 1]
[1, 2, 3]
[-25, -10, -7, -3, 2, 4, 8, 10]
Resultat
[]
[0, 1, 2]
[]
[1,4,6] eller [2,3,7]
a) Beskriv din lösning på vanlig svenska. Vilken eller vilka idé(er) bygger lösningen på? Rita gärna!
b) Skriv ner metoden i kod.
4
10p
GU
DIT012
D&IT
Joachim von Hacht
9. Betrakta koden nedan.
6p
a) Vilka rader kommer inte att kompilera. Förklara!
b) Om de rader som inte kompilerar kommenteras ut, vad kommer programmet
att skriva ut? Förklara!
A a1 = new B();
A a2 = new C();
B b1 = new C();
B b2 = new A();
IX ix1 = new A();
IX ix2 = new C();
a2.doIt();
// Will print?
public interface IX { void doIt();}
public class A {
public void doIt() { out.println("A doIt()");}
public void doOther() { out.println("A doOther()");}
}
public class B extends A {
public void doYetOther(){ out.println("B doYetOther()"); }
}
public class C extends A implements IX {
public void doIt() { out.println("C doIt()");}
}
5