inf1000 høst2016
Grunnkurs i objektorientert programmering.
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);
}
}
- Linje 3: "integer" skulle vært "int"
- Linje 5: Uinitialisert variabel volum
- 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.
- Dersom reven kommer og bonden sover, blir én høne spist av reven.
- Dersom reven kommer og bonden ikke sover, blir ingen høner spist, og bonden selger reveskinnet for 190 kr.
- 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))
}
}
- Linje 2: Deklarasjonen av main mangler (String[] args)
- Linje 3: Anførselstegn rundt utskriftsstrengen mangler.
- Linje 4: Scanner er verken importert eller opprettet. "tastatur" gir ingen mening.
- Linje 5: x er ikke deklarert, mangler "int".
- 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);
}
}
- 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.
- Linje 8 og 9: Leser til variabelen x to ganger -- y står uberørt.
- 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?
- b && x == 0
- b || x == 0;
- !b && x == 0
- !b || x == 0
- b && x != 0
- b || x != 0
- !b && x != 0
- !b || x != 0
- false
- true
- true
- true
- false
- false
- false
- 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++;
}
}
}