| Demoryhmä | Päivä | Aika | Sali |
|---|---|---|---|
| Ryhmä 1 | ma 10.6. | 14.15 - 16.00 | Ag B111.1 |
| Ryhmä 2 | ma 10.6. | 18.15 - 20.00 | Ag B112.1 |
HUOM 1:Tehtävissä esiintyy vielä tuntemattomia
C++-kielen rakenteita, mutta älä anna sen
häiritä!
Avaa edellisissä demoissa tehty tiedosto SUMMAA.CPP. Editointi-ikkunassa pitäisi olla seuraavaa.
/*
SUMMAA.CPP Ohjelma lukee kokonaislukuja, laskee niiden summan
ja tulostaa sen.
*/
#include <iostream.h>
int main(void)
{
int luku = 0, summa = 0;
do {
summa = summa + luku;
cout << "Anna kokonaisluku (0 lopettaa syötön) > ";
cin >> luku;
} while (luku != 0);
cout << "Luettujen lukujen summa = " << summa << endl;
return 0;
}
Talleta ensin tämä tiedosto nimellä LSUMMAA.CPP.
Korjaa kommentti.
Lisää seuraava muuttujan määrittelyrivi ohjelmassa jo olevan muuttujan
määrittelyrivin alle.
int lopetusluku; // syötön lopettava lukuKopioi rivit
cout << "Anna kokonaisluku (0 lopettaa syötön) > "; cin >> luku;leiketaulun kautta do-sanalla alkavan rivin yläpuolelle: siis merkitse rivit, suorita näppäinkomento Ctrl+Insert, vie kursori do-rivin vasempaan reunaan ja suorita näppäinkomento Shift+Insert.
Muuta tämän juuri kopioidun cout-alkuisen lauseen lainausmerkeissä oleva merkkijono muotoon
"Anna syötön lopettava kokonaisluku > "ja muuta myös kopioidussa cin-alkuisessa lauseessa tunnus luku muotoon lopetusluku.
Muuta rivi
cout << "Anna kokonaisluku (0 lopettaa syötön) > ";muotoon
cout << "Anna kokonaisluku (" << lopetusluku << "
lopettaa syötön) > ";
Korjaa vielä lopetustesti while-rivillä muotoon
} while (luku != lopetusluku);Talleta ohjelma ja testaa sitä.
Talleta ohjelmasi aluksi nimellä KESKIA.CPP.
Korjaa kommentti.
Lisää seuraava muuttujan määrittelyrivi ohjelmassa jo olevien muuttujan
määrittelyrivien jälkeen.
int lkm; // luettujen lukujen lukumääräLisää alkuun cout-rivi, joka tulostaa mitä ohjelma tekee.
Lisää rivin summa = summa + luku; alle uusi rivi,jossa kasvatetaan lukumäärää yhdellä eli
lkm++;
Kopioi ennen return-lausetta oleva tulostusrivi (cout
alkava) leiketaululle ja liimaa se
sieltä uudeksi riviksi juuri kopioidun rivin alle. Muuta kopioitu lause
vielä muotoon
cout << "Luettujen lukujen keskiarvo = " << summa/lkm << endl;Talleta ohjelma ja käännä se. Jos tulee vain yksi varoitus niin jatka kohdasta 6.
Suoritetaan sen jälkeen ohjelmaa rivi kerrallaan: Aseta
editointi-ikkuna aktiiviseksi ja valitse sitten Run
(Alt+r) ja Step over tai suoraan F8.
Editointi-ikkunassa näkyy palkki aina seuraavaksi suoritettavan rivin
kohdalla. Jatka suoritusta rivi
kerrallaan painamalla F8. Syötöt annetaan normaaliin tapaan. Seuraamalla
muuttujan lkm arvoa voi heti
alkuvaiheessa havaita, että muuttujan alustus nollaksi on unohtunut.
Keskeytä ohjelman suoritus; valitse Run (Alt+r) ja
Program reset tai näppäinkomento
Ctrl+F2.
Sulje Watch-ikkuna.
Korjaa virhe alustamalla muuttuja lkm määrittelyn yhteydessä
arvoon 0.
Talleta ohjelma ja testaa sitä uudestaan. Kun havaitset suoritusaikaisia
virheitä niin jatka kohdasta 6.
if (luku != lopetusluku)Tämän jälkeen siirry riville lkm++;. Leikkaa koko rivi leiketaululle ja liimaa se leiketaululta juuri kirjoitetun if-alkuisen rivin alle uudeksi riviksi.
Talleta ohjelma ja testaa sitä.
Kokeile antamalla lopetusluvuksi 1 ja anna syöttönä kaksi lukua 4 ja 5 ja
sitten lopetusluku.
Voidaan havaita, että keskiarvon laskeminen ei onnistu vieläkään?
Suoritetaan nyt virheenjäljitys seuraavasti:
laita kursori riville cout << "Luettujen lukujen summa
jne.
Laitetaan tälle riville keskeytyskohta; valitse Debug (Alt+d) ja sitten
Toggle breakpoint tai
suoraan näppäinkomennolla Ctrl+F8. Keskeytyskohtaa kuvaava palkki tulee
näkyviin.
Tämän jälkeen suorita ohjelma eli Ctrl+F9 ja käytä samoja syöttötietoja
kuin juuri edellä.
Suoritus pysähtyy keskeytyskohtaan. Katso muuttujien summa ja
lkm arvoja esimerkiksi
avaamalla Watch-ikkuna. Niiden tulisi olla aivan oikein eli virhe tulee
keskiarvon laskennassa tai
tulostuksessa. Syynä onkin kokonaislukujakolaskussa tapahtuva katkaisu
kokonaisluvuksi.
Keskeytä ohjelman suoritus, sulje Watch-ikkuna ja poista
keskeytyskohta-asetus.
Korjaa ohjelma muuttamalla muuttujan summa tyypiksi
double.
Muuta lisäksi muuttujan luku nimeksi luettu_luku Search
(Alt+s) and Replace
komennolla: katso huolellisesti kaikki valinnat ja tee toiminto alarivin
valinnalla Change
All ja vahvista kaikki korvaukset erikseen.
Talleta ohjelma ja testaa sitä. Kokeile myös siten, että et anna yhtään
lukua.
Korjaa vielä tämä nollalla jako tapaus pois seuraavanlaisella silmukkaa
seuraavalla tulostusrakenteella:
if (lkm == 0)
cout << "Et antanut yhtään lukua." << endl;
else {
cout << "Luettujen lukujen summa = " << summa << endl;
cout << "Luettujen lukujen keskiarvo = " << summa/lkm
<< endl;
}
Talleta ohjelma ja testaa sitä.
Malliratkaisu:
/*
KESKIA.CPP Kysyy ja laskee lukujen summan ja keskiarvon.
*/
#include <iostream.h>
int main (void)
{
int luettu_luku = 0;
double summa = 0.0;
int lopetusluku;
int lkm = 0;
cout << "Ohjelma laskee antamiesi lukujen summan ja keskiarvon." << endl;
cout << "Anna syötön lopettava kokonaisluku >";
cin >> lopetusluku;
do {
summa = summa + luettu_luku;
cout << "Anna kokonaisluku (" << lopetusluku << " lopettaa syötön) >";
cin >> luettu_luku;
if (luettu_luku != lopetusluku)
lkm++;
} while (luettu_luku != lopetusluku);
if (lkm == 0)
cout << "Et antanut yhtään lukua." << endl;
else {
cout << "Luettujen lukujen summa = " << summa << endl;
cout << "Luettujen lukujen keskiarvo = " << summa/lkm << endl;
}
return 0;
}
Tässä voidaan käyttää pohjana edellisissä demoissa tehtyä ohjelmaa LUEJATUL.CPP, joten avaa se vanhan editointi-ikkunan ohjelman tilalle eli valitse avattaessa vaihtoehto Replace.
Talleta sitten tämä tiedosto nimellä KARKAUSV.CPP.
Korjaa ohjelman kommentti.
Muuta muuttujan luku nimeksi vuosi käyttämällä Search
and Replace toimintoa.
Määrittele uusi int-muuttuja karkausvuosi.
Lisää alkuun ohjelman tarkoituksen tulostava lause.
Muuta syöttöpyyntö "Anna kokonaisluku > " pyynnöksi "Anna
vuosiluku > ".
Käytetään karkausvuoden tutkimisen pohjana seuraavaa algoritmia:
Jos (vuosiluku on jaollinen 400:lla) niin on karkausvuosi muutoin jos (vuosiluku on jaollinen 100:lla) niin ei ole karkausvuosi muutoin jos (vuosiluku on jaollinen 4:llä) niin on karkausvuosi muutoin ei ole karkausvuosi.
Kirjoita siis cin-alkuisen rivin jälkeen seuraavat rivit, joilla testataan karkausvuosiominaisuutta:
if (vuosi%400 == 0) karkausvuosi = 1; // on karkausvuosi else if (vuosi%100 == 0) karkausvuosi = 0; // ei ole karkausvuosi else if (vuosi%4 == 0) karkausvuosi = 1; // on karkausvuosi else karkausvuosi = 0; // ei ole karkausvuosi
Muuta tulostusrivi vielä seuraavien neljän rivin muotoon
if (karkausvuosi == 1) cout << "Vuosi " << vuosi << " on karkausvuosi." << endl; else cout << "Vuosi " << vuosi << " ei ole karkausvuosi." << endl;
Talleta ohjelma ja testaa sitä.
Korjaa kommentti ja muuta ohjelman alkuosa muotoon
#include <iostream.h>
/* onkoKarkausvuosi - funktio, joka tutkii onko vuosi karkausvuosi
* - vuosi, int parametrina tuotu tutkittava vuosi
* - paluuarvo 0, jos vuosi ei ole karkausvuosi
* 1, jos vuosi on karkausvuosi.
*/
int onkoKarkausvuosi(int vuosi)
{
int karkausvuosi;
return karkausvuosi;
}
int main(void)
Leikkaa sitten edellä karkausvuoden selvittämiseksi kirjoitettu 8 rivin if-lause leiketaululle ja liimaa tämä juuri kirjoitetun onkoKarkausvuosi-funktion aaltosulkujen väliin jätetyn tyhjän rivin tilalle.
Muuta main-funktion if-lauseessa oleva ehto (karkausvuosi == 1) muotoon (onkoKarkausvuosi(vuosi)) .
Poista main-funktiosta muuttuja karkausvuosi.
Talleta ohjelmasi ja testaa sitä.
Halutessasi voit nyt testata virheenjäljittimen (Debugger) näppäimien F7 ja F8 välisiä eroja.