Ohjelmointi 1 / 2010

Demo 5 / 11.10

Tehtävät

V1.

Tee Ville-tehtävät: 4.1, 4.2, 4.3, 4.4, 5.1, 5.4, 9.1

T1.

Jos tarkistat vähintään kahden funktion toiminnan automaattisella testillä (ComTest ja/tai JUnit), saat merkitä yhden lisäpisteen.

1.

M: 15. Toistorakenteet: Ota edellisen kerran guru-tehtävänLuvutGraafisesti.java mallivastaus ja muuta sitä niin, että piirraKuva -aliohjelma piirtää taulukon suu­rimmat arvot punaisella ympyrällä, pienimmät vihreällä ympyrällä ja loput mustilla ympy­röillä.

2.

M: 15. Toistorakenteet: Edellistä matkien tai edelliseen lisäten tee toinen (kuormitettu, overloaded) aliohjelma piirraKuva, jolle viedään taulukon lisäksi parametrina luku, jota pienemmät arvot piirretään vihreällä ja toinen luku, jota suuremmat arvot piirretään punaisel­la (yhtäsuuruus mukana). Voitko tehdä tehtävän 1 käyttäen tätä aliohjelmaa? Voiko tätä käyttäen piirtää myös samanlaisen kuvan kuin edellisen kerran Guru-tehtävässä?

3.

M: 14. Taulukot: Ota luennolla tehty taulukkomalli: Taulukot.java ja muuta se sellaiseksi, että siinä on aliohjelma tulostaYli(taulukko,raja), joka tulostaa taulukosta kaikki ne luvut, jotka ylittävät annetun rajan (päätä itse ja hoida kommentoinnilla, että kuuluuko raja tulostet­taviin vai ei). Tee vastaava funktio summaYli(taulukko,raja), joka pa­lauttaa rajan ylittävien taulukon lukujen summan.

4.

M: 15. Toistorakenteet: Tee aliohjelma tulostaKertotaulu(n), joka tulostaa n:n kertotaulun for -silmukalla. Esimerkiksi tulostaKertotaulu(3) tulostaisi:
 1 * 3 =   3
 2 * 3 =   6
 3 * 3 =   9
 4 * 3 =  12
 5 * 3 =  15
 6 * 3 =  18
 7 * 3 =  21
 8 * 3 =  24
 9 * 3 =  27
10 * 3 =  30
Tee vielä tulostaKertotauluWhile(n,m), joka tulostaa n:än kertotaulusta m-riviä. Toteutus while-silmukalla. Esimerkiksi tulostaKertotauluWhile(3,5) tulostai­si:
 1 * 3 =   3
 2 * 3 =   6
 3 * 3 =   9
 4 * 3 =  12
 5 * 3 =  15
Tee sama vielä do-while -silmukalla. Mitä tulostakertotauluDoWhile(6,0); tulostaa jos ei tehdä mitään erikoislisäyksiä? Mitä pitäisi lisätä?

5.

M: 14. Taulukot: Tee funktioaliohjelma summaa(luvut), joka laskee yhteen taulukossa olevat parilliset luvut ja vähentää niistä parittomat luvut. Funktio palauttaa tuon summan. Aloita kirjoittamalla pääohjelma, jossa mietit kuinka aliohjelmaa kutsutaan.

6.

Tee funktio(aliohjelma) alkaaIsolla(sana), joka palauttaa true jos parametrinä viety merkkijono alkaa isolla kirjaimella. Tee tätä käyttäen ohjelma, joka komentoriviltä käyttäen toimii seuraavasti (vinkki: Character-luokka, args-taulukko):
java demo5.AlkaaIsolla kissa Kana Koira kettu Mato 2Kanaa
Isolla alkaa:
 1. argumentti = Kana
 2. argumentti = Koira
 4. argumentti = Mato
Eclipsessä F11 -ajoa varten argumentteja voi antaa seuraavasti:
Oletetaan että AlkaaIsolla on jo kerran Eclipsessä ajettu:
  Run/Debug Configurations/AlkaaIsolla/Arguments
ja sitten kirjoitetaan halutut parametrit Program Arguments -kohtaan.         

7.

Tarkoitus olisi tehdä ohjelma, joka soittaa ”kahdella” kädellä. Oikealla kädellä soitetaan annetut nuotit kuten SoitaKappale.java demon vastauksessa. Vasemmalla kädellä soitetaan oktaavia alempaa vain C-nuotit. ”Kahden käden” soittamisesta voit katsoa mallia Music-kirjaston Wiki-sivulta. Tee funktio
public static String vasemmanKappale(String kappale)
joka palauttaa merkkijono jossa kaikki muut ISOT kirjaimet paitsi C on vaihdettu - -merkeiksi (eli tauoiksi). Uusi ohj1.jar sisältää Music-kirjastosta version, jossa voi tauonkin perässä olla ylennys- tai alennusmerkki ilman että kappale ”hajoaa”. Eli esimerkiksi jono
ACCF#   =>  -CC-#   (ja -# on vain normaali tauko)
Vaihda siis SoitaKappale-esimerkissä MidiPlayerin tilalle BufferedMidiPlayer2 ja soita jono kappale 1-kanavalla ja 2-kanavaa varten muunna kappale em. funktiolla ja soita näin syntynyt jono kappale2
mp.play(2,kappale2,0.25,3);
Halutessasi voit valita 2-kanavalle toisen soittimen.

B1.

M: 14. Taulukot: Tee funktioaliohjelma moodi(luvut), joka etsii taulukon yleisimmän luvun. Jos eniten esiintyviä on yhtä monta, niin silloin ensimmäisenä vastaantuleva tulkitaan yleisimmäksi. Mieti ensin tarkasti kuinka itse ratkaisit tämän ongelman (eli mieti algoritmi). Et tarvitse aputaulukkoja välttämättä, vaan tehtävän voi ratkaista muutamalla apumuuttujal­la. Tämä on yksi keskiluvuista. Toinen on keskiarvo. Kirjoita tätäkin varten funktioaliohjel­ma. Kolmas keskiluvuista on mediaani, eli aineiston keskimmäinen alkio. Tätä ei vielä tar­vitse tehdä. Mitä mediaanin laskemiseksi pitäisi ensin tehdä? Katso vaikka Wikipediasta keskiluku.

GURU-tehtävät

G1-2

Tehtävässä 2 voi vielä joku haluta vaihtaa värejä. Parametrilistat kasvavat tällöin kohtuutto­man pitkiksi. Yksi hyvä ratkaisu on tehdä ympyröiden piirtäjästä olio. Tee tarvittava luokka niin, että alla oleva pääohjelma toimii:
    public static void main(String[] args) {
        double luvut2[] = {1.9,3,2,2.4,1.2,2.6,3.2,3.1};
        Window ikkuna = new Window(600,400);
        ikkuna.scale(0,-1,luvut2.length,4);
        ikkuna.add(new Axis(100,100,0));

        TaulukkoYmpyroina t2 = new TaulukkoYmpyroina(luvut2);
        ikkuna.add(t2);
        t2.setMinColor(Color.BLUE).setMaxColor(Color.ORANGE).
           setColor(Color.PINK).setR(0.4).setMin(2).setMax(3);
        
        ikkuna.showWindow();

    }