Göm menyn

TDDC77 Objektorienterad programmering

Extramaterial


Här hittar du frivilliga exemplen och övningar med olika svårighetsgrad (lätt, medel, och svårt), och som tar upp olika delar av kursen (e.g. Array, for-loop, etc).

Några övningar är gamla, andra är helt ny utvecklat, om du hittar något som är underligt, borde förklaras bättre, eller kanske har egna bra uppgifter eller exempel som borde få vara med här så är det bara att höra av sig till Ahmed per mail.

Exempel

Följande exempel är i möjligaste mån uppbyggda av två delar. Först en övergripande förklarande text. Därefter en fullständig lösning i javakod.
  • for-loopen (lätt) [array, for]
    class LoopExempel1{
    
      // En global variabel av typ String-array som heter namn.  
      static String[] names = {"Kalle", "Malin", "Henke", "Sofia"};
    
      public static void main(String[] args){
        // För varje heltal i från 0 till längden på names:
        for (int i = 0; i < names.length; i++){
          // Skriv ut namnet på plats i
          System.out.println(names[i]);
        }
      }
    }
          

    Programmet skapar en Array med String som heter names och innehåller namnen Kalle (index 0), Malin (index 1), Henke (index 2) och Sofia (index 3).

    Main-metoden (den som körs när man startar programmet) innehåller en for-loop som skriver ut varje namn på en ny rad.

Uppgifter

Här följer ett antal övningsuppgifter. Om inget annat anges ska du skriva ett program som löser uppgiften. Uppgifterna är märkta med svårighetsgrad och område enligt den inledande texten.

Alla lösningarna är samlade sist, under rubriken lösningar så att du inte råkar tjuvtitta av misstag.

  • Betyg (lätt) [in/utmatning, if, while]

    Skriv ett program som :

    1. Tar emot ett heltal från användraren
    2. Om heltalet är större än fem, skriver "för stort" och hoppar till programpunkt 1
    3. Om heltalet är mindre än fem, adderar ett till heltalet
    4. Skriver ut "du få&r betyg " och heltalet
    5. Avslutar

  • Hur ser flödschemat ut? (lätt)[while, if, flödschema]
    boolean bossIsHappy;
    int answer = 0;
    
    System.out.print("Vilken lön får jag?");
    answer = readInt ();
    
    while (answer < 200) {
      System.out.print("Mer!");
      answer = readInt ();
    }
    
    System.out.print ("OK, jag är nöjd!");
    
    bossIsHappy = Boss.areYouHappy();
    if(!bossIsHappy){
      giveBossApple ();
    }
    
    return;
    
  • Medelvärdet (lätt)[loopar, arrayer]

    1. Skriv ett program som tar emot ett godtyckligt heltal (mellan 0 och maxvärdet för int) number från användaren,
    2. läser in number heltal
    3. beräknar medelvärdet; summan av talen antas rymmas i en long
    4. Skriv ut resultated som bör vara av flyttalstyp
    5. Skriv samma program men med de två andra loopar istället.

  • Jag kan loopa frammåt (lätt) [for, while, do-while]

    a) Skriv en loop av varje sort som skriver ut alla tal mellan -4 och 17 (inklusive -4 och 17). Varje tal skall vara följt av mellanslag, men inte nyrad.

    b) Om talet är inte jämt delbart med 4 så skall talet följas av mellanslag, annars nyrad.

    Exempel på interaktion i b)

            jernlas@my ~/tmp $ java Loopar
            -4
            -3 -2 -1 0
            1 2 3 4
            5 6 7 8
            9 10 11 12
            13 14 15 16
            17 -4
            -3 -2 -1 0
            1 2 3 4
            5 6 7 8
            9 10 11 12
            13 14 15 16
            17 -4
            -3 -2 -1 0
            1 2 3 4
            5 6 7 8
            9 10 11 12
            13 14 15 16
            17
          

  • Jag kan loopa bakåt (lätt) [for, while, do-while]

    Skriv en loop av varje sort som skriver ut alla tal mellan -4 och 17 (inklusive -4 och 17) baklänges (17 16 15 ... -4). Varje tal skall vara följt av mellanslag, men inte nyrad.

  • Funktioner och anrop (lätt) [funktion, inläsning, do-while]

    Skriv en funktion readInt() som läser ett heltal från användaren och returnerar det. Skriv en funktion writeInt(int number) som skriver ut ett heltal. I mainfunktionen, skriv en do-while-loop som använder funktionerna du skapat för att läsa in och skriva ut heltal så länge användaren inte matar in talet 0.

    Interaktionen ser ut ungefär såhär:

    jernlas@my ~/tmp $ java Numbers
    12
    12
    34
    34
    -45
    -45
    0
    0
          

  • Röverspråket (lätt)[metoder]

    1. Skriv en metod som returnerar true om en bokstav är en vokal (i.e. bokstav i {a, e, i, o, u, y, ä, ö, å}) och false annars
    2. Använd metoden i ett program som tar emot ett ord frå användaren och göra om den till röverspråk (i.e., bytta varje icke vokal bokstav i ordet mot (bokstav + "o" + bokstav))

  • Array of dreams (lätt) [loopar, arrayer, index]

    a) Skapa en array a som innehåller 10 int och en array b som innehåller 10*10 long

    b) På position 1 (dvs index 0) i a, lagra värdet 15. Skriv en loop som går igenom varje position 1 < pos ≤ 10 (dvs index 1 till 9 inklusive) och där lagrar värdet på positionen innan + 2*pos.

    c) Fyll b med multiplikationstabellen.

    d) Skriv ut båda arrayerna på ett snyggt sätt.

    Exempel på interaktion i d)

    jernlas@nano:~/tmp$ java Arrayer 
    a:
    10 12 16 22 30 40 52 66 82 100 
    
    b:
    1 2 3 4 5 6 7 8 9 10 
    2 4 6 8 10 12 14 16 18 20 
    3 6 9 12 15 18 21 24 27 30 
    4 8 12 16 20 24 28 32 36 40 
    5 10 15 20 25 30 35 40 45 50 
    6 12 18 24 30 36 42 48 54 60 
    7 14 21 28 35 42 49 56 63 70 
    8 16 24 32 40 48 56 64 72 80 
    9 18 27 36 45 54 63 72 81 90 
    10 20 30 40 50 60 70 80 90 100 
          

  • The invisible man (mellan) [variabel, skuggning, funktioner]

    Givet programmet:

    class Invisible{
    
      static int a = 0;
    
      public static void main(String[] args){
    
        System.out.println(a);
            
        int a = 1;
    
        System.out.println(a);
        System.out.println(enFunktion());
      }
    
      public static int enFunktion(){
        return a;
      }
    
    }
          

    a) På vilken rad definieras en global variabel, och vad heter variabeln?

    b) Det finns en annan variabel med samma namn. Var deklareras den och vilka delar av programmet kan den nås ifrån?

    c) Gå igenom programmet rad för rad, försök förutsäga vad som händer på varje rad och varför. Vilka värden bör skrivas ut? Jämför med verkligheten genom att köra programmet, om du gissade fel, försök revidera dina teorier.

    d) Vilka funktionsdeklarationer finns i programmet? Vilka funktionsanrop?

  • Välja index (lätt)[felhantering]

    Skriv om följande programmet och använd try/catch för att hantera fallet där användaren ge en index som örsakar en "ArrayIndexOutOfBoundsException" undantag.

    int[] list = {45, 34, 67, 98, ...};
    while(true){
      print("Ange ett index: ");
      int index = Integer.parseInt(in.nextLine());
      print("Resultat: " + list[index]);
    }
    

  • Vad skrivs ut? (lätt)[aliases, reference typer]

    Skriv och kör ett program med de här raderna. Kan du förklara varför programmet skriver inte ut "one two three" ?

    String[] v = {"one", "two", "three"};
    String[] w = v;
    	
    w[0] = "zero";
    		
    for(int i=0; i < v.length; i++){
      System.out.print(v[i] + " ");
    }
    System.out.println();
    

  • Kö(mellan)[Abstrakta datatyper]

    Använd en array för att bygga en "kö" av strängar
    • Metoden void enqueue(String s) lägger till s sist i kön
    • Metoden boolean isEmpty() returnerar sant om kön är tom
    • Metoden String dequeue() tar bort och returnerar den första strängen i kön
    • Antag att en array med MAX positioner alltid är tillräckligt stor: Aldrig fler än MAX stycken anrop till enqueue
  • Stack (mellan)[abstrakta datatyper, in/utmatning]

    Använd en array för att bygga en "stack". Skriv ett program som kontinuerligt ge användaren fyra val, nämligen "0:push, 1:pop, 2:check emptiness, 3:exit", och som använder en "switch" sats för att:

    • fråga användaren om en String för att pusha om användaren väljar "0"
    • poppa ett värde och skriva ut den om användaren väljar "1"
    • kolla om stacken är tom och skriva ut resultatet om användaren väljar "2"
    • Avsluta programmet om användaren väljar "3"
  • Matvaror (lätt)[Arv]

    Säg att ni ska skapa en matvarudatabas med hjälp av arv. Tänk en påbörjad hierarki:Konsumerbart -> Mat -> Pasta

    • Hur skulle det fortsätta nedåt ?
    • Var skulle ni välja placera :
      • getCarbohydrates()
      • getProtein()
      • getFat()
      • isAlDente()
  • Person och Personnummer (lätt)[Inkapsling, Åsidosättning]
    • Skriv klasserna Person och Personnummer från föreläsning åtta
    • Person ska kapsla in ett personnummer
    • En person ska kunna skrivas ut till terminalen
    • Två personer ska kunna jämföra: lika om lika personnummer

Lösningar

Lösningar till uppgifterna ovan. De innehåller fullständig kod, samt en kort förklaring. I vissa fall finns även referenser till föreläsningsmaterial eller exempel.

  • Jag kan loopa frammåt (lätt) [for, while, do-while]

    a)

    ...
    for (int nr = -4; nr <= 17; nr++){
      System.out.print(nr + " ");
    }
    
    int nr = -4;
    while(nr <= 17){
      System.out.print(nr + " ");
      nr++;
    }
    
    nr = -4; // &ARING;terställ efter while-loopen
    do{
      System.out.print(nr + " ");
      nr++;
    } while(nr <= 17);
    ...
          
    Här visas även att nr i for-loopen har räckvidd bara inom loopen, annars skulle den kollidera med deklarationen precis innan while-loopen.

    b)

    ...
    for (int nr = -4; nr <= 17; nr++){
      if ((nr % 4) == 0){
        System.out.println(nr);
      } else {
        System.out.print(nr + " ");
      }
    }
    
    int nr = -4;
    while(nr <= 17){
      if ((nr % 4) == 0){
        System.out.println(nr);
      } else {
        System.out.print(nr + " ");
      }
        nr++;
    }
    
    nr = -4; // &ARING;terställ efter while-loopen
    do{
      if ((nr % 4) == 0){
        System.out.println(nr);
      } else {
        System.out.print(nr + " ");
      }
      nr++;
    } while(nr <= 17);
    ...
    

  • Jag kan loopa bakåt (lätt) [for, while, do-while]
    ...
    for (int nr = 17; nr >= -4; nr--){
      System.out.print(nr + " ");
    }
    
    int nr = 17;
    while(nr >= -4){
      System.out.print(nr + " ");
      nr--;
    }
    
    nr = 17; // &ARING;terställ efter while-loopen
    do{
      System.out.print(nr + " ");
      nr--;
    } while(nr >= -4);
    ...
          
  • Funktioner och anrop (lätt) [funktion, inläsning, do-while]
    import java.util.Scanner;
    
    class Numbers{
    
      static Scanner in = new Scanner(System.in);
    
      public static void main(String[] args){
        int number;
        do{
          number = readInt();
          writeInt(number);
        } while (number != 0);
      }
    
      static int readInt(){
        return in.nextInt();
      }
    
      static void writeInt(int number){
        System.out.println(number);
      }
    }
        
  • Array of dreams (lätt) [loopar, arrayer, index]

    a)

    int[] a = new int[10];
    long[][] b = new long[10][10];
         

    b)

     a[0] = 10;
    
     // Remember to start from one (first number LARGER than 0)
     for(int pos = 1; pos < 10; pos++){
       a[pos] = a[pos-1] + 2 * pos;
     }
         

    c)

    for (int x = 0; x < 10; x++){
       for (int y = 0; y < 10; y++){
          // 0-lines are not that interesting...
          b[x][y] = (x+1)*(y+1);
       }
    }
         

    d)

    System.out.println("a:");
    // Skriv ut alla elementen i a följt av mellanslag
    for (int pos = 0; pos < 10; pos++){
       System.out.print(a[pos] + " ");
    }
    
    // Två tomrader
    System.out.println();
    System.out.println();
    
    System.out.println("b:");
            
    // Skriv ut alla rader i b
    for (int x = 0; x < 10; x++){
       // Skriv ut alla element på raden
       for (int y = 0; y < 10; y++){
          System.out.print(b[x][y] + " ");    
          // Snyggare alternativ
          //System.out.format("%3d ", b[x][y]);
       }
       // Avsluta den aktuella raden
       System.out.println();
    }
         

  • The invisible man (mellan) [variabel, skuggning, funktioner]

    Givet programmet:

    class Invisible{
    
      static int a = 0;
    
      public static void main(String[] args){
    
        System.out.println(a);
            
        int a = 1;
    
        System.out.println(a);
        System.out.println(enFunktion());
      }
    
      public static int enFunktion(){
        return a;
      }
    
    }
          

    a) På raden "static int a = 0;" (rad 3) definieras den globala variabeln som heter a. den är av typen int (heltal).

    b) På raden "int a = 1;" (rad 9) deklareras en lokal variabel som också heter a. Den kan nås från att den deklareras (rad 9) tills funktionen tar slut (rad 13). &AUML;ven denna variabel är en int, men behöver inte vara det bara för att den globala variabeln har just den typen.

    c) 1: Start av programmet Invisible (filen måste heta Invisible.java). Slutar vid matchande måsvinge (rad 19).
    3: Deklarera en global variabel a, sätt dess värde till noll. Variabeln synlig i alla funktioner och i resten av programmet.
    5: Deklarera en main-funktion (som körs automatiskt när programmet körs.
    7: Skriv ut a, den globala variabeln a är (alltid) synlig men inte den lokala (inte deklarerad ännu).
    9: Deklaration av den lokala variabeln a. a initieras till värdet 1. Kommer att vara synlig under resten av metoden (till rad 13).
    11: Skriver ut variabeln a. Den lokala variabeln a som deklarerades på raden innan är synlig, men den globala variabeln a är inte längre synlig. Detta beror på att det finns en annan synlig variabel med samma namn som deklarerats "närmare", det vill säga i samma funktion. Man säger att den lokala variabeln skuggar den globala.
    12: Skriver ut resultatet av att köra funktionen enFunktion() på rad 15-17. Denna returnerar 0, vilket skriv ut.
    13: Slut på funktionen main.
    15: Definierar en ny funktion som heter enFunktion. Den tar inga parametrar, returnerar ett heltal och slutar på rad 17.
    16: Returnerar värdet av variabeln a. Den globala variabeln a är synlig, men inte den lokala som definierades i main metoden (bara synlig i sin egen metod). Returnerar alltså 0.
    17: Slut på funktionen enFunktion.
    19: Slut på programmet Invisible.

    d) Deklarationer: Rad 5 (deklarerar main) och rad 15 (deklarerar enFunktion)
    Anrop: Rad 12 (anropar enFunktion, resultatet blir parameter till utskriftsfunktionen).


Sidansvarig: Ahmed Rezine
Senast uppdaterad: 2012-10-31