Harjoitustyöt ja ohjelmointiympäristöt

Huomaa

Tämän ohjeen yksityiskohdat on kirjoitettu yliopiston ympäristöä (linux-desktop.tuni.fi) varten. Valitettavasti emme voi testata kaikkia erilaisia ympäristöjä, joten omalla koneella voi jokin asia olla hieman eri tavalla.

Yleistä

Kurssilla on kaksivaiheinen ohjelmointiprojekti, joista kummankin vaiheen tekemiseen annetaan aikaa 3-4 viikkoa vaiheen laajuudesta riippuen. Projektit ovat henkilökohtaisia (= valmiin koodin kopiointi kavereilta tai netistä on kielletty) ja projekti on kirjoitettava C++-kielellä.

Projektin ensimmäisestä vaiheesta hyväksytysti läpi pääseminen on edellytys kurssin suorittamiseksi. Projektin toinen vaihe ei ole kurssin läpipääsyn kannalta pakollinen, mutta sen tekemättä jättäminen laskee arvosanaa huomattavasti. Pääsivun Grading-osio kertoo arvionnin yksityiskohdat tarkemmin.

Projektin on oltava samalta kurssin toteutuskerralta kuin muukin osallistuminen, eli aikaisemmin suoritettuja projekteja ei hyväksytä, ellei niin ole erikseen aikaisemmin sovittu.

Ohjelmointiprojektin työmäärä riippuu tietenkin opiskelijan ohjelmointitaustasta, mutta työt ovat sen verran haastavia, että vasta viimeisellä viikolla aloittaminen on varma tapa saada aikaan ongelmia. Aloita suunnittelu ja koodaaminen ajoissa!

Projektin deadlinet ovat aina takarajaksi mainitun päivän lopussa klo 23.59. Työ arvostellaan automaattisesti Plussassa.

Ohjelmointiympäristö

Kurssin harjoitustyö tehdään samassa ohjelmointiympäristössä, jota on käytetty kurssilla COMP.CS.110 Ohjelmointi 2. Eli ohjelmointikielenä C++, graafinen käyttöliittymä (tällä kurssilla annetaan valmiina koodina) Qt:lla ja koodin versiohallinta Git:llä.

Oman koneen käyttäminen

Koska harjoitustyöhön kuuluu olennaisena osana ohjelman tehokkuuden arviointi ja testaus, kenties helpointa on koodata työ omalla koneella ja asentaa sinne QtCreator-kehitysympäristö ja Gcc-kääntäjä. Tällä tavoin muiden opiskelijoiden ajamat ohjelmat eivät pääse vaikuttamaan työhösi ja tehokkuustestien tuloksiin. Voit ladata Qt:n kehitysympäristön ilmaiseksi sivulta https://www.qt.io/download (valitse “Downloads for open source users / Go open source” ja seuraavan sivun alapuoliskossa on nappi: “Download the Qt Online Installer”).

  • Huom 1: Qt:n lataus vaatii käyttäjätunnuksen luomisen - yliopiston sähköposti on tähän oikein sopiva.
  • Huom 2: Vaikka tekisitkin harjoitustyön omalla koneellasi, varmistu siitä että se kääntyy ja toimii etätyöpöydällä (ks. alla), koska assarit tarkastavat työt siellä.
  • Huom 3: Jos sinulla on jo asennettuna vanhempi versio QtCreator+Gcc-yhdistelmästä, varmistaudu siitä että se on riittävän uusi tukemaan C++17:aa. Suosittelemme päivitystä uusimpaan.

Jos asennuksessa on ongelmia, lisää ohjeita löytyy myös Ohjelmointi 2 -kurssin Plussa-sivuilta.

Ainakin varmasti toimii (jos asennat uusimman Qt 6 version, sen pitäisi myös toimia):

  • Windows 11 Qt 6.2.4 ja tärkeänä tarkistuksena MinGW versio 11.2.0 (eli ei 8.jotain vaan 11.jotain), bittisyys tietokoneesi käyttöjärjestelmän mukaan, ensisijaisesti 64-bit
  • Mac OS ARM-prosessorilla: Qt 6.6.0 (toki XCode tai vähintään sen komentojonotyökalut tulee olla asennettuna)
  • Linux (tarkemmin Pop!_OS 22.04 LTS jossa Linux kernel 6): Qt 6.2.4

Etätyöpöytä (virtuaalikone) koodaamiseen

Harjoitustöiden tekemiseen on mahdollista myös käyttää etätyöpöytäyhteyttä linux-desktop.tuni.fi. Koneelta löytyy Git, QtCreator, Gcc yms. työkalut harkkatöiden tekemiseen. Ohjeet etätyöpöydän käyttämiseen löydät Intrasta ja QtCreatorin käyttöön Ohjelmointi 2 -kurssin dokumentaatiosta.

Lopullisten harjoitustöiden tulee toimia kyseisessä ympäristössä. Itse harjoitustyön koodaamisen voi toki tehdä missä ympäristössä tahansa (ja millä työkaluilla tahansa), kunhan ennen palautusta varmistaa toiminnan tarkastusympäristössä.

HUOM! Etätyöpöydällä hae koodisi jonnekin varsinaisen kotihakemistosi alaiseen kansioon (/home/tunnus/…), EI Windows-koneiden verkkolevylle (/intra/home/tunnus)! Verkkolevy ei toimi Linuxissa parhaalla mahdollisella tavalla ja esim. käännetyn ohjelman ajaminen saattaa olla mahdotonta.

Git ja Gitlab

Opiskelijoille luodaan kurssia varten oma henkilökohtainen työskentelytila Git-versionhallintaan, jonka kautta harjoitustyöt tehdään. Etätietovarasto löytyy yliopiston GitLab:sta course-gitlab.tuni.fi. Tietovarastosta löytyy harjoitustyöhön kurssin puolesta tarjottu koodi sekä testimateriaalia.

Huomaa, että jos käytät QtCreatoria, löytyvät Git:n yleisimmät operaatiot suoraan menusta Tools/Git. Tai voit käynnistää Git Gui:n menusta Tools/Git/Git Tools/Git Gui.

Projektin hakeminen GitLabista (clone)

Tässä lyhyt yhteenveto. Voit valita käytätkö Git:ä komentoriviltä vai sen graafisen käyttöliittymän kautta (Git Gui). Molemmat vaihtoehdot toimivat sekä Windowsissa että Linuxissa ja Macissa (ja löytyvät linux-desktopilta). Saatavilla on myös kolmansien osapuolien Git-työkaluja (kuten TortoiseGit), niitä saa käyttää jos haluaa. Git toimii myös QtCreatorista.

Kurssin päivityksien hakeminen git:iin

Kurssin edetessä kurssin puolesta tarjottuihin lähdekoodeihin ja testeihin tulee todennäköisesti päivityksiä. Samoin uudet harjoitustyöt tulevat päivityksinä. Päivityksistä ilmoitetaan sähköpostilla, mutta jos olet unohtanut lukea jonkin niistä, kannattaa ongelmien tai puuttuvien tiedostojen sattuessa varmuudeksi yrittää hakea päivitykset ennen kuin pyytää apua kurssihenkilökunnalta. Alla olevat ohjeet kertovat, kuinka saat päivityksiin tarvittavan upstream-tietovaraston määriteltyä git:ssä ja miten haet päivitykset.

HUOM! Saadaksesi päivityksiä on tärkeää, että ET MUUTA kurssin puolen tiedostoja (mainprogram.cc/hh jne.) tai testitiedostoja. Muuten päivitykset tuottavat helposti ongelmia. Jos välttämättä haluat muokata noita tiedostoja, kopioi ne ensin toiselle nimelle ja muista palauttaa alkuperäisiksi ennen päivitysten hakemista!

Uusien harjoitustöiden ja päivitysten hakeminen Git Gui:lla

  1. Käynnistä Git Gui. Valitse “Open existing directory” ja valitse hakemisto, johon hait projektisi. Windowsissa voit myös klikata oikealla kansiota ja valita “Git Gui”.
  2. Jos et ole tehnyt tätä ennen, määrittele kurssin tietovarasto yhdeksi tietolähteeksesi. Git Guissa valitse Remote/Add…, ja kenttään “Name” syötä “upstream” ja kenttään “Location” syötä https://course-gitlab.tuni.fi/compcs300-fall2023/student_template_project.git Tämä täytyy tehdä vain kerran jokaiselle haetulle projektille. (Jos käytät Git:ä ssh-yhteyttä käyttäen https:n sijaan, vaihda osoitteeksi ylläolevassa komennossa git@course-gitlab.tuni.fi:compcs300-fall2023/student_template_project.git)
  3. Sammuta Git Gui ja käynnistä se uudelleen (tämä vaaditaan tietojen päivittymiseksi).
  4. Hae päivitykset kurssin tietovarastosta paikalliseen tietovarastoosi valitsemalla Remote/Fetch from/upstream.
  5. Upota päivitykset tiedostoihisi valitsemalla Merge/Local merge ja klikkaamalla Merge. Jos Git Gui valittaa “invalid revisions”, ei ole päivitettävää (tai jokin muu ongelma ilmeni).
  6. Tuuppaa päivitykset myös GitLab-tietovarastoosi. Valitse Remote/Push klikkaa Push.

Uusien harjoitustöiden ja päivitysten hakeminen komentorivillä on neuvottu viikko 6 harjoituksissa

Käännös, testaus- ja palautusohje

Kääntäminen

Koska harjoitustyö on C++:aa, täytyy ohjelma tietysti ensin kääntää. Tämän jokainen voi tehdä haluamallaan tavalla, mahdollisuuksia ovat esim.

  • QtCreatorin käyttäminen, jolloin kääntäminen ja ajaminen onnistuu suoraan siellä, ja ohjelmassa on graafinen käyttöliittymä.
  • Komentorivillä kääntäminen, jolloin graafista käyttöliittymään ei tuoteta, vaan ohjelmaa käytetään vain tekstipohjaisesti (esim. g++ -pedantic -Wall -std=c++17 mainprogram.cc mainwindow.cc datastructures.cc -o prg1).

Testaaminen

Ohjelman tulee toimia valmiilla testidatalla, mutta myös omia testiaineistoja kannattaa tehdä ja testata käyttöliittymällä leikkimällä, koska valmis testidata ei pysty testaamaan kaikkea, mikä arvostelussa otetaan huomioon!

Yksittäisiä testejä varten ohjelma täytyy käynnistää siinä hakemistossa, jossa testidatatiedostot ovat. Jos käytät QtCreatoria, projektiin täytyy ensin säätää ohjelman ajohakemisto. Klikkaat QtCreatorin vasemmasta reunasta Projects ja sieltä läheltä yläreunaa tai vasemmasta reunasta (QtCreatorin versiosta riippuen) valitset “Run” (siellä on Desktop-valinnan alla nappulat Build ja Run, joista oletuksena Build on valittuna. Build:llä säädetään kääntämistä, Run:lla ajamista). Nyt ikkunan keskeltä kohdasta Run pitäisi löytyä kenttä “Working directory”. Sen kun vaihdat hakemistoksi jossa koodit ja testit ovat, niin QtCreator käynnistää ohjelman siellä (uusi QtCreator ja vanha QtCreator).

Ajaessasi ohjelmaa komentotulkilla ilman graafista käyttöliittymää taas siirryt siihen hakemistoon, jossa testit ovat (cd-komento), ja sitten käynnistät ohjelman siitä hakemistosta, johon se on käännetty/kirjoitettu: “./prg1” (ylläolevalla käännöskomennolla). Komentorivillä ohjelmalle voi antaa myös parametrina tiedoston, josta komennot luetaan (jolloin ohjelma lopettaa komennot luettuaan): “./prg1 example-in.txt”.

