Hemuppgifter redovisning v40.

Gäller många av veckans hemuppgifter :

Hemuppgifterna bygger ofta på varandra. Därför är det viktigt att du kan kopiera in en metod från en hemuppgift till en annan, så du slipper skriva samma sak upprepade gånger. Detta kan göras med att markera en metod med vänster musknapp och kopiera in den på ett annat ställe med mittknappen. Detta kan t ex göras mellan två emacs-fönster eller två emacs-buffrar.

Hemuppgifter som innebär att man skriver och kör en applikation med in och utmatning av text kan programeras med inmatning och utmatning i terminalfönstret och inkopiering av körresultat i en avslutande kommentar i programtexten, så vi sparar lite papper. (behandlas på föreläsning måndag v39).

1.C-Hemuppgift:

Skriv i en klass en metod public static double f(double x) som beräknar denna funktion

f(x) = x*x*x + 5*x*x -50*x +0.1

Skriv också i samma klass en main-metod så att du kan beräkna och få utskrivet värdet på

f(x) för några x (x behöver inte inmatas från tangentbordet).

2.CBA-Hemuppgift:

Skriv i en klass en metod public static boolean odd(int i) som returnerar

om i är ett udda tal, dvs inte jämt delbart med 2, dvs resten vid division blir 1.

Skriv också i samma klass en main-metod så att du kan beräkna och få utskrivet värdet på

odd(i) för några i (i behöver inte inmatas från tangentbordet).

3.CBA-Hemuppgift:

Skriv i en klass en metod public static boolean divisible(int i, int with) som returnerar

om i är jämt delbart med with.

Lös uppgift 2 genom att använda (anropa) funktionen divisible i uppgift 3.

Skriv också i samma klass en main-metod så att du kan beräkna och få utskrivet värdet på

divisible(i, j) och odd (i) för några i, j (i, j behöver inte inmatas från tangentbordet).

4.CBA-Hemuppgift:

Skriv i en klass en metod public static int f(int i) som

f(i) = ej definierat för i <=0 Detta fall behöver man inte skriva om uppgiften räknas som C-uppgift

f(1) = 1

f(i) = 3*i + 1 för i >1 och i udda

f(i) = i/2 för i >1 och i jämt / står för heltalsdivision

Skriv också i samma klass en main-metod så att du kan beräkna och få utskrivet värdet på

f(i) för några i.

5. CBA-Hemuppgift:

Genom att upprepade gånger använda funktionen f i uppgift 4 kan man generera en talserie.

Man startar med ett första värde, ett "frö", t ex 3, och beräknar så f(3), som blir 10, därefter f(10) som blir 5,

därefter f(5) som blir 16, .... osv tills man får resultatet 1. (Se körreultatet nedan).

Skriv om main-metoden i uppgift 4 så att man kan mata in ett frö från tangentbordet och få talserien utskriven.

Vid redovisningen skall även några körningar redovisas. Enklast görs detta genom att med emacs klistra in körresultatet som en kommentar i programmet.

För att räknas som A-uppgift skall man gång på gång kunna ge ett nytt frö och få motsvarande talserie tills man ger ett icke-positivt tal som frö.

/* Exempel på körresultat :

..> java Terminerar

Talserie : 3, 10, 5, 16, 8, 4, 2, 1

Talserie : 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1

Talserie : 45, 136, 68, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1

Talserie : 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1

Kommer man alltid förr eller senare till 1? Svaret är att man inte lär veta detta. Här finns i så fall en chans att bli berömd genom att matematiskt bevisa att man alltid "kommer till" 1. Som bekant duger det inte i matematiken att prova länge utan att finna något fall som inte verkar sluta.

6.BA-Hemuppgift:

Ditt företag har köpt en javakompilator från företaget VeryBadCompilersInc. Tyvärr visar det sig att multiplikation, som ju skrivs med * i de flesta språk, inte är korrekt implementerat för naturliga tal (icke negativa tal). För att rädda situationen tvingas du skriva en metod (som använder operatorn +, som turligt nog fungerar korrekt):

public static int mult(int i, int j) { ...}

som korrekt returnerar produkten av naturliga talen i och j.

För att räknas som A-uppgift skall programen stanna om man ger negativt i eller negativt j.

a) Om i>=0 j>0 så gäller

0*j = 0

i*j = j + (i-1)*j

Skriv en rekursiv lösning för public static int mult(int i, int j) { ...}

Skriv också i samma klass en main-metod så att du kan beräkna och få utskrivet värdet på 21*4*46.

b) Om i>=0 j>0 så gäller att i*j = j = j + j + ... + j (n st termer)

Skriv en iterativ lösning (dvs använd en snurra istället för rekursion) för

public static int mult(int i, int j) { ...} 8p)

Skriv också i samma klass en main-metod så att du kan beräkna och få utskrivet värdet på 21*4*46.

Om du har lösningarna på a) och b) i samma klass kan du växelvis kommentera bort den ena lösningen

så slipper du jobba med två filer.

c) Kan man definiera egna operatorer i Java? (kräver inte korrekt svar, men vad tror du?)

7. BA-Hemuppgift:

Skriv en applet som skapar ett land Utopia (landet ingenstans, bok av 1500-tals-humanisten Thomas Moore).

Varje region, har storleken 30 *modul x 30 *modul. En region ritas som en cirkel med radien 4*modul i regionens mitt (regionens huvudort) och fyra underegionen (gäller ej byarna se nedan) som är 8*modul bort från regionmitten i N, S, V Ö (dvs rakt upp, rakt ner,rakt till vänster och rakt till höger). Underegionerna har en storlek som är en tredjedel av den region de tillhör.

Startregionen kan ha storleken ((30*30) pixlar) x ((30*30) pixlar ) och består av huvudstaden och fyra län.

Länen består av residenstaden och fyra kommuner.

Kommunerna består av en stad och fyra byar. Byarna ritas som en liten cirkel utan underegioner.

För att räknas som A-uppgift : rita ut ett vägnät mellan orterna.

8. A-Hemuppgift:

Lös problemet 6.37 i Deitel och Deitel page 310, "Towers of Hanoi". Det är Ok att istället göra en applikation med

inmanting och utmatning i teminalfönstret.