Föreläsning 4, X1, Q2,Fri, ht09
Jämförelseoperatorer, logiska uttryck
Vi går igenom det sista i dokumentet om tilldelning, aritmetiska operationer, in- och ut-matning mm från föreläsning 3.
Exemplen vi tittar på är klasserna PersonTest och TestPerson som testar klassen Person. För att kunna köra (exekvera) ett program måste det finns en main-metod. Exekveringen börjar alltid i main.
Vi tittar på hur man skriver för att kunna mata in från tangentbordet m h a ett Scanner-objekt.
Jämförelseoperatorer, logiska uttryck
Man kan jämföra variablers storlek med varandra, dvs deras inbördes relation som större än, mindre än, lika stora eller inte lika med. Vidare finns de logiska uttrycken och, eller samt icke. Resultatet av en sådan operation är antingen sann eller falsk. Ett villkor kan bl. a. innehålla följande operatorer:
Relationsoperatorer:
> större än, >= större än eller lika med
< mindre än, <= mindre än eller lika med
== lika med,
!= skilt från (inte lika med)
Logiska operatorer:
&& och
|| eller
! icke
Styrande satser
Vi ska nu titta på några enkla exempel på styrande satser. I program vill man ofta att det ska ske val beroende på vad som hänt tidigare. if-satsen som är den enklaste och vanligaste, konstruktionen i Java för att åstakomma selektion, dvs. val.
- if-satsen (selektion, villkorssats):
Logiska uttryck (&& || !) och jämförlseoperatorer (< <= > >= == !=) i villkorssatser:
Exempel 1:
if (tal>0)
System.out.prinln("Talet är positivt");
if (datum == 060101) //== jämförelseoperatorn
System.out.prinln("Happy new year!");
if( tal1>=0 && tal2>=0)
System.out.prinln("Båda talen är positiva.");
// Eller för att göra det tydligare
if( (tal1>=0) && (tal2>=0) )
System.out.prinln("Båda talen är positiva.");
if( tal1>=0 || tal2>=0)
System.out.prinln("Ett av talen är positivt");
Antag att variabeln c skall sättas till noll om variabeln a är
positiv och om variabeln b ligger utanför intervallt [0,10]. I
övrigt skall c sättas till 1. Det kan formuleras
if (a > 0 && (b < 0 || b > 10))
c = 0;
else
c = 1;
Exempel med variabel av typen boolean:
boolean flag = true; //typen är boolean, variablenamnet är flag, värdet är true
...
if (flag == true) //Alternativt skrivsätt: if(flag)
System.out.println("Det stämmer.");
else //dvs if (flag == false) eller if (flag != true) eller if (!flag)
System.out.println("Det stämmer inte.");
- Exempel med if-satsen:
- Programexempel 1: Age1.java Vad tror du händer
om man svarar 82 på frågan?
- Programexempel 2: Age2.java Titta på körexemplen. Hur ska programmet ändras för att körexempel 2 ska fungera rätt?
- Exempel med if - else if - else: Age3.java Programmet fungerar lika bra med fyra if-satser.
- Exempel med nästlade if-satser: TreTal.java. Observera sista körexemplet: man kan mata in talen med antingen Enter eller mellanslag mellan inmatningarna.
- Repetitionssatsen (loopar, iterationer)
I program vill man ofta upprepa samma händelse flera gånger, iterera, och det gör man genom att loopa. Det finns flera olika repetitionssatser, loopar, och vi kommer att gå igenom while-loopar och for-loopar.
- whileloopen (så länge som-loopen)
- Exempel 1: så länge som ett negativt tal matas in frågar programmet om
int tal;
Scanner sc = new Scanner(System.in);
System.out.print("Ge ett positivt tal: ");
tal = sc.nextInt();
while ( tal<=0 ) { //så länge som ett negativt tal matas in, fråga om
System.out.println("Ej positivt!");
System.out.println("Försök igen: ");
tal = sc.nextInt();
}
...
Allmän form
while ( villkor ){
satser;
}
- Villkoret
(tal <= 0) kollas först, varje gång innan programmet ska gå in i loopen
- Det som står i kroppen kommer att utföras varje iteration.
- Loopen upprepas så länge som villkoret är uppfyllt.
- Man måste se till att initiera loop-variabeln.
- Ingen ändring av loop-variabeln automatiskt.
- while-loopen kan (t ex) användas när man inte i förväg vet hur många gånger man ska upprepa en sak!
- Exempel 2
public static void factorial(int n) {
// Beräknar och skriver n! = 1*2*3*...*n
int i = 1; //i är en räknare
int fak = 1; //fak är produkten
while ( i<=n ) {
fak = fak*i;
i = i + 1;
}
System.out.println(fak);
}
Frågor
1. Vad händer om man ger n ett värde som är 0 eller mindre?
2. Vad händer om man ger n värdet 100?
Vi testar några värden. Resultatet i terminalfönstret:
5! = 120
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184
17! = -288522240
19! = 109641728
33! = -2147483648
34! = 0
Förklaring?
Om villkoret i whileloopen inte är uppfyllt från början kommer inte satserna i kroppen att utföras någon gång alls. Om det är så att dessa satser alltid ska utföras en gång under alla omständigheter kan man använda do-while-loopen. När den repetitionssatsen används kommer satserna i kroppen alltid att utföras en gång innan forsättningsvillkoret kontrolleras. I övrigt beter sig do-while-loopen precis som while-loopen.
- do ... while-loopen
- Exempel 2: Fråga användaren om hon/han vill ge ett till tal.
do {
System.out.println("Vill du ge ett till tal (j/n) ?");
svar = scan.nextLine();
} while (!(svar.equals("j")) && !(svar.equals("n")));
Programmet kommer att fråga om ända tills man svarar antingen 'j' eller 'n'. Villkoret
(!(svar.equals("j")) && !(svar.equals("n"))) kollas efter att programmet utfört det som står i loopen. Ett till exempel finns här.
- for-satsen
for-satsen brukar man använda då man känner till hur många gånger iterationen ska ske. En mycket användbar operator är då ++ prefix, eller -- postfix. Kriterierna för for-satsen är tre:
- initialisering
- upprepningsvillkor
- förändring (uppräkningsuttryck)
for (initialisering; upprepningsvillkor; uppräkningsuttryck (steglängd)){ satser;
}
- Först beräknas initialiseringsuttrycket, i tilldelas ett värde.
- Därefter beräknas upprepningsvillkor. Om det är sant utförs sats(erna) innanför.
- Sist beräknas uppräkningsuttrycket. Därefter beräknas upprepningsvillkoret igen.
- Detta pågår tills dess att upprepningsvillkor är falskt.
- Exempel 3: Vi ska räkna och skriva ut 7:ans tabell m h a for-sats. Vi behöver en räknare, en variabel som håller reda på hur långt i 7:ans tabell vi kommit. Kalla räknare för i.
int resultat;
for (int i=1; i<=10; i++) {
resultat = i*7;
System.out.println(i + " * 7 = " +resultat); //i räknas upp automatiskt!
}
Samma problem med en while-loop:
int resultat, i = 0;
while (i <= 10) { //i måste nollställas innan kollen här.
resultat = i*7;
System.out.println(i + "* 7 = " + resultat);
i = i+1; //i måste räknas upp!
}
Jämför de två lösningarna. Vilka är de viktigaste skillnaderna?
- Vilket blir resultatet av följande loop?
for ( ; ; )
System.out.println("HEJ!");
Hur stoppar man en oändlig loop?
Ett till exempel med en for-loop finns här.
Last modified: Mon Nov 9 11:33:57 MET 2009