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
- Aluksi lue tehtävänanto kokonaan niin, että ymmärrät sen.
- Suunnittele ohjelmasi paperilla. Sen jälkeen kirjoita ohjelmakoodisi
valmiiksi valitsemaasi tekstieditoria käyttäen.
- 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.
- 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.
- 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:
- muita kuin edellämainittuja tietotyyppejä, eli esimerkiksi
int tai char muuttujia ei voida tehdä
- "osoitteen otto" -operaattoria (&)
- osoittimiin osoittavia osoittimia
- luokka- tai tietuemäärittelyjä tai funktiokutsuja
- vapaamuotoisia kommentteja. Koodi-ikkunassa harjoituksen alussa
olevat kommentit on kirjoitettu tarkkaan määritellyn syntaksin mukaisesti
ja JHAVEPOP käyttää niitä visualisoinnin alkutilanteen määrittelemiseen.
ÄLÄ kirjoita omaan koodiisi kommentteja.
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
- Harjoituksissa 1 - 11 keskitytään sijoituslauseisiin, jotka
käsittelevät sekä itse osoititinmuuttujia että osotinmuuttujien
osoittamia muuttujia (kohteita).
- Harjoituksissa 12 ja 13 tehdään yksinkertaisia while-silmukoita,
joiden rungossa suoritetaan yksi sijoituslause.
- Harjoitukset 14 - 19 voi ratkaista yksinkertaisesti peräkkäisillä
sijoituslauseilla, eli niissä ei tarvitse välttämättä käyttää
silmukkarakennetta.
- Harjoituksessa 20 harjoitellaan käyttämään 'delete'-operaattoria.
| Exercise | Alkutilanne | Lopputilanne |
| 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
|