Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Logg inn

Valgte tags:

Filtrering:

Skriv ut:

02.03: Mindre enn eller større enn

Navn: MindreStorre.java

a) Lag et program som tar inn et tall fra brukeren og skriver ut om tallet er mindre eller større enn 10.
b) Legg deretter til en test til for å sjekke om tallet er mindre eller større enn 20.
c) Endre programmet slik at brukeren kun får én tilbakemelding per tall som er tastet innn.

Programmet skal kunne se slik ut under kjøring:

Tast inn et tall: 
> 13
Tallet er mellom 10 og 20

Tast inn et tall: 
> 9
Tallet er under 10

Tast inn et tall: 
> 22
Tallet er over 20
Vis løsningsforslag
import java.util.Scanner;

class MindreStorre {
    public static void main(String[] args) {
        int tall;
        Scanner tastatur = new Scanner(System.in);

        System.out.println("Tast inn et tall:");
        tall = Integer.parseInt(tastatur.nextLine());

        if(tall < 10) {
            System.out.println("Tallet er under 10");
        } else if(tall => 10 && tall <= 20) {
            System.out.println("Tallet er mellom 10 og 20");
        } else {
            System.out.println("Tallet er over 20");
        }
    }
}

02.04: Enkel telefonbok

Vi skal i denne oppgaven lage en enkel telefonbok, der bruker kan søke på navn for å hente telefonnummer.

a) Lag en klasse Telefonbok med en main-metode. Opprett en HashMap med nøkkeltype String og verditype String.

b) Fyll HashMap'en med følgende relasjoner:
("Arne", "22334455")
("Lisa", "95959595")
("Jonas", "97959795")
("Peder", "12345678")

c) Lag en ordreløkke der bruker kan søke etter navn, og få opp det tilhørende telefonnummeret.

d) Gjør slik at når bruker avslutter, løper du igjennom alle nøklene i HashMapen - og skriver ut navn og telefonnummer.

Hint: HashMap har en funksjon som heter keySet() som henter alle nøkler (navnene).

Vis løsningsforslag

import java.util.HashMap;
import java.util.Scanner;

class Telefonbok {
    public static void main(String[] args) {
        HashMap<String, String> telefonbok = new HashMap<>();

        telefonbok.put("Arne", "22334455");
        telefonbok.put("Lisa", "95959595");
        telefonbok.put("Jonas", "97959795");
        telefonbok.put("Peder", "12345678");

        Scanner in = new Scanner(System.in);

        int input = 0;
        while(input != 1) {
            System.out.println("Meny:\n0: Soek etter person\n1: Avslutt");
            input = Integer.parseInt(in.nextLine());

            if (input == 0) {
                System.out.println("Hvem vil du ha nummeret til?");
                String navn = in.nextLine();


                if (telefonbok.containsKey(navn)) {
                    String tlf = telefonbok.get(navn);
                    System.out.println("Navn: " + navn + ", tlf: " + tlf);
                } else {
                    System.out.println("Fant ikke " + navn + ".");
                }
            }
        }

        System.out.println("Oversikt:");
        for (String navnekey : telefonbok.keySet()) {
            System.out.println("Navn: " + navnekey + ", tlf: " + telefonbok.get(navnekey));
        }
    }
}

02.05: Oversettelse av klasse fra Python til Java

Filnavn: Brev.java og Hovedprogram.java

Under ligger et program skrevet i Python som du nå skal "oversette" til Java. Husk at i Java må du ha en fil for klassen Brev, og en fil for hovedprogrammet.
Hint: her kan du bruke ArrayList, da må du også importere ArrayList "import java.util.ArrayList;" øverst i filen.

class Brev:
    def __init__(self, avsender, mottaker):
        self._avsender = avsender
        self._mottaker = mottaker
        self._linjer = []

    def skrivLinje(self, linje):
        self._linjer.append(linje)

    def lesBrev(self):
        print("Hei,", self._mottaker)
        print()
        for linje in self._linjer:
            print(linje)
        print()
        print("Hilsen fra,")
        print(self._avsender)

brevet = Brev("Per Askeladd", "Espen Askeladd")
brevet.skrivLinje("Hvordan har du det?")
brevet.skrivLinje("Jeg har det bare bra!")
brevet.lesBrev()
Vis løsningsforslag

