Skip to content
Snippets Groups Projects
Commit 13afc8fc authored by hasoit's avatar hasoit
Browse files

Add initial state of teht 1.2

parent e58b690d
No related branches found
No related tags found
No related merge requests found
Showing
with 516 additions and 0 deletions
# Ohjelmoinnin työkalut: Viikko 1
Tervetuloa ohjelmoinnin työkalujen harjoituksiin. Harjoitukset ovat tässä *git repositoriossa*. Katsele ensin ympärillesi:
* Tiedostolistaus näkyy yläpuolella ja niitä voi avata klikkaamalla
* Tämä tiedosto on nimeltään `README.md`
* Tiedostot ovat [markdown](https://www.markdownguide.org/basic-syntax/) -muotoisia ja gitlab osaa renderöidä ne automaattisesti.
* Jos lataat tiedostot koneellesi, näet vain markdown-syntaksin, joka on kuitenkin suhteellisen helposti luettavissa sellaisenaankin.
## Viikon 1 harjoitukset
Aloita tutustuminen viikon aiheeseen tiedostosta [viikko 1](https://gitlab.utu.fi/TKO_2116/viikko-1/-/blob/main/viikko1.md)
## GITin asennus
Ennen kuin voit käyttää Gitiä koneellasi, se tulee ladata ja asentaa.
Lataa käyttöjärjestelmällesi sopiva versio osoitteesta
https://git-scm.com/downloads
Google-haku "GIT download" todennäköisesti johdattaa omalle koneellesi sopivaan versioon myös.
Asenna paketti koneellesi. Paketin mukana tulee graafinen käyttöliittymä Git GUI, ja edellä mainituilta sivuilta voit ladata muita graafisia versioita. Ohjeissa keskitytään kuitenkin komentoriviversion käyttöön.
## Unixin perusteiden kertaus
GITiä käytetään näissä harjoituksissa komentoriviltä ohjelmalla nimeltä **Git Bash**. Komentorivillä toimivat normaalit UNIX-komennot.
Kerrataan siis harjoituksissa tarvittavat perustoiminnallisuudet.
Nykyisen työhakemiston voit selvittää komennolla
`pwd`
Hakemiston sisällön saat selville komennolla
`ls`
...mutta yleensä kannattaa käyttää vipuja l (pieni äl) ja a; tämä näyttää tiedostojen koot ja listaa myös pisteellä alkavat tiedostonnimet:
`ls -la`
Hakemistosta toiseen voi vaihtaa komennolla
`cd hakemiston_nimi`
Uuden hakemiston voi tehdä komennolla
`mkdir hakemiston_nimi`
Tekstitiedoston sisällön näet esim. komennolla cat
`cat README.md`
Lisätietota UNIXista löydät esimerkiksi Opiskelun ja työelämän tietotekniikka -kurssin UNIX-osiosta. Pikamanuaali löytyy esimerkiksi kirjoittamalla Googleen hakusanoiksi
`unix commands cheat sheet`
[Takaisin viikon 1 materiaaliin](viikko1.md)
part 1/teht 1.2/img/autocomplete1.png

75.5 KiB

part 1/teht 1.2/img/autocomplete2.png

17.5 KiB

part 1/teht 1.2/img/debug1.png

40.3 KiB

part 1/teht 1.2/img/debug2.png

31.9 KiB

part 1/teht 1.2/img/environment1.png

396 KiB

part 1/teht 1.2/img/environment2.png

17.5 KiB

part 1/teht 1.2/img/environment3.png

32.5 KiB

part 1/teht 1.2/img/environment4.png

16.5 KiB

part 1/teht 1.2/img/javac_java.png

7.38 KiB

part 1/teht 1.2/img/kaannos.png

8.35 KiB

part 1/teht 1.2/img/navigator.png

5.43 KiB

part 1/teht 1.2/img/new_project.png

47.3 KiB

part 1/teht 1.2/img/virhe1.png

13.4 KiB

part 1/teht 1.2/img/virhe2.png

9.81 KiB

public class DebugEsimerkki {
public static void main(String[] args) {
int[] luvut = {10, 15, 5, 25, 30};
int summa = 0;
for (int luku : luvut) {
summa += luku;
}
System.out.println("Summa: "+ summa);
}
}
\ No newline at end of file
import java.util.ArrayList;
import java.util.List;
public class KorjaaMinut {
public static void main(String[] args) {
// Testataan metodia erilaisilla syötteillä
ArrayList<Integer> lista = new ArrayList<>;
lista.add(1);
lista.add(2);
lista.add(-1);
lista.add(3);
lista.add(-4);
lista.add(-5);
lista.add(6);
poistaNegatiiviset(lista);
System.out.println(lista);
/**
* Metodi poistaa listasta kaikki nollaa pienemmät alkiot
* @param lista lista, josta alkiot poistetaan
*/
public static void poistaNegatiiviset(ArrayList<Integer> lista) {
int indeksi = 0;
while indeksi < lista.size() {
int alkio = lista.get(indeksi);
if (alkio > 0) {
lista.remove(indeks);
}
indeksi++;
}
}
}
# PATH-ympäristömuuttujan asettaminen Windowsissa
1. Avaa Start-valikko
2. Kirjoita hakuruutuun `environment` ja valitse vaihtoehto `Edit System Environment Variables` (suomeksi `ympäristö` ja `Muokkaa järjestelmän ympäristömuuttujia`)
<img src="img/environment1.png">
3. Valitse dialogista kohta `Environment Variables` (suomeksi `Ympäristömuuttujat`)
<img src="img/environment2.png">
4. Valitse kohdasta *User Variables for käyttäjän_nimi* kohta `Path` ja klikkaa painiketta `Edit` (suom. `Muokkaa`).
<img src="img/environment3.png">
5. Etsi koneeltasi Javan asennuskansio ja sen alta kansio `bin`. Valitse dialogista `New`, liitä kansion osoite riville ja paina `OK`
<img src="img/environment4.png">
[Takaisin viikon 1 materiaaliin](viikko1.md)
# Viikko 1 - Ohjelmakoodin editointi, kääntäminen ja debuggaus
Tarkastellaan kurssin ensimmäisellä viikolla Java-tiedostojen muokkausta, kääntämistä ja suorittamista ja virheiden etsimistä ohjelmista. Samankaltaisiin asioihin tutustuttiin Pythonilla kurssilla Ohjelmoinnin perusteet.
### Oppimispäämäärät:
* Lähdekoodin ja tavukodin käsitteet
* Java-ohjelman kääntäminen ja ajaminen komentoriviltä
* IDE:n asennus ja peruskäyttö
* Ohjelman debuggaus eri metodeilla
### Sisältö
[Javan asennus](#1-javan-asennus) | [Java-lähdekoodi](#2-java-lähdekoodi) | [Kääntäminen ja suorittaminen](#3-kääntäminen-ja-suorittaminen-komentoriviltä) | [Komentoriviparametrit](#4-komentoriviparametrit) | [IDE:n asennus](#5-ohjelmointiympäristön-asentaminen) | [Projektin luominen](#6-ensimmäinen-projekti) | [Koodin täydennykset](#7-koodin-automaattinen-täydentäminen) | [Käännösvirheet](#8-käännösvirheet) | [Debuggaus](#9-debuggaus-intellijssä)
## 1. Javan asennus
Ennen kuin Java-ohjelmia voidaan ajaa omalla koneella, tulee koneelle asentaa Java-kääntäjä ja tulkki. Huomaa, että pelkät Javan ajonaikaiset kirjastot (JRE) eivät riitä ohjelmien kääntämiseen.
Java Development Kitin (JDK) voit asentaa lataamalla paketin joko
* [Oraclen sivuilta](https://www.oracle.com/java/technologies/javase-downloads.html)
* [Open JDK:n sivuilta](https://jdk.java.net/)
* [Adoptium Working Groupin sivuilta](https://adoptium.net/)
ViLLEssä on käytössä Javan versio 11, mutta voit asentaa koneellesi uusimman version (tällä hetkellä 19 on juuri julkaistu). Kurssilla käytettävien ominaisuuksien osalta versioissa ei ole merkittäviä eroja.
Koneessa voi olla samanaikaisesti useampia Java-versioita. Tämä voi joskus tuottaa ongelmia tiettyjen ohjelmien kääntämisessä - version pystyy kuitenkin (yleensä) valitsemaan Java-kehitysympäristössä erikseen.
Muista asentaa JDK ladattuasi sen koneellesi. Asennus käynnistyy yleensä esimerkiksi tuplaklikkaamalla ladattua tiedostoa.
Kiinnitä huomiota mihin kansioon Java asennetaan.
**Huom!** Laita rasti kohtaan "Include Java in build path" (tai jokin vastaava), jos asennusohjelma tarjoaa tällaista.
# 2. Java-lähdekoodi
Java-ohjelma kirjoitetaan tekstitiedostoon, jonka pääte on .java. Tiedosto saa sisältää vain unicode-muotoista Java-lähdekoodia, ei mitään muuta.
Tiedostosta pitää löytyä sen nimen mukainen julkinen luokka. Jos meillä esimerkiksi olisi Java-lähdekooditiedosto `Esimerkki.java`, tiedostosta pitäisi löytyä julkinen luokka `Esimerkki`:
```java
public class Esimerkki {
// Luokan sisältö tässä
}
```
Vastaavasti tiedostosta `Opiskelija.java` pitäisi löytyä julkinen luokka `Opiskelija`:
```java
public class Opiskelija {
// Luokan sisältö tässä
}
```
## Lähdekoodi ja tavukoodi
Javan lähdekoodia ei voi suorittaa sellaisenaan. Sen sijaan lähdekoodi pitää kääntää *tavukoodiksi*, jota voidaan ajaa Javan virtuaalikoneessa (JVM, Java Virtual Machine).
Tämä tarkoittaa, että samoja Java-ohjelmia voidaan suorittaa missä tahansa ympäristössä, jolle löytyy tällainen virtuaalikone. Java lisäksi myös eräitä muita kieliä voidaan kääntää Javan tavukoodiksi. Esimerkkejä tällaisista kielistä ovat esimerkiksi [Scala](https://www.scala-lang.org/) ja [Kotlin](https://kotlinlang.org/).
Kuva 1 havainnollistaa asiaa:
<img src="img/kaannos.png" alt="Käännösprosessi lähdekoodista tavukoodiksi">
# 3. Kääntäminen ja suorittaminen komentoriviltä
Tarkastellaan seuraavaksi Java-ohjelman kääntämistä ja ajamista komentoriviltä.
Jos käytät Windows-konetta, voit asentaa valmiiksi Git-versionhallintatyökalun. Sen mukana tulee käyttökelpoinen komentorivityökalu Git Bash. Tätä tarvitaan joka tapauksessa tulevilla viikoilla.
[Gitin asennus](gitin_asennus.md)
Mac- ja Linux-koneista löytyy käyttökelpoinen komentorivityökalu jo valmiiksi, mutta toki voit asentaa myös näihin järjestelmiin Gitin valmiiksi.
## Java-tiedoston luominen
Niin kuin aiemmin todettiin, Java-lähdekoodi kirjoitetaan tekstitiedostoon. Tiedoston nimen pitää olla sama, kuin tiedostossa olevan julkisen luokan nimi (kirjainkokoa myöten).
Aloitetaan luomalla tällainen tiedosto.
1. Luo uusi kansio
2. Luo kansioon uusi tekstitiedosto komennolla
```unix
touch Esimerkki.java
```
3. Editoi tiedostoa haluamallasi editorilla. Esimerkiksi Visual Studio Code -editoriin tiedosto aukeaa komennolla
```unix
code Esimerkki.java
```
4. Kirjoita tiedostoon seuraava sisältö:
```java
public class Esimerkki {
public static void main(String[] args) {
System.out.println("Toimii!");
}
}
```
## Java-ohjelman kääntäminen tavukoodiksi
Java-ohjelma käännetään lähdekoodista tavukoodiksi komentoriviltä komennolla
```unix
javac <ohjelman_nimi.java>
```
5. Käännä esimerkkiohjelma komennolla
```unix
javac Esimerkki.java
```
Tämä luo samaan kansioon tiedoston nimeltä `Esimerkki.class`. Tämä tiedosto sisältää tavukoodiksi käännetyn Java-ohjelman, jonka virtuaalikone voi suorittaa.
<strong>Huom!</strong> Jos saat virheilmoituksen kääntämisen yhteydessä, varmista ensin että olet [asentanut Java](#1-javan-asennus). Jos Java on asennettu, ongelma voi Windowsissa johtua siitä, että CLASSPATH-ympäristömuuttuja on asentamatta. Ympäristömuuttujassa on tieto siitä, mistä Java koneella löytyy.
[Ohje CLASSPATH-ympäristömuuttujan asentamiseksi](classpath.md)
6. Nyt ohjelma voidaan ajaa komennolla
```unix
java <ohjelman_nimi>
```
Huomaa, että java-komennolle ei anneta tiedostopäätettä toisin kuin javac-komennolle. Esimerkkiohjelma siis ajetaan komennolla
```unix
java Esimerkki
```
Ohjelman pitäisi tulostaa
```
Toimii!
```
<img src="img/javac_java.png">
# 4. Komentoriviparametrit
Java-ohjelmalle voidaan suoritusvaiheessa välittää *komentoriviparametreja*. Nämä parametrit annetaan tavukoodia ajettaessa kirjoittamalla ne ohjelman nimen perään. Jos parametreja on enemmän kuin yksi, erotetaan parametrit toisistaan välilyönneillä.
Parametrit näkyvät main-metodin sisällä sen parametrinaan saamassa merkkijonotaulukossa, joka yleensä nimetään `args`-nimellä. Seuraava esimerkki siis olettaa, että se saa yhden parametrin ja tulostaa sen arvon:
```java
public class Esimerkki {
public static void main(String[] args) {
String arvo = args[0];
System.out.println("Parametrin arvo: " + arvo);
}
}
```
Käännetään ohjelma
```unix
javac Esimerkki.java
```
...ja ajetaan se sitten. Välitetään parametriksi merkkijono `Moikka!`:
```unix
java Esimerkki Moikka!
```
Nyt ohjelma tulostaa
```
Moikka!
```
Tarkastellaan vielä toista ohjelmaa, joka tulostaa kaikki saamansa parametrit ruudulle allekkain:
```java
public class Esimerkki {
public static void main(String[] args) {
// Iteroidaan parametritaulukko
for (String parametri : args) {
System.out.println("Parametri: " + parametri);
}
}
}
```
Käännetään taas ohjelma...
```unix
javac Esimerkki.java
```
...ja kokeillaan antaa sille useampi parametri:
```unix
java Esimerkki eka toka kolmas
```
Ohjelma tulostaa:
```
Parametri: eka
Parametri: toka
Parametri: kolmas
```
Suoritetaan ohjelma vielä uudestaan:
```unix
java Esimerkki nyt on aika monta parametria ohjelmalla
```
Ohjelma tulostaa:
```
Parametri: nyt
Parametri: on
Parametri: aika
Parametri: monta
Parametri: parametria
Parametri: ohjelmalla
```
# 5. Ohjelmointiympäristön asentaminen
Kurssilla käytetään ohjelmointiympäristöä, jonka nimi on IntelliJ IDEA. Voit ladata sen alta löytyvästä osoitteesta. Valitse ladattavaksi ilmainen *Community Edition*.
[Lataa ohjelmointiympäristö täältä](https://www.jetbrains.com/idea/download)
Latauksen jälkeen asenna ympäristö koneellesi.
Voit toki halutessasi käyttää myös jotain muuta ympäristöä (esim. Visual Studio Code tai Eclipse), mutta ohjeet ja kuvaruutukaappaukset koskevat IntelliJ:tä.
# 6. Ensimmäinen projekti
Käynnistä IntelliJ. Valitse **New Project**. Anna projektille nimi, muuten oletusasetukset riittävät. Voit kuitenkin tässä vaiheessa ottaa rastin pois kohdasta **Create Git repository** - tähän palataan tarkemmin kurssin tulevilla kerroilla:
<img src="img/new_project.png">
IntelliJ luo automaattisesti projektiin Main-nimisen luokan, joka kelpaa meille tässä vaiheessa mainiosti. Avaa luokka editoriin tuplaklikkaamalla sitä vasemman reunan navigointipalkista:
<img src="img/navigator.png">
Kirjoita esimerkiksi seuraava testikoodi (joku muukin Java-ohjelma käy tässä vaiheessa hyvin):
```java
public class Main {
public static void main(String[] args) {
for (int i=1; i<=10; i++) {
System.out.println("Tämä toimii!");
}
}
}
```
Ohjelman voi suoritaa valitsemalla **Run** --> **Run Main.java** tai painamalla *Shift + F10*. Suorituksen tuloksena ruudun alareunaan pitäisi ilmestyä konsoli, johon ohjelman tuloste tulee.
# 7. Koodin automaattinen täydentäminen
IntelliJ osaa useimpien muiden ohjelmointiympäristöjen tapaan täydentää automaattisesti koodia sitä kirjoitettaessa. Tämä tekee ohjelmien kirjoittamisesta nopeampaa ja sujuvampaa ja vähentää virheiden määrää.
Luo uusi projekti (**File** --> **New** --> **Project**) tai poista nykyisestä main-metodin sisältö.
Kirjoita alla oleva ohjelman alku editoriin. Huomaa, että kun aloitat kirjoittamaan sanaa `Scanner`, IntelliJ automaattisesti ehdottaa sitä kirjoitettavaksi:
```java
public static void main(String[] args) {
Scanner lukija = new Scanner(System.in);
}
```
<img src="img/autocomplete1.png">
Kun valitset `Scanner`-valinnan listasta, IntelliJ lisää automaattisesti rivin alkuun tarvittavan import-lauseen.
Jatketaan koodin kirjoittamista. Kirjoita seuraavalle riville sana `sout` ja paina *Tab* näppäintä. IntelliJ täydentää sen automaattisesti tulostuslauseeksi:
<img src="img/autocomplete2.png">
Kirjoita sitten ohjelma loppuun ja suorita se:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner lukija = new Scanner(System.in);
System.out.println("Kirjoita alle nimesi:");
String nimi = lukija.nextLine();
System.out.println("Moi vaan, " + nimi);
}
}
```
Huomaa, että ohjelmaa suoritettaessa sinun tulee klikata itse konsoli-ikkunaa, kun syötettä kysytään.
# 8. Käännösvirheet
IntelliJ merkitsee ohjelman käännösvirheet punaisella. Esimerkiksi:
<img src="img/virhe1.png">
Ohjelmassa on kirjoitettu muuttuja `luku` väärin. Käännösvirheet pääsääntöisesti estävät luokan suorittamisen. Tarkempaa tietoa virheestä saat viemällä hiiren virheellisen kohdan päälle:
<img src="img/virhe2.png">
# 9. Debuggaus IntelliJ:ssä
Debuggausta on käsitelty Pythonin osalta aiemmin [Ohjelmoinnin perusteiden demoissa](https://docs.google.com/document/d/1qCINS2Ktr8yHF8H5f6PFncGG0EQwXR0bJ9o91gU9YF8/edit?usp=sharing).
Samat perusperiaatteet esim. print-debuggauksen osalta toimivat myös Javassa.
Asetetaan ensin rivinumerot näkyviin: klikkaa hiiren kakkospainikkeella ohjelmankoodin vasenta reunaa ja valitse **Appearance** --> **Show Line Numbers**.
Tämän jälkeen kannattaa vielä asettaa ikonit näkyviin: klikkaa taas kakkospainikkeella jotain rivinumeroa, valitse **Appearance** --> **Configure Gutter Icons** --> Laita rasti kohtaan **Show gutter icons** --> **Ok**.
Nyt voit asettaa riville breakpointin klikkaamalla rivinumeron vasemmalla puolella olevaa tyhjää tilaa hiiren ykköspainikkeella.
Lataa [Gitlabista](koodit/) ohjelma `DebugEsimerkki.java`.
Asetetaan breakpoint riville 7:
<img src="img/debug1.png">
## Debuggauksen kontrollit
Käynnistä debuggaus joko valitsemalla **Run** --> **Debug 'DebugEsimerkki.java'** tai painamalla *CTRL + F9*.
Voit hypätä breakpointista toiseen painamalla debug-konsolin vasemman laidan vihreää nuolta:
<img src="img/debug2.png">
Huomaa, että debug-tilassa IntelliJ näyttää muuttujien arvot niin debug-konsolissa kuin ohjelmakoodissakin. Voit lopettaa debuggauksen joko suorittamalla ohjelman loppuun askel kerrallaan vihreästä nuolesta tai painamalla konsolista punaista neliötä.
# TEHTÄVÄT
Tehtävät ladataan Gitlabiin (tai Githubiin), ViLLEen palautetaan repositorioon osoittava linkki. **Muista varmistaa, että repositorio on julkinen!**
Tarvittaessa kertaa [versionhallinnan perusteet](https://docs.google.com/document/d/1XyH1h7rzRMcDpmDh00e2jcjsNdtxH96BicCif89HRk4/edit?usp=sharing) OhPen demoista.
## Tehtävä 1
Kirjoita Java-ohjelma, joka toimii komentoriviltä alla olevien esimerkkien mukaisesti:
```
javac Pisin.java
java Pisin yksi kaksi
Pisin parametri: kaksi
java Pisin auto mopo moottorikelkka sukset fillari
Pisin parametri: moottorikelkka
java Pisin aaaaa bbb c dddd
Pisin parametri: aaaaa
java Pisin
Ei parametreja
```
Palauta linkki Java-ohjelmaan (eli linkki tiedostoon `Pisin.java`), ei tavukoodiksi käännettyä luokkaa!
## Tehtävä 2
Lataa [Gitlabista](koodit/) ohjelma `KorjaaMinut.java`. Ohjelmassa on lukuisia käännösvirheitä ja myös eräitä loogisia virheitä.
Korjaa ohjelma toimintakuntoiseksi ja palauta ViLLEen linkki ohjelman korjattuun versioon. Kannattaa hyödyntää korjaamisessa debuggeria!
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment