Kurssiin kuuluva harjoitustyö tehdään yksin.
Harjoitustyön viimeinen palautuspäivä on 15.7.2002
Harjoitustyön palautusaika (tai mahdollinen ohjausaika) varataan Kuukkelista.
Palautusaikoja on viikolta 23 eteenpäin.
goto
-käskyä.conio.h
:n käyttäminen on kiellettyä, koska
se löytyy vain borlandin dos-kääntäjistä
muuttuja1
,
muuttuja2
, muuttuja3
niin sinun on syytä
keksiä järkevämpiä nimiä#define
).
#define MAX 20
int main(void)
{
int taulukko[MAX];
...
}
etsi_suurin
) käy läpi taulukon,
löytää siitä suurimman arvon ja palauttaa sen. Toinen (tulosta
) kutsuu ensimmäistä ja tulostaa löydetyn arvon. etsi_suurin
-aliohjelma on nyt hyvin
yleiskäyttöinen ja kelpaa vaikka johonkin toiseenkin ohjelmaan. Jos samaan aliohjelmaan olisi ujutettu mukaan tulostuksia niin aliohjelma olisi kelvoton muualla kuin juuri
tehtävässä ohjelmassa, koska etukäteen ei voida tietää mitä ja miten jokin ohjelma haluaa tietoja käsitellä ja tulostaa. JO-113 Kirjoita C++-ohjelma, joka laskee miten kauas tykinkuula lentää, kun tunnetaan kuulan lähtönopeus ja -kulma. Matka lasketaan kaavalla 2(v0)²sina cosa /g, missä v0 on lähtönopeus, a lähtökulma ja g putoamiskiihtyvyys (9.81 m/s²). Syöttö, tulostus ja matkan laskeminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan ampua useampaan kertaan.
JO-127 Kirjoita C++-ohjelma, joka laskee kahden päivämäärän erotuksen päivinä. Päivämäärät luetaan näppäimistöltä muodossa pp kk vvvv (kokonaislukukolmikkona). Myös karkausvuosi huomioidaan. Syöttö, tulostus ja erotuksen laskeminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan laskea useampia erotuksia.
JO-136 Luonnollinen luku on täydellinen, jos sen tekijöiden summa (lukua itseään lukuunottamatta) on sama kuin luku itse. Esimerkiksi 6 on täydellinen, sillä se on jaollinen luvuilla 1, 2 ja 3, ja 1 + 2 + 3 = 6. Kirjoita C++-ohjelma, joka lukee näppäimistöltä kokonaisluvun ja tutkii, onko se täydellinen. Syöttö, tulostus ja tutkiminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan tutkia useampia lukuja.
JO-137 Alkuluvut (luonnolliset luvut, jotka ovat jaollisia vain ykkösellä ja itsellään) voidaan löytää seuraavasti: Olkoon meillä kokonaislukutaulukko, jossa on luvut kakkosesta eteenpäin aina lukuun N saakka. Ensin poistetaan taulukosta kaikki kakkosella jaolliset luvut paitsi itse luku kaksi. Sitten poistetaan kaikki kolmosella jaolliset luvut paitsi itse luku kolme, jne. Tätä jatketaan kunnes kaikkien lukua Ö N pienempien lukujen kerranaiset on poistettu. Jäljelle jääneet luvut ovat alkulukuja. Kirjoita C++-ohjelma, joka lukee näppäimistöltä luvun N ja tulostaa näytölle kaikki alkuluvut väliltä 2...N. Syöttö, tulostus ja alkulukujen etsintä tehdään kaikki omissa funktioissaan.
JO-101 Kirjoita C++-ohjelma, joka lukee näppäimistöltä enintään kolminumeroisia kokonaislukuja ja tulostaa ne näytölle tekstinä. Esimerkiksi, jos syötetään luku 458, tulostetaan "Annoit luvun neljäsataaviisikymmentäkahdeksan." Muunnos tehdään funktiossa, jonka parametreina ovat ko. luku ja merkkijono, johon vastaava teksti tallennetaan. Myös syöttö ja tulostus tehdään omissa funktioissaan. Lukuja kysytään kunnes käyttäjä haluaa lopettaa.
JO-103 Kirjoita C++-ohjelma, joka lukee näppäimistöltä päivämääriä kokonaislukuina muodossa pp kk vvvv ja tulostaa ne näytölle tekstinä. Esimerkiksi, jos syötetään 14 10 1999, tulostetaan "Päivämäärä on 14. lokakuuta 1999." Muunnos tehdään funktiossa, jonka parametreina ovat ko. luvut ja merkkijono, johon vastaava teksti tallennetaan. Myös syöttö ja tulostus tehdään omissa funktioissaan. Päivämääriä kysytään kunnes käyttäjä haluaa lopettaa.
JO-105 Kirjoita C++-ohjelma, joka lukee näppäimistöltä tekstiä rivi kerrallaan ja tulostaa näytölle, kuinka monta kertaa kukin eri merkki (kirjain, numero, välimerkki) esiintyi tekstissä. Lukumäärät lasketaan taulukkoon. Syöttö, tulostus ja taulukointi tehdään kaikki omissa funktioissaan. Tekstiä luetaan kunnes käyttäjä haluaa lopettaa.
JO-123 Palindromi on lause, joka on sama, luettiinpa se vasemmalta oikealle tai päinvastoin. Esimerkiksi "saippuakauppias" ja "iso rikas sika sökösakissa kirosi" ovat palindromeja. Välilyönnit ja välimerkit jätetään siis huomioimatta. Kirjoita C++-ohjelma, joka lukee näppäimistöltä merkkijonoja ja tutkii, ovat ne palindromeja. Syöttö, tulostus ja tutkiminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan lukea useampi merkkijono.
JO-106 Kirjoita C++-ohjelma, joka lukee näppäimistöltä liukulukuja taulukkoon ja tulostaa näytölle lukujen minimin, maksimin ja keskiarvon, ja lisäksi etsii luvun, joka on lähimpänä keskiarvoa. Syöttö, tulostus ja lukujen käsittely tehdään kaikki omissa funktioissaan.
JO-108 Kirjoita C++-ohjelma, jolla autoilija voi seurata polttoaineen kulutusta: Ohjelma lukee näppäimistöltä taulukkoon lukupareja, joissa ensimmäinen luku tarkoittaa ajettua matkaa kilometreinä ja toinen luku tankattua polttoainemäärää litroina. Sitten tulostetaan näytölle keskikulutus (litroina 100 km kohti) kultakin tankkausväliltä erikseen ja myös koko aineiston osalta. Syöttö, tulostus ja aineiston käsittely tehdään kaikki omissa funktioissaan.
JO-112 Kirjoita C++-ohjelma, joka matkii yksinkertaisen kassakoneen toimintaa: Ensin kaikista myyntiartikkeleista luetaan näppäimistöltä koodi, nimi ja yksikköhinta, jotka tallennetaan taulukoihin. Sitten kustakin myytävästä tuotteesta luetaan koodi ja kappalemäärä. Lopuksi tulostetaan näytölle kuitti, josta näkyy kunkin tuotteen kokonaishinta sekä kaikkien ostosten yhteishinta. Syöttö ja tulostus tehdään omissa funktioissaan. Samalla suorituskerralla voidaan palvella useita asiakkaita.
JO-114 Eräällä kurssilla on kaksi välikoetta, joissa kummassakin on neljä kappaletta kuuden pisteen tehtäviä. Lisäksi harjoituksista voi saada korkeintaan neljä demopistettä. Kurssista pääsee läpi, jos saa vähintään puolet maksimipistemäärästä. Kirjoita C++-ohjelma, joka lukee näppäimistöltä kurssille osallistuneiden nimet (sukunimi riittää) ja heidän pistemääränsä kummassakin välikokeessa erikseen sekä demopisteet, ja joka sitten tulostaa näytölle listan hyväksytyistä sekä heidän kokonaispistemääränsä. Syöttö ja tulostus tehdään omissa funktioissaan.
JO-115 Erään kurssin loppukokeessa on viisi kappaletta kuuden pisteen tehtäviä. Kirjoita C++-ohjelma, joka lukee näppäimistöltä kokeeseen osallistuneiden pistemäärät kustakin tehtävästä erikseen, ja joka sitten tulostaa näytölle kunkin tehtävän keskiarvon ja myös kokonaispistemäärien keskiarvon. Syöttö, tulostus ja keskiarvojen laskenta tehdään kaikki omissa funktioissaan.
JO-117 Kirjoita C++-ohjelma, jota meteorologi voisi käyttää säätietojen tilastointiin: Ohjelma lukee näppäimistöltä joka päivältä lämpötilan minimin ja maksimin sekä sademäärään. Nämä taulukoidaan, ja kun on syötetty koko viikon tiedot, tulostetaan näytölle keskiarvot kaikista mittauksista. Lisäksi etsitään lämpötilan maksimiarvojen mukaan viikon lämpimin päivä. Syöttö ja tulostus tehdään omissa funktioissaan.
JO-125 Kirjoita C++-ohjelma, joka lukee näppäimistöltä n kokonaislukua taulukkoon, etsii niistä k pienintä ja tulostaa nämä k lukua sekä niiden keskiarvon. Luvut n ja k luetaan myös näppäimistöltä ja vaaditaan, että n on suurempi kuin 10k. Syöttö, tulostus ja lukujen käsittely tehdään kaikki omissa funktioissaan.
JO-132 Kirjoita C++-ohjelma, joka lukee näppäimistöltä (x,y)-tason pisteitä taulukoihin, järjestää ne nousevaan järjestykseen x-koordinaatin mukaan ja tulostaa näytölle pisteet järjestyksessä. Jos useammalla pisteellä on sama x-koordinaatti, järjestetään ne y-koordinaatin mukaan. Kaksoiskappaleet poistetaan, ts. tulostuksessa saa sama piste esiintyä vain kerran. Syöttö, tulostus ja järjestäminen tehdään kaikki omissa funktioissaan.
JO-133 Kirjoita C++-ohjelma, joka lukee näppäimistöltä (x,y)-tason pisteitä taulukoihin, järjestää ne nousevaan järjestykseen etäisyyden origosta mukaan ja tulostaa näytölle pisteet järjestyksessä. Jos useammalla pisteellä on sama etäisyys, järjestetään ne x-koordinaatin mukaan. Kaksoiskappaleet poistetaan, ts. tulostuksessa saa sama piste esiintyä vain kerran. Syöttö, tulostus ja järjestäminen tehdään kaikki omissa funktioissaan.
JO-134 Kirjoita C++-ohjelma, joka lukee näppäimistöltä (x,y)-tason pisteitä taulukoihin, ja sen jälkeen etsii niistä ne kaksi pistettä, jotka ovat kauimpana toisistaan ja ne kaksi pistettä, jotka ovat lähimpänä toisiaan. Nämä pisteet ja vastaavat etäisyydet tulostetaan näytölle. Syöttö, tulostus ja etsiminen tehdään kaikki omissa funktioissaan.
JO-140 Kirjoita C++-ohjelma, joka laskee tuntityötä tekevän henkilön yhden viikon brutto- ja nettopalkan. Jokaiselta viikonpäivältä annetaan ko. päivän aikana tehty työmäärä (tunnit ja minuutit) sekä tuntipalkka (joka voi siis vaihdella päivittäin). Lisäksi luetaan veroprosentti. Syöttö, tulostus ja palkan laskenta tehdään kaikki omissa funktioissaan.
JO-116 Uimahypyissä yhden hyppykierroksen pisteet lasketaan seuraavasti: Viisi arvostelutuomaria antaa kukin hypystä jonkin pistemääristä 0.0, 0.5, 1.0,..., 9.5, 10.0. Näistä pudotetaan paras ja huonoin pois, jäljelle jäävistä kolmesta lasketaan keskiarvo ja se kerrotaan hypyn vaikeusastekertoimella, joka on jokin luvuista 1.0, 1.1, 1.2,..., 2.9, 3.0. Kirjoita C++-ohjelma, joka lukee näppäimistöltä kilpailijan pisteet ja vaikeusastekertoimen ja tulostaa lopullisen pistemäärän ko. kierrokselta. Syöttö, tulostus ja pisteiden laskenta tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan laskea useamman hyppääjän pisteet.
JO-119 Kirjoita C++-ohjelma, joka laskee suunnistajan kilometrivauhdin. Tällä tarkoitetaan yhdellä kilometrillä keskimäärin kulunutta aikaa (yksikkönä minuutit). Kunkin rastivälin pituus ja siihen kulunut aika luetaan näppäimistöltä. Näistä lasketaan kyseinen kilometrivauhti. Syöttö, tulostus ja laskeminen tehdään kaikki omissa funktioissaan.
JO-126 Palloilusarjassa kaikki osallistuvat joukkueet ottelevat kerran jokaista muuta joukkuetta vastaan. Voitosta joukkue saa kaksi pistettä, tasapelistä yhden pisteen ja häviöstä nolla pistettä. Joukkueet asetetaan paremmuusjärjestykseen pisteiden mukaan. Jos kaksi tai useampia joukkueita on tasapisteissä, ratkaisevat näiden keskinäisten ottelujen tulokset. Jos sekään ei tuo ratkaisua, tutkitaan maalierot. Kirjoita C++-ohjelma, joka muodostaa palloilusarjan pistetaulukon. Kunkin ottelun tulos syötetään näppäimistöltä. Syöttö, tulostus ja taulukon muodostaminen tehdään kaikki omissa funktioissaan.
JO-135 Mäenlaskussa yhden hyppykierroksen pisteet lasketaan seuraavasti: Viisi arvostelutuomaria antaa kukin hypystä jonkin pistemääristä 0.0, 0.5, 1.0,..., 19.5, 20.0. Näistä pudotetaan paras ja huonoin pois ja loput lasketaan yhteen, jolloin saadaan hypyn tyylipisteet. Pituudesta saa pisteitä siten, että mäen K-piste vastaa 60 pistettä ja metrin parannus lisää pistemäärää yhdellä, metrin vajaus puolestaan vähentää pistemäärää yhdellä. Kirjoita C++-ohjelma, joka lukee näppäimistöltä kilpailijan hypyn pituuden ja tuomarien antamat pisteet, ja tulostaa lopullisen pistemäärän ko. kierrokselta. Syöttö, tulostus ja pisteiden laskenta tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan laskea useamman hyppääjän pisteet.
JO-139 Formula 1 -kilpailussa pisteitä annetaan sijoitusten perusteella siten, että osakilpailun voittaja saa 10 pistettä, toiseksi tullut 6 pistettä, ja sijoille 3...6 tulleet 4, 3, 2 ja 1 pistettä. Kirjoita C++-ohjelma, joka lukee näppäimistöltä kilpailijan sijoitukset kauden kilpailuissa ja laskee hänen lopulliset pisteensä. Syöttö, tulostus ja pisteiden laskeminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan laskea useamman kilpailijan pisteet.
JO-109 Kirjoita C++-ohjelma, joka ratkaisee toisen asteen yhtälöitä ax² + bx + c = 0. Kertoimet a, b ja c luetaan näppäimistöltä ja yhtälön juuret tulostetaan näytölle. Juuret voivat olla reaalisia tai imaginäärisiä. Syöttö, tulostus ja ratkaiseminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan ratkaista useita yhtälöitä.
JO-110 Kirjoita C++-ohjelma, joka integroi symbolisesti yhden muuttujan reaalikertoimisia polynomeja. Esimerkiksi, polynomi p(x) = 6x² + 2x – 3 integroidaan muotoon P(x) = 2x³ + x² – 3 x. Polynomit luetaan näppäimistöltä siten, että kustakin termistä annetaan kerroin ja asteluku. Esimerkin polynomi syötettäisiin siis antamalla kolme riviä: 6.0 2, 2.0 1 ja -3.0 0. Tulostus voi olla esimerkiksi muodossa " 2.0*x^3 + 1.0*x^2 - 3.0*x ". Syöttö, tulostus ja integrointi tehdään kaikki omissa funktioissaan.
JO-111 Kirjoita C++-ohjelma, joka derivoi symbolisesti yhden muuttujan reaalikertoimisia polynomeja. Esimerkiksi, polynomi p(x) = 2x³ + x² – 3 x derivoidaan muotoon P(x) = 6x² + 2x – 3. Polynomit luetaan näppäimistöltä siten, että kustakin termistä annetaan kerroin ja asteluku. Esimerkin polynomi syötettäisiin siis antamalla kolme riviä: 2.0 3, 1.0 2 ja -3.0 1. Tulostus voi olla esimerkiksi muodossa " 6.0*x^2 + 2.0*x - 3.0 ". Syöttö, tulostus ja derivointi tehdään kaikki omissa funktioissaan.
JO-120 Kirjoita C++-ohjelma, joka laskee yhden muuttujan reaalikertoimisen polynomin arvoja halutuissa pisteissä. Polynomi luetaan näppäimistöltä siten, että kustakin termistä annetaan kerroin ja asteluku. Esimerkiksi polynomi p(x) = 3x³ + x – 2 syötettäisiin antamalla kolme riviä: 3.0 3, 1.0 1 ja -2.0 0. Syöttö, tulostus ja arvon laskeminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan laskea arvo useammassa pisteessä.
JO-121 Kirjoita C++-ohjelma, joka laskee yhteen kaksi reaalikertoimista yhden muuttujan polynomia. Polynomit luetaan näppäimistöltä siten, että kustakin termistä annetaan kerroin ja asteluku. Esimerkiksi polynomi p(x) = x³ – 4x² + 3 syötettäisiin antamalla kolme riviä: 1.0 3, -4.0 2 ja 3.0 0. Summapolynomin tulostus voi olla esimerkiksi muodossa " 2.0*x^3 + 3.0*x^2 - 1.0*x + 4.0 ". Syöttö, tulostus ja yhteenlasku tehdään kaikki omissa funktioissaan.
JO-124 Kirjoita C++-ohjelma, joka lukee näppäimistöltä kaksi (x,y)-tason janaa ja tulostaa niiden leikkauspisteen koordinaatit tai tiedon siitä, etteivät ne leikkaa toisiaan. Syöttö, tulostus ja leikkauspisteen lakeminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan lukea useampia janapareja.
JO-129 Kirjoita C++-ohjelma, joka laskee yhteen kaksi matriisia. Matriisien koot ja niiden alkiot (kokonaislukuja) luetaan näppäimistöltä. Syöttö, tulostus ja yhteenlasku tehdään kaikki omissa funktioissaan.
JO-130 Kirjoita C++-ohjelma, joka kertoo kaksi matriisia. Matriisien koot ja niiden alkiot (kokonaislukuja) luetaan näppäimistöltä. Syöttö, tulostus ja kertominen tehdään kaikki omissa funktioissaan.
JO-131 Kirjoita C++-ohjelma, joka tutkii onko neliömatriisi symmetrinen. Matriisin koko ja sen alkiot (kokonaislukuja) luetaan näppäimistöltä. Jos matriisi on symmetrinen, tulostetaan siitä vain alakolmio (diagonaali ja sen alapuolella olevat alkiot). Syöttö, tulostus ja tutkiminen tehdään kaikki omissa funktioissaan.
JO-138 Kirjoita C++-ohjelma, joka tutkii onko (x,y)-tason piste jonkin tietyn ympyrän sisäpuolella. Ympyrän keskipiste ja säde luetaan näppäimistöltä, samoin tutkittavien pisteiden koordinaatit. Syöttö, tulostus ja tutkiminen tehdään kaikki omissa funktioissaan. Samalla suorituskerralla voidaan tutkia useampia pisteitä.
JO-141 Jatkuvan kuvauksen nollakohtaa voidaan etsiä puolitusmenetelmällä seuraavasti: Ensin etsitään tarkasteluväli [a,b], jonka päätepisteissä kuvauksen arvot ovat erimerkkiset. Väli puolitetaan kahdeksi väliksi [a,c] ja [c,b], missä c = (a + b)/2. Näistä valitaan uudeksi tarkasteluväliksi se, jonka päätepisteissä kuvauksen arvot ovat erimerkkiset. Näin jatketaan, kunnes väli tulee riittävän pieneksi, ts. |b – c| £ e , missä e on jokin pieni positiivinen luku. Kirjoita C++-ohjelma, joka etsii kuvauksen f nollakohdan puolitusmenetelmällä. Kuvaus kirjoitetaan funktioksi siten, että sen lauseke esiintyy vain yhdessä paikassa. Aloitusvälin päätepisteet a ja b sekä tarkkuusparametri e luetaan näppäimistöltä. Lisäksi ohjelmaan kannattaa lisätä yläraja iteraatioden lukumäärälle, ts. kierroksia tehdään korkeintaan itmax kertaa, vaikka juurta ei olisi vielä löytynytkään. Syöttö ja tulostus tehdään omissa funktioissaan. Testikuvauksena voi käyttää kuvausta f(x) = 3x³ – 2x² + x – 8.
JO-142 Yhden muuttujan reaaliarvoisen kuvauksen f määrättyä integraalia yli välin [a,b] voidaan approksimoida puolisuunnikassäännöllä seuraavasti: Väli [a,b] jaetaan samanpituisiin osaväleihin [t0, t1], [t1, t2],...,[tn-1, tn], missä t0 = a ja tn = b. Integraalin likiarvo I saadaan kaavasta I = h å i (f(ti) + f(ti+1))/2 , missä h = (b – a)/n on osavälien pituus ja summassa indeksi i käy nollasta lukuun n–1. Kirjoita C++-ohjelma, joka laskee kuvauksen f integraalin arvon puolisuunnikassäännöllä. Kuvaus kirjoitetaan funktioksi siten, että sen lauseke esiintyy vain yhdessä paikassa. Integroimisvälin päätepisteet a ja b sekä osavälien lukumäärä n luetaan näppäimistöltä. Syöttö ja tulostus tehdään omissa funktioissaan. Testikuvauksena voi käyttää kuvausta f(x) = x² + 2x – 1.