Programmering Lite om reella tal I java Om operatorers associativitet

Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Lite om reella tal
Programmering
Vad kan man g¨
ora med reella tal?
Ut¨
over de vanliga aritmetiska operationerna, finns det ett antal
funktioner i en bibliotek-klass som heter Math.
hh.se/DB2004
F¨
orel¨asning 4:
F¨alt samt Input/Output
Avst˚
andet till origo
Givna tv˚
a reella tal som st˚
ar f¨
or
(x, y ) - koordinater av en punkt
r¨akna ut avst˚
andet till origo.
Ver´
onica Gaspes
www2.hh.se/staff/vero
www2.hh.se/staff/vero/programmering
Pytagoras sats s¨ager:
x2 + y2 = d2
allts˚
a ¨ar
Center for Research on Embedded Systems
IDE-sektionen
Lite om reela tal
F¨
alt
1 / 30
Inf¨
or n¨
asta vecka
I java
p
x2 + y2
Lite om reela tal
2 / 30
F¨
alt
Inf¨
or n¨
asta vecka
Om operatorers associativitet och prioritet
Avst˚
and till origo
public class Distance{
public static void main(String[] cmdLn){
double x = Double.parseDouble(cmdLn[0]);
double y = Double.parseDouble(cmdLn[1]);
System.out.println(Math.sqrt(x*x+y*y));
}
Uttryck
Man anv¨ander variabler, literaler, operatorer och funktionsanrop
f¨
or att bilda uttryck. Uttrycket st˚
ar f¨or ett v¨arde som ber¨aknas
utifr˚
an variablernas inneh˚
all, literalers v¨arde och vad operatorer
och funktioner betyder. Men ¨aven i vilken ordning man r¨aknar ut
delar av uttrycket!
}
Utdrag fr˚
an Math
Math.PI
Math.E
Math.sin(Math.PI/2))
Math.cos(Math.PI))
Math.log(Math.E))
d=
3.141592653589793
2.718281828459045
1.0
-1.0
1.0
N˚
agra uttryck och dess v¨arde
Skall 3+4*5 r¨aknas som 7+5 eller som 3+20?
Java anv¨ander samma prioritet f¨or operatorer som ni anv¨ander i
matte: f¨
orst r¨aknar man * och / och sedan + och -.
D˚
a blir det i v˚
art fall 3+20 allts˚
a 23.
3 / 30
4 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Om operatorers associativitet och prioritet
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
F¨alt
Jag kommer troligen att uttala
detta arrayer
Att lagra och hantera stora
m¨angder data.
F¨alt
En indicerad f¨oljd av v¨arden av
samma typ.
N˚
agra uttryck och dess v¨arde
Skall 5-3+7 r¨aknas som 2+7 eller som 5-10?
Java anv¨ander samma associativitet som ni anv¨ander i matte: man
r¨aknar fr˚
an v¨anster (v¨anster associativitet).
D˚
a blir det i v˚
art fall 2+7 allts˚
a 9.
Exempel
52 kort i en kortlek.
1 miljon tecken i en bok.
10 miljoner ljudelement i en
MP3-fil.
73 miljarder Google-fr˚
agor
per ˚
ar.
6 / 30
5 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Flera variabler av samma typ
10 variabler av samma typ
double a0, a1, a2, a3,
a4, a5, a6, a7, a8, a9;
a0 = 0.0;
a1 = 0.0;
a2 = 0.0;
a3 = 0.0;
a4 = 0.0;
a5 = 0.0;
a6 = 0.0;
a7 = 0.0;
a8 = 0.0;
a9 = 0.0;
a4 = 3;
double x = a4 + a8;
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Flera variabler av samma typ
10 variabler av samma typ
double[] a = new double[10];
for(int i = 0; i<10; i++){
a[i] = 0.0;
}
a[4] = 3;
double x = a[4] + a[8];
Trist och felben¨aget!
Skalar inte s˚
a l¨att till
stora antal!
7 / 30
Observera deklarationen!
Detaljer kommer strax!
Skalar upp!
8 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Flera variabler av samma typ
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Javas st¨od f¨or f¨alt
1000000 variabler av samma typ
double[] a = new double[1000000];
for(int i = 0; i<1000000; i++){
a[i] = 0.0;
}
a[4] = 3;
double x = a[1234] + a[987654];
Observera deklarationen!
Detaljer kommer strax!
Skalar upp!
Att skapa ett f¨alt
a = new double[10];
eller
sentence = new String[100];
Allts˚
a skapar man ett f¨alt av en
viss storlek
var = new type[size];
F¨altdeklaration
double[] a;
eller
String[] sentence;
Allts˚
a kan man deklarera f¨alt med
element av godtycklig typ
type[] var;
new ¨ar ytterligare ett reserverat ord i Java, s˚
a som class, public,
for, while, if och else.
F¨alttyper, p˚
a samma s¨att som String, ¨ar en referenstyp.
9 / 30
Lite om reela tal
F¨
alt
Javas st¨od f¨or f¨alt
Att initiera ett f¨alt
for(int i = 0; i<10; i++){
a[i] = 0.0;
}
eller
for(int i = 0; i<100; i++){
sentence[i] = "";
}
Allts˚
a
for(int i = 0; i<size; i++){
var[i] = v¨
ardeAvR¨
attTyp;
}
10 / 30
Inf¨
or n¨
asta vecka
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden
Summor
Vi betraktar igen problemet med att ber¨akna
n
X
F¨
or att tillverka ett f¨alt skall
man deklarera det, skapa det
och initiera det!
i
i=1
Men nu vill vi veta alla v¨arden p˚
a denna summan f¨or olika v¨arden
av n.
F¨
or att komma ˚
at enskilda
element i ett f¨alt anv¨and
var[index].
Alla dessa ¨ar variabler!
1
X
Indicering b¨
orjar med 0.
3
X
i=1
2
X
4
X
i=1
11 / 30
i =1
i=1
i =3
i=1
i =6
5
X
i = 15
i=1
i = 10
6
X
i=1
i = 21
12 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden
Om man beh¨
over anv¨anda
n
X
Lite om reela tal
F¨
alt
Summor
public class Sums{
public static void main(String[] cmdLn){
int size = Integer.parseInt(cmdLn[0]);
int[] sums = new int[size + 1];
int sum;
sums[0]=0;
for(int n = 1; n < size + 1; n++){
sum = 0;
for(int i = 1; i <= n; i++){
sum=sum+i;
}
sums[n]=sum;
}
}
i
i=1
f¨
or olika v¨arden av n kan man ber¨akna dem en g˚
ang, lagra v¨arden i
ett f¨alt d¨ar man anv¨ander n som index och sedan ¨ar det bara att
kolla vad som finns i f¨altet p˚
a plats n.
13 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden
14 / 30
Inf¨
or n¨
asta vecka
Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Kodfragment
Ett f¨alt med slumptal
double[] a = new double[size];
for(int i = 0; i<size; i++){
a[i] = Math.random();
}
P
Om man beh¨
over anv¨anda ni=1 i f¨
or olika v¨arden av n kan man
ber¨akna dem en g˚
ang och sedan ¨ar det bara att kolla vad som
finns i f¨altet sums[n].
Skriv ut alla element
for(int i = 0; i<size; i++){
System.out.println(a[i]);
}
15 / 30
Medelv¨ardet
double sum = 0.0;
for(int i = 0; i<size; i++){
sum = sum + a[i];
}
double average = sum/size;
16 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Kodfragment
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Kort i en kortlek
Vi kan anv¨anda tv˚
a f¨alt f¨
or att modellera kort i en kortlek:
String[] rank = {"2","3","4","5","6","7","8","9","10",
"Jack","Queen","King","Ace"};
Kopiera ett f¨alt till ett annat
double []b = new double[size];
for(int i = 0; i<size; i++){
b[i] = a[i];
}
String[] suit = {"Clubs","Diamonds","Hearts","Spades"};
Observera initieringen, den sker under kompilering!
Ett slumpm¨assigt kort
int i = (int) (Math.random() * 13);
int j = (int) (Math.random() * 4);
System.out.println(rank[i]+" of "+suit[j]);
18 / 30
17 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Kortlek
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Eratosthenes s˚
all
En kortlek ¨ar ett f¨alt med kort
Vi kan t¨anka oss att anv¨anda str¨angar f¨
or att modellera kort:
Att st¨
odja ber¨akningar
Man kan anv¨anda f¨alt f¨
or att skriva
program som kan r¨akna fortare ¨an annars.
"2 of Clubs" "4 of Diamonds"
d˚
a ¨ar en kortlek ett f¨alt av str¨angar:
String[] deck = new String[52];
En metod f¨
or att hitta primtal
2 3 4 5 6 7 8 9 10 11 12
2 3 - 5 - 7 - 9 - 11 2 3 - 5 - 7 - 9 - 11 2 3 - 5 - 7 - - - 11 2 3 - 5 - 7 - - - 11 2 3 - 5 - 7 - - - 11 -
Hur initierar vi det? Hur l¨agger vi ut korten i arrayen?
for(int i = 0; i<13; i++){
for(int j = 0; j<4; j++){
deck[4*i+j]=rank[i] + " of " + suit[j];
}
}
19 / 30
13
13
13
13
13
13
14
-
15
15
15
-
16
-
17
17
17
17
17
17
18
-
19
19
19
19
19
19
20
-
21
21
21
-
20 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Eratosthenes s˚
all
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Eratosthenes s˚
all - kodfragment
Man kan anv¨anda ett f¨alt f¨
or att markera vilka som ¨ar primtal:
f¨altets indices ¨ar heltalen och f¨altets element ¨ar boolska v¨arden!
Startv¨arden
boolean[] isPrime = new boolean[bound+1];
isPrime[0] = false;
isPrime[1] = false;
for(int i = 2; i<bound+1; i++){
isPrime[i] = true;
}
Man kan kalla f¨altet f¨
or isPrime. Tanken ¨ar att n¨ar s˚
allningen ¨ar
klar s˚
a skall isPrime[i] vara sann bara om i ¨ar ett primtal.
21 / 30
Lite om reela tal
F¨
alt
22 / 30
Inf¨
or n¨
asta vecka
Eratosthenes s˚
all - kodfragment
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Inf¨or n¨asta vecka
Programmet och datorn (Nu)
S˚
allet
for(int i = 2;i<=bound/i;i++){
if(isPrime[i]){
for(int k = i; k<=bound/i; k++){
isPrime[i*k] = false;
}
}
}
Vi kan generera massvis med
utdata!
23 / 30
Programmet och datorn
Vi vill ¨aven anv¨anda massvis med
indata och anv¨anda andra
m¨ojligheter hos datorn.
24 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Kommandoraden
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Standard output
Sammanfattning
Alla klasser har en metod main() som tar ett f¨alt av str¨angar
som argument.
Sammanfattning
F¨
or att skriva ut v¨arden fr˚
an Java-program anv¨ander vi
System.out.println() och System.out.print().
F¨altet best˚
ar av de kommandoradsargument vi skriver. Dessa
f¨
ormedlas till Java av operativsystemet.
Java skickar dessa v¨arden till en str¨om av tecken k¨and som
standard output.
Det ¨ar en konvention att b˚
ade OS och Java hanterar dessa
argument som str¨angar.
Operativsystemet brukar koppla standard output till terminalen.
Om vi vill betrakta ett argument som ett tal m˚
aste vi anv¨anda
metoder som Integer.parseInt() f¨
or att
konvertera argumentet.
I Unix kan vi dirigera om standard output till en fil med >.
25 / 30
Lite om reela tal
F¨
alt
Ett exempel
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Flera m¨ojligheter
Experiment med t¨arningkast
public class Dice{
public static void main(String[] cmdLn){
int sampleSize = Integer.parseInt(cmdLn[0]);
int dice;
for(int i = 0;i<sampleSize; i++){
dice = (int)(Math.random()*6)+1;
System.out.print(dice+" ");
}
}
}
Sm˚
a experiment
% java Dice 10
6 2 3 4 2 4 5 6 3 4
26 / 30
Inf¨
or n¨
asta vecka
Standard input kommer att l˚
ata
oss skriva program som
interagerar med anv¨andaren
genom tangentbordet. Man kan
¨aven dirigera om standard input
s˚
a att programmet l¨aser in fr˚
an en
fil. Program kan d˚
a hantera
st¨orre m¨angder data.
Stora experiment
% java Dice 10000 > dice10000
27 / 30
28 / 30
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Flera m¨ojligheter
Lite om reela tal
F¨
alt
Inf¨
or n¨
asta vecka
Flera m¨ojligheter
Standard audio kan anv¨andas f¨
or
att spela upp och manipulera
ljudfiler. Vi kommer att kunna
spela .wav-filer, kunna skriva
program som hanterar f¨alt av
double samt l¨asa och skriva dem i
.wav-filer.
29 / 30
Standard draw kan anv¨andas f¨or
att presentera utdata i grafisk
form och ¨aven f¨or enkla
animeringar.
30 / 30