Lasketaan kahden, kolmen ja neljän potenssien määrä.
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
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.
Huomasin myös sellaisen ratkaisutavat, että jaetaan kakkosella niin kauan, kun luku on ykköstä suurempi. Tähän tosin kannattaa käyttää liukulukuja.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.