Jos haluat käyttää JHAVEPOPia kurssillasi tai sinulla on kysyttävää JHAVEPOPista, voit ottaa yhteyttä David Furcyyn sähköpostitse furcyd@uwosh.edu

JHAVEPOP toimii hyvin ainakin seuraavilla selaimilla: Firefox, IE7, Safari, Opera, Konqueror.
Testatuista selaimista vain IE6:lla ilmeni ongelmiadynaamisesti generoitujen .jnlp tiedostojen avaamisessa.

Linkitettyjen listojen käsittely JHAVEPOPia käyttäen


Yleistä

Ensimmäiset 20 harjoitusta tällä nettisivulla ovat hyvin lyhyitä. Niiden tavoitteena on opettaa osoittimien ja linkitettyjen listojen käsittelemiseen liittyviä perusoperaatioita. Näiden jälkeen tulee viisi pidempää ohjelmointitehtävää, jotka ovat haastavampia. Niiden tavoitteena on opettaa suunnittelemaan ja toteuttamaan algoritmeja linkitettyjen listojen käsittelemiseen. Ennen kuin aloitat tehtävien tekemisen lue JHAVEPOPin käyttöön liittyvät ohjeet huolellisesti.

JHAVEPOP näyttää ohjelman muistissa olevien muuttujien tilanteen visuaalisesti samalla, kun ohjelmaa suoritetaan. Kun kirjoitat C++-koodia JHAVEPOPin syöteikkunaan, JHAVEPOP muodostaa ohjelman ajosta kuvasarjan, jonka avulla voit testata ja debugata ohjelmaasi.

Ohjeita JHAVEPOPin käyttöön
  1. Aluksi lue tehtävänanto kokonaan niin, että ymmärrät sen.
  2. Suunnittele ohjelmasi paperilla. Sen jälkeen kirjoita ohjelmakoodisi valmiiksi valitsemaasi tekstieditoria käyttäen.
  3. Kopioi ohjelmakoodisi JHAVEPOPin syöteikkunaan katsoaksesi visualisointia. Eli kun ohjelmakoodisi on valmis testattavaksi klikkaa punaista nappulaa, josta JHAVEPOP käynnistetään (jokaisen tehtävän ja testitapauksen kohdalla on oma nappulansa). Odota kunnes aukeaa ikkuna, jossa pyydetään kopioimaan koodi. Ikkunassa on jo valmiina muutama koodirivi. Älä muuta näitä rivejä (niiden tarkoitus on valmistella harjoituksen alkutilanne). Yksinkertaisesti kopioi oma koodisi näiden rivien alapuolelle ja klikkaa OK.

    Se on siinä!

    Tämän jälkeen visualisointi käynnistyy ja näet ensimmäisen kuvan. Sen alapuolella ovat kontrollipainikkeet, joiden avulla voit siirtyä eteen ja taaksepäin kuvasarjassa. Oikealla puolella näet kirjoittamasi ohjelmakoodin ja korostettuna sen rivin, jota ollaan suorittamassa. Voit myös klikata "Info" sivua (ylhäällä oikealla), jos haluat enemmän tietoa JHAVEPOPista.
  4. Jos ohjelmakoodissasi on virhe, näet visualisoinnin avulla, miten ohjelmasi toimii väärin, ja sinun on helpompi selvittää, missä vika on. Tee korjaus ohjelmakoodiisi käyttämässäsi tekstieditorissa. Kun korjaus on valmis testattavaksi, siirry "Setup" sivulle (JHAVEPOP ikkunan vasemmassa yläreunassa) ja klikkaa "Visualize"-nappulaa (alhalla oikealla). Tämän jälkeen voit kopioida korjatun koodisi ikkunaan.
  5. Kun saat harjoituksen valmiiksi, sulje JHAVEPOP-ikkuna sen oikeassa yläkulmassa olevasta X-nappulasta. Siirry seuraavaan harjoitukseen.
Ohjeita C++-koodin kirjoittamiseen

JHAVEPOP on itseasiassa C++-tulkki. Tulkissa on sisään rakennettu tietuetietotyyppi (struct), jonka nimi on Node ja jolla on kaksi kenttää: info, joka on tyypiltää 'char', ja next, joka on tyypiltään Node *. Tätä structia käytetään linkitetyn listan yhden alkion esittämiseen ja muuttujat on kuvallisesti esitetty JHAVEPOPissa näin: Koska harjoitusten tarkoituksena on opettaa linkitetyn listan käyttämistä, JHAVEPOPin tulkki ymmärtää vain rajoitettua osaa C++:sta: sijoituslauseet, if-lauseet, while- ja for-silmukat. Seuraavassa listassa esitellään ohjelmarakenteet, joita voit käyttää:

Ohjelmarakenne Esimerkkejä
1. Osoittimiin sijoittaminen
p1 = p4->next; p1->next = NULL;
2. Muistinvaraus
p3->next->next = new Node('B',NULL);
3. info-kenttään sijoittaminen
p1->next->info = 'C'; p1->info = p4->next->info;
4. Muistin vapauttaminen
delete p1;
5. if-lause
if( p1 == NULL ) { ... } else { ... }
6. while-silmukka
while( ( p1 != NULL ) && ( p1->info == 'A' ) ) { ... }
7. for-silmukka
for( p1 = p2; p1 != NULL; p1 = p1->next ) { ... }
8. break-lause
break;


Huomaa, että KAIKKIIN if-lauseisiin ja silmukkarakenteisiin liittyviin lohkoihin pitää aina kirjoittaa lohkosulkeet { }. Myös silloin kun lohko sisältää vain yhden lauseen. if-lauseiden ja silmukoiden ehdot pitää ilmoittaa bool-tyyppisinä lausekkeina, jotka pitää suluttaa täydellisesti. bool-tyyppinen lauseke voi vertailla osoittimien tai info-kenttien arvoja, tai char-literaaleja, kuten 'A' tai '1' jne. Näitä yksinkertaisia bool-tyyppisiä lausekkeita voidaan yhdistää loogisten operaattoreiden '&&' ja '| |' avulla, mutta yhdessä bool-tyyppisessä lausekkeessa EI saa olla enempää kuin yksi looginen operaattori. Eli jos haluat muodostaa pidemmän bool-lausekkeen, tee se sulkeiden avulla esimerkiksi seuraavasti: ( A && B ) && C.

JHAVEPOP EI tue seuraavia ominaisuuksia: Vaikka JHAVEPOP sallii osoitinmuuttujien määrittelemisen oman koodisi alussa (ei koodilohkojen sisällä), näissä harjoitustehtävissä EI ole tarkoitus määritellä lisää muuttujia, vaan harjoitukset on mahdollista ratkaista käyttäen valmiiksi määriteltyjä muuttujia.

Pienet harjoitustehtävät



ExerciseAlkutilanneLopputilanne
1 Käytä sijoitustalausetta ja käännä osoitin p osoittamaan alkioon, jonka info-kentän arvo on '2', eli aiheuta listaan muistivuoto.
Ratkaisu valmiina?
2 Tee tehtävä 1 uudelleen, mutta tällä kertaa käyttäen osoitinta q sijoituksessa, eli toisinsanottuna aseta p osoittamaan samaan alkioon kuin mihin q osoittaa.
Ratkaisu valmiina?
3 Käytä sijoitustalausetta ja käännä osoitin q osoittamaan alkioon, jonka info-kentän arvo on '1'.
Ratkaisu valmiina?
4 Käytä sijoitustalausetta ja käännä osoitin r osoittamaan alkioon, jonka info-kentän arvo on '2'.
Ratkaisu valmiina?
5 Käytä sijoituslausetta ja aseta p-osoittimen osoittaman alkion info-kentän arvoksi sama kuin mikä r-osoittimen osoittaman alkion info-kentän arvo on. (Käytä siis osoitinta r, älä suoraan literaalia '3'.)
Ratkaisu valmiina?
6 Tee tehtävä 5 uudelleen, mutta tällä kertaa käyttäen ainoastaan osoitinta p (ei osoitinta r). Tälläkään kertaa ei ole tarkoitus käyttää literaalia '3'.
Ratkaisu valmiina?
7 Käytä sijoituslausetta ja muunna osoittimen p osoittama linkitetty lista linkitetyksi rengaslistaksi. Ratkaisussa on tarkoitus käyttää sekä osoitinta p että osoitinta r.
Ratkaisu valmiina?
8 Tee tehtävä 7 uudelleen, mutta tällä kertaa käyttäen osoittimia p ja q.
Ratkaisu valmiina?
9 Tee tehtävä 7 uudelleen, mutta tällä kertaa käyttäen ainoastaan osoitinta p.
Ratkaisu valmiina?
10 Käytä sijoituslausetta ja poista linkitetystä listasta alkio, jonka info-kentän arvo on 'B', eli aiheuta muistivuoto. Käytä ratkaisussasi sekä osoitinta p että osoitinta q.
Ratkaisu valmiina?
11 Tee uudelleen tehtävä 10, mutta tällä kertaa käyttäen ainoastaan osoitinta p.
Ratkaisu valmiina?
12 Kirjoita while-silmukka, joka asettaa osoittimen q osoittamaan vuorotellen jokaiseta linkitetyn listan alkiota ja lopettaa niin, että q osoittaa listan viimeiseen alkioon.
Ratkaisu valmiina?
13 Kirjoita while-silmukka, joka asettaa osoittimen q osoittamaan vuorotellen jokaiseta linkitetyn listan alkiota, kunnes q osoittaa alkiota, jonka info-kentän arvo on 'c' (pieni kirjain).
Ratkaisu valmiina?
14 Luo neljän osoitinta p käsittelevän sijoituslauseen avulla linkitetty lista, joka sisältää 4 alkioita, joiden info-kentän arvot ovat 'A', 'B', 'C' ja 'D' tässä järjestyksessä.
Ratkaisu valmiina?
15 Luo osoittimien q päähän uusi alkio, jonka info-kentän arvoksi tulee 'A' ja lisää se osoittimen p-osoittaman linkitetyn listan ensimmäiseksi alkioksi.
Ratkaisu valmiina?
16 Luo uusi alkio, jonka info-kentän arvoksi tulee 'D' ja lisää se osoittimen p-osoittaman linkitetyn listan viimeiseksi alkioksi.
Ratkaisu valmiina?
17 Poista osoittimen p osoittaman listan esimmäinen alkio listasta ja siirrä se listan viimeiseksi alkioksi. (Huomaa, että tehtävän voi ratkaista kahdella tavalla: joko käyttäen apuna osoitinta q tai mielenkiintoisemmin ilman osoitinta q.)
Ratkaisu valmiina?
18 Limitä osoittimien p ja q osoittamat linkitetyt listat yhdeksi linkitetyksi listaksi, jonka alkiot ovat aakkostenmukaisessa järjestyksessä, ja jota osoittaa vain osoitin p.
Ratkaisu valmiina?
19 Käännä osoittimen p osoittaman linkitetyn listan alkiot päinvastaiseen järjestykseen käyttäen ainoastaan osoittimia p, q ja r.
Ratkaisu valmiina?
20 Tuhoa osoittimen p osoittaman linkitetyn listan kaikki alkiota ja ole tarkkana, että et aiheuta muistivuotoja tai jäänneviitteitä.
Ratkaisu valmiina?


Ohjelmointitehtävät