HUOM! Pääohjelma tulostaa cerr:iin “Program ended normally” viimeisenä toimintonaan. Jos tuota tulostusta ei näy, ohjelma on kaatunut!

STL:n käytön debuggaaminen

Iteraattoreiden mitätöityminen, yli-indeksoinnit ja virheet STL:n algoritmien käytössä ovat tavallisia ja usein vaikeasti löydettäviä virheitä. Onneksi gcc:llä pystyy kääntämään ohjelman myös “debug-STL”-tilassa, jolloin kääntäjä lisää koodiin ylimääräisiä tarkastuksia, jotka pysäyttävät ohjelman virheilmoitukseen monissa STL:n käyttöön liittyvissä virhetilanteissa (ei kuitenkaan aivan kaikissa).

Debug-STL:n käyttämiseksi kääntäjälle täytyy vain antaa sopivat parametrit ja kääntää ohjelma uudelleen. Tämän helpottamiseksi QtCreatoria käytettäessä harjoitustyön .pro-tiedostossa on alussa pois kommentoituna rivi “#QMAKE_CXXFLAGS += -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC”. Poistamalla kommenttimerkki tuon rivin alusta ja kääntämällä koko ohjelma uudelleen (“Rebuild All” Build-valikosta) ohjelma alkaa käyttää lisätarkastuksia. (Jos käytät gcc:tä ilman QtCreatoria, voit lisätä “-D…” -parameterit käännöskomentoon, ts. “g++ -D…”.)

Huomaa, että lisätarkastukset vievät aikaa, joten debug-STL:ää käytettäessä ohjelman suoritus on usein paljon normaalia hitaampaa, usein jopa asymptoottisesti! Pidä siis huoli, että kytket debug-STL:n pois päältä (kommentti takaisin ja rebuild) ennen tehokkuustestien ajamista!

Valmiit testit

Omaa koodia kannattaa ehdottomasti testata itse interaktiivisesti sekä tehdä omia komentojonoja, joita voi sitten ajaa useita kertoja korjausten yhteydessä. Kurssin puolelta annetaan myös joitakin yksinkertaisia testejä, joista tulee tänne lisää aikanaan.

Kurssin puolelta koodihakemistossa on jonkin verran simppeleitä testejä, joita voitte käyttää. Löytyvät päivityksen jälkeen samasta hakemistosta kuin koodit. Ylimmältä tasolta löytyy myös tiedosto README-tests.txt, joka kuvailee valmiina annetut testit.

Tehokkuustestistä

Tehokkuustestin tarkoituksena on antaa tietoa, jonka perusteella ohjelman asymptoottista tehokkuutta voi arvioida. Kuten työohjeessa kerrotaan, testi tyhjää tietorakenteen, lisää sinne kasvavan määrän alkioita ja sitten ajaa tietyn määrän satunnaisia komentoja. Tähän menevä aika ilmoitetaan.

Tehokkuuden arviointia ja tehokkuustestien tulkintaa käsitellään viikon 8 videoilla.

Palauttaminen

Tällä kurssilla harjoitustöiden palautuksessa käytetään Git-versionhallintaa ja Plussaa. Palautus tehdään seuraavasti:

  • Työn toiminnallisuuden testaaminen on myös sinun vastuullasi, muista siis testata myös lokaalisti.
  • Varmistu, että kaikki koodisi on lisätty git:iin!! (git add, git commit)
  • Päivitä (push) koodisi vielä kertaalleen GitLabiin (git push origin)
  • Mene nettiselaimella Course-GitLabiin ja varmistu, että kaikki tiedostosi tosiaan löytyvät sieltä ja sisältö on oikea! (Erityisesti että viimeisin versio on varmasti työnnetty Gitlabiin, tämän saa varmistuttua esim. katsomalla että Gitlab-tietovaraston etusivulla viimeisin commit-viesti on oikea).
  • Lähetä Plussaan vasta kuin kaikki on varmasti tallennettu Gittiin.
  • Huomaa, että myös dokumentaation tarkastus hoituu automaattisesti docs/readme-gradereiden avulla