0-1000000 sanalliseen muotoon

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 ?
101710
Äänestä

Muut lukivat myös

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.

Äänestä

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.

Äänestä
  • Onkos ohjelmointi fyysisesti niin rasittavaa, kun nykyään moni ohjelmoija pitää sairaslomia?

    Äänestä

  • Lääkäri kirjoitti:

    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.

    Äänestä

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!

Äänestä
  • 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"?

    Äänestä

  • Aloittelija kirjoitti:

    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.

    Äänestä

  • Aloittelija kirjoitti:

    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"?

    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.

    Äänestä

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";
}
}

Äänestä

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.

Äänestä

Kommentoi aloitusta


Aloittelija kirjoitti:

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 ?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu