Seminarier


Exempelkod från seminarier hittar ni här: exempelkod.

Sem 1

Seminarium 1 inleds med en "quiz" där du får möjlighet att testa dina kunskaper i objektorientering så här långt in i kursen. Med andra ord på en grundläggande nivå.

Dagens seminarieuppgifter är:

  1. Uppgift 5 från laboration 1.
    Skriv ett program som räknar ut vilket av 3,141592*1.0398 och 3,159228*1.008404 som är störst, och skriver ut svaret.
  2. Övning 1, kapitel 5 i boken "Java från grunden".
    Vilka utskrifter kommer att göras när följande kommandon exekveras? (Vi kommer också att disktutera varför det blir så!)
    int a=10,b=4, c= -3;
    double r=10.0,s=3.0;
    System.out.println(a+b*c);
    System.out.println("Kalle "+a*b);
    System.out.println(a/b);
    System.out.println(a%b);
    System.out.println(r/4);
    System.out.println(a/b/c);
    System.out.println(r/s);
    System.out.println(r/3);
    System.out.println(10/3);
    System.out.println(r+3*s-2);
    System.out.println("r"+"s");
    
  3. Skriv ett program som skriver ut alla primtal mellan 1 och n, där n är ett positivt heltal. Ett primtal är ett heltal >1 som inte kan skrivas som en produkt av två mindre faktorer.

    Så här skulle en körning kunna se ut:

    >java Prim 15
    2
    3
    5
    7
    11
    13
    >
    
    Ett lösningsförslag: Prim.java

Lös eller fundera på dessa uppgifter innan seminariet så ger det mest. Säg gärna till om du har frågor eller funderingar kring objektorienterad programmering eller Java. Det är detta seminaret är till för!

Om vi hinner kommer vi även att titta på sorteringsalgoritmer. Praktiska övningar.


Sem 2

Slingor med while och for, mer om metoder, rekursion, behållarklasser, inkapsling, räckvidd och paket.

  1. Skriv en for-slinga som räknar ut medelvärdet av alla talen i heltalsarray a utom det största talet givet att:
    int a[] = new int[10];
    for (int i=0; i<10; i++)
        a[i] = (int)(Math.random() * 20 );
    
  2. Lös ovanstående uppgift med en while-slinga.
  3. Förpacka ovanstående slinga i en metod. Diskutera vad som är lämpliga indata resp. utdata. (Argument och argumenttyper, returnvärde och returtyp)
  4. Skriv en rekursiv metod som beräknar summan av alla heltal mellan 0 och n där n är ett givet positivt heltal.
    public static int summa(int n){...
    
  5. Skriv ett litet program som utnyttnar klassen Burk och skapar en samling med olikfärgade burkar, givet klassen Burk:
    public class Burk{
        public String färg;
        public Burk nästaBurk;
    }
    
    där en burk har en färg och en lite mindre burk inuti, som en rysk docka. Den innersta burken har alltså nästaBurk == null.
  6. Skriv en rekursiv metod som kollar om det finns minst en burk av en viss färg i ovanstående trave.
    public static boolean sökFärg(Burk burk, String färg){...
    
  7. Skriv om klassen Burk så att dess instansvariabler initieras (ges ett startvärde) i konstruktorn
    public Burk(String f, Burk n){...
    
    och med lämpliga metoder för att läsa av instansvariablerna. Skydda instansvariablerna så att dessa inte är åtkomliga utanför klassen.
  8. Diskutera hur begreppet inkapsling hänger ihop med begreppet räckvidd.

Om tid och intresse finns:


Sem 3

Här finns några kod-exempel från seminariet

  1. Vad skrivs ut i följande kodexempel. Förklara!
    public class Rackvidd2{
        public static void main(String argv[]){
    	int x = 5;
    	f(x);
    	System.out.println("x = " + x);
        }
        public static void f(int x){
    	x = 10;
        }
    }
    

  2. Vad skrivs ut i följande kodexempel. Förklara!
    public class Rackvidd{
        private static int x = 1;
        private static int y = 1;
        private static int a[] = {3,5,7,9,11};
    
        public static void main(String argv[]){
    	x = f(x);
    	System.out.println("x = " + x);
    	System.out.println("a[x] = " + a[x]);
    	System.out.println("a[y] = " + a[y]);
        }
        public static int f(int k){
    	k = x + k;
    	y = y + 3;
    	{
    	    int x = 3;
    	    a[x] = 6;
    	    a[y] = 8;
    	}
    	return k;
        }
    }
    

  3. Steg A:
    Skapa en klass Verktyg som har attributet nummer av typen int. Klassen har en konstruktor som tar ett heltalsargument och tilldelar till nummer. Klassen ska vara offentligt tillgänglig. Klassen Verktyg ska ha en instansmetod
    public void använd(){...
    
    som skriver ut raden: "Kan inte göra nånting"

    Steg B:
    Låt klassen Verktyg tillhöra paketet smd.

  4. Skapa en klassdefinition Hammare som ärver Verktyg, överskuggar konstruktorn i Verktyg och anropar den. Klassen Hammare ska överskugga metoden använd(). Metoden använd() skriver ut textraden "Bonk, bonk".

  5. Skriv en exekverbar klass som importerar Vertyg och Hammare från paketet smd. I main-metoden ska du skapa ett Verktygs-objekt och två Hammare-objekt. Det ena Hammar-objektet ska deklareras som ett Verktyg men skapas som Hammare. Alla tre objekten ska anropa metoden använd().

    Extrauppgiften

  6. Utgå från följande klass och skapa en kö där första talet in, kommer först ut. (Med andra ord en fifo-buffert.) Se på detta exempel där heltal stoppas in och plockas ut ur en kö i fyra steg:
    steg 1    3 -> {5,2,7,9}
    steg 2         {3,5,2,7,9}
    steg 3         {3,5,2,7} -> 9
    steg 4         {3,5,2} -> 7 
    
    Till att börja med struntar vi i vad som händer om man försöker plocka ett heltal ur en tom kö eller stoppa in fler heltal än vad som ryms. Välj mellan att spara heltalen i en array, en Vector, en ArrayList eller någon annan struktur. Använd gärna nedanstående klassnamn och metodnamn.
    public class Fifo{
        /* metod för att lägga till heltal i kön */
        public void add(int x){
        }
        /*metod för att plocka heltal ur kön */
        public int get(){ 
            return 0;
        }
    }
    
    Nästa steg blir att kontrollera att hantera överfull buffert och läsning från tom buffert.


Sem 4

Dagens seminarium inleds med en Quiz och har sedan utrymme för aktuella frågor och problem från studenterna. Efter det tar vi oss an nedanstående uppgifter. Se även frågor från studenterna som samlades in under förra seminariet och några kortfattande svar på dessa.

  1. Förändra klassen Verktyg från seminarie3, uppgift 3, så att metoden använd() blir abstrakt. Hur påverkar det klassen Hammare resp. användningen av klassen Hammare och Verktyg?

  2. Beskriv skillnaden mellan Exception och RuntimeException.

  3. Skapa en klass DivisionMedNollException som ärver RuntimeException och en annan klass HittarInteFilenException som ärver Exception.

  4. Skriv ett testprogram som visar på användningen av ovanstående undantag

  5. Se uppgift 6 på seminarie 3

  6. Modifiera klassen Manniska från laboration 3, uppgift , så att den implementerar gränssnittet java.lang.Comparable där för och efternamn används som kriterier. Gör ett testprogram som jämför två människor och skriver ut dessa i bokstavsordning.


Sem 5

Dagens seminarium inleds med den klassiska quiz'en och följs sedan av ett arbete där alla ska konstuera en fifo-kö (first in-first out). Se uppgift 6 på seminarium 3.

Konstruera sedan en klass Matrix som innehåller en dubbelmatris int[][]. Skriv metoderna getWidth och getHeight för att få höjd och bredd på matrisen och metoden getValue(int x, int y) för att hämta värdet på positionen (x,y) i matrisen. En körning med nedanstående testprogram skulle ge denna utskrift:

5 6
3 4
1 2
Testprogrammet:
public class Test{
    public static void main(String argv[]){
	Matrix m = new Matrix(2,3);
	m.setValue(0,0,1);
	m.setValue(1,0,2);
	m.setValue(0,1,3);
	m.setValue(1,1,4);
	m.setValue(0,2,5);
	m.setValue(1,2,6);

	System.out.println(m.getValue(0,2) + " " + m.getValue(1,2));
	System.out.println(m.getValue(0,1) + " " + m.getValue(1,1));
	System.out.println(m.getValue(0,0) + " " + m.getValue(1,0));
    }
}

Nästa uppgift blir att modifiera användningen av DivisionMedNollException. Istället för att undersöka om nämnaren är noll ska vi fånga ArithmeticException och kasta vidare vår egen DivisionMedNollException.

Sista uppgiften är att modifiera klassen Manniska från laboration 3, uppgift , så att den implementerar gränssnittet java.lang.Comparable där för och efternamn används som kriterier. Gör ett testprogram som jämför två människor och skriver ut dessa i bokstavsordning. (Poängen är att se hur man implementerar ett gränssnitt och vilken nytta det kan ha.)

I vanlig ordning är alla frågor välkomna och studenternas funderingar kommer i första hand. Välkommen.


Sem 6

Genomgång av gammal tentamen från 2003-06-02