Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)
Med vissa rättelser. 2005-02-04.





Omtentamen i

Programmering i Java

för Dataingenjörsprogrammet m fl

lördag 29 januari 2005 kl 08:00 - 13:00







Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 42.
För betyget 3 krävs 21 poäng.
För betyget 4 krävs 28 poäng.
För betyget 5 krävs 35 poäng.
Resultat och lösningar: Meddelas på kursens hemsida senast lördag 19 februari 2005.
Visning: Måndag 21 februari 2005 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentor hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-7347013.



LYCKA TILL!

Skriv inte svaren till uppgifterna direkt här, utan skriv på lösa blad och lämna in.

Uppgift 1 (8p)

a)

Vad är Swing och AWT? Hur förhåller de sig till varandra?

b)

Två program som du ingår i Java-distributionen från Sun heter javac och java. Vad är det för program? Hur förhåller de sig till varandra?

c)

När man programmerar i Java jobbar man med en del filer som slutar på .java och en del filer som slutar på .class. Vad är det för filer? Hur förhåller de sig till varandra?

d)

Java skiljer på applikationer och appletar. Vad är det för något? Hur förhåller de sig till varandra?

Uppgift 2 (6p)

a)

Skriv en klass som heter Frukt. Varje frukt ska ha en vikt mätt i gram (till exempel 230) och ett unikt nummer (till exempel 17). Försök komma på något sätt att automatiskt ge varje skapad frukt sitt eget unika nummer. Alla medlemsvariabler ska vara private-deklarerade.

b)

Det finns tre sorters frukter: apelsiner, bananer och äpplen. Alla är de frukter, men varje apelsin har ett visst antal klyftor (till exempel 10) och varje banan har en krökningsradie mätt i centimeter (till exempel 92). Skapa klasser för dessa frukter. Alla medlemsvariabler ska vara private-deklarerade.

c)

Skriv en main-metod som skapar ett objekt vardera av de fyra olika klasserna ovan.

Uppgift 3 (6 p)

Skriv en Java-applet som kan addera tal och hålla reda på summan. Det ska finnas en inmatningruta där man kan skriva in tal, en resultatruta där en summa skrivs ut, och en knapp som adderar det inmatade talet till summan och även skriver ut resultatet i resultatrutan. Använd exempelvis textfält (JTextField) för inmatningen och presentationen. Knappen kan vara en JButton.

När man startar appleten ska inmatningsrutan vara tom, och resultatrutan ska visa 0. Om man skriver in ett tal i inmatningsrutan och trycker på plus-knappen, visas summan i resultatrutan:

Bild på appleten Bild på appleten

För varje gång man trycker på knappen adderas talet som står i inmatningsrutan till summan:

Bild på appleten Bild på appleten

Om man försöker addera något som inte är ett giltigt heltal ska man få ett felmeddelande i resultatrutan. Om man bara rättar den ogiltiga inmatningen och skriver ett riktigt tal, kan man fortsätta beräkningarna och addera fler tal till summan.

Appleten kan se ut som i figurerna, men det är inget krav att den ska vara exakt likadan. Den behöver inte vara vacker, bara knappen och textfälten finns med.

Uppgift 4 (7 p)

Ett Java-program som vi håller på att utveckla hanterar bland annat mängder av olika typer av objekt. En mängd är en samling objekt, där ett visst objekt antingen är med i mängden eller inte. Man kan inte ha dubletter i mängden, så samma objekt kan inte vara med i mängden flera gånger. Ordningsföljden mellan objekten i mängden spelar ingen roll.

Normalt skulle man använt någon av klasserna TreeSet eller HashSet, men den billiga Java-implementation vi skaffat saknar tyvärr just dessa klasser. Därför måste vi skriva en egen mängdklass, som ska heta Mängd.

Klassen Mängd ska ha en metod läggTill, som lägger till ett objekt till mängden. Den ska ha en metod taBort, som tar bort ett objekt från mängden. Den ska ha en metod finns, som returnerar true om ett visst objekt finns i mängden, och false om det inte gör det.

Två objekt som jämförs som lika av equals-metoden ska räknas som samma objekt.

Det räcker om klassen kan hantera tio element i varje mängd, och vi har inga särskilda prestandakrav, så om vi vill kan vi använda en vanlig array för att lagra elementen i mängden. Notera dock att om man försöker lägga in fler än tio element så ska undantaget MängdenFullException kastas.

Skriv klassen Mängd!

Uppgift 5 (9 p)

Det finns inget sätt att gå igenom alla objekten som lagrats i en mängd av klassen Mängd från uppgiften ovan. För det behövs en iterator.

a)

Skriv iteratorklassen. Den ska heta Mängditerator, och den ska implementera gränssnittet Iterator. Här är metoderna i gränssnittet Iterator:

Method Summary
 boolean hasNext()
          Returns true if the iteration has more elements.
 Object next()
          Returns the next element in the iteration.
 void remove()
          Removes from the underlying collection the last element returned by the iterator (optional operation).
 

Metoden remove ska bara kasta ett undantag av typen UnsupportedOperationException.

b)

Lägg till en metod iterator till klassen Mängd. Metoden ska returnera ett korrekt initialiserat iteratorobjekt.

c)

Skriv en main-metod som skapar ett Mängd-objekt, lägger in fem olika strängar i det, och sen skriver ut dem (med System.out.println) genom att iterera över mängden med ett Mängditerator-objekt.

d)

Vi kommer på att vi nog vill kunna använda metoden remove i iteratorn också. Skriv en klass BättreMängditerator, som ska vara en subklass till Mängditerator, och som klarar av att ta bort element med remove.

Uppgift 6 (6p)

a)

Skriv ett program som startar tusen trådar, där varje tråd hela tiden skriver ut Java är roligt! på standardutmatningen (dvs normalt skärmen) så snabbt den kan.

b)

Till din besvikelse upptäcker du att det trådade programmet inte skriver ut tusen gånger så fort som ett motsvarande, otrådat program. Vilka orsaker kan det ha att det inte går så fort?