Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Onko luku varmasti luku?

Sivun loppuun

Tehy [08.11.2006 20:05:30]

#

Hei,

Tarkoitus olisi tehdä yksinkertainen ohjelma, jossa käyttäjältä kysytään yksi luku. Homma on muuten hanskassa, mutta miten voin tarkistaa onko syötetty luku varmasti luku eikä esim. kirjain?

tgunner [08.11.2006 20:15:02]

#

Voit käyttää standardikirjastojen valmiita funktioita (ctype.h:sta esim. isalpha), tai sitten vertailemalla syötetyn merkin ASCII-arvoja numeroihin. Hyvä ASCII-taulukko löytyy osoitteesta http://www.lookuptables.com.

Vertailu tapahtuu näin:

/* (int) ei taida olla pakollinen, mutta minä käytän sitä tällaisissa tapauksissa. */
if ((int)c>47&&(int)c<58)
    printf("Se on numero!\n");

Tässä muuttuja c on tietenkin syötteenä annettu merkki.

Metabolix [08.11.2006 20:33:16]

#

Lukuahan siinä kysyttiin eikä yhtä numeroa. (Ja tuohonkin olisi varmempana isdigit-funktio, ettei tarvitsisi itse ASCII-koodeilla tapella.)

if (scanf("%d", &i) == 1) {
    printf("Yksi juttu saatiin luettua: %d\n", i);
} else {
    printf("Ei saatu luettua yhtä juttua, eli se ei sitten ollut luku.\n");
}

tgunner [08.11.2006 20:39:28]

#

Äh juu, hitsit. Luin väärin. Siis LUKU ei numero. :)

Tehy [09.11.2006 14:20:00]

#

Metabolix kirjoitti:

Lukuahan siinä kysyttiin eikä yhtä numeroa. (Ja tuohonkin olisi varmempana isdigit-funktio, ettei tarvitsisi itse ASCII-koodeilla tapella.)

if (scanf("%d", &i) == 1) {
    printf("Yksi juttu saatiin luettua: %d\n", i);
} else {
    printf("Ei saatu luettua yhtä juttua, eli se ei sitten ollut luku.\n");
}

Kiitos! Tämä tuntuu toimivan :) yhden probleeman huomasin: Jos käyttäjä antaa antaa vaikka tälläisen jonon 12aadad, niin ohjelma palauttaa 12. haluaisin, että jos käyttäjän syöttämä jono sisältää pelkkiä lukuja se hyväksytään... Onko ideoita?

tgunner [09.11.2006 15:27:20]

#

No pienellä muokkauksella. Lue koko merkkijono, jos löytyy jotain muita kuin numeroita, kysy uudestaan lukua. Tähän voi myös soveltaa tuota minun vahinko-esimerkkiäni. :)

Metabolix kirjoitti:

Lukuahan siinä kysyttiin eikä yhtä numeroa. (Ja tuohonkin olisi varmempana isdigit-funktio, ettei tarvitsisi itse ASCII-koodeilla tapella.)

Onko ASCII-koodien käsittelemisessä jotain haittaa, jonka perusteella isdigittiä kannattaisi käyttää?

Metabolix [09.11.2006 15:40:52]

#

Esimerkiksi se Blazen joskus muinoin esittämä teoreettinen mahdollisuus, että käyttäjän merkistö ei noudattaisikaan ASCII-koodeja. Sitähän ei missään varsinaisesti taata. :)
Mutta siis,

if (scanf("%d", &i) != 1 || !isspace(fgetc(stdin))) {
    // Ei ollut luku, tai oli luvun perässä muuta kuin väli, enter tms.
}

tgunner [09.11.2006 17:23:25]

#

Eli siitä on haittaa vain, jos ASCII-koodit eivät ole käytössä ? :p
Mites sitten isdigit, isalpha ynm. -funktiot toimivat?

koo [10.11.2006 13:41:54]

#

isdigit, isalpha ja kaverit toimivat muissakin kuin ascii-merkistöissä. Funktiot ottavat käyttäjän lokaaliasetuksenkin huomioon (ks. setlocale), joten homman pitäisi toimia öökkösilläkin. Eri merkistöissä öökköset saattavat vielä olla eri koodeilla, joten siinä meni sitten se ikiomatekemä kooditaulukko. Ja vaikka numeromerkit ovat ei-niin-sattumalta peräkkäin kaikissa merkistöissä, ne ovat eri koodeilla esmes ascii- ja ebcdic-merkistöissä.

tgunner [10.11.2006 14:45:17]

#

Ah, kiva kun kerroit. Nyt olen viisaampi :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta