Lausekkeissa, väittämissä, algoritmeissa ja ohjelmissa esiintyy paljon
tilanteita, joissa jokin muuttuja käy läpi peräkkäiset arvot joltakin
kokonaislukuväliltä a, …, y.
Toisinaan tarvitsee siirtää indeksin läpikäymää väliä yhdellä suuntaan tai
toiseen, siis esimerkiksi väliksi a + 1, …, y + 1, siten, että
lausekkeen arvo tms. ei muutu.
Myös monimutkaisempia indeksien muunnostarpeita esiintyy esimerkiksi kun
summamerkintöjä on sisäkkäin.
Tässä tehtävässä harjoitellaan indeksien muuntamista.
Välin rajoista
Mitkä ovat n:n funktiona pienin ja suurin luku, minkä oheinen
ohjelma tulostaa?
for( int i=2; i < n; ++i ){ std::cout << i << ' '; }
for( int i=n; i <=4; ++i ){ std::cout << i << ' '; }
std::cout << '\n';
n
pienin
suurin
1
tai
2
tai
3
tai
4
tai
5
tai
6
tai
7
tai
Huomaamme, että jos välin viimeinen luku on enintään ensimmäinen luku
miinus 2, niin peräkkäisten välien yhdistelmään tulee lukuja jotka eivät sinne
kuuluisi.
Huomaamme myös, että peräkkäisten välien yhdistäminen toimii hyvin, jos
välin viimeinen luku on aina suurempi, sama tai yhtä pienempi kuin välin
ensimmäinen luku.
Jatkossa koko tämän tehtävän ajan voit olettaa, että muuttujilla on sellaiset
arvot, että tämä ehto toteutuu.
Jos välin viimeinen luku on yhtä pienempi kuin välin ensimmäinen luku, niin
välissä on nolla lukua.
Käsitteitä ja välin koko
Indeksin muuntamisessa ensimmäinen osattava asia on tunnistaa, mikä
muuttuja on indeksi.
Sitten on tunnistettava pienin ja suurin indeksin arvo, joilla lauseke
lasketaan tms.
Tunnista ne seuraavista!
Tarvitsee osata selvittää, montako alkiota käsiteltävässä välissä on.
Siinä auttaa, jos muuttujille valitaan kokeeksi sellaiset arvot, että välissä
on täsmälleen yksi alkio.
Valitse sellaiset arvot!
Nyt sinun pitää kertoa, montako alkiota käsiteltävässä välissä on.
Siihen on periaatteessa helppo yleinen lauseke, jonka tapaamme ihan pian.
Käytännössä kuitenkin sen kanssa tulee helposti virheitä ja unohduksia,
joiden välttämisessä auttaa, että on miettinyt ensin yksittäistapauksia.
Siispä nyt pistän sinut miettimään yksittäistapauksia!
Vastausten saamista kohdalleen auttaa tieto, että vastaustesi tulee tuottaa 1
tilanteissa, jotka selvitit edellä.
Indeksialueen muuntaminen
Tehdäänpä vielä pari melkein samanlaista niin tulee hieman rutiinia.
Täytyy siis sanoa sama väite kuin minkä ∀ i; 1 < i ≤
n: A[i] ≠ A[1]
sanoo, mutta i käy läpi eri arvot.