switch-case lauseilla muunnos C-kielessä?

Alussa kysytään millaisen rahasumman haluaa. Ja sitten pitäisi switch-case lauseyhdistelmällä muuntaa tämä kysytty rahasumma (esim. 883 euroa)seteleiksi ja kolikoiksi.

Pitäisi tulla näytölle seuraavanlainen esim.
500 euroa : 1 kpl
100 euroa : 3 kpl
50 euroa : 1 kpl
20 euroa : 1 kpl
10 euroa : 1 kpl
2 euroa : 1 kpl
1 euro : 1 kpl
Mitä keinoa voisin käyttää tällaisessa edellä mainitussa esimerkissä?
Voisikohan joku antaa minulle neuvoja, miten tuollainen voitaisiin tehdä?
181387
Äänestä

Muut lukivat myös

Vastaukset 18

Vanhimmat

Enpä tiedä miten tuossa switch-case rakennetta hyödynnettäisiin.

Teet sen sijaan while-silmukan, jonka sisälle laitat if-else rakenteen, jossa vähennät rahamäärästä aina suurimman mahdollisen rahakoon ja lisäät vastaavaa muuttujaa aina yhdellä. Tätä toistetaan kunnes rahasumma on 0

Äänestä
  • Näinkö tarkoitat, että aloitan silmukan näin?

    while (rahasumma=0)
    {
    rahasumma=rahasumma - 500;
    Ja sitten lisätään vastaavaa muuttujaa yhdellä?
    Tuota en ymmärrä, tarkoitatko sillä laskuria?
    Eli tarkoittaako se sitä,että se ilmoittaa rahan kpl lukumäärän?
    Voisitko vielä neuvoa, mitä tarkoitat tuolla?

    Äänestä

  • miten ratkaistaan? kirjoitti:

    Näinkö tarkoitat, että aloitan silmukan näin?

    while (rahasumma=0)
    {
    rahasumma=rahasumma - 500;
    Ja sitten lisätään vastaavaa muuttujaa yhdellä?
    Tuota en ymmärrä, tarkoitatko sillä laskuria?
    Eli tarkoittaako se sitä,että se ilmoittaa rahan kpl lukumäärän?
    Voisitko vielä neuvoa, mitä tarkoitat tuolla?

    Eli teet jokaiselle setelille ja kolikolle laskurit ja alustat ne 0:lla.

    Silmukassa vähennät rahasummasta aina suurimman setelin/kolikon ja lisäät kyseistä laskuria aina yhdellä. Lopuksi kun kaikki rahat on näin laskettu poistutaan silmukasta ja voit tulostaa eri kokoisten rahojen lukumäärät.

    Silmukka on tyyliä:

    while(rahasumma)
    {
    if(rahasumma>= 500)
    {
    rahasumma-=500;
    viissataset ;
    }
    else if(rahasumma>=200)
    {
    rahasumma-=200;
    kakssataset ;
    }
    jnejne..
    }

    Äänestä

  • keijo kirjoitti:

    Eli teet jokaiselle setelille ja kolikolle laskurit ja alustat ne 0:lla.

    Silmukassa vähennät rahasummasta aina suurimman setelin/kolikon ja lisäät kyseistä laskuria aina yhdellä. Lopuksi kun kaikki rahat on näin laskettu poistutaan silmukasta ja voit tulostaa eri kokoisten rahojen lukumäärät.

    Silmukka on tyyliä:

    while(rahasumma)
    {
    if(rahasumma>= 500)
    {
    rahasumma-=500;
    viissataset ;
    }
    else if(rahasumma>=200)
    {
    rahasumma-=200;
    kakssataset ;
    }
    jnejne..
    }

    mistähän minä kakssataset kehitin, no samapa tuo =)

    Äänestä

  • Kyseessä on varmaankin koulutehtävä, et ehkä se switch-case ois hyvä olla jossakin. Tehtävä nyt sattuu olemaan sellanen, ettei sille mitään järkevää käyttöä löydy, mut jos se johonkin pitää väkisin vääntää, ehkä tulostus ois oikea paikka. Jos vaikka pyrkii siihe, et tulostus näyttäis jokseenkin tältä:

    1 viissatane
    ei satasia
    3 kakskymppistä

    Äänestä

  • Urto kirjoitti:

    Kyseessä on varmaankin koulutehtävä, et ehkä se switch-case ois hyvä olla jossakin. Tehtävä nyt sattuu olemaan sellanen, ettei sille mitään järkevää käyttöä löydy, mut jos se johonkin pitää väkisin vääntää, ehkä tulostus ois oikea paikka. Jos vaikka pyrkii siihe, et tulostus näyttäis jokseenkin tältä:

    1 viissatane
    ei satasia
    3 kakskymppistä

    En muuten aiemmin huomannut tätä sinun vastaustasi, joten kiitän siitä ja myös siitä, että huomautit tuosta printf:n virheestä, en varmaan olisi tuota huomannut muuten, ainakaan kovin pian. Olisin vain turhaan yrittänyt hakea sitä virhettä.

    Kiitos Sulle!

    Äänestä

  • keijo kirjoitti:

    mistähän minä kakssataset kehitin, no samapa tuo =)

    Kyllä niitä euroja on kakssatasiakin...

    Äänestä

Jos kiinnostaa niin on muukin tapa tehdä tuo joka säästää kirjoittamista ;)

Tuon voi tehdä kätevästi jakamalla rahamäärä setelin/kolikon koolla, jolloin saadaan suoraan kyseisen setelin/kolikon lukumäärä. Jäljelle jäävä rahamäärä on kyseisen jakolaskun jakojäännös..

Lisäksi jos laitat setelien/kolikkojen koot ja laskurit taulukkoon, voit tehdä koko touhun yhdessä for lausekkeessa parilla rivillä.

Tätä voi ajatella lisätehtävänä ;)

Äänestä
  • Kiitos neuvoista, mutta en saa nyt mitenkään onnistumaan näistä ehdottamistasi ohjeista toimimaan mitään.
    Yritin sitä jakamalla rahasumma setelin/kolikon koolla, niin en saanut sitäkään toimimaan.
    Tarkoitatko näin:

        {
        rahasumma = rahasumma/500;
        {
        printf("%d kpl
    ");
        }
    rahasumma = (rahasumma-500)/100;
        {
        printf("%d kpl
    ");
        }
    }
    Tämä ei ota huomioon enää tuota 100:lla jaettavaa kohtaa, tulostaa väärin. Jos annan luvun esim.700
    niin tulostaa näin:
    1 kpl
    -4 kpl
    Missä on vika?

    Äänestä

  • miten ratkaistaan? kirjoitti:

    Kiitos neuvoista, mutta en saa nyt mitenkään onnistumaan näistä ehdottamistasi ohjeista toimimaan mitään.
    Yritin sitä jakamalla rahasumma setelin/kolikon koolla, niin en saanut sitäkään toimimaan.
    Tarkoitatko näin:

        {
        rahasumma = rahasumma/500;
        {
        printf("%d kpl
    ");
        }
    rahasumma = (rahasumma-500)/100;
        {
        printf("%d kpl
    ");
        }
    }
    Tämä ei ota huomioon enää tuota 100:lla jaettavaa kohtaa, tulostaa väärin. Jos annan luvun esim.700
    niin tulostaa näin:
    1 kpl
    -4 kpl
    Missä on vika?

    viissataset=rahasumma/500; /* monestikko 500 menee rahasummaan on viissatasten lukumäärä */
    rahasumma=rahasumma%500; /* rahasummaksi jää jakojäännös, eli se mikä ei mennyt viissatasten kanssa tasan */

    sataset=rahasumma/100; /* monestikko 100 menee jäljelle jääneeseen rahasummaan.. */
    rahasumma=rahasumma%100; /* paljonko jää vielä rahaa jotka ei menneet tasan 500:sten eikä 100:sten kanssa */

    jne.

    Ei kyse ole mistään mystisestä seikasta.. huomaat kyllä kun mietit vähän mistä on kyse.

    %-operaattori jakaa edellä olevan luvun jälkimmäisellä, mutta palauttaa jaon tuloksen sijaan jakojäännöksen. Eli esim 5/2 olisi 2 mutta 5%2 olisi 1 (5-5/2)

    Äänestä

  • keijo kirjoitti:

    viissataset=rahasumma/500; /* monestikko 500 menee rahasummaan on viissatasten lukumäärä */
    rahasumma=rahasumma%500; /* rahasummaksi jää jakojäännös, eli se mikä ei mennyt viissatasten kanssa tasan */

    sataset=rahasumma/100; /* monestikko 100 menee jäljelle jääneeseen rahasummaan.. */
    rahasumma=rahasumma%100; /* paljonko jää vielä rahaa jotka ei menneet tasan 500:sten eikä 100:sten kanssa */

    jne.

    Ei kyse ole mistään mystisestä seikasta.. huomaat kyllä kun mietit vähän mistä on kyse.

    %-operaattori jakaa edellä olevan luvun jälkimmäisellä, mutta palauttaa jaon tuloksen sijaan jakojäännöksen. Eli esim 5/2 olisi 2 mutta 5%2 olisi 1 (5-5/2)

    Taidan olla tosi tyhmä, kun en saa tätä toimimaan.Laitoin ne näin, niin kuin ehdotit:
    {
    viissataset=rahasumma/500;
    rahasumma=rahasumma%500;
    printf("%d kpl
    ");
    }
    sataset=rahasumma/100;
    rahasumma=rahasumma%100;
    printf("%d kpl
    ");
    {
    viiskymppiset=rahasumma/50;
    rahasumma=rahasumma%50;
    printf("%d kpl
    ");
    } jne....

    Niin edelleenkin se tulostaa väärin.
    Se antaa tulostuksena 5-numeroisia isoja lukuja.
    Ei tästä taida tulla mitään....Mitä tähän pitäisi vielä lisätä, että se toimisi oikein ?

    Taidan olla toivoton tapaus?
    Ei parannuskeinoa?

    Äänestä

  • miten ratkaistaan? kirjoitti:

    Taidan olla tosi tyhmä, kun en saa tätä toimimaan.Laitoin ne näin, niin kuin ehdotit:
    {
    viissataset=rahasumma/500;
    rahasumma=rahasumma%500;
    printf("%d kpl
    ");
    }
    sataset=rahasumma/100;
    rahasumma=rahasumma%100;
    printf("%d kpl
    ");
    {
    viiskymppiset=rahasumma/50;
    rahasumma=rahasumma%50;
    printf("%d kpl
    ");
    } jne....

    Niin edelleenkin se tulostaa väärin.
    Se antaa tulostuksena 5-numeroisia isoja lukuja.
    Ei tästä taida tulla mitään....Mitä tähän pitäisi vielä lisätä, että se toimisi oikein ?

    Taidan olla toivoton tapaus?
    Ei parannuskeinoa?

    printf("%d kpl");

    Siinä vika, kyllä se laskee oikein

    Äänestä

  • Urto kirjoitti:

    printf("%d kpl");

    Siinä vika, kyllä se laskee oikein

    En kyllä huomaa siinä mitään vikaa. Voisitko kertoa sen vian?

    Äänestä

  • miten ratkaistaan? kirjoitti:

    En kyllä huomaa siinä mitään vikaa. Voisitko kertoa sen vian?

    Tuli yhtäkkiä kuin salama kirkkaalta taivaalta, että siitähän puuttuu muuttuja lopusta.
    Eli sen pitäisi olla printf("%d",viissataset);
    Nyt se toimii, olinpa minä ollut tosi ajattelematon.

    Kiitos neuvosta Urto!

    Äänestä

  • keijo kirjoitti:

    viissataset=rahasumma/500; /* monestikko 500 menee rahasummaan on viissatasten lukumäärä */
    rahasumma=rahasumma%500; /* rahasummaksi jää jakojäännös, eli se mikä ei mennyt viissatasten kanssa tasan */

    sataset=rahasumma/100; /* monestikko 100 menee jäljelle jääneeseen rahasummaan.. */
    rahasumma=rahasumma%100; /* paljonko jää vielä rahaa jotka ei menneet tasan 500:sten eikä 100:sten kanssa */

    jne.

    Ei kyse ole mistään mystisestä seikasta.. huomaat kyllä kun mietit vähän mistä on kyse.

    %-operaattori jakaa edellä olevan luvun jälkimmäisellä, mutta palauttaa jaon tuloksen sijaan jakojäännöksen. Eli esim 5/2 olisi 2 mutta 5%2 olisi 1 (5-5/2)

    Nyt sain sen toimimaan vihdoin ja viimein.
    Olin ollut tosi tyhmä, kun en ollut huomannut tuota printf:n virhettä, minulta puuttui muuttuja sieltä perästä kokonaan, siksihän se ei tietenkään tulostanut oikein.

    Olen nyt tosi onnellinen, joten kiitos Sinulle siitä. Miten pienistä asioista voikaan tulla onnelliseksi...ja sen onnellisuuden Sinä sait neuvoillasi aikaan...kiitti!

    Äänestä

  • miten ratkaistaan? kirjoitti:

    Nyt sain sen toimimaan vihdoin ja viimein.
    Olin ollut tosi tyhmä, kun en ollut huomannut tuota printf:n virhettä, minulta puuttui muuttuja sieltä perästä kokonaan, siksihän se ei tietenkään tulostanut oikein.

    Olen nyt tosi onnellinen, joten kiitos Sinulle siitä. Miten pienistä asioista voikaan tulla onnelliseksi...ja sen onnellisuuden Sinä sait neuvoillasi aikaan...kiitti!

    Juuri tämän takia kääntäjien virheilmoitukset TULEE ottaa vakavasti sekä käyttää vielä lisäksi kääntäjän tarjoamia toimintoja monien tyypillisten virheiden huomaamiseksi. Esim. gcc:llä käännettäessä kannattaa ehdottomasti käyttää optiota -Wall. Näiden optioiden aiheuttamaat kiljoonat virheet voivat aluksi masentaa, mutta kokemuksen kartuttua homma toimii kivuttomammin ja mystisiä bugeja ilmaantuu harvemmin.

    Äänestä

Eiköhän nämä ohjelmointikurssin harjoitustehtävät ole tarkoitettu itse tehtäväksi...

Äänestä
  • Käytännössä on niin, että kun on aikansa pähkäillyt ongelmaa ja saanut siitä puserrettua kysymyksen, jonka perusteella joku osaa vastata, niin lopputulos on oppimisen kannalta yhtä hyvä kuin olisi itse pähkäillyt ratkaisun. Kysymällä oppiminen sujuu vaan nopeammin. Kyllä meillä töissäkin ammattiylpeille nörteille saa jatkuvasti muistutella, että puolen tunnin miettimisen jälkeen on syytä mennä kysymään kavereilta. Se nimittäin maksaa maltaita, kun joku istuu kopissaan pähkäilemässä viikon jotain ongelmaa, jonka jo viisi kaveria on ratkaissut omin päin. Pyörää ei kannata keksisä samassa firmassa monesti.

    Siinä ope on oikeassa, että kysyminen ennen omaa aivovoimistelua ei opeta juuri mitään, vastaus valuu ohi harmaitten aivosolujen näppikselle kuin vesi hanhen selästä. Mutta liika on liikaa, kysyvä ei tieltä eksy.

    Äänestä

Kommentoi aloitusta


miten ratkaistaan? kirjoitti:

Alussa kysytään millaisen rahasumman haluaa. Ja sitten pitäisi switch-case lauseyhdistelmällä muuntaa tämä kysytty rahasumma (esim. 883 euroa)seteleiksi ja kolikoiksi.

Pitäisi tulla näytölle seuraavanlainen esim.
500 euroa : 1 kpl
100 euroa : 3 kpl
50 euroa : 1 kpl
20 euroa : 1 kpl
10 euroa : 1 kpl
2 euroa : 1 kpl
1 euro : 1 kpl
Mitä keinoa voisin käyttää tällaisessa edellä mainitussa esimerkissä?
Voisikohan joku antaa minulle neuvoja, miten tuollainen voitaisiin tehdä?

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