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;
}
172130
Äänestä

Muut lukivat myös

Vastaukset 17

Vanhimmat

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.

Äänestä

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ä!

Äänestä
  • Kiitos!!!

    Äänestä

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.

Äänestä
  • Kiitoksia paljon!

    Äänestä

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

Äänestä

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.

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

    Äänestä

  • 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.

    Äänestä

  • 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

    Äänestä

  • 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.

    Äänestä

  • 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);

    Äänestä

  • 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.

    Äänestä

  • 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.

    Äänestä

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

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

    Äänestä

  • 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.

    Äänestä

Kommentoi aloitusta


Ol80 kirjoitti:

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

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