Tehtävä
Laadi pseudokoodilla algoritmi, joka lukee kolme lukua
ja tulostaa ne suuruusjärjestyksessä, pienin ensin.
Ratkaisu 1:
Perusajatus:
lue luvut,
etsi pienin muuttujaan luku1
etsi toiseksi pienin muuttujaan luku2 ja suurin muuttujaan luku3
tulosta luvut
pseudokoodina:
read (luku1, luku2, luku3);
if luku1 > luku2
then 'vaihda luku1 <=> luku2';
if luku1 > luku3
then 'vaihda luku1 <=> luku3';
if luku2 > luku3
then 'vaihda luku2 <=> luku3';
write (luku1, luku2, luku3);
----------------------------------------------------------------------------------------------------
Tutkitaan tarkemmin, mitä algoritmi tekee:
read (luku1, luku2, luku3); %luetaan luvut
if luku1 > luku2
% luku1:een pienempi kahdesta ensimmäisestä luvusta
then 'vaihda luku1 <=> luku2';
if luku1 > luku3
% luku1:een pienin kaikista luvuista
then 'vaihda luku1 <=> luku3';
if luku2 > luku3
% luku2:een toiseksi pienin luku
then 'vaihda luku2 <=> luku3';
% nyt luvut järjestyksessä
write (luku1, luku2, luku3); % tulostetaan ne
----------------------------------------------------------------
Lukujen vaihtaminen voidaan myös kirjoittaa algoritmina.
Esim. muistipaikkoihin a ja b luettujen
lukujen vaihtaminen:
{ apu:= a; % a talteen apupaikkaan
a:= b;
% muuttujaan a b:n arvo
b:= apu; % muuttujaan
b apupaikasta apu a:n entinen arvo
}
Entä jos kirjoitetaan pelkästään
a:= b;
b:= a;
Vaihtuvatko arvot tällöin?
Tutki tilannetta, kun muuttujan a arvona 5 ja muuttujan b arvona 3.
------------------------------------------------------------------------------
Tällöin saadaan algoritmiksi:
read (luku1, luku2, luku3); %luetaan luvut
if luku1 > luku2
% luku1:een pienempi kahdesta ensimmäisestä luvusta
then {apu:= luku1; luku1:= luku2; luku2:=
apu}; % suoritetaan vaihto
if luku1 > luku3
% luku1:een pienin kaikista luvuista
then {apu:= luku1; luku1:= luku3; luku3:= apu};
% suoritetaan vaihto
if luku2 > luku3
% luku2:een toiseksi pienin luku
then {apu:= luku2; luku2:= luku3; luku3:= apu};
% suoritetaan vaihto
% nyt luvut järjestyksessä
write (luku1, luku2, luku3); % tulostetaan ne
=================================================================
Ratkaisu 2:
Perusajatus:
luetaan luvut
järjestetään ensin kaksi lukua, esim.
ensimmäinen ja viimeinen, suuruusjärjestykseen
sitten viedään kolmas luku oikealle paikalleen:
jos
pienin, niin ensimmäiseksi
jos suurin,
niin viimeiseksi
tulostetaan järjestyksessä olevat luvut
Pseudokoodina:
read (luku1, luku2, luku3);
if (luku1 > luku3)
then ‘vaihda luvut muuttujissa luku1
ja luku3 keskenään’;
if (luku2 < luku1)
then ‘vaihda luvut muuttujissa luku2 ja luku1
keskenään’
else if ( luku2 > luku3)
then ‘vaihda luvut muuttujissa luku2 ja luku3 keskenään’;
write (luku1, luku2, luku3);
------------------------------------------------------------------------------------------------------
Tutkitaanpa tarkemmin, mitä tässä tehdään:
% Tavoitteena on järjestää luvut siten, että muuttujan
luku1 arvona on pienin luvuista,
% luku2:n arvona toiseksi suurin ja luku3:n arvona suurin luvuista.
read (luku1, luku2, luku3); % luetaan luvut muuttujiin ('muistipaikkoihin') luku1, luku2 ja luku3
% Ensin varmistetaan, että muuttujien luku1 ja luku3 luvut
ovat oikeassa järjestyksessä
if (luku1 > luku3)
% jos muuttujaan luku1 luettu luku on suurempi, niin vaihdetaan
then ‘vaihda luvut muuttujissa luku1
ja luku3 keskenään’;
% Sitten on vielä hoidettava muuttujaan luku2 luettu luku
oikealle paikalleen
if (luku2 < luku1) % jos luku2
pienin kaikista, niin sen sisältämä luku on vietävä
ensimmäiseksi
then ‘vaihda luvut luku2 ja luku1
keskenään’
else if ( luku2 > luku3) % jos luku2 suurin
kaikista, niin sen sisältämä on vietävä
viimeiseksi
then ‘vaihda luvut luku2 ja luku3 keskenään’;
% jos luku2:n arvo on luku1:n ja luku3:n välissä eli luku1
< luku2 < luku3, niin se on jo
% valmiiksi oikealla paikallaan
% Tässä vaiheessa luvut ovat suuruusjärjestyksessä
muuttujissa ja ne voidaan tulostaa
write (luku1, luku2, luku3);
Lisäpohdittavaa:
Toimiiko esitetty algoritmi myös silloin, kun luvut
ovatkin yhtäsuuria?
Miten kirjoittaisit algoritmin, jos ensin järjestettäisiin
luvut luku1 ja luku2 suuruusjärjestykseen
ja sitten luku3 oikealle paikalleen?
-----------------------------------------------------------------------------------------------
Sama algoritmi, kun vaihtaminen on myös kirjoitettu algoritmina:
read (luku1, luku2, luku3); % luetaan luvut
if (luku1 > luku3)
% luvut luku1 ja luku3 suuruusjärjestykseen
then {apu:= luku1;
luku1:= luku3;
luku3:= apu;
};
% vielä luku2 oikealle paikalle
if (luku2 < luku1)
% jos luku2 pienin kaikista, niin ensimmäiseksi
then {apu:= luku2;
luku2:= luku1;
luku1:= apu;
}
else if ( luku2 > luku3) % jos luku2 suurin
kaikista, niin viimeiseksi
then {apu:= luku1;
luku1:= luku3;
luku3:= apu;
};
% nyt kaikki kolme luettua lukua ovat suuruusjärjestyksessä
write (luku1, luku2, luku3);
==============================================================
Ratkaisu 3:
Tehtävä voitaisiin myös ratkaista käymällä läpi kaikki mahdolliset erilaiset vaihtoehdot, joita on kaikkiaan kuusi:
luetut luvut
1
2
3
vaihtoehdot
1 pienin
keskim suurin
2 pienin
suurin keskim
3 keskim
pienin suurin
4 keskim
suurin pienin
5 suurin
pienin keskim
6 suurin
keskim pienin
luetaan luvut
tulostetaan ne järjestyksessä
if (vaihtoehto1) then write (luku1, luku2, luku3);
if (vaihtoehto2) then write (luku1, luku3, luku2);
if (vaihtoehto3) then write (luku2, luku1, luku3);
if (vaihtoehto4) then write (luku3, luku1, luku2);
if (vaihtoehto5) then write (luku2, luku3, luku1);
if (vaihtoehto6) then write (luku3, luku2, luku1);
Mistä tiedetään, että kyseessä on vaihtoehto i?
vaihtoehto 1, jos (luku1 < luku2 and luku2 < luku3)
vaihtoehto 2, jos (luku1 < luku3 and luku3 < luku2)
jne
Siis algoritmina:
read(luku1, luku2, luku3);
if (luku1 < luku2 and luku2 < luku3) then write
(luku1, luku2, luku3);
if (luku1 < luku3 and luku3 < luku2) then write
(luku1, luku3, luku2);
if (luku2 < luku1 and luku1 < luku3) then write
(luku2, luku1, luku3);
if (luku3 < luku1 and luku1 < luku2) then write
(luku3, luku1, luku2);
if (luku2 < luku3 and luku3 < luku1) then write
(luku2, luku3, luku1);
if (luku3 < luku2 and luku2 < luku1) then write
(luku3, luku2, luku1);
Kannattaisiko vielä käyttää sisäkkäistä 'if -then- else- if' -rakennetta? Olisiko tästä mitään hyötyä?
if (luku1 < luku2 and luku2 < luku3) then write
(luku1, luku2, luku3)
else if (luku1 < luku3 and
luku3 < luku2) then write (luku1, luku3, luku2)
else if (luku2 < luku1 and luku1 < luku3) then write (luku2,
luku1, luku3)
else if (luku3 < luku1 and luku1 < luku2) then
write (luku3, luku1, luku2)
else if (luku2 < luku3 and luku3 < luku1) then write (luku2,
luku3, luku1)
else if (luku3 < luku2 and luku2 < luku1) then
write (luku3, luku2, luku1);