lu.se

Datavetenskap

Lunds Tekniska Högskola

Denna sida på svenska This page in English

ALLA Extra programmeringsuppgifter

Denna sida på svenska This page in English

Programmeringsuppgifter för egen träning. Uppgifterna är bara tillgängliga en begränsad tid. Skapa först ett Eclipse-projekt för uppgifterna:

  1. Klicka på New Java Project-ikonen i verktygsraden
  2. Skriv namnet på projektet
  3. Klicka på Finish
  4. Högerklicka på projektet, välj Build Path > Configure Build Path
  5. Klicka på Libraries
  6. Klicka på Add JARS. . . , öppna projektet cs_eda016, välj filen cs_eda016.jar

Linjer

(v 4–5, ht1) Skriv ett program där man kan rita linjer genom att klicka med musen. Linjerna ska ritas i ett SimpleWindow-fönster. Den första linjen ska börja i (0,0) och sluta där man klickar första gången. Sedan ska den andra linjen börja där den första slutade och sluta där man klickar, och så vidare.

Ritandet ska hålla på tills man avbryter programmet med Quit i fönstermenyn:

 

    while (true) {
// klicka med musen
// rita en linje
}

Färger

(v 4–5, ht1) I Java beskrivs färger av klassen Color, som finns i paketet java.awt (specifikation av klassen finns här). En färg har tre komponenter: röd (R), grön (G) och blå (B). Mängden av varje komponent beskrivs av ett heltal mellan 0 och 255. Skriv ett program som i ett SimpleWindow-fönster med storleken 256x256 pixlar visar alla blandningar av två färgkomponenter. I bilden är det R och G som har blandats.

För att rita en punkt flyttar man pennan till punkten och drar en linje till samma punkt (w.moveTo(x, y); w.lineTo(x, y)).

Du kan läsa mycket mera om färger på Wikipedia, till exempel om RGB-systemet.

Spiral

(v 4–5, ht1) Här finns ett program som ritar en cirkel i ett SimpleWindow-fönster: DrawCircle.java. Det man egentligen ritar är en regelbunden polygon med 360 hörn, men i och med att kantlinjerna i polygonen är så korta så ser bilden ut som en cirkel. 

Det blir en cirkel eftersom radien (variabeln radius) har ett konstant värde. Om man ändrar radien under tiden man vandrar runt så blir det andra figurer. Prova till exempel att minska radien hela tiden och rita en spiral som i bilden (där har man gått två varv och ritar alltså en 720-hörning).

Blomma

(v 5–6, ht1) Utgå från spiralritningsprogrammet i föregående uppgift. Om man ändrar "radien" på ett mera komplicerat sätt än att bara öka den kan man få ännu snyggare figurer.

Variera radien med faktorn Math.cos(n * angle) och prova med olika n-värden.

 

Mönster

(v 5–6, ht1) En färg där alla tre komponenterna (RGB) har samma värde är en nyans av grått (helt svart om RGB är (0,0,0), helt vitt om RGB är (255,255,255)). 

Bilden till höger består av ett antal linjer med olika svärta. Svärtan varierar enligt en sinuskurva (man måste naturligtvis se till att svärtan inte blir negativ).

Skriv ett program som ritar en sådan bild.

 

Funktionskurva

(v 5–6, ht1) Skriv ett program som ritar en funktionskurva (i bilden är det en sinuskurva från 0 till 4 π). Läs in max-värdet för x i början av programmet.

Gör inte programmet alltför generellt – du kan till exempel förutsätta att funktionsvärdena ligger mellan –1 och +1 och att man alltid börjar rita i x = 0. 

 

Kvadrater

(v 6–7, ht1) Använd klassen Square från datorlaboration 2 (eller implementera en egen klass som beskriver kvadrater som man kan rotera) för att rita en bild med 10 kvadrater. Skapa bara ett kvadratobjekt i programmet.

Klocka

(v 6–7, ht1) Skriv ett program som visar en tickande klocka:

  • Tag reda på tiden (se klassen GregorianCalendar och metoden get).
  • Rita timvisaren, minutvisaren och sekundvisaren. Skriv en metod med lämpliga parametrar för att rita en visare (eller en klass som representerar en visare).
  • Vänta en sekund (SimpleWindow.delay).

I bilden är timvisaren svart, minutvisaren röd och sekundvisaren grön – det hade kanske varit snyggare att rita visarna olika långa. Programmet kan göras bättre: klockan är 12:48:25, men timvisaren står på 12 (den visar bara hela timmar).

BMI

(v 6–7, ht1) (Mycket tricksande med koordinattransformationer, men det är nyttigt.) Sitt BMI (Body Mass Index) räknar man ut genom att dividera sin vikt (i kilo) med längden (i meter) i kvadrat. Enligt WHO ska BMI ligga mellan 18.5 och 25.0, annars är man under- eller överviktig.

Skriv ett program som visar de olika viktkategorierna i ett SimpleWindow-fönster (längden på x-axeln, vikten på y-axeln). Välj själv lämpliga min- och max-värden på axlarna. (Egentligen borde man rita skalor på axlarna, men det blir för jobbigt.)

Läs sedan in längd och vikt och rita ett kryss på rätt plats i diagrammet.

Gissa tal

(v7 ht1–v1 ht2) En klassisk programmeringsuppgift – programmet väljer ett slumpmässigt tal, du ska gissa vilket. Dialogen med programmet kan se ut så här (användaren har skrivit siffrorna efter kolontecknen):

 

Jag tänker på ett tal mellan 1 och 100 - gissa vilket: 48
För stort, försök igen: 21
För stort, försök igen: 10
För litet, försök igen: 14
För litet, försök igen: 16
Rätt på 5 försök!

Slumppunkter

(v7 ht1–v1 ht2) Slumptal i programspråk är ju inga "riktiga" slumptal, utan de beräknas med en matematisk formel. Men de ska uppföra sig som riktiga slumptal: till exempel ska två slumptal som dras efter varandra vara oberoende av varandra.

Man kan testa om slumptalen är oberoende genom att rita ut många punkter med slumpmässiga koordinater – om koordinaterna är oberoende av varandra ska det inte finnas några mönster i bilden.

 

Sköldpaddsspiral

(v7 ht1–v1 ht2) Sköldpaddor kan också rita spiraler. Använd klassen Turtle från datorlaboration 4 för att rita en spiral:

  • Gå framåt en liten bit
  • Vrid lite åt vänster
  • Gå framåt lite längre
  • Vrid igen

   

Stora tal

(v 1–2, ht2) n! (n-fakultet) definieras som n * (n - 1) * (n - 2) * ... * 3 * 2 * 1. Till exempel är 4! = 4 * 3 * 2 * 1 = 24, 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720.

Skriv ett program som läser in ett n-värde och beräknar och skriver ut n!. Prova med olika n-värden – du finner att redan 13! blir felaktigt (åtminstone om du använder int-variabler för att lagra resultatet). Förklara varför!

Man kan använda long-variabler i stället, men det hjälper inte särskilt mycket. Men i Java finns en standardklass BigInteger som kan representera godtyckligt stora heltal. Skriv om programmet med BigInteger och beräkna 100!.

Anmärkning: för att skapa ett BigInteger-objekt med värdet 100 skriver man new BigInteger(String.valueOf(100)).

Boll

(v 1–2, ht2) (Ganska jobbig uppgift.) Skriv ett program som visar en boll som rör sig i ett SimpleWindow-fönster. Bollen ska röra sig i en rak linje och studsa vid fönstrets kanter.

  • Här måste du strukturera programmet och skriva en klass som beskriver en boll. Bollens läge och riktning bör beskrivas med reella tal, för att undvika avrundningsfel.
  • Rita bollen som en fylld kvadrat (enklast genom att rita en kort bred linje).
  • SimpleWindow är inte gjort för att klara av rörliga bilder, så animeringen kan bli ryckig.

Teckentabell

(v 1–2, ht2) Skriv ett program som skriver ut en teckentabell över de vanligaste tecknen i Unicode-tabellen, som i tabellen som finns i läroboken sidan 301. Observera att inte alla kolumnerna finns med. Du behöver inte skriva ut numren i rubrikraden och rubrikkolumnen.

Börja med att skriva ut tabellen i konsolfönstret (System.out), skriv sedan ut den i ett SimpleWindow-fönster.

Wikipedia har mängder av information om Unicode.

 

 

Förbindelser

(v 2–3, ht2) Skriv ett program som 1) genererar alla punkter i en regelbunden månghörning (börja med att läsa in antalet punkter), 2) förbinder alla punkter med varandra.

 

 

 

Stjärna

(v 2–3, ht2) Skriv ett program som ritar en stjärna med många strålar med olika färger. Strålarna ska vara slumpmässigt långa och ha en slumpmässig färg. (Lägg standardfärgerna Color.RED, Color.GREEN, …, i en vektor och välj slumpmässigt i vektorn.)

 

 

Cellautomat

(v 2–3, ht2) Börja med att läsa om enkla cellautomater på Wikipedia (du bör nog läsa introduktionen högst upp på sidan först). Skriv sedan ett program som visar hur en cellautomat utvecklas. Programmet ska vara sådant att det är enkelt att byta regler, till exempel från "regel 30" till "regel 110".

 

Sierpinski

(v 3–4, ht2) Läs om Sierpinski-triangeln på Wikipedia. Skriv ett program som genererar en Sierpinski-triangel med hjälp av slumptal (algoritmen som börjar med "Or more simply:" en bit ner på sidan). Man behöver inte välja den första punkten så att den ligger inuti triangeln; det fungerar även om startpunkten är (0,0).

Skriv programmet så att man kan välja antalet hörn i figuren – även andra figurer än trianglar kan generera intressanta mönster.

Primtal

(v 3–4, ht2) Ett tal är ett primtal om det bara är jämnt delbart med 1 och med sig självt (2, 3, 5, 7, 11, 13, 17, …). Vilket är det största primtalet mindre än en miljon? Hur många primtal finns det som är mindre än en miljon?

För att svara på den första frågan kan man dividera talet med 2, 3, …, och se om någon division går jämnt ut. Men det blir jobbigt att använda den metoden för att svara på den andra frågan. Bättre är att beräkna alla primtal mindre än en viss gräns med Eratosthenes såll.  I algoritmen talas om en "lista" av tal. Enklast är att börja med en boolean-vektor där man markerar primtal med true, sammansatta tal med false. Då blir algoritmen:

  • Sätt alla elementen i vektorn till true.
  • Börja med element 2: sätt alla större multipler av 2 till false.
  • Hitta nästa true (element 3): sätt alla större multipler av 3 till false.
  • Hitta nästa true (element 5): sätt alla större multipler av 5 till false.

Skriv en klass som implementerar Eratosthenes såll, använd klassen i ett huvudprogram som löser uppgiften.

Slumptalsfrekvens

(v 3–4, ht2) Skriv ett program som åskådliggör en slumptalsfördelning i ett SimpleWindow-fönster. Skriv programmet så att man ser hur diagrammet växer fram. I bilden visas en normalfördelning (Random.nextGaussian), men det är enklare att börja med en rektangelfördelning.

 

 

Cirklar

(v 4–5, ht2) Skriv ett program som placerar ut slumpmässigt stora cirklar på slumpmässiga platser inuti ett SimpleWindow-fönster. Varje gång man klickar med musen ska en ny cirkel placeras ut. Inga cirklar får överlappa varandra!

Här måste du ha en klass som beskriver en cirkel och som har en operation som kontrollerar om en cirkel överlappar en annan. Det är också lämpligt med en klass som beskriver en lista av cirklar.

Rösträkning

(v 4–5, ht2) I en del tidningars webbupplagor kan läsarna reagera på artiklar genom att klicka på "Jag blir glad", "Jag blir nyfiken", "Jag bryr mig inte" eller "Jag blir arg". Fördelningen av rösterna visas i ett fönster med olika färger för olika kategorier. I bilden är 40% glada, 20% nyfikna, 30% likgiltiga och 10% arga.

Skriv ett program som läser in röster (0 = glad, 1 = nyfiken, osv) och visar röstfördelningen i ett SimpleWindow-fönster. Fönstret ska uppdateras för varje ny röst som läses.

Tips: använd SimpleWindow.setLineWidth när du ska rita de olika fälten.

Polygon

(v 4–5, ht2) I en tidigare uppgift ritade vi en stjärna med strålar av slumpmässig längd och riktning som utgick från mitten av ett fönster. Skriv ett program som bildar punkter på samma sätt och som förbinder punkterna med varandra, utan att några linjer skär varandra.

 

 

Anagram

(v 5–6, ht2) Ett anagram är en omkastning av bokstäverna i ett ord (eller mening), till exempel är hallonsaft ett anagram av hostanfall (och fosterlandsdröm är ett anagram av andersflodström). Skriv ett program som läser två ord och avgör om orden är anagram av varandra.

Tips: en effektiv metod är att sortera bokstäverna i orden och undersöka om de sorterade sekvenserna är lika. Titta på String.toCharArray, Arrays.sort och Arrays.equals.

Kryptering

(v 5–6, ht2) Läs in en krypteringsnyckel (heltal), läs in en rad med text, kryptera texten med ett Caesar-chiffer (addera nyckeln till varje tecken).

Mera ambitiöst: kryptera texten i en fil, skriv ut på ny fil. Skriv ett program som dekrypterar filen.

Räkna ord

(v 5–6, ht2) Läs in en fil, räkna antalet olika ord. Ett ord är en följd av icke-blanka tecken, mellan orden finns "whitespace".

Tips: HashSet är en bra klass.

Bokstäver

(v 6–7, ht2) (Ganska omfattande uppgift.) Utgå från en mening. Placera tecknen slumpmässigt i ett fönster, låt dem röra sig slumpmässigt tills de har kommit på rätt plats.

Tips: tecknen kan inte röra sig helt slumpmässigt, då lär de aldrig hamna rätt. De måste röra sig mot de rätta platserna, med slumpmässiga avvikelser.

 

Namnsdagar

(v 6–7, ht2) (Ganska omfattande uppgift.) Här finns en fil med namnsdagarna i den svenska almanackan: namnsdagar.txt. Skriv ett program där man kan ta reda när personer har namnsdag, och vem som har namnsdag en viss dag. Exempel:

 

Namn eller datum? namn
Vilket namn? Peter
Peter har namnsdag den 29 juni
Namn eller datum? namn
Vilket namn? Petter
Petter finns inte i almanackan
Namn eller datum? datum
Vilket datum? 23 1
Den 23 januari har Frej och Freja namnsdag
Namn eller datum? datum
Vilket datum? 23 13
23 13 är inget datum
Namn eller datum?