Göm menyn

TDDE10 Objektorienterad programmering i Java

Introduktion till Java

Inledning

Börja med att läsa igenom de översiktliga instruktionerna för labbarna, och sedan hela laborationshandledningen så att du får en översikt över laborationens struktur och omfång och vad som ska göras och hur det ska redovisas.

Laborationen går ut på att lära sig grundläggande syntax i Java samt att bekanta sig med utvecklingsverktyget Eclipse. Laboranten har fördel av att sedan tidigare vara bekant med ett imperativt språk (som t.ex. Ada). Laborationen behandlar egentligen inte objektorientering, utan är tänkt som ett insteg till detta nya språk.

Laborationshandledningens struktur

Denna laboration består av två delar, som båda kan utföras efter den första föreläsningen. Delarna är uppbyggda av en uppgiftsdel och en handledningsdel. Det är viktigt att handledningen följs för att laborationen ska gå så smidigt som möjligt.

Examination och inlämning

Resultatet examineras genom en demonstration på plats under laborationstid.

Kommentera koden efter behov. Läsaren skall kunna förstå vad varje metod gör även om denne inte hade läst laborationshandledningen. Kommentera även inuti metoderna där det är något extra krångligt som sker som behöver förklaras.

Be din laborationsassistent att komma och gå igenom labben med er när ni är klara. Ni får då svara på några av frågorna under de olika stegen. Observera att ni ska kunna redogöra för all kod och alla frågor individuellt.

Del 1. Java-programmering i emacs

Uppgift

Ett svenskt personnummer är uppbyggt på ett speciellt sett. En finurlig grej är att det finns ett snabbt (nåja) sätt att kontrollera om personnumret är ett korrekt sådant, och inte bara i all hast påhittat. Din uppgift blir att i Java skriva en metod som kontrollerar ett personnummer enligt följande algoritm:
  1. Multiplicera varannan siffra i det tiosiffriga personnumret med 1 respektive 2. Börja från vänster, med 2. Om produkten skulle bli tvåsiffrig summeras de två siffrorna ihop och resultatet används istället.
  2. Addera samtliga dessa produkter till en stor summa.
  3. Om denna summa är jämt delbar med tio är personnumret giltigt. Returnera true. Annars returnera false.

Exempel: 910325-9876

  9  1  0  3  2  5  9  8  7  6 
* 2  1  2  1  2  1  2  1  2  1
 -----------------------------
 18  1  0  3  4  5 18  8 14  6

(1 + 8) + 1 + 0 + 3 + 4 + 5 + (1 + 8) + 8 + (1 + 4) + 6 = 50

50 / 10 = 5 => giltigt nummer
Det är inte obligatoriskt att programmet hämtar indata från terminalen. Dock ska det på något sätt gå att bekräfta att metoden fungerar som den ska, dvs. ger rätt resultat för både felaktiga och korrekta personnummer, via testprogrammet (huvudprogrammet).

Handledning

Öppna en terminal och skapa mappen TDDE10 i din hemkatalog (se sidan Tips för terminalen om ni har glömt bort kommandona som behövs). Skapa sedan mappen lab0 inne i den nya mappen. lab0 blir då projektnamnet.

Ställ dig sedan i katalogen lab0 och skapa/öppna din källfil med kommandot emacs ValidityCheck.java & (observera STORA bokstäver på V och C).

Uppgiften i sin helhet kan tyckas knepig, men som ni vet sen tidigare är nyckeln till att göra problem lättare att dela upp dem i mindre delproblem. Det första steget här torde vara att skriva ett program som startar och skriver ut något till skärmen.

Skriv in följande kod i filen

public class ValidityCheck {

    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

och spara. Programmet går redan nu att kompilera.

Gå tillbaka till terminalen, kontrollera att du står i katalogen lab0.

Kompilera ditt program med följande kommando.

javac ValidityCheck.java

Om allt gick bra har en ny fil skapats; ValidityCheck.class i mappen. Javaprogram kan till skillnad från program skrivna i t.ex Ada inte köras direkt av operativsystemet utan körs av JVM (Java Virtual Machine). Kör därför ditt program med kommandot

java ValidityCheck

(notera java för att köra, javac för att kompilera)

När ni bekräftat att det fungerar, ta en extra titt på koden och försök förstå alla delar. Ändra eller lägg till lite fler utskrifter. Fungerar det som väntat?

Nästa steg borde sedan vara att skriva en dummy-metod för kontroll-metoden vi ska skriva. Vi vet ju redan t.ex. vad metoden ska producera för svar, så om vi kan specificera metoden och hur vi kommer använda den blir det lättare att ta nästa steg. Ett steg i taget, och testa så att varje steg fungerar.

Koden borde nu se ut något i stil med:

public class ValidityCheck {

    public static boolean isValidPNR(String number) {
	// add code here
	return false;
    }

    public static void main(String[] args) {
        String personNumber = "9103259876";

        if (isValidPNR(personNumber)) {
            System.out.println("Giltigt nummer.");
        } else {
            System.out.println("Ej ett giltigt nummer.");
        }
    }
}
Tips:
  • number.charAt(i) returnerar tecknet ur strängen number på positionen i
  • Character.digit(ch, 10) gör om tecknet i ch till en int (ett heltal, dvs. en integer). Det andra heltalet, 10, anger vilken talbas tecknets siffra är i.
  • Scanner scanner = new Scanner(System.in); skapar en scanner kopplad till inmatningsbufferten och scanner.nextLine(); hämtar en rad från terminalen som i sin tur kan fångas upp i, exempelvis, en variabel. Frivilligt att använda i denna labb. Kolla upp Scanner i Javas API för att få klarhet i hur den fungerar. Glöm inte att importera Scanner med import java.util.Scanner; högst upp i er fil.
  • % (procenttecken-operator) tar fram resten vid en heltalsdivision (när kan du vilja göra det?)
  • Fler metoder? Bläddra lite i Javas API-dokumentation!
  • När ni programmerar, kom ihåg att dela upp problemet i mindre delar, och testa så att varje steg ni tar fungerar som det ska innan ni går vidare! Spårutskrifter är ovärderliga!
Frågor att fundera på
  • Säkerligen har du brottats med ett antal kompileringsfel innan du kommit så här långt. Stanna till en kort stund och fundera på hur dina fel först upptäcktes. Var det du eller kompilatorn?
  • Vilken del av problemet angrep du först? Var det med facit i hand rätt angreppssätt?
  • Finns det någonstans att läsa om alla dessa bekväma metoder som finns för t.ex. String?

Del 2. Java-programmering i Eclipse

Nu har du provat på att skriva ett litet Java-program med emacs och terminalen. En del småfel hittades förmodligen vid kompilering och mycket hopp fram och tillbaka mellan emacs och terminalen krävdes (eller?). Kanske behövdes även ett antal hopp till en manual för att ta reda på vilka metoder (medlemsmetoder) en klass som t ex String har. Att programmera på detta vis är tidskrävande, så nu tar vi ett kvantsprång!

Nu är det dags att börja programmera i ett modernt utvecklingsverktyg som används i industrin idag*. I den här kursen använder vi Eclipse, ett öppet och gratis verktyg för programvaruutveckling.

Vi har samlat information om hur man startar eclipse på sidan Komma igång med eclipse

* I rättvisans namn används även emacs till viss del ute i industrin och har en del nischer även det.
Uppgift
  1. Importera källkoden från del 1 till ett nytt projekt i Eclipse.
  2. Komplettera ert program med en ny metod som kontrollerar att strängen med personnummer har korrekt längd. Metoden ska som indata ta en sträng med siffror samt en integer som indikerar vad som är korrekt längd.
  3. Använd denna metod i isValidPNR som en extra kontroll. Ett personnummer är ju trots allt inte korrekt om det inte också har rätt längd.
Frågor att fundera på
  • Bör den nya kontrollen av personnumrets längd vara det första eller sista som kontrolleras? Varför?
  • Hur pass annorlunda hade programmet blivit om du skrivit i ett imperativt språk, t.ex. Ada?
  • Många kreditkortsföretag använder faktiskt samma algoritm för att bestämma den sista siffran på kortnumret. Detta för att det ska gå att göra en snabbkontroll för säljaren även när den inte är ansluten till banken. Samma gäller för OCR-numret på fakturor. Vilka ändringar i ditt program skulle behövas för att istället kontrollera ett kreditkortsnummer?
  • Vad är fördelar och nackdelar med Eclipse gentemot emacs?

Examination

Visa upp ditt projekt i Eclipse för labassistenten på laborationstid.


Sidansvarig: Magnus Nielsen
Senast uppdaterad: 2024-01-15