Miten kannattaisi aloittaa tekemään seuraavan tyyppinen ohjelma. Käyttäjä syöttää kokonaisluvun väliltä 0 - 1000000 ja ohjelma kääntää sen sanalliseen muotoon. Esim. 5783 viisi tuhatta seitsemän saataa kahdeksan kymmentä kolme ?
0-1000000 sanalliseen muotoon
Aloittelija
101710
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 10
Vanhimmat
Laita ensin taulukkoon 9 char-pointteria ja ne osoittamaan omiin merkkijonoihinsa, jotka sisältävät luvut 1-9 kirjoitettuna. siiten if-lauseilla tutkitaan ylittääkö luku kymmenen potensseja ja sitä mukaan lyödään taulukoista pointtereitten avulla numeroa ja sitten muuta määrettä perään.
Ensin tutki jos luku=0 tai 1000000 -> helppo case, sanoma on "nolla" tai "miljoona".
tonnit = luku/1000;
ykkoset = luku-tonnit*1000;
Jos luku>999 tee ensit tuhannet;
Kolmen numeron ryhmästä tehdään siis sana, ja tuhansien perään lisätään "tuhatta"
Tästä tulee hillitön määrä iffitystä.
Jos tuhansia on 200 tai yli, sanotaan ensin sataluku "sataa", jos taas 100-199 sanotaan ensin "sata":
if(tonnit>199){
sanoma=strcpy( sanana(tonnit/sata));
sanoma=strcat( sanoma, "sataa");
}
else if(tonnit>99){
sanoma=strcpy( sanoma, "sata");
}
Sitten tonneista vähennetään sadat:
kybatonnit=tonnit-(tonnit/100)*100
Sitten taas iiftellään:
20-99 sanotaan ensin sanana(kybatonnit/10)
10-19 erikoistapaukset
0-9 sanana()
Eli toi funktio sanana(i) palauttaa luvun 1-9 stringinä "yksi" jne.
Äh tulipa taas sekava juttu kuumehöyryissä. Idea on kuitenkin, että sanotaan toi luku kahtena ryhmänä:
401102
Ensin "neljä sataa yksi" "tuhatta", sitten "sata kaksi"
Jos et ymmärrä, voin tossa kietasta vaikka koodin kasaan näin sairaslomalla makoillessani.
Onkos ohjelmointi fyysisesti niin rasittavaa, kun nykyään moni ohjelmoija pitää sairaslomia?
Mutta reilun 38 asteen kuumeessa tekee mieli puolen tunnin istumisen jälkeen käydä kyljelleen.
Eikä kai ole mitenkään suositeltavaa mennä flunssassa työpaikalle levittämään tautia muihin.
Itsekin olen saman harjoitustyön joskus tehnyt. Mitäpä jos sinäki yrittäisit samaa, etkä itkisi täällä muita tekemään (yksinkertaisia) kouluhommiasi puolestasi? Ja jos jotain aiot itsekin tehdä harjoitusyösi eteen, niin opettele ainakin kirjoittamaan sanallisessa muodossa olevat luvut oikein. Tämä koodinvääntäjien taso laskee näemmä vuosi vuodelta... Onnea valitsemallesi uralle!
Kysyvä ei tieltä eksy.
Sitä mitä tulee kirjoitusvirheisiini, niin se on inhimillinen erehdys.
Ps. Voisitte myös tarkastaa oman kirjoitusasunne. Mitä olettekaan tarkoittaneet termillä "harjoitusyösi"?
Kysyvä ei tieltä eksy, totta. Mielestäni kysyä kannattaa kuitenkin vasta siinä tilanteessa, kun on itse yrittänyt ratkaista ongelmaa tuloksetta. Se, että heti ensimmäiseksi tehtävän saatua kyselee valmiita ratkaisuja, on mielestäni täysin hyödytöntä varsinkin oman oppimisesi kannalta.
Vastaukseni oli toki hieman tyly, mutta niin sen oli tarkoituskin olla ja rohkaista samalla sinua keksimään jotain omaa ratkaisumallia.
Itse muistelen aikoinani lähteneeni ratkaisemaan ongelmaa jakojäännösten avulla ja selvinneeni suhteellisen vähällä koodimäärällä. Onnea edelleen valitsemallesi uralle.
Ihan oikein teit, kun kysyit todellakin "miten kannattaisi lähteä ratkomaan". Et siis pyytänyt valmista koodia.
Veikkaisin että nimim "minä" ei tajunnut lainkaan miten hommaa pitäisi lähteä purkamaan, piti vaan periaatteeta kitistä.
Hommahan alkaa siitä, että erotat tuhannet ja ykköset, eli saat kaksi 3 numeroista lukua. Tämän asian oivaltaminen ei ole itsestäänselvyys.
char* numerot_sanamuotoon(int numero)
{
switch(numero)
{
case 1:
return "yksi";
case 2:
return "kaksi";
case 3:
return "kolme";
// 4, 5, .. jne
case 999999:
return "yhdeksansataayhdeksänkymmentäyhdeksäntuhatta yhdeksänsataayhdeksänkymmentäyhdeksän";
case 1000000:
return "miljoona";
default:
return "annoit virheellisen numeron";
}
}
10-järjestelmässä numeron paikka luvussa osoittaa sen kertoimen. Esim. luku 4567 voidaan purkaa osiin seuraavasti:
7*10^0 (=7)
6*10^1 (=60)
4*10^2 (=500)
4*10^3 (=4000)
=4567
^ tarkoitta potenssia (7*10^0 luetaan "seitsemän kertaa kymmenen potenssiin nolla")
Joten, jos muutat luvun merkkijonoksi (_itoa ja sen eri versiot), niin merkkitaulukon indeksi kertoo luvun dekadin ja solun sisältö kertoimen.
Yllä olevan ymmärtäminen ja algoritmin totetus jätetään kotitehtäväksi.