Skip to content

Commit 325756b

Browse files
author
avihavai
committed
irrota loogiset operaatiot omaksi osakseen
1 parent 056103d commit 325756b

File tree

2 files changed

+342
-1
lines changed

2 files changed

+342
-1
lines changed

data/osa-1/9-ohjelmointi-yhteiskunnassa.md renamed to data/osa-1/10-ohjelmointi-yhteiskunnassa.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
path: '/osa-1/9-ohjelmointi-yhteiskunnassa'
2+
path: '/osa-1/10-ohjelmointi-yhteiskunnassa'
33
title: 'Ohjelmointi yhteiskunnassa'
44
hidden: false
55
---

data/osa-1/9-loogiset-operaatiot.md

Lines changed: 341 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,341 @@
1+
---
2+
path: "/osa-1/9-loogiset-operaatiot"
3+
title: "Loogiset operaatiot"
4+
---
5+
6+
<text-box variant='learningObjectives' name='Oppimistavoitteet'>
7+
8+
- Tunnet loogiset operaatiot ja, tai, sekä ei, ja osaat käyttää niitä osana ehtolauseen lauseketta.
9+
- Tunnet ehtolauseen suoritusjärjestyksen ja tiedät, että ehtolauseiden läpikäynti lopetetaan ensimmäiseen ehtoon, jonka lauseke evaluoituu todeksi.
10+
- Osaat käyttää toistolauseen ehtona totuusarvon palauttavaa lauseketta, jolla päätetään jatketaanko toistoa vaiko ei.
11+
12+
</text-box>
13+
14+
Materiaalin esimerkeissä ja tehtävissä käytetyt ehtolauseet ovat tähän mennessä käyttäneet yksinkertaisia lausekkeita, joilla on tarkasteltu ehtolauseeseen ja toistolauseeseen liittyvän lähdekoodin suorittamista. Esim.
15+
16+
```java
17+
int luku = 10;
18+
19+
if (luku == 0) { // lauseke
20+
System.out.println("Suoritetaan jos luku == 0 on totta");
21+
}
22+
```
23+
24+
```java
25+
int luku = 2;
26+
27+
if (luku % 2 == 0) {
28+
System.out.println("Luku on parillinen");
29+
}
30+
```
31+
32+
<sample-output>
33+
34+
Luku on parillinen
35+
36+
</sample-output>
37+
38+
Ehtolauseen lauseke voi koostua useammasta osasta, joissa käytetään loogisia operaatioita **ja** `&&`, **tai** `||`, sekä **ei** `!`.
39+
40+
* Kahdesta lausekkeesta koostuva lauseke, joka yhdistetään ja-operaatiolla, on totta jos ja vain jos yhdistettävistä lausekkeista molemmat evaluoituvat todeksi.
41+
* Kahdesta lausekkeesta koostuva lauseke, joka yhdistetään tai-operaatiolla, on totta jos jompikumpi tai molemmat yhdistettävistä lausekkeista evaluoituvat todeksi.
42+
* Loogista operaatiota ei käytetään totuusarvon muuntamiseen truesta falseksi tai falsesta trueksi.
43+
44+
Seuraavassa yhdistetään `&&`:lla eli ja-operaatiolla kaksi yksittäistä ehtoa. Koodilla tarkistetaan, onko muuttujassa oleva luku suurempi kuin 4 ja pienempi kuin 11, eli siis välillä 5-10:
45+
46+
47+
```java
48+
System.out.println("Onkohan luku väliltä 5-10: ");
49+
int luku = 7;
50+
51+
if (luku > 4 && luku < 11) {
52+
System.out.println("On! :)");
53+
} else {
54+
System.out.println("Ei ollut :(")
55+
}
56+
```
57+
58+
<sample-output>
59+
60+
Onkohan luku väliltä 5-10:
61+
On! :)
62+
63+
</sample-output>
64+
65+
Seuraavassa annetaan `||`:n eli tai-operaation avulla kaksi vaihtoehtoa, onko luku pienempi kuin 0 tai suurempi kuin 100. Ehto toteutuu jos luku täyttää jommankumman ehdon:
66+
67+
```java
68+
System.out.println("Onkohan luku pienempi kuin 0 tai suurempi kuin 100");
69+
int luku = 145;
70+
71+
if (luku < 0 || luku > 100) {
72+
System.out.println("On! :)");
73+
} else {
74+
System.out.println("Ei ollut :(")
75+
}
76+
```
77+
78+
<sample-output>
79+
80+
Onkohan luku pienempi kuin 0 tai suurempi kuin 100
81+
On! :)
82+
83+
</sample-output>
84+
85+
86+
Seuraavassa käännetään `!` ei-operaatiolla lausekkeen `luku > 4` tulos. Ei-operaatio merkitään lauseketta ennen niin, että käännettävä lauseke rajataan suluilla, ja ei-operaatio lisätään sulkuja ennen.
87+
88+
```java
89+
int luku = 7;
90+
91+
if (!(luku > 4)) {
92+
System.out.println("Luku ei ole suurempi kuin 4.");
93+
} else {
94+
System.out.println("Luku on suurempi tai yhtäsuuri kuin 4.")
95+
}
96+
```
97+
98+
<sample-output>
99+
100+
Luku on suurempi tai yhtäsuuri kuin 4.
101+
102+
</sample-output>
103+
104+
Alla on kuvattuna lausekkeiden toimintaa kun lausekkeissa on loogisia operaatioita.
105+
106+
107+
108+
| luku | luku > 0 | luku < 10 | luku > 0 && luku < 10 | !(luku > 0 && luku < 10) | luku > 0 \|\| luku < 10 |
109+
| ----- | --------- | ---------- | ---------------------- | ------------------------- | ---------------------- |
110+
| -1 | false | true | false | true | true |
111+
| 0 | false | true | false | true | true |
112+
| 1 | true | true | true | false | true |
113+
| 9 | true | true | true | false | true |
114+
| 10 | true | false | false | true | true |
115+
116+
117+
118+
<programming-exercise name='Iän tarkistus' tmcname='osa02-Osa02_11.IanTarkistus'>
119+
120+
Tee ohjelma, joka kysyy käyttäjän iän ja tarkistaa, että se on mahdollinen (ainakin 0 ja korkeintaan 120). Käytä ohjelmassa vain yhtä `if`-komentoa.
121+
122+
<sample-output>
123+
124+
Kuinka vanha olet? **10**
125+
OK
126+
127+
</sample-output>
128+
129+
<sample-output>
130+
131+
Kuinka vanha olet? **55**
132+
OK
133+
134+
</sample-output>
135+
136+
<sample-output>
137+
138+
Kuinka vanha olet? **-3**
139+
Mahdotonta!
140+
141+
</sample-output>
142+
143+
<sample-output>
144+
145+
Kuinka vanha olet? **150**
146+
Mahdotonta!
147+
148+
</sample-output>
149+
150+
</programming-exercise>
151+
152+
153+
## Ehtolauseiden suoritusjärjestys
154+
155+
TODO: kirjoita tähän eksplisiittisesti ehtolauseiden suoritusjärjestyksestä -- myös tehtävä tai pari
156+
157+
158+
## FizzBuzz
159+
160+
Tutustutaan klassiseen ohjelmointiongelmaan:
161+
162+
_'Kirjoita ohjelma, joka kysyy käyttäjältä lukua yhden ja sadan väliltä ja tulostaa luvun. Jos luku on kolmella jaollinen, luvun sijaan tulostetaan "Fizz". Jos luku on viidellä jaollinen, luvun sijaan tulostetaan "Buzz". Jos luku on sekä kolmella että viidellä jaollinen, luvun sijaan tulostetaan "FizzBuzz"'._
163+
164+
Ohjelmoija lähtee ratkaisemaan tehtävää lukemalla ongelmakuvauksen, ja luomalla ohjelmakoodia ongelmakuvausta seuraten. Koska ohjelman suoritusehdot esitellään ongelmassa annetussa järjestyksessä, muodostuu ohjelman rakenne järjestyksen perusteella. Ohjelman rakenne muodostuu seuraavien askelten perusteella:
165+
166+
* Tee ohjelma, joka lukee luvun käyttäjältä ja tulostaa sen.
167+
* Jos luku on jaollinen kolmella, tulosta luvun sijaan merkkijono "Fizz".
168+
* Jos luku on jaollinen viidellä, tulosta luvun sijaan merkkijono "Buzz".
169+
* Jos luku on jaollinen kolmella ja viidellä, tulosta luvun sijan merkkijono "FizzBuzz".
170+
171+
Jos-tyyppiset ehdot on helppo toteuttaa `if - else if - else` -valintakäskyjen avulla. Alla oleva koodi on toteutettu yllä olevien askelten perusteella, mutta se ei kuitenkaan toimi oikein, kuten alla olevista esimerkeistä huomataan.
172+
173+
```java
174+
Scanner lukija = new Scanner(System.in);
175+
176+
int luku = Integer.valueOf(lukija.nextLine());
177+
178+
if (luku % 3 == 0) {
179+
System.out.println("Fizz");
180+
} else if (luku % 5 == 0) {
181+
System.out.println("Buzz");
182+
} else if (luku % 3 == 0 && luku % 5 == 0) {
183+
System.out.println("FizzBuzz");
184+
} else {
185+
System.out.println(luku);
186+
}
187+
```
188+
189+
<sample-output>
190+
191+
**3**
192+
Fizz
193+
194+
</sample-output>
195+
196+
197+
<sample-output>
198+
199+
**4**
200+
4
201+
202+
</sample-output>
203+
204+
<sample-output>
205+
206+
**5**
207+
Buzz
208+
209+
</sample-output>
210+
211+
<sample-output>
212+
213+
**15**
214+
Fizz
215+
216+
</sample-output>
217+
218+
Edellisessä lähestymistavassa ongelmana on se, että **ehtolauseiden läpikäynti lopetetaan ensimmäiseen ehtoon, jonka arvo on totta**. Esimerkiksi luvulla 15 tulostetaan merkkijono "Fizz", sillä luku on kolmella jaollinen (15 % 3 == 0).
219+
220+
Yksi lähestymistapa yllä olevan ajatusketjun kehittämiseen on ensin etsiä **vaativin ehto** ja toteuttaa se. Tämän jälkeen toteutettaisiin muut ehdot. Yllä olevassa esimerkissä ehto "jos luku on jaollinen kolmella **ja** viidellä" vaatii kahden tapauksen toteutumista. Nyt ajatusketju olisi muotoa.
221+
222+
1. Tee ohjelma, joka lukee luvun käyttäjältä.
223+
2. Jos luku on jaollinen kolmella ja viidellä, tulosta luvun sijan merkkijono "FizzBuzz".
224+
3. Jos luku on jaollinen kolmella, tulosta luvun sijaan merkkijono "Fizz".
225+
4. Jos luku on jaollinen viidellä, tulosta luvun sijaan merkkijono "Buzz".
226+
5. Muulloin ohjelma tulostaa käyttäjältä luetun luvun.
227+
228+
229+
Nyt ongelmakin tuntuu ratkeavan.
230+
231+
```java
232+
Scanner lukija = new Scanner(System.in);
233+
234+
int luku = Integer.valueOf(lukija.nextLine());
235+
236+
if (luku % 3 == 0 && luku % 5 == 0) {
237+
System.out.println("FizzBuzz");
238+
} else if (luku % 3 == 0) {
239+
System.out.println("Fizz");
240+
} else if (luku % 5 == 0) {
241+
System.out.println("Buzz");
242+
} else {
243+
System.out.println(luku);
244+
}
245+
```
246+
247+
<sample-output>
248+
249+
**2**
250+
2
251+
252+
</sample-output>
253+
254+
<sample-output>
255+
256+
**5**
257+
Buzz
258+
259+
</sample-output>
260+
261+
<sample-output>
262+
263+
**30**
264+
FizzBuzz
265+
266+
</sample-output>
267+
268+
269+
<programming-exercise name='Karkausvuosi' tmcname='osa02-Osa02_12.Karkausvuosi'>
270+
271+
Vuosi on karkausvuosi, jos se on jaollinen 4:llä. Kuitenkin jos vuosi on jaollinen 100:lla, se on karkausvuosi vain silloin, kun se on jaollinen myös 400:lla.
272+
273+
Tee ohjelma, joka lukee käyttäjältä vuosiluvun, ja tarkistaa, onko vuosi karkausvuosi.
274+
275+
<sample-output>
276+
277+
Anna vuosi: **2011**
278+
Vuosi ei ole karkausvuosi.
279+
280+
</sample-output>
281+
282+
<sample-output>
283+
284+
Anna vuosi: **2012**
285+
Vuosi on karkausvuosi.
286+
287+
</sample-output>
288+
289+
<sample-output>
290+
291+
Anna vuosi: **1800**
292+
Vuosi ei ole karkausvuosi.
293+
294+
</sample-output>
295+
296+
<sample-output>
297+
298+
Anna vuosi: **2000**
299+
Vuosi on karkausvuosi.
300+
301+
</sample-output>
302+
303+
Vihje 1: Jollain luvulla jaollisuuden voi tarkastaa jakojäännösoperaation `%` avulla seuraavasti.
304+
305+
```java
306+
int luku = 5;
307+
308+
if (luku % 5 == 0) {
309+
System.out.println("Luku on viidellä jaollinen!");
310+
}
311+
312+
if (luku % 6 != 0) {
313+
System.out.println("Luku ei ole kuudella jaollinen!")
314+
}
315+
```
316+
317+
<sample-output>
318+
319+
Luku on viidellä jaollinen!
320+
Luku ei ole kuudella jaollinen!
321+
322+
</sample-output>
323+
324+
Vihje 2: mieti ongelmaa if, else if, else if, ... -vertailujen ketjuna ja aloita ohjelman rakentaminen tilanteesta, missä voit olla varma, että ohjelma ei ole karkausvuosi.
325+
326+
327+
```java
328+
Scanner lukija = new Scanner(System.in);
329+
int luku = Integer.valueOf(lukija.nextLine());
330+
331+
if (luku % 4 != 0) {
332+
System.out.println("Vuosi ei ole karkausvuosi.");
333+
} else if (...) {
334+
...
335+
} ...
336+
```
337+
338+
</programming-exercise>
339+
340+
341+
TODO: tehtävä: veroprosenttilaskuri (katso vero.fi:stä veroportaikko ja tuo tehtävänantoon, laske veroprosentti annetulle tulotasolle)

0 commit comments

Comments
 (0)