Ohjelmointi 1
Tämä on Jyväskylän yliopiston järjestämän ITKP102 Ohjelmointi 1 -opintojakson oppimateriaali.
Tervetuloa opiskelemaan ohjelmointia! 😍
Tällä opintojaksolla käsitellään ohjelmoinnin perusteita C#-kielellä. Opintojaksolla opit
- rakenteisen ohjelmoinnin perusperiaatteita,
- ratkaisemaan yksinkertaisia ongelmia sopivilla algoritmeilla ja tietorakenteilla,
- suunnittelemaan ja toteuttamaan pienimuotoisen pelin C#-kielellä ja siihen tarkoitetuilla työkaluilla.
Et tarvitse aiempaa ohjelmointikokemusta.
Miten aloitan?
Ennen kuin aloitat opintojakson suorittamisen,
- tutustu opintojakson suorittamisen periaatteisiin (ks. Suorittaminen),
- suosittelemme lämpimästi, että asennat valmiiksi tarvittavat ohjelmistot ja työkalut (ks. Työkalut). Voit kuitenkin selailla materiaalia jo ennen työkalujen asentamista,
- pyydämme, että käyt vastaamassa alkukyselyyn.
Navigointi tässä materiaalissa
Tässä muutama pikavinkki tässä materiaalissa navigoimiseen:
- Sisällysluettelon saat auki ja kiinni sivupalkki-kuvakkeesta .
- Voit selata materiaalia eteen- ja taaksepäin nuolikuvakkeista sivun vasemmassa ja oikeassa laidassa (tai ihan sivun alalaidassa, jos käytät mobiililaitetta) .
- Hakutoiminnon saat auki suurennuslasista oikeasta yläreunasta tai painamalla S-kirjainta näppäimistöltä .
Haluatko ehdottaa parannuksia tähän materiaaliin?
Jos löydät virheitä tai haluat antaa parannusehdotuksen, voit tehdä korjausehdotuksen GitHubin kautta seuraavasti:
- Kirjaudu GitHubiin (käyttäjätunnus vaaditaan),
- Klikkaa sivun alareunassa olevaa "Ehdota parannusta materiaaliin"-linkkiä, joka vie sinut tämän materiaalin lähdekoodiin,
- Tee haluamasi muutokset GitHubissa, ja tallenna ne.
- Esittämäsi muutos ehdotetaan tarkistettavaksi materiaalin ylläpitäjille, jotka hyväksyvät tai hylkäävät ehdotuksesi.
Voit antaa palautetta myös perinteisesti sähköpostitse osoitteessa ohj1-opet@tim.jyu.fi. Otamme mielellämme vastaan parannusehdotuksia!
Suorittaminen
Suorituksen voi saada kahdella tavalla, ja arvosana määräytyy valitun tavan mukaan. Näet suoritustapojen vaatimukset alta klikkaamalla.
todo
Korjaa linkit!
| Suoritustapa 1 | Suoritustapa 2 |
|---|---|
| teet ja palautat kaikki pakolliset harjoitustehtävät (ns. "tähtitehtävät") | teet ja palautat kaikki pakolliset harjoitustehtävät (ns. "tähtitehtävät") |
| keräät yhteensä vähintään 27 pistettä harjoitustehtävistä | keräät vähintään 5 pistettä jokaiselta harjoitustehtäväviikolta |
| suoritat debuggausnäytteen hyväksytysti | suoritat debuggausnäytteen hyväksytysti |
| suoritat harjoitustyön hyväksytysti | suoritat harjoitustyön hyväksytysti |
| osallistut tenttiin | ei tenttiä |
| Arvosana välillä 1-5 | Arvosana 1 |
Arvosana määräytyy tenttipisteistä, joita voi korottaa harjoitustehtävistä saatavilla hyvityspisteillä.
varoitus
Suoritustapa 2 ei sovellu välttämättä sinulle, jos tavoitteenasi on hakea opiskelupaikkaa avoimen väylän kautta. Tarkista huolellisesti hakukohteesi valintaperusteet.
Näet keräämäsi viikkotehtävien pisteet ja muut osasuoritusten edistymiset Eteneminen-sivulla.
Kaikkien suoritusten tekemisessä on noudatettava akateemista rehellisyyttä.
Mikäli sairauden tai muun hyvän syyn vuoksi et pysty tekemään jotain osasuoritusta, ilmoita siitä heti opettajalle.
Harjoitustehtävät
Kunkin osan päätteeksi on mainittu siihen osaan liittyvät harjoitustehtävät. Harjoitustehtävien tekemiseen saa apua pääteohjauksissa; ks. ajat etusivulta. Harjoitustehtävät ovat erinomainen mahdollisuus oppia asioita omakohtaisesti. Tehtävät ovat automaattisesti arvosteltuja ellei toisin mainita.
T- eli ydintehtävät sisältävät osaamistavoitteiden kannalta keskeiset asiat,V- eli visuaaliset tehtävät ovat kertausta ja harjoittelua visualisoinneilla ja simulaattoreilla,B- eli bonustehtävät ovat lisätehtäviä, jotka vaativat hieman enemmän vaivaa,G- eli gurutehtävät ovat edistyneitä lisätehtäviä, jotka ylittävät osaamistavoitteet ja saattavat vaatia itsenäistä lisäopiskelua.
Jokaisesta valmiiksi tehdystä tehtävästä saa yhden pisteen, ellei erikseen toisin mainita. Näet maksimipistemäärän aina tehtävän yhteydessä.
Muista tarkistaa, että viimeisin saamasi pistemäärä on oikein. Tehtävien vastausten lukumäärää ei ole rajoitettu. Pisteet lasketaan aina viimeisimmän tallennuksen tai ajon mukaan.
Tehtävien aikataulurajoitukset ja mallivastauskäytänteet vaihtelevat opiskelijaryhmittäin seuraavasti:
| JY tutkinto-opiskelijat | Lukiolinjalaiset | Avoin yliopisto | |
|---|---|---|---|
| Tehtävien deadline | Vastuuopettajan määrittämät. Näkyy TIMissä kunkin tehtävän kohdalla. | Oman opettajasi määrittämät. Näkyy TIMissä kunkin tehtävän kohdalla. | Ei deadlineja -- vain opiskeluoikeutesi rajoittama. |
| Mallivastaukset | Mallivastaus avataan deadlinen jälkeen. Mallivastauksen saa auki kunkin tehtävän kohdalla Näytä mallivastaus -painikkeella. | Tehtävän mallivastauksen saa auki käyttämällä Näytä mallivastaus -painiketta.
Mallivastauksen avaaminen lukitsee tehtävän, eikä avaamisen jälkeen annettuja vastauksia enää lasketa. |
|
Mallivastauksia voivat katsoa vain opintojaksolle ilmoittautuneet opiskelijat.
todo
Pitäisikö palautustilaisuuksista sanoa tässä kohden jotain? Vanhaa tekstiä...: Demoihin osallistuminen on suositeltavaa, mutta ei pakollista. Demoista tehdään tallenteet, jotka voi katsoa jälkikäteen. Palautustilaisuuksien aikataulu näkyy opintojakson etusivulla.
Ohjelmatehtävät tehdään Riderissa tai suoraan TIMissä. Heti kun Rideria opitaan käyttämään, kannattaa ohjelmatehtävät pääsääntöisesti tehdä ko. työkalulla. Tehtävien vastaukset palautetaan aina TIM-järjestelmään.
Hyvitykset tenttiin
Tekemällä harjoitustehtäviä kerrytät hyvityspisteitä tenttiin seuraavasti:
| min. hyväksiluettuja tehtäväpisteitä | Hyvityspisteitä |
|---|
Kultakin harjoitustehtäväkerralta hyväksiluetaan enintään demo_max_points_cap pistettä. Toisin sanoin, vaikka saisit joltain harjoitustehtäväkerralla kerättyä lisätehtävillä enemmänkin pisteitä, hyväksiluetaan siitä vain demo_max_points_cap pistettä.
Hyvityspisteet lasketaan suoraan tenttipisteisiin ennen tenttiarvosanan laskemista. Hyvityspisteet pätevät kaikkiin opintojakson tenttikertoihin.
Lisätietoja hyvityspisterajoista kiinnostuneille
Hyvityspisteiden laskennassa harjoitustehtäväkerroista tehdään seuraavat oletukset:
- Harjoitustehtäväkertoja () on yhteensä
- Yhdessä harjoitustehtäväkerrassa ydintehtävistä keskimääräinen pistemäärä () on pistettä
- Suurimman hyvityspistemäärän (90 % kaikista ydintehtävien pisteistä pyöristettynä ylöspäin lähimpään kokonaislukuun
- Pienimmän hyvityspistemäärän () saa keräämällä demo_min_percentage %demo_expected_mean_pointsN_{\text{d}} \cdot \hat{p}{\text{d}} = demos_count * demo_expected_mean_points\left\lceil \frac{ demo_min_percentage }{100} \cdot N{\text{d}} \cdot \hat{p}_{\text{d}} \right\rceil = (demo_min_percentage/100demo_expected_mean_pointsdemos_count)|round(0, "ceil")\dfrac{90 % - demo_min_percentage %}{H_{\text{max}} - H_{\text{min}}} = (100-demo_min_percentage)/max_demo_hyvitys %H \in {1,\ldots,max_demo_hyvitys}$ pistettä.
Yllä oleva taulukko lasketaan tämän kaavan avulla.
Tehtävien muutos- ja päivityskäytänteet
Opintojaksolla ei ole erillisiä "vuosiversioita", vaan samat materiaalit ovat käytettävissä kaikissa toteutuksissa. Opintojakson materiaaleja ja harjoitustehtäviä päivitetään 1–2 kertaa vuodessa.
Useimmiten päivitykset ovat pieniä, kuten kirjastojen versiopäivityksiä ja tekstien selkeyden parannuksia. Ajoittain voidaan kuitenkin tehdä myös suurempia muutoksia, esimerkiksi poistaa tehtäviä tai lisätä uusia.
Muutoksista huolimatta kaikki jo kerätyt harjoitustehtäväpisteet pysyvät voimassa, ja opintojakson suorittamista voi jatkaa normaalisti päivityksistä välittämättä. Myös opintojakson suoritusehdot pysyvät samoina muutoksista riippumatta.
Akateeminen rehellisyys
Tänne juttua.
Ohjelmointi 1 -kurssin työkalut
Harjoitustehtävien ja harjoitustyön tekemiseen käytämme seuraavia työkaluja:
- .NET - ohjelmistoviitekehys (engl. framework) sekä ajonaikainen ympäristö (engl. runtime) C kielelle. .NET mahdollistaa C ohjelmien kääntämisen ja ajamisen. Se tarjoaa myös valmista koodia yleisempiin käyttötarkoituksiin (esim. tekstin tulostaminen näytölle, käyttöliittymien tekeminen).
- Git - versiohallintaohjelma (engl. Version Control Software, VCS), joka mahdollistaa koodin versioinnin ja yhteistyön koodaajien välillä. Vähän kuin Google Docsin muokkaushistoria, mutta koodaamiseen tarkoitettu.
- JetBrains Rider - integroitu kehitysympäristö (engl. Integrated Development Environment, IDE). IDE sisältää oleellisimmat toiminnot ohjelmien tekemiseen (koodin muokkaus, kääntäminen, ajaminen). Rider on erityisesti .NET ja C ohjelmille tarkoitettu IDE.
- Tekstieditori - jokin kevyt tekstieditori, jolla tekstipohjaisia tiedostoja (esim. koodi) voi muokata avaamatta IDE-ohjelmistoa. Suosittelemme esimerkiksi Visual Studio Code tai Notepad++. Microsoft Word tai Google Docs ei ole opintojaksolle soveltuva tekstieditori.
- JyPeli - pelimoottori (engl. game engine), joka on Jyväskylän yliopistossa kehitetty C kirjasto pelien tekemiseen.
- ComTest - yksikkötestigeneraattori (engl. unit test generator), joka on aputyökalu, jonka avulla kirjoitetulle koodille voi kirjoittaa testejä helposti luettavalla merkintätavalla.
Tässä dokumentissa käydään läpi yllä olevien työkalujen ja ohjelmien asentamista.
Yllä olevat ohjelmat ovat valmiiksi asennettuna Agoran mikroluokissa. Suosittelemme, että asennat ohjelmat lisäksi niille tietokoneille, joilla aiot suorittaa opintojakson. Erityisesti harjoitustyön tekeminen pääteohjausten ulkopuolella on helpompaa, kun kaikki tarvittavat ohjelmat on myös omalla tietokoneella.
Ennen asentamista
Käyttöjärjestelmä ja vaatimukset
Tällä sivulla olevat ohjeet riippuvat käyttöjärjestelmästä. Valitse käyttöjärjestelmä alta.
Windows
Valitsit Microsfot Windows -käyttöjärjestelmän. Alla olevat ohjeet on testattu seuraavilla käyttöjärjestelmillä:
- Windows 11
- Windows 10
Pikakurssi komentorivin käyttöön
Tämän sivun asennusohjeet vaativat komentorivin avaamista ja käyttöä.
Opintojaksolla komentorivin käyttöä käsitellään tarkemmin opintojakson aikana; jos luet nämä ohjeet aivan opintojakson alussa, komentorivi saattaa kuulostaa vielä hämärältä asialta.
Jos et ikinä ennen käyttänyt komentoriviä, katso pikainen johdatus komentorivin käyttöön alta.
Pikainen johdatus komentorivin käyttöön (Avaa klikkaamalla)
Mikä on komentorivi?
Komentorivi (engl. command line) tai pääte (engl. terminal) on (tämän ohjeen puitteissa) tietokoneohjelma, jolla tietokonetta voi ohjata tekstillä. Esimerkiksi, kun Windowsissa jonkun kansion sisällön katsominen onnistuu graafisesti avaamalla Resurssinhallinta (tai macOS:lla vastaavasti Finder), sama asia onnistuu komentorivillä kirjoittamalla komento (engl. command), joka tulostaa näkyviin kansion sisällön.
Komentorivillä työskentely on yleistä ohjelmoinnin yhteydessä. Syitä on monia, eikä niitä tässä käsitellä. Tämän ohjeen kannalta olennainen syy on, että yleisten ohjelmien asentaminen onnistuu nykyään jopa helpommin komentorivillä kuin "käsin" etismällä sopiva asennusohjelma verkosta.
Miten avaan komentoriviin omalla tietokoneellani?
Toimintatapa vaihtelee eri käyttöjärjestelmillä. Samalla käyttöjärjestelmällä voi olla myös useita komentoriviohjelmia. Alla olevilla ohjeilla saata ainakin kaikki tarvittavat työkalut asennettua.
Windows
- Paina Käynnistä-painikkeen vieressä olevaa Haku-ikonia
- Kirjoita hakupalkkiin PowerShell
- Valitse löytyvistä tuloksista Windows PowerShell
Tämä avaa PowerShell-komentorivin, joka on eräs Windowsilla oleva komentorivipääte.
Miten käytän komentoriviä?
Kun näet tällä sivulla alla olevan tapaisen laatikon:
ls
Tulee sinun kirjoittaa laatikossa oleva komento ja suorittaa se komentorivillä. Toimi seuraavasti:
- Klikkaa komentorivi aktiiviseksi ikkunaksi ellei se ole jo.
- Kirjoita laatikossa oleva komento komentoriviin näppäimistöllä.
- Tarkista, että kirjoitit komennon täysin oikein. Huomaa, että kirjainkoolla, välilyönneillä ja muilla merkeillä on merkitystä komennon kannalta!
- Kun olet varmistanut, että kirjoitit komennon oikein, paina Enter-näppäintä.
Riippuen komennosta komentoriviin voi ilmestyä tuloste, virhe tai ei mitään. Jotkin ohjelmat eivät tulosta mitään tekstiä onnistumisen merkiksi. Kun komennon suoritus on valmis, komentorivin uudelle riville ilmestyy uusi komentokehote.
Kokeile kirjoittaa ja suorittaa yllä oleva esimerkkikomento.
Komento listaa hakemistossa olevien tiedostojen ja kansioiden nimiä (ls on lyhenne sanalle "list").
Kun tällä sivulla näet laatikon, jossa on useita rivejä, kuten
echo "Kissa"
ls
Toimi seuraavasti:
- Tee yllä mainitut vaiheet 1-4 vain ensimmäisellä rivillä olevalle komennolle (eli tässä
echo "Kissa") - Tee yllä mainitut vaiheet 1-4 vain toisella rivillä olevalle komennolle (eli
ls) - Jatka rivien suorittamista kunnes olet suorittanut kaikki laatikossa olevat rivit
Toisin sanoen, tällä sivulla jokainen yksittäinen komento on aseteltu omalle rivilleen. Tarkoitus on, että suoritat jokaisen rivin yksi kerrallaan siinä järjestyksessä, jossa ne on laatikossa kirjoitettu.
Kokeile kirjoittaa ja suorittaa yllä olevassa laatikossa olevat komennot. Kirjoita ja suorita ensin komento echo "Kissa" ja sen jälkeen komento ls. Muista, että tietokone suorittaa komennon vasta, kun painat Enter-painiketta.
Voinko kopioida komentoja kirjoittamisen sijaan?
Kyllä voit. Tällä ohjesivulla komentojen kopiointi onnistuu klikkaamalla kopioitavasta komennosta
kerran ja painamalla Ctrl+C (Windows, Linux) tai Command+C (macOS).
Komennon liittäminen komentoriville riippuu käyttöjärjestelmästä:
- Windows: Valitse PowerShell-komentorivi aktiiviseksi ja paina
Ctrl+V(tai klikkaa hiiren oikea painike) - macOS: Valitse Pääte aktiiviseksi ja paina
Command+V - Linux: Valitse komentorivi aktiiviseksi ja paina
Ctrl+Shift+VTAIShift+Insert. Tarkista pääteohjelmasi ohjeista oikea näppäinoikotie
varoitus
Älä ikinä kopioi ja liitä komentoriville mitään komentoja, joihin et luota etkä tiedä, mitä ne oikeasti tekevät. Komentorivien komennot ovat usein peruuttamattomia: jos vahingossa poistat jonkun tiedoston, poisto on usein lopullinen eikä sitä voi peruuttaa. Esimerkiksi tekoälyn ehdottamiin komentoihin tulee suhtautua aina varauksella. Tällä sivulla mainitut komennot on testattu toimivaksi ja turvalliseksi vastuuopettajan toimesta.
Asennusohjeet tekstinä
Valmistelu
Windows
-
Varmista, että tietokoneesi on ajan tasalla (Windows Update:ssa ei uusia päivityksiä) tai että näytönohjaimen ajurit ovat asennettu.
-
Avaa PowerShell-komentorivi (Haku-ikoni → Kirjoita PowerShell → Windows PowerShell).
-
Kokeile, että
winget-komento on asennettu ja toimii. Suorita seuraava komento:winget -vTuloksena pitäisi tulostua
winget-työkalun versio. Jos sen sijaan saat virheen, jossa lukee 'winget' is not recognized as the name of a cmdlet, function, script file, or operable program, tarkoittaa tämä, että sinulla todennäköisesti ei olewinget-työkalua asennettuna. Kokeile siinä tapauksessa seuraavat ratkaisut:- Tarkista, että käyttöjärjestelmäsi on ajan tasalla
- Kokeile ladata ja asentaa
winget-käsin: Lataa asennusohjelma Asennuksen jälkeen sulje ja käynnistä PowerShell uudelleen.
.NET
Windows
-
Avaa PowerShell-komentorivi ellei se ole jo
-
Suorita alla oleva komento
winget install -e --id=Microsoft.DotNet.SDK.%%dotnet_major_version%%Odota komennon suorittamista loppuun ja anna tarvittaessa asennusoikeus. Jos näet komentorivillä kysymyksen, kuten:
Do you agree to all the source agreements terms? [Y] Yes [N] No:Paina komentorivillä
y-näppäintä ja sen jälkeenEnter-näppäintä.Tarkista lopuksi, että komentorivillä olevassa tulosteessa on teksti
Successfully installed. -
Sulje kaikki auki olevat komentorivit ja avaa uusi PowerShell-komentorivi
-
Testaa, että .NET on asennettu suorittamalla komento:
dotnet --list-sdksJos asennus onnistui, näet seuraavanlaisen tulosteen:
%%dotnet_major_version%%.0.XXX [C:\Program Files\dotnet\sdk]Huomaa, että
XXXon joku numero; olennaista, että versiona lukee%%dotnet_major_version%%.0ja että virhettä ei tule.
Git
Windows
-
Avaa PowerShell-komentorivi ellei se ole jo
-
Asenna Git for Windows suorittamalla alla oleva komento:
winget install -e --id=Git.Git --custom '/COMPONENTS="ext,ext\shellhere,ext\guihere"'Odota komennon suorittamista loppuun ja anna tarvittaessa asennusoikeus. Jos näet komentorivillä kysymyksen, kuten:
Do you agree to all the source agreements terms? [Y] Yes [N] No:Paina komentorivillä
y-näppäintä ja sen jälkeenEnter-näppäintä.Tarkista lopuksi, että komentorivillä olevassa tulosteessa on teksti
Successfully installed. -
Sulje kaikki auki olevat komentorivit ja avaa uusi PowerShell-komentorivi
-
Testaa, että
git-komento on asennettu suorittamalla komento:git --versionJos asennus onnistui, näet seuraavanlaisen tulosteen:
git version X.XX.XXTekstin
X.XX.XXtilalla näkyy git-työkalun tarkka versio. -
Testaa, vielä, että Git Bash on asennettu. Mene Haku-ikoni → Kirjoita Git Bash → Valitse Git Bash.
Jos kaikki toimii, pitäisi avautua Git Bash -komentorivi:

JetBrains Rider
Windows
-
Avaa PowerShell-komentorivi ellei se ole jo
-
Asenna JetBrains Rider suorittamalla alla oleva komento:
winget install --interactive -e --id=JetBrains.RiderOhjelman lataamisen jälkeen avautuu asennusohjelma. Etene asennusohjelmassa eteenpäin Next-painikkeella. Kohdassa Installation Options valitse seuraavat ruksit päälle:
- Add "Open Folder as Project"
- Install JetBrains ETW Host Service
- Add Rider executables to Microsoft Defender exclusions
- Create Associations: .sln, .cs, .csproj Etene asennusohjelmassa ja anna ohjelman asentua.
-
Kun pääset asennusohjelman loppuun, valitse Run JetBrains Rider ja paina Finish. Testaa, että ohjelma toimii.
Ensimmäisellä kerralla käynnistys saattaa kestää, sillä järjestelmä tarkistaa sovelluksen. Järjestelmä saattaa myös kysyä, Rider on internetsitä ladattu appi. Avataanko se?. Siinä tapauksessa voi valita Avaa.
Hyväksy mahdolliset Riderin käyttöehdot.
-
Kun JetBrains Rider kysyy lisenssiä, valitse Free Non-Commercial License.
-
Valitse Register-linkki ja rekisteröidy JetBrains-käyttäjäksi. Valitse Continue with email ja tee itsellesi tunnus.
-
Kun olet rekisteröitynyt, avaa Rider ja valitse Log in for Non-Commercial License.
Kun olet kirjautunut, hyväksy vielä lisenssin ehdot ja valitse Start Non-Commercial license.
-
Suorita asetusten asettaminen loppuun. Suositellut asetukset:
- Teema: Valitse haluamasi teema
- Näppäimistöasettelu: Suosittelemme vaihtoehdot Visual Studio tai VS Code
- Pluginit: valitse Continue without Plugins
-
Kun olet valmis ja pääset Welcome to JetBrains Rider -ikkunaan, voit sulkea sen. Ohjelman asennus on valmis!
Tekstieditori
Tälle opintojaksolle riittää mikä tahansa tekstieditori, joka ei ole toimistosovellus, eli ei Google Docs, Microsoft Word, tai muu asiakirjojen laadintaan tarkoitettu sovlelus. Vaihtoehtoja on monta. Ihmisillä on hyvin erilaisia preferenssejä tekstieditorien suhteen, joten kannattaa kokeilla erilaisia vaihtoehtoja ja valita itselle mieluisin.
Koska jokin tekstieditori täytyy valita, käytämme tässä ohjeessa Visual Studio Codea (VS Code). Se on suosittu, ilmainen, ja monipuolinen tekstieditori, jota voi laajentaa monin tavoin, jopa IDE-tasoiseksi työkaluksi lisäosien avulla. Jos haluat käyttää jotain muuta tekstieditoria, voit toki tehdä niin, mutta ohjeet on kirjoitettu VS Coden käyttöä ajatellen.
Windows
-
Avaa PowerShell-komentorivi ellei se ole jo
-
Asenna VS Code suorittamalla seuraava komento:
winget install -e --id=Microsoft.VisualStudioCode --override '/SILENT /mergetasks="!runcode,addcontextmenufiles,addcontextmenufolders"'Odota komennon suorittamista loppuun ja anna tarvittaessa asennusoikeus. Jos näet komentorivillä kysymyksen, kuten:
Do you agree to all the source agreements terms? [Y] Yes [N] No:Paina komentorivillä
y-näppäintä ja sen jälkeenEnter-näppäintä.Tarkista lopuksi, että komentorivillä olevassa tulosteessa on teksti
Successfully installed. -
Sulje kaikki auki olevat komentorivit ja avaa uusi PowerShell-komentorivi
-
Kokeile käynnistää VS Code suorittamalla komento:
codeJos VS Code avautuu, olet onnistuneesti asentanut sen! Jatkossa pääset VS Codeen myös klikkaamalla käynnistä-palkin Hae-ikonia → Kirjoita Visual Studio Code → Valitse Visual Studio Code.
JyPeli
-
Avaa käyttöjärjestelmäsi komentorivi (PowerShell, Pääte tai vastaava).
-
Asenna JyPeli-projektipohjat (engl. templates) suorittamalla alla oleva komento:
dotnet new install Jypeli.TemplatesKun asennus on valmis, näet jotakin tekstiä mallia:
Success: Jypeli.Templates installed the following templates: -
Kokeile, että JyPeli toimii luomalla tasohyppelypeliprojekti ja suorittamalla se. Suorita alla olevat komennot (huom: yhteensä neljä komentoa):
cd ~dotnet new Tasohyppelypeli -o TasohyppelypeliTesticd TasohyppelypeliTestidotnet runErityisesti viimeisen komennon suorittaminen voi hieman kestää. Komennot tekevät seuraavat asiat:
- Komento 1 muuttaa aktiivisen hakemiston kotihakemistoksi
- Komento 2 tekee uuden C#-projektin, jonka pohja otetaan JyPeli tasohyppelypeliesimerkistä
- Komento 3 siirtää komentorivin projektikansion sisälle
- Komento 4 kääntää ja käynnistää pelin. Tuloksena pitäisi avautua pelattava tasohyppelypeli.
Voit kokeilla peliä tai sulkea sen.
ComTest
ComTest on Riderin lisäosa, jonka avulla tällä opintojaksolla kirjoitetaan yksikkötestejä.
- Avaa JetBrains Rider ja odota, kunnes pääset Welcome to JetBrains Rider -näkymään
- Klikkaa ikkunan vasemmassa alalaidassa oleva Configure → Plugins
- Valitse Marketplace-välilehti ja hae hakusanalla
ComTest - Valitse Comtest Runner -pluginin kohdalta Install

- Paina Save
- Sulje JetBrains Rider
Mitä seuraavaksi?
Onneksi olkoon! Asennettujen työkalujen käyttöä käydään läpi luennoilla sekä materiaalin luvussa 1.2 Ohjelmointiympäristö kuntoon. TODO: Lisää linkki.
Jos olet tutkinto-opiskelija, sinulla on oikeus hankkia JetBrains Student Pack, joka sisältää käyttöoikeuden kaikkiin JetBrains IDE-ohjelmiin. Tällä opintojaksolla Riderin Non-commercial license -lisenssi riittää, mutta erityisesti ohjelmoinnista kiinnostuneelle Student Packista voi olla hyötyä myöhemmissä opinnoissa.
Ongelmatilanteita ja niiden ratkaisuja
Alla on lueteltu joitain yleisimpiä ongelmatilanteita, joita asennuksen tai työkalujen käytön yhteydessä voi tulla vastaan. Jos löydät ongelman, jota ei ole listattu alla,
TODO: Lisää linkit.
- tule pääteohjauksiin (ajat ja paikat löytyvät kotisivulta),
- laita viestiä Teamsissa (Kysymyksiä ja apua -kanava) tai
- laita viestiä opettajille: ohj1-opet@tim.jyu.fi.
Silk.NET.Core.Loader.SymbolLoadingException' occurred in Silk.NET.Core.dll: 'Native symbol not found (Symbol: glfwWindowHintString)
Yllä olevan virheviestin syynä on todennäköisimmin että sinulla ei ole GLFW asennettuna, tai se on liian vanha. Monen Linux-distron mukana tulee versio 3.2, mutta Jypeli vaatii vähintään version 3.3.
Asenna uusin GLFW-versio käyttämäsi paketinhallinnan avulla.
System.PlatformNotSupportedException: GLFW is not supported on this platform...
Voi olla että tietokoneellasi ei ole näytönohjaimen ajureita asennettuna. Mene Windowsin asetukset -> Päivitykset -> Valinnaiset (päivitä-nappulan alapuolella) -> Ajurit. Asenna sieltä jotenkin näyttöön liittyvä ajuri, esimerkiksi "Intel Display Driver"
Jos ajuria ei löydy ja käytät kannettavaa, todennäköisesti sinulla on integroitu
näytöonohjain, jolloin ajuri voi löytyä prosessorin
valmistajan (Intel tai AMD) sivulta. Hae ajurit Googlesta esimerkiksi hakusanalla
Intel graphics driver tai AMD graphics driver prosessorin valmistajasta riippuen.
Seuraavista työkaluista voi olla hyötyä:
Rider pyytää asentamaan .NETia vaikka olen asentanut sen jo
Voi olla, että Rider ei löydä oikeaa .NET-versiota.
Kokeile seuraavaa:
-
Avaa Rider aloitusnäkymä (jos Rider on auki, laita se kiinni ja avaa uudelleen).
-
Avaa asetukset menemällä Configure (vasemmassa alalaidassa) → Settings
-
Mene kohtaan Build, Execution, Deployment → Toolset and Build
-
Klikkaa kohdan .NET CLI executable path -kentän alasvetovalikkoa:

Jos alasvetovalikon listassa näkyy useampi vaihtoehto, kokeile valita jotain toista vaihtoehtoa kuin nykyinen arvo. Paina lopuksi Save ja kokeile luoda uusi solution. Jos virhe toistuu, kokeile jotain toista valintaa.
Rider on hidas tai antaa erilaisia oikeusvirheitä
Erityisesti Windows-laitteilla Rider tai C#-ohjelmien ajaminen voi olla hidasta haittaohjelmien torjuntaohjelman erityisen tiukkojen tarkistusääntöjen vuoksi.
Mikäli sinulla on käytössä Microsoft Defender, Rider yleensä kysyy, haluatko Riderin säätävän sen asetukset automaattisesti. Muiden tuotteiden tapauksessa asetukset tulee säätää itse.
Katso Riderin viralliset toimintaohjeet haittaohjelmien torjuntaohjelmien säätämiseksi.
Rider-lisenssin uudelleenaktivointi
Lisenssi täytyy mahdollisesti aika ajoin uudelleenaktivoida kohdasta Help -> Manage licenses -> Activate.
dotnet not found / command not found: dotnet
Katso .NET-asennusohjeet Työkalut-ohjeesta.
A fatal error occurred. The folder [/usr/share/dotnet/host/fxr] does not exist
Jos komentoriviltä tulee (Linux):
A fatal error occurred. The folder [/usr/share/dotnet/host/fxr] does not exist
Näppäinkomennot eivät toimi
Jotkin editorin näppäinoikotiet ei toimi sellaisenaan muilla kuin
Yhdysvaltalaisilla näppäimistöillä. On siis tarpeen valita toimimattomille
suosikkikomennoillesi uudet näppäinoikotiet asetuksista:
File → Settings → Keymap → Editor actions.
Git-versiohallinta
Ohjeet Ohjelmointi 1 -opintojaksolle
Tässä dokumentissa kerrotaan miten harjoitustyön suunnitelmaa, lähdekoodia sekä muita tiedostoja (mm. kuvat) käsitellään Git-versiohallinnan avulla Ohjelmointi 1 -opintojaksolla.
Ohje on pitkän puoleinen, mutta on tärkeää, että luet sen huolellisesti. Git-versiohallinnan käyttö on olennainen osa ohjelmistokehitystä, ja sen perusteiden ymmärtäminen on tärkeää paitsi tällä opintojaksolla, myös myöhemmissä opinnoissa ja työelämässä.
varoitus
Jos olet Jyväskylän yliopiston opiskelija, sinun tulee tietää JY-käyttäjätunnuksesi
jotta voit käyttää gitlab.jyu.fi-palvelua. Varmista, että tiedät käyttäjätunnuksesi,
ja kirjoita se muistiin ennen kuin aloitat tämän ohjeen seuraamisen. Tässä
ohjeessa viitataan toistuvasti käyttäjätunnukseen tunnisteella kayttajatunnus.
Korvaa tämä aina omalla käyttäjätunnuksellasi.
Ennen kuin aloitat
Asenna kehitystyökalut ja Git-versiohallinta, ellet ole vielä tehnyt niin.
Mikä Git on?
Git on ohjelmisto, jolla voidaan toteuttaa tiedostojen versiohallintaa. Ohjelmistotyössä on erityisen tärkeää, että jokainen ohjelmistoon tehty muutos versioidaan selkeästi. Versiohallinnan käyttäminen yhteistyöskentelyyn ja muutosten jäljittämiseen on normi niin teollisessa ohjelmistotuotannossa, vapaan/avoimen lähdekoodin projekteissa kuin myös monien harrastajien henkilökohtaisissa töissä.
Versiohallinta mahdollistaa myös saman koodin parissa työskentelyn eri tietokoneilta, mikä sopii hyvin tälle kurssille, koska usein tehdään töitä eri tietokoneilta (mikroluokka, kotikone, jne.). Toisaalta versiohallinta toimii myös varmuuskopiona työllesi. Näin koodisi ei häviä, vaikka tietokoneesi hajoaisi.
Git-varasto (engl. repository) sisältää sekä kooditiedostot että koko projektin muokkaushistorian. GitLab ja GitHub ovat eräitä suosittuja internetissä toimivia palveluita, joissa Git-varastoja voidaan säilyttää.
Tällä kurssilla emme käytä Dropboxia, muistitikkuja, sähköpostia tai vastaavia palveluita kooditiedostojen jakamiseen, koska ne eivät sovellu todelliseen yhteistyöskentelyyn. Vaikka työskentelisitkin yksin, käytä versiohallintaa ohjaajien työn helpottamiseksi sekä harjoitustyön esittelyn mahdollistamiseksi.
Voit hyödyntää versiohallintaa opinnoissa muutenkin, esimerkiksi tutkielmien kirjoittamisessa.
Miten saan Gitin auki?
Git on komentoriviohjelma, eli sitä ei varsinaisesti avata vaan käytetään komentoriviltä. Gitille on tarjolla myös graafisia käyttöliittymä (ks. Luku 11. Tapoja käyttää Gitiä), jotka käytännössä suorittavat tarvittavia komentorivikomentoja puolestasi. Ohjelmointi 1 -kurssilla harjoittelemme käyttämään Gitiä komentoriviltä nk. bash-komentokehotteesta.
Valitse alta käyttöjärjestelmäsi mukainen käyttötapa.
Windows
- Asenna Git-työkalu mikäli et ole vielä tehnyt niin!
- Paina Käynnistä-painikkeen vieressä olevaa Haku-ikonia
- Kirjoita hakupalkkiin git bash
- Valitse löytyvistä tuloksista Git Bash

Tuloksena pitäisi avautua seuraava bash-komentorivipääte:

Voit testata, että git-työkalu löytyy suorittamalla komento
git --version
Jos komento palauttaa versionumeron, niin git on asennettu oikein.
varoitus
Git Bash -tulkissa liittäminen ei toimi tavallisella Ctrl+V tai Cmd+V-näppäinyhdistelmällä!
Sen sijaan käytössä on seuraavat pikanäppäimet:
- Liitä kopioitu teksti bashiin:
Shift+Insert - Kopioi valittu teksti bashista:
Ctrl+Insert(Cmd+Insert macOS:ssa)
Vaihtoehtoisesti voit oikeaklikata päätteen kursorista ja valita Paste tai Copy.
Muistilista
Alla on lyhyt muistilista tyypillisimmistä tällä kurssilla vastaan tulevista tilanteista gitin kanssa. Lue kuitenkin ensin tarkemmat kuvaukset tämän dokumentin seuraavista luvuista.
| Tavoite | Toimenpide | Komento | Linkki ohjeeseen |
|---|---|---|---|
| Aloitan harjoitustyön | Teen fork-toiminnolla gitlab.jyu.fi-palvelussa uuden etävaraston. | Hyppää ohjeeseen | |
| Menen koneelle, jossa sisältöä ei vielä ole | Haen GitLabista etävarastoni HTTPS-osoitteen ja kloonaan etävaraston omalle koneelle. Huomaa piste komennon päätteeeksi. | git clone [etävaraston osoite] . | Hyppää ohjeeseen |
| Menen koneelle jossa sisältö jo on | Päivitän etävaraston version koneelle. | git pull | Hyppää ohjeeseen |
Muutan tai lisään tiedostoja (esimerkiksi suunnitelmakuva suunnitelma-kansioon) | (1) Lisään muuttuneet ja uudet tiedostot stage-tilaan, ja (2) siirrän stage-tilan tiedon lokaaliin varastoon, ja (3) "pusken" tekemäni commitin etävarastoon. Huomaa kolme erillistä komentoa. | git add --allgit commit -m "Muutoksia kuvaava viesti."git push | Hyppää ohjeeseen |
Nämä samat ohjeet pätevät myös ryhmätyössä, mutta silloin kannattaa kiinnittää erityistä huomiota siihen, että tekee pull, commit- ja push-toimintoja riittävän usein konfliktien välttämiseksi.
git status-komentoa voi viljellä missä tahansa välissä. Se kertoo paikallisen varaston tilasta, muun muassa mitä tiedostoja on muutettu, poistettu tai lisätty.
Oman etävaraston luominen GitLab-palveluun
huomautus
Harjoitustyön suunnitelman viemisestä versiohallintaan on myös videotutoriaali. Huomaa, että videolla projektin alku tehdään käyttäen Visual Studiota, mutta voit käyttää myös Rideria.
Tässä vaiheessa luodaan henkilökohtainen etävarasto (engl. remote repository)
gitlab.jyu.fi-palveluun.
Etävarastosta käytetään jatkossa nimitystä origin. Kunkin opiskelijan (tai ryhmätyön) etävarasto perustuu valmiiseen pohjaan, josta tehdään kopiohaara, eli GitLab-terminologiassa fork. Forkkauksen ansiosta saadaan uuteen git-varastoosi kurssin alkuasetukset.
Tämä vaihe tehdään kurssilla yhden kerran.
- (a) Jos sinulla on JY-tunnukset: Kirjaudu gitlab.jyu-palveluun (https://gitlab.jyu.fi/) JY-tunnuksilla. (b) Jos sinulla ei ole JY-tunnuksia: Tee tunnukset GitHub-palveluun (https://github.com), ja kirjaudu sisään.
- (a) JY: Avaa Ohj1-kurssin pohjaprojekti selaimessa:
https://gitlab.jyu.fi/tie/ohj1/2025k/ohj1ht (b) GitHub: Avaa Ohj1-kurssin pohjaprojekti selaimessa:
https://github.com/ITKP102-Ohjelmointi-1/ohj1ht.git - (a) JY: Valitse oikeasta ylänurkasta
fork(b) GitHub: Vastaavasti. - Valitse omaa tunnustasi vastaava
namespace(ryhmä). - Valitse näkyvyydeksi
public. - Tarkista, että
Project slugkohdassa lukeeohj1ht. Jos muutat tätä, niin tämän ohjeen myöhemmät kohdat eivät toimi oikein.
Projektisi etävaraston URL-osoite on nyt:
https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git
Tallenna URL-osoite TIMiin Harjoitustyö -sivulle. TODO: Linkki.
Näet jatkossa oman etävarastosi URL-osoitteen gitlab.jyu.fi-palvelussa kohdasta Clone -> Clone with HTTPS. Käytä oman etävarastosi URL-osoitetta tulevissa ohjeissa.
✨ Valinnaista lisätietoa: Mikä fork on?
Tämä teksti kannattaa lukea, kun ymmärrät, mitä commit, push ja pull tarkoittavat.
Fork on itsenäinen kopio olemassa olevasta git-varastosta. Fork säilyttää aikaisemman historian (commitit), ja jatkaa omaa elämäänsä irrallaan alkuperäisestä projektista. Tähän kopioon (fork-projektiin) tehtävät commitit eivät mene alkuperäiseen projektiin, eivätkä alkuperäisen projektin commitit tule kopioon.
Käytännön elämässä fork-projekti tehdään usein tilanteessa, kun kehittäjä haluaa syystä tai toisesta erottaa oman työnsä alkuperäisen projektin työstä. Kehittäjä voi esimerkiksi olla pettynyt projektin suuntaan ja haluaa jatkaa itsenäisesti eteenpäin. Yksi esimerkki tästä ovat striimausohjelmistot OBS Studio ja Streamlabs Desktop: OBS Studio on maksuton, vapaan lähdekoodin (Gnu GPL v2) projekti. Streamlabs forkkasi OBS-projektin vuonna 2014, ja on siitä eteenpäin tuonut omaan forkkiinsa yhä enemmän kaupallisia ominaisuuksia, kun taas OBS jatkaa edelleen ilmaisohjelmiston periaatteella.
Tällä kurssilla forkkaaminen mahdollistaa opiskelijalle helpon tavan perustaa oma git-repo GitLabiin, ja toisaalta forkin ansiosta opettaja voi samalla jakaa opiskelijoille projektin pohjakoodit (suunnitelmien pohjat jne.) valmiiksi.
Älä sotke fork-termiä branch-termiin. Brancheja käytetään Gitissä
aivan eri tarkoitukseen, vaikka myös branch usein suomennetaan "haaraksi".
Fork-projektista on viite alkuperäiseen projektiin, siis siihen, josta fork otettiin, jotta alkuperäisestä projektista käsin voidaan seurata mitä haaroja siitä on tehty.
Lisätietoa kiinnostuneille: https://help.github.com/en/github/getting-started-with-github/fork-a-repo
Oikeuksien antaminen muille ryhmäläisille
Jos teet harjoitustyön yksin, voit ohittaa tämän kohdan.
Forkin tekijä antaa oikeudet muille ryhmäläisille. Tämä tapahtuu projektin vasemman reunan kohdasta Members. Syötä kohtaan GitLab member or Email address ryhmän jäsenet yksi kerrallaan. Huom! Jäsenten tulee olla tätä ennen olla kirjautunut gitlab.jyu.fi-palveluun vähintään kerran.
Kaikki ryhmäläiset käyttävät samaa etävaraston osoitetta. Tämä on otettava huomioon alempana olevissa ohjeissa, joissa tällöin näkyy "väärän" henkilön tunnus.
Omien tietojen (nimi, sähköposti) asettaminen
Tämä vaihe tehdään yhden kerran jokaisella tietokoneella jolla harjoitustyötä työstetään.
Versiohallinta liittää jokaiseen muutokseen tiedot muutoksen tekijän nimestä ja sähköpostiosoitteesta. Tästä syystä git-ohjelmalle täytyy antaa nimi ja sähköposti.
Aseta omat tietosi git-asiakasohjelmaan seuraavasti.
Mene komentoriville (miten avaan komentorivin?) ja aseta tietosi antamalla alla olevat komennot:
git config --global user.name "Olli Opiskelija"
git config --global user.email "olli.o.opiskelija@student.jyu.fi"
Korvaathan esimerkkitiedot omilla tiedoillasi!
Jos ei tulostu virheviestiä, niin komennot ovat onnistuneet.
Lisätietoa kiinnostuneille: git config
Etävaraston hakeminen omalle tietokoneelle (clone)
Tämä vaihe tehdään yhden kerran jokaisella tietokoneella jolla harjoitustyötä työstetään.
Seuraavaksi haetaan etävarasto omalle paikalliselle tietokoneelle. Tästä käytetään termiä kloonaaminen (engl. clone). Kloonattuun paikalliseen tietovarastoon tehdyt muutokset voi aikanaan lähettää takaisin etävarastoon; tästä kerrotaan lisää myöhemmässä kohdassa.
Kloonaus tehdään tyhjään hakemistoon.
Entä jos hakemisto ei ole tyhjä?
Mikäli haluat kloonata ei-tyhjään hakemistoon, on tähän ohjeet Gitin keskustelupalstalla, mutta melkein helpompi on tässä vaiheessa:
- nimeä olemassa oleva hakemisto uudelleen
- tee uusi työhakemisto
- tee sinne clone
- siirrä sisältö vanhasta hakemistosta
- poista vanha hakemisto
- jatka kuten muuten kloonin jälkeen
Valitse alta käyttöjärjestelmästi mukainen käyttötapa.
Windows
-
Avaa
git bash, Pääte, taicmd-komentorivi. -
Tee uusi hakemisto, jonka haluat menevän versionhallintaan (ts. jossa harjoitustyösi tulee sijaitsemaan tietokoneella jossa työskentelet).
Omalla koneellasi hyvä kansionimi voisi olla esimerkiksi (levykirjain saattaa olla muukin)
C:\Users\Käyttäjä\ohj1\ht. Agoran mikroluokassa kansio voi olla esimerkiksiC:\MyTemp\OmaEtunimi\ht.
huomautus
Tärkeää: Paina tarkasti mieleen kansion sijainti, sillä tulet tarvitsemaan sitä useita kertoja harkkatyötä tehdessä!
-
Siirry tekemääsi kansioon
cd-komentoja käyttämällä. Jos käytät Pääte-komentoriviä, komento vaihtamiseen on (vaihdaC:\...jne kohdalle äsken luomasi kansion polku):cd C:\Users\Käyttäjä\ohj1\htgit bash -komentorivillä komento vaihtamiseen on:
cd /c/Users/Käyttäjä/ohj1/htVoit halutessasi vaihtaa
ht-sanan paikalle valitsemasi pelin nimen. Hakemiston nimen voi vaihtaa myöhemminkin. Kyseinen kansio toimii nyt projektin juurikansiona. Jatkossa kaikki komennot annetaan tässä kansiossa. -
Anna komentoriviltä tässä kansiossa komento. Huomaa välilyönti ja piste lopussa, nekin on annettava.
git clone https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git . -
Antamalla komennon
ls -lanäet, että hakemistoon haettiin pohjaprojektin tiedostot
.gitignore,README.mdsekä kansiosuunnitelma..gitignore-tiedosto sisältää tiedot sellaisista tiedostoista, joita ei oletusarvoisesti viedä versionhallintaan. Näitä ovat muun muassa erilaiset väliaikaistiedostot sekä käännetyt tiedostot.README.mdsisältää projektin kuvauksen Markdown-formaatissa.suunnitelma-kansioon laitetaan pelin suunnitelmakuva (tai -kuvat).
Lisätietoa: Git-ohje: clone, reference: clone
Tiedostojen vieminen paikalliseen tietovarastoon (add, commit)
Kun tiedostoja lisätään, muokataan tai poistetaan, tulee kaikki nämä muutokset lisätä paikalliseen tietovarastoon.
Tämä vaihe tehdään joka kerta kun olet tehnyt muutoksia koodiin tai muihin tiedostoihin.
Esimerkki: Suunnitelman kuvan tallentaminen. Tallenna harjoitustyösi suunnitelman sekä luonnoskuvan suunnitelma-kansioon. Ole tarkkana, että kuva menee oikeasti juuri tuohon kansioon. Sekä suunnitelmatekstiä varten että kuvaa varten on olemassa esimerkit suunnitelma-kansiossa.
Kuvan pikselikoon tulee olla enintään 1920 x 1080 pikseliä. Kuvan tiedostokoon tulee olla enintään 1 megtavu.
Avaa Pääte (macOS), Git Bash (Windows) tai muu komentorivi, siirry cd-komentoja käyttämällä harkkatyökansioosi ja anna seuraavat kaksi komentoa:
git add --all
git commit -m "kuvaava viesti miksi muutokset on tehty"
Ensimmäinen komento lisää kaikki muokatut tiedostot ns. index/stage-alueelle, ja seuraava komento tekee varsinaisen tietovarastoon tallentamisen.
On tärkeää, että aina add-komennon jälkeen tarkistat git status-komennolla mitä tiedostoja
tietovarastoon on menossa. Älä lähetä tietovarastoihin suuria tiedostoja.
Mikäli et halua lähettää tietovarastoon kaikkia muutoksia, vaan esimerkiksi
vain yhden tiedoston, laita --all-option tilalle haluamasi tiedoston nimi:
git add TIEDOSTONNIMI (hakemistoineen, /-viiva hakemistomerkkinä)
Jotkut pitävät parempana luetella kukin lisättävä tiedosto erikseen edellä mainitulla komennolla. Kummassakin tavassa (all-vipu, tai kukin tiedosto erikseen) on puolensa.
Huomaa, että .gitignore-tiedosto sisältää tiedot sellaisista tiedostoista, joita ei lähtökohtaisesti viedä versiohallintaan. Jos kuitenkin ehdottomasti haluat lisätä tällaisen, esimerkiksi .jar-päätteisen tiedoston, niin silloin on käytettävä -f -optiota, jolla pakotetaan lisäys. Esimerkiksi:
git add -f kerho.jar
Toinen vaihtoehto on erikseen sallia vastava jar lisäämällä .gitignore-tiedostoon
rivin .jar perään rivi:
!kerho.jar
Tehtyjen muutosten lähettäminen etävarastoon (push)
Tässä vaiheessa paikalliseen tietovarastoon lähetetyt muutokset lähetetään etävarastoon.
Tämä vaihe tehdään joka kerta kun olet tehnyt muutoksia koodiin tai muihin tiedostoihin. Älä unohda tehdä tätä työskentelyn päätteeksi. Muutoin tiedot jäävät vain paikalliseen tietovarastoon.
Avaa Pääte (macOS), Git Bash (Windows) tai muu komentorivi. Siirry harjoitustyökansioosi cd-komentoja käyttämällä ja anna sitten komento
git push
Ensimmäisellä kerralla sinulta kysytään käyttäjätunnusta ja salasanaa. Valitse kirjautumisikkunassa muodoksi Salasana (Password), ei Token.
Anna käyttäjätunnus lyhyessä muodossa käyttäjätunnus ilman @-merkkiä
ja loppuosaa. Salasana on se, jota käytät JY-verkossa.
Mikäli annat salasanan väärin, joudut muokkaamaan kirjautumistietojasi, ks. kohta 12.
MacOS-käyttäjät huomatkaa, että salasana on KIRJOITETTAVA vaikka sen kohdalla näkyisi avaimen kuva. Kun salasanaa kirjoitetaan, ei näyttöön tule mitään. Lopuksi on painettava enter. Jos tässä tulee virhe, niin gitlab-salasana on poistettava avainnipusta.
Tarkista tämän jälkeen Gitlab-osoitteestasi, että sieltä löytyy lähettämäsi tiedostot (alkukurssista ne kuvat).
Muutosten hakeminen etävarastosta paikalliseen varastoon (pull)
Kun sinä tai joku muu on muuttanut tiedostoja ja vienyt muutoksia etävarastoon, niin muutokset tulee hakea omalle koneelle. Yhteistyöskentelyssä on syytä aina työskentelyä aloittaessa antaa pull-komento.
Siirry hakemistoon, johon olet kloonannut projektin (ks. clone) ja anna komento:
git pull
Tässä kohti voi tulla kysymys siitä, että miten käyttäjä haluaa pull-komennon jatkossa toimivan. Ohj1-kurssin osalta toimiva vaihtoehto on
git config pull.rebase false
Lue tästä lisää esimerkiksi StackOverflowsta.
Git ja ryhmätyöskentely
Kun työskennellään ryhmässä esimerkiksi jos teet harjoitustyön parityönä, tulee kiinnittää erityistä huomiota git:in käyttöön, jotta välttyy turhalta työltä. Kun useampi työstää samaa tiedostoa, tulee helposti tilanne, jossa on tehty eri muokkauksia samoille riveille. Tällöin git ei tiedä mitä tehdä ja konfliktit täytyy ratkaista käsin. Tälläistä tilannetta kutsutaan nimellä Merge conflict ja se ilmaantuu kun omia muutoksia yrittää puskea tai kun muutoksia koitetaan hakea omalle koneelle.
Alla on esitetty tärkeimmät tavat, joilla vältytään ongelmilta, kun työstetään samaa haaraa ryhmänä.
-
Kommunikoikaa selkeästi mitä työstätte ja milloin.
-
Aina ennen kuin aloittaa koodaamisen, haetaan muutokset etävarastosta
--rebaselipulla, jonka ansiosta omat muutokset asetetaan paikalliseen varastoon vasta etävarastosta haettujen muutosten jälkeen.git pull --rebase -
Kun viette (push) muutoksia etävarastoon, ilmoittakaa siitä muulle ryhmälle.
Esimerkki merge conflict -tilanteesta
Vaikka noudattettaisiin hyviä käytänteitä, niin välillä merge conflict tulee vastaan silti. Tätä ei kuitenkaan kannata pelätä ja se saadaan ratkaistua esimerkiksi Riderissa. Tässä skenaariossa kaksi kehittäjää muokkaa samaa tiedostoa ja molemmat ovat haarassa main.
Kehittäjä A puskee etävarastoon seuraavan koodin:
public override void Begin()
{
PhysicsObject nelio = new PhysicsObject(100, 100, Shape.Rectangle);
Add(nelio);
}
Tämän jälkeen Kehittäjä B luo oman kommitin ja yrittää puskea (push) oman koodinsa, jossa luodaan pallo, etävarastoon:
public override void Begin()
{
PhysicsObject pallo = new PhysicsObject(50, 50, Shape.Circle);
Add(pallo);
}
Tämä pusku ei onnistu, sillä Kehittäjä A on puskenut oman muutoksensa etävarastoon ja Kehittäjä B ei ole hakenut näitä muutoksia itselleen lokaaliin varastoon. Komento git push johtaa tämän näköiseen tulosteeseen.

Kehittäjä B hakee muutokset itselleen komennolla git pull --rebase. Tämä komento epäonnistuu kuvassa näkyvällä tulosteella.

Jos tämä komento ajettiin Riderin terminaalissa, niin Rider näyttää ylälaidassa varoituksen merge conflictista. Tästä ilmoituksesta voi klikata Resolve conflicts... nappia, jolloin avautuu Riderin näkymä konfliktien ratkomiseen.

Konfliktin ratkaiseminen editorissa
Riderin Merge conflict editor näkymä näkyy alla olevassa kuvassa. Editorissa on kolme ikkunaa. Vasemmalla puolella on Kehittäjän B lokaalit muutokset, eli hänen, joka yritti hakea muutoksia etävarastosta. Oikealla puolella taas näkyy etävarastosta haettu tiedosto. Keskimmäinen ikkuna taas näyttää lopputuloksen.

Nyt Kehittäjän B tulee päättää, säilytetäänkö lokaalit muutokset vai etävarastosta haetut muutokset. Tämä tapahtuu painamalla muutoksen eli punaisella näkyvän alueen kohdalla ikkunoiden välissä näkyvää nuoli symbolia joko vasemmalta(lokaali) tai oikealta(etävarasto) puolelta. Tämän jälkeen valittu muutos siirtyy keskimmäiseen ikkunaan. Kun kaikki konfliktit on ratkaistu tällä tavoin ja lopputulos(keskimmäinen ikkuna) näyttää oikealta, voidaan painaa alakulmasta Apply nappia ja sitten Apply Changes and Mark Resolved.
Tehdään tämä vielä muille mahdollisille tiedostoille, joissa on konflikteja. Lopuksi kun yhtään konfliktiä ei ole enää jälellä, painetaan Riderin yläreunasta vihreää nuolikuvaketta Continue Rebase. Tämän jälkeen Merge conflict on ratkaistu ja Kehittäjä B voi jatkaa työskentelyä normaalisti.
Huomioitavaa
Tiedostojen koko
Versionhallintajärjestelmä ei sovi suurten tiedostojen tallennukseen. Älä lähetä versiohallintaan esimerkiksi suuria kuva-, musiikki- tai videotiedostoja. Myöskään bin, obj ja vastaavat kansiot (sis. käännetyt ohjelmat ja muut IDE:n tuottamat käännöksen oheistiedostot) eivät kuulu versiohallintaan. Täydennä tarvittaessa .gitignore-tiedostoa.
Älä laita salaisuuksia versiohallintaan
Älä lisää projektisi commiteihin mitään salaista, kuten salasanoja tai henkilötietoja. Vaikka poistaisit tiedon seuraavassa commitissa, se jää Gitin projekti-historiaan, ja on löydettävissä julkaisun jälkeen. Mikäli kuitenkin lähetit etävarastoon jotain, jonka haluat poistaa myöhemmin, se onnistuu esimerkiksi BFG Repo-Cleaner-työkalun avulla.
Tapoja käyttää Gitiä
Aluksi ehdottomasti suositeltavin tapa on käyttää Gitiä komentoriviltä. On olemassa kuitenkin myös graafisia ympäristöjä Gitin käyttämiseen. Myös IDEissä on nykyään varsin asialliset Git-asiakasohjelmistot (eli käyttöliittymä Git-komentojen käyttämistä varten), joskin jokainen on aina vähän omanlaisensa ja vaatii totuttelua. Kaikkia alla mainittuja työkaluja voit kuitenkin käyttää ristiin. Kannattaa kokeilla eri tapoja. Mikroluokista löytyy ainakin komentorivityökalut, Eclipse sekä TortoiseGit.
- SmartGit (Windows, Linux, macOS)
- Fork (Windows, macOS)
- TortoiseGit (Windows)
- GitHub Desktop (Windows, macOS)
- Gitiä voi käyttää myös Windows Subsystem for Linuxin läpi.
Git termejä
- repository, suom. säilytyspaikka, tietovarasto tai arkisesti "repo" = Paikka jossa versioitava tieto tallennetaan,
voi olla paikallinen (
local) tai etä (remote). Periaatteessa samasta projektista voi olla samasta projektista useita säilytyspaikkoja niin paikallisesti kuin etänä.local repositoryon käytännössä hakemistossa oleva.git-hakemisto. Repository koostuu loogisesti commiteista, jotka muodostavat kokoelman projektin eri vaiheista. Näin mihin tahansa commitoituun kohtaan voidaan viitata tai tarvittaessa myös palata. - fork = projektista tehty "kopiohaara", joka elää omaa elämäänsä irrallaan alkuperäisestä projektista. Fork ei ole Gitin toiminto, mutta useat ulkoiset Git-palvelimet (kuten GitHub ja GitLab) tarjoavat tämän toiminnon.
- origin = lyhenne käytettävän etävaraston osoitteelle (
remote repository). Jos etäsäilytyspaikkoja on useita, tulee näitäkin useita. - project = jokin selkeä projekti, joka tähtää esimerkiksi jonkin yhden ohjelmatuotteen tekemiseen
- working directory (tai workspace) = työhakemisto, lokaali työhakemisto (kaikki tiedostot ja versiot löytyvät tämän alla olevasta .git -hakemistosta, jos ne on koneelle haettu (fetch))
- index = varastoon seuraavalla commitilla siirrettävien tiedostojen luettelo
(versioitavien, staging area joissakin lähteissä, koska tiedosto laitetaan "näytille").
Käytännössä tiedosto
.git/index. - main = projektin päähaaran oletusnimi, joka pyritään pitämään toimivana koodina. Aikaisemmin päähaaran oletusnimi oli
master.
Vaativampaan käyttöön ja viimeistään Ohjelmointi 2 -kurssilla tarvittavia termejä:
branch= kehityshaara jossa kehitetään uutta koodia. Kehityshaaroja voi olla useita. Kun koodi on hyväksi todettu, se voidaan yhdistää (merge) päähaaraan.tag= jäädytetty haara (esimerkiksi ohjelman tietty versio), jota ei aktiivisesti kehitetä, mutta johon voi tulla esimerkiksi tietoturvapäivityksiäHEAD= viite aktiivisen haaran "päähän" tietyssä lokaalissa
Kurssilla käytettäviä Git-komentoja:
git config --global user.name "käyttäjätunnus"
git config --global user.email "%%useremail%%"
git clone https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git .
git status # tätä komentoa kannattaa käyttää ahkeraan vaikka joka välissä
git log # samoin tätä, kunhan opit lukemaan sen sisältöä
# tee tarvittavia muutoksia
git add --all
git commit -m "Vaihe 1, kuvat"
git push # kaverin pitää tämän jälkeen tehdä kotona tehdä git pull
git pull
Ongelmia?
Yleisimpiä ongelmia on lueteltu alla.
{area="vaaraURL" collapse="true" id="v5JVpIErHcLd"} remote: The project you were looking for could not be found or you don't have permission to view it.
Annoit git clone -komennolle väärän etävaraston URL-osoitteen. Tarkista etävarastosi osoite gitlab.jyu.fi-palvelussa oman projektisi kohdasta Clone -> Clone with HTTPS. Anna tämä osoite git clone -komennon perään.
Syy, miksi näin kävi, johtuu todennäköisesti siitä, että forkkia tehdessäsi muutit Project slugia, eli projektin tunnistetta, joka muuttaa etävaraston URL-osoitetta.
{area_end="vaaraURL" id="93Hn2pqIU2AT"}
{area="pushEiOnnistu" collapse="true" id="O95CK3Hj6CQL"} Push ei onnistu (remote: HTTP Basic: Access denied)
Ongelma: Git ei anna viedä mitään etävarastoon (push ei onnistu). Antaa virheilmoituksen:
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'https://gitlab.jyu.fi/NIMI/ohj1ht.git'

Huomaa, että virheilmoitus voi näyttää hieman erilaiselta riippuen siitä käytätkö komentoriviä vai jotain muuta Git-asiakasohjelmaa.
Syy (vaihtoehto 1): Etävaraston url-osoitteesta puuttuu lopusta osa .git.
Korjaus: Anna git bashissa / Päätteessä komento git remote -v
Jos fetch- ja push-urlien lopussa ei ole .git-osaa, käy kopioimassa
GitLab-palvelussa varastosi HTTPS-url-osoite, ks. kuva alla.

Anna sitten alla oleva komento, ja pasteta URL-kohtaan äsken kopioimasi osoite.
git remote set-url URL
Kokeile nyt tehdä git push.
Syy (vaihtoehto 2): Olet kirjautumisikkunassa kirjoittanut käyttäjätunnuksesi tai salasanasi väärin.
Korjaus Windowsilla: Tarkistetaan käyttäjänimi ja kirjoitetaan salasana uudelleen.
- Avaa Control panel (ohjauspaneeli).
- Valitse 'User accounts' (käyttäjätilit).
- Valitse 'Manage your credentials' (Tunnistetietojen hallinta).

- Valitse 'Windows credentials' (Windows-tunnistetiedot).

- Laajentamalla gitin kohtaa, pitäisi päästä muokkaamaan asetettuja käyttäjänimeä ja salasanaa.
Korjaus Mac: Sama homma macOS:ssa (??): https://help.github.com/en/github/using-git/updating-credentials-from-the-osx-keychain
fatal: destination path ‘.’ already exists and is not an empty directory
git clone komennon jälkeen antaa tälläisen:
fatal: destination path ‘.’ already exists and is not an empty directory.
Korjaus: Kun tehdään clone, pitää olla tyhjässä hakemistossa.
'[ht]/' does not have a commit checked out, fatal: adding files failed
Poista projektin hakemistosta .git-kansio. (Huom. älä poista ylätason hakemistosta.)
Piilotetut kansiot eivät välttämättä näy tiedostonhallinta-ikkunassa (macOS:lla Finder).
Komentorivillä tuon poisto onnistuu esim
rm -rf .git
You can't push or pull repositories using SSH until you add an SSH key to your profile
Syy: Kloonatessasi etävarastoa olet todennäköisesti valinnut SSH-osoitteen HTTPS-osoitteen sijaan.
Suositellaan, että otat tässä kohden työstäsi varmuuskopion.
Korjaus, tapa 1:
- Kopioi Gitlab-palvelusta (tai muusta palvelusta) tietovarastosi HTTPS-osoite.
- Avaa komentorivi.
- Siirry cd-komentoja käyttäen harjoitustyösi kansioon.
- Anna komentorivillä komento
git remote. Näyttöön pitäisi tulostua tekstiorigin. Mikäli tulostuu jotain muuta, korvaa seuraavassa kohdassaorigin-sana sillä, mitä sinulle tulostui. - Anna komentorivillä alla oleva komento ja korvaa
UUSIOSOITEkohdassa 1 kopioimallasi osoitteella
git remote set-url origin UUSIOSOITE
Korjaus, tapa 2: Jos tapa 1 ei toimi, voit tehdä uuden clonen uuteen kansioon käyttäen HTTPS-osoitetta, ja kopioida aikaisempaan kansioon tekemäsi muutokset tähän uuteen kansioon. Tämän jälkeen pitää tehdä add- ja commit-komennot uudestaan, sen jälkeen push pitäisi onnistua.
Joskus käy niin että Gitissä tulee touhuttua jotakin mikä saa hommat ihan solmuun. Joihinkin probleemiin vastauksia voi löytyä täältä: https://ohshitgit.com/. Ko. saitin kielenkäyttö ei ehkä sovi perheen pienimmille mutta varsinaiset vinkit voivat pelastaa kiperistä tilanteista.
Lisätietoa kiinnostuneille
- Gitin käyttö Ohjelmointi 2 -kurssilla
- Git reference: Git-yhteisön ylläpitämä dokumentaatio Git-komennoille.
- A curious tale - from snaphots to git - tämä ja sen jatko-osa kannattaa lukea, ne selvittävät hyvin Gitin ideaa.
- Pro Git book: Git-yhteisön ylläpitämä Git-kirja.
- Git - Tutorial / Lars Vogel
- Git Handbook
- git - the simple guide
- Helsingin yliopiston Git-kurssi
- ohshitgit - ratkaisuja yleisiin virhetilanteisiin (osittain humoristisia)
- git cheatsheet
Tuki ja palaute
Kevään 2026 ohjauskauden (10.1.-30.4.) aikana on tarjolla seuraavat tukikanavat:
| Tukikanava | Aika | Paikka/Linkki |
|---|---|---|
| Lähiohjaus | ke 10-16, to 10-16, pe 10-16 | Agoralla luokat Ag B213.1 Lakes ja Ag B212.2 Mountains |
| Etäohjaus | ke 10-16, to 8-18, pe 10-16 | Ohjelmointi 1 Teams-kanava |
| Vastuuopettajien ja tuntiopettajien sähköpostiosoite | Jatkuva | ohj1-opet@tim.jyu.fi |
Ohjaukset ovat yhteisiä ITKP102 Ohjelmointi 1- ja ITKA2004 Tietokannat ja tiedonhallinta -opintojaksojen kanssa. Ohjaajat auttavat kummankin kurssin opiskelijoita.
Ohjausaikoja saatetaan lisätä tai poistaa kysynnän mukaan; kerro aikatoiveistasi opettajille sähköpostitse.
Miten saan Sisun kalenteriin ohjausaikoja näkyviin? (Avaa ohje klikkaamalla)
-
Kirjaudu Sisuun
-
Jos olet jo ilmoittautunut kurssille, klikkaa ylhäällä välilehteä Opintokalenteri tai klikkaa sitä hampurilaisvalikosta
-
Selaa oikealla oikea kurssi näkyville, eli tässä tapauksessa Ohjelmointi 1
-
Klikkaa oikealla olevaa oikealle osoittavaa väkästä Ohjelmointi 1 -kurssin kohdalla

-
Skrollaa alaspäin, kunnes tulee alaotsikko Pääteohjaus
-
Jos ei vielä näy, niin skrollaa alaspäin, kunnes näkyy Muiden ryhmien tiedot ja klikkaa sitä
-
Nyt voit skrollaamalla alaspäin haluamiesi pääteohjauksien kohdalta klikata nappulaa Näytä tapahtumat kalenterissa.

-
Nyt kyseisen ryhmän ohjausajat näkyvät sinulla automaattisesti. Tarvittaessa voit poistaa ryhmän tapahtumia viikkokohtaisesti Tapahtumakalenterista.
Ohjausaikoja saatetaan lisätä tai poistaa kysynnän mukaan; kerro aikatoiveistasi opettajille sähköpostitse.
Ohjeet Teams-ohjauksiin liittymiseksi (tutkinto-opiskelijat)
-
Kirjaudu yliopiston tunnuksellasi Microsoft Teamsiin osoitteessa https://teams.microsoft.com. Käyttäjätunnus on muotoa
käyttäjätunnus@jyu.fi(esim.mameikal@jyu.fi). Tunnuksen muotostudent.jyu.fiei käy. Tunnuksen toimiminen vaatii, että olet hyväksynyt Office 365 -palvelut OMA-palvelussa (https://sso.jyu.fi). -
Lataa Teams-sovellus (suositus) tai käytä nettiversiota. Saatavilla on myös mobiilisovellus. Jos selaimella liittymisessä on ongelmia, tarkista ensin tukeeko Microsoft sitä täältä.
-
Teams-sovelluksessa klikkaa Teams → Join or create team → Join a team with a code
-
Syötä koodi
fb8q3qa -
Testaa kaverin kanssa, että puhelu ja ruudun jakaminen toimii. Sinun tulee tarvittaessa sallia oikeudet käyttöjärjestelmäsi asetuksista.
Ohjeet Teams-ohjauksiin liittymiseksi (avoin yliopisto, erilliset opinto-oikeudet)
Lähetä sähköpostilla alla oleva pyyntö osoitteeseen ohj1-opet@tim.jyu.fi.
Hei,
opiskelen Ohjelmointi 1 -kurssilla ei-tutkintoon johtavassa koulutuksessa.
Pyydän liittämään minut Ohjelmointi 1 -kurssin Teams-ryhmään vieraana.
Teamsissa käyttämäni sähköpostiosoite on: [oma sähköposti tähän].
Terveisin, [oma nimi]
Liitämme sinut viimeistään seuraavana arkipäivänä.
Etäohjauksiin osallistuminen ilman Teamsia
Jos et millään onnistu kirjautumaan Teamsiin tai et halua olla Teams-kanavalla, voit pyytää etäohjausta Zoomin kautta seuraavasti:
- Asenna Zoom sovellus koneellesi osoitteesta https://zoom.us/download (muut kuin tutkinto-opiskelijat) tai https://jyufi.zoom.us (tutkinto-opiskelijat; Valitse Download Client ihan alhaalta)
- Kirjaudu Zoomiin valitsemallasi tilillä, esim. Google-kirjautumista käyttäen (muut kuin tutkinto-opiskelijat) tai Single Sign-on / SSO -toiminnolla (tutkinto-opiskelijat; käytä company domainia
jyufi) - Aloita kokous New meeting toiminnolla
- Testaa Audio → Test speaker & mikrofone toiminnolla että äänet pelittää
- Ota kokouslinkki talteen Participants → Copy invite link
- Avaa ohjauspyyntölomake: https://forms.gle/5QULUPBHjjqS4ndf6
- Täytä omat tietosi ja HUOM Pasteta lisätietokenttään kohdassa 5 kopioimasi linkki
- Odota että ohjaaja tulee huoneeseesi. Saatat joutua hyväksymään hänen sisäänpääsyn (riippuu kokoushuoneesi asetuksista)
Palaute ja kehittäminen
Olemme erittäin kiitollisia kaikesta palautteesta, joka auttaa meitä kehittämään opintojaksoa edelleen! Voit antaa palautetta ja kehitysehdotuksia opintojaksosta kolmella tavalla:
-
Keräämme jatkuvaa palautetta opintojakson aikana. Nyt, kun olemme kehittämässä opintojakson sisältöjä ja toteutusta, tämä jatkuva palaute on erityisen tärkeää. Voit antaa palautetta anonyymisti alla olevan linkin kautta: TODO: Norppa-linkki tähän.
-
Mikäli havaitset materiaalissa virheen, epäselvyyden, tai muun ongelman, voit raportoida siitä GitHubissa klikkaamalla kunkin sivun alareunassa olevia linkkejä. Voit myös ilmoittaa puutteista suoraan opettajille sähköpostitse osoitteeseen
ohj1-opet@tim.jyu.fi. -
Opintojakson lopuksi jokainen Sisussa (tai Ilpo-portaalissa) ilmoittautunut saa henkilökohtaisen linkin kurssipalautekyselyyn, jossa voit antaa anonyymisti palautetta koko opintojaksosta.
Harjoitustyö
Harkkatyön kuvaus. Lomakkeet edelleen TIMissä
Harjoitustyö
- on osa kurssisuoritusta ja arvioidaan asteikolla hyväksytty/hylätty. Harjoitustyö pitää olla hyväksytty ennen kuin kurssista voi saada arvosanan.
- tehdään yksin tai parityönä. Mikäli luontaista paria ei löydy, ei sitä kannata ehkä etsiäkään väkisin. Kolmen hengen ja sitä isompia ryhmiä ei hyväksytä.
- sisältää keskimääräisesti opiskelijaa kohti noin 27 tuntia työtä. Parityönä tehtävän työn määrä on siis laskennallisesti 54 tuntia. Katso tarkat vaatimukset paritöille alla.
- voi olla Jypeli-työkaluilla tehty peli, mutta voi olla jokin muukin C#-kielellä tehty komentoriviohjelma. Muita kieliä ei hyväksytä.
Vaiheet ja aikataulu
Harjoitustyöhön kuuluu kolme vaihetta: Vaihe 1 (suunnitelma), Vaihe 2 (työ 50 % valmis) ja Vaihe 3 (työ 100 % valmis). Vaiheiden tarkemmat kuvaukset löytyvät alta.
Harjoitustyön vaiheet palautetaan esittelemällä ne ohjaajalle. Voit esittää harjoitustyösi ohjauksessa tai sopimalla erillinen ohjausaika sähköpostitse ohj1-opet@tim.jyu.fi.
Aikataulu ja takarajat
| Tutkinto-opiskelijat | Lukiolinjat | Avoin yliopisto |
|---|---|---|
| Jokainen vaihe tulee palauttaa ennen asetettua takarajaa. Mahdollisista aikataulujoustoista (esim. sairauden takia) on aina sovittava ohjaajan kanssa. Työn vaiheiden palauttaminen myöhässä ilman ennalta sovittua joustoa voi johtaa harjoitustyön hylkäämiseen. Päätöksen tekevät opintojakson vastuuopettajat tapauskohtaisesti. | Vaiheet tulee palauttaa valitsemasi opintojaksototeutuksen aikataulun mukaisesti. | Vaiheiden palauttamiselle ei ole kiinteitä takarajoja, mutta vaiheet on hyväksytettävä ohjaajalla. Kun vaihe on valmis, laita harjoitustyön vaihe ajoissa versionhallintaan ja käy esittelemässä työtä ohjaajalle pääteohjaustilaisuuksissa. |
Harjoitustyön vaiheiden kuvaukset ja tarkistuslistat
Vaihe 1: Suunnitelma versiohallinnassa
-
Tutkinto-opiskelijat ja lukiolinjat: Suunnitelma on näytettävä ohjaajalle ennen osan 5 harjoitustehtävien takarajaa.
-
Luo oma etävarasto GitLabiin tai GitHubiin. Katso kirjalliset ohjeet tai ohjevideo
-
Kopioi ja liitä etävarastosi osoite Oma eteneminen -sivulle. Etävaraston osoitteen on oltava muotoa https://github.com/nimi/ohj1ht.git TAI https://gitlab.com/nimi/ohj1ht.git. TODO: Linkki.
-
Hae etävarasto omalle tietokoneelle Git-työkalun avulla. Sinulla tulee olla Git-työkalu asennettuna, katso työkaluohjeet. Katso git-ohjeet omien tietojen asettamiseksi ja etävaraston lataamiseksi omalle tietokoneelle.
-
Kirjoita harjoitustyön suunnitelma ladattuun harjoitustyökansioon. Katso suunnitelman vaatimukset alla. Katso esimerkkisuunnitelma.
-
Lataa suunnitelmasi ja kuvasi etävarastoon. Katso ohjeet tiedostojen lisäämiseksi git-varastoon ja ohjeet git-varaston lataamiseksi etävarastoon.
-
Esittele suunnitelma ohjaajalle lähi- tai etäohjauksessa.
Vaihe 2: Työ 50 % valmis
-
Tutkinto-opiskelijat ja lukiolinjat: Harjoitustyön tilanne on näytettävä ohjaajalle ennen osan 8 harjoitustehtävien takarajaa.
-
Tee työsi eteenpäin suunnitelman mukaan.
- Luo ohjelmakoodia varten uusi solution.
- Aseta Solution directory-kohtaan sama polku kuin 1. vaiheen Git-varastolla. Esim.
C:\kurssit\ohj1\ht. - Pidä mielessä suunnitelmasi sekä harjoitustyön vaatimukset.
- Jos teet harjoitustyön parityönä, muista tehdä tarkaa tuntikirjanpito
-
Varmista, että työsi koodi on ajan tasalla etävarastossa.
- Katso ohjeet tiedostojen lisäämiseksi git-varastoon (add-commit) ja ohjeet git-varaston lataamiseksi etävarastoon (push).
- Muista pitää etävarasto ajan tasalla mahdollisimman usein!
-
Esittele suunnitelma ohjaajalle lähi- tai etäohjauksessa.
Jos tämä vaihe on pahasti kesken, tarkastaja palauttaa työn opiskelijalle ja antaa 7 päivää aikaa tehdä korjaukset, jonka jälkeen vaihe tarkastetaan uudelleen.
Vaihe 3: Työ 100 % valmis
- Tutkinto-opiskelijat ja lukiolinjat: Näytettävä ohjaajalle ensimmäisen tentin mennessä
-
Tarkista, että työ täyttää kaikki vaaditut osa-alueet
- Näet kaikki tarkastettavat osa-alueet vaatimuksista kohdasta "Tarkastettavat osa-alueet"
- Jos teet harjoitustyön parityönä, tarkista, että tuntikirjanpito on ajan tasalla
-
Varmista, että työsi lopullinen koodi on etävarastossa
- Katso ohjeet tiedostojen lisäämiseksi git-varastoon ja ohjeet git-varaston lataamiseksi etävarastoon
- Huomaa, että etävarastossa olevan työn tulee olla toimiva! Voit esimerkiksi kokeilla ladata etävarasto omalle tietokoneelle eri kansioon ja yrittää ajaa solution.
-
Esittele suunnitelma ohjaajalle lähi- tai etäohjauksessa.
Mikäli ohjaaja antaa merkittävän määrän korjauskehotuksia, opiskelijalla on 7 päivää aikaa tehdä korjaukset, jonka jälkeen vaihe tarkastetaan uudelleen.
Vaatimukset
Suunnitelma
Harjoitustyö täytyy olla suunniteltu ja suunnitelman tulee olla ohjaajan hyväksymä. Suunnitelmat tallennetaan GitLabiin, ks. yläpuolelta vaiheen 1 tarkistuslista.
Suunnitelmassa pitää olla ainakin seuraavat asiat (soveltaen ei-peliharjoitustyöhön):
- Tekijöiden nimet
- Pelin nimi
- Harjoitustyön osoite gitissä
- Pelaajien lukumäärä (1-4)
- Pelin taustatarina tai kuvaus pelin teemasta
- Pelin idea ja tavoitteet
- Hahmotelma pelistä (kuva tai kuvia paperilla käsin tai tietokoneella piirrettynä)
- Jonkinlainen kuvaus siitä, miten peli etenee
- Pelissä olevat oliot, niiden toiminnot ja missä suhteessa ne ovat toisiinsa
- Toteutuksen suunnitelma: mitä tekisin ja missä järjestyksessä? Millä aikataululla?
Voit katsoa vinkkejä seuraavista esimerkkisuunitelmista:
- Hirsipuu (peli)
- AngryLego (peli)
- Työaikaraportti (ei-peli), katso myös tutoriaali työaikaraporttiin
Toiminnallisuus
Pelissä pitää tapahtua jotakin, eli ruudulla pitää tapahtua jotain järkevää. Käyttäjän tulee voida osallistua peliin interaktiivisesti esimerkiksi hiiren ja/tai näppäimistön välityksellä.
Koodi
Työssä on oltava vähintään muutama aliohjelma Jypelin valmiiden aliohjelmien (Main, Begin) lisäksi.
Muut tarkastettavat osa-alueet on lueteltu alempana kohdassa "Tarkastettavat osa-alueet".
Paritöistä
Kaikki ryhmäläiset käyttävät samaa etävaraston osoitetta. Ks. Git-ohjeet.
Parityöt, työnjako
Molempien on annettava kutakuinkin yhtäläinen panos työn ohjelmalliseen toteutukseen. Yksittäisenä varoittavana esimerkkinä mainittakoon parityö, jossa toinen on paneutunut grafiikan tekemiseen ja toinen ohjelmointiin. Tällöin grafiikkaan paneutuneelta osallistujalta voidaan pyytää lisänäyttöjä työn ohjelmalliseen toteutukseen johon parityön toinen osapuoli ei saa osallistua. Lisäksi kummankin tekijän on pystyttävä esittämään riittävän tarkka tuntikirjanpito ja selvitys mitä työajalla on tehty, jotta osaamistavoitteet ohjelmoinnin osalta voidaan todentaa.
Parityöt, työn vaativuus
Työn on oltava vaativampi kuin yksin tehdyn työn, ja tässä työmäärä on tärkein mittari. Ohjaajat käyvät työn läpi tarkastustilaisuudessa ryhmäläisten kanssa. Yksittäistä pelin ominaisuutta joka kaikilta paritöiltä vaadittaisiin ei yleisellä tasolla voi antaa. Näiden kriteerien tarkoitus ei ole vaikeuttaa tekemistä vaan ehkäistä ennalta vapaamatkustamista.
Tarkastettavat osa-alueet
Alla on tarkastettavien osa-alueiden lista, jonka ohjaajat tulevat tarkastamaan harjoitustyön esittelemisen yhteydessä.
-
Nimeäminen on johdonmukaista ja noudattaa kurssin koodauskäytänteitä.
-
Näkyvyys: Aliohjelmien ja attribuuttien näkyvyys tulee olla määritelty (
public,private). Julkisia staattisia (public static) muuttujia ei saa olla. -
Ei turhia peliluokan attribuutteja.
Jos joitain koko peliluokkaan näkyviä arvoja tarvitaan, pyritään käyttämään vakioita (
const). Kuvat, äänet, animaatiot ja muut raskaat resurssit on kuitenkin hyvä pitää attribuutteina, jolloin ne ladataan vain kerran pelin aikana. Esim. kuvien olioviitteet voi kiinnittää muuttumattomaksistatic readonlymääreellä. -
Toimii: Ohjelma toimii, ei kaadu ja päättyy asiallisesti.
Pelissä pitää tapahtua jotakin järkevää, johon käyttäjä voi osallistua interaktiivisesti. Pelissä pitää myös olla tavoite, haaste tai tarina.
-
Ei toistoa, joka olisi voitu tehdä silmukoilla tai aliohjelmilla.
Myöskään aliohjelmien välillä ei saa olla toistoa: esimerkiksi
LuoVihu1jaLuoVihu2, joissa olisi lähes sama koodi kahteen kertaan. -
Taulukko: Käytetään taulukkoa tai listaa.
Tietorakenteella täytyy olla jokin tarkoitus siten, että sinne tallennetaan useita arvoja, joita todella käytetään pelissä. Tietorakenteen käytön tulee parantaa koodin laatua ja helpottaa koodin lukemista, kirjoittamista tai edelleenkehittämistä. Keinotekoisia tai vailla käyttötarkoitusta olevia tietorakenteita ei hyväksytä. Esimerkkejä.
-
Silmukka: Ainakin yksi silmukka.
Silmukalla täytyy olla jokin tarkoitus siten, että rakenteen avulla luetaan ja/tai käsitellään tietoa. Ei riitä että lisätään "tähtiä taivaalle silmukassa 10 kpl." Silmukalla tulee olla merkitys, joka parantaa koodin laatua ja helpottaa koodin lukemista, kirjoittamista tai edelleenkehittämistä. Esimerkkejä.
-
Ei turhia literaaleja: Kiinteiden lukuarvojen tai muiden sellaisten arvojen käyttö, jotka heikentävät koodin ylläpidettävyyttä, on kielletty.
Et siis saa tehdä koodia kuten
if (y < 18)jossa 18 on hyvin todennäköisesti turha literaali. Sen tilalle tulee laittaa muuttuja tai vakio, kuten
int pisteraja = 18Vakiot ilmaistaan
const-määreellä. -
}+ 2 tyhjää: Aliohjelmien loppusulun}jälkeen tasan kaksi tyhjää riviä. -
Dokumentaatio: Luokat, aliohjelmat ja attribuutit tulee dokumentoida.
Dokumenteissa kuvataan muun muassa sitä, mitä aliohjelmat tekevät, ei miten ne sen tekevät. Luokan alussa tulee olla tekijän nimi ja versio (
@author,@version). Myös attribuutit dokumentoidaansummary-tagein. -
Funktio: Pelissä on funktio.
Funktio ottaa vastaan parametrin tai parametreja, käsittelee parametrina saatua tietoa, ja palauttaa arvon annetun syötteen perusteella. Funktion täytyy prosessoida tietoa jotenkin; funktiolla täytyy olla jokin todellinen tarkoitus ohjelman kokonaisuuden kannalta. Tyypillisesti funktiossa voi hyödyntää silmukkaa tai taulukkoa/listaa. Esimerkkejä.
-
Ei virheitä eikä varoituksia Riderin oikeassa yläkulmassa. Muista asentaa kurssin Rider-asetukset
-
Ei-pelien tapauksessa osoitettu myös taito testata aliohjelmia.
Usein kysytyt kysymykset ja muut vinkit
Millaisia pelejä voi harjoitustyöksi tehdä?
Jos et keksi, minkä tyylisen pelin haluaisit tehdä, katso, millaisia pelejä on tehty edellisissä toteutuksissa:
Muista että voit tehdä muutakin kuin pelin!
Miten saan taulukon, silmukan tai funktion peliini?
Kun tallennat pelin olioita tai tapahtumia listaan / taulukkoon, voit käsitellä niitä yhdellä silmukalla ja paketoida logiikan omaan funktioon. Näin syntyy sekä selkeää että tehokasta koodia.
Mitä pelidataa kannattaa kerätä? Tässä esimerkkejä.
- Pelaajan syötteet: painetut näppäimet, kosketukset
- Pelimaailman tila: viholliset, kerättävät, esteet
- Tapahtumat: törmäysten tagit, pistemäärät, aikaleimat, ratakierrokset
Tallenna tiedot listaan sitä mukaa kun ne (olio, tapahtuma...) syntyvät.
Millainen funktio voisi olla? Tässä esimerkkejä. Huomaa, että nämä ovat enemmän ideoita siitä, millaiset funktiot voisivat olla pelissä hyödyllisiä.
- Laske aikojen keskiarvo
- Etsi minimi, maksimi tai eniten kerätty esine
- Yhdistele dataa (esim. kaksinpelissä pallon hallinta-aika)
- Erityisesti ei-peleissä jokin muu tiedonkäsittely, johon liittyy sisään menevä aineisto ja siitä tehty laskennallinen tulos
Pidä laskentalogiikka omassa funktiossa, jotta peliluokka pysyy selkeänä.
Milloin dataa käsitellään? Tässä esimerkkejä.
- Kenttä vaihtuu
- Aikaraja ylittyy
- Peli alkaa alusta
Hyödynnä tulokset pelissä Tässä esimerkkejä.
- Näytä pelaajalle (pisteet, tilastot, top-ajat)
- Käynnistä uusi vaikeustaso, jos keskimääräinen kierrosaika laskee
- Palkitse pelaaja, kun kerättyjen esineiden määrä ylittää rajan
Jypelin kirjaston ohjeissa on koodiesimerkkejä, joissa käytetään silmukkaa tai taulukkoa. Nämä eivät sellaisenaan riitä, vaan työssä tulee olla oman ajatustyön tulos.
Mikäli omassa pelissä ei ole taulukkoa/listaa, silmukkaa tai funktiota, pitää ohjaajalle esittää itse tehdyn (ts. työ on tehty omatoimisesti ilman merkittävää apua ohjaajalta tai muilta opiskelijoilta) demotehtävän vastaus, missä em. asioiden osaaminen on näytetty. Tästä voi laittaa vaikka kommentin omaan harjoitustyöhön tyyliin:
// TODO: taulukko, ks: https://tim.jyu.fi/answers/kurssit/tie/ohj1/%%vuosik%%/demot/demo7?answerNumber=1&task=matriisiensumma&user=vesal
Linkin saa otettua demotehtävän vierellä olevasta pienestä Link-linkistä klikkaamalla sitä hiiren oikealla painikkeella, ja kopioimalla linkin osoite.
Voinko tehdä jotain muuta kuin peli?
Kyllä, vaihtoehtoja ovat esimerkiksi:
Muita vaihtoehtoja:
- Yksi esimerkki voisi olla vaikkapa lukea tiedostosta suomenkielinen teksti ja lasketaan mitä vokaalia on eniten.
- Tai työ voi olla tietyn WWW-sivun lukeminen ja sieltä tiettyjen tietojen käsittely yksinkertaiseen muotoon.
- Esimerkiksi joltakin sääsivulta päivän tuuliarvojen maksimi ja keskiarvo.
Monet Advent of code -tapahtuman tehtävät voivat hyvinkin soveltua harjoitustyön aiheeksi -- tosin loppupään tehtävät ovat jo hyvin vaikeita. Inspraatiota voi hakea myös vaikkapa täältä http://nifty.stanford.edu/. Katso tuolta CS1-tasoiset tehtävät, niiden pitäisi (suurelta osin) olla tämän kurssin osaamistavoitteiden mukaisia. Näissäkin tapauksissa suunnitelma tulee kuitenkin hyväksyttää ohjaajalla.
Ei-pelien tapauksessa ohjelmaan tehdyt testattavissa olevat aliohjelmat tulee testata.
Mistä aloitan pelin koodaamisen?
- Aloita vaikka pistämällä kentälle jotakin olioita
- MontaPalloa.cs
- Jos peli on tasohyppelymäinen, luo uusi projekti kohdasta Jypeli -> Tasohyppely
- Katso sisällön tuominen peliin . Kuvat toimii jos:
- piirretty/haettu tarvittavat kuvat, muista tekijänoikeus
- tehty projektiin Content-niminen kansio ja kopioitu kuvat sinne
- klikattu hiiren oikealla kutakin kuvaa (tai valittu monta) ja Properties ja sieltä valittu "Copy if newer"
Esimerkkejä:
Ei-pelin tekijöille:
Miten voisin työskennellä parin kanssa samanaikaisesti?
Lähtökohtaisesti on kolme tapaa, joita tällä opintojaksolla suositellaan:
- Kunkin tekee muutoksia omalla koneella ja lataa ne samaan etävarastoon
- Pariohjelmointi
- Koodieditorin jakaminen verkossa (Google Docs -tyylinen samanaikainen muokkaus)
Eri koneet, sama etävarasto:
Yleisin tapa yhdessä ohjelmointiin on, että kumpikin lataa saman etävaraston
omalle tietokoneelle, tekee omia muutoksia ja lataa ne takaisin samaan etävarastoon.
Niin kauan kuin muutoksia ei tehdä päällekkäin (eli kummatkin muokkaatte samaa koodiriviä)
tai päällekkäiset muutokset ovat tarpeeksi yksinkertaisia, git-työkalu osaa yhdistää
kahden eri tekijän muutokset yhteen.
Tässä tärkeintä on, että muutokset lähetetään etävarastoon (git push) ja ladataan (git pull) sieltä
mahdollisimman usein. Tapauksissa, jossa git-työkalu ei pysty yhdistämään kahden henkilön muutoksia, syntyy ns. konflikti, joka pitää ratkaista itse. Git-konfliktien ratkaiseminen on tämän opintojakson ulkopuolella; ongelmatilanteissa ota yhteyttä siis ohjaajaan. Lyhyt kuvaus tästä löytyy Git ja ryhmätyöskentely osiosta.
Pariohjelmointi:
Toinen tapa työskennellä yhdessä on pariohjelmointi (engl. pair programming). Siinä kumpikin pari työskentelee saman tietokoneen äärellä: yksi parista ohjelmoi ja toinen seuraa tai ohjaa. Ajatus on, että rooleja vaihdetaan usein -- vaihto voi tapahtua jopa "lennosta". Koska muutokset tehdään samalla tietokoneella, koodin lataaminen etävarastoon menee samalla tavalla kuin jos tekisi harjoitustyötä yksin. Pariohjelmoinnin tapauksessa tulee kuitenkin pitää tarkasti tuntikirjanpitoa, sillä kunkin parin työpanosta ei näe suoraan git-versiohistoriasta. Pariohjelmointi lisäksi toimii parhaiten lähitapaamisissa, sillä "vuoron vaihtaminen" etänä on yleensä hankalaa.
Työskentely samanaikaisesti verkossa:
Jos työtä halutaan työstää yhtä aikaa samassa editorissa, helpoin tapa on käyttää Riderin Code With Me -ominaisuutta. Ominaisuuden avulla koodieditorista tulee Google Docs -tapainen alue, jossa kaksi tai useampaa henkilöä voi muokata koodia samanaikaisesti eri koneella. Muutokset tallentuvat yhdelle tietokoneelle, josta ne on helppoa ladata etävarastoon ilman konflikteja. Ominaisuus on Riderissa betakokeilussa. Valitettavasti non-commercial-lisenssillä (oletus tällä kurssilla) session enimmäisaika on 30 minuuttia. Jos anot opiskelijalisenssiä (ks. seuraava ohje), saat (ilmeisesti) rajattoman käyttöajan.
Opiskelijalisenssin anominen Rideriin
Voit anoa itsellesi maksuttoman opiskelijalisenssin käyttäen student.jyu.fi-sähköpostiosoitetta. Noudata huolellisesti alla olevia ohjeita.
-
Varmista, että
student.jyu.fi-osoitteesi toimii. Kannattaa lähettää itselleen testiposti jostain ulkopuolisesta osoitteesta (esim. Gmail tai Hotmail) ja katsoa tuleeko posti itselle perille. Ota varmuuden vuoksi mahdollinen edelleenohjaus pois päältä. Huomioi, että edelleenohjauksen deaktivoitumisessa on viivettä. Jos posti ei tule perille, tarkista account.jyu.fi -> sähköpostiasetukset. Selvitä tarvittaessa Digipalveluiden (help.jyu.fi) kanssa missä vika on.Et voi edetä tässä ohjeessa, jos opiskelijasähköpostisi ei toimi.
-
Siirry osoitteeseen https://www.jetbrains.com/community/education/#students
-
Klikkaa Apply now.
-
Täytä tiedot Apply with: University email address -lomakkeessa, ole tarkkana että annat student.jyu.fi-loppuisen opiskelijasähköpostiosoitteen. Hyväksy mahdolliset käyttöehdot. Klikkaa Apply for free products.
-
Avaa yliopiston sähköpostisi, noudata JetBrainsin lähettämän vahvistusviestin ohjeita ja vahvista lisenssi. Jos viesti ei tulekaan, älä lähetä lomaketta useita kertoja "varmuuden vuoksi". Siitä on vain ja ainoastaan haittaa.
-
JetBrains pyytää linkittämään lisenssin JetBrains-tiliin. Tilin voinee luoda M365/Microsoft-tilin kautta valitsemalla Sign in with Microsoft ja yhdistämällä suoraan
yliopiston sähköpostiin.
Lisenssi on voimassa vuoden, jonka jälkeen sen voi uusia.
Jos teet yrityksiä väärällä sähköpostiosoitteella (esim. muulla kuin tuo pitkä student-muoto), niin
JetBrains lisää osoitteesi mustalle listalle, ja sen jälkeen osoitteen avaamista pitää pyytää lomakkeella:
Code With Me käyttöönotto: Valitse yläpalkista Tools -> Enable Code With Me ja lopuksi Enable and restart
Session aloitus
-
Yksi ryhmänjäsen käynnistää Code With Me session oikealta ylhäältä löytyvästä kuvakkeesta. (henkilön kuva plus merkillä)
-
Valitse sopivat oikeudet. Edit files sopivin mikäli koodataan yhdessä. Tämän jälkeen valitse Start Session
-
Lähetä liittymislinkki kaikille koodisessioon osallistuville. Linkin saat jälleen oikealta ylhäältä Code With Me valikosta.
Sessioon Liittyminen
-
Mene linkkiin, jonka session aloittaja jakoi ja paina Join Session. Mikäli mitään ei tapahdu, asenna sivun ohjeiden mukaan Toolbox App.
-
Odota, että session aloittaja hyväksyy liittymispyynnön.
Debuggausnäyte
Debuggauksen kuvaus ja ohjeet. Lomakkeet edelleen TIMissä.
Tentti ja arviointi
Tentin päivät ja arviointi
Luennot
Heippa, maailma!
osaamistavoitteet
Tämän osan päätteeksi
- osaat luoda, kääntää C#-lähdekoodia ja ajaa C#-ohjelman, joka tulostaa tekstiä näytölle
- osaat asentaa itsellesi kehitysympäristön C#-ohjelmointia varten ja luoda uuden C#-projektin
- osaat luoda graafisen C#-ohjelman, jossa on erilaisia muotoja
- ymmärrät, millä tavalla (tekstimuotoinen) tieto tallennetaan tietokoneeseen
Harjoituksen päätteeksi sinulla pitäisi olla myös asennettuna kurssin työkalut, sillä kotoa käsin toimiminen edellyttää niiden asentamista. Apua työkalujen asentamiseen saat myös ohjauksissa.
Luennot
Luentojen 1 ja 2 katsominen tukee tätä osaa. Suosittelemme katsomaan luennot ennen tai samanaikaisesti tämän osan lukemisen kanssa.
Tehtävät
Tässä on yhteenveto tämän osan tehtävistä. Tee ne vasta tämän osan lukemisen jälkeen.
Ensimmäinen ohjelma
Lähdekoodin kirjoittaminen
Tietokoneohjelma on joukko ohjeita, jotka tietokone suorittaa. Ohjelmoija kirjoittaa nämä ohjeet käyttäen ohjelmointikieltä, kuten C#. Tätä kirjoitettua koodia kutsutaan lähdekoodiksi.
Olemme kirjoittaneet sinulle valmiiksi pienen C#-ohjelman, joka tulostaa tekstin "Heippa, maailma!" näytölle. Voit klikata koodilohkon oikeassa reunassa olevaa Play-napin muotoista painiketta ajaaksesi ohjelman. Ohjelman pitäisi näyttää teksti Heippa, maailma!.
public class Ohjelma
{
public static void Main()
{
System.Console.WriteLine("Heippa, maailma!");
}
}
Tämä on ehkäpä yksinkertaisin mahdollinen esimerkki, mutta silti se on täysin toimivan tietokoneohjelman lähdekoodi (joskaan ohjelma ei ole maailman mielenkiintoisin)! Lupaamme, että opit pian kirjoittamaan monimutkaisempia ohjelmia itse -- mutta aloitetaan pienestä.
Käydään läpi, mitä ohjelma tekee rivi riviltä:
public class Ohjelma
Tämä rivi määrittelee uuden luokan (engl. class) nimeltä Ohjelma. C#-kielessä kaikki koodi kirjoitetaan luokkien sisälle. Luokka on kuin säiliö, joka voi sisältää tietoa ja toiminnallisuutta.
{
Tämä aaltosulku { kertoo, mistä luokan varsinainen sisältö alkaa. Kaikki, mitä luokan sisällä tehdään, kirjoitetaan tämän ja vastaavan sulkevan aaltosulun } väliin.
public static void Main()
Tämä rivi määrittelee aliohjelman imeltä Main. Tutustumme aliohjelmiin tarkemmin osassa 3, mutta lyhyesti:
aliohjelma on joukko ohjeita, jotka suoritetaan, kun aliohjelmaa kutsutaan. Main-aliohjelma on erityinen, koska se on ohjelman aloituspiste -- tietokone alkaa suorittaa ohjelmaa juuri tästä aliohjelmasta.
{
Vastaavasti kuin luokan kohdalla, tämä aaltosulku kertoo, mistä aliohjelman sisältö alkaa. Kaikki aliohjelman sisällä tehtävä kirjoitetaan tämän ja vastaavan sulkevan aaltosulun } väliin.
System.Console.WriteLine("Heippa, maailma!");
Tämä rivi on itse asiassa se, joka tekee työn: se tulostaa tekstin "Heippa, maailma!" näytölle. System.Console.WriteLine on C#-kielen sisäänrakennettu toiminto, joka hoitaa tekstin tulostamisen konsoli-ikkunaan. Viesti, joka halutaan tulostaa, kirjoitetaan lainausmerkkien sisälle.
Rivi päättyy puolipisteeseen ;, joka tarkoittaa, että kyseinen lause (engl. statement) on loppu. C#-kielessä lauseet päättyvät tyypillisesti puolipisteeseen. Käymme lauseita tarkemmin läpi osassa 2.2, mutta tässä riittää tietää, että lausetta voi ajatella kuin käskynä tai ohjeena tietokoneelle.
}
}
Meillä on enää jäljellä kaksi sulkevaa aaltosulkua. Kuten jo mainitsimme, ne kertovat mihin aliohjelma, ja sitten luokka, päättyvät.
Mitä lähdekoodille oikeastaan tapahtuu?
Kun olet kirjoittanut lähdekoodin, se täytyy muuntaa sellaiseen muotoon, että tietokone voi suorittaa sen. C#-kielen kohdalla tätä muodonmuutosta kutsutaan kääntämiseksi (engl. compilation), ja useiden vaiheiden seurauksena syntyy niin sanottu konekielinen ohjelma, joka voidaan käynnistää tietokoneella. Kääntäminen tapahtuu kääntäjällä (engl. compiler), joka on erityinen ohjelma, joka lukee lähdekoodin ja tuottaa siitä suoritettavan ohjelman. Esimerkiksi Rider-sovelluskehitysympäristössä on sisäänrakennettuna toiminnot kääntämistä varten.
Käännetty ohjelma voidaan sitten ajaa (engl. run), eli käynnistää tietokoneella. C#-kielessä kääntämiseen ja ajamiseen tarvitaan .NET-ympäristö, joka sisältää tarvittavat työkalut -- asennusohjeen löydät Työkalut-kohdasta. .NET-ympäristön asentamisen jälkeen kääntäminen-ajaminen–prosessi voidaan tehdä komentoriviltä seuraavasti. Alla on kaksi komentoa, jotka syötetään komentoriville siinä kansiossa, missä projekti on tehty.
Ohjelma on käännettävä aina koodin muuttamisen jälkeen, jotta muutokset tulevat voimaan.
Sovelluskehittimessä (esim. Rider) kääntäminen tapahtuu klikkaamalla Run tai Debug. Noiden painikkeiden painamiseurauksena tapahtuu sekä kääntäminen että ajaminen.
Miten lähdekoodia kirjoitetaan?
Lähdekoodia voi periaatteessa kirjoittaa millä tahansa tekstieditorilla, eli ohjelmalla, jolla voi kirjoittaa ja muokata pelkkää tekstiä ilman erityisiä muotoiluja tai tyylejä. Olet ehkä jo käyttänytkin tekstieditoria, kuten Muistio (Notepad) Windowsissa tai TextEdit macOS:ssä. Tässä "pelkkä teksti" tarkoittaa, että teksti todella tallennetaan tietokoneen muistiin sellaisenaan; esimerkiksi Word-asiakirjaan tallentuu tosiasiassa aina paljon muutakin tietoa, kuten fontti- ja asettelutietoja.
Lähdekoodi tallennetaan tiedostoon, joka C#-kielen tapauksessa päättyy yleensä .cs -tiedostopäätteeseen, kuten Ohjelma.cs. Tällöin käyttöjärjestelmä tunnistaa tiedoston C#-lähdekooditiedostoksi.
✨ Valinnaista lisätietoa: Käännettävä vai tulkattava kieli?
Monet kielet C#, Java ja C++, ovat käännettäviä, kun taas osa, kuten Python ja JavaScript ovat tulkattavia. Tulkatuissa kielissä lähdekoodia suoritetaan ilman erillistä käännösvaihetta. Tällöin lähdekoodia ajetaan lause lauseelta tulkin (engl. interpreter) avulla. Käännetyt kielet ovat olleet perinteisesti nopeampia, koska käännösvaiheessa voidaan tehdä optimointeja, joita tulkki ei pysty tekemään reaaliajassa.
Nykyaikaiset tulkit ovat kuitenkin pystyneet kuromaan tätä eroa jossain määrin kiinni. Jos käännetyn ja tulkatun kielen välillä täytyy valita, voi valinta toki toki erityisissä tilanteissa (kuten aikakriittisissä tai resurssirajoitteisissa sovelluksissa) riippua suorituskyvystä, mutta usein valinta riippuu myös muista tekijöistä, kuten ekosysteemistä (esimerkiksi saatavilla olevat kirjastot) ja kehittäjäyhteisöstä.
Käännösvirheet
Ohjelma ei toimi, jos siinä on virheitä. Virheet luokitellaan yleensä kahteen kategoriaan: käännösaikaisiin virheisiin (engl. compilation errors) ja suorituksen aikaisiin virheisiin (engl. runtime errors).
Käännösvirheet havaitaan siinä vaiheessa, kun ohjelma käännetään lähdekoodista suoritettavaksi ohjelmaksi. Ohjelma ei käänny, jos se sisältää käännöksen estäviä virheitä, kuten syntaksivirheitä. Tällöin kääntäminen ei onnistu eikä ohjelmaa voi ajaa. Virheet on korjattava ennen uutta kääntämistä. Käännösvirheet näkyvät kääntäjän antamina virheilmoituksina. Esimerkiksi Rider-sovelluskehittimessä virheet näkyvät alareunassa olevassa Errors-välilehdessä.
Alla olevassa ohjelmassa on virhe. Klikkaa Play-painiketta nähdäksesi virheilmoitukset.
public class Ohjelma
{
public static void Main()
{
System.Console.WriteLine("Heippa, maailma!"
}
}
Kääntäjä kertoo, että rivillä 5 sarakkeessa 50 on virhe, jonka syynä on puuttuva sulku ). Kääntäjä kertoo, että ohjelmassa on toinenkin virhe: riviltä 5 puuttuu myös puolipiste ;. Käännösvirheeseen tulostuu aina paitsi rivi- ja sarakenumero, myös C#:n virhekoodi (tässä CS1026 ja CS1002), ja lyhyt kuvaus virheestä.
Korjaa nämä virheet yllä olevassa koodausikkunassa lisäämällä puuttuvat merkit, että saat virheilmoitukset katoamaan, ja ohjelma käännettyä onnistuneesti.
Suorituksenaikaiset virheet puolestaan ilmenevät vasta ohjelman ajon aikana, jos ohjelma kohtaa tilanteen, jota se ei osaa käsitellä. Esimerkiksi jakaminen nollalla on virhe, joka ilmenee (vasta) ohjelman suorituksen aikana. Jos ohjelma yrittää suorittaa tällaisen operaation, ohjelma kaatuu suorituksen aikana.
public class Ohjelma
{
public static void Main()
{
int a = 10;
int b = 0;
int c = a / b;
System.Console.WriteLine("Tulos: " + c);
}
}
📝 Tehtävät
Muokkaa ohjelmaa niin, että se tulostaa
Jyväskylän yliopisto
Informaatioteknologian tiedekunta
Älä kuitenkaan poista äläkä lisää uusia koodirivejä. Muokkaa olemassa olevien rivien järjestystä ja niiden sisältöä.
Tee ohjelma, joka tulostaa sinun nimesi, kännykkäsi merkin ja mallin, ja operaattorisi nimen, kunkin eri riveille.
Ohjelmointiympäristö kuntoon
Ensimmäisten viikkojen tehtävät voi periaatteessa suorittaa verkkoselaimessa, mutta varsin pian on tarpeen saada oma ohjelmointiympäristö toimimaan tietokoneella.
Oman tietokoneen käyttöönottaminen ohjelmointia varten on tärkeä askel kohti itsenäisempää ohjelmointia. Se mahdollistaa esimerkiksi koodin kirjoittamisen, tallentamisen ja suorittamisen ilman internet-yhteyttä. Lisäksi omaa ympäristöä on helpompi mukauttaa omien tarpeiden mukaan, kuten vaihtaa värejä, fontteja ja muita asetuksia. Myöhemmin opit käyttämään versionhallintaa sekä debuggausta, jotka vaativat ohjelmointiympäristön omalla tietokoneellasi.
Rider
Ohjelman koon kasvaessa kannattaa ottaa käyttöön sovelluskehitin eli IDE (Integrated Development Environment). IDE on ohjelma, joka yhdistää yhteen paikkaan kaikki ohjelmien kehittämiseen tarvittavia ominaisuuksia, kuten:
- koodin kirjoittaminen
- koodin kääntäminen ohjelmaksi
- virheiden ja ongelmien etsiminen koodissa
- koodin navigointi- ja refaktorointityökaluja (esim. "Etsi koodista", kirjoittamisen aikaiset ehdotukset, koodin massamuokkaaminen)
- ohjelman virheiden jäljitys eli debuggaus
- samaan asiakokonaisuuteen liittyvän koodin hallinta ("projektit")
- versionhallinnan tuki (esim. Git)
IDE-ympäristöjä on useita eri ohjelmointikielille ja ympäristöille. Ohjelmointi 1 -opintojaksolla käytetään JetBrains-yhtiön tekemää Rider-kehitysympäristöä, joka on erityisesti C# ja .NET-ajoympäristölle tarkoitettu IDE. Riderilla voi tehdä niin tekstipohjaisia sovelluksia kuin Jypeli-pelejäkin.
Riderin asennusohjeet löytyvät Työkalut-sivulta.
Sivuhuomiona mainittakoon, että kaikenlaiset pilvipalvelut ovat yleistyneet, ja myös pilvipohjaisia kehitysympäristöjä on olemassa. Kuitenkin edelleen yleinen käytäntö ohjelmoinnin opiskelussa, kuten myös Ohjelmointi 1 -kurssilla, on asentaa kehitysympäristö omalle paikalliselle tietokoneelle. Oman kehitysympäristön käyttö on yleensä nopeampaa, edullisempaa ja joustavampaa kuin pilvipohjaiset ratkaisut. Myös työelämässä paikalliset kehitysympäristöt ovat yleensä vallitseva käytäntö.
Visual Studio Code
Vaihtoehtoisesti voit käyttää myös Visual Studio Code -editoria (lyhyesti VS Code), joka on hyvin suosittu tekstieditori, jota voi käyttää myös IDE:nä. VS Coden asennusohjeet löytyvät myöskin Työkalut-sivulta.
Alla olevat ohjeet koskevat kuitenkin vain Rideria.
Konfigurointi ja laajennokset
Oletusasetukset koodin muotoilulle ja analysoinnille ovat tämän kurssin näkökulmasta usein turhan aggressiivisia (ts. auttavat turhan innokkaasti tai väärään suuntaan), joten muutetaan asetuksia tämän kurssin suositusten mukaisiksi.
Jos haluat varmuuskopioida nykyiset asetuksesi, tee se valikosta File → Manage IDE Settings → Export Settings.
- Lataa asetuspaketti
(settings.zip) (Linuxissa voi joutua vaihtamaan tarkentimen
.jarlatauksen jälkeen) - Avaa Rider ja valitse Welcome to JetBrains Rider-ikkunassa vasemmasta alalaidasta Configure → Import Settings...
- Etsi ja valitse äsken haettu tiedosto
- Klikkaa OK, sitten Import and Restart
Vaihtoehtoisesti voit mukauttaa asetuksia yksitellen alla olevien ohjeiden mukaisesti.
Ja uusimmassa Riderissa joudut joka tapauksessa alla olevalla manuaaliohjeella poistamaan oikoluvun käytöstä (ainakin toistaiseksi).
vinkki
Pro tip: Jos käytät Rideria usealla tietokoneella, voit synkronoida asetuksesi valitsemalla File → Manage IDE Settings → Settings sync.
Sisäänrakennetun tekoälytäydennyksen kytkeminen pois
Riderissa on sisäänrakennettu tekoälypohjainen täydennys, joka yrittää täydentää kirjoitetun rivin loppuun ympäröivän koodin perusteella:

Aivan opintojakson alussa tämä täydennys ei haittaa, mutta myöhemmin täydennys pikemmin häiritsee sen rajoittuneisuuden vuoksi. Siispä suosittelemme kytkemään se pois seuraavasti:
- Avaa Rider Welcome to JetBrains Rider -näkymään
- Valitse vasemmasta alalalaidasta Configure → Settings
- Mene asetuksissa kohtaan Editor → General → Inline Completion
- Ota ruksi pois kohdasta Enable local Full Line completion suggestions
- Tallenna asetukset Save-painikkeella
Kurssin koodin muotoilu- ja analyysiasetusten ("settings.zip") selitykset (valinnaista lisätietoa)
Seuraavassa on muutamia esimerkkejä varoituksista, joita settings.zipissä on otettu pois päältä. Näistä varoituksista on enemmänkin haittaa kuin hyötyä tämän kurssin kannalta. Ajatus on, että on parempi, että varoituksia tulee vain niistä asioista, jotka on oikeasti syytä ottaa huomioon. Kun opit ohjelmointia lisää, on noista edistyneemmistä varoituksistakin enemmän hyötyä. Kannattaa avata Riderissa joku solution, jos säädät seuraavia käsin.
-
Oikoluku: Poistetaan valitukset suomenkielisistä nimistä:
File/Settings, kirjoita hakukentäänspellja meneSpellingja.NET Languages(taiReSpellerversiosta riippuen) ja ota senEnablepois. -
Huomatus nimiavaruudesta: Kurssilla ei aina käytetä nimiavaruuksia: kirjoita asetusten hakukentään
inspection severityja mene asetuksissaEditor/Inspection Settings/Inspection Severity/C#valitsemallaInspection Severityalla olevista kielistä C#. Pitäisi tulla näkyviin uusi valikko C#:n kielikohtaisia asetuksia. Kirjoita tämän uuden valikon omaan hakuunnamespaceja ota ruksi pois kohdastaNamespace does not correspond to file location, joka löytyy uudesta valikossaConstraints violations- alaotsikon alta. -
Luokasta ole luotu oliota: Kurssilla luokkia käytetään (myös) tallentamaan joukko staattisia aliohjelmia, joten tämä varoitus ei ole relevantti. Samaan tapaan kuin edellisessä kohdassa, mene ensin C#:n kielikohtaisiin asetuksiin:
Editor/Inspection Settings/Inspection Severity/C#ja kirjoita avautuvan valikon hakukentääninstantiatedja ota ruksi pois kohdastaNon-private accessibility, joka on alaotsikonPotential Code Quality IssuesjaClass is never instantiated-asetuksen alla. -
Metodi voisi olla private: Yleiskäyttöiseksi tarkoitetut funktiot kannattaa tehdä julkisiksi, mutta koska niitä ei ole vielä mistään kutsuttu, Rider huomauttaa tästä. Mene taas C#:n kielikohtaisten asetusten valikkoon
Editor/Inspection Settings/Inspection Severity/C#edellisen kohdan tavoin. Haememberja etsiCommon Practices and Code Improvementsalaotsikon altaMember can be made private-asetuksen alla oleva asetusNon-private accessibility, josta ota ruksi pois. -
Luokkaa ei ole määritelty nimiavaruudessa: Koska kurssilla ei aina käytetä nimiavaruuksia: Jos koodissa on jossakin kohti alleviivattuna
class-sanan jälkeinen nimi, niin mene sen nimen alkuun, paina nimeä ja vasemmalle syttyy vasaran kuva. Klikkaa vasaraa ja valitse valikostaInspection: 'Declare types in namespaces'/Configure inspection severity/Do not showkuten kuvassa alla:
Tämän Context Actions-valikon saa auki myös klikkaamalla hiiren oikealla painikkeella alleviivattua kohtaa ja valitsemalla valikostaShow Context Actions. Joissain tapauksissa valikon saa auki rivinumeroiden vieressä olevasta hehkulampun kuvasta.Context Actions-valikon saa auki kursorin kohdalla myös painamallaAlt + Enter. Tällä samalla menetelmällä on helppo säätää pois häiritseviä alleviivauksia, mutta ensin on varmistuttava, että kyseinen asetus/alleviivaus/vihje ei ole itselle tarpeellinen tai huomionarvoinen. -
var-sanan käyttö: Pyritään oppimaan tyyppien merkitystä. Toimi kuten edellä silloin kun ehdotetaan esimerkiksiint ikatyyppisessä lausessaintsanan kohdalle ettäuse var, eli poista tämä huomautus käytöstä. -
Editor/General/Code Completionpoista ruksi "Preselect the best match to insert it by pressing dot, parantheses, and other keys" -
Editor/Inlay Hintspoista ruksi "Enable Inlay Hints in .NET languages"
Suositeltavat käyttöliittymän asetukset (valinnaista lisätietoa)
Tässä on lueteltu muutamia asetuksia, joita luentojen esimerkeissä käytetään tai on käytetty. Jokainen voi toki rakennella ympäristöstään haluamansa, mutta näistä voi olla sinulle hyötyä jos haluat seurata täsmälleen luennolla käytettyjä asetuksia.
Siirrä alaosan paneelit yhteen reunaan.
Tämän
ansiosta esimerkiksi tulosteita on helpompi tarkastella hieman leveämmässä näkymässä. Joissakin tilanteissa
(esimerkiksi debugatessa) joitakin paneeleja voi olla hyvä siirtää tarvittaessa oikeallekin. Voit
myös piilottaa turhia paneeleja näkyviltä kun klikkaat hiiren oikealla kuvakkeen päällä ja sitten Hide.
Paneeleita voi "unpinnata" eli piilottaa näkyvistä silloin kun ne eivät ole aktiivisia. Klikkaa paneelista kolmea pistettä ja valitse View Mode -> Dock Unpinned. Jos unpinnaat esimerkiksi Debug-paneelin, voit ajaa ConsoleMain-sovelluksen (Debug-tilassa), ja painaa ajon jälkeen Esc-näppäintä. Paneeli sulkeutuu ja fokus siirtyy takaisin editoriin. (Ei tarvitse koskea hiireen, JES! :))
Piilota onnistuneen käännöksen "balloon"-ilmoitus. Omasta mielestäni tämä ilmoitus on täysin turha ja vain tiellä. Valitse Settings → Notifications → Build messages → No popup. Suosittelen myös poistamaan valinnan kohdasta Show in tool window, koska harvemmin on tarvetta tietää tarkkoja kellonaikoja milloin käännös on onnistunut tai epäonnistunut.
Koko ruudun tilan saat käyntiin View → Appearance → Enter Full Screen. Minulla näppäinoikotie on Ctrl+Shift+Enter, mutta kuten mitä tahansa näppäinoikoteitä, tätäkin voi muuttaa kohdasta Settings → Keymap. Myös Distraction Free Mode on mielestäni mukava, vaikkakin se piilottaa jotain hyviäkin käyttöliittymäelementtejä, kuten koodialueiden supistamiseen liittyvät pikkukolmiot.
Ns. Uuden käyttöliittymän saat valittua Settings → New UI → Enable New UI. On kuitenkin täysin makuasia kummasta tykkää enemmän, vanhasta vai uudesta UI:sta.
Debug/release-valikon näyttäminen New UI:ssa. Jos käytät uutta käyttöliittymävaihtoehtoa (Settings New UI), kannattaa ns. debug/release-käännösvalikko ottaa käyttöön tässä ohjeessa kuvatulla tavalla.
Ulkoisen konsoli-ikkunan käyttäminen: En itse tätä käytä, mutta jos haluat konsoliohjelman aukeavan ulkoiseen konsoliin katso How to launch console app in external window?
Riderin peruskäyttö: solution ja projekti
varoitus
Jos olet Jyväskylän yliopiston opiskelija, varmista, että tiedät käyttäjätunnuksesi, ja kirjoita se muistiin ennen kuin aloitat tämän ohjeen seuraamisen. Tässä ohjeessa viitataan toistuvasti käyttäjätunnukseen tunnisteella <käyttäjätunnus>. Korvaa tämä aina omalla käyttäjätunnuksellasi.
Rider käyttää ns. solution-projekti-rakennetta koodin organisointiin.
Projekti sisältää yhteen ohjelmaan (peliin tai konsolisovellukseen) liittyvän koodin ja grafiikka- ja musiikkitiedostot.
Projekti kuuluu aina johonkin solutioniin. Yksi solution voi sisältää yhden tai useampia projekteja.
Sivuhuomiona mainittakoon, että solution on Microsoftin keksimä nimi tällaiselle projekteja koostavalle kapistukselle. Sana ei varsinaisesti tarkoita mitään.
Esimerkiksi yksi demokerta voi olla yksi solution joka sisältää useita projekteja (demotehtäviä). Useiden projektien lisäämisessä samaan solutioniin on se etu, että silloin voi pitää samaan demoon liittyvät tehtävät yhtä aikaa näkyvillä ilman että niitä tarvitsee jatkuvasti avata tai sulkea.
Riderissa tehdyt solutionit ja projektit ovat yhteensopivia Visual Studion kanssa.
Suositeltava hakemistorakenne
Kurssilla kannattaa kaikki kurssin asiat tehdä esimerkiksi
alikansion (hakemiston) ohj1 alle. Tuo ohj kansio ohj1
voi alla käyttötarkoituksesta riippuen eri paikassa:
Mikroluokan koneessa
c:\MyTemp\<käyttäjätunnus>\ohj1
ja omassa kannettavassa esimerkiksi:
Windows: `/c/kurssit/ohj1`
Mac ja Linux: `~/kurssit/ohj1`
ja sitten tuon kansion alla on alikansiota tyyliin:
ohj1
|
+-demot
| +-demo1
| | +-HelloWorld
| | +-Lumiukko
| |
| '-demo2
| +-Lumiukko2
| +-LukujenLaskemista
|
'-ohjaukset
+-paate1
| +-HelloWorld
| +-Lumiukko
'-paate2
Eli esimerkiksi demo1 on yksi solution jonka alla on useita
projekteja. Usein projekti on yksi demotehtävä.
Uusi solution
Luodaan uusi solution ja siihen projekti. Tässä esimerkissä luodaan demo1-niminen solution ja siihen Lumiukko-niminen projekti demot-alikansioon:
Mikäli haluat lisätä projektin olemassa olevaan solutioniin, katso luku Uusi projekti olemassa olevaan solutioniin.
-
Valitse
New Solution. Mikäli joku vanha solution on jo auki, niin sama onnistuu yläpalkistaFile/New Solution.
-
Valitse vasemmalta Custom templates -listasta
FysiikkaPeli. -
Anna solutionin nimeksi
demoX, esimerkiksidemo1 -
Anna projektin nimi, esimerkiksi
LumiukkotaiTeht3Lumiukko(Huom Iso alkukirjan!). -
Kirjoita tai selaa poluksi (
<käyttäjätunnus>tilalle oma käyttäjätunnuksesi jos se on eri):- oma Windows kone:
C:\kurssit\ohj1\demot - Mac:
/Users/<käyttäjätunnus>/kurssit/ohj1/demot - Linux:
/home/<käyttäjätunnus>/kurssit/ohj1/demot - mikroluokssa
C:\MyTemp\<käyttäjätunnus>\ohj1\demotHUOM! Yliopiston mikroluokissa projekti tulee tehdä ensin tietokoneen kiintolevylle, esim.C:\MyTemp\<käyttäjätunnus>\.... Siirrä lopuksi tiedostot U-asemallesi tai muualle talteen.
- oma Windows kone:
-
Jätä
Put solution and project in the same directory-boksi tyhjäksi. -
Framework-kohtaannet8.0 -
Klikkaa
Create. -
Levylle syntyy nyt hierarkia:
kurssit - kaikkien kurssien hakemisto ohj1 - ohj1 kurssin hakemisto demot - demojen hakemisto demo1 - demo1:n hakemisto demo1.sln - solutionintiedosto jossa luetellan mitä projekteja Lumiukko - hakemisto jonka alla Lumiukko-projekti bin - hakemisto jonne tulee ajettavaa koodia obj - hakemisto jonne tulee käännettyjä tiedostoja Lumiukko.cs - C#-tiedosto johon tulee lumiukon piirtävä koodi Ohjelma.cs - C#-pääohjelma Lumiukko.csproj - projektin tiedosto jossa kerrotaan mitä tiedostoja projektiin liittyy -
Klikkaa Solution Explorerissa
Lumiukko.cs-kooditiedostoa. Koodissa pitäisi näkyä:public class Lumiukko : PhysicsGame { public override void Begin() { // Kirjoita ohjelmakoodisi tähän PhoneBackButton.Listen(ConfirmExit, "Lopeta peli"); Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); } } -
Kokeile käynnistää ohjelma
Run/Run 'Lumiukko', jolloin pitäisi näkyä uusi ikkuna vaaleansinisellä taustalla. Jos kaikki toimii, sulje ikkuna. -
Pyyhi pois koko se rivi jossa lukee "
Kirjoita ohjelmakoodisi tähän" ja kirjoita tilalleLevel.Background.Color = Color.Black; PhysicsObject pallo = new PhysicsObject(200, 200, Shape.Circle); pallo.Color = Color.White; Add(pallo); -
Käynnistä ohjelma uudestaan ja tarkista että ohjelma muuttui.
-
Kirjoita luokan dokumentaatiokommentti näppäilemällä luokan esittelyrivin (eli
public class...) yläpuolelle kolme kauttaviivaa///. Kirjoita<summary>-tagien väliin selvitys luokan toiminnasta (eli että piirretään lumiukko) -
Kirjoita vastaavasti
Begin-metodin dokumentaatiokommentit.
Uusi projekti olemassa olevaan solutioniin
Oletetaan, että solution on jo olemassa.
Lisätään siihen toinen projekti olemassa olevan lisäksi.
Tässä esimerkissä luodaan uusi ConsoleMain-projekti olemassa olevaan demo1-solutioniin.
- Klikkaa Explorer-paneelissa solutionin
demo1nimeä hiiren oikealla (Macissa kahdella sormella). - Valitse
Add -> New Project - Valitse vasemmalta
ConsoleMain-projektimalli - Anna nimeksi
HelloWorld - Paina
Create. - Ensimmäisellä kerralla projekti ajetaan klikkaamalla Explorerissa sen nimeä
HelloWorldhiiren oikealla ja valitseRun HelloWorld. Myöhemmillä kerroilla voit käynnistää projektin käynnistämällä yläpalkista haluamasi projektin.
Jypeli-projektit
Jypeli-projektin voi tehdä valitsemalla solutionia tai projektia luodessa Custom Templates -kohdasta oikean projektimallin.
ConsoleMain(Konsolisovellukset, joissa on Ohj1 kurssin pohja)Fysiikkapeli(Fysiikkaa käyttävät pelit ja muut graafiset sovellukset)Tasohyppelypeli(Esimerkkipeli)Android Fysiikkapeli(Android-alustaa varten)
Pääohjelma Jypeli-projekteissa (Main)
Jypeli-projektissa Main-pääohjelma menee Ohjelma.cs-tiedostoon, joten jos copy-pastetat
koodin, joka sisältää Main-pääohjelman, niin poista Main-pääohjelma Portaat-luokan (tms. projektisi nimeä vastaava luokka)
sisältä. Projektissa ei saa olla kahta Main-pääohjelmaa.
Sisällön tuominen Jypeli-projektiin (Content-kansio)
Kuvat ja äänet lisätään peliprojektin Content-kansioon, joka näkyy editorin tiedostolistauksessa.
Content-kansion voi luoda klikkaamalla hiiren oikealla projektia → Add → Directory

- Lisää tiedosto klikkaamalla kansiota hiiren oikealla napilla → Add → Add Existing Item
- Valitse tiedosto(t) jonka haluat lisätä ja paina ok.
- Valitse Copy.
- Klikkaa tuomaasi tiedostoa Content-kansiossa hiiren oikealla ja valitse Properties
- Vaihda Copy to output directory -kohtaan "Copy if newer"
Graafinen sovellus Jypeli-kirjastolla
Jypeli on C#-kielellä kirjoitettu pelimoottori, joka on suunniteltu erityisesti opetuskäyttöön. Jypeli tarjoaa helppokäyttöisen tavan pelien luomiseen, mikä tekee siitä hyvän valinnan tälle kurssille.
Jypelin avulla voi luoda 2D-pelejä, joissa on grafiikkaa ja ääniä. Jypeliin on tarjolla paljon valmiita ohjeita ja esimerkkejä TODO: Linkki, jotka auttavat sinua pääsemään alkuun pelien tekemisessä.
Tehdään seuraavaksi pieni Jypeli-esimerkki, jossa luodaan ikkuna ja piirretään siihen ympyrä.
huomautus
Jos haluat kokeilla tätä koodia itse, sinulla tulee olla kehitystyökalut asennettuna; ohjeet löytyvät Työkalut-sivulta.
Luo uusi Fysiikkapeli-projekti Riderissa ja korvaa Begin-metodin sisältö yllä olevalla koodilla. Suorita sitten peli painamalla vihreää "Play"-painiketta ikkunan yläreunassa.
using Jypeli;
public class YmpyraPeli : PhysicsGame
{
public override void Begin()
{
GameObject ympyra = new GameObject(50, 50);
ympyra.Shape = Shape.Circle;
ympyra.Position = new Vector(0, 0); // Asetetaan ympyrä keskelle ikkunaa
Add(ympyra); // Lisätään ympyrä peliin
}
}
Voit käynnistää pelin yllä klikkaamalla oikean yläreunan vihreää "Play"-painiketta. Ikkunaan pitäisi ilmestyä keskelle pieni ympyrä.
Huh! Siinä oli jo aika paljon uutta. Käydään koodi läpi vaiheittain.
Ensimmäinen rivi luo uuden muuttujan nimeltä ympyra, joka on tyyppiä GameObject. Sen leveydeksi ja korkeudeksi annetaan 50.
GameObject ympyra = new GameObject(50, 50);
Seuraavaksi asetamme ympyra muuttujan muodoksi Shape.Circle ja sijainniksi asetetaan vektori, joka osoittaa keskipisteeseen new Vector(0, 0).
ympyra.Shape = Shape.Circle; // Asetetaan muodoksi Shape.Circle
ympyra.Position = new Vector(0, 0); // Asetetaan ympyrä keskelle ikkunaa
Lopuksi lisäämme ympyra muuttujan näkyviin kutsumalla Jypelin Add metodia. ympyra muuttuja on siis olemassa jo heti ensimmäisen rivin jälkeen, mutta se pitää erikseen vielä lisätä "pelimaailmaan".
Add(ympyra); // Lisätään ympyrä peliin
Tehtävät
Asenna Rider ja Jypeli omalle tietokoneellesi Työkalut-sivulla olevia ohjeita noudattaen.
Tiedon esittäminen tietokoneessa
Tietokoneen muistiin tallennetaan lukuja kaksijärjestelmässä eli ns. binäärimuodossa. Tietokoneen muisti koostuu biteistä, jotka voivat olla joko 0 tai 1. Myös lähdekoodimme teksti ja kaikki tieto on oltava lopulta bittimuodossa, jotta tietokone pystyy käsittelemään sitä.
Syy, miksi tietokoneet käyttävät juuri binäärimuotoa piilee tietokoneiden rakenteessa: prosessorit ja muistit on rakennettu kytkimistä, jotka pystyvät luotettavasti erottamaan kaksi tilaa, kuten jännitteisen ja jännitteettömän tilan, jotka voidaan esittää binääriluvuilla 0 ja 1. Vaikka tällainen esitystapa saattaa vaikuttaa yksinkertaiselta tai jopa kömpelöltä, se on erittäin luotettava ja tehokas tapa käsitellä tietoa sähköisissä järjestelmissä.
On hyvä ymmärtää, miten tekstiä, lukuja ja muuta informaatiota esitetään tietokoneessa, jotta voi paremmin hahmottaa ohjelmointia ja tietokoneen toimintaa. Informaation tallennus- ja esitystapa kytkeytyy esimerkiksi ohjelman suorituskykyyn. Myöhemmin opinnoissa tulet törmäämään myös tietoturvaan liittyviin asioihin, joissa tiedon esitystavalla on merkitystä.
Kokonaislukujen esittäminen binäärimuodossa
Siinä missä kymmenjärjestelmässä (kutsutaan usein myös desimaalijärjestelmäksi) on kymmenen eri numeroa, 0-9, kaksijärjestelmässä on vain kaksi eri numeroa: 0 ja 1. Luvun paikka määrittää sen arvon: esimerkiksi 345 tarkoittaa . Voidaan ajatella, että jokaisella luvulla on paikka, joka kertoo sen arvon potenssina kymmenelle (alkaen oikealta, ensimmäinen paikka on 0). Esimerkiksi luvun 345 kohdalla luku 5 on paikassa 0, luku 4 paikassa 1 ja luku 3 paikassa 2.
Vastaava idea toimii myös kaksijärjestelmässä. Kaksijärjestelmässä luvun paikka määrittää sen arvon kahden potenssina: esimerkiksi binääriluku 101 tarkoittaa kymmenjärjestelmässä.
Kun luku halutaan tallentaa tietokoneeseen, on ensiksi on sovittava kuinka monta bittiä on käytetään luvun esittämiseen. Käytämme alla olevissa esimerkeissä 8-bittisiä lukuja, jotta luvut pysyvät yksinkertaisina.
Esimerkiksi luku 7 on 8-bittisessä binäärimuodossa 00000111, koska
Negatiivisten lukujen esittämiseen käytetään yleisesti nk. kahden komplementin menetelmää. Kahden komplementin menetelmässä negatiivinen luku saadaan kääntämällä ensin luvun kaikki bitit (0 -> 1 ja 1 -> 0) ja lisäämällä sitten tulokseen 1.
Negatiivinen luku -7 voidaan esittää kahden komplementin avulla lukuna 11111001. Luku saadaan seuraavasti:
7 = 00000111
// Käänteisluku
~7 = 11111000
// Lisätään 1
~7 + 1 = 11111001
Tosiasiassa 8-bittisiä lukuja käytetään harvoin, ja useimmiten käytetään 32-bittisiä (C#:ssa int) tai 64-bittisiä (long) lukuja. Vastaava ajatus pätee kuitenkin myös näihin suurempibittisiin lukuihin.
Desimaalilukujen esittäminen binäärimuodossa
Desimaaliluvut esitetään tietokoneessa liukulukuna IEEE 754 -standardin mukaisesti. Liukuluvut voivat olla myös erikoisarvoja, kuten NaN (Not a Number) ja Infinity. Liukuluvut ovat likiarvoja, vaikkakin käytännössä jotkin niistä ovat tarkkoja arvoja (kuten luku 1.0).
Esimerkiksi lukua 0.1 ei voida esittää täsmällisesti liukulukuna, koska kaksiarvoisessa järjestelmässä 0.1 on äärettömän pitkä desimaaliluku.
Tekstin esittäminen binäärimuodossa
Tekstin esittämiseen tietokoneessa on olemassa erilaisia merkistöjä ja merkistökoodauksia. Yksi niistä on ASCII (engl. American Standard Code for Information Interchange).
ASCII on sopimus, joka määrittää 128 merkille (mm. aakkoset a-z ja numerot 0-9) yksikäsitteisen numeroarvon väliltä 0-127. Tämän numeroarvon avulla merkki voidaan esittää binäärimuodossa, tallentaa tietokoneen muistiin ja myös lukea sieltä. Esimerkiksi kirjain 'A' on ASCII-koodissa 65, 'B' on 66 jne.
ASCII-koodi on yhä kaikkien modernien koodausten perusosa. (Koodauksella tarkoitetaan tässä yhteydessä merkistön esitystapaa tietokoneessa.) Pelkkä ASCII on kuitenkin sinänsä rajoittunut. Nykyisin oletuskoodaus on useimmiten UTF-8 (Unicode-standardi), joka on taaksepäin täysin yhteensopiva ASCII:n kanssa, joka sisältää käytännössä kaikki maailman kirjoitusjärjestelmät. Ohjelmakoodin kirjoittamisessa käytetään edelleen usein 7-bittisiä ASCII-merkkejä, vaikkakin Unicode-merkit ovat sallittuja monissa ohjelmointikielissä.
Unicode-merkkien määrä on valtava verrattuna ASCII-koodiin: niitä on yli miljoona. Unicode-merkit esitetään yleensä 16-järjestelmän lukuna, eli ns. heksadesimaalina, kuten U+0041 (luku 65, eli kirjain 'A').
Tehtävät
Osan kaikki tehtävät
Osa 2
Katso luennot 3 ja 4
Tämän osan aiheita ovat:
- muuttujat ja tietotyypit
- lausekkeet ja lauseet
- ohjelman rakenne ja suoritusjärjestys
- aliohjelmat
- kommentointi ja dokumentointi
📦 Muuttujat ja tietotyypit
🛝 Lausekkeet ja lauseet
Kommentointi ja dokumentointi
Kommentointi
Tehtävät
Tässä on lueteltu kaikki tähän osaan kuuluvat tehtävät.
Tee TIMissä... Linkki...
🏗️ Ohjelman rakenne
C#-kieli on olioperusteinen ohjelmointikieli, mikä tarkoittaa, että kaikki koodi kirjoitetaan luokkien sisälle. Jokaisessa ohjelmassa täytyy tavallisesti olla vähintään yksi luokka. Luokassa tulee olla Main-aliohjelma, joka toimii ohjelman aloituspisteenä -- siksi sitä kutsutaan myös pääohjelmaksi. Ohjelma suoritetaan järjestyksessä, lause kerrallaan ylhäältä alaspäin Main-aliohjelmasta alkaen. Luokka voi sisältää muitakin aliohjelmia. Pääohjelma voi kutsua aliohjelmia, jotka voivat kutsua taas muita aliohjelmia jne. Ohjelman suoritus päättyy, kun pääohjelma on suoritettu loppuun.
Puhumme aliohjelmista osassa 3.1 Aliohjelmat; tässä osassa keskitymme kuitenkin ohjelman rakenteeseen kokonaisuutena.
Alla oleva sovellus koostuu yhdestä luokasta, joka sisältää pääohjelman ja yhden aliohjelman (Tervehdys), siis yhteensä kaksi aliohjelmaa. Käytäntö on, että yksi tiedosto sisältää yhden luokan, ja että luokan nimi on sama kuin tiedoston nimi.
using System;
public class Sovellus
{
public static void Main()
{
// Ohjelman suoritus alkaa Main-aliohjelmasta
// Tässä kutsutaan Tervehdys-aliohjelmaa kaksi kertaa
Tervehdys();
Tervehdys();
}
public static void Tervehdys()
{
Console.WriteLine("Tervehdys!");
}
}
✨ Valinnaista lisätietoa: "luokaton" ohjelma
C#:ssa (alkaen versiosta 9) voi kirjoittaa ohjelman, jossa ei ole luokkaa eikä pääohjelmaa. Tällöin aivan vasemmalle (vähiten sisennetyt rivit) kirjoitetut lauseet muodostavat niin sanotut top-level statements -koodin. Kääntäjä muodostaa tämän koodin perusteella luokan ja ohjelman aloituspisteen taustalla ilman, että ohjelmoijan tarvitsee sitä erikseen määritellä. Näin on periaatteessa mahdollista kirjoittaa "Hello world"-ohjelma yksinkertaisesti:
System.Console.WriteLine("Hello, World!");
Top-level statements -ohjelmat voivat olla käteviä pikkuohjelmissa ja skripteissä. Isommissa ohjelmissa on usein kuitenkin välttämätöntä kirjoittaa ohjelma luokan ja pääohjelman ympärille. Jos ohjelmassa tarvitaan useita luokkia, täytyy myös pääohjelma määritellä ja sen täytyy olla luokan sisällä. Periaatteessa tällä kurssilla voisimme kirjoittaa lähes kaikki esimerkit top-level statements -muodossa, mutta koska isommissa ohjelmissa joudumme joka tapauksessa käyttämään luokkia ja pääohjelmaa, keskitymme tällä kurssilla perinteiseen luokka- ja pääohjelmarakenteeseen.
🛝 Lauseet ja lausekkeet
Lauseet ja lausekkeet ovat eräitä ohjelman perusyksiköitä. Lauseen (engl. statement) seurauksena tapahtuu jotakin, kun taas lauseke (engl. expression) on asia, jonka arvo voidaan laskea.
Lause voi olla esimerkiksi muuttujan määrittely, aliohjelman kutsu, ehto- tai toistolause, ja näitä suoritetaan yksi kerrallaan. Lauseilla ohjataan ohjelman suoritusta. Lause voi sisältää lausekkeen (tai lausekkeita), mutta sen päätehtävä on suorittaa jokin toiminto (esim. muuttujan määrittely, arvon asettaminen, silmukan käynnistäminen tai ehtolauseen tarkistaminen).
Lausekkeilla tuotetaan arvoja. Lauseke voi sisältää esimerkiksi matemaattisia laskutoimituksia, muuttujia, funktiokutsuja tai niiden yhdistelmiä. Näiden tavoitteena on tuottaa ohjelmaan jokin arvo, joka voidaan toimittaa ohjelmassa eteenpäin jatkojalostettavaksi.
// Lause, joka määrittelee muuttujan a.
// Luku 3 on lauseke -- toki hyvin yksinkertainen sellainen.
int a = 3;
// Lause, joka lisää muuttujan a arvoa yhdellä
a++;
// Lause, jossa b saa lausekkeen a + 5 arvon, eli 9.
int b = a + 5;
// if-lause
if (a > 5) // lauseke a > 5
{
// ...
}
Lauseke voi olla myös aliohjelmakutsu, joka palauttaa arvon. Alla Keskiarvo-aliohjelman kutsu on esimerkki lausekkeesta, kuten myös tulostuslause.
int a;
a = Keskiarvo(3, 5); // Sijoituslause, jossa a saa
// Keskiarvo-aliohjelman paluuarvon
Console.WriteLine($"Muuttujan a arvo on {a}");
Kuten mainittiin, lauseet voivat sisältää lausekkeita. Lausekkeet eivät yleensä sisällä lauseita, mutta tähänkin on hassuja poikkeuksia.
int a = 3;
int b = 5;
if (a++ < b) // a++ < b sisältää sekä lausekkeen että lauseen
{
// ...
}
Tässä esitetty jako lausekkeisiin ja lauseisiin on yksinkertaistus. Se, mihin "lokeroon" jokin koodinpätkä kuuluu, vaihtelee ohjelmointikielen mukaan. Ohjelmointikielen spesifikaatio määrittelee sen, mitkä koodinpätkät ovat lauseita, mitkä lausekkeita, ja mitkä jotakin muuta. Jos asia kiinnostaa enemmän, voit tutustua 📖 C#-kielen spesifikaatioon.
Arvojen laskeminen
💾 Muuttujat ja tietotyypit
Muuttujat ovat ohjelmassa käytettäviä arvoja, joiden arvo voi muuttua ohjelman suorituksen aikana. Niinpä voidaan sanoa, että ohjelman tila koostuu muuttujissa olevista arvoista. Jos muuttujan arvo muuttuu (esimerkiksi käyttäjän vuorovaikutuksen seurauksena), muuttuu ohjelman tila.
C#-kielessä jokaiselle muuttujalle on määriteltävä nimi ja tyyppi ennen käyttöä. Muuttujan tyyppi määrittää tarkasti, millaisia arvoja siihen voi tallentaa. Jos ohjelmoija yrittää tallentaa muuttujaan väärän tyyppisen arvon, kääntäminen epäonnistuu. Valittua tyyppiä ei voi muuttaa ohjelman suorituksen aikana; muuttujan tyyppi säilyy samana koko muuttujan elinkaaren ajan.
Määritellään seuraavassa esimerkissä kolme muuttujaa ja sijoitetaan kuhunkin niihin sopiva arvo.
int luku = 5; // luku-muuttujaan voi tallentaa kokonaislukuja
string nimi = "Maija"; // nimi-muuttujaan voi tallentaa merkkijonoja
bool onkoTosi = true; // onkoTosi-muuttujaan voi tallentaa totuusarvoja
Ensimmäinen muuttuja nimeltä luku on tyypiltään int, eli kokonaisluku. Muita kokonaislukuja voisivat olla esimerkiksi -10, 0 ja 67.
Toinen muuttuja nimeltä nimi on tyypiltään string, eli merkkijono. Merkkijono voi sisältää esimerkiksi kirjaimia, numeroita ja erikoismerkkejä. Esimerkkejä merkkijonoista ovat "Hei!", "12345" ja "Ohjelmointi on kivaa.". Huomaa, että merkkijonot kirjoitetaan lainausmerkkien sisälle.
Kolmas muuttuja nimeltä onkoTosi on tyypiltään bool, eli totuusarvo. Totuusarvo voi olla joko true (tosi) tai false (epätosi). Esimerkkejä totuusarvoista ovat esimerkiksi 5 > 3 (joka on tosi) ja 2 == 4 (joka on epätosi).
Perustietotyypit
Yllä olevassa esimerkissä käytetyt int, string ja bool ovat C#-kielen perustietotyyppejä (engl. primitive data types). Alla on lueteltu C#:n perustietotyypit ja niiden tärkeimmät ominaisuudet:
Lukutyypit:
| Tietotyyppi | Kuvaus | Arvoalue | Esimerkkejä arvoista |
|---|---|---|---|
int | Kokonaisluku | -2 147 483 648 – 2 147 483 647 | -10, 0, 67 |
double | Liukuluku (tarkka desimaaliluku) | n. -1.79 * 10308 – 1.79 * 10308 | 3.14, -0.001, 2.0 |
float | Liukuluku (vähemmän tarkka) | n. -3.40 * 1038 – 3.40 * 1038 | 3.14f, -0.001f, 2.0f |
Muut tietotyypit:
| Tietotyyppi | Kuvaus | Esimerkkejä arvoista |
| string | Merkkijono | | "Hei!", "12345" |
| bool | Totuusarvo | true, false |
| char | Yksittäinen merkki | 'a', '1', '#' |
lisatieto
✨ Valinnaista lisätietoa: C#-kielessä on mahdollista merkitä muuttujan tyypin kohdalle sana var, jolloin kääntäjä päättelee tyypin automaattisesti arvon perusteella. Esimerkiksi var luku = 5; määrittelee luku-muuttujan tyypiksi int, koska arvo 5 on kokonaisluku. Muuttujan tyyppi on kuitenkin edelleen kiinteä, eikä sitä voi muuttaa myöhemmin. Tämä on kätevä ominaisuus, mutta tässä kurssissa keskitymme selkeyden vuoksi eksplisiittiseen tyyppimääritykseen.
Vakiot
Vakio on muuttuja, jonka arvo vakioidaan käännöksessä, eikä arvoa voi muuttaa ohjelman suorituksen aikana. Vakio määritellään const-avainsanalla.
const int MONTAKO_VIHUA = 10; // all caps -tyyli
const string TervehdysSana = "Hei"; // PascalCase-tyyli
Vain sellainen tietotyyppi, jonka arvo voidaan laskea käännösaikana, voidaan määritellä vakioksi. Esimerkiksi oliotietotyypit (esim. int[]) ovat niin kutsuttuja viitetyyppejä (engl. reference types), eikä niitä voida määritellä const-avainsanalla. On olemassa muuttumattomia oliotietotyyppejä (esimerkiksi ImmutableArray), mutta emme käsittele niitä tällä kurssilla, joskin string-tyyppi tekee tähän poikkeuksen.
✨ Valinnaista lisätietoa: Oliot, joiden arvot määräytyvät vasta ajon aikana, voidaan määritellä readonly-avainsanalla. Tällöin muuttujan arvo voidaan asettaa vain kerran. Tämä vastaa kutakuinkin yllä mainittujen perustietotyyppien const-avainsanaa.
Osan kaikki tehtävät
Osa 3
Katso luennot 5 ja 6
Tämän osan aiheita ovat...
- ehtolauseet
- vertailuoperaattorit
- loogiset operaattorit
Tehtävät 2.4--2.7
Tee TIMissä (linkki)
🧩 Aliohjelmat
Aliohjelmat ovat ohjelman osia, jotka suorittavat tietyn tehtävän. Aliohjelmat helpottavat ohjelman rakentamista pienistä palasista, sekä ohjelman ylläpitoa. Aliohjelmat mahdollistavat koodin uudelleenkäytön, sillä aliohjelma voidaan määritellä kerran ja käyttää (eli kutsua) sitä useita kertoja.
Määrittely. Ennen aliohjelman käyttöä se tulee määritellä. Määrittelyssä kerrotaan aliohjelman nimi, mahdolliset parametrit, paluuarvon tyyppi sekä julkisuus. Nämä tiedot kertovat, miten (ja mistä) aliohjelmaa voidaan käyttää.
Alla on esimerkki aliohjelman määrittelystä:
public static void OmaAliohjelma()
{
Console.WriteLine("Tämä on aliohjelma!");
}
publictarkoittaa, että aliohjelma on julkinen ja sitä voidaan kutsua mistä tahansa ohjelman osasta.statictarkoittaa, että aliohjelma kuuluu luokalle eikä oliolle.static-avainsanaa käsitellään tarkemmin Ohjelmointi 2 -kurssilla.voidtarkoittaa, että aliohjelma ei palauta arvoa. Jos aliohjelma palauttaisi arvon,void-sanan tilalla olisi jokin muu tietotyyppi, kutenint,stringtaibool.OmaAliohjelmaon aliohjelman nimi.- Sulkeiden
()sisällä olisi mahdolliset parametrit, joita aliohjelma ottaa vastaan. Tässä esimerkissä aliohjelma ei ota parametreja.
Voimme nyt kutsua aliohjelmaa ohjelman muista osista:
public static void Main()
{
OmaAliohjelma(); // Kutsuu aliohjelmaa ja suorittaa sen. Tulostaa: Tämä on aliohjelma!
}
Katsotaan vielä tarkemmin parametreja, paluuarvoa ja aliohjelman kutsumista.
Parametrit ja paluuarvo. Aliohjelma voi ottaa vastaan tietoa parametreina, ja se voi palauttaa arvon. Alla oleva aliohjelma laskee kahden luvun summan ja palauttaa sen. Aliohjelma ottaa vastaan kaksi parametria ja palauttaa näiden parametrien arvojen summan.
public static int Summa(int a, int b)
{
return a + b;
}
Kutsuminen. Aliohjelmaa kutsutaan kirjoittamalla aliohjelman nimi ja sulkujen sisään argumentit, joita haluamme antaa aliohjelmalle.
int summa = Summa(3, 5);
Console.WriteLine(summa); // Tulostaa 8
{: .terminologia } Aliohjelman kutsussa annettavia arvoja kutsutaan argumenteiksi. Argumenttien arvot välitetään aliohjelman parametreihin. Kirjallisuudessa saatetaan nimittää kumpiakin näistä asioista parametreiksi, mutta tässä käytämme edellä mainittuja termejä.
Jos aliohjelma määritetään void-tyyppiseksi, se ei palauta arvoa, ts. siinä ei ole return-lauseita.
public static void Tervehdys()
{
Console.WriteLine("Moikka!");
}
Jos aliohjelman paluuarvon tyypiksi on määritelty jotain muuta kuin void, aliohjelmassa tulee olla vähintään yksi return-lause. Alla oleva koodi aiheuttaisi käännösvirheen.
public static int Summa(int a, int b)
{
Console.WriteLine(a + b);
// Käännösvirhe: "not all code paths return a value"
}
Osan kaikki tehtävät
Osa 4
Katso luennot 7 ja 8
Tässä osassa...
- toistorakenteet
- merkkijonot
➿ Toistorakenteet
Toistorakenteilla voidaan toistaa jonkin lauseen tai lauseiden suoritusta niin kauan kuin jokin ehto on voimassa. Toistorakenteita ovat while, do-while, for, ja foreach.
Tulostetaan luvut 1-10 käyttäen while-silmukkaa ja for-silmukkaa.
int i = 1;
while (i <= 10)
{
Console.WriteLine(i);
i++;
}
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
For- ja while-silmukoilla voidaan periaatteessa tehdä ihan samat asiat. Tavallista on kuitenkin, että for-silmukkaa käytetään, kun tiedetään, kuinka monta kierrosta silmukkaa halutaan suorittaa. While-silmukkaa käytetään, kun silmukan suorituskertojen määrä ei ole tiedossa etukäteen.
For-silmukkaan kuuluu osat alustus (yllä int i = 1), toistoehto (i <= 10), päivitys (i++) ja runko-osa (aaltosulkeiden rajaama osa). Mikä tahansa näistä osista voi olla tyhjä, mutta puolipisteet on silti kirjoitettava. While-silmukassa on vain toistoehto ja runko-osa. Alustuksesta ja päivityksestä on huolehdittava itse.
Foreach-silmukkaa käytetään erityisesti kokoelmien, kuten listojen ja sanakirjojen kanssa. Foreach-silmukkaa käytetään erityisesti tilanteissa, kun halutaan käydä läpi kaikki taulukon tai kokoelman alkiot. Myöhemmillä kursseilla käydään myös läpi abstrakteja tietorakenteita, joissa foreach-silmukka on kätevä tai jopa ainoa tapa käydä läpi tietorakenteen alkiot.
int[] luvut = { 7, 3, 1, -5, 9};
foreach (int luku in luvut)
{
Console.WriteLine(luku);
}
Huomaa erityisesti, että foreach-silmukassa ei ole erikseen alustus- ja päivityslauseita. Foreach-silmukka soveltuu hyvin tilanteisiin, joissa taulukon tai kokoelman alkiot halutaan käydä läpi ilman, että niiden indeksejä tarvitaan. Foreach-silmukkaa ei voi käyttää, jos taulukon tai kokoelman alkioita halutaan muuttaa.
Silmukoita voi kirjoittaa myös sisäkkäin.
for (int i = 1; i < 5; i++)
{
for (int j = 2; j < 8; j++)
{
// Tulostetaan kaikki mahdolliset
// i:n ja j:n muodostamien parien arvot
Console.WriteLine($"{i}, {j}");
}
}
Tarvittaessa break-lauseella voidaan lopettaa silmukka ja siirtyä silmukan jälkeiseen koodiin. Toisaalta continue-lauseella voidaan tarvittaessa päättää yksi silmukan kierros.
// Tulostetaan luvut 1, 2, 3, 4, 6, 7. Luku 5 jätetään välistä,
// ja luvun 8 kohdalla silmukka lopetetaan.
for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
continue; // Siirrytään seuraavaan kierrokseen
}
if (i == 8)
{
break; // Lopetetaan silmukan suoritus
}
Console.WriteLine(i);
}
Merkkijonot
String
Tehtävät
Tee TIMissä (linkki)
➕ Operaattorit
Ohjelmointikielissä operaattorit ovat erityisiä symboleja tai avainsanoja, jotka suorittavat tiettyjä operaatioita arvojen tai muuttujien välillä. Operaattoreita käytetään lausekkeissa, jotka muodostavat ohjelman logiikan ja toiminnallisuuden.
Aritmeettiset operaattorit
Aritmeettisia operaattoreita käytetään matemaattisten laskutoimitusten suorittamiseen.
+yhteenlasku-vähennys*kertolasku/jakolasku%jäännös
Esimerkkejä:
int a = 10;
int b = 3;
int summa = a + b; // summa on 13
int erotus = a - b; // erotus on 7
int tulo = a * b; // tulo on 30
int osamaara = a / b; // osamaara on 3
int jaannos = a % b; // jaannos on 1
Vertailu- ja loogiset operaattorit
Vertailuoperaattoreita käytetään arvojen vertaamiseen ja ne tuottavat totuusarvon (true tai false) perustuen vertailun tulokseen.
==on yhtä suuri kuin!=ei ole yhtä suuri kuin<pienempi kuin>suurempi kuin<=pienempi tai yhtä suuri kuin>=suurempi tai yhtä suuri kuin
Esimerkkejä:
int x = 5;
int y = 10;
bool onkoYhtasuuri = x == y; // false
bool onkoEri = x != y; // true
bool onkoPienempi = x < y; // true
bool onkoSuurempi = x > y; // false
Loogiset operaattorit
Loogisia operaattoreita käytetään totuusarvojen käsittelyyn
&&JA, on tosi, jos kumpikin arvoista on tosi||TAI, on tosi, jos ainakin toinen arvoista on tosi!EI, kääntää totuusarvon (tosi -> epätosi, epätosi -> tosi)
Esimerkkejä:
int a = 5;
int b = 3;
bool totuus1 = a > b; // true
bool totuus2 = b == 67; // false
bool tulos1 = totuus1 && totuus2; // false
bool tulos2 = totuus1 || totuus2; // true
bool tulos3 = !totuus1; // false
Sijoitusoperaattorit
Näitä käytetään arvojen asettamiseen muuttujille.
=sijoitus+=lisää ja sijoita-=vähennä ja sijoita*=kerro ja sijoita/=jaa ja sijoita%=jäännös ja sijoita++lisää yhdellä--vähennä yhdellä
Lisäys- ja vähennysoperaattorit ++ ja -- voidaan kirjoittaa joko ennen tai jälkeen muuttujan nimen. Jos operaattori on ennen muuttujaa (esim. ++x), sitä kutsutaan etuliitteeksi (engl. prefix), ja jos se on muuttujan jälkeen (esim. x++), sitä kutsutaan jälkiliitteeksi (engl. postfix). Ero näiden välillä tulee esiin erityisesti, kun operaattoria käytetään osana suurempaa lauseketta.
Esimerkkejä:
int luku = 10; // luku on nyt 10
luku += 5; // luku on nyt 15 (10 + 5)
luku -= 3; // luku on nyt 12 (15 - 3)
luku *= 2; // luku on nyt 24 (12 * 2)
luku /= 4; // luku on nyt 6 (24 / 4)
luku %= 4; // luku on nyt 2 (6 % 4)
luku++; // luku on nyt 3
System.Console.WriteLine(luku); // tulostaa 3
System.Console.WriteLine(luku++); // tulostaa 3, sitten luku on nyt 4
System.Console.WriteLine(++luku); // luku on nyt 5, sitten tulostaa 5
↔️ Ehtolauseet
Ehtolauseet ovat rakenteita, jotka suorittavat tiettyjä lauseita vain, jos jokin ehto on voimassa. Ehtolauseella voidaan ikään kuin hypätä sellaisen koodin yli, jota ei ole tarpeellista suorittaa.
Ehtolauseita ovat if sekä switch-case. if-ehtolause voidaan tarvittaessa jakaa useampaan osaan else if ja else-osilla. Rakennetta voidaan havainnollistaa seuraavalla kuvalla.
Koodissa tämä näyttäisi suurin piirtein seuraavalta.
if (EHTO)
{
// Suoritetaan, jos ehto on voimassa
}
Yllä olevassa esimerkissä EHTO-sanan kohdalle kirjoitetaan jokin totuusarvon tuottava lauseke.
Totuusarvoja voidaan tuottaa esimerkiksi vertailuoperaattoreilla. Alla muutama esimerkki
== on yhtä kuin
!= on eri kuin
< on pienempi kuin
> on suurempi kuin
<= on pienempi tai yhtä suuri kuin
>= on suurempi tai yhtä suuri kuin
Vertailuoperaattori vertailee kahta arvoa ja tuottaa true- tai false-arvon.
int a = 5;
int b = 3;
if (a > b)
{
Console.WriteLine("a on suurempi kuin b");
}
Ehtolauseita voidaan ketjuttaa tarvittaessa.
Yllä oleva kuva koodina olisi suurin piirtein seuraavanlaista.
if (EHTO1)
{
// Suoritetaan, jos ehto1 on voimassa
// LAUSE
}
else if (EHTO2)
{
// Suoritetaan, jos ehto2 on voimassa
// ...
}
else
{
// Suoritetaan, jos mikään ehto ei ole voimassa
// ...
}
Vertailuja voidaan yhdistellä loogisilla operaattoreilla, kuten && (ja), || (tai) ja ! (ei).
int luku = 5;
if (luku > 0 && luku < 10)
{
Console.WriteLine("Luku on välillä 0-10");
}
Switch-case
Switch-case-rakenne on myös ehtolauserakenne. Sen avulla voidaan vertailla muuttujan arvoa if-else-lauseiden tavoin, mutta joissain tilanteissa hieman vähemmällä kirjoittamisella.
int luku = 47;
switch (luku)
{
case < 50:
Console.WriteLine("Luku on pienempi kuin 50");
break;
case > 50:
Console.WriteLine("Luku on suurempi kuin 50");
break;
default:
Console.WriteLine("Luku on 50");
break;
}
Osan kaikki tehtävät
Osa 5
Katso luennot 9 ja 10
Tässä osassa...
- toistorakenteet, osa 2
- taulukot
- debuggaus
Toistorakenteet, osa 2
Taulukot
Debuggaus
Tehtävät
Debuggaus
Tässä esitellään lyhyesti debuggauksen tarkoitus ja Riderin tärkeimmät debuggaustoiminnot. Vaikka jokaisessa kehitysympäristössä on omat debuggaustapansa, ovat periaatteet hyvin pitkälti yhteisiä eri ympäristöjen välillä.
Tämä sivu kuuluu myös Ohjelmointi 1 -kurssin debuggausnäytteen esitietoihin. Lue tämä sivu huolellisesti ennen debuggausnäytteeseen tulemista.
Miksi pitää debugata?
Jos ohjelmassa on jotakin vikaa (ohjelmointivirhe eli bug), debuggeri on usein helpoin vaihtoehto vian löytämiseksi (virheenjäljitys eli debug). Ohjelmaa voi debugata myös lisäämällä sinne tänne ylimääräisiä tulostuslauseita, mutta debuggerin avulla ohjelmakoodiin ei tarvitse tehdä muutoksia. Debuggerin avulla ohjelma voidaan myös pysäyttää haluttuun kohtaan ja tutkia muuttujien senhetkisiä arvoja, mahdollisesti jopa muuttaa niitä ennen kuin ohjelman suorittamista taas jatketaan. Tämä ei ole mahdollista tulostuslause-tyylisessä debuggauksessa.
Ohjelmointia opetellessa debuggeri on myös oiva väline askeltaa silmukoita, ehtoja ja aliohjelmia ja näin havainnollistaa ohjelman kulkua itselleen.
Debuggaustila Riderissa
Debuggaustila käynnistetään painamalla Run → Debug tai leppäkertun kuvaa. Tällöin ohjelma voidaan pysäyttää ns. keskeytyskohtien avulla ja tutkia ohjelman tilaa. Jos ohjelmassa ei ole yhtään keskeytyskohtaa, vaikuttaa debugtilassa ajo samanlaiselta kuin "normaalissa" suoritustilassa.
Jos ohjelma tuntuu olevan totaalisen jumissa, voidaan sen ajo pysäyttää ja katsoa, missä kohti ohjelmaa ollaan menossa ja näin ehkä voidaan ratkaista, mistä ohjelman jumi johtuu.
Rider työkalupalkki: 
Kannattaa harjoitella käyttämään näppäinoikoteitä debuggaustilassa, sillä ne nopeuttavat debuggausta huomattavasti. Riderin näppäinoikoteitä saa tarkistettua ja muutettua Configure -> Settings -> Keymap tai File -> Settings -> Keymap.
Keskeytyskohta (breakpoint)
Voit laittaa ohjelmaan keskeytyskohdan (engl. breakpoint), jonka tarkoituksena on keskeyttää ohjelman suoritus haluttuun kohtaan. Toisin sanoen, ohjelma suoritetaan alusta siihen saakka, kunnes tullaan keskeytyskohtaan, johon suoritus sitten pysähtyy.
Riderissa keskeytyskohta asetetaan klikkaamalla sitä rivinumeroa, johon keskeytyskohta halutaan asettaa. Keskeytyskohtaa EI voi asettaa Riderissä tyhjälle riville, kommenttiriveille eikä funktion tai luokan esittelyriville.
Keskeytyskohtia voi olla ohjelmassa useita. Keskeytyskohdan saa pois klikkaamalla sitä uudestaan.

Debuggaustilan käynnistäminen
Ohjelma käynnistyy debuggaustilaan painamalla joko F5, klikkaamalla oikean ylälaidassa olevaa Debug painiketta tai valitsemalla valikosta Run -> Debug. Tällöin ohjelman suoritus "pysähtyy" ensimmäiseen asettamaasi keskeytyskohtaan.

Huomaa, että keskeytyskohdan osoittaman punaisen pallon vieressä on nyt myös keltainen nuoli, joka näyttää seuraavaksi suoritettavan rivin. Toisin sanoen, ohjelman alkuosa on suoritettu rivi riviltä normaaliin tapaan, ja suoritus pysähtyy keskeytyskohtaan siten, että seuraavaksi suoritusvuorossa on tutkittava rivi, jolle keskeytyskohta on asetettu. Korostan: tätä keltaisen nuolen osoittamaa asiaa ei ole vielä suoritettu.
On mahdollista suorittaa ohjelma myös ilman debuggausta (Ctrl + F5 tai valitsemalla Run). Tällöin keskeytyskohdat jätetään huomiotta. Toisaalta silloin myös esimerkiksi mahdollisia poikkeuksia ei käsitellä Riderin avulla.
Askellus (Step into, Step over)
Koodia voidaan askeltaa rivi kerrallaan. Tällöin ohjelman suoritus etenee debuggaustilassa lause kerrallaan eteenpäin. Askellukseen on kaksi erilaista tapaa
- Step into (F11), jos lause on aliohjelmakutsu, askelletaan myös kyseisen aliohjelman koodi
- Step over (F10), aliohjelmakutsujen koodi suoritetaan kerralla ilman askellusta, eli tavallaan hypätään aliohjelman yli
Step over -toimintoa kannattaa käyttää sellaisen aliohjelmakutsun kohdalla, jonka sisäistä logiikka ei ole tarkoitus tarkastella. Esimerkiksi Console.WriteLine- aliohjelmakutsun kohdalla kannattaa mieluummin valita Step over kuin Step into, sillä meitä ei oikeastaan kiinnosta tuon aliohjelman toiminta.
Resume
Resume-toiminto jatkaa ohjelman suorittamista normaaliin tapaan. Mikäli ohjelmassa on myöhemmin keskeytyskohta, ohjelman suoritus keskeytyy siihen.
Debuggaustilan lopettaminen (ohjelman ajon lopettaminen)
Debuggauksen voi lopettaa painamalla Shift + F5 tai valikosta Run -> Stop debugging.
Muuttuja-arvot (locals)
Debuggaus‐näkymän Threads & Variables-paneelissa (tai välilehdellä) näkyy tällä hetkellä näkyvissä olevat muuttujat ja niiden arvot.

Locals-paneelissa voi myös muokata muuttujien arvoja ajonaikaisesti. Esimerkiksi muuttujan "luku"-arvoa voi muokata kaksoisklikkaamalla Value-sarakkeen kohdalta numeroa ja kirjoittamalla uuden luvun vanhan tilalle. Tämän jälkeen kannattaa painaa Enteriä, jotta editori ottaa muutoksen. Riderissa muuttujan arvoa voi locals-ikkunassa muokata painamalla F2 tai klikkaamalla hiiren oikealla ja valistemalla Set Value.

Huomautus double-tyyppisen arvon muuttamisesta: Double-tyyppisen muuttujan arvoa muutettaessa on arvoksi asetettava desimaaliluku, esimerkiksi 3.0. Mikäli asetat arvoksi kokonaisluvun, esimerkiksi 3, debuggeri antaa virheilmoituksen "Error: Size of source and of dest differ".
Watch
Paikallisten muuttujien lisäksi voidaan suorituksen aikana seurata itse valittuja muuttujia Add to Watches toiminnolla. Yksittäisten muuttujien lisäksi voidaan tarkastella lausekkeita, esimerkiksi taulukko[i] > suurin (tuottaisi true tai false).
- Aseta keskeytyskohta haluamaasi paikkaan ja aloita debuggaus.
- Etsi koodista se muuttuja (tai lauseke), jonka tilaa haluat tarkkailla ajon aikana. Valitse se (maalaamalla esimerkiksi hiirellä), klikkaa sitten hiiren oikealla ja valitse Add to Watches. Alla olevassa kuvassa lisätään
suurin-muuttuja locals/watch-paneeliin.


- Voit lisätä eri "watcheja" haluamasi määrän. Alla lisätään myös
i,taulukko[i]jataulukko[i] > suurinwatch-paneeliin.
Huomaa, että watch-paneeliin lisäämäsi muuttuja (tai lauseke) ei välttämättä ole olemassa (ts. ei ole luotu tai ei "näy" sillä hetkellä), joten luonnollisestikaan tilaa ei voida tällöin tutkia. Alla olevassa kuvassa suoritus on menossa vasta rivillä 10.

Tässä esimerkissä i, taulukko[i] ja taulukko[i] > suurin ovat paikallisia muuttujia (lausekkeita) EtsiSuurin-lohkossa ja tulevat näkyviin kun ohjelman suoritus etenee sinne saakka.

Nyt watch-ikkunasta on helppo tarkastella esimerkiksi taulukon arvoja sitä mukaa kun silmukka etenee.

Muuttujan arvon muuttaminen
Tarvittaessa muuttujan arvoa voi muuttaa esim Locals-ikkunassa klikkaamalla arvoa ja sitten antamalla sille uuden arvon.
Ehdollinen keskeytyskohta
Debuggerin avulla voidaan lisätä myös keskeytyskohdalle keskeytymisen ehto. Tällaista keskeytyskohtaa kutsutaan nimellä ehdollinen keskeytyskohta. Sen avulla debuggeri keskeyttää ohjelman suorittamisen vain, kun keskeytyskohtaan annettu ehto toteutuu. Ehto voi olla mikä tahansa totuusarvoinen lauseke, esimerkiksi muuttujan tietty arvo.
Ehdollinen keskeytyskohta on kätevä esimerkiksi tilanteessa, jossa on pitkä silmukka, joka halutaan pysäyttää vain jossain tietyssä kohdassa. Jos ohjelma pysähtyisi silmukan jokaisella kierroksella, olisi hyvin työlästä ajaa ohjelmaa haluttuun pisteeseen. Ehdon voi lisätä seuraavasti:
-
Siirry haluamallesi riville koodissa
-
Siirry rivinumeron koodiin väliin ja klikkaa siihen breakpoint (näkyy punaisena täplänä)
-
Paina breakpointin kohdalla hiiren oikeaa näppäintä saadaksesi esiin valikon
-
Lisää Condition tekstikenttään lauseke, joka saa ajon aikana arvon true tai false, esimerkiksi
luku == 4Sen sijaan
int luku = 4ei ole ehto, eikä kenttään voi myöskään laittaa
if-sanaa. Kun lauseke saa arvon true debuggeri keskeyttää ohjelman suorittamisen. Muutamia muita esimerkkejä ehdoista:i > 3 luvut[i+2] != 3 pallot[i] == null -
Aloita debuggaus
-
Kun pysähtyy, tarkastele Locals- ja Watch-ikkunoista muuttujien arvoja ja jatka tarvittaessa Step into, Step over tai Resume.
Hit Count
Hit Countilla voit laittaa ehdon niin, että kun näin monennen kerran tullaan keskeytyskohtaan, niin silloin pysähdytään.
Kutsupino (call stack)
Jos saa ison ohjelman tutkittavakseen ja pitää korjata jotakin kohtaa eikä tiedä mistä kyseiseen kohtaan tullaan, niin jälleen debuggeri on avuksi. Laita keskeytyskohta tutkittavaan kohtaan, sitten ohjelma käyntiin. Kun ohjelma pysähtyy laittamaasi keskeytyskohtaan, niin kutsupinosta (call stack) voidaan katsoa reitti, mistä pysäytyskohtaan on päädytty.
Jos kutsupinoa ei näy Debug-näkymässä, sen saa esille valitsemalla klikkaamalla paneelin oikeassa yläreunassa olevaa ikkunan näköistä kuvaketta: Layout settings -> Threads Frames -> Side by side.

Riderin kutsupinossa ei valitettavasti näy lähdekoodin rivinumeroita siitä, miltä riviltä kutsuun on lähdetty. Mutta klikkaamalla kutsupinossa hiiren oikealla, voidaan ottaa pinon sisältä leikepöydälle ja sitten tarkastella sitä rivinumeroineen jossakin editorissa.
Ongelmia debuggaustilan käynnistymisessä?
class com.intellij.util.ui.components cannot be cast
Mikäli saat debuggauksen aikana Riderissa poikkeuksen, esim.
class com.intellij.util.ui.components.BorderLayoutPanel
cannot be cast to class com.intellij.ui.OnePixelSplitter
kokeile asetusten resetointia seuraavien ohjeiden mukaisesti
HUOM! Näin tekemällä menetät kaikki asetuksesi, kuten näppäinoikotiet sekä teemat. Ota asetuksistasi halutessasi varmuuskopiot File -> Manage IDE Settings -> Export Settings.
- Paina Shift+Shift (eli kaksi kertaa Shift-painiketta) tai Ctrl+T,
- kirjoita Restore Default settings ja valitse ko. toiminto
- Rider käynnistyy uudestaan, valitse haluamasi asetukset.
Rider clr load callback is already in error state. A debug component is not installed
Jos saat yllä mainitun virheilmoituksen kun yrität käynnistää debuggerin niin ongelmana on todennäköisesti, että Mac-koneelle on asennettu väärä versio Riderista.
Joudut siis asentamaan Riderin uudestaan:
- Mene sivulle: https://www.jetbrains.com/rider/
- Klikkaa Download
- Valitse omalle koneellesi sopiva versio ja lataa se
- Asenna Rider uudelleen
Osan kaikki tehtävät
Osa 6
Katso luennot 11 ja 12
Tässä osassa...
- taulukoita ja silmukoita lisää
- tyyppimuunnokset
Taulukoita ja silmukoita lisää
Tyyppimuunnokset
Tehtävät
Osan kaikki tehtävät
Osa 7
Katso luennot 13 ja 14
Tässä osassa...
- moniulotteiset taulukot
- listat
- muokattavat merkkijonot
Moniulotteiset taulukot
Listat
Muokattavat merkkijonot
Tehtävät
Osan kaikki tehtävät
Osa 8
Katso luennot 15 ja 16.
Tässä osassa...
- C#-kielen tyyppijärjestelmä
- näkyvyysalueet ja nimiavaruudet
- rekursio
C#-kielen tyyppijärjestelmä
Alkeistietotyypit
Näkyvyysalueet ja nimiavaruudet
Rekursio
Tehtävät
Osan kaikki tehtävät
Osa 9
Tässä osassa...
- poikkeukset
- tiedostojen käsittely
Poikkeukset
Tiedostojen käsittely
Osa 10
Tässä osassa...
- ?
?
Osan kaikki tehtävät
Osa 11
Katso yhteenveto-luento
Tässä osassa...
- kertaus
Kertaus
Tässä osassa kerrataan aiemmin opittuja asioita.
Kertaus
Osan kaikki tehtävät
Omat tiedot
Linkit timiin

