#include <stdio.h> int main(void) { int a,b,lasku; system("cls"); printf("Anna kaksi lukua"); printf("\n"); scanf("%d", &a); scanf("%d", &b); switch(lasku){ case '1': printf("%d + %d = %d",a,b,lasku); case '2': printf("%d - %d = %d",a,b,lasku); case '3': printf("%d * %d = %d",a,b,lasku); case '4': printf("%d / %d = %d",a,b,lasku); } getch(); }
Tän ois tarkoitus toimia silleen että jos painan vaikka 1 niin se näyttää ton yhteenlaskun mutta annettuani kaksi lukua ja painettuani 1 se poistuu ohjelmasta???
mikä neuvoksi?
Mod. lisäsi kooditagit
Lisää sinne vaikka system("PAUSE > NUL"); Voit myös laittaa Sleep(millisekunnit); (vaatii windows.h) jonka jälkeen se sulkeutuu.
Nyt siin ei vaan tulosta sitä yhteenlaskua ku painan 1.
Ethän sinä edes pyydä käyttäjää valitsemaan laskutoimitusta. Muuttuja lasku
voi sisältää ihan mitä tahansa, ja todennäköisesti se ei ainakaan sisällä mitään merkeistä '1'–'4' (eikä myöskään luvuista 1–4). Lisäksi switch-lauseesi toimii väärin, kuten varmaan huomaat, kunhan saat sen edes jotenkin toimimaan. Suosittelen jotain opasta.
Käyttäjä ei valitse tuossa laskutoimitusta ollenkaan. Lisäksi nuo Case '1' jne. kohdat eivät tule toimimaan. Tuossa tulisi jakolasku, jos käyttäjä antaisi laskutoimituksen 50 4 2
. Sitten pitää vielä tuo toimitus poimia. Lisäät noiden scanf-rivien väliin vielä yhden rivin: scanf("%d", &lasku);
.
Sitten nuo Caset pitää laittaa myös erillailla: Case '+', Case '-', Case '*', Case '/'.
Tässä olisi esimerkki.
#include <stdio.h> int main(void) { int a, b, lasku; system("CLS"); printf("Anna kaksi lukua"); printf("\n"); scanf("%d", &a); scanf("%d", &lasku); scanf("%d", &b); switch(lasku) { case '+': printf("%d + %d = %d", a, b, lasku); case '-': printf("%d - %d = %d", a, b, lasku); case '*': printf("%d * %d = %d", a, b, lasku); case '/': printf("%d / %d = %d", a, b, lasku); } system("PAUSE > NUL"); }
En testannut tätä, mutta tästä selvinnee tarkoitus. Lisäksi pienenä vinkkinä, että kannattaa rajoittaa noita välilyöntejä.
Tapaukseen 4 olisi hyvä liittää tarkastus, että nimittäjä poikkeaa nollasta. Muutenhan jakolaskua ei voi suorittaa.
Metabolix ja Macro: Kyseessä ei ole laskutoimitus, sillä nollalla ei saa jakaa. Laskutoimitus on kuvaus ExE->E, missä E on annettu joukko.
Macro kirjoitti:
Käyttäjä ei valitse tuossa laskutoimitusta ollenkaan. Lisäksi nuo Case '1' jne. kohdat eivät tule toimimaan. Tuossa tulisi jakolasku, jos käyttäjä antaisi laskutoimituksen
50 4 2
. Sitten pitää vielä tuo toimitus poimia. Lisäät noiden scanf-rivien väliin vielä yhden rivin:scanf("%d", &lasku);
.Sitten nuo Caset pitää laittaa myös erillailla: Case '+', Case '-', Case '*', Case '/'.
jos mä teen kuten tässä niin tulostaako se sitten yhteenlaskun ku painan näppäimistöstä "1"?
Eipä. Tuossa esimerkissä caset hyväksyy merkit '+', '-', '/' ja '*'. Esimerkki ei toimi halutulla tavalla, sillä caset ei pääty breikkeihin. Lisäksi muuttujan lasku arvo luetaan näppäimistöltä, vaikka se pitäisi ilmaista a:n ja b:n avulla.
#include <stdio.h> int main(void) { int a, b, lasku, tulos; system("CLS"); printf("Anna ensimmäinen luku \n"); scanf("%d", &a); printf("Anna laskutoimitus (1-4) \n"); scanf("%d", &lasku); printf("Anna toinen luku \n"); scanf("%d", &b); switch(lasku) { case 1: tulos = a + b; printf("%d + %d = %d", a, b, tulos); break; case 2: tulos = a - b; printf("%d - %d = %d", a, b, tulos); break; case 3: tulos = a * b; printf("%d * %d = %d", a, b, tulos); break; case 4: tulos = a / b; printf("%d / %d = %d", a, b, tulos); break; } system("PAUSE > NUL"); }
Jakolaskussa voi tulla huonoja tuloksia, jos jaetaan luvulla, joka on noin nolla. Tapaukseen 4 voisi liittää tarkistuksen että jakolasku tehdään vain jos |b|>10^{-15} vai mikä lie onkaan doublen tarkkuus.
Jaska: Doublen pienin arvo on 2-1074 eli noin 5*10-324. Lisäksi nollalla jakaminen tuottaa äärettömän (ja 0/0 tuottaa arvon NaN), eli ihan mukavia tuloksia tulee joka tapauksessa. Saivartelusi laskutoimituksen, laskuoperaattorin ja minkä lie eroista on aivan epäolennaista, kun on täysin selvää, että on puhe lasku
-muuttujan sisällöstä.
Metabolix kirjoitti:
Saivartelusi laskutoimituksen, laskuoperaattorin ja minkä lie eroista on aivan epäolennaista, kun on täysin selvää, että on puhe
lasku
-muuttujan sisällöstä.
Ehei toki ole epäoleellista. Käsitteillä on täsmälliset määritelmät, ja niiden mukaan on elettävä.
Jaska kirjoitti:
Käsitteillä on täsmälliset määritelmät, ja niiden mukaan on elettävä.
Voisitko sitten kertoa, mikä on oikea määritelmä tässä lasku-muuttujan sisällölle? Voit halutessasi käsitellä erikseen tapauksen, jossa se sisältää numeron (1–4), ja tapauksen, jossa se sisältää merkin (+-*/).
Määritelmät menevät ihan kuten tavalliset yhteen-, kerto-, vähennys- ja jakolasku. Näistä kolme ensimmäistä ovat laskutoimituksia ja puhutaan joko laskutoimituksen tuloksesta tai summasta, tulosta ja erotuksesta vastaavasti. Samoin jakolaskusta saadaan osamäärä. Ihan tuttua kouluajoilta. Ainoastaan kuvausta /(a,b)->a/b ei voi kutsua laskutoimitukseksi, ellei lähtö- ja maalijoukosta poisteta nollaa tai määritellä a/0 joksikin maalijoukon alkioksi.
Laskutoimituksen määritelmä ei ole hatusta revitty, vaan se esiintyy muun muassa Helsingin yliopiston matikan laitoksen kurssin Algebra 2 -luentomuistiinpanoissa, mikäli käyttävät vielä samaa prujua kuin mitä keväällä 2005.
Selvä. Kutsutaan sitä sitten vaikka IEEE-double-precision-floating-point-number-jakolaskuksi, niin päästään tästäkin ongelmasta. Eihän se muutenkaan täytä jakolaskun vaatimuksia, kun a/b*b==a ei läheskään aina ole tosi. :)
Jeps. Numeerisen matematiikan kanssa on tosiaan hyvä olla huolellinen. Toisaalta reaalilukujakin on niin paljon, että reaalilukujen IEEE-double-precision-floating-point-number-jakolasku aiheuttaa useampien eri reaalilukujen samastumisen ainakin omalla koneellani, kun mun koneessa on vain äärellisen monta bittiä muistia. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.