Helsingin yliopisto / Tietojenkäsittelytieteen laitos / Ohjelmoinnin jatkokurssi
Copyright © 2009 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.

2. harjoitukset 9.-13.11.2009

Nämä toiset harjoitukset ovat hyvä testi niille, jotka ovat suorittaneet ohjelmointikurssin jollakin muulla kielellä kuin Javalla tai Ohjelmoinnin perusteet -kurssin suorituksesta on jo aikaa. Tämän verran siis Javaa oikeastaan on osattava jo ennen tätä kurssia! Eivät nämä tehtävät toki ihan helppoja ole Ohjelmoinnin perusteet -kurssin juuri suorittaneillekaan!

  1. & 2. [Tämä tehtävä liittyy Ohjelmoinnin perusteet -kurssin oppimateriaalin lukuun 2.6 Luokista ja olioista]

    Luokan Opiskelija määrittely alkaa seuraavasti:

    public class Opiskelija {
    
      private String etunimi;
      private String sukunimi;
      private int koepisteet;       // saa olla vain 0-50
      private int harjoituspisteet; // saa olla vain 0-10
    
      public Opiskelija(String etunimi, String sukunimi) {
        this.etunimi = etunimi;
        this.sukunimi = sukunimi;
        this.koepisteet = 0;
        this.harjoituspisteet = 0;
      }
      //---------------------------
      public String getEtunimi() {
        return this.etunimi;
      }
      public String getSukunimi() {
        return this.sukunimi;
      }
      public int getPistesaalis() {
        return this.koepisteet + this.harjoituspisteet;
      }
      //---------------------------
      ...
    
    Täydennä luokkaa metodein

    Voit ohjelmoida luokkaan muitakin hyödyllisiä metodeita.

    Havainnollista Opiskelija-olioiden käyttötapaa luokkaan sijoitettavalla pääohjelmalla.

    Huom: Asettavat ja ottavat aksessorit on nimetty Javan omassa kalustossa hyvin johdomukaisesti etuliitteillä "set" ja "get", esim. setValue, getValue. Asettavalle aksessorille luonteva suomalainen nimeämistapa olisi asetaArvo, mutta hyvää ottavan aksessorin nimeä on vaikeampi keksiä: otaArvo, annaArvo, haeArvo, ... Mikään noista ei ole kovin hyvä. Tässä tehtävässä käytetty englannin ja suomen sekoittaminenkin voi jotakuta häiritä. Pohdi asiaa. Mikä olisi mielestäsi paras ja selkein tapa?

  1. & 4. [Tämä tehtävä liittyy Ohjelmoinnin perusteet -kurssin oppimateriaalin lukuun 2.8 Taulukko-olioista]

    Käytetään edellisen tehtävän luokkaa: Ohjelmarivi

        Opiskelija[] opiskelijat = new Opiskelija[9];
    
    asettaa muuttujan arvoksi yhdeksänalkioisen taulukon, jonka alkiot voivat saada arvokseen Opiskelija-olioita. Tämän jälkeen esimerkiksi lause
        opiskelijat[6] = new Opiskelija("Pekka", "Puupää");
    
    asettaa taulukon seitsemännen alkion arvoksi sellaisen Opiskelija-olion, jolle
       opiskelijat[6].getEtuimi() 
    
    on arvoltaan "Pekka" ja
       opiskelijat[6].getPistesaalis()
    
    on alkuarvoltaan 0

    Laadi sovellus, joka pyytää opiskelijoiden tiedot ja tulostaa ne pistejärjestyksessä arvosanoineen. Saman pistemäärän saaneet opiskelijat tulostetaan "aakkosjärjestyksessä". Käytä järjestämisessä vertailun välineenä Opiskelija-luokan metodia compareTo. Toteuta tietojen kysely, järjestäminen ja tulostaminen yksityisinä luokkametodeina, "pääohjelman pikku apulaisina".

    Tulostuksen ulkoasu on seuraavanlainen:

    Tulos   Nimi
    
    5  50   Juonio, Jussi
    5  50   Mainio, Matti
    4  46   Vemmelsääri, Väiski
    3  42   Ankka, Aku
    3  42   Ankka, Taavi
    3  40   Puupää, Pekka
    2  39   Hirmuinen, Harald
    1  31   Hopo, Hessu
    0  15   Lipponen, Pekka
    
    

  1. Olkoon int a = 3; ja int i = -4; Selvitä i:n ja a:n arvo seuraavien sijoituslauseiden jälkeen. Ajatellaan että lauseet suoritetaan erillisinä, ei peräkkäin. Mitään muuta ei tehdä määrittelyiden ja lauseen välissä. Varaudu selittämään miksi arvot muodostuvat sellaisiksi kuin muodostuvat, älä tyydy vain selvittämään arvoja tietokoneella.
            a)      a = ++i;
            b)      a = i++;
            c)      a = --i;
            d)      a = i--;
            e)      a += i++;
            f)      a *= ++i + i++;
            g)      a -= i++ - --i;
            h)      a -= (i++ - --a) + (++a + i--);
            i)      a += (i += ++a) - (a -= i--);
            j)      a += (a += a--) + (a = i = a++);
    
    
    Mitä mieltä olet tällaisesta ohjelmoinnista? Tämä tehtävä on kuin rokotus; sen on tarkoitus tuottaa "vasta-aineita", jotta tuollainen ohjelmointityyli ei pääsisi jatkossa vaivaamaan...


Takaisin harjoitussivulle.