Ratkaisuesimerkkejä:
 

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);