Hei
Miten saan ohjelmalla tarkistettua seuraavan asian.
esim.
Syötteenä annetaan ohjelmalle 1,35 €
ja ohjelman pitäisi erotella luku seuraavasti
1,35 €
on
2kpl 50snt
1kpl 20snt
1kpl 10snt
1kpl 5 snt
Siis olen tehnyt jo ohjelmaan tämän päljonko euroista tulee mitäkin senttejä, mutta en tiedä miten sen saa sovellettua tuohon muotoon optimoituna.
Ja ohjelmointi kieli on edelleen java.
Miten niin "sovellettu tuohon muotoon optimoituna"?
Käy kolikot läpi suurimmasta pienimpään. Vähennä summaa (ja lisää kolikon lukumäärää), kunnes summa on pienempi kuin kolikon arvo. Sitten siirry pienempään kolikkoon.
Eikös tuon pitäisi todellisuudessa antaa 1 kpl euron kolikoita eikä 2 kpl 50 senttisiä.
Sinänsähän koodin kannalta asiassa ei ole merkitystä. Itse laittaisin käytettävät arvot taulukkoon, josta sitten kävisin loopilla läpi. Metabolixin ehdottama tapakin toimii, vaikka itse todennäköisesti käyttäisin hyväkseni myös jakolaskua ja kertolaskua tai jakojäännöstä.
Tehtävässä oli jätetty täydet eurot pois.
Yritän tässä illan aikana jonkinlaista ohjelmaa väsätä.
Optimoinnilla tarkoitin sitä kun tällä hetkellä ohjelmani tulostaisi
2kpl 50snt
6kpl 20snt
13kpl 10snt
27kpl 5snt
Siis ei osaa vielä ajatella montako kutakin senttikolikkoa tarvitaan.
Kiitos neuvoista.
Vähennä kokonaissummasta aina kolikon arvo.
Esim. Sulla on se 1,35€ ja ohjelma ottaa kaksi 50 sentin kolikkoa, 1,35 - 2*0,5. Sitten 0,35 - 0,2*1, 0,15 - 0,1*1, 0,05 - 0,05*1.
Jakolaskulla ja modulolla tuosta kai helpoiten selviää...
sum = 1.35 50cents = Int(sum / 0.50) sum = sum mod 0.50 20cents = Int(sum / 0.20) sum = sum mod 0.20 10cents = Int(sum / 0.10) sum = sum mod 0.10 5cents = sum / 0.05
Laittaisin tuohon pseudoon Int tilalle Floor niin ei olisi epäselvyyksiä. Plus että toimiiko modulo desimaalijakajalla?
Rahasummia on parasta käsitellä aina sentteinä, eli tässä tapauksessa muunnos 1,35 e -> 135 snt heti käyttäjän syötteen jälkeen.
Chiman kirjoitti:
Rahasummia on parasta käsitellä aina sentteinä, eli tässä tapauksessa muunnos 1,35 e -> 135 snt heti käyttäjän syötteen jälkeen.
En ole samaa mieltä, että "aina", mutta tässä tapauksessa kyllä. (Käsittelen itse rahasummia lähes aina koodatessa decimal -tietotyypillä erotuksena float -tietotyyppiin.)
Nämä on taas makuasioita. Varmaan helpoiten menee noin jakamalla ja modulolla, mutta itse pidän aloittelevalle koodarille helpompana ja loogisempana ratkaisua joka perustuu summan tarkistamiseen, siitä vähentämiseen ja kolikkomäärän lisäämiseen. Pseudo:
summa = 1.35 * 100; kolikot = int array(50, 20, 10, 5); erilaisia_kolikoita = count(kolikot); maarat = int array(); for (i=0; i< erilaisia_kolikoita; i++) while ( summa >= kolikot[i] ) { maarat[i]++; summa -= kolikot[i]; }
Mielestäni se ei varsinaisesti ole makuasia, kummankin vaihtoehdon puolesta on argumentit joita voi arvioida objektiivisesti. Yleisesti ottaen jakolaskun suorittaminen tuolla tavalla on huono (tehoton) ratkaisu. Tässä tapauksessa asialla ei tietenkään ole suuresti merkitystä, koska voidaan kohtuudella olettaa, että ohjelmalle ei varmaankaan anneta yli 1000 euroa laskettavaksi eikä sitä suoriteta kovin montaa kertaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.