APUA!!! Switch

Moi!
Olin vasta aloittamassa opintojakson ymmärtääkseni lopulta ohjelmoinnin perusteet. Ja nyt olen täysin hämmentynyt enkä ymmärrä, mitä tässä asiassa tehdä. En ole koskaan aiemmin ollut mukana ohjelmoinnissa. Rehellisesti sanottuna minulla ei ole vielä helppoa ymmärtää kaikkia näitä algoritmeja, mutta minulla on halu ymmärtää tätä aluetta. Siksi pyydän apua virheideni korjaamiseen ja siten materiaalin ymmärtämiseen.
Kiitos jo etukäteen!


Tentävä:
Tee yksinkertainen laskinohjelma, joka laskee kahden luvun erotuksen, summan tai tulon. Ohjelma kysyy ensin mikä laskutoimitus suoritetaan. Tämän jälkeen ohjelma kysyy luvut, suorittaa laskutoimituksen ja tulostaa saadun tuloksen. Ohjelman valinta on tehtävä käyttämällä switch()-lausetta.

Esimerkkituloste:
1: vähennyslasku
2: yhteenlasku
3: kertolasku
Valitse toiminto:3
Anna eka luku:3
Anna toka luku:54
3*54=162

Yritin näin (ja oli ilmoitus "Virhe: Ohjelmasi ei kääntynyt"):

#include <stdio.h>

int main()

{
int eka_luku, toka_luku, tulos1=eka_luku-toka_luku, tulos2=eka_luku*toka_luku, tulos3=eka_luku*toka_luku, ;
eka_luku=3;
toka_luku=54;
kertolasku=162;


printf("1: vähennyslasku\n");
scanf;

printf("2: yhteenlasku\n");
scanf;

printf("3: kertolasku\n");
scanf;

printf("Valitse toiminto:3\n");
scanf;

char op;

printf("Anna eka luku: 3\n");
scanf;

printf("Anna toka luku: 54\n");
scanf;

switch (op)

{
case 1:
{
printf("tulos1=eka_luku-toka_luku\n");
break;

}
case 2:
{
printf("tulos2=eka_luku toka_luku\n");
break;
}
case 3:
{
printf("tulos3=eka_luku*toka_luku\n");
break;
}

}

printf("3*54=162\n");
scanf;


return 0;
}

17

2130

    Vastaukset 17

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Mahtaa siinä ainakin tämä osa:

      printf("3*54=162\n");
      scanf;

      olla aivan liikaa ja turhaa.

      Sillä ohjelman kai pitäisi tulostaa syötettyjen lukujen perusteella tehtyjen laskutoimitusten tuloksia.

    • Anonyymi

      Ainakin scanf-funktiota käytetään väärin. Tee se tähän tyyliin:

      int i = 0;
      printf("Anna luku: ");
      scanf("%d", &i);

      Tuossa siis luodaan muuttuja i alkuarvolla nolla. Sitten pyydetään luku. Lopuksi scanf-funktiolla luetaan numero (%d) ja sijoitetaan se muuttujaan i (merkintään funktiossa &i).

      Sitten sulla oli joku turha char -juttu siellä.

      Muuttujat kannattaa luoda selkeyden vuoksi tuossa ohjelman alussa niin että teet ne kaikki omilla riveillään ja alustat ne nollaksi. Eli suunnilleen näin:

      int eka_luku = 0;
      int toka_luku = 0;
      int vastuus = 0;

      Sitten switch-rakenteen sisällä teet laskun jossa vastauksen arvo muuttuu eli esim pluslaskussa:

      vastaus = eka_luku toka_luku;

      Sitten swtichin jälkeen vasta aina tulostetaan vastaus:

      printf("Vastaus on: %d", vastaus);


      ...ja hei, hienoa että opiskelet ohjelmointia ja vieläpä C-kielellä! Tsemppiä!

      • Anonyymi

        Kiitos!!!


    • Anonyymi

      Luitko tuossa edellä antamani vinkit (klo 13:33)?

      Jos ei auennut vielä niin korjasin tuon sinun koodin toimivaksi. En laita sitä tähän kirjoitettuna että et voi suoraan kopioida vastausta tehtävään. Laitan kuitenkin kuvan mistä voit katsoa yhden toimivan toteutuksen malliksi.

      https://i.postimg.cc/yYpPNfyB/laskuri.jpg

      Itse koodi on siis vasemmassa reunassa tummalla pohjalla. Oikeassa reunassa on näkyvissä miten ohjelma kääntyi ilman virheilmoituksia gcc -kääntäjällä komentoriviltä linuxissa ja että kaikki laskutoimitukset toimivat oikein.


      Kiinnitä erityisesti huomiota:

      1:
      Muuttujien alustaminen alussa on tehty selkeys edellä. Lisäksi ei mielellään ikinä jätetä muttujaa alustamatta kun se luodaan. Eli siksi niihin kaikkiin laitetaan nollat alkuun.

      2:
      Scanf on funktio. Eli siinä pitää olla ne sulut ja lisäksi se tarvitsee parametrejä. Eka parametri, joka on hipsujen sisällä, kertoo vastaanotettavan tiedon muodon. Prosentti-d tarkoittaa numeromuotoa. Sitten se toinen parametri on viittaus muuttuaan johon se vastaanotettava tieto tallennetaan. &-merkki tekee siitä viittauksen kyseisen muuttujan muistialueeseen.

      3:
      Laskutoimitukset tehdään switch-case -rakenteen sisällä ja laskujen lopputulosta käytetään vasta rakenteen jälkeen. Näin ei tarvitse kutsua printf -funktiota kuin vain yhdestä paikasta eikä jokaisessa haarassa.

      • Anonyymi

        Kiitoksia paljon!


    • Anonyymi

      Eipä mitään! Paljon tsemppiä opiskeluun!

    • Anonyymi

      Halusin tuoda mukaan vielä yhden erilaisen tavan käsitellä tätä samaa asiaa. Tämä perinteinen tapa että käyttäjältä tivataan asioita, jotka ohjelma voi päätellä syötteestä ei aina oikein innosta puolin eikä toisin.

      Tässä käyttäjä syöttää kaavan, ja kaavasta päätellään mikä tehtävä tulee suorittaa, kuva selventää asiaa: https://s7.gifyu.com/images/s24kysymys.png

      Pistin myös koodin tuonne ( https://pastebin.com/fkE4iQs6 ), koska mukana on taas näitä väritettyjä tulosteita. Asetan vielä kysymyksen tähän.

      Tuossa kaava tulee antaa niin ettei sitä jaeta välilyönnein ( 234-23 ) mitä muutoksia tulee tehdä, että haarautumiset onnistuvat oikein vaikka käyttäjä syöttäisi kaavan näin ( 234 - 23 ), eli erittelee operandit ja operaatorit välilyönnein, ja siitä huolimatta haarautumiset menee oikein.

      • Anonyymi

        Lisätään vielä, että, minä tiedän että, tämä ( switch (op) {} ) lohko on turhaan, koska ne laskut olisi voitu suorittaa jo niissä if -lauseissa joissa muuttujalle op haettiin arvoa. Halusin sen kuitenkin säilyttää, koska asiaa tähän asti käsiteltiin juuri switch() haarautumisien vuoksi.


      • Anonyymi
        Anonyymi kirjoitti:

        Lisätään vielä, että, minä tiedän että, tämä ( switch (op) {} ) lohko on turhaan, koska ne laskut olisi voitu suorittaa jo niissä if -lauseissa joissa muuttujalle op haettiin arvoa. Halusin sen kuitenkin säilyttää, koska asiaa tähän asti käsiteltiin juuri switch() haarautumisien vuoksi.

        Tämähän oli oikein tervetullut ratkaisuversio! Oma "ohjelmoinnin perusteet" kurssin silloin joskus sisälsi tämän saman tehtävän mutta en muista että kukaan olisi tehnyt tälläistä kaava-versiota. Kai se opetus vähän ohjasi siihen anna-eka-luku -tyyppiseen ajatteluun.


      • Anonyymi
        Anonyymi kirjoitti:

        Tämähän oli oikein tervetullut ratkaisuversio! Oma "ohjelmoinnin perusteet" kurssin silloin joskus sisälsi tämän saman tehtävän mutta en muista että kukaan olisi tehnyt tälläistä kaava-versiota. Kai se opetus vähän ohjasi siihen anna-eka-luku -tyyppiseen ajatteluun.

        Itseppä yllytit, nyt sitten versio jossa mukana myös tuo lasketa, ja vielä niin ettei välilyönnit tee kiusaa operaattorien ja operandien välissä.
        Kuva https://s7.gifyu.com/images/oneversion.png

        Tässä versiossa on jo luovuttu tuosta switch() lajittelusta, mutta uutena mukana esimerkki kuinka tuosta käyttäjältä saadusta merkkijonosta poimitaan laskennassa tarvittavat luvut.
        Koodi: https://pastebin.com/GrNDrLAe


      • Anonyymi
        Anonyymi kirjoitti:

        Itseppä yllytit, nyt sitten versio jossa mukana myös tuo lasketa, ja vielä niin ettei välilyönnit tee kiusaa operaattorien ja operandien välissä.
        Kuva https://s7.gifyu.com/images/oneversion.png

        Tässä versiossa on jo luovuttu tuosta switch() lajittelusta, mutta uutena mukana esimerkki kuinka tuosta käyttäjältä saadusta merkkijonosta poimitaan laskennassa tarvittavat luvut.
        Koodi: https://pastebin.com/GrNDrLAe

        gcc antaa seuraavat varoitukset:

        warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
        gets(kaava);
        ^~~~

        warning: the `gets' function is dangerous and should not be used.


        ...eli siis gets() on käytännössä altis puskurinylivuodolle. fgets() ei ole mutta vähän hankalampi käyttää. Jännä että myös scanf() on periaatteessa altis puskuriylivuodolle mutta siitä ei tule varoituksia.

        Muuten kyllä on ihan kiva toteutus, joskaan ei kyllä varmaankaan aloittelijalle enää kovin ymmärrettävä. Nykyisin kun kääntäjät osaavat optimoida niin hyvin, on mielestäni järkevää panostaa nimenomaan luettavuuteen ja ymmärtämisen helppouteen lähdekoodissa.


      • Anonyymi
        Anonyymi kirjoitti:

        gcc antaa seuraavat varoitukset:

        warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
        gets(kaava);
        ^~~~

        warning: the `gets' function is dangerous and should not be used.


        ...eli siis gets() on käytännössä altis puskurinylivuodolle. fgets() ei ole mutta vähän hankalampi käyttää. Jännä että myös scanf() on periaatteessa altis puskuriylivuodolle mutta siitä ei tule varoituksia.

        Muuten kyllä on ihan kiva toteutus, joskaan ei kyllä varmaankaan aloittelijalle enää kovin ymmärrettävä. Nykyisin kun kääntäjät osaavat optimoida niin hyvin, on mielestäni järkevää panostaa nimenomaan luettavuuteen ja ymmärtämisen helppouteen lähdekoodissa.

        Olet taas oikeassa, muuta se rivi (23) tälläiseksi:
        fgets(kaava, sizeof(kaava), stdin);


      • Anonyymi
        Anonyymi kirjoitti:

        gcc antaa seuraavat varoitukset:

        warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
        gets(kaava);
        ^~~~

        warning: the `gets' function is dangerous and should not be used.


        ...eli siis gets() on käytännössä altis puskurinylivuodolle. fgets() ei ole mutta vähän hankalampi käyttää. Jännä että myös scanf() on periaatteessa altis puskuriylivuodolle mutta siitä ei tule varoituksia.

        Muuten kyllä on ihan kiva toteutus, joskaan ei kyllä varmaankaan aloittelijalle enää kovin ymmärrettävä. Nykyisin kun kääntäjät osaavat optimoida niin hyvin, on mielestäni järkevää panostaa nimenomaan luettavuuteen ja ymmärtämisen helppouteen lähdekoodissa.

        Kävin pastebin versionkin korjaamassa.


      • Anonyymi
        Anonyymi kirjoitti:

        gcc antaa seuraavat varoitukset:

        warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
        gets(kaava);
        ^~~~

        warning: the `gets' function is dangerous and should not be used.


        ...eli siis gets() on käytännössä altis puskurinylivuodolle. fgets() ei ole mutta vähän hankalampi käyttää. Jännä että myös scanf() on periaatteessa altis puskuriylivuodolle mutta siitä ei tule varoituksia.

        Muuten kyllä on ihan kiva toteutus, joskaan ei kyllä varmaankaan aloittelijalle enää kovin ymmärrettävä. Nykyisin kun kääntäjät osaavat optimoida niin hyvin, on mielestäni järkevää panostaa nimenomaan luettavuuteen ja ymmärtämisen helppouteen lähdekoodissa.

        Luettavuutta tuskin voi parantaa, muuten kuin värityksen poistolla, ja palaamalla takaisin siihen että tinkaa käyttäjältä parametrit erikseen. Eli näön ja käytettävyyden kustannuksella luettavuus paranee, ja asiat näyttää yksinkertaisimmilta.


    • Anonyymi

      Tuskin tälläkään palstalla kirjoittelevista löytyy yhtään sellaista, joka ei olisi jossakin vaiheessa ollut kiinnostunut C ohjelmointikielestä.

      • Anonyymi

        Joo, siis kyllähän se on edelleen vähän semmoinen status-juttukin jos osaa kirjoittaa C-kielellä ohjelmia. Enkä oikein usko että työpaikat C-osaajilta on loppumassa lähiaikoina.

        Lämmöllä muistelen niitä iltoja kun aikoinaan niitä kaikkia harjoituksia taistelin läpi.


      • Anonyymi
        Anonyymi kirjoitti:

        Joo, siis kyllähän se on edelleen vähän semmoinen status-juttukin jos osaa kirjoittaa C-kielellä ohjelmia. Enkä oikein usko että työpaikat C-osaajilta on loppumassa lähiaikoina.

        Lämmöllä muistelen niitä iltoja kun aikoinaan niitä kaikkia harjoituksia taistelin läpi.

        Joko ne raivostuttavat illat on unohtunut, aina ei asiat luista niin kuin pitäisi tai oletti.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Mikä on totta mikä ei?

      Onko juoru vai ei että nimeltä mainitsematon henkilö on tehnyt naiselle/naisille jotain joka on väärin?
      Kuhmo
      24
      2413
    2. Päivän aivopieru Trumpilta

      Trump julisti sodan hyttysiä vastaan. Myös punkit ovat Trumpin sodan kohteena. Eikö vieläkään USA:n kansa tajua tuon uko
      Maailman menoa
      87
      1597
    3. Lopetetaanko tämä

      Juttu ja mennään eteenpäin? Pystytkö?
      Ikävä
      135
      1013
    4. Just saying

      Mies joka antaa naiselle turvallisen olon, on seksikäs. Ei kieroja kikkoja ja haluaa olla vain sen yhden naisen mies.
      Ikävä
      143
      763
    5. Löytyikö syy miksi Martina on Muhiksen kanssa

      Saipa naurut Gekkosen kuvasta, missä ovat ravintola Hookissa Immu fight night ottelun jälkeen, Muhoksella pullottaa hirv
      Kotimaiset julkkisjuorut
      97
      714
    6. Voisin antaa sulle nyt

      Halin❤️
      Ikävä
      54
      702
    7. Janpen Thai lopettanut, miksiköhän

      Hyvää apetta teki.
      Suomussalmi
      13
      677
    8. Älä unohda minua

      Nainen ethän unohda minua. Asiat olisivat voineet mennä toisin, olisi vain pitänyt uskaltaa lähestyä sinua kun annoit si
      Ikävä
      78
      663
    9. Jos selviäisi että kaivattusi

      Olisi savant asperger? Rakastaisitko vielä? Savant-lahjakkuus olisi kapea-alaista neroutta liittyen mekanisiin ja tilan
      Ikävä
      100
      637
    10. Jorma Uotinen läväytti härskin heiton - Paljastus uudesta TTK-romanssista?

      Tuomari Jorma Uotisen linja on välillä hyvinkin rohkea TTK:ssa. Hän näpäytti Jaakko Parkkalille ja Kastanja Rauhalalle v
      Tanssii tähtien kanssa
      12
      628
    11. On väärin

      Tykätä ja haluta sua kun tilanne täysin mahdoton mutta minkäs teet. Mun sisällä roihuaa 🔥 kunpa tietäisit mitä sä minus
      Ikävä
      42
      603
    12. Tosi kiva on

      Joo. Mitä olisit menettänyt jos olisit paljastanut itsesi?
      Ikävä
      65
      571
    13. Toivotko vielä viestiä

      Minulta? En rohkene enää ottaa yhteyttä, kun varmasti jo uusia naisia elämässä. Nolaisin vain itseni.
      Ikävä
      44
      559
    14. Olen ajellut Dieseleillä yli 50 vuotta.

      Enkä ole koskaan kaivannut sähköautoa.
      Hybridi- ja sähköautot
      141
      555
    15. Tehdään yhdessä itsestämme

      Parhaat versiot❤️ Se vaatii molemmilta hyvää itsetuntoa!
      Ikävä
      42
      540
    16. Valtuuston kokous

      Kyl tuo Anita Ruokani on ihan pihalla,käy aika hitaalla.
      Kemijärvi
      43
      523
    17. Miksi jotku naiset on niin tyhmiä

      Että elättelevät turhaa toivoa toisen kustannuksella. Onko ne kaikki kaappilesboja vai mikä niitä vaivaa? Sitten itketä
      Ikävä
      54
      518
    18. Oliko Jani Halmeen aika jo tippua TTK:sta?

      Jani Halme ja Claudia Ketonen joutuivat jättämään TTK:n. Halme ja Ketonen saivat viimeiseksi jäänestä tanssista, sambas
      Tanssii tähtien kanssa
      29
      516
    19. Mitä tunteita

      Sulla vielä on?
      Ikävä
      77
      514
    20. Kuka kaipaa T m?

      Kerro nainen kirjaimesi vaan... Haluan miettiä kuka tulee ekana mieleeni.. kuin kurkistus tunteiden meren pinnalle, jota
      Ikävä
      36
      510
    Aihe