Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: switch case

Sivun loppuun

kuutso [27.10.2009 18:29:30]

#

#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

Macro [27.10.2009 18:33:30]

#

Lisää sinne vaikka system("PAUSE > NUL"); Voit myös laittaa Sleep(millisekunnit); (vaatii windows.h) jonka jälkeen se sulkeutuu.

kuutso [27.10.2009 18:37:27]

#

Nyt siin ei vaan tulosta sitä yhteenlaskua ku painan 1.

Metabolix [27.10.2009 18:39:01]

#

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.

Macro [27.10.2009 18:51:22]

#

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

Jaska [27.10.2009 18:53:09]

#

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.

kuutso [27.10.2009 18:56:44]

#

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

Jaska [27.10.2009 19:03:46]

#

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.

Teuro [27.10.2009 19:05:22]

#

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

Jaska [27.10.2009 19:11:55]

#

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.

Metabolix [27.10.2009 20:17:07]

#

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

Jaska [27.10.2009 20:41:11]

#

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

Metabolix [27.10.2009 20:43:33]

#

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 (+-*/).

Jaska [27.10.2009 21:04:41]

#

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.

Metabolix [27.10.2009 21:19:44]

#

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. :)

Jaska [27.10.2009 21:32:53]

#

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. :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta