Föreläsning 4: for, while, do

TDA 545: Objektorienterad programmering
Föreläsning 4:
for, while, do-while
Magnus Myréen
Chalmers, läsperiod 1, 2015-2016
Frågor efter förra föreläsning
Vad betyder:
en tilldelningssats (assignment)
där x uppdateras till värdet av uttrycket x+1
x = x+1
special uttryck med
sidoeffekt:
uppdatering
updatering av
av
variabeln x
x++
++x
x == x+1
x != x+1
ett uttryck, värdet är x, men variabeln x
uppdateras också till värdet av uttrycket x+1
ett uttryck, först uppdateras x till x+1, sedan
returneras värdet av x, dvs nu x+1
ett uttryck av typen boolean, testar (o)likhet
mellan två heltals uttryck (int expressions)
Fråga mera! Det här är mycket bra frågor. Uppskattas!
Kan man skriva test som visar vad svaren är?
while
loopar
Loopar med okänt antal varv=while
for-satsen
Loopar med okänt
Blocketantal
utförs varv=while
noll eller flera gånger.
= 8; i = i+1) {
Blocket utförs noll Syntax
eller flera gånger.
(i + “ “);
while (<boolean expression>)
{
Syntax
Informell semantik
<statements>
(på en
rad)
while
(<boolean expression>)
{
1: beräkna <boolean expression>
}
<statements>
2: om det blev true, kör <statements>
---Informell Semantik
8
och fortsätt från steg 1 igen.
1. Loopvillkoret (boolean expression) evalueras.
3: om det blev false, då är while klart,
ch <= 'z';
Informell Semantik
2. Om det är sant exekveras satserna inuti
ch++)
{
dvs programmet fortsätter köra koden
1. Loopvillkoret (boolean
expression)
evalueras.
loopen (<statements>) en gång varefter 1-2
ln(ch);
kommer efter }
2. Om det är sant exekveras
inuti
utförs igen.satsernasom
}
gång varefter
3. Omen
villkoret
är falskt 1-2
görs ingenting dvs
en per loopen
rad (<statements>)
Tips!
beräkningar
kan man
ersätta
utförsIigen.
loopen
terminerar
(stannar).
while (<bool-­‐exp>) { satser }
3. Om
villkoret är falskt görs ingenting dvs
=50; tal=2*tal){
int i = 0;
loopen terminerar (stannar).
med
ln(tal);
int p = 4;
if (<bool-­‐exp>) { while (i < 10 && p > 2) {
int
i
=
0;
satser; satser ...
int
p = 4;
while (<bool-­‐exp>) { satser } , 8, 16, 32
i = i+1;
while
(i
<
10
&&
p > 2) {
}
} // end loop
satser ...
Exempel för while
int i = 0; while (i < 3) { System.out.print(i + " "); i = i + 1; }
Exempel för while
int i = 0; while (i < 3) { System.out.print(i + " "); i = i + 1; }
Exempel för while
while (i < 3) { System.out.print(i + " "); i = i + 1; }
typ: int
namn: i
0
Exempel för while
while (i < 3) { System.out.print(i + " "); i = i + 1; }
typ: int
namn: i
0
Exempel för while
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } }
typ: int
namn: i
0
Exempel för while
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } }
typ: int
namn: i
0
Exempel för while
if (0 < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } }
typ: int
namn: i
0
Exempel för while
if (true) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } }
typ: int
namn: i
0
Exempel för while
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
0
Exempel för while
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
0
Exempel för while
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
0
Exempel för while
System.out.print(0 + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
0
Exempel för while
System.out.print("0 "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
0
Exempel för while
System.out.print("0 "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
0
Exempel för while
i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 ”
0
Exempel för while
i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 ”
0
Exempel för while
i = 0 + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 ”
0
Exempel för while
i = 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 ”
0
Exempel för while
while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 ”
1
Exempel för while
while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 ”
1
Exempel för while
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int
namn: i
Utskrift (output):
“0 ”
1
Exempel för while
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int
namn: i
Utskrift (output):
“0 ”
1
Exempel för while
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int
namn: i
Utskrift (output):
“0 ”
1
Exempel för while
if (1 < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int
namn: i
Utskrift (output):
“0 ”
1
Exempel för while
if (true) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } typ: int
namn: i
Utskrift (output):
“0 ”
1
Exempel för while
typ: int
namn: i
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } Utskrift (output):
“0 ”
1
Exempel för while
typ: int
namn: i
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } Utskrift (output):
“0 ”
1
Exempel för while
i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 1 ”
1
Exempel för while
i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 1 ”
1
Exempel för while
while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 1 ”
2
Exempel för while
while (i < 3) { System.out.print(i + " "); i = i + 1; } typ: int
namn: i
Utskrift (output):
“0 1 ”
2
Exempel för while
typ: int
namn: i
Utskrift (output):
if (i < 3) { “0 1 ”
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
if (i < 3) { “0 1 ”
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
if (i < 3) { “0 1 ”
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
if (true) { “0 1 ”
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 ”
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 ”
System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } 2
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
while (i < 3) { System.out.print(i + " "); i = i + 1; } 3
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
while (i < 3) { System.out.print(i + " "); i = i + 1; } 3
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
if (i < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
if (3 < 3) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3
Exempel för while
detta betyder att koden
mellan { … } inte körs
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
if (false) { System.out.print(i + " "); i = i + 1; while (i < 3) { System.out.print(i + " "); i = i + 1; } } 3
Exempel för while
typ: int
namn: i
Utskrift (output):
“0 1 2 ”
koden har kört klart
3
Exempel 2
vad händer om vi ändrar
koden så här?
int i = 0; while (i != 3) { System.out.print(i + " “); i = i + 2; }
och så här?
Exempel 2
int i = 0; while (i != 3) { System.out.print(i + " “); i = i + 2; }
Utskrift (output):
0 2 4 6 8 10 … 2000000 2000002 2000004 … osv
Att skriva egan loopar
Att se hur loopar kör är relativt lätt.
Att skriva egna loopar kräver mycket övning!
Utmaning:
Skriv ett program som räknar fakulteten av ett tal.
Matematik: 5! = 1 × 2 × 3 × 4 × 5 = 120
En lösning
public class Fac { public static void main(String[] args) { int k = 5; int result = 1; int i = 1; while (i <= k) { result = result * i; System.out.println("fac(" + i + ") = " + result); i = i+1; } } } En utmaning till
Utmaning:
Räkna greatest common divisor (GCD) av två heltal.
Matematik: gcd(45,35) = 5
En lösning
public class GCD { public static void main(String[] args) { int k = 45; int l = 35; while (k != l) { if (l < k) { k = k -­‐ l; } else { l = l -­‐ k; } System.out.println("k = " + k); System.out.println("l = " + l); } System.out.println("Result: " + k); } } Exempel 2
Loopar av denna stil är mycket vanliga:
deklaration och utgångsvärde
int i = 0; villkor för while
while (i < 3) { System.out.print(i + " "); beräkning som inte ändrar på i
i = i + 1; justering av variabeln i
}
Dessa loopar kan skrivas med for-satsen:
deklaration och utgångsvärde
villkor för while
justering av variabeln i
for (int i = 0; i < 3; i = i + 1) { System.out.print(i + " "); beräkning som inte ändrar på i
}
int i = 0; while (i < 3) { System.out.print(i + " "); i = i + 1; }
for (int i = 0; i < 3; i = i + 1) { System.out.print(i + " "); }
Tips! For av formen
for (<init>, <bool>, <chg>) { <stmts> }
är precis samma som
<init>; while (<bool>) { <stmts>; <chg> }
Loopar med känt antal varv = for
case 1: case 3: case 5: case 7: case 8:
case 10: case 12:
return 31; // return => no break needed
case 4: case 6: case 9: case 11:
return 30;
case 2:
if (leapYear(year)) {
return 29;
} else { return 28; } // dålig indenterin
default:
return -1;
} // end switch
} // end daysInMonth
F3
10
Syntax
for(<init>; <boolExpr>; <change>) {
for satsen: loopar med
känt antal varv
<statements>
Loopar med känt antal varv = for }
Syntax
Informell Semantik
for(<init>; <boolExpr>; <change>) {
1. “init” uttrycket beräknas (sker bara en
gång). Vanligen initialiserar man bara en
räknare till dess startvärde.
<statements>
}
Informell Semantik
2. boolExpr beräknas.
1. “init” uttrycket beräknas (sker bara en
Så länge det är sant kommer
Tips!
av formen
gång). For
Vanligen
initialiserar man bara en
3. loopens satser (statements) att beräknas.
räknare till dess startvärde.
for (<init>, <bool>, <chg>) { 4. uttrycket change beräknas. Vanligen ökar
2. boolExpr beräknas.
<stmts> man räknaren med ett. Gå till punkt 2.
Så
länge
det
är
sant
kommer
}
3. loopens satser (statements) att beräknas.• räknaren skall deklareras. Om det görs i
är precis samma som
4. uttrycket change beräknas. Vanligen ökarloopen så är den inte känd utanför loopen
<init>; man räknaren med ett. Gå till punkt 2.
• räknaren bör inte ändras i loopens satser
while (<bool>) { • räknaren skall deklareras. Om det görs i • init, boolExpr, change kan uteslutas
<stmts>; loopen så är den inte känd utanför loopen
• init och change kan vara flera komma <chg> • räknaren bör inte ändras i loopens satser
}• init, boolExpr, change kan uteslutas separerade satser
Inget av de två sista rekommenderas
• init och change kan vara flera kommaseparerade satser
F3
12
Exempel på for-satsen
for (int i = 0; i <= 8; i = i+1) { System.out.print(i + “ “); } // 0 1 2 3 4 5 6 7 8 (på en rad) använd endast den
här formen
for (char ch = 'a'; ch <= 'z'; ch++) { System.out.println(ch); } // a b c .... z med en per rad for(int tal=1; tal<=50; tal=2*tal){ System.out.println(tal); } // tal blir 1, 2, 4, 8, 16, 32 Ke
s
t
i
ep
!
e
l
p
m
i
Att skriva egan loopar
Utmaning:
Implementera fakultet exemplet med en for loop.
Matematik: 5! = 1 × 2 × 3 × 4 × 5 = 120
Tentamensuppgift
Uppgift!3:![5$poäng]$loopar,!utskrift!
$
Skriv$ett$program$som$skriver$ut$multiplikationstabellerna$upp$till$tio.$Exempel$utskrift:$
$
1!2!3!4!5!6!7!8!9!10!
2!4!6!8!10!12!14!16!18!20!
3!6!9!12!15!18!21!24!27!30!
4!8!12!16!20!24!28!32!36!40!
5!10!15!20!25!30!35!40!45!50!
6!12!18!24!30!36!42!48!54!60!
7!14!21!28!35!42!49!56!63!70!
8!16!24!32!40!48!56!64!72!80!
9!18!27!36!45!54!63!72!81!90!
10!20!30!40!50!60!70!80!90!100!
!
!
!
Uppgift!4:![9$poäng$totalt]$exceptions$
$ Extra: hur kan man få utskriften att se snyggare ut?
a) Förklara$begreppet$exceptions.$Hur$fungerar$exceptions$i$Java?$När$bör$man$använda$
exceptions?$När$bör$man$undvika$dem?$ $
$
$
$
$
[2$po
En lösning
public class Mult { public static void main(String[] args) { for (int i=1; i<=10; i++) { for (int j=1; j<=10; j++) { System.out.print((i*j) + " "); } System.out.println(); } } } Blocket utförs en eller flera gånger
*** Ovanligt att man vill göra det! ***
( Loopar med okänt antalLämpar
varv sig
= för inläsning från
Vanliga
fel vid konstr
en användare
( Loopar
med
okänt
antal
varv
Vanligaf
( Loopar
okänt
antal
varv
==
Vanliga
do-while
) med
loopar
Syntax
do-while
)
do-while
)
Blocket utförs en eller flera gånger
do-while loopar
do en
{ eller flera gånger
Blocket
utförs
Blocket utförs en eller flera gånger
De vanligaste felen är
*** Ovanligt att man
vill
göra
det!
***
<statements>
De
vanligastefe
De
vanligaste
***
Ovanligt
att
man
vill
göra
det!
***
*** Ovanligt att man vill göra det!”oändliga”
***
loopar och
“off-by-o
Lämpar sig för inläsning
från
en
användare
}
while
(<boolean
expression>);
”oändliga”
loo
Lämpar sig för inläsning från en användare
”oändliga” loopa
Lämpar sig för inläsning från en användare
Syntax
Informell Semantik
Syntax
Syntax
(pseudo-) oändlig(pseudo-)
loop:
oän
do {
1.
Satserna
(
statements
)
utförs
en
gång
(pseudo-) oänd
do {
int i = 0;
do {
int i = 0;
<statements>
int
i = 0;
<statements> 2. Loopvillkoret (boolean expr.) beräknas.
while
(i
<
10)
{
while (i <
<statements>
while (i < 1
} while (<boolean expression>);
} while (<boolean expression>);
satser
...
satser .
Om
det
är
sant
utförs
1-2
igen
} while (<boolean expression>);
satser
..
Informell Semantik Informell Semantik
i
=
i-1;
i = i-1;
dvsi-1;
Informell Semantik 3.Om villkoret är falskt görs ingenting
i
=
}
1. Satserna
(en
statements
) utförs en
gång
}
1.
Satserna
(
statements
)
utförs
gång
loopen
terminerar.
Tips! do-while av formen
}
1. Satserna (statements
) utförs
en gång
För
att komma
2. Loopvillkoret
(
boolean
expr
.)
beräknas.
För
att
komma
ur
en
oändlig
lo
2. Loopvillkoret (boolean
exprint
.) beräknas.
n
=
0;
För att komma
2. Loopvillkoret (boolean expr.) beräknas.
do { dvs
control-C,
Om
det
är
sant
utförs
1-2
igen
dvs
control-C,
håll
in
tangenten
do
{
Om det är sant utförs 1-2 igen
<stmts> dvspåcontrol-C,
h
Om3.Om
det är
sant
utförs
1-2
igen
C
villkoret
är falskt görs ingenting
dvs tal >5 “);
på
println(“Mata
in Cett
} while (<bool-­‐exp>);
3.Om villkoret är falskt görs
ingenting
dvs
på C
3.Om villkoret
ärnfalskt
görs
ingenting
dvs
loopen terminerar.
= in.nextInt();
loopen
terminerar.
är precis samma som int
loopen
n =terminerar.
0;} while ( n<=5 );
off-by-one: (f
int n = 0;
off-by-one: (fältoff-by-one:
kommer sena
do
{
int
n
=
0;
(fä
int[] pnr1t
<stmts>; //
gör
“jobbet”
här,
inte
i
loopen
do {
int[]
pnr1to9
= new
int[
println(“Mata
in
ett
tal
>5
“);
do
{
for
(int
i=
int[]
pnr1to
while (<bool-­‐exp>) { println(“Mata println(“Mata
in nett
tal >5in
“);
for
(int i=0;
i<=9;
i=i+
=
in.nextInt();
pnr1to9[
ett
tal
>5
“);
for
(int
i=0
F3
15
<stmts> n = in.nextInt();
pnr1to9[i] = pnr1to9[i
läs tal
( n<=5 );
n} =while
in.nextInt();
}
} while ( n<=5} );
// gör
“jobbet”
} // end lo
while
( n<=5
); här, inte i loopen
Scanner (används i nästa ex.)
Klassen java.util.Scanner förser oss med inmatningsprimitiver
så vi kan läsa “tokens" från tangentbordet:
(en token kan vara ett tal eller en sträng)
import java.util.Scanner; ... Scanner in = new Scanner(System.in); String str; while (in.hasNext()) { str = in.next(); System.out.println(str); } Metoder i Scanner: (ersätt X med t.ex. Int)
in.hasNextX() finns det ett X
in.hasNext() finns det någonting
in.nextX() ger nästa X
in.next() ger nästa token som sträng
in.nextLine() ger hela raden som en sträng
do-while exempel
int n = 0; do { println(“Mata in ett tal >5 ”); n = in.nextInt(); } while (n <= 5); precis samma som:
int n = 0; println(“Mata in ett tal >5 ”); n = in.nextInt(); while (n <= 5) { println(“Mata in ett tal >5 ”); n = in.nextInt(); } Vanliga fel vid konstruktion av loopar
De vanligaste felen är oändliga loopar och off-by-one fel.
(pseudo-)oändlig loop:
int i = 0; while (i < 10) { satser ... i = i-­‐1; } För att komma ur en oändlig
loop tryck: control-C
(dvs håll in tangenten ctrl
och tryck på C)
off-by-one: (arrays kommer senare)
int[] array = new int[9]; for (int i=0; i<=9; i=i+1) { array[i] = läs tal från användaren } försöker läsa index 9 som inte finns!
Kontrollstrukturer
När använder man vad?
Några generella tips:
Kontrollstrukturer
Kontrollstrukturer
D
Kontrollstrukturer
Kontrollstrukturer
När använder man vad?
De flesta
satserna
ärEa
De flesta
satsern
for:
Loopar med käntEtt
antal
varv byggs huvudsak
program
Ett program byggs hu
Några generella
tips:
deklarationer
”keep it simple” - det bör
vara
nåt i och
stil sa
m
Några generella tips:
deklarationer
Några generella tips:
Enkla
for (int Enkla
i=0,satser
i<10; i++) ....
Enkla satser
satser avslutas med(enkl
";")
använd annars(enkla
en while
for:
for:
(enkla satser avslutas me
for:
! Tilldelning
Loopar med känt antal varv
! Till
! Tilldelning
Loopar
med varv
känt antal varv
Loopar med
känt antal
! Metodanrop
(av void metod
”keep it simple” - det bör vara nåt i stil while
med
! med
Metodanrop
(av !
void
Me
”keep
it
simple”
det
bör
vara
nåt
i
stil
med
”keep
it
simple”
det
bör
vara
nåt
i
stil
! break
("Kortslutning" av loo
for (int i=0, i<10; i++) ....
Loopar med okänt!antal
varv("Kortslutning"
break
for
(int
i=0,
i<10;
i++)
....
! bre
(int i=0, i<10; i++) !....
använd annars for
en while
return <uttryck>
noll eller flera varv
använd annars en while
!(För
return
<uttryck>
att avsluta
underprog
använd annars en while
! ret
(För från
att avsluta
unde
resultat
funktioner)
while
resultat
från
funkt
!
;
(Gör
ingenting
!)
do-while
while
Loopar med okänt antal varv
;
(Gör ingenting !)
while
Loopar
okänt
noll
ellermed
flera
varv antal varv
Loopar med okänt!antal
varv
När
man
vad?
Näranvänder
använder
man
vad?
!;
Sammansatta satser
Loopar
med
okänt
antal
varv
noll eller flera varv
ett eller flera varv (ovanligt! - undvik)
(avslutas
INTE med ";"
utom do
Sammansatta
satser
do-while noll eller flera varv
! Villkorsats
(if)
(avslutas
INTE med ";"
ut
Loopar
med
okänt
antal
varv
Sam
do-while
ett
ellermed
fleraokänt
varv (ovanligt!
- undvik)
Loopar
antal varv
! Flervalsats
(switch)
! Villkorsats
(if)
for:
(enkla satser avslutas med ";")
Loopar med känt antal varv
! Tilldelning
De flesta satserna är avklarade
! Metodanrop
(av void metoder)
”keep it simple” - det bör vara nåt i stil med
break
("Kortslutning" av loop/switch sats)
for (int i=0, i<10;
i++) ....
De flesta
satserna är! avklarade
använd annars en while Ett program byggs huvudsakligen
! return <uttryck>
upp av
(För att avsluta underprogram eller ge
deklarationer och satser
resultat från funktioner)
while De flesta satserna är avklarade
Enkla
satser
!;
(Gör ingenting !)
Ett okänt
program
byggs
huvudsakligen upp av
Loopar med
antal
varv
deklarationer
och satser
(enkla satser
avslutas med ";")
noll eller flera varv
Sammansatta satser
Enkla satser ! Tilldelning
(avslutas INTE med ";" utom do-while )
(enkla satser avslutas med ";")
do-while
(av void metoder)
l med! Tilldelning ! Metodanrop
! Villkorsats (if)
Loopar med okänt antal varv
("Kortslutning" av loop/switch
sats)
.. ! Metodanrop ! break
(av void metoder)
!
Flervalsats
(switch)
ett eller flera varv (ovanligt! - undvik)
! break
("Kortslutning"
av loop/switch sats)
! Iterationssatser (for, while och do-while)
! return <uttryck>
! return <uttryck> (För att avsluta underprogram
! Blocksats
( {satser}
)
eller
ge
(För att avsluta underprogram eller ge
resultat från funktioner)
resultat från funktioner)
! ; F3 !)(Gör ingenting
!)
17
F3
!;
(Gör ingenting
Sammansatta Sammansatta
satser
18
satser
(avslutas INTE med ";" utom do-while )
(avslutas INTE med ";" utom do-while Kompilering
)
och länkning
! Villkorsats (if)
1. Från anteckningarna skapas en sk källtext med hjälp av ett
! Villkorsats (if)
! Flervalsats (switch)
editeringsprogram tex emacs. Källtexten utgör den för oss läsbara
beskrivningen av det vi vill att programmet skall göra. Program,
F3
F3
17
17
F3
F3
18
18
Kompilering och länkning
Kompilering
och länkning
Kompilering
och länkning
1. Från anteckningarna
skapas en skapas
sk källtext
hjälpmed
av ett
1. Från anteckningarna
en skmed
källtext
hjälp av ett
editeringsprogram
tex
emacs.
Källtexten
utgör
den
för
oss
läsbara
editeringsprogram tex emacs. Källtexten utgör den för oss läsbara
beskrivningen
av det vi vill
att programmet
skall göra.skall
Program,
beskrivningen
av det
vi vill att programmet
göra. Program,
programtext
och
källprogram
är
andra
benämningar
på
källtext.
programtext och källprogram är andra benämningar på källtext.
Vanligen slutar
källtextens
namn på något
avslöjar
språk
Vanligen
slutar källtextens
namn som
på något
somvilket
avslöjar
vilket språk
som använts,
tex
.ada,
.java,
.c
(C),
.p
(Pascal),
.asm
(assembler)
osv.
som använts, tex .ada, .java, .c (C), .p (Pascal), .asm (assembler)
osv.
2. Källtexten
kan vi ge som
indata
till indata
en kompilator.
En kompilator
2. Källtexten
kan vi
ge som
till en kompilator.
En kompilator
översätter,översätter,
den för ossden
begripliga
men
för
datorn
obegripliga,
texten
tilltexten t
för oss begripliga men för datorn obegripliga,
”maskinkod”
som datorn
”förstår”.
Detta kallas
alltså
kompilering.
I
”maskinkod”
som
datorn ”förstår”.
Detta
kallas
alltså kompilering.
I
Javas fall så
översätts
källtexten
till
en
mellanform,
ett
slags
Javas fall så översätts källtexten till en mellanform, ett slags
maskinspråk
för alla datorer,
kallassom
bytekod.
maskinspråk
för allasom
datorer,
kallas Kompilatorn
bytekod. Kompilatorn
analyseraranalyserar
också texten
och
kontrollerar
om
programmet
vi skrivit vi
är skrivit är
också texten och kontrollerar om programmet
ett språkligt
program.
det tex
förekommer
syntaxfelsyntaxfel
eller
ettkorrekt
språkligt
korrekt Om
program.
Om
det tex förekommer
eller
typfel i källtexten
så
meddelar
kompilatorn
detta
och
stannar.
typfel i källtexten så meddelar kompilatorn detta och stannar.
3. Som resultat
avresultat
kompileringen
får vi ett program
innehåller
de
3. Som
av kompileringen
får vi ett som
program
som innehåller
d
genereradegenererade
bytekodinstruktionerna.
Detta lagras
i enlagras
fil som
bytekodinstruktionerna.
Detta
i enheter
fil som heter
samma som
källtexten
men med men
appendix
“.class”. “.class”.
samma
som källtexten
med appendix
4. Varje dator
har sedan
en “bytekod
interpreter”
som som som
översätter
4. Varje
dator har
sedan en “bytekod
interpreter”
som översätter
till den aktuella
maskinkod.
Detta program
på
till dendatorns
aktuella
datorns maskinkod.
Detta är
program
är på
maskinkodsform
men alla referenser
är inte upplösta
maskinkodsform
men alla referenser
(adresser)(adresser)
är inte upplösta
(kända).
Detattinnebär
att vissa
andra programmoduler
(kända). Det
innebär
vissa andra
programmoduler
(som tex (som tex
inteännu
är kända
ännu de
eftersom
de kompilerats
java.lang) java.lang)
inte är kända
eftersom
kompilerats
separat. separat.
5. Nästa
kalla på som
länkaren
som bestämmer
var
5. Nästa steg
är att steg
kallaärpåattlänkaren
bestämmer
var
instruktionerna
liggaoch
i minnet
fyller
i alla referenser
instruktionerna
skall liggaskall
i minnet
fylleroch
i alla
referenser
mellan mellan
Om ihop
vi länkar
våra objektprogram
modulerna.modulerna.
Om vi länkar
våra ihop
objektprogram
och andraoch andra
får vi ett exekverbart
ett laddprogram.
referenser referenser
så får vi ettsåexekverbart
program, program,
ett laddprogram.
6. Ett laddprogram
i datorn
för att
köras. I de
6. Ett laddprogram
är färdigt är
attfärdigt
”ladda”attin”ladda”
i datorninför
att köras.
I detta
är alla referenser
program ärprogram
alla referenser
upplösta. upplösta.
7. När vi exekverar
programmet
får vi eventuellt
förseindata
det med indata
7. När vi exekverar
programmet
får vi eventuellt
förse det med
och får (eventuellt)
resultatVi
(utdata).
Vi kan exekvera
programmet
och får (eventuellt)
ett resultatett(utdata).
kan exekvera
programmet
att ge
på källtextfilen
utan appendix.
genom att genom
ge namnet
pånamnet
källtextfilen
utan appendix.
Dessa
faser
måste dessutom
gåsvarje
igenom
man
ändrar
Dessa faser
måste
dessutom
gås igenom
gångvarje
mangång
ändrar
något
i någo
källtexten källtexten
Kompilering, länkning och körning
Steg 1: Använd en editor för att skapa en källtextfil (source file):
I ett terminalfönster:
% emacs Pnrkontroll.java
som tillsvidare måste innehålla en main metod.
Steg 2: Kör Java kompilatorn (javac):
% javac Pnrkontroll.java
Skapar en fil som heter Pnrkontroll.class
Rätta alla fel... genom att göra om stegen ovan
Steg 3: Kör programmet (med java):
% java Pnrkontroll
OBS, utan .java eller .class på slutet
Ifall programmet fastnar
i en oändlig loop: håll ner
“ctrl” och C-knappen.
Indentering och att placera '{ }'
Rätt indenterat:
Fel indenterat:
static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd Undvik onödigt tomrum inuti metoder.
Indentering = läsbarhet + korrekthetskoll
Indentering och att placera '{ }'
Rätt indenterat:
Fel indenterat:
static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd static boolean odd(int tal) { if (tal%2 == 0) { return false; } else { return true; } } // end odd Rätt och förenklat:
Fel indenterat! (oläsbart)
static boolean odd(int tal) { return (tal%2 != 0) } // end odd static boolean odd(int tal) { if ( tal%2 == 0) { return false; } else { return true; } }
Aritmetik med heltal (dvs int)
int x = 5; int y = 3; x = x / 3; Anta att minnet är:
variabeler, dvs
minnesplatser
Aritmetik med heltal (dvs int)
int x = 5; int y = 3; x = x / 3; Anta att minnet är:
variabeler, dvs
minnesplatser
Aritmetik med heltal (dvs int)
Anta att minnet är:
int y = 3; x = x / 3; variabeler, dvs
minnesplatser
typ: int
namn: x
5
Aritmetik med heltal (dvs int)
Anta att minnet är:
int y = 3; x = x / 3; variabeler, dvs
minnesplatser
typ: int
namn: x
5
Aritmetik med heltal (dvs int)
Anta att minnet är:
x = x / 3; variabeler, dvs
minnesplatser
typ: int
namn: x
typ: int
namn: y
5
3
Aritmetik med heltal (dvs int)
Anta att minnet är:
x = x / 3; variabeler, dvs
minnesplatser
typ: int
namn: x
typ: int
namn: y
5
3
Aritmetik med heltal (dvs int)
Anta att minnet är:
x = 5 / 3; heltals division, dvs
resultatet måste vara
av typen int
variabeler, dvs
minnesplatser
typ: int
namn: x
typ: int
namn: y
5
3
Aritmetik med heltal (dvs int)
Anta att minnet är:
x = 1; heltals division, dvs
resultatet måste vara
av typen int
variabeler, dvs
minnesplatser
typ: int
namn: x
typ: int
namn: y
5
3
Aritmetik med heltal (dvs int)
Anta att minnet är:
variabeler, dvs
minnesplatser
koden har kört klart
typ: int
namn: x
typ: int
namn: y
1
3
Programmeringsövning
Övning:
Skriv kod som implementerar heltals division.
Exempel: 7 / 2 = 3
En lösning
public class IntDiv { public static void main(String[] args) { int m = 7; int n = 2; int res = 0; System.out.print(m + " / " + n + " = "); while (n <= m) { m = m -­‐ n; res = res + 1; } System.out.println(n + " * " + res + " + " + m); } } Programmeringsövning 2
Sekanten:
Skriv kod som löser en enkel version av sekant labben
från förra året (kommer inte i år.)
http://www.cse.chalmers.se/edu/year/2013/course/tda545/courseMtrl/assignments/lab3/secant.html
Början på en lösning
public class Secant { public static double f(double x) { return 0.5 * x * x -­‐ 5.0 * x + 2.0; } public static void main(String[] args) { double a = -­‐5.0; double b = 5.0; double eps = 0.0001; double x; // Skriv kod här som hittar nollstället på funktionen f. // Lösningen kan vara en while eller do-­‐while loop. System.out.println("Result: " + x); } } Läsanvisning
Jag pekar nedan på var i boken de olika sakerna tas upp. Boken tar dock upp
dessa saker ganska sent i sammanhang med andra saker som ni inte ännu
behärskar. Det kan därför vara rätt svårt att läsa dessa hänvisningar nu.
‣
‣
‣
‣
‣
‣
‣
‣
datatypen Boolean 4.2, 4.6
relationsuttryck och logiska uttryck (.)
De Morgan's lag (s 217)
operatorer (utspritt)
if (4.1), switch(4.8)
for (12.7,12.6),
while (7.3.1, 12.6), do-while (7.5)
kompilering och länkning
Nästa gång: att använda färdiga klasser kap 2.
Glöm inte att programmera, programmera, programmera!