6.2 Laskuri ja laskukaavat
Yhteenveto
Tehdään ohjelma, joka laskee neliön pinta-aloja, kun x saa arvoja 1, 2, 3, 4.... Lisätään ohjelmaan if-lause, joka tulostaa x:n ja A:n arvot, jos x on pienempi tai yhtä suuri kuin 10. Jos x on suurempi kuin 10, niin siinä tapauksessa tulostetaan summa-muuttujan arvo. Summa-muuttujan arvossa on summattu kaikkien pinta-alojen summa.
Ohjelman koodi on seuraava:
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
int x = 1; // Laskurin alkuarvo
int summa = 0; // Summan alkuarvo
void setup () {
size(300,300); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Tekstin väri musta
textSize(20); // Tekstin koko 20
}
void draw () {
int A = x*x; // Laske pinta-ala
if (x <= 10) { // Jos x on pienempi tai yhtäsuuri kuin 10
summa = summa+A; // Summaa pinta-ala
text("x = "+x+" m, Pinta-ala: A = "+A+" m\u00B2",10,x*20);
} else {
text("Pinta-alojen summa on "+summa+" m\u00b2",10,260);
}
x++; // Kasvata laskuria
}
Esimerkki: Laskuri ja laskukaavat
Olkoon laskuri x = x + 2. Neliön piiri lasketaan kaavalla p = 4∙x, missä x on neliön sivun pituus. Laske laskurin avulla piirille kuusi ensimmäistä arvoa, kun laskurin alkuarvo on 0.
Lasketaan ensin taulukoimalla piirille arvot, kun x saa arvoja: 0, 2, 4, 6, 8, 10.
| 1. arvo: | Laskuri: x = 0 | Piiri: p = 4∙0 = 0 |
| 2. arvo: | Laskuri: x = 0 + 2 = 2 | Piiri: p = 4∙2 = 8 |
| 3. arvo: | Laskuri: x = 2 + 2 = 4 | Piiri: p = 4∙4 = 16 |
| 4: arvo: | Laskuri: x = 4 + 2 = 6 | Piiri: p = 4∙6 = 24 |
| 5. arvo: | Laskuri: x = 6 + 2 = 8 | Piiri: p = 4∙8 = 32 |
| 6. arvo: | Laskuri; x = 8 + 2 = 10 | Piiri: p = 4∙10 = 40 |
Kun rakennamme tästä ohjelman, niin lukujen on tulostuttava allekkain. Se onnistuu, kun laitamme tulostuslauseen y-koordinaatin paikalle lausekkeen: 20+x*20. Kun a saa arvoja: 0, 1, 2, 3, 4, 5 ja 6, y-koordinaatti saa arvoa: 20, 40, 60, 80, 100, 120. Tällöin jokainen uusi teksti tulee 20 px alemmas kuin edellinen teksti. Jos haluamme tulostaa vain kuusi ensimmäistä arvoa, niin tällöin käytämme if-lauseketta. Tulostus tapahtuu niin kauan kuin ehto (x on pienempi tai yhtä suuri kuin 10) on voimassa. Kokonainen ohjelma, joka laskee kuusi ensimmäistä piirin arvoa, on seuraavanlainen.
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
int x = 0;
void setup () {
size(400,400); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Täyttöväri musta
textSize(20); // Tekstin koko
}
void draw () {
int p = 4*x; // Laske piiri
if (x <= 10) { // Jos x on pienempi tai yhtä suuri kuin 10, niin
text("Laskuri: x = "+x+", Piiri: p = "+p,20,20+x*20);
// Tulosta piiri
}
x = x + 2; // Kasvata laskuria kahdella
}
Katsotaan tulostuslausetta tarkemmin:

Ohjelman suoritus näyttää tältä:
Esimerkki: Viiden kertotaulu
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
int a = 0; // Laskurin alkuarvo
void setup () {
size(400,400); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Täyttöväri musta
textSize(20); // Tekstin koko 20
}
void draw () {
a++; // Laskuri kasvaa yhdellä
text("5\u00B7"+a+" = "+5*a,20,20+20*a); // Tulosta
}
Kun yllä oleva koodi suoritetaan, niin tulostuu seuraavaa.
Tässä laskuri a kasvaa yhdellä ja samalla tehdään viiden kertolaskuja alaspäin. Tulostuslause vaatii hieman tarkempaa tutkimusta.

Laskuri mahdollistaa useita laskuja allekkain. Tässä laskuri kasvaa jatkuvasti. Entä jos haluaisimme tulostaa vain 10 ensimmäistä kertolaskua? Tällöin tarvitsemme if-lausetta. Meidän pitäisi tehdä ehto: jos laskuri on pienempi tai yhtä suuri kuin 10, niin silloin tulosta laskurin arvo ja tee kertolasku. Muutetaan koodia seuraavasti:
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
int a = 0; // Laskurin alkuarvo
void setup () {
size(400,400); // Ikkunan koko
background(255); // Taustaväri valkea
fill(0); // Täyttöväri musta
textSize(20); // Tekstin koko
}
void draw () {
a++; // Laskuri kasvaa yhdellä
if (a <= 10) { // Jos a on peienmpi tai yhtäsuuri kuin 10, niin
text("5\u00B7"+a+" = "+5*a,20,20+20*a); // Tulosta
}
}
Ohjelman suoritusta voi myös havainnollistaa taulukoimalla laskurin a arvoja.
| a++ | (a <= 10) | text("5\u00B7"+a+" = "+5*a,20,20+10*a); |
| 1 | 1 <= 10, tosi | text("5\u00B7"+1+" = "+5,20,30); |
| 2 | 2 <= 10, tosi | text("5\u00B7"+2+" = "+10,20,40); |
| 3 | 3 <= 10, tosi | text("5\u00B7"+3+" = "+15,20,50); |
| 4 | 4 <= 10, tosi | text("5\u00B7"+4+" = "+20,20,60); |
| 5 | 5 <= 10, tosi | text("5\u00B7"+5+" = "+25,20,70); |
| 6 | 6 <= 10, tosi | text("5\u00B7"+6+" = "+30,20,80); |
| 7 | 7 <= 10, tosi | text("5\u00B7"+7+" = "+35,20,90); |
| 8 | 8 <= 10, tosi | text("5\u00B7"+8+" = "+40,20,100); |
| 9 | 9 <= 10, tosi | text("5\u00B7"+9+" = "+45,20,110); |
| 10 | 10 <= 10, tosi | text("5\u00B7"+10+" = "+50,20,120); |
| 11 | 11 <= 10, epätosi | - |
Esimerkki: Funktion arvot
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
int x = -10; // Laskurin alkuarvo
void setup () {
size(400,500); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Täyttöväri musta
textSize(20); // Tekstin koko 20
}
void draw () {
int y = 2*x -3; // Laske y:n arvo
if (x <= 10) {
text("f("+x+") = 2\u00B7("+x+") -3 = "+y,10,220+20*x);
}
x++; // Laskuri kasvaa yhdellä
}

Ohjelma toimii muuten hyvin, mutta voisiko tulostusta sieventää? Kun x on nolla tai suurempi, niin ohjelma tulostaa sulut vaikka siihen ei ole tarvetta. Ohjelmassa on toinenkin heikkous. Entä jos haluamme tulostaa funktion f(x) = 2x + 3. Joudumme tekemään heti korjauksia tulostuslauseeseen. Olisi parempi määritellä myös omat muuttujat luvuille 2 ja -3, jolloin näitä voisi tarvittaessa vaihtaa. Eräs ongelma on se, että plusmerkki ei tulostu, jos -3 vaihdetaan +3:ksi. Tarvitsemme vielä lisätä kaksi kertaa kaksi sisäkkäistä if-lausetta, ennen kuin kaikki eri variaatiot on huomioitu.
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
int x = -10; // Laskurin alkuarvo
void setup () {
size(400,500); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Taustaväri musta
textSize(20); // Tekstin koko 20
}
void draw () {
int k = 2;
int b = -3;
int y = k*x + b;
if (x <= 10) {
if ( x < 0) {
if (b > 0) {
text("f("+x+") = "+k+"\u00B7("+x+") +"+b+" = "+y,10,220+20*x);
} else {
text("f("+x+") = "+k+"\u00B7("+x+")"+b+" = "+y,10,220+20*x);
}
} else {
if (b > 0) {
text("f("+x+") = "+k+"\u00B7"+x+" +"+b+" = "+y,10,220+20*x);
} else {
text("f("+x+") = "+k+"\u00B7"+x+""+b+" = "+y,10,220+20*x);
}
}
}
x++; // Laskuri kasvaa yhdellä
}
Kokeile vaihtaa muuttujille k ja b uudet arvot. Huomaat, että laskuri toimii halutulla tavalla.
Esimerkki: Lukujen 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 summa
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
int a = 0; // Laskurin alkuarvo
int summa = 0; // Summa-laskurin alkuarvo
void setup () {
size(400,400); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Tekstin väri musta
textSize(20); // Tekstin koko 20
}
void draw () {
a++; // Laskuri kasvaa yhdellä
summa = summa + a; // Summa-laskuri laskee lukujen summan
if (a <= 10) { // Jos a on pienempi tai yhtäsuuri kuin 10, niin
text("Kun a = "+a+", niin summa = "+summa,20,10+20*a);
// Tulosta laskuri a ja summa
}
}
Kuten huomasit, tarvitsemme nyt kaksi laskuria. Laskuri a käy luvut järjestyksessä yhdestä kymmeneen. Summa-laskuriin summaamme nämä luvut yksi kerrallaan. Kun ajamme ohjelman, niin tulostus näyttää tältä.
Esimerkki: Syötettyjen lukujen summaaminen
|
// Ohjelman tehnyt e-Oppi Oy
// 30.9.2017
String kirjoita =""; // Uusi teksti
String kirjoitettu=""; // Vanha teksti
int summa = 0; // Lukujen summa
int laskuri = 1; // Syötettyjen lukujen määrä
void setup () {
size(600,200); // ikkunan koko
fill(0); // Musta täyttöväri
textSize(30); // Tekstin koko 30
}
void draw () {
background(255); // Tyhjennä tausta
text("Anna "+laskuri+". luku:",50,50); // Kysy luku
text(kirjoita,60+textWidth("Anna"+laskuri+". luku:"),50);
// Tulosta nykyinen luku
text("Lukujen summa on: "+summa,50,100);
// Tulosta lukujen summa
}
void keyPressed() {
if (key == '\n') { // Jos painetaan Enter
kirjoitettu = kirjoita;
// Siirrä nykyinen merkkijono vanhaan merkkijonoon
kirjoita =""; // Nollaa nykyinen merkkijono
summa = summa+int(kirjoitettu);
// Laske syötettyjen lukujen summa.
// int()-komento muuttaa merkit luvuksi.
laskuri = laskuri + 1; // Kasvata laskuria yhdellä
} else { // Muutoin kasvata merkkijonoa
kirjoita = kirjoita+key;
// Lisää yksittäinen syötetty merkki merkkijonoon
}
}
Aluksi ohjelma kysyy lukua. Napsauta aluksi hiirellä ikkunaa ja sitten syötä haluamasi luku. Esimerkiksi tässä luvuksi on syötetty viisi.

Kun painat Enteriä, niin syötetty luku siirtyy summa muuttujalle. Voit nyt syöttää toisen luvun. Laskuri-muuttujasta näet sen, että monennenko luvun olet nyt syöttämässä. Anna toinen luku. Esimerkiksi tässä toinen luku on seitsemän.

Kun painat Enteriä, niin summa muuttuja kasvaa viidellä ja laskuri muuttuja yhdellä. Voit jatkaa lukujen syöttämistä. Kokeile myös syöttää isompia lukuja.

Tehdään sama ohjelma vertailun vuoksi käyttäen Javan syöttökenttiä.
// Ohjelman tehnyt e-Oppi Oy
// 1.1.2018
import static javax.swing.JOptionPane.*;
int summa = 0; // Lukujen summa
int laskuri = 1; // Syötettyjen lukujen määrä
void setup () {
size(600,200); // ikkunan koko
fill(0); // Musta täyttöväri
textSize(30); // Tekstin koko 30
background(255); // Tyhjennä tausta
}
void draw () {
int luku; // Määritellään luku muuttuja
String vastaus1 = showInputDialog(null,"Anna "+laskuri+" luku"); // Kysy luku
if (vastaus1 != null) { // null=cancel
luku= int(vastaus1); // Konversio vain jos painettu OK (ei null)
summa = summa+luku; // Summaa luvut
}
int vastaus2= showConfirmDialog(null, "Lopeta lukujen syöttäminen?"); // 0=yes, 1=no, 2=cancel
if (vastaus2 == 0) { // Jos vastaus on yes eli 0, niin
text("Olet syöttänyt: "+laskuri+" kpl lukuja",50,50);
text("Lukujen summa on: "+summa,50,100);
noLoop(); // Lopeta void draw ()-lohkon toisto
} else { // Kaikissa muissa tapauksissa
laskuri++; // kasvata laskuria
}
}
Tähän on lisätty kysymys, että syötetäänkö lisää lukuja. Kun lukuja ei enää syötetä, niin tulostetaan syötettyjen lukujen määrä ja summa.





