OHJELMOINTITEKNIIKKA
OHJELMOINTITEKNIIKKA
OHJELMOINTITEKNIIKKA
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>OHJELMOINTITEKNIIKKA</strong><br />
1
Kurssin suoritus<br />
• Kurssin kahdesta tentistä saa kummastakin enintään 10<br />
pistettä ja harjoituksista enintään 10 pistettä eli kurssin<br />
maksimipistemäärä on 30. Arvosana määräytyy oheisen<br />
taulukon mukaan.<br />
• Harjoituksen jokaisesta kolmesta tehdystä tehtävästä saa<br />
1 pisteen (hyvä yritys riittää).<br />
• Opiskelija lähettää harjoitusohjelmansa sähköpostin<br />
liitteenä osoitteeseen mika.saari@tut.fi.<br />
• Tenttiohjelman arviointikriteerit ovat: kääntyy(2), tekee<br />
annetun tehtävän(3), ratkaisulogiikka(3), luettavuus(2).<br />
• Harjoitus- ja tenttipisteet huomioidaan kevään 2014<br />
uusintatenteissä.<br />
• Uusintatenttejä on kaksi ja ne kattavat kurssin koko<br />
aihealueen.<br />
• Yhdellä uusintatentillä voi korvata yhden tenttisuorituksen.<br />
• Luentomateriaali, harjoitustehtävät, luennolla laaditut<br />
ohjelmat ja harjoitusten mallivastaukset löytyvät verkkoosoitteesta<br />
www.pori.tut.fi/~miksa/java.<br />
PISTEET ARVOSANA<br />
27 5<br />
24 4<br />
21 3<br />
18 2<br />
15 1<br />
Java-kirjoja<br />
• Mika Vesterholm, Jorma Kyppö:<br />
Java-ohjelmointi,<br />
Talentum 2008, ISBN 978-952-14-1356-8<br />
(7.uudistettu painos)<br />
• Simo Silander, Vesa Ollikanen, Juha Peltomäki:<br />
Java,<br />
WSOY 2010, ISBN 978-951-846-237-2<br />
• Jukka Harju, Jukka Juslin:<br />
Java-ohjelmointi – opas ammattimaiseen<br />
osaamiseen,<br />
Readme.fi 2009, ISBN 978-952-220-084-6<br />
4
Java-ohjelmointikielen yleisyys<br />
TIOBE Programming Community Index (ohjelmoijia, kursseja, toimijoita)<br />
5
Ohjelmointikielten käytön kehitys<br />
6
OHJELMANKEHITYS<br />
JAVA-YMPÄRISTÖSSÄ<br />
7
Ohjelman suoritus tietokoneessa<br />
prosessori keskusmuisti levymuisti<br />
käskykanta<br />
compile<br />
execute<br />
Editori<br />
Ohjelma<br />
Kääntäjä/Tulkki<br />
open<br />
save<br />
Tiedot<br />
Ohjelma<br />
tiedostot<br />
8
Java-kielen tulkitseminen<br />
”AJAMINEN”<br />
SYÖTTÖTIEDOT<br />
ohjelma.java<br />
ohjelma.class<br />
OMA OHJELMA<br />
LAUSEKIELELLÄ<br />
KÄÄNTÄJÄ<br />
KONEKIELELLÄ<br />
OMA OHJELMA<br />
VÄLIKIELELLÄ<br />
(tavukoodi)<br />
TULKKI<br />
JVM:ssä<br />
(JRE)<br />
Editori<br />
JDK<br />
JAVAN<br />
KIRJASTOT<br />
TULOSTIEDOT<br />
11
Työvälineiden asennus<br />
• Java SE 7 (JDK, JRE)<br />
– dokumentaatio<br />
• Eclipse Kepler<br />
• NetBeans 7.3<br />
• JCreator<br />
• jGrasp<br />
• JBuilder<br />
• Linkit kurssin sivuilla<br />
• Käyttöopetus harjoituksissa<br />
12
Editori ja dokumentaatio<br />
Projekti, lähdekielihakemistot , package, luokka,…<br />
13
ALGORITMINEN AJATTELU<br />
14
Ongelman hahmottaminen ohjelmaksi<br />
PALVELU<br />
Input → Output<br />
TIEDOT<br />
Muuttujat<br />
TOIMINTA<br />
Prosessi<br />
4 8<br />
LUKU1<br />
LUKU2 … LUVUT<br />
…<br />
KESKIARVO<br />
Tiedot toiminnan kuvauksesta<br />
1. Lisää summaan annetut luvut<br />
2. Jaa summa lukujen määrällä<br />
Puoliohjelma<br />
Peräkkäin<br />
Toisto<br />
Valinta<br />
6<br />
VASTAUS<br />
VASTAUS<br />
Hahmottamisprosessi ongelmasta ratkaisuun:<br />
toiminnan ymmärtäminen + algoritmin keksiminen + tekniikan osaaminen + ohjelmointitekniikkaa<br />
15
Keskiarvo-vuokaavio<br />
KESKIARVO<br />
LUE<br />
LUKU<br />
LUKU >= 0<br />
E<br />
K<br />
VASTAUS=<br />
VASTAUS+LUKU<br />
N=N+1<br />
VASTAUS=<br />
VASTAUS / N<br />
TULOSTA<br />
VASTAUS<br />
LOPPU<br />
16
Keskiarvo-puoliohjelma<br />
VASTAUS = 0, N = 0, LUKU<br />
PERÄKKÄISYYS<br />
LUVUT<br />
L:<br />
LUE LUKU<br />
JOS LUKU < 0 MENE LOPPU<br />
VALINTA<br />
Peräkkäin<br />
Valinta<br />
Toisto<br />
VASTAUS = VASTAUS + LUKU<br />
N = N + 1<br />
MENE L<br />
TOISTO<br />
VASTAUS<br />
LOPPU:<br />
VASTAUS=VASTAUS / N<br />
TULOSTA VASTAUS<br />
17
Java-ohjelman rakenne<br />
L:<br />
PUOLIOHJELMA<br />
VASTAUS = 0, N = 0, LUKU<br />
LUE LUKU<br />
JOS LUKU < 0 MENE LOPPU<br />
JAVA-OHJELMA<br />
public class Keskiarvo {<br />
public static void main(String[] args) {<br />
double vastaus=0, luku;<br />
int n=0;<br />
VASTAUS = VASTAUS + LUKU<br />
N = N + 1<br />
MENE L<br />
LOPPU:<br />
VASTAUS=VASTAUS / N<br />
TULOSTA VASTAUS<br />
}<br />
}<br />
luku = Lue.desi( );<br />
while (luku != 0) {<br />
vastaus = vastaus + luku; vastaus += luku;<br />
n = n + 1;<br />
n++;<br />
luku = Lue.desi( );<br />
}<br />
vastaus = vastaus / n;<br />
vastaus /= n;<br />
System.out.println(”Keskiarvo on ”+vastaus);<br />
18
Ohjelman laatimisen vaiheet<br />
• Editori kuntoon<br />
– Perspektiivit, workspacet, working setit,…<br />
– Projektit<br />
– Lähdekoodikansiot (java)<br />
– Tuloskoodikansio (class)<br />
• Koodin kirjoitus editorilla<br />
• Kääntäminen<br />
• Virheen jäljitys<br />
– Välitulosteet<br />
– Debuggaus<br />
• Testaus<br />
• Integrointi järjestelmään<br />
• Käyttöönotto<br />
19
Luentoharjoitus 1<br />
Minkälaisia asioita teet päivittäin<br />
a) peräkkäin<br />
b) toistuvasti<br />
c) valitsemalla<br />
Eroaako ihminen tietokoneesta ?<br />
20
Luentoharjoitus 2<br />
Tehdään ohjelma, joka antaa käyttäjän<br />
pelata sudokua. Minkälaisia tehtäviä ja<br />
missä järjestyksessä ne suoritetaan.<br />
21
Luentoharjoitus 3<br />
Muuttuja SALDO = 10 000 euroa.<br />
Muuttuja KORKO = 4 %.<br />
Muuttuja VUODET = 5 vuotta.<br />
Laadi (puoli)ohjelma, joka kertoo, kuinka paljon<br />
rahaa tilillä on VUODET-muuttujan osoittaman<br />
vuosimäärän kuluttua.<br />
KorkoWhile.java<br />
22
Luentoharjoitus 4<br />
Laadi radioaktiivisen aineen puoliintumisen<br />
laskeva (puoli)ohjelma siten, että ohjelma<br />
ilmoittaa, milloin radioaktiivisuuden taso on<br />
laskenut alle annetun arvon.<br />
Mitä muuttujia ohjelmassa tarvitaan?<br />
Puoliintumisaika.java<br />
23
JAVAN KIRJOITUSTYYLI<br />
TIETOTYYPIT<br />
OPERAATIOT<br />
http://www.oracle.com/technetwork/java/codeconv-138413.html<br />
24
Tekstin jako riveille<br />
Sisennykset<br />
Välilyönnit<br />
Sijoittelu<br />
while (paaoma > 0) {<br />
velkaMarkat = paaoma - lyhennys;<br />
if (velkaMarkat
Kommentit<br />
/* Usearivisiä<br />
kommentteja voi<br />
rajata näin<br />
*/<br />
// Loppurivi tulkitaan kommentiksi<br />
lyhennys=paaoma; // Tässä kommentoin yhtä riviä<br />
/** Javadoc-ohjelma näyttää tämän dokumentoinnissa */<br />
26
Kommentit<br />
/*******************************************************************************<br />
• Kuvaus: Ohjelma laskee annetun luvun kertoman (tehtävä 22)<br />
• Tekijä: Markku Nevanranta 10.8.2012 (opiskelijanumero)<br />
• Muutettu: 9.8.2013 mn Syttötietojen tarkistus lisätty<br />
• Julkiset metodit:<br />
• public void lueLuku() kysyy luvun<br />
• public int tulostaLuku() tulostaa kertoman<br />
• *****************************************************************************/<br />
27
Tunnukset<br />
• Tunnukseksi kutsutaan nimeä, jonka ohjelmoija antaa jollekin nimettävälle<br />
asialle: muuttujalle, metodille, vakiolle, luokalle,…<br />
• Tunnusten nimet ovat pituudeltaan rajoittamattomia<br />
– merkkejä, numeroita<br />
– Unicode: å, ä, ö<br />
– pienet ja isot kirjaimet ovat eri merkkejä (palkka, Palkka)<br />
– luokkien nimissä ei å, ä, ö merkkejä<br />
• Muuttujien nimet on hyvä alkaa pienellä kirjaimella<br />
• Monisanaiset muuttujien toinen, kolmas jne. sanat alkavat isoilla kirjaimilla<br />
• Silmukkalaskureina käytetään lyhyitä (yksikirjaimisia) muuttujanimiä<br />
• Luokkien nimet alkavat isolla kirjaimella<br />
• Vakiot kirjoitetaan kokonaan isolla<br />
28
Tunnukset<br />
int laskuri, kuukaudenNumero, palkkaVero;<br />
for (int i=0; i
Biteistä tiedoksi<br />
OHJELMA<br />
TIEDOT<br />
luku=arvo+2<br />
ASIAKAS<br />
string etunimi<br />
string sukunimi<br />
int luku<br />
string osoite<br />
Kalle Kehveli<br />
45<br />
Kotikuja 5<br />
ADD R1,123<br />
KalleKehveli45Kotikuja 5<br />
tulkinta/koodaus?<br />
1001100100100111<br />
1001100100100111<br />
30
Muuttujan rakenne<br />
• Yksi kenttä: muuttuja = arvo<br />
• Rakenne eli monta kenttää: muuttuja = osoite<br />
• Esimerkiksi:<br />
– Asetus summa = palkka; henkilö = asiakas;<br />
– Vertailu summa == palkka; henkilö == asiakas;<br />
KESKUSMUISTI<br />
OHJELMA<br />
palkka<br />
Asiakas<br />
• nimi<br />
• kunta<br />
• saldo<br />
9500<br />
KALLE VIRTANEN<br />
PORI<br />
10000<br />
kuukaudet[ ]<br />
31 28 31 30 31 30 31 31 30 31 30 31<br />
31
Perustietotyypit<br />
TYYPPI BITTEJÄ ARVOALUE<br />
byte 8 -128 – 127<br />
short 16 -32768 - 32767<br />
int 32 -2147483648 - 2147483647<br />
long 64<br />
-9223372036854775808 –<br />
9223372036854775807<br />
float 32 1.4*10 -45 – 3.4*10 38 (7 tarkkuus)<br />
double 64 4.9*10 -324 – 1.8*10 308 (15 tarkkuus)<br />
char 16 ’a’ ’\n’ ’\\’ numero (Unicode koodi)<br />
boolean<br />
enum<br />
true, false<br />
{arvoluettelo}<br />
32
Tyyppimuunnokset<br />
AUTOMAATTINEN<br />
MUUNNOS<br />
int a;<br />
long b;<br />
b = a;<br />
byte 8<br />
short 16<br />
char 16<br />
int 32<br />
float 32<br />
long 64<br />
double 64<br />
OHJELMOIJAN<br />
TEKEMÄ<br />
TYYPPIMUUNNOS<br />
int a;<br />
long b;<br />
a = (int) b;<br />
Järkevissä tapauksissa<br />
tehdään järkeviä katkaisuja.<br />
Järjettömissä tapauksissa<br />
vastuu on ohjelmoijalla.<br />
33
Luentoharjoitus 5<br />
Mitkä tietotyypit ovat sopivia seuraaville tiedoille?<br />
• Nimi<br />
• Palkka<br />
• Ikä<br />
• Syntymäaika<br />
• Puhelinnumero<br />
• Tieto luottokelpoisuudesta<br />
34
Perusoperaatiot<br />
(presedenssi ja assosiatiivisuus)<br />
[ ] . ( ) e++ e--<br />
++e --e +e -e ! ~<br />
new (tyyppi)e<br />
* / %<br />
+ -<br />
> >>><br />
< > >= > säilyttää etumerkin<br />
>> lisää nollan<br />
&<br />
^<br />
|<br />
&&<br />
||<br />
?:<br />
= += -= *= /= %= = >>>= &= ^= |=<br />
35
Esimerkki (operaatioita)<br />
/*Keskiarvon laskentaohjelma<br />
Markku Nevanranta<br />
31.8.2009 */<br />
public class Keskiarvo {<br />
public static void main(String[] args) {<br />
double vastaus=0, n=0, luku;<br />
}<br />
}<br />
luku = Lue.desi( );<br />
while (luku != 0) {<br />
vastaus += luku; //kerätään summaa<br />
n++;<br />
//lasketaan lukujen määrä<br />
luku = Lue.desi( );<br />
}<br />
vastaus /= n;<br />
System.out.println(”Keskiarvo on ”+vastaus);<br />
36
Esimerkki (bittioperaatiot)<br />
public class Maski {<br />
public static void main(String[] args) {<br />
final int LUKU = 1; //001<br />
final int KIRJOITUS = 2; //010<br />
final int SUORITUS = 4; //100<br />
int liput = 0;<br />
liput |= LUKU; //liput = 001<br />
liput |= KIRJOITUS; //liput = 011<br />
}<br />
}<br />
if ((liput & KIRJOITUS) == KIRJOITUS)<br />
System.out.println(”On oikeus kirjoittaa”);<br />
38
Lukeminen (Lue)<br />
Lukeminen voidaan tehdä monella tasolla:<br />
1. Lue-luokkaa käyttäen<br />
• Rakennetaan itse omaan tarpeeseen sopiva<br />
luokka<br />
luku = Lue.koko(”Anna luku: ”);<br />
Lue.koko()<br />
Lue.desi()<br />
Lue.rivi()<br />
Lue.merkki()<br />
Lue.totuus()<br />
lukee kokonaisluvun<br />
lukee desimaaliluvun<br />
lukee rivin tekstiä<br />
lukee yhden merkin<br />
lukee totuusarvon<br />
KorkoWhile.java<br />
40
Lukeminen (Scanner)<br />
2. Scanner-luokkaa käyttäen<br />
• Käsittelee tietovirrasta tulevaa merkkijonoa<br />
import java.util.Scanner;<br />
Scanner lukija = new Scanner(System.in);<br />
System.out.println(”Anna luku: ”);<br />
luku = lukija.nextInt();<br />
KorkoScanner.java<br />
41
Lukeminen (tietovirta)<br />
3. Tietovirtoja käyttäen<br />
static BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));<br />
public static int kluku(){<br />
int arvo=-1;<br />
boolean ok;<br />
do {<br />
try {<br />
arvo=Integer.parseInt(stdin.readLine());<br />
ok=true;<br />
} catch (Exception e) {<br />
System.out.println("Kelvoton kokonaisluku. Anna uusi!");<br />
ok=false;<br />
}<br />
} while (!ok);<br />
return arvo;<br />
}<br />
42
Tulostus<br />
System-luokan out-tietovirtaluokan metodeita*<br />
Muotoilematon<br />
• System.out.println (”tulostuva teksti ja rivinvaihto”);<br />
• System.out.print (”teksti ilman rivinvaihtoa”);<br />
• System.out.println (”hinta on ”+maksu+” euroa”);<br />
• System.out.println (”hinta on ”+(maksu+1.5*vero)+” euroa”);<br />
Muotoiltu<br />
• System.out.printf(”vakioteksti ja mutoilut”,muuttujaluettelo);<br />
• System.out.printf(”hinta on %d euroa”, maksu);<br />
• System.out.printf(”hinta on %5d euroa”, maksu);<br />
System.out.printf(”hinta on %.2f euroa”, maksu);<br />
• System.out.printf(”hinta on %10.2f euroa”, maksu); //pyöristys<br />
• System.out.printf(”Tässä teksti\n %s \nteksti loppui”, teksti);<br />
* katso dokumentaatiota (System.*, in/out/err, format string syntax)<br />
43
OHJAUSRAKENTEET<br />
45
IF-ehtolause<br />
if (ehto)<br />
lauseet<br />
else<br />
lauseet<br />
LOHKO ELI<br />
KOOTTU LAUSE<br />
if (ika>20)<br />
tulot=opintolaina;<br />
else<br />
tulot=100;<br />
if (ika>20) {<br />
tulot=opintolaina;<br />
vuokra=1000;<br />
}<br />
else {<br />
tulot=100;<br />
karkkiin=30;<br />
}<br />
46
Ehto-osa<br />
VERTAILU-<br />
OPERAATIOT<br />
LOOGISET<br />
OPERAATIOT<br />
><br />
>=<br />
<<br />
Monitasoinen IF<br />
if (koulutus.equals(”DI”)) {<br />
if (ohjelmointitaito==’k’)<br />
}<br />
else<br />
palkka=20000;<br />
palkka=15000;<br />
if (koulutus.equals(”DI”))<br />
if (ohjelmointitaito==’k’)<br />
palkka=20000;<br />
else<br />
palkka=15000;<br />
if (koulutus.equals(”DI”)) {<br />
if (ohjelmointitaito==’k’)<br />
palkka=20000;<br />
} else<br />
palkka=15000;<br />
palkka=15000;<br />
if (koulutus.equals(”DI”) &&<br />
ohjelmointitaito==’k’)<br />
palkka=20000;<br />
Huomaa! Ulompi if sisältää yhden<br />
lauseen – ei sulkeita<br />
Vastaako valkoista tai vihreää ehtoa?<br />
48
IF-esimerkkejä<br />
Onko samat?<br />
if (ika=1000000)…<br />
if (ika>20 || omaisuus
Esimerkki (ehto-operaattori)<br />
if (arvosana>0)<br />
System.out.println(“Tentti on hyväksytty”);<br />
else<br />
System.out.println(“Tentti on hylätty”);<br />
System.out.println(“Tentti on “ + (arvosana>0 ? “hyväksytty” : “hylätty”));<br />
50
switch (lauseke) {<br />
case vakio1: lauseet;<br />
break;<br />
case vakio2:<br />
case vakio3: lauseet;<br />
case vakio4: lauseet;<br />
break;<br />
default: lauseet;<br />
break;<br />
}<br />
SWITCH-valintalause<br />
51
SWITCH-esimerkki1<br />
int kk;<br />
do {<br />
kk=Lue.koko();<br />
switch (kk) {<br />
case 1: System.out.println(”Tammikuu”); break;<br />
case 2: System.out.println(”Helmikuu”); break;<br />
case 3: System.out.println(”Maaliskuu”); break;<br />
case 4: System.out.println(”Huhtikuu”); break;<br />
case 5: System.out.println(”Toukokuu”); break;<br />
case 6: case 7: case 8: System.out.println(”Kesä”); break;<br />
case 9: System.out.println(”Syyskuu”); break;<br />
case 10: System.out.println(”Lokakuu”); break;<br />
case 11: System.out.println(”Marraskuu”); break;<br />
case 12: System.out.println(”Joulukuu”); break<br />
default: System.out.println(”Virheellinen kuukausinumero”);<br />
}<br />
} while (kk != 0);<br />
52
SWITCH-esimerkki2<br />
String kk;<br />
do {<br />
kk=Lue.rivi();<br />
switch (kk) {<br />
case "Maaliskuu":<br />
case "Huhtikuu":<br />
case "Toukokuu": System.out.println("Kevät"); break;<br />
case "Kesäkuu":<br />
case "Heinäkuu":<br />
case "Elokuu": System.out.println("Kesä"); break;<br />
case "Syyskuu":<br />
case "Lokakuu":<br />
case "Marraskuu": System.out.println("Syksy"); break;<br />
case "Joulukuu": case "Tammikuu": case "Helmikuu": System.out.println("Talvi"); break;<br />
default: System.out.println("Virheellinen kuukausi");<br />
}<br />
} while (kk.equals(""));<br />
53
WHILE-toistolause<br />
while (jatkamisehto)<br />
toistettavat lauseet<br />
jatkamisehto suoritetaan joka toistokerran<br />
alussa ja toistettavat lauseet<br />
suoritetaan jos jatkamisehto on<br />
tosi<br />
54
WHILE-esimerkkejä<br />
int i=0;<br />
while (i
FOR-toistolause<br />
for (alkuasetus; jatkamisehto; etenemisaskel)<br />
toistettavat lauseet<br />
alkuasetus<br />
suoritetaan kerran ennen toistojen<br />
aloittamista<br />
jatkamisehto totuusarvoinen lauseke, joka tarkistetaan<br />
ennen jokaista toistokertaa ja jos se on<br />
tosi suoritetaan toistettavat lauseet<br />
etenemisaskel lause joka suoritetaan jokaisen<br />
toistokerran jälkeen<br />
56
FOR-esimerkkejä<br />
for (int i=0; i
FOR-esimerkkejä<br />
for (int i=0; i
FOREACH-tyyppinen toistolause<br />
for (tyyppi muuttuja: kokoelma)<br />
toistettavat lauseet<br />
tyyppi<br />
muuttuja<br />
kokoelma<br />
kokoelmasta poimittavan tiedon tyyppi<br />
kokoelmasta poimittava tieto<br />
kokoelma josta tietoalkiot poimitaan yksi<br />
kerrallaan ja sillä suoritetaan toistettavat<br />
lauseet<br />
59
FOREACH-esimerkki<br />
for (int luku : taulu)<br />
System.out.println(luku);<br />
taulu<br />
2 45 56 67<br />
60
DO-toistolause<br />
do<br />
toistettavat lauseet<br />
while (jatkamisehto)<br />
Miten eroaa while-lauseesta?<br />
61
DO-esimerkki<br />
do {<br />
System.out.println(”Anna luku: ”);<br />
luku = Lue.koko();<br />
System.out.println(luku);<br />
} while (luku != 0);<br />
Mitä hyötyä vastaavaan while-lauseeseen?<br />
62
BREAK-lause<br />
Break keskeyttää switch- tai toistolauseen suorituksen<br />
for (int i=1; i
BREAK-lause<br />
Pelkkä break keskeyttää vain sisemmän rakenteen suorituksen<br />
for (int i=0; i
CONTINUE-lause<br />
Keskeytetään toiston meneillään oleva kierros ja aletaan<br />
seuraava kierros<br />
for (int i=1; i
Luentoharjoitus 6<br />
Tulosta kaikista syöttämistäsi luvuista suurin ja<br />
pienin.<br />
Esittele Format<br />
66
Luentoharjoitus 7<br />
Muunna korko-ohjelma for-silmukkaa<br />
käyttäväksi. Jäljitä ohjelman kulku<br />
”debuggerilla”.<br />
67
Luentoharjoitus 8<br />
Tee ohjelma, joka antaa halutun määrän<br />
alkulukuja* yhdestä lähtien.<br />
* Alkuluku on 1 suurempi luonnollinen luku (positiivinen kokonaisluku),<br />
joka on jaollinen vain 1:llä ja itsellään.<br />
68
Luentoharjoitus 9<br />
Vuosi on karkausvuosi, jos se on jaollinen 4:llä,<br />
mutta ei sadalla. 400:lla jaolliset kuitenkin ovat<br />
karkausvuosia.<br />
Laadi vuorovaikutteinen sovellus, joka tulostaa<br />
karkausvuodet käyttäjän pyytämältä<br />
vuosilukuväliltä.<br />
69
Luentoharjoitus 10<br />
Tutki, paljonko sinulla on rahaa 30 vuoden<br />
päästä, jos sijoitat nyt 1000 euroa kasvuosakkeeseen<br />
ja vuosittainen tuotto on 8<br />
prosenttia ja pankin vuosittainen<br />
hallinnointikustannus on<br />
a) 0 prosenttia<br />
b) 2 prosenttia.<br />
Kasvuosake = vuosittain tuotto lisätään pääomaan<br />
70
TAULUKKO<br />
71
Taulukko on olio<br />
int[ ] jono =<br />
new int[5];<br />
jono<br />
0 0 0 0 0<br />
0 1 2 3 4<br />
72
Moniulotteiset taulukot<br />
0 1 2 3 4<br />
int[ ] jono = new int[5]; 0 0 0 0 0<br />
double[ ][ ] taulu = new double[3][5];<br />
0<br />
1<br />
2<br />
0 1 2 3 4<br />
0.0 0.0 0.0 0.0 0.0<br />
0.0 0.0 0.0 0.0 0.0<br />
0.0 0.0 0.0 0.0 0.0<br />
char[ ][ ][ ] merkit = new char[3][5][4];<br />
\0 \0 \0 \0 \0<br />
\0 \0 \0 \0 \0<br />
\0 \0 \0 \0 \0<br />
73
Taulukon alustus<br />
int[ ] jono = new int[5];<br />
jono[3] = 8;<br />
jono<br />
0 0 0 8 0<br />
0 1 2 3 4<br />
jono<br />
int[ ] jono = {1,8,3,4,2}; 1 8 3 4 2<br />
0 1 2 3 4<br />
74
Taulukon alustus<br />
String[ ] nimet = {”Liisa”,”Aki”,”Ville”,”Juha-Matti”,”Mia”};<br />
0<br />
1<br />
2<br />
3<br />
4<br />
L i i s a<br />
A k i<br />
V i l l e<br />
J u h a – M a t t i<br />
M i a<br />
boolean[ ][ ] totuus = {{true,true,false}, {false,true,false}};<br />
true true false<br />
false true false<br />
75
Taulukkosääntöjä<br />
• Taulukon alkiot ovat samaa tyyppiä<br />
• Indeksi int-tyyppinen<br />
• Ensimmäisen alkion indeksi on 0<br />
• Vasta suoritusvaiheessa huomataan indeksin ylitys<br />
• Rivien määrä: taulu.length<br />
• Sarakkeiden määrä: taulu[3].length<br />
• Taulukot alustetaan aina (olio)<br />
• Taulukkomuuttuja voi osoittaa eri taulukko-olioihin<br />
kunhan ne ovat samanmuotoisia ja -tyyppisiä<br />
• Taulukot eivät automaattisesti kasva suorituksen<br />
aikana, mutta ohjelmoija voi pidentää taulukkoa<br />
76
Taulukon läpikäynti<br />
for (int i=0; i
Epätasainen taulukko<br />
Tasainen taulukko<br />
int[ ][ ] taulu = new int[3][2];<br />
int[ ][ ] taulu = {{1,2}, {5,9}, {3,2}};<br />
0 1<br />
0 1 2<br />
1 5 9<br />
2 3 2<br />
Epätasainen taulukko<br />
taulu<br />
int[ ][ ] taulu = new int[3][ ];<br />
taulu[0] = new int[2];<br />
taulu[1] = new int[3];<br />
taulu[2] = new int[1];<br />
78
Epätasaisen taulukon alustus<br />
Toimiiko molemmat?<br />
int[ ][ ] matriisi = {{1,2}, {5,9,7}, {3}};<br />
int[ ][ ] taulu = new int[3][ ];<br />
taulu[0] = {1,2};<br />
taulu[1] = {5,9,7};<br />
taulu[2] = {3};<br />
taulu<br />
1 2<br />
5 9 7<br />
3<br />
79
Esimerkkejä<br />
public class Taulu {<br />
public static void main(String[] args) {<br />
int[ ] jono= {3,0,7,2,9};<br />
int[ ][ ] sarja= {{2,4,6},{20,40,60}};<br />
for(int i=0; i
Esimerkkejä<br />
int[ ] jono = new int[5];<br />
0 0 0 0 0<br />
int[ ] sarja = {2,4,6,8,3};<br />
2 4 6 8 3<br />
sarja = jono;<br />
Mitä tapahtuu alemmalle taulukolle?<br />
Voit muuttaa tietoa toisen viitteen<br />
kautta ja muutos näkyy toisenkin<br />
viitteen kautta.<br />
81
Javan taulukkoluokkia<br />
• System.arrayCopy<br />
• ArrayList<br />
• Arrays<br />
– asList<br />
– binarySearch<br />
– equals<br />
– fill<br />
– Sort<br />
– toString<br />
82
Luentoharjoitus 11<br />
Koskien yksiulotteista positiivisten kokonaislukujen<br />
taulukkoa tulosta<br />
(8.1)<br />
a) alustettu taulukko<br />
b) taulukon arvojen summa<br />
c) ensimmäisen nollan indeksi<br />
d) taulukon suurin arvo ja sen indeksi<br />
e) taulukon arvojen prosentuaaliset osuudet<br />
83
Luentoharjoitus 12<br />
Tee ohjelma, joka automaattisesti laajentaa<br />
taulukkoa, kun lisäät siihen liikaa lukuja.<br />
84
Luentoharjoitus 13<br />
Tee ohjelma, joka tarkastaa antamasi<br />
lottorivin satunnaisesti luodun lottorivin<br />
kanssa. (8.6)<br />
* Math.random() antaa satunnaisluvun väliltä 0-1<br />
85
Luentoharjoitus 14<br />
Tutki, montako satunnaislukua * suunnilleen<br />
pitää tuottaa välillä 1-10, jotta kaikkia lukuja<br />
alkaa tulla suunnilleen sama määrä. (8.12)<br />
* Math.random() antaa satunnaisluvun väliltä 0-1<br />
86
Luentoharjoitus 15*<br />
Yksiulotteinen taulukko kuvaa joukko-opin<br />
joukkoa, jossa sama luku ei esiinny kahdesti.<br />
Laadi kahden joukon välille vähintään seuraavat<br />
kolme joukko-opin operaatiota, joista kukin<br />
palauttaa tulosjoukon 1 .<br />
YHDISTE yhdistää joukot tulosjoukoksi.<br />
LEIKKAUS palauttaa tulosjoukon, jossa on vain<br />
yhteiset alkiot.<br />
EROTUS palauttaa tulosjoukossa vain ne<br />
ensimmäisen joukon alkiot, joita ei ole toisessa<br />
joukossa.<br />
1) Voi käyttää tyypillisiä taulukon toimintoja: poista duplikaatit, tiivistä, lajittele,...<br />
87
MERKKIJONO<br />
91
Merkkijono-olion luonti<br />
Merkkijono<br />
String lemmikki = ”kissa”;<br />
Merkkitaulukko<br />
char[ ] eläin = {’k’, ’o’, ’i’, ’r’, ’a’};<br />
Merkkijonotaulukko<br />
String[ ] tarha = {”leijona”, ”seepra”, ”kameli”};<br />
92
Merkkijono metodit<br />
public int length() antaa merkkijonon pituuden<br />
String jono = ”kissa”;<br />
int pituus = jono.length(); // pituus=5<br />
public boolean equals(String) palauttaa true jos<br />
merkkijonot samat<br />
do {<br />
System.out.println(”Jatkatko (kyllä tai ei) ”);<br />
String vastaus = Lue.rivi();<br />
} while (vastaus.equals(”kyllä”));<br />
public boolean equalsIgnoreCase(String)<br />
93
Merkkijono metodit<br />
public int compareTo(String)<br />
Palauttaa numeron, joka ilmaisee merkkijonojen aakkosjärjestyksen:<br />
0 verrattava merkkijono on parametrimerkkijonon jälkeen<br />
System.out.print(”Anna eka merkkijono ”);<br />
String eka = Lue.rivi();<br />
System.out.print(”Anna toka merkkijono ”);<br />
String toka = Lue.rivi();<br />
int jarjestys= eka.compareTo(toka);<br />
if (jarjestys < 0) System.out.println(”Eka ensin”);<br />
if (jarjestys == 0) System.out.println(”Yhtäsuuret”)<br />
if (jarjestys > 0) System.out.println(”Toka ensin”):<br />
94
Merkkijono metodit<br />
public String toLowerCase()<br />
Muuttaa merkkijonon pieniksi kirjaimiksi.<br />
public String toUpperCase()<br />
Muuttaa merkkijonon isoiksi kirjaimiksi.<br />
String lemmikki = ”Kissa”;<br />
lemmikki = lemmikki.toLowerCase();<br />
System.out.println(lemmikki+lemmikki.toUpperCase());<br />
public String trim()<br />
Poistaa merkkijonon alusta ja lopusta välilyönnit.<br />
String lemmikki = ” Kissa”;<br />
lemmikki = lemmikki+”eläin ”;<br />
System.out.println(lemmikki.trim());<br />
95
Merkkijono metodit<br />
public char charAt(int index)<br />
Palauttaa merkkijonon yhden merkin.<br />
Huomaa kuvaava parametrin nimi.<br />
String lemmikki = ”Kissa”;<br />
for (int i=0; i
Merkkijono metodit<br />
public String substring(int startInd, int endInd)<br />
Palauttaa merkkijonosta osamerkkijonon lähtien merkkipaikasta<br />
startInd merkkiin endInd-1 asti.<br />
String lemmikki=”lemmikkikissa”;<br />
String suosikki=lemmikki.substring(3,8); //mikki<br />
String teksti = ”Hyvä ? olet voittanut paljon rahaa!”;<br />
String nimi = Lue.rivi();<br />
String kirje = teksti.substring(0,5)+nimi+teksti.substring(6);<br />
Hyvä Markku Nevanranta olet voittanut paljon rahaa!<br />
97
Merkit merkkijonoksi<br />
Muunna merkkijonon A-merkit a-merkeiksi.<br />
public class MerkkiMuunnos{<br />
public static void main(String[] args){<br />
String teksti, tulos;<br />
teksti = Lue.rivi ("Anna merkkijono ");<br />
// Merkkijono merkkitaulukoksi<br />
char[] mtaulu = teksti.toCharArray();<br />
for (int i=0; i
Merkkijonoista<br />
• Unicode-merkistö \uxxxx<br />
• Escape-esitys (esim. \n, \t, \\, \”)<br />
• Merkkijonon pituus tallessa merkkijono-oliossa<br />
• Merkkien vertailu: vastaus == ’k’<br />
• Merkkijonojen vertailu:<br />
– lemmikki==”kissa” (väärin)<br />
– lemmikki.equals(”kissa”) (oikein)<br />
• Perustietotyyppi merkkijonoksi:<br />
– ”numero ”+luku+” tekstiksi”<br />
– String.valueOf(luku)<br />
• Merkkijono perustietotyypiksi:<br />
– Integer.parseInt(mjono) // JDK 1.2<br />
– new Integer(mjono) // JDK 1.5<br />
(Byte, Short, Integer, Long, Float, Double, Boolean, Char kääreluokissa<br />
vastaavat xValue()- ja parsex-metodit)<br />
99
StringBuilder<br />
• Käytä StringBuilder-merkkijonoa jos Stringmerkkijonoa<br />
muutetaan paljon<br />
• StringBufferin synkronoimaton versio<br />
• Metodeja:<br />
– length(), setLength(int)<br />
– append(perustietotyyppi), insert(int paikka, perustietotyyppi)<br />
– replace(int, int, String), delete(int, int)<br />
– charAt(int), setCharAt(int, char)<br />
– substring(int, int)<br />
– toString()<br />
– reverse()<br />
101
StringBuilder esimerkki<br />
String kjono = "kenkä";<br />
StringBuilder sb = new StringBuilder(kjono);<br />
sb.insert(0,"Puu"); //Puukenkä<br />
sb.append("kö"); //Puukenkäkö<br />
sb.delete(4,6); //Puukkäkö<br />
sb.replace(5,8,"o"); //Puukko<br />
String jono3 = sb.toString(); //jono3 = "Puukko"<br />
StringBuilder buf = new StringBuilder();<br />
String jono = buf.append("Puu").append(kjono).toString();<br />
102
StringTokenizer<br />
• Pätkii merkkijonon osajonoiksi (token).<br />
• Metodeja:<br />
– StringTokenizer(String)<br />
– StringTokenizer(String, String delimiters)<br />
– countTokens()<br />
– hasMoreTokens()<br />
– nextToken(), nextToken(String delimiters)<br />
– String.split() metodilla saadaan myös pätkittyä<br />
103
StringTokenizer esimerkki<br />
String pätkittävä = "Matti,Kalle,,Maija";<br />
StringTokenizer st = new StringTokenizer(pätkittävä, ",", false);<br />
while ( st.hasMoreTokens() )<br />
System.out.println(st.nextToken());<br />
st = new StringTokenizer(pätkittävä, ",", true);<br />
while ( st.hasMoreTokens() )<br />
System.out.println(st.nextToken());<br />
Matti<br />
Kalle<br />
Maija<br />
Matti<br />
,<br />
Kalle<br />
,<br />
,<br />
Maija<br />
104
Säännölliset lausekkeet<br />
• Säännöllisten lausekkeiden (regular expression, regexp) avulla<br />
määritetään merkkijonohahmoja, joita voidaan tunnistaa<br />
merkkijonosta<br />
• Hahmoa etsitään matches-metodilla, joka palauttaa true-arvon<br />
jos hahmo löytyy muuten false<br />
• Merkkijono voidaan pilkkoa split-metodilla hahmoon<br />
täsmäävissä kohdissa ja pilkotut merkkijonopalaset palautetaan<br />
merkkijonotaulukkona<br />
• replaceAll-metodi korvaa kaikki hahmoon täsmäävät osat<br />
annetulla merkkijonolla<br />
• ReplaceFirst-metodi korvaa vain ensimmäisen hahmoon<br />
täsmäävän merkkijonon annetulla merkkijonolla<br />
• Pattern ja Matcher luokissa lisää metodeja<br />
105
Hahmon muodostaminen<br />
• Yksinkertainen hahmo: mikä tahansa hakasulkeissa oleva merkki kelpaa<br />
“rahayksikkö [€$£]”, “[ahjmprsv]aha”<br />
• Arvoväli: mikä tahansa arvovälillä oleva merkki kelpaa<br />
“[A-E] ajokortti”, “arvot [1-3 7-9]”<br />
• Yhdiste, leikkaus ja erotus: ehto sisällytetään toiseen ehtoon<br />
“[a-c[1-3]] luokat”, “[1-5&&[3-9]] luokat”, “[1-5&&[^3-9]] luokat”<br />
• Merkkiluokat: mikä tahansa merkki (.), numerot 0-9 (\\d), muu merkki paitsi<br />
0-9 (\\D), kaikki tyhjämerkit (\\s), ei-tyhjä merkki (\\S), mikä tahansa numero<br />
tai merkki (\\w), \\w negaatio (\\W)<br />
• Ryhmittely ja takaisinviittaus: () merkitään yhdessä käsiteltävä ryhmä,<br />
\\numero kertoo montako kertaa ryhmää pitää toistua<br />
• “(.)\\1” (merkki toistuu kaksi kertaa peräkkäin) “((.)\\3 )\\3” (luottokorttinumeron muodon tarkistus)<br />
• Lukumäärät: esiintyy kerran (?), nolla tai useamman kerran (*), kerran tai<br />
useamman kerran (+), täsmälleen n kertaa {n}, vähintään n kertaa {n,},<br />
vähintään n tai enintään m kertaa {n,m}<br />
• Paikkamääreet: rivin alku (^), rivin loppu ($), sanan alku tai loppu (\\b), \\b<br />
negaatio (\\B), syötteen alku (\\A), syötteen loppu (\\z)<br />
106
Esimerkki: säännöllinen lauseke<br />
public class SaannollinenLauseke {<br />
public static void main(String[] args) {<br />
// Luottokortin tarkistus<br />
String luottokortti = "1234 5678 9012 9876";<br />
if (luottokortti.matches("\\d{4}( \\d{4}){3}"))<br />
System.out.println("kortti oikein");<br />
else<br />
System.out.println("kortissa virhe");<br />
// Päivämäärän tarkistus<br />
String pvm = "12.09.2011";<br />
if (pvm.matches("(\\d{1,2}.){2}\\d{4}"))<br />
System.out.println("päivämäärä oikein");<br />
else<br />
System.out.println("päivämäärässä virhe");<br />
// Päivämäärän pilkkominen<br />
String[] sanat = pvm.split("\\.");<br />
for (int i=0; i
Help<br />
• Tutki merkkijonoja HELPistä<br />
• String<br />
• StringBuilder (StringBuffer)<br />
• StringTokenizer<br />
• Integer<br />
• Is-alkuiset: isEmpty(), isAlphapetic(), isDigit(),...<br />
108
Luentoharjoitus 16<br />
Tulosta merkkijono käänteisenä. (7.3)<br />
109
Luentoharjoitus 17<br />
Laske syöttämäsi tekstin merkkien<br />
esiintymismäärät.<br />
a = 97<br />
z = 122<br />
ä = 228<br />
å = 229<br />
ö = 246<br />
A = 65<br />
Z = 90<br />
Ä = 196<br />
Å = 197<br />
Ö = 214<br />
110
Luentoharjoitus 18<br />
Laadi ohjelma, joka tulostaa ryhmäsi<br />
opiskelijoiden nimet satunnaisjärjestyksessä.<br />
111
Luentoharjoitus 19<br />
Laadi henkilötunnuksen<br />
1. muodon oikeellisuuden tarkistusohjelma<br />
2. arvon oikeellisuuden tarkistusohjelma<br />
3. sekä tulosta syntymäaika. (7.11)<br />
112
Luentoharjoitus 20<br />
Testaa, onko teksti ymmärrettävissä jos sekoitat<br />
seuraavasti. Sekoita tekstin jokaisen sanan<br />
merkit lukuunottamatta ensimmäistä ja viimeistä<br />
merkkiä.(7.14)<br />
113
METODIT<br />
114
Metodin muoto<br />
määreet palautetyyppi nimi (parametrit) {<br />
ohjelma<br />
}<br />
määreet<br />
Näkyvyys: public, private<br />
Luokka-/oliokohtaisuus (static)<br />
palautetyyppi Palautettavan arvon tyyppi on<br />
void jos ei palautettavaa arvoa<br />
parametrit<br />
Tyypit ja nimet muuttujille, jotka<br />
ottavat vastaan kutsussa annetut<br />
tiedot<br />
115
Esimerkki (parametrit)<br />
public class Keskiarvo1 {<br />
public static void laskeKeskiarvo(int eka, int toka){<br />
double c;<br />
c = (eka+toka)/2.0;<br />
System.out.println("Keskiarvo on "+c);<br />
}<br />
}<br />
public static void main(String[] args){<br />
int luku1, luku2;<br />
System.out.print("Anna luku1: ");<br />
luku1 = Lue.koko();<br />
System.out.print("Anna luku2: ");<br />
luku2 = Lue.koko();<br />
laskeKeskiarvo(luku1, luku2);<br />
}<br />
116
Esimerkki (palautearvo)<br />
public class Keskiarvo2 {<br />
public static double laskeKeskiarvo(int eka, int toka){<br />
double c;<br />
public class Keskiarvo22 {<br />
c = (eka+toka)/2.0;<br />
public static double laskeKeskiarvo(int eka, int toka){<br />
return c;<br />
return (eka+toka)/2.0;<br />
}<br />
}<br />
}<br />
public static void main(String[] args){<br />
int luku1, luku2;<br />
double tulos1;<br />
System.out.print("Anna luku1: ");<br />
luku1 = Lue.koko();<br />
}<br />
System.out.print("Anna luku2: "); }<br />
luku2 = Lue.koko();<br />
tulos1 = laskeKeskiarvo(luku1, luku2);<br />
System.out.println("Keskiarvo on "+tulos1);<br />
}<br />
public static void main(String[] args){<br />
System.out.print("Anna luku1 ja luku2: ");<br />
System.out.println("Keskiarvo on "+<br />
laskeKeskiarvo(Lue.koko(), Lue.koko()));<br />
Javassa vain<br />
arvoparametreja<br />
(arvon kopiointi)<br />
117
Esimerkki (taulukko)<br />
public class Taulukko1 {<br />
public static void rahaMuunnin(double[] rahaa){<br />
for (int i=0; i
Esimerkki (taulukko)<br />
public class Taulukko2 {<br />
public static double[] rahaMuunnin(double[] rahaa){<br />
double[] muutettuRaha = new double[rahaa.length];<br />
}<br />
for (int i=0; i
Esimerkki (vaihteleva)<br />
Vaihteleva määrä parametreja<br />
public class Vaihtuva {<br />
public static void main (String[] args){<br />
int[] sarja = {3, 5, 7, 9};<br />
int summa = yhteen(sarja);<br />
int tulo = kerro(3,5,7,9);<br />
}<br />
System.out.println("Summa: "+summa);<br />
System.out.println("Tulo: "+tulo);<br />
public static int yhteen (int[] sarja){<br />
int summa = 0;<br />
for (int i=0; i
Esimerkki (kuormittaminen)<br />
public class Keskiarvo3 {<br />
private static double laskeKeskiarvo (double eka, double toka){<br />
return (eka+toka)/2.0;<br />
}<br />
private static double laskeKeskiarvo (int eka, int toka, int kolmas){<br />
return (eka+toka+kolmas)/3.0;<br />
}<br />
public static void main(String[] args){<br />
int luku1, luku2, luku3;<br />
luku1 = Lue.koko("Anna 1. luku: ");<br />
luku2 = Lue.koko("Anna 2. luku: ");<br />
luku3 = Lue.koko("Anna 3. luku: ");<br />
System.out.println("Kolmen luvun keskiarvo on "+<br />
laskeKeskiarvo(luku1, luku2, luku3));<br />
}<br />
}<br />
System.out.println("Kahden luvun keskiarvo on "+<br />
laskeKeskiarvo(luku1, luku2));<br />
121
Esimerkki (rekursiivisuus)<br />
public class Rekursio{<br />
public static void main(String[] args){<br />
String teksti="DIPLOMI-INSINÖÖRI";<br />
tulosta(teksti, 0);<br />
}<br />
public static void tulosta (String merkit, int i){<br />
if (i < merkit.length()){ //pituus=17<br />
System.out.print(merkit.charAt(i));<br />
tulosta(merkit, i+1);<br />
}<br />
}<br />
}<br />
System.out.print(merkit.charAt(i));<br />
122
Luokkamuuttujat<br />
public class Luokkamuuttujat {<br />
private static int summa = 3;<br />
private static int kpl;<br />
public static void main(String[] args){<br />
lisaa (4);<br />
tulosta();<br />
poista (5);<br />
tulosta();<br />
}<br />
private static void lisaa (int luku){<br />
summa += luku;<br />
kpl++;<br />
}<br />
private static void poista (int luku){<br />
summa -= luku;<br />
kpl++;<br />
}<br />
}<br />
private static void tulosta (){<br />
System.out.println("Summa: "+summa);<br />
System.out.println("Kappalemäärä: "+kpl);<br />
}<br />
123
Luentoharjoitus 21<br />
Parametrit ja paluuarvo<br />
Tee metodi tutkiaksesi, montako<br />
satunnaislukua pitää luoda N:stä<br />
mahdollisesta ennen kuin tulee K samaa<br />
arvoa?<br />
• Montako kertaa noppaa pitää heittää ennen kuin tulee<br />
kaksi samaa numeroa?<br />
• Montako henkilöä pitää valita ennen kuin kahdella on<br />
sama syntymäpäivä?<br />
124
Luentoharjoitus 22<br />
Taulukko parametrina<br />
Tee taulukon sekoitusmetodi, joka<br />
sekoittaa saamansa taulukon<br />
mahdollisimman satunnaisesti ja<br />
nopeasti. Metodi palauttaa<br />
sekoitetun taulukon. Tulosta<br />
alkuperäinen ja sekoitettu taulukko.<br />
125
Luentoharjoitus 23<br />
Valmiiden luokkien käyttö<br />
Luo Random-luokan metodin avulla<br />
miljoonan alkion kokonaislukutaulukko.<br />
Lajittele taulukko Array-luokan metodilla.<br />
Sekoita taulukko sekoitusmetodillasi.<br />
Mittaa metodien käyttämä aika Systemluokan<br />
currentTimeMillis-metodilla.<br />
Tulosta ajat.<br />
126
Luentoharjoitus 24<br />
Kuormittaminen<br />
Tee ”Laina”-luokka, jossa on kaksi ”lyhennys” -<br />
nimistä metodia. Toinen metodi saa<br />
lähtötietona velan määrän, vuosikoron ja<br />
maksuerän suuruuden. Toinen saa lähtötietona<br />
velan määrän, vuosikoron ja maksuerien<br />
määrän. Metodit tulostavat taulukon, jossa on<br />
lyhennystietoja lyhennyserittäin (velka, koron<br />
osuus, lyhennyksen osuus).<br />
127
Luentoharjoitus 25<br />
Luokkamuuttujat<br />
Keksi tekstin salakirjoitusmenetelmä, joka<br />
salaamisen lisäksi osaa myös avata salatun<br />
sanoman.<br />
128