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.

Filtrering:

1.14: Busstur

Filnavn: Busstur.java

Du skal skrive et program som sjekker om det er plass på en buss på en bussrute med tre stopp.

For hvert stopp, skal bruker taste inn hvor mange passasjerer som går på bussen. Det er plass til inntil 30 passasjerer i bussen. Dersom det er fullt på bussen, kan ingen nye passasjerer komme på. Om det er noen ledige plasser, men flere enn de antall ledige plassene som ønsker å gå på bussen, skal det slippes på like mange som ledige plasser. For eksempel om det er 27 på bussen og 3 ledige plasser igjen, og 6 ønsker å gå på, skal 3 av de som ønsker å komme på få plass, imens de resterende 3 må gå.

Vi antar at alle passasjerer skal til endestasjonen, så vi behøver ikke ta høyde for at noen går av bussen underveis.

Eksempel på kjøring:

Stasjon 1! Hvor mange gaar paa bussen?
> 14
Stasjon 2! Hvor mange gaar paa bussen?
> 13
Stasjon 3! Hvor mange gaar paa bussen?
> 5
Bussen er full. 2 maa gaa til fots.
import java.util.Scanner;

class Busstur {
    public static void main(String[] args) {
        Scanner tastatur = new Scanner(System.in);
        int passasjerer = 0;
        int nye = 0;

        System.out.println("Stasjon 1! Hvor mange gaar 
                paa bussen?");
        nye = Integer.parseInt(tastatur.nextLine());

        if((passasjerer + nye) >= 30) {
            passasjerer = 30;
            System.out.println("Bussen er full. " + 
                    (passasjerer + nye - 30) + 
                    " maa gaa til fots.");
        } else {
            passasjerer += nye;
        }

        System.out.println("Stasjon 2! Hvor mange gaar 
                paa bussen?");
        nye = Integer.parseInt(tastatur.nextLine());

        if((passasjerer + nye) >= 30) {
            passasjerer = 30;
            System.out.println("Bussen er full. " + 
                    (passasjerer + nye - 30) + 
                    " maa gaa til fots.");
        } else {
            passasjerer += nye;
        }

        System.out.println("Stasjon 3! Hvor mange gaar 
                paa bussen?");
        nye = Integer.parseInt(tastatur.nextLine());

        if((passasjerer + nye) >= 30) {
            passasjerer = 30;
            System.out.println("Bussen er full. " + 
                    (passasjerer + nye - 30) + 
                    " maa gaa til fots.");
        } else {
            passasjerer += nye;
        }
    }
}

1.15: Har du råd?

Filnavn: Raad.java

Du skal lage et program som først tar inn saldoen på din bankkonto(NB: Det skal være mulig å ta inn et tall med desimaler). Deretter skal man skrive inn en totalpris på en vare du har lyst til å kjøpe. Programmet skal deretter gi tilbakemelding om du har råd eller ikke.

import java.util.Scanner;

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

        //Innlesing fra bruker
        System.out.println("Skriv inn saldo:");
        Scanner tastatur = new Scanner(System.in);
        String linje = tastatur.nextLine();
        double saldo = Double.parseDouble(linje);

        System.out.println("Skriv inn prisen paa varen du vil kjope:");
        tastatur = new Scanner(System.in);
        linje = tastatur.nextLine();
        double prisPaaVare = Double.parseDouble(linje);

        if(saldo < prisPaaVare){
            System.out.println("Du har dessverre ikke raad. Sorry.");
        } else {
            System.out.println("Gratulerer! Du har raad.");
        }
    }
}

2.01: Min utskriftsmetode

Navn: MinMetode.java

a) Lag en klasse MinMetode og som printer "Hei student" til terminalen.
b) Endre programmet slik at printingen skjer uten et nytt linjeskift på slutten (Hint: System.out.print)
c) Lag en ny metode "static void linjeskift()" som printer ut et tomt linjeskift.
d) Kall metoden linjeskift etter at du har printet og sjekk at det blir likt som i oppgave a).

class MinMetode {
    public static void main(String[] args) {
        // Oppgave a
        System.out.println("Hei student");

        // Oppgave b
        System.out.print("Hei student");

        // Oppgave d
        linjeskift();
    }

    // Oppgave c
    public static void linjeskift() {
        System.out.println();
    }
}

2.02: Utskrift med metode

Navn: Utskrift.java

a) Skriv en metode som tar i mot en streng, og skriver denne ut i terminalen. Metodesignaturen skal se slik ut:

public static void utskrift(String tekst);

b) Skriv en metode som tar i mot et heltall, og skriver ut denne i terminalen. Kan metodene nå hete det samme?

c) Endre metoden fra b slik at vi tar i mot to heltall og plusser dem sammen. Skriv så ut resultatet til terminalen.

class Utskrift {

  public static void main(String[] args) {
    String enTekst = "Her er en tekst";
    int tall1 = 2;
    int tall2 = 5;

    utskrift(enTekst);
    utskrift(tall1);
    utskrift(tall1, tall2);
  }

    // Oppgave a
    public static void utskrift(String tekst) {
        System.out.println("Tekst: " + tekst);
    }

    // Oppgave b
    public static void utskrift(int tall){
      System.out.println("Tall: " + tall);
    }

    // Oppgave c
    public static void utskrift(int tall1, int tall2) {
        System.out.println("Sum av tallene: " + (tall1 + tall2));
    }
}

2.03: Kalkulator med meny og divisjon

Navn: EnkelKalkulator2.java

a) Utvid kalkulator-oppgaven fra oblig 2 med en metode for divisjon også. Pass på at programmet ikke gjør heltallsdivisjon. (Hint: double)

b) Oppdater programmet slik at brukeren selv bestemmer hvilke metoder som skal brukes. Bruk en enkel meny for dette.

Eksempelkjøring:

Tast inn tall1: 
> 2
Tast inn tall2: 
> 3
MENY: 
1 - addisjon
2 - subtraksjon
3 - multiplikasjon
4 - divisjon

Tast inn valg: 
> 1
Sum: 2 + 3 = 5

2.04: 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?

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.

2.05: Kodeflyt

Dette er en penn- og papiroppgave

Vis programflyten i dette programmet

class Billettpris {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int pris = 50;
        int alder = Integer.parseInt(scan.nextLine()); 

        if (alder < 12 || alder > 67) {
            System.out.println("Du må betale " + pris*0.5 + "kr");
        } else {
            System.out.println("Du må betale " + pris + "kr");
        }
    }
} 

Avhengig av hva bruker taster, vil vi enten havne i if-blokken, eller else-blokken. Taster bruker et tall lavere enn 12, eller høyere enn 67, havner vi i if-blokken. Ellers havner vi i else.

2.06: Studie med feil

Navn: Studie.java

Med utgangspunkt i programmet nedenfor skal du utføre de angitte endringene en for en. Prøv først å kompilere programmet og studér eventuelle feilmeldinger. Dersom programmet lar seg kompilere, så forsøk å kjøre det. For hvert forsøk skal du rette programmet tilbake til utgangspunktet og kontrollere at det virker.

class Studie {
    public static void main(String[] args) {
        System.out.println("Rett på Java");
    }
}

a) Fjern ordet static.
b) Fjern ordet void.
c) Skriv studie i stedet for Studie.
d) Skriv Skrått i stedet for Rett.
e) Fjern den siste krøllparentesen.

2.07: Volum med feil

Navn: Volum.java

Finn feilene i dette programmet:

public class Volum {
    public static void main (String[] args) {
        integer lengde, bredde, høyde;
        lengde = 3;
        volum = lengde * bredde * høyde;
        System.out.println("Volumet er: " + volum);
    }
}
  1. Linje 3: "integer" skulle vært "int"
  2. Linje 5: Uinitialisert variabel volum
  3. Linje 5: bredde og høyde har ikke fått noen verdi.

2.08: Feilmeldinger

Vi har gitt følgende program:

1 class Test {
2   public static void main(String[] args) {
3       int jens;
4       int siv = Jens * 3;
5       System.out.println("Svar: " siv);
6       erna = siv - jens;
7       System.out.printn(erna);
8   }

Prøv å kompilere programmet. Hva betyr følgende feilmeldinger, som kompilatoren spytter ut når vi prøver å
kompilere og debugge dette programmet?

a) Test.java:8: reached end of file while parsing
     }
      ^

b) Test.java:4: cannot find symbol
   symbol : variable Jens
   location: class Test
    int siv = Jens * 3;
              ^

c) Test.java:4: variable Jens might not have been initialized
    int siv = Jens * 3;
              ^

d) Test.java:5: ) expected
    System.out.println("Svar: " siv);
                               ^
   Test.java:5: illegal start of expression
    System.out.println("Svar: " siv);
                                   ^

e) Test.java:6: cannot find symbol
   symbol : variable erna
   location: class Test
    erna = siv - jens;
    ^
f) Test.java:7: cannot find symbol
   symbol : method printn(int)
   location: class java.io.PrintStream
    System.out.printn(erna);
              ^

Hvis vi fjerner "{" (krøllparentesen) på linje 2 får vi ca. 10 nye feilmeldinger, bl.a. følgende.

g) Test.java:2: ; expected
    public static void main(String[] args)
                                          ^
   Test.java:5: <identifier> expected
    System.out.println("Svar: " + siv);
                      ^
   Test.java:5: illegal start of type
    System.out.println("Svar: " + siv);
                        ^

Hva tipper du er grunnen til at så mange feilmeldinger forårsakes av bare denne enkle lille feilen?

a) Denne feilen kommer av at man har glemt eller lagt til en krøllparantes for mye. Her mangler vi en krøllparantes for å lukke klassen.

b) og c) Kompilatoren finner ikke variabelen Jens. Dette er fordi vi på linje 3 har kalt den jens. Dette vil i Java bli sett på som to ulike variabler, og kan fikses ved å kalle begge variablene for jens.

d) Når vi har flere ting vi vil skrive ut i en printsetning må vi "legge" disse sammen ved å plusse de sammen. Løsningen her hadde vært å legge til et ekstra plusstegn, slik: System.out.println("Svar: " + siv);

e) Kompilatoren finner ikke variabelen erna, siden vi aldri har deklarert den. Kompilatoren må vite hvilken type variable erna er, og siden det står et regnestykke på høyreside av to heltall, er det naturlig å la erna være en variabel av typen int. Det hadde da blitt seende slik ut: int erna = siv - jens;

f) Her mangler vi l i println.

g) Grunnen til at det kommer så mange flere feil, er at man får flere følgefeil av den første kompilatorfeilen. En god huskeregel er alltid å rette kompileringsfeil først, og deretter kompilere på nytt. Gjenta helt til alle feilene er borte.

2.09: Hønsegården

Filnavn: Honsegaard.java

Du skal skrive et program som simulerer en natt i hønsegården. Hva som skjer, avhenger av om reven kommer, og om bonden sover eller ei.

Programmet skal lese inn fra terminal hvor mange høner som i bor i gården, om reven kommer i løpet av natten, og om bonden sover.

  1. Dersom reven kommer og bonden sover, blir én høne spist av reven.
  2. Dersom reven kommer og bonden ikke sover, blir ingen høner spist, og bonden selger reveskinnet for 190 kr.
  3. Dersom reven ikke kommer, skjer ingenting.

Eksempel på kjøring:

Hvor mange honer bor i gaarden?
> 15
Kommer reven?
> Ja
Sover bonden?
> Ja
Det bor naa 14 hons i gaarden.

Eksempel 2:

Hvor mange honer bor i gaarden?
> 15
Kommer reven?
> Ja
Sover bonden?
> Nei
Det bor naa 15 hons i gaarden. Bonden selger ett reveskinn, og tjener 190 kr.

2.11: Kompileringsfeil

Finn fem kompileringsfeil i programmet under:

class HarFeil {
    public static void main {
        System.out.println(Tast inn et siffer: );
        String tekstMedTall = tastatur.nextLine();
        x = Integer.parseInt(tekstMedTall);
        System.out.println("Det dobbelte er " + (2 * x))
    }
}
  1. Linje 2: Deklarasjonen av main mangler (String[] args)
  2. Linje 3: Anførselstegn rundt utskriftsstrengen mangler.
  3. Linje 4: Scanner er verken importert eller opprettet. "tastatur" gir ingen mening.
  4. Linje 5: x er ikke deklarert, mangler "int".
  5. Linje 6: Det mangler en avsluttende semikolon.

2.12: 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);
    }
}
  1. Linje 6: System.in står i anførselstegn. Dette vil passere kompilering, men lesing blir da fra en antatt fil kalt "System.in" -- ikke terminalen.
  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.

2.13: 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.

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!");
        }
    }
}

2.14: Sannhetsverdier

Gitt at verdien av b er false, og verdien av x er 0. Hva er sannhetsverdien til følgende uttrykk?

  1. b && x == 0
  2. b || x == 0;
  3. !b && x == 0
  4. !b || x == 0
  5. b && x != 0
  6. b || x != 0
  7. !b && x != 0
  8. !b || x != 0
  1. false
  2. true
  3. true
  4. true
  5. false
  6. false
  7. false
  8. true

2.15: Forenkle sannhetsverdier

Du skal nå forenkle følgende sannhetsverdier:

a) b == true

b) b == false

c) !b == true

d) !b == false

a) b

b) !b

c) !b

d) b

3.01: While-løkke med teller

Filnavn: Lokker.java

a) Skriv et program som inneholder klassen "Lokker"
b) Lag en while-løkke som teller fra 0 til 10. Hint: while(....)
c) Legg til en printing av telleren du bruker slik at det blir en printing for hver gang løkken kjører.

Forventet utskrift:

0
1
2
3
4
5
6
7
8
9
class Lokker {
    public static void main(String[] args) {
        int teller = 0;

        while(teller < 10) {
            System.out.println(teller);
            teller = teller + 1;
        }
    }
}

3.02: Primtall lavere enn N

Navn: Primtall.java

Denne oppgaven er hentet fra Big Java: Late objects (P4.18)

Skriv et program som
a) tar imot et tall fra brukeren.
b) skriver ut alle primtall lavere enn tallet fra brukeren.

import java.util.Scanner;

class Primtall {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int tall = Integer.parseInt(sc.nextLine());
        int teller = tall;

        while(teller > 1) {
            printPrimtall(teller);
            teller--;
        }
    }

    public static void printPrimtall(int tall) {
        int teller = tall-1;
        boolean funnet = false;

        while(teller > 1) {
            if(tall % teller == 0) {
                funnet = true;
            }
            teller--;
        }

        if(!funnet) {
            System.out.println("Fant primtall " + tall);
        }
    }
}

3.03: 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.

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++;
        }
    }
}

3.04: String-array

Navn: StringArray.java

a) Lag en array som inneholder tekststrenger.
b) Lag en løkke som går like mange ganger som arrayen er lang. (Hint: Bruk en teller i en løkke)
c) Les inn tekst fra brukeren og lagre det i arrayen. (Hint: bruk løkken fra b og telleren for å vite neste ledige posisjon i arrayen)
d) Skriv ut arryaen.

import java.util.Scanner;

class StringArray {
    public static void main(String[] args) {
        String[] array = new String[5];
        int teller = 0;
        Scanner tastatur = new Scanner(System.in);

        System.out.println("Skriv inn fem ord:");
        while(teller < array.length) {
            array[teller] = tastatur.nextLine();
            teller++;
        }

        teller = 0;
        System.out.println("Tastede ord:");
        while(teller < array.length) {
            System.out.println(array[teller]);
            teller++;
        }
    }
}