Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Annetun arvon todentaminen

Sivun loppuun

mastis [28.02.2005 11:00:23]

#

Hei.

Tälläinen oisi ongelma:

cout << "Anna pippelin pituus: ";
cin >> Pituus, '\n';

Jos käyttäjä antaa vastaukseksi esim. 15cm, niin ohjelma kaatuu. Eli miten varmistan että käyttäjä on antanut double arvoisen vastauksen, ja jos ei ole antanu niin tulostan virheilmoituksen ja kysyn uudestaan ?

Aruviel [28.02.2005 11:23:32]

#

Lue syöte merkkijonoon. Tee sille tarvittavat tarkistukset ja lopulta muuta sen sisältö haluamaasi muotoon. Käytä string-luokkaa hyväksesi, helpottaa kummasti.

mastis [28.02.2005 11:32:40]

#

no joo nyt se ei enään kaatuile kun pistin noi stringiksi, mutta ei kyllä ole mitään hajua miten sitten teen tarvittavat tarkistukset ja muutan sisällön.

rndprogy [28.02.2005 11:44:01]

#

Näinhän sen voisi tarkistaa onko siinä muita merkkejä kuin numeroita.

for (a = 0; a < strlen(Pituus); a++)
{
if (Pituus[a] < 48 || pituus[a] > 57) // mennään kysymään uudestaan
}

edit: ja atof:lla voi stringin muuttaa doubleksi

Aruviel [28.02.2005 11:48:59]

#

Käyt jokaisen merkin läpi ja tarkistat, että niissä on vain sallittuja merkkejä. Jos haluat pitää mahdollisena sen, että luku sisältää desimaaleja, joudut hieman enemmän säätämään.

Jokaisella merkillä on jokin kokonaisluku "tunnisteena". ASCII-taulussa 0...9 ovat peräkkäisiä merkkejä. Nollan ASCII-arvo on 48.

Stringistä saat yhden merkin tietoosi näin: merkkijono[indeksi];

Koko string voidaan käydä läpi forin avulla näin:

string merkkijono = "";
cin >> merkkijono;
// Tehdään niin kauan, kunnes i on suurempi kuin
// merkkijonon pituus. Jos kohdataan muu kuin 0-9
// merkki, lopetetaan virheilmoituksen kera.
for(int i = 0; i < merkkijono.size()-1; i++) {
  if(merkkijono[i] < '0' || merkkijono[i] > '9') {
    cout << "Syöttämäsi merkkijono ei ole kelvollinen. Anna uusi.";
    break;
  }
}

Jos merkkijono oli kelvollinen, muunnat sen kokonais-/liukuluvuksi. Tämäkin taas vaatii oman säätämisensä. Jos desimaaliluvut ovat mahdollisia, tarkistat, onko merkkijonosso pilkkua/pistettä. Jos on, lasket monta lukua on pisteen oikealla ja monta pisteen vasemmalla puolella. Tämän jälkeen looppiin ja käytetään kymmenpotenssia hyväksi.

mastis [28.02.2005 12:07:46]

#

Kiitos.

kooderi [12.03.2005 13:08:06]

#

Yksi helppo tapa on käyttää try...catch -blokkia:

std::string sInput;
double dPituus;

cin >> sInput;

try
{
    dPituus = atof(sInput);
}
catch(...)
{
    // virheenkäsittely tänne
}

Eli jos konvertointi atof():llä onnistuu, kaikki hyvin. Jos ei, käsitellään tapaus catch(...):n sisällä.

Voipi olla että muutosrivi pitää olla muotoa:
atof(sInput.c_str());

(ei jaksa sorvata kääntäjää päälle ja testata...)

Mazuli [12.03.2005 20:23:38]

#

yksi tapa olisi lukea syöte merkkijonoon ja kaivaa pituus sieltä sscanf-functiolla esim seuraavasti.

#include <string.h>
//...
int pituus;
char syote[255];
cout << "Anna pippelin pituus:\n";
cin >> syote;
sscanf(syote,"%i",&pituus);
cout << "Pippelin pituus on " << pituus;

Sivun alkuun

Vastaus

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

Tietoa sivustosta