Fil: Brev.java

import java.util.ArrayList; 

class Brev {
    private String avsender;
    private String mottaker;
    private ArrayList<String> linjer;

    public Brev(String avsender, String mottaker) {
        this.avsender = avsender;
        this.mottaker = mottaker;
        linjer = new ArrayList<String>();
    }

    public void skrivLinje(String linje){
        linjer.add(linje);
    }

    public void lesBrev(){
        System.out.println("Hei " + this.mottaker);
        System.out.println();
        for (String linje: this.linjer) {
            System.out.println(linje);
        }
        System.out.println();
        System.out.println("Hilsen fra " + this.avsender);
    }
}

Fil: Hovedprogram.java

class Hovedprogram {
    public static void main(String[] args) {
        Brev brevet = new Brev("Per Askeladd", "Espen Askeladd");
        brevet.skrivLinje("Hvordan har du det?");
        brevet.skrivLinje("Jeg har det bare bra!");
        brevet.lesBrev();    
    }
}

02.06: Kjøretidsfeil

Finn tre kjøretidsfeil i følgende programkode:

import java.util.Scanner;

class HarKjoretidsfeil {
    public static void main(String[] args) {
        int x = 0;
        int y = 0;
        Scanner tastatur = new Scanner("System.in");

        System.out.println("Tast inn to heltall");
        x = Integer.parseInt(tastatur.nextLine());
        x = Integer.parseInt(tastatur.nextLine());

        System.out.println("Summen av tallene er: " + x + y);
    }
}
Vis løsningsforslag
  1. Linje 6: System.in står i anførselstegn. Dette vil passere kompilering, men Scanner-objektet vil da lese fra selve Stringen "System.in", ikke fra terminal.
  2. Linje 8 og 9: Leser til variabelen x to ganger -- y står uberørt.
  3. Linje 11: Slå en parentes rundt (x + y) for å beregne den faktiske summen. Utskriften som står, vil skrive tallene i x og y etter hverandre.

02.07: Studenter og quiz-score

a) Implementer en klasse 'Student'. En student har et navn, en total quiz-score og et antall quizer studenten har deltatt på. Disse verdiene skal oppgis i konstruktør.

Klassen skal ha følgende metoder(i tillegg til konstruktøren):

hentNavn();
leggTilQuizScore(int score);
hentTotalScore();
hentGjennomsnittligScore();

b) Lag metoden leggTilQuizScore slik at den legger til 1 på antall quizer studenten har deltatt på hver gang man vil legge til en score.

c) Opprett en ny klasse med en main-metode.

d) Lag tre nye Student-objekter, ved navn "Joakim", "Kristin" og "Dag".

e) Kall så metoden leggTilQuizScore på alle studentene minst to ganger hver.

f) Print ut alle studentene sin totale score og gjennomsnittelige score.

Vis løsningsforslag

a-b)

class Student{
  private String navn;
  private int quizScore;
  private int antallQuizer;

  public Student(String navn, int quizScore, int antallQuizer){
    this.navn = navn;
    this.quizScore = quizScore;
    this.antallQuizer = antallQuizer;
  }

  public String hentNavn(){
    return navn;
  }

  public void leggTilQuizScore(int score){
    quizScore += score;
    antallQuizer ++;
  }

  public int hentTotalScore(){
    return quizScore;
  }

  public int hentGjennomsnitteligScore(){
    return quizScore/antallQuizer;
  }
}

c-f)

class QuizResultater{
  public static void main(String[] args) {
    Student joakim = new Student("Joakim", 234, 79);
    Student kristin = new Student("Kristin", 34, 1);
    Student dag = new Student("Dag", 46325, 358);

    for(int i = 0; i < 3; i++){
      joakim.leggTilQuizScore((i + 1) * 2);
      kristin.leggTilQuizScore((i + 1) * 3);
      dag.leggTilQuizScore(i + 1);
    }

    skrivUtStudent(joakim);
    skrivUtStudent(kristin);
    skrivUtStudent(dag);
  }

  //lager en metode for utskrift saa man slipper samme kode
  //flere ganger
  public static void skrivUtStudent(Student student){
    System.out.println("--------------");
    System.out.println(student.hentNavn());
    System.out.println("Total score: " + student.hentTotalScore());
    System.out.println("Gjennomsitt score: "  + student.hentGjennomsnitteligScore());
  }
}

02.08: Samlinger av objekter

Du får utdelt følgende klasse:

class Person {

    private String navn;
    private String telefonnummer;
    private String adresse;

    public Person(String navn, String telefonnummer, String adresse) {
        this.navn = navn;
        this.telefonnummer = telefonnummer;
        this.adresse = adresse;
    }

    public void skrivInfo() {
        System.out.println("Navn: " + navn);
        System.out.println("Telefonnummer: " + telefonnummer);
        System.out.println("Adresse: " + adresse + "\n");
    }

    public String hentNavn() {
        return navn;
    }
}

a) Skriv en klasse Telefonbok med en main-metode. Inne i main lager du tre Person-objekter med forskjellige navn, telefonnummer og adresser.

b) Opprett en array med plass til 10 Person-objekter og legg inn objektene du laget i arrayen. Bruk en for-løkke til å kalle på hvert objekts skrivInfo-metode (pass på at du ikke prøver å kalle på metoden når du ser gjennom tomme plasser!).

c) Kommenter ut liste fra oppgave b. Utvid main-metoden med en ArrayList (husk å importere) og alle Person-objektene inn i denne. Skriv ut informasjon om personene igjen, men denne gangen bruker du en såkalt for each-løkke (slå opp i læreboka ved behov for repetisjon).

d) (Vanskelig) Kommenter ut koden fra oppgave c. Utvid main-metoden med et HashMap (husk å importere), der nøkkelverdien skal være en persons unike navn (bruk Person-metoden hentNavn) og innholdsverdien er selve person-objektet. Igjen skal du legge inn alle Person-objektene og deretter skrive ut informasjon om disse ved hjelp av en for each-løkke. Test også hva som skjer dersom to av personene har samme navn!

Vis løsningsforslag

a)

import java.util.ArrayList;
import java.util.HashMap;

class Telefonbok {
    public static void main(String[] args) {
        Person p1 = new Person("Leah", "91112233", "Losveien 12, Blaanes");
        Person p2 = new Person("Margot", "12345678", "Rotnes gaard, Elveli");
        Person p3 = new Person("Nissen", "00000000", "Stjerneveien 12, Nordpolen");
    }
}

b)

Person[] pliste = new Person[10];

        pliste[0] = p1;
        pliste[1] = p2;
        pliste[2] = p3;

        for (int i = 0; i < pliste.length; i++) {
            if (pliste[i] != null) {
                pliste[i].skrivInfo();
            }
        }

c)

ArrayList<Person> telefonliste = new ArrayList<>();
        telefonliste.add(p1);
        telefonliste.add(p2);
        telefonliste.add(p3);

        for (Person p : telefonliste) {
            p.skrivInfo();
        }

d)

HashMap<String, Person> telefonbok = new HashMap<>();

        telefonbok.put(p1.hentNavn(), p1);
        telefonbok.put(p2.hentNavn(), p2);
        telefonbok.put(p3.hentNavn(), p3);

        for (Person p : telefonbok.values()) {
            p.skrivInfo();
        }

02.09: Skatt i Ruritania

Filnavn: SkattIRuritania.java

I det fiktive landet Ruritania er skattereglene slik:

  • Hvis man har inntekt < 10000, så betaler man 10% skatt på hele inntekten

  • Hvis inntekten >= 10000, så betaler man 10% skatt på de første 10000 kronene og 30% skatt på resten av inntekten.

Lag et program som regner ut og skriver ut hvor mange kroner som skal betales i skatt. Programmet skal lese inntekten (som antas å være et desimaltall) fra terminal.

Vis løsningsforslag
import java.util.Scanner;

class SkattRuritania {
    public static void main(String[] args) {
        Scanner tastatur = new Scanner(System.in);
        double inntekt = 0.0;
        double skatt = 0.0;

        System.out.println("Tast inn din inntekt:");
        inntekt = Double.parseDouble(tastatur.nextLine());

        if(inntekt < 10000) {
            skatt = inntekt*0.1;
        }
        else {
            skatt = ((10000*0.1) + ((inntekt - 10000)*0.3));
        }

        System.out.println("Skatt: " + skatt);
    }
}

02.10: Handletur

Navn: Handletur.java

Programmet skal regne ut totalpris for en bruker etter å ha vært på handletur. De varene det er mulig å kjøpe er broed, melk, ost og youghurt.

Prisene er som følger:
Broed: 20 kr.
Melk: 15 kr.
Ost: 40 kr.
Youghurt: 12 kr.

Eksempel på interaksjon med programmet:

Hei! Velkommen til IFI-butikken.
Hvor mange brød vil du ha?
> 2
Hvor mange melk vil du ha?
> 1
Hvor mange ost vil du ha?
> 1
Hvor mange yoghurt vil du ha?
> 3
Du skal betale: 131 kr.
Vis løsningsforslag
import java.util.Scanner;

class Handletur{
  public static void main(String[] args) {
    //Gjor det mulig aa lese fra terminal
    Scanner input = new Scanner(System.in);
    System.out.println("Hei! Velkommen til IFI-butikken.");

    System.out.println("Hvor mange brød vil du ha?");
    int antallBroed = input.nextInt(); //henter en int fra terminal

    System.out.println("Hvor mange melk vil du ha?");
    int antallMelk = input.nextInt();

    System.out.println("Hvor mange ost vil du ha?");
    int antallOst = input.nextInt();

    System.out.println("Hvor mange yoghurt vil du ha?");
    int antallYoghurt = input.nextInt();

    int sum = antallBroed * 20 + antallMelk * 15 + antallOst * 40 + antallYoghurt * 12;
    System.out.println("Du skal betale: " + sum);
  }
}

02.11: Heltallsarray og løkke

Navn: Heltallsarray.java

a) Lag fem heltallsvariable som inneholer verdiene 0,1,2,3,4.
b) Skriv ut variablene.
c) Lag en heltallsarray som kan inneholde 5 tall.
d) Legg verdiene dine inn i arrayen ved hjelp av en løkke.
e) Skriv ut variablene i arrayen ved hjelp av en løkke.

Vis løsningsforslag
class Heltallsarray{
    public static void main(String [] args){
        int tall1 = 0;
        int tall2 = 1;
        int tall3 = 2;
        int tall4 = 3;
        int tall5 = 4; 

        System.out.println("Utskrift av variable:");
        System.out.println("tall1 = " + tall1);
        System.out.println("tall2 = " + tall2);
        System.out.println("tall3 = " + tall3);
        System.out.println("tall4 = " + tall4);
        System.out.println("tall5 = " + tall5);

        int array [] = new int [5];

        int lengdePaaArray = array.length;
        int teller = 0; 
        while(teller < lengdePaaArray){
            array[teller] = teller;
            teller++;
        }

        teller = 0;
        System.out.println("Utskrift av array:");
        while(teller < lengdePaaArray){
            System.out.println("array[" + teller + "] = " + array[teller]);
            teller++;
        }
    }
}

02.12: Enkel lesing fra fil

Navn: FraFil.java

a) Lag et program med en klasse FraFil som inneholder en main-metode.
b) Opprett et Scanner-objekt for å lese fra filen tekst.txt i main-metoden. Pass på at main-metoden må "kaste unntak" (throws Exception).
c) Lag en løkke som går så lenge det finnes uleste linjer i filen og som leser en ny linje hver gang løkken kjøres.
(Hint: Bruk Scanner sin metode hasNextLine())
d) Print alle de innleste linjene til terminalen.

Følgende tekst kan lagres i filen tekst.txt dersom du ønsker å teste programmet ditt:

hei
paa
deg
student
Vis løsningsforslag
import java.util.Scanner;
import java.io.File;

class FraFil {
    public static void main(String[] args) throws Exception {
        Scanner fil = new Scanner(new File("tekst.txt"));

        String linje = "";
        while(fil.hasNextLine()) {
            linje = fil.nextLine();
            System.out.println(linje);
        }
    }
}

02.13: Lese temperatur fra fil

Navn: TemperaturLeser.java

a) Lag et program som inneholder en String-array med 12 plasser.
b) Lag et Scanner-objekt for å lese filen "Temperatur.txt". Filen kan finnes på denne linken.
c) Legg til en løkke i programmet som kjøres så lenge det finnes uleste linjer i filen. Lagre hver innleste linje i arrayen. Bruk her en teller for å holde styr på neste ledige plass.
d) Print ut alle elementene i arrayen.

Vis løsningsforslag
import java.util.Scanner;
import java.io.File;

class TemperaturLeser {
    public static void main(String[] args) throws Exception {
        Scanner fil = new Scanner(new File("Temperatur.txt"));
        String[] temperaturer = new String[12];
        int teller = 0;

        while(fil.hasNextLine()) {
            temperaturer[teller] = fil.nextLine();
            teller++;
        }

        for(int i = 0; i < temperaturer.length; i++) {
            System.out.println(temperaturer[i]);
        }
    }
}

02.14: Bytte verdier

Oppgaven er hentet fra Big Java: Late objects (R5.14)

Se på metoden under. Den skal bytte verdien i to variabler:

public static void main(String[] args) {
    int x = 3;
    int y = 4;
    variabelBytte(x, y);
    System.out.println(x + " " +y);
}

public static void variabelBytte(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

Hvorfor fungerer ikke metoden slik den skal?

Vis løsningsforslag

Metoden bytter verdien i variablene, men siden den ikke returnerer noe, vil ikke verdiene av x og y oppdateres i main. x og y som eksisterer i metoden variabelBytte, er kopier av verdiene til x og y som sendes fra main - ikke de faktiske variablene.

02.15: Enkelt køsystem

Du har fått i oppgave i å utforme et program for et enkelt køsystem for et nytt apotek. Køsystemet skal fungere som en rettferdig kø, som vil si at den som har ventet lengst på hjelp(som trakk lapp først), skal få hjelp først. Når en kunde har fått hjelp, skal den fjernes fra køen.

Klassene du har behov for er:

  • KoLapp - Skal ha en unikt nummer som sier når den ble trukket.

  • KoSystem - Skal kunne lage nye kølapper, betjene den kunden som har trukket kølapp først og enda ikke har blitt betjent og holde styr på hvor mange kunder som venter på å bli betjent. Dette skal oppnåes ved at den klassen innholder en ArrayList koLapper av objekter av typen KoLapp.

  • KoProgram - Skal ha en main-metode og en ordreløkke.

Grensesnittet til KoSystem ser slik ut:

public class KoSystem{

    //Lager et nytt objekt av KoLapp, printer ut informasjon om den og legger den til i listen over koLapper.     
    public void trekkKoLapp(){

    }

    //Henter ut, printer ut informasjon og fjerner den forste kolappen i lista. Gir feilmelding dersom ingen kunder staar i ko.
    public void betjenKunde(){

    }

    //Returnerer antall kunder som er i ko.
    public int antKunder(){

    }

    //Printer alle kunder i ko
    public void printKunderIKo(){

    }

}

Grensesnittet til KoLapp ser slik ut:

public class KoLapp{

    //Konstruktor
    public KoLapp(int nummer){

    }

    //Returnerer et tildelt nummer paa kolappen.    
    public int hentNummer(){

    }
}

KoProgram skal inneholde en ordreløkke som tar i mot instrukser fra bruker. Se under for eksempel av kjøring:

> java KoProgram
**MENY FOR BILLETTSYSTEM**
1 - Trekk ny kolapp.
2 - Betjen kunde.
3 - Print antall kunder i kø.
4 - Avslutt.

> 1
Du har fatt tildelt billettnr 1.
Det staar 0 foran deg.

**MENY FOR BILLETTSYSTEM**
1 - Trekk ny kolapp.
2 - Betjen kunde.
3 - Print antall kunder i kø.
4 - Avslutt.

> 3
Det staar 1 personer i ko.

**MENY FOR BILLETTSYSTEM**
1 - Trekk ny kolapp.
2 - Betjen kunde.
3 - Print antall kunder i kø.
4 - Avslutt.

> 1
Du har fatt tildelt billettnr 2.
Det staar 1 foran deg.

**MENY FOR BILLETTSYSTEM**
1 - Trekk ny kolapp.
2 - Betjen kunde.
3 - Print antall kunder i kø.
4 - Avslutt.

> 2
Kunde med billettnr. 1 er betjent.

**MENY FOR BILLETTSYSTEM**
1 - Trekk ny kolapp.
2 - Betjen kunde.
3 - Print antall kunder i kø.
4 - Avslutt.

> 4
Programmet avsluttes.
Vis løsningsforslag
// Klasse Kolapp
public class KoLapp{

    int nummer;

    /**
     * konstruktor setter nummer paa kolapp
     */
    public KoLapp(int nummer){
        this.nummer = nummer;
    }

    /**
     * returnerer kolapp-nummeret
     */
    public int getNummer(){
        return nummer;
    }
}
// Klasse KoSystem
import java.util.ArrayList;

public class KoSystem{

    ArrayList<KoLapp> koLapper = new ArrayList<>();
    int teller = 0;

    /**
     * Lager et nytt objekt av KoLapp, printer ut
     * informasjon om den og legger den til i listen
     * over koLapper.
     */
    public void trekkKoLapp(){
        teller ++;
        KoLapp nyLapp = new KoLapp(teller);
        koLapper.add(nyLapp);

        System.out.print("Du har fatt tildelt billettnr ");
        System.out.println(nyLapp.getNummer() + ".");
        System.out.println("Det staar "+(koLapper.size()-1) +" foran deg.\n");
    }

    /**
     * Henter ut, printer ut informasjon og fjerner den
     * forste kolappen i lista. Gir feilmelding dersom
     * ingen kunder staar i ko.
     */
    public void betjenKunde(){
        if(koLapper.isEmpty()){
            System.out.println("ingen er i ko");
        } else {
            KoLapp betjenes = koLapper.remove(0);
            System.out.print("Kunde med billettnr: ");
            System.out.println(betjenes.getNummer() + " er betjent.\n");
        }

    }

    /**
     * Returnerer antall kunder som er i ko.
     */
    public int antKunder(){
        return koLapper.size();
    }

    /**
     * Printer alle kunder i ko
     */
    public void printKunderIKo(){
        System.out.println("Disse er i ko: ");

        // printer ved hjelp av en for-each-løkke
        for(KoLapp koLapp : koLapper){
            System.out.print("nr." + koLapp.getNummer() + ", ");
        }
        System.out.println("\n\n");
    }
}
//klasse KoProgram
import java.util.Scanner;

public class KoProgram{

    public static void main(String[] args){
        KoSystem koSystem = new KoSystem();
        Scanner scanner = new Scanner(System.in);
        int valg = 0;

        while(valg != 4){
            printMeny();
            valg = Integer.parseInt(scanner.nextLine());

            if(valg == 1){
            koSystem.trekkKoLapp();
            } else if(valg == 2){
            koSystem.betjenKunde();
            } else if(valg == 3){
            koSystem.printKunderIKo();
            } else if(valg == 4){
            System.out.println("Programmet avsluttes.");
            } else {
            System.out.println("Error: tast 1,2,3 eller 4");
            }
        }
    }

    public static void printMeny(){
        String meny = "**MENY FOR BILLETTSYSTEM**\n";
        meny += "1 - Trekk ny kolapp\n";
        meny += "2 - Betjen kunde\n";
        meny += "3 - Print antall i ko\n";
        meny += "4 - Avslutt\n";

        System.out.println(meny);
    }
}

02.16: Hvilken datastruktur?

Hvilken datastruktur passer til følgende problemer?

  1. En billettkø
  2. Et personregister hvor personer har en unik id
Vis løsningsforslag
  1. Til en billettkø passer ArrayList best, siden man her kan bruke indeksen for å hele tiden hente ut element på plass 0. Dessuten kan det være vilkårlig mange i køen.

  2. Til et personregister hvor personer har en unik id vil det passe best med HashMap, siden man her kan hente ut personen med nøkkel som id.

02.17: Fil med linjenummer

Fil: Linjenummer.java

Skriv et program som leser en fil med tekst. Les hver linje og send linja ut til terminalen, etterfulgt av linjenumre.

Hvis inputfilen er:

Mary had a little lamb
Whose fleese was white as snow.
And everywhere that Mary went,
The lamb was sure to go.

blir resultatet:

# 1: Mary had a little lamb
# 2: Whose fleese was white as snow.
# 3: And everywhere that Mary went,
# 4: The lamb was sure to go.
Vis løsningsforslag
import java.util.Scanner;
import java.io.File;

class Linjenummer {
    public static void main(String[] args) {
        Scanner fil = new Scanner(new File("Mary.txt"));
        String linje = "";

        for(int i = 1; fil.hasNextLine(); i++) {
            linje = fil.nextLine();
            System.out.println("# " + i + ": " + linje);
        }
    }
}

02.18: Oppmøte i gruppetime

Vi skal her lage en klasse for å registrere oppmøte til obligatoriske gruppetimer. Klassen skal inneholde to arrayer, én av typen String, som skal holde på studentenes navn, og en av typen boolean, som skal registrere om studentene har møtt opp eller ikke.

a)
Her får du et klasseskjelett som kun inneholder instansvariabler. Du skal selv implementere grensesnittet til klassen, som skal inneholde metoder for å:
1. Lese inn filen gruppeliste.txt, og fylle inn navn-arrayen med navn fra filen.
2. Registrere om en student har møtt eller ikke
3. Skrive ut alle studenter og om de har møtt opp eller ikke

class Gruppeoppmoete {
    private String[] navn = new String[14];
    private boolean[] oppmoete = new boolean[14];

    // Fyll inn med metodene nevnt over.
}

b)
Skriv en klasse TestGruppeoppmoete som instansierer og tester Gruppeoppmoete.

Vis løsningsforslag

Gruppeoppmoete.java

import java.util.Scanner;
import java.io.*;

public class Gruppeoppmoete {

    private String[] navn = new String[14];
    private boolean[] oppmoete = new boolean[14];
    private int totaltStudenter = 0; // teller for antall unike oppmoeteindivider

    // Oppgave 1)
    public void lesInnFil(String filnavn) throws Exception {
        Scanner innfil = new Scanner(new File(filnavn));
        while(innfil.hasNextLine() && totaltStudenter < navn.length) {
            // saa lenge det er fil og plass i array, lagre navn
            navn[totaltStudenter] = innfil.nextLine(); // lagrer navnet
            totaltStudenter++; // oeker antall registrert oppmoette
        }
    }

    // Oppgave 2)
    public void registrerOppmoete(String studentnavn) {
        for (int i=0; i<totaltStudenter; i++) {
            if (studentnavn.equals(navn[i])) {
                oppmoete[i] = true;;
            }
        }
    }

    // Oppgave 3)
    public void skrivUtAlleOppmoette() {
        for (int i=0; i<totaltStudenter; i++) {
            if (oppmoete[i]) {
                System.out.println(navn[i] + " har moett.");
            } else {
                System.out.println(navn[i] + " har IKKE moett");
            }
        }
    }

}

TestGruppeoppmoete.java

public class TestGruppeoppmoete {

    public static void main(String[] args) throws Exception {
        Gruppeoppmoete register = new Gruppeoppmoete();
        register.lesInnFil("gruppeliste.txt");
        register.registrerOppmoete("Lisa");
        register.registrerOppmoete("Bilal");
        register.registrerOppmoete("Jens");
        register.registrerOppmoete("Emilie");
        register.skrivUtAlleOppmoette();
    }

}

02.19: Finn student ved navn

Gitt HashMap'en studenter der nøkkelverdien representerer et navn, skriv en metode for å finne ut om det finnes en student med navnet Espen Askeladd. Metoden skal returnere true hvis studenten finnes, ellers false.

Vis løsningsforslag
public boolean finnStudent(String navn){
    return studenter.containsKey(navn);
}

Alternativt:

public boolean finnStudent(String navn){
   if(studenter.containsKey(navn)){
        return true;
    } return false;
}

02.20: Iterere igjennom en HashMap

Anta at du har et HashMap studenter, deklarert og initialisert slik:

HashMap studenter = new HashMap();

Nøkkelen er navnet til studenten. Du kan anta at Student har en .toString()-metode som henter ut navn.

a) Bruk en for each-løkke til å skrive ut alle nøkkelverdiene. Hva skrives ut?

b) Bruk en for each-løkke til å igjennom alle Student-objektene(verdiene), for å skrive ut navnet til studentene.

Vis løsningsforslag

a)

for(String nokkel : studenter.keySet()){
    System.out.println(nokkel);
}

Studenten sitt navn blir skrevet ut.

b)

for(Student denneStudenten : studenter.values()){
    System.out.println(denneStudenten.toString());
}

Alternativt kan man droppe kall til toString() – denne kalles implisitt når man skriver ut referanse til et objekt.

02.21: Like strenger

a) Koden under printer ut "Navnene er ikke like!". Hva er feil?

class LikeStrenger{
    public static void main(String [] args){
        String navn1 = new String("Maria");
        String navn2 = new String("Maria");

        if(navn1 == navn2){
            System.out.println("Navnene er like!");
        } else {
            System.out.println("Navnene er ikke like!");
        }
    }
}

b) Endre programmet slik at det fungerer.

Vis løsningsforslag

a) Feilen er at vi benytter oss av '=='. Om man skal sjekke likhet for strenger er like, må man benytte seg av metoden .equals().

b) Programmet kunne heller ha sett slik ut:

class LikeStrenger{
    public static void main(String [] args){
        String navn1 = new String("Maria");
        String navn2 = new String("Maria");

        if(navn1.equals(navn2)){
            System.out.println("Navnene er like!");
        } else {
            System.out.println("Navnene er ikke like!");
        }
    }
}

Tillegg: Det vil ikke være riktig å endre programmet til:

String navn1 = "Maria";
String navn2 = "Maria";

Grunnen til dette er at javakompilatoren vil behandle de to Stringene som samme objekt. Å skrive new String("Maria") forsikrer oss om at vi får to ulike objekter av den samme klassen, men samme navn.

02.22: Sorter fil-info

P Martin
H Trofast
H Tapper
H Rex
P Simen
P Elin
H Tara
P Svein

Teksten over er en liste over navn. De linjene som starter med P, inneholder et navn til en person, mens linjene som starter med H er for en hund. Start med å kopiere over listen til en fil du kaller navn.txt.

Start med å skrive to klasser: Klasse Person og klasse Hund. Begge klassene skal kun ha en konstruktør som tar imot et navn og en metode som returnerer navnet.

Skriv et program som leser inn denne filen. For hvert navn i filen skal du opprette et objekt av riktig type og legge det inn i henholdsvis en hunde- eller personliste (husk at listene må ha dynamisk størrelse). Skriv deretter ut begge listene separat.

Ekstra utfordring: Kan du ta høyde for at navn kan inneholde mer enn ett ord (for eksempel "Tara Elise", "Glenn Rudi" eller "Lyn Gordon")?

Vis løsningsforslag
import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;

class HunderPersoner {
  public static void main(String[] args) {

    File f = new File("navn.txt");

    //Proever aa hente inn "navn.txt"
    Scanner filleser = null;
    try {
      filleser = new Scanner(f);
    } catch (FileNotFoundException e) {
      System.out.println("Fant ikke filen!");
    }

    ArrayList<Hund> hunder = new ArrayList<>();
    ArrayList<Person> personer = new ArrayList<>();

    String linje = "";
    while (filleser.hasNextLine()) {
      linje = filleser.nextLine();

      //Deler opp linjen paa mellomrom
      String[] delt = linje.split(" ");

      //Fordeler objekter basert paa foerste bokstav
      if (delt[0].equals("P")) {
        Person p = new Person(delt[1]);

        /*Alternativt, hvis vi oensker aa ta hoeyde for lengre navn:
        String navn = "";
        for (int i = 1; i < delt.length; i++) {
          navn += delt[i] + " ";
        }
        Person p = new Person(navn);*/

        personer.add(p);

      } else if (delt[0].equals("H")){
        Hund h = new Hund(delt[1]);
        hunder.add(h);
      } else {
        System.out.println("Feil format!");
      }
    }

    System.out.println("Personer:");
    for (Person p : personer) {
      System.out.println(p.hentNavn());
    }

    System.out.println("Hunder:");
    for (Hund h : hunder) {
      System.out.println(h.hentNavn());
    }
  }
}