Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Fortran: Potenssit

JRokka [29.11.2019 12:05:27]

#

Lasketaan kahden, kolmen ja neljän potenssien määrä.

Koodi

Program Potenssit
implicit NONE

integer :: luvut(10)
integer :: mr_1, mr_2, mr_3 !Potenssien määrät.
integer :: x !Taulukon indeksi.
integer :: y !Eksponentti
mr_1 = 0
mr_2 = 0
mr_3 = 0
!Luodaan luvut.
luvut = (/ 10, 4, 15, 8, 16, 25, 2, 27,81, 35 /)
!Käydään taulukko läpi.
do x = 1, 10
 !Katsotaan, onko luku kahden, kolmen tai neljän potenssi.
 do y = 0, 10
  if (luvut(x) == 2**y) THEN
   mr_1 = mr_1 + 1
  end if
  if (luvut(x) == 3**y) THEN
   mr_2 = mr_2 + 1
  end if
  if (luvut(x) == 4**y) THEN
   mr_3 = mr_3 + 1
  end if
 end do
end do
!Näytetään tulokset.
if (mr_1 > 0) THEN
 print *,"Kahden potenssit:", mr_1
else
 print *,"Ei ole kahden potensseja."
end if
if (mr_2 > 0) THEN
 print *,"Kolmen potenssit:", mr_2
else
 print *,"Ei ole kolmen potensseja."
end if
if (mr_3 > 0) THEN
 print *,"Neljän potenssit:", mr_3
else
 print *,"Ei ole neljän potensseja."
end if

end program Potenssit

Metabolix [29.11.2019 14:20:47]

#

Yllä nähdään taas kerran ratkaisumalli, josta oikeita tuloksia tulee vain sopivilla luvuilla ja hyvällä tuurilla. Jos luku on vaikka 2048, sitä ei tuossa tunnisteta kahden potenssiksi, ja toisaalta hukataan aikaa turhien potenssilaskujen tekemiseen, kun tutkitaan kaikilla luvuilla kaikki tunnetut potenssilaskut eikä vain järkeviä.

Yksinkertaisin tapa sen tarkistamiseen, onko luku toisen luvun potenssi, on jakolasku. Eli jos halutaan tietää, onko 2048 kahden potenssi, jaetaan sitä kahdella niin kauan, kuin jakojäännös on 0. Jos lopputuloksena päästään ykköseen, kyseessä on kahden potenssi.

Onko tarkoitus tunnistaa ykkönen myöskin kaikkien lukujen potenssiksi? Nythän näin tapahtuu koodissasi. Tämä on toki matemaattisesti totta mutta tavallaan hieman erikoinen ratkaisu kuitenkin.

Muuttujien nimiin kannattaisi kiinnittää huomiota. Nimet mr_1 - mr_3 eivät kerro lukijalle mitään muuttujan sisällöstä, ja lisäksi nimen perässä oleva numero on harhaanjohtava, kun mr_2 sisältääkin kolmosen potenssien määrän.

Nyt kun selvästi osaat vääntää tällaisen satunnaisen ratkaisun monenlaisiin ongelmiin, voisit ruveta aktiivisesti harjoittelemaan sitä, että ratkaisussa olisi huomioitu ohjelmoinnin todelliset kannatinkivet eli koodin oikea toiminta kaikilla syötteillä (suurella lukumäärällä, suurilla luvuilla, tyhjillä listoilla jne.) ja koodin siisteys (mm. hyvät nimet) ja kopiointi- ja muokkauskelpoisuus (mm. funktioihin jaottelu).

Kuten aiemmin on mainittu, keskustelun hengen mukaista olisi myös keskustella asioista eikä vain syytää jokaista omaa harjoituskoodia foorumille mätänemään.

JRokka [29.11.2019 14:59:21]

#

Huomasin myös sellaisen ratkaisutavat, että jaetaan kakkosella niin kauan, kun luku on ykköstä suurempi. Tähän tosin kannattaa käyttää liukulukuja.

Grez [29.11.2019 15:03:50]

#

JRokka kirjoitti:

Tähän tosin kannattaa käyttää liukulukuja.

Siihen ei missään nimessä kannata käyttää liukulukuja.

Tietty riittävän pienet luvut saa sopivilla pyörityssäännöillä niinkin laskettua, mutta miksi kukaan tekisi niin kun asian voi tehdä yksinkertaisesti Metabolixin kuvaamallakin tavalla.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta