Laborationer

Nybörjaren

Är du nybörjare på datorer eller i vårt datorsystem? Börja med dessa två introduktionssidor:
Datorintroduktion light
Datorintroduktion

Allmän lab-info

Laborationsdelen av kursen består dels av ett antal enklare programmeringsuppgifter, dels av en större programmeringsuppgift. Varje laborationsuppgift redovisas enligt instruktionen nedan.

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.

Det tidsgränser som är utsatta för redovisningen av laborationerna måste hållas för att få godkänt resultat. Om du får förhinder av något slag så ska du avtala en ny tid med någon av lärarna. Detta måste göras före stoppdatumet.

Det är inte nödvändigt att ha blivit godkänd på inlämningsuppgifterna för att tentera på kursen.

Ett flertal labtillfällen finns inbokade på schemat. Vid dessa tidpunkter finns labhandledare närvarande som man kan fråga om hjälp (gäller inte Pass 5). Erfarenheter visar dock att många studenter behöver mer tid än de inbokade tillfällena för att lära sig laborationsinnehållet och därför uppmuntras ni att besöka labbet även då det inte är någon schematid lagd. Labbet har öppet dygnet runt, men efter kontorstid krävs passerkort för att komma in.

Har du problem att logga in? I A3002 hittar du administratörerna, de kan hjälpa dig med det.

Färgkodning i Emacs: om ni vill att Emacs ska färgkoda er javakod så behöver ni bara lägga till följande rader i filen .emacs, som ligger i er hemkatalog:

;; Start jde-mode for Java files.
(setq auto-mode-alist (append '(
                ("\\.java$" . jde-mode)
                auto-mode-alist)))
(autoload 'jde-mode "jde")
Skriva ut javaprogram: programmet a2ps kan hjälpa till att ge snygga utskrifter av din javakod. För att skriva ut filen MinKod.java när man sitter i labbsalen skriver man
a2ps -Plw25XX MinKod.java
där XX byts ut mot 06 eller 10, beroende på vilken skrivare man vill skriva ut på.

Redovisning av laboration

Din lösning av en labuppgift, som består av källkodsfilen med filändelsen .java och klassfilen med filändelsen .class sparas i filkatalogen smd134. Kom ihåg att katalogen måste vara allmänt läslig för att jag ska kunna komma åt lösningen. När du är färdig med uppgiften (vilket också betyder att du har genomfört en fullständig testning av din lösning) skickar du ett email till ul@sm.luth.se för att meddela detta. För detta meddelande gäller:

  1. Subject-raden ska vara "Uppgift x SMD134" t.ex. "Uppgift 1 SMD134" för den första laborationen.
  2. Om du inte skickar ditt mail från ditt konto på skolan, bifoga i meddelandet din emailadress på skolan så att svaret kommer till rätt e-postmottagare.
  3. Skriv namn och personnummer.
  4. Skriv sökväg till din fil. För användaren urblil-6 skulle det bli följande sökväg för första laborationen:
    /home/urblil-6/smd134/Addera.java
  5. Skicka ditt mail senast stoppdatum för laborationsinlämning. Se respektive laboration.

Inom några dagar efter att ha skickat ditt meddelande får du svar från mig. Detta svar är antingen ett meddelande om att du har blivit godkänd på uppgiften, eller kommentarer om vad som måste fixas innan du blir godkänd. Spara all kommunikation med mig om uppgiften. När du får meddelande att du blivit godkänd på uppgiften, spara detta meddelande tills du ser att du har fått dina poäng för laborationsdelen av kursen. Efter att din inlämning blivit godkänd ska källkoden ligga kvar oförändrad i din katalog till slutet av läsperioden.

Om du skickar in uppgiften efter rättning

Om du behöver rätta eller ändra i uppgiften ska du bifoga mitt tidigare meddelande där jag beskrev vad som skulle fixas. Lägg också till en kortfattad rapport över dina ändringar.


Lab 1

Redovisas senast 26/1

  1. Det första Javaprogrammet: Skriv ett program som vid exekvering ger utskriften "Otroligt!".

  2. Skriv ett program som skriver ut dina initialer med stora bokstäver gjorda av asterisker. Exempel:
     *    *   *****
     *   *    *    *
     ****     *    *
     *  *     *****
     *   *    *
     *    *   *
    
    Ledning: för att utforma bokstäverna kan du ta hjälp av kommandot banner.

  3. Skriv ett program som beräknar och skriver ut värdet av 63781139*58673*1050.

  4. 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.

  5. Skriv ett program som har två heltal av typen int och skriver ut till skärmen. I detta exempel heter klassen Skriv och heltalen är 4 respektive 8:
    >java Skriv
    4 + 8
    

  6. (Redovisning) Skriv ett program som läser in två inmatade tal, adderar dessa och skriver ut svaret. Klassen ska ha namnet Addera, som i nedanstående exempel. Använd gärna klassen LasIn för att läsa in från tangentbordet. Här ligger källkoden för LasIn.java. Så här ska en programkörning se ut:
    >java Addera
    Skriv term 1: _
    
    Användaren ska då skriva in ett tal och trycka "Enter". Fortsätt sedan att mata in term två och tryck "Enter" och resultatet ska se ut enligt nedanstående exempel:
    >java Addera
    Skriv term 1: 23
    Skriv term 2: 5
    23 + 5 = 28
    > 
    
    För denna laboration ska varje kodrad ha en kommentar som beskriver programraden. Se nedanstående exempel:
    public class Addera{// Denna rad anger klassens namn 
                        //och att den är offentlig (public)
        public static void main(String argv[]){// Kan ännu inte alla detaljer om 
                                               // denna rad utom att det är den 
                                               // metod som först anropas vid en
                                               // körning
            int x = 1; // heltalsvariabeln x deklareras och tilldelas värdet 1
        ...
    


Lab 2

Redovisas senast 9/2

  1. Skriv en metod
    public static boolean tvåLika(int a,int b,int c)
    
    som returnerar true om minst två av talen a,b,c är lika, och annars false.

  2. Skriv en metod
    public static int miniMax(int[] a, int[] b)
    
    som returnerar det minsta av de två talen m och n, där m är det största talet i a och n är det största talet i b.

  3. Skriv ett program som beräknar och skriver ut det minsta heltalet k för vilket k*(k-1)*(k-2)*(k-3) är större än 101091.

  4. Skriv en metod
    public static int längsta(String[] a)
    
    som returnerar längden av den längsta strängen i arrayen a, eller 0 om arrayen a är tom. Om a har värdet null ska metoden returnera -1.

  5. Skriv ett program Konkatenera (som alltså är namnet på klassen som innehåller main) som när det exekveras skriver ut hopslagningen av de strängar som följer efter klassnamnet på kommandoraden. Exempelvis ska anropet
    java Konkatenera a b c Kalle Kajsa
    
    ge utskriften
    abcKalleKajsa
    

  6. Skriv en metod
    public static boolean tvåLika(String[] a)
    
    som returnerar true om det i arrayen a finns (minst) två strängar som är lika, och annars false.

  7. Skriv en metod
    public static double geoMedel(double[] a)
    
    som returnerar det geometriska medelvärdet av talen i a, under förutsättning att alla talen i a är större än 0. Om något tal är mindre än 0 ska metoden returnera -1. Med det geometriska medelvärdet av talen x1,..,xn menas (x)1/n, där x är produkten av de n talen. (Ledning: använd klassen java.lang.Math.)

  8. Skriv en metod
    public static String taBort(char a,String s)
    
    som returnerar den sträng som fås om man i strängen s tar bort alla förekomster av tecknet a. Anropet
    taBort('p',"Arbetsplatsombud")
    
    ska alltså returnera "Arbetslatsombud". Alla metoder i klassen String får användas.

  9. (Redovisning) Denna uppgift går ut på att beräkna och presentera en återbetalningsplan för studielånet. Användaren matar in sitt födelseår, startår för återbetalning, lånets ränta och storlek och får en återbetalningsplan utskriven. Klassen ska ha namnet Payback som i nedanstående exempel på en körning (I denna utskrift har jag klippt bort åren 2006-2026):
    >java Payback
    Födelseår: 1980
    Startår  : 2004
    Ränta    : 3.1
    Skuld    : 150000
    
    Återbetalningsplan med (yyyy) : (belopp) kr
    2004 : 7014 kr
    2005 : 7155 kr
    ...
    2027 : 11061 kr
    2028 : 11282 kr
    >
    
    Det årsbelopp som ska betalas varje år bestäms av skuldens storlek, räntesatsen (f.n. 3.1 %) för lånet och antalet betalningsår. Årsbeloppet ökar med två procent per år vid oförändrad ränta. Antalet betalningsår är 25 men återbetalningen ska avslutas det år personen fyller 60 år. D.v.s. Kalle börjar betala när han är 37 och får därför 23 år på sig att betala lånet.

    Utöver detta finns det en hel rad av regler och specialfall som styr återbetalningstakten som vi inte tar hänsyn till i denna laboration. Se CSNs regler för återbetalning om du är nyfiken på mer information.

    Samband mellan skuldbelopp, räntesats, antal återbetalningsår och förändringsfaktor för återbetalningsbeloppet:

    Skuldbelopp 		s
    antal återbetalningsår 	n
    Förändringsfaktor       f1 = 1,02
    Förändringsfaktor       f2 = 1 + räntesats/100 = 1 + 3/100 = 1,03
    
    Formel för att beräkna det första årsbeloppet a:

    Formel för att beräkna det n:te årsbeloppet a(n):
    a(n) = a * f1n-1
    T.ex. det tionde årsbeloppet a(10): a(10) = a * f110-1


Lab 3

Redovisas senast 23/2

  1. Skriv en metod likbentTriangel(int n) som skriver ut en likbent triangel av asterisker vars bas består av n asterisker, under förutsättning att n är ett udda heltal mindre än 80. För att triangeln ska bli vacker i asteriskgrafik måste varje rad i triangeln innehålla ett udda antal asterisker. Ett anrop likbentTriangel(7) ska alltså ge utskriften
       *
      ***
     *****
    *******
    
    Skriv ett program som använder sig av metoden för att skriva ut en triangel vars bas ges i ett argument på kommandoraden. Skriv programmet så att det testar om det tal som står på kommandoraden är positivt, udda och mindre än 80, och skriver ut ett felmeddelande om dessa villkor inte är uppfyllda.

  2. Definera en klass Stream som har två attribut data och index. index är ett heltal och data är en teckenarray. Konstrueraren ska ta en array av char som enda argument. Klassen ska också innehålla en metod read som returnerar ett tecken. Första anropet av read returnerar första tecknet i data-arrayen, andra anropen ger andra tecknet i arrayen, o.s.v. tills sista tecknet returnerats. Alla följande anrop ger tecknet '\0' i retur.

  3. (Redovisning) Definiera en offentlig klass med namnet Util som innehåller en metod
    public static int[] sort(int arr[]){...
    
    Metoden tar en heltalsarray som argument, sorterar talen i stigande ordning i denna array. Följande anrop
    int radda[] = {3,50,10,4,2};
    int svar[] = sort(radda);
    
    skulle resultera i att arrayen svar fick heltalsvärdena {2,3,4,10,50}. Du kan använda valfri algoritm men ange i en kommentar vilken du använder och principen för hur den fungerar.

    Krav:

  4. Definiera en klass Stack som fungerar som en stapel. Man kan lägga och plocka textsträngar från stapeln. När man lägger en sträng till stapeln så hamnar den alltid överst. När man plockar från stapeln så är det alltid den senast lagrade strängen man hämtar.

    Klassen har två attribut stapel och senaste. Attributet stapel är en array av teckensträngar och attributet senaste är ett heltal som pekar ut den senast lagrade strängen i arrayen. Klassen har två instansmetoder

    
    public boolean push(String str){...
    
    och
    public String pop(){...
    
    där metoden push tar en sträng som ett argument och lagrar på stapeln och ökar attributet senaste med ett. Den returnerar true om allt gick bra och annars false, d.v.s. om stapel var full. Metoden pop() plockar bort den senaste strängen och returnerar denna. Attributet senaste ska minskas med ett. Om stapeln är tom returnerar metoden null. Konstrueraren ska ta ett heltal som argument som bestämmer stapelns höjd.

    Följande rader i en main-metod testar om stacken kan lagra och returnera två strängar.

    //test av stacken
    Stack stack = new Stack(5);
    stack.push("Hej");
    stack.push("du");
    	
    System.out.println(stack.pop());
    System.out.println(stack.pop());
    
    Skriv en test av din Stack-klass som utökar ovanstående exempel. Förutom att lagra och läsa ska testet visa vad som händer när:

  5. Definiera en metod
    static int inversioner(int[] a)
    
    som returnerar som värde antalet inversioner i arrayen a. En inversion är ett par i,j av index sådana att i>j men a[i]<a[j]. Exempelvis gäller att en array med medlemmarna

    9 24 70 19 94

    har 2 inversioner, medan

    27 67 78 15 7 15 81 22

    har 14 inversioner.


Lab 4

Redovisas senast 2/3

Denna laboration kommer i två olika smaker: matte och grafik. Du får välja en av dessa varianter. Ange vilken variant du har valt när du skickar meddelande till labhandledaren att du är färdig.
Välj en av dessa:


Lab 5