SMD134 - Övningsuppgifter

Detta är övningsuppgifterna. De behöver inte redovisas, men genom att lösa fler blir du bättre på att programmera och får det betydligt enklare att klara labbarna och tentan. Det bästa sättet att lära sig programmera är att läsa, förstå och skriva kod.

För att läsa in information från användaren under programmets gång rekommenderas att du bekantar dig med klassen LasIn.java. Den innehåller metoder som kan användas för att hämta heltal, flyttal eller strängar från användaren. Spara den på en plats där du lätt kan använda den.

Kort guide hur man skriver ut i UNIX-labben

  1. Skriv ett program som skriver ut följande text: "Alla uppgifter ska lösas individuellt. Det betyder att det är fullt tillåtet att diskutera olika problem och deras lösning med andra, men alla svar på frågor och all programkod måste skrivas individuellt av varje student på kursen.".

  2. Rak central stöt. En rak central stöt i detta fall är då en kropp kolliderar med en annan kropp som är i vila för tillfället. Som exempel kan nämnas en biljardstöt. Skriv ett program som givet de båda kropparnas massor samt den stötande kroppens fart beräknar den andra kroppens fart efter stöten. Försumma luftmotstånd, friktion etc.

  3. Skriv ett program som givet ett tal räknar ut om det är ett primtal eller inte.

  4. Skriv ett program som med hjälp av en for-slinga räknar ner från 700 till 0 i steg om 7.

  5. Skriv ett program som läser in 10 heltal från användaren och sedan skriver ut det största.

  6. Skriv ett program som skriver ut sina argument ihopslagna. Ett exempel gör det klarare:

    java Konkatinera berg och dal b a n a
    bergochdalbana


  7. Det finns många sätt att lösa föregående uppgift på. Hitta på nått nytt sätt.

  8. Skriv ett program som givet en sträng på kommandoraden skriver ut strängen med stora bokstäver. Tips: Kolla i javadokumentationen om klassen String.

  9. Skriv en metod triangel(int a) skriver ut en triangel i asteriskgrafik där a anger antalet rader. Anrop av triangel(4) ger alltså utskriften:

    *
    **
    ***
    ****

  10. Skriv ett program som givet två argument skriver ut en sågtandskurva. Det första argumentet anger antalet rader i varje triangel och det andra argumentet anger hur många trianglar som ingår i sågtandskurvan. Det är rekommenderat att återanvända kod från föregående uppgift. Ett körexempel ser ut så här:

    java Sågtand 3 2
    *
    **
    ***
    *
    **
    ***


  11. Simulera argumentation med en tonåring. Skriv ett program som omväxlande läser in strängar från användaren och skriver ut svar. Så länge inte den inmatade strängen är "Gå till ditt rum!" skriver programmet ut "Tror du jag bryr mig??" och förväntar sig en ny sträng. Om programmet får strängen "Gå till ditt rum!" skriver det ut "Jag hatar dig!" och avslutas. Fundera på hur en argumentation mellan två arga tonåringar skulle se ut. Skulle programmet nånsin avsluta?

  12.  
  13. När man arbetar med raketer är det viktigt att kunna räkna ned från 10, skriv ett program som använder en for-slinga för att räkna ned från 10 till 0.

  14. Skriv ett program som givet en siffra (0-9) på kommandoraden skriver ut motsvarande siffra med bokstäver. Uppgiften ska lösas med en switch-sats.

  15. Utöka programmet i uppgiften ovan till att klara av godtyckligt långa strängar med siffror som indata. Exempel:

    java Uppgift8 7895
    sju åtta nio fem


  16. Skriv ett program som givet ett ord på kommandoraden översätter ordet till rövarspråket. Rövarspråket fungerar som så att alla konsonanter dubbleras med ett o emellan, medans vokalerna skrivs ut som de är. "pannkakor" blir således "popanonnonkokakokoror".

  17. Skriv ett program som givet ett tal (0-9999) skriver ut det med bokstäver. Exempel:

    java Uppgift9 1999
    ettusenniohundranittionio


  18. Skriv ett program som konverterar ett givet tal, antal sekunder, skriver ut tiden i timmar, minuter och sekunder.

  19. Skriv ett program som givet en triangels tre sidor räknar ut dess area. Ett tips är att använda Herons formel.

  20. Skriv ett program Tärning som slumpar fram och skriver ut ett tal mellan ett och sex.

  21. Skriv ett program GenerellTärning som givet antalet sidor på tärningen simulerar ett tärningskast. GenerellTärning 20 kan alltså ge tal i intervallet 1-20.

  22. Skriv en metod jämför(int [] a, int [] b) som returnerar true om de givna arrayerna a och b är lika, dvs. innehåller samma element i samma ordning.

  23. Skriv en metod summera som tar en array med flyttal och returnerar elementens summa.

  24. Det radioaktiva grundämnet Javium har en halveringstid på exakt ett år. Skriv en rekursiv metod som givet antalet år och för ett kilogram räknar ut hur många gram Javium som finns kvar.

  25. Skriv två metoder som räknar ut fakulteten av givet tal, en av metoderna ska vara rekursiv och den andra ska inte vara det. Fundera på vilken metod som är bäst.

  26. Skriv en rekursiv metod som räknar ut det n:te Fibonacci-talet. Fib(1)=Fib(2)=1. Fib(n)=Fib(n-1)+Fib(n-2), n>2.

  27. Skriv en rekursiv metod som räknar ut x^y (x upphöjt till y) där x och y är heltal.

  28. Skriv en rekursiv metod för att reversera en sträng. Fundera på om rekursion är det rätta sättet att lösa detta problem på.

  29. Skriv en klass Rekursiv som innehåller de fyra föregående rekursiva metoderna som statiska metoder. Skriv ett program som anropar och testar dina statiska metoder.

  30. Skriv en metod private double derivata(double x) som räknar ut derivatan för en matematisk funktion i en given punkt. Du bör skriva en metod som returnerar funktionens värde för ett givet x, private double f(double x). Använd följande formel för att approximera derivatan (h är ett litet tal. Laborera med olika värden):

  31. Definiera en klass Hund, med lämpliga instansvariabler för attributen namn, ålder, ras och kön. Inför instansmetoder för avläsning av attributen, och för att ändra på attributen ålder och namn. Det ska bara gå att ändra åldern till ett positivt heltal mellan 1 och 100 och kön till ett av två möjliga värden. Det ska inte heller gå att ändra åldern till någonting som är mindre än hundens nuvarande ålder. Förse klassen med en konstruktor som initialiserar samtliga attribut.

  32. Definiera en klass RasHund som ärver klassen Hund och introducerar ett nytt attribut, ras som är en sträng och innehåller namnet på rasen. Förse klassen med en konstruktor som initialiserar samtliga attribut. Skapa en klass Kennel för att testa klasserna Hund och RasHund.

  33. Skriv en klass Tärning som simulerar en tärning. Det skall finnas två konstruktorer, en som accepterar ett heltal som är antalet sidor tärningen har och en som inte tar något argument, vilket betyder att tärningen skall ha sex sidor. Det finns en metod kasta() som returnerar resultatet av ett tärningskast. Skriv en klass Yatzy som har fem sex-sidiga tärningar och som vid körning kastar tärningarna tills de visar samma resultat. Då skrivs "YATZY!" samt antalet gånger som alla fem tärningarna kastats ut på skärmen. Yatzy är den klass som har main-metoden.

  34. Definiera en klass Tidtagare med instansmetoder nollställ, starta, stoppa, tid. En instans av klassen är en representation av ett tidtagarur, som kan nollställas, startas, stoppas och avläsas. Du kan anta att avläsningen alltid sker i millisekunder. Använd metoden System.currentTimeMillis, som returnerar klocktiden i form av en long som anger antalet millisekunder som gått sedan midnatt, 1 januari 1970. Det ska bara gå att starta tidtagaren om den inte redan startats, eller om den startats och sedan stoppats, och motsvarande restriktioner (exakt vilka får du fundera ut) gäller för de andra operationerna. För att implementera dessa restriktioner måste du internt i definitionen av klassen hålla reda på om klockan är i gång eller inte, och eventuell annan relevant information. Låt metoderna nollställ, starta, stoppa returnera värden av typ boolean som talar om huruvida operationen gick att genomföra eller inte, medan tid returnerar -1 om det inte finns någon tid att avläsa.

  35. Designa ett interface Priority som har två metoder: setPriority och getPriority. Dessa ska definiera ett sätt att skapa en numerisk prioritet mellan objekt. Designa och implementera en klass Task som representerar en uppgift att göra. Task ska implementera Priority. Skapa en klass ToDoList som testar dina Task-objekt.

  36. Utöka klassen Task till att även implementera interfacet Comparable från Javas klassbibliotek. Implementera interfacet så att Task-objekten kan ordnas efter prioritet. Utöka klassen ToDoList för att testa denna nya funktionalitet.

  37. I en av uppgifterna ovan simuleras en argumentation med en tonåring. Detta program skall användas här och modifieras. Skapa en ny undantagsklass, StringTooLongExeception som ärver Exception. Om en sträng från användaren är för lång (typ 20 tecken) kastas undantaget och programmet avslutas. Undantaget skall alltså inte fångas.

  38. Bygg ut programmet i den föregående uppgiften så att undantaget som kastas fångas. Hantera det på lämpligt sätt, t.ex. att meddelandet "Bla, bla, bla!!" skrivs ut. När det är gjort fortsätter programmet som vanligt med att vänta sig en ny sträng.

  39. Skriv ett program som skriver ut alla permutationer av tecknen i en sträng på kommandoraden. Till exempel ska anropet:

    java Perm abc
    ge till exempel utskriften
    abc
    acb
    bac
    bca
    cba
    cab

    eller vilken som helst annan utskrift som i någon godtycklig ordning ger samtliga permutationer.