Skip to content

Commit ee5f810

Browse files
author
avihavai
committed
ohpe draft
1 parent 51af1ef commit ee5f810

34 files changed

+360
-13403
lines changed

data/osa-4/0-epic.md

Lines changed: 0 additions & 2691 deletions
This file was deleted.

data/osa-4/1-tiedon-lukeminen-ja-tiedostot.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ title: 'Tiedon lukeminen ja tiedostot'
44
hidden: false
55
---
66

7-
87
<text-box variant='learningObjectives' name='Oppimistavoitteet'>
98

109
- Kertaat tiedon lukemista näppäimistöltä.
@@ -150,6 +149,7 @@ Luo tehtäväpohjan juurikansioon (samassa kansiossa kansio `src` ja tiedosto `p
150149

151150
## Lukeminen tiedostosta
152151

152+
TODO: paths.get - testaa
153153

154154
**Tiedoston lukeminen** tapahtuu Scanner-luokan avulla. Kun Scanner-luokan avulla halutaan lukea tiedosto, annetaan luokan konstruktorille parametrina luettavaa tiedostoa kuvaava File-muuttuja (`new File("tiedostonnimi.paate")`). Tämän jälkeen tiedostoa voi lukea kuten näppäimistöltä luettavaa syötettä. Lukeminen tapahtuu while-toistolauseella, jota jatketaan kunnes kaikki tiedoston rivit on luettu, eli kunnes tiedostossa ei ole enää luettavia rivejä. Tiedostoja lukiessa voidaan kohdata virhetilanne, joten tiedoston lukeminen vaatii erillisen "yrittämisen" (`try`) sekä mahdollisen virheen kiinnioton (`catch`). Palaamme virhetilanteiden käsittelyyn ohjelmoinnin jatkokurssilla eli Ohjelmoinnin MOOCin osan 7 jälkeen.
155155

@@ -572,3 +572,4 @@ Vanhin oli: anton
572572
</sample-output>
573573

574574
</programming-exercise>
575+

data/osa-4/2-johdatus-olio-ohjelmointiin.md

Lines changed: 0 additions & 24 deletions
This file was deleted.

data/osa-4/2-tieto-ja-oliot.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
path: '/osa-4/2-tieto-ja-oliot'
3+
title: 'Tieto ja oliot'
4+
hidden: false
5+
---
6+
7+
8+
TODO: uusi setti, tässä kerrotaan mitä luokat ja oliot ovat, mutta lähestytään asiaa täysin tiedon rakenteen kautta
9+
10+
TODO: luokka käsite, käsitteeseen liittyy attribuutteja
11+
12+
TODO: luetaan näppikseltä tietoa, muunnetaan luettu tieto olioiksi
13+
14+
TODO: luetaan tiedostosta tietoa, muunnetaan luettu tieto olioiksi
15+
16+
TODO: käsitellään listallinen olioita
17+

data/osa-4/3-luokka-ja-olio.md renamed to data/osa-4/3-johdatus-olio-ohjelmointiin.md

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
2-
path: '/osa-4/3-luokka-ja-olio'
3-
title: 'Luokka ja olio'
2+
path: '/osa-4/3-johdatus-olio-ohjelmointiin'
3+
title: 'Johdatus olio-ohjelmointiin'
44
hidden: false
55
---
66

@@ -13,8 +13,11 @@ hidden: false
1313

1414
</text-box>
1515

16+
TODO: jotenkin frametaan että nyt alkaa iso juttu
1617

17-
Tutustuimme hetki sitten ensimmäistä kertaa termeihin olio ja luokka. Aloitamme nyt matkan olio-ohjelmoinnin pariin. Aluksi keskiössä on käsitteiden ja tiedon kuvaaminen luokkien ja olioiden avulla, jonka jälkeen tutustumme toiminnallisuuden eli metodien lisäämiseen.
18+
TODO: kirjoita se, että edellisessä osassa tarkasteltiin tiedostoja ja niistä luettavaa määrämuotoista tietoa -- näissä kyse jonkinlaisista käsitteistä
19+
20+
TODO: pois.. Tutustuimme hetki sitten ensimmäistä kertaa termeihin olio ja luokka. Aloitamme nyt matkan olio-ohjelmoinnin pariin. Aluksi keskiössä on käsitteiden ja tiedon kuvaaminen luokkien ja olioiden avulla, jonka jälkeen tutustumme toiminnallisuuden eli metodien lisäämiseen.
1821

1922
Olio-ohjelmoinnissa on kyse ratkaistavassa ongelmassa esiintyvien käsitteiden eristämisestä omiksi kokonaisuuksikseen sekä näiden kokonaisuuksien käyttämistä ongelman ratkaisemisessa. Kun ongelmaan liittyvät käsitteet on tunnistettu, niistä voidaan myös keskustella. Toisin ajatellen, ratkaistavasta ongelmasta muodostetaan abstraktioita, joiden avulla ongelmaa on helpompi käsitellä.
2023

@@ -1795,3 +1798,17 @@ Parittomien summa: 5
17951798

17961799
</programming-exercise>
17971800

1801+
## Yhteenveto
1802+
1803+
TODO: heivataanko slideshow pois?
1804+
1805+
...
1806+
1807+
<pdf-slideshow>
1808+
1809+
[a](../slideshows/johdatus-olio-ohjelmointiin.pdf)
1810+
1811+
</pdf-slideshow>
1812+
1813+
<quiznator id="5c4aa67b3972a9147410161a"></quiznator>
1814+

data/osa-4/4-listat-ja-oliot.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ while (indeksi < nimet.size()) {
4545
indeksi = indeksi + 1;
4646
}
4747

48+
// 2. for-toistolause indeksillä
49+
for (int i = 0; i < nimet.size(); i++) {
50+
System.out.println(nimet.get(i));
51+
}
52+
4853
System.out.println();
4954
// 2. for-each toistolause (ei indeksiä)
5055
for (String nimi: nimet) {
@@ -68,8 +73,17 @@ Kay McNulty
6873
Marlyn Wescoff
6974
Ruth Lichterman
7075

76+
Betty Jennings
77+
Betty Snyder
78+
Frances Spence
79+
Kay McNulty
80+
Marlyn Wescoff
81+
Ruth Lichterman
82+
7183
</sample-output>
7284

85+
TODO: onko relevantti kysely? Ehkä jotain muuta? Kysytään mitä toistolausetta suosii ja miksi?
86+
7387
<quiznator id="5c4aaa92244fe21455cb56ac"></quiznator>
7488

7589

@@ -292,3 +306,10 @@ KonMari
292306
</sample-output>
293307

294308
</programming-exercise>
309+
310+
TODO: tänne muutama tehtävä, missä luetaan tiedosto, luodaan tiedoston riveistä olioita, ja sitten tehdään jotain olioille
311+
312+
313+
TODO: tänne tehtävä "musiikkia" (luodaan luokka ääni, lisätään niitä listalle, annetaan äänet soittimelle)
314+
315+
TODO: mahdollisuus soittaa muiden tekemiä ääniä ja äänestää niitä osaksi verkkosivua?

data/osa-6/1-luokka-ja-oliometodit.md renamed to data/osa-4/5-luokka-ja-oliometodit.md

Lines changed: 4 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
---
2-
path: '/osa-6/1-luokka-ja-oliometodit'
3-
title: 'Luokka- ja oliometodit: määre static'
2+
path: '/osa-4/5-luokka-ja-oliometodit'
3+
title: 'Luokka- ja oliometodit (static ja ei-static)'
44
hidden: false
55
---
66

7+
# Luokka- ja oliometodit: määre static
8+
79
<text-box variant='learningObjectives' name='Oppimistavoitteet'>
810

911
- Tunnet käsitteet luokka- ja oliometodi.
@@ -321,169 +323,3 @@ Kokeile tämän jälkeen metodin käyttöä luokassa `Ohjelma`. Luokassa `MaPu`
321323

322324
</programming-exercise>
323325

324-
325-
326-
<programming-exercise name='Kirjaston tietojärjestelmä (4 osaa)' tmcname='osa06-Osa06_02.KirjastonTietojarjestelma'>
327-
328-
*Kumpulan tiedekirjasto tarvitsee uuden järjestelmän kirjojen hallintaan. Tässä tehtävässä hahmotellaan ongelma-alueen tietosisältöä ja toteutetaan prototyyppi, joka mahdollistaa kirjan haun nimen, julkaisijan tai julkaisuvuoden perusteella.*
329-
330-
Rakennetaan järjestelmä osista, tässä toteutetaan oleelliset luokat eli `Kirja` ja `Kirjasto`. Luokka `Kirja` sisältää kirjaan liittyvät tiedot, luokka `Kirjasto` tarjoaa erilaisia hakutoiminnallisuuksia kirjoihin liittyen.
331-
332-
333-
<h2>Kirja</h2>
334-
335-
Luodaan ensiksi luokka Kirja. Kirjalla on oliomuuttujina `nimeke`, eli kirjan nimi, `julkaisija`, eli kirjan julkaisija, ja `julkaisuvuosi` eli vuosi jolloin kirja on julkaistu. Kaksi ensimmäistä muuttujaa on merkkijonotyyppisiä, viimeisin on kokonaisluku. Oletamme tässä että kirjalla on aina vain yksi kirjoittaja.
336-
337-
Toteuta luokka `Kirja`. Kirjalla tulee olla myös konstruktori `public Kirja(String nimeke, String julkaisija, int julkaisuvuosi)` sekä metodit `public String nimeke()`, `public String julkaisija()`, `public int julkaisuvuosi()` ja `public String toString()`. Arvannet mitä metodien tulee tehdä, alla esimerkki.
338-
339-
Testaa luokan toimintaa:
340-
341-
```java
342-
Kirja cheese = new Kirja("Cheese Problems Solved", "Woodhead Publishing", 2007);
343-
System.out.println(cheese.nimeke());
344-
System.out.println(cheese.julkaisija());
345-
System.out.println(cheese.julkaisuvuosi());
346-
347-
System.out.println(cheese);
348-
```
349-
350-
<sample-output>
351-
352-
Cheese Problems Solved
353-
Woodhead Publishing
354-
2007
355-
Cheese Problems Solved, Woodhead Publishing, 2007
356-
357-
</sample-output>
358-
359-
360-
<h2>Kirjasto</h2>
361-
362-
Kirjaston tehtävä on antaa käyttäjälle mahdollisuus kirjojen lisäämiseen ja niiden hakemiseen. Luo luokka `Kirjasto`, jolla on konstruktori `public Kirjasto()` ja metodit `public void lisaaKirja(Kirja uusiKirja)` ja `public void tulostaKirjat()`.
363-
364-
365-
```java
366-
Kirjasto kirjasto = new Kirjasto();
367-
368-
Kirja cheese = new Kirja("Cheese Problems Solved", "Woodhead Publishing", 2007);
369-
kirjasto.lisaaKirja(cheese);
370-
371-
Kirja nhl = new Kirja("NHL Hockey", "Stanley Kupp", 1952);
372-
kirjasto.lisaaKirja(nhl);
373-
374-
kirjasto.lisaaKirja(new Kirja("Battle Axes", "Tom A. Hawk", 1851));
375-
376-
kirjasto.tulostaKirjat();
377-
```
378-
379-
<sample-output>
380-
381-
Cheese Problems Solved, Woodhead Publishing, 2007
382-
NHL Hockey, Stanley Kupp, 1952
383-
Battle Axes, Tom A. Hawk, 1851
384-
385-
</sample-output>
386-
387-
388-
<h2>Hakutoiminnallisuus</h2>
389-
390-
Kirjastosta tulee pystyä etsimään kirjoja nimekkeiden ja julkaisijoiden perusteella. Lisää kirjastolle metodit `public ArrayList<Kirja> haeKirjaNimekkeella(String nimeke)`, `public ArrayList<Kirja> haeKirjaJulkaisijalla(String julkaisija)` ja `public ArrayList<Kirja> haeKirjaJulkaisuvuodella(int julkaisuvuosi)`. Metodit palauttavat listan kirjoista, joissa on haluttu nimeke, julkaisija tai julkaisuvuosi.
391-
392-
Voit halutessasi hyödyntää seuraavaa runkoa metodin tekemiseen.
393-
394-
```java
395-
public class Kirjasto {
396-
// ...
397-
398-
public ArrayList<Kirja> haeKirjaNimekkeella(String nimeke) {
399-
ArrayList<Kirja> loydetyt = new ArrayList<>();
400-
401-
// käy läpi kaikki kirjat ja lisää ne joilla haetun kaltainen nimeke listalle loydetyt
402-
403-
return loydetyt;
404-
}
405-
}
406-
```
407-
408-
Huom! Kun haet teet hakua merkkijonon avulla, älä tee tarkkaa hakua (metodi `equals`) vaan käytä `String`-luokan metodia `contains`. Huomaat todennäköisesti myös että sinulla on ns. copy-paste -koodia `Kirjasto`-luokan koodissa. Yritä päästä siitä eroon!
409-
410-
```java
411-
Kirjasto kirjasto = new Kirjasto();
412-
413-
kirjasto.lisaaKirja(new Kirja("Cheese Problems Solved", "Woodhead Publishing", 2007));
414-
kirjasto.lisaaKirja(new Kirja("The Stinky Cheese Man and Other Fairly Stupid Tales", "Penguin Group", 1992));
415-
kirjasto.lisaaKirja(new Kirja("NHL Hockey", "Stanley Kupp", 1952));
416-
kirjasto.lisaaKirja(new Kirja("Battle Axes", "Tom A. Hawk", 1851));
417-
418-
for (Kirja kirja: kirjasto.haeKirjaNimekkeella("Cheese")) {
419-
System.out.println(kirja);
420-
}
421-
422-
System.out.println("---");
423-
424-
for (Kirja kirja: kirjasto.haeKirjaJulkaisijalla("Pong Group")) {
425-
System.out.println(kirja);
426-
}
427-
428-
System.out.println("---");
429-
430-
for (Kirja kirja: kirjasto.haeKirjaJulkaisuvuodella(1851)) {
431-
System.out.println(kirja);
432-
}
433-
```
434-
435-
<sample-output>
436-
Cheese Problems Solved, Woodhead Publishing, 2007
437-
The Stinky Cheese Man and Other Fairly Stupid Tales, Penguin Group, 1992
438-
---
439-
---
440-
Battle Axes, Tom A. Hawk, 1851
441-
</sample-output>
442-
443-
444-
<h2>Paranneltu hakutoiminnallisuus</h2>
445-
446-
447-
Hakutoiminnallisuutemme on jo hyvä, mutta se ei ymmärrä isojen ja pienten kirjainten eroa. Yllä olleessa esimerkissä haku nimekkeellä `"cheese"` ei olisi tuottanut yhtäkään tulosta. Myös toinen esimerkki, jossa oli ylimääräisiä välilyöntejä, ei näyttänyt haluttua tulosta. Haluamme että nimekkeiden ja julkaisijoiden nimillä haettaessa ei välitetä merkkien koosta, ja että käyttäjä voi syöttää ylimääräisiä välilyöntejä kirjan nimen alkuun tai loppuun (meidän ei tarvitse välittää sanojen välillä olevista tyhjistä!). Toteutetaan pieni apukirjasto `StringUtils` merkkijonojen vertailuun.
448-
449-
Luo luokka `StringUtils`, ja lisää sille staattinen metodi `public static boolean sisaltaa(String sana, String haettava)`, joka tarkistaa sisältääkö merkkijono `sana` merkkijonon `haettava`. Jos jommankumman merkkijonon arvo on *null*, metodin tulee palauttaa arvo `false`. Metodin tarjoaman vertailun tulee olla välittämättä merkin koosta.
450-
451-
Vinkki! Voit luoda uuden merkkijonon, joka sisältää vanhan merkkijonon kirjaimet isoksi muunnettuna `String`-luokan metodilla `toUpperCase()`. Kun sekä sana että haettava on kirjoitettu isoilla merkeillä, voi vertailun toteuttaa suoraviivaisesti metodilla `contains`.
452-
453-
Lisää metodille `sisaltaa` myös toiminnallisuus, joka poistaa merkkijonojen `sana` ja `haettava` alusta ja lopusta ylimääräiset välilyönnit. Käytä tähän `String`-luokan metodia `trim`, esim. `trimmattu = trimmattava.trim()`.
454-
455-
Kun olet saanut metodin valmiiksi, käytä sitä `Kirjasto`-luokassa. Alla esimerkki:
456-
457-
```java
458-
if (StringUtils.sisaltaa(kirja.nimeke(), nimeke)) {
459-
// kirja löytyi!
460-
}
461-
```
462-
463-
```java
464-
Kirjasto kirjasto = new Kirjasto();
465-
466-
kirjasto.lisaaKirja(new Kirja("Cheese Problems Solved", "Woodhead Publishing", 2007));
467-
kirjasto.lisaaKirja(new Kirja("The Stinky Cheese Man and Other Fairly Stupid Tales", "Penguin Group", 1992));
468-
kirjasto.lisaaKirja(new Kirja("NHL Hockey", "Stanley Kupp", 1952));
469-
kirjasto.lisaaKirja(new Kirja("Battle Axes", "Tom A. Hawk", 1851));
470-
471-
for (Kirja kirja: kirjasto.haeKirjaNimekkeella("CHEESE")) {
472-
System.out.println(kirja);
473-
}
474-
475-
System.out.println("---");
476-
for (Kirja kirja: kirjasto.haeKirjaJulkaisijalla("PENGUIN ")) {
477-
System.out.println(kirja);
478-
}
479-
```
480-
481-
<sample-output>
482-
Cheese Problems Solved, Woodhead Publishing, 2007
483-
The Stinky Cheese Man and Other Fairly Stupid Tales, Penguin Group, 1992
484-
---
485-
The Stinky Cheese Man and Other Fairly Stupid Tales, Penguin Group, 1992
486-
</sample-output>
487-
488-
</programming-exercise>
489-

data/osa-4/5-yhteenveto.md renamed to data/osa-4/6-ohjelman-sanoittaminen.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
---
2-
path: '/osa-4/5-yhteenveto'
3-
title: 'Yhteenveto'
2+
path: '/osa-4/6-ohjelman-sanoittaminen'
3+
title: 'Ohjelman käsitteiden tunnistaminen ja sanoittaminen'
44
hidden: false
55
---
66

7+
TODO: onko ok otsikko?
8+
TODO: kirjoita uudestaan, pääteemana ohjelman käsittelemien käsitteiden sanoittaminen
9+
710

811
Neljännessä osassa tutustuttiin tiedon lukemiseen tiedostosta ja otettiin ensimmäiset askeleet olio-ohjelmoinnin pariin. Loimme luokkia ja olioita. Määrittelimme luokille konstruktorit, metodit ja oliomuuttujat, ja opettelimme tulostamaan olioihin liittyviä tietoja olion `toString`-metodilla. Harjoittelimme myös listalla olevien olioiden käsittelyä.
912

data/osa-4/index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ hidden: false
3333
<deadline>Kirjaudu sisään nähdäksesi deadlinen tälle osalle</deadline>
3434
</only-for-not-logged-in>
3535

36+
TODO: kirjoita uudestaan: teemana tiedon lukeminen ja tiedon esittäminen, ohjelman sanoittaminen tietoa kuvaavien käsitteiden avulla
37+
3638
Tässä osassa tutustut käsitteisiin tiedosto ja tiedostojärjestelmä sekä opit lukemaan merkkijonomuotoista tietoa tiedostosta. Otat ensiaskeleet olio-ohjelmointiin ja opit olio-ohjelmoinnin keskeiset käsitteet kuten luokka ja olio. Opit luomaan luokkia ja olioita sekä käyttämään niitä osana toteuttamiasi ohjelmia.
3739

3840

0 commit comments

Comments
 (0)