Institutionen för datavetenskap Umeå Universitet

Lablektion 3

Lablektionens syfte är att i datorlabbet prova på att själv skriva kod. Uppgifterna är relativt korta och enkla och uppfyller lite av tanken att repetition hjälper inlärning. Hjälp finns att tillgå i labbet under lablektionstiden och andra tider så är det bara att skicka ett mail till Daniel, Johan eller Set.

Försök att lösa uppgifterna enskilt först men om du kör fast så fråga gärna. Uppgifterna kräver inte några speciella klasser och alla resultat kan granskas antingen genom "Inspect" eller på det fönster som automatiskt kommer upp vid körningen av utskriftsmetoden.

Här finns lösningsförslag.

Tips

För att skriva ut en rad med text från en metod används följande kommando:

    System.out.println("Text att skriva ut");

Resultatet blir att den angivna texten visas i ett separat fönster om det körs från BlueJ. För att skriva ut värdet på inbyggda typer (int, double, ...) så kan följande kodsnutt användas.

    int val = 10;
    System.out.println("Värdet är " + val);

Detta resulterar i att värdet av variabeln val (10 i det här fallet) skrivs ut.

Uppgifter

1 - printOdd

Skapa en metod som skriver ut alla udda heltal från noll (0) till en angiven gräns. Använd en while-loop och ovanstående utskriftsmetod.

2 - printEven

Skapa en metod som skriver ut alla jämna heltal från noll (0) till en angiven gräns. Använd en for loop och ovanstående utskriftsmetod.

3 - calcFac

Skapa en metod som beräknar fakulteten för ett givet positivt heltal. Fakulteten definieras som

    n! = 1 * 2 * ... * (n-1) * n.
Fakulteten av noll (0!) är definierad till ett (1).

4 - isPrime

Skapa en metod som avgör ifall ett givet heltal är ett primtal eller inte. Inparametern ska vara ett positivt heltal större än ett och resultate ska vara boolean, d.v.s. true eller false. Ett primtal är ett positivt heltal som bara delar sig själv och ett utan rest.

5 - printPrimes

Skapa en metod som skriver ut alla primtal under ett givet maximum med hjälp av metoden från föregående uppgift.

Den som vill kan i stället pröva att implementera en algoritm för att hitta primtal som brukar kallas för Eratosthenes såll. Denna går ut på att man skapar ett fält bestående av boolska värden, vi kallar detta fält för tal. Fältets syfte är att avgöra om ett visst tal är ett primtal, om tal[i] == true så är i ett primtal.

Om man vill hitta alla primtal mindre än n gör man fältet n+1 element stort. Först initierar man hela fältet som true, dvs tal[0] = true, tal[1] = true ... tal[n] = true, vilket innebär att vi till en början tror att alla tal mellan 2 och n är primtal. När detta är gjort skall vi gå igenom alla talen och avgöra vilka som faktiskt är primtal. Detta görs med följande algoritm:

  1. För alla tal i=2..n:
    1. Om tal[i] == true
    2. Sätt tal[j] = false där j=k*i (k = 0, 1, ... så länge j mindre än n)

Exempel:



Den något kryptiska bilden ovan visar hur det går till då alla primtal under 20 söks. Då tal[2] == true sätts alla tal som är multiplar av 2 till false, detta visas med ^ (uppåtpilen). Sen kommer vi till 3 (även det primtal), alla multiplar av 3 märks som false, detta visas med - (strecket). Nästa tal är 4 som inte är ett primtal (triangeln visar att 2:an gjorde så att 4 ej blev ett primtal, dvs tal[4] == false). Efter 4 kommer 5, som är ett primtal, alla multiplar av 5 sätts till false, vilket markeras med o (den lilla cirkeln), 6 är inte ett primtal då både 2 och 3 (uppåtpilen och strecket) satte tal[6] = false. På detta sätt arbetar algoritmen av tal för tal till vi når 20.

6 - fillArray

Skapa en metod som slumpmässigt fyller ett fält med flyttal. Talen kan slumpas fram med hjälp av Math.random(). Det ska vara möjligt att ange storleken på fältet och den övre gränsen på värdena som fylls i fältet. Fältet ska returneras från metoden som ett returvärde.

7 - findMin

Skapa en metod som givet ett fält returnerar det minsta värdet i fältet.

8 - squareArray

Skapa en metod som givet ett fält beräknar kvadraten på varje element i fältet och returnerar dessa.

9 - average

Skapa en metod som beräknar medelvärdet av alla element i ett givet fält. Medelvärdet ska returneras från metoden som en double.

10 - printArray

Skapa en metod som skriver ut alla element i ett double fält, ett element per rad. Denna kan vara bra att använda i avlusningssyfte kanske?

11 - testAverage

Skapa en metod som testar fillArray, average och printArray. Vad kan man förvänta sig för medelvärde ungefär?

12 - multiplicationTable

Skapa en metod som "ritar ut" en multiplikationstabell enligt följande mönster:

    0  1  2  3  4  5  6  7  8  9  10
    1  1  2  3  4  5  6  7  8  9  10
    2  2  4  ...
    ...
   10 10 20 30 40 50 60 70 80 90 100
Det ska vara möjligt att ange största värdet för tabellens sida. I exemplet ovan så är detta 10 (tio). För att skriva ut utan att bryta en rad kan System.out.print() användas, den fungerar på samma sätt som metoden ovan fast bryter inte raden automatiskt.

Denna lablektion är utvecklad av Claes Gahlin, och har modifierats lätt av Johan.
http://www.cs.umu.se/kurser/TDBA54/SU02/LLmaterial/LL3/index.html
Ansvarig för sidan: Johan Tordsson
Senast ändrad 2002-06-21