Prosím o pomoc při hledání řešení.
Problém: Uživatel zadá do programu číslo. To se ukládá do promněnné typu INT. Jak ošetřit, aby program vyhodnotil, že uživatel zadal zlomen (př.: 2,25).
Děkuji.
Fórum › C / C++
Ošetření vstupu.
No tak ako zapisat vstup do premennej hadam hovorit nemusim. Dalej kedze sa nejedna o cela cisla musis vstup ukladat do premennej typu 'double'. A ako zistit ci sa jedna o desatine cislo? Co tak vstup zaokruhlit nadol, toto cislo ulozit do jednej premennej potom k nemu pripocitat 1 a ulozit do druhej a jednoduchov podmienkov porovnat.
nejelegantneji lze dle me zjistit celociselnost takto: (des + MC > long(des) && des - MC < long(des)), kde MC je nejake hodne male cislo (napriklad konstanta DBL_EPSILON z float.h nasobena treba 100krat, optimalne odzkouset). testovat rovnost double a long je kvuli zaokrouhlovaci chybe hloupost.
To jisla : co se tyce bitoveho testovani, pak si myslim ze je to docela slozite. pokud se nemylim tak racionalni cisla (pocitac realna tak uplne nezvlada, vzhledem k tomu ze ne vsechna realna maji celociselny rozvoj) jsou reprezentovana ve tvaru s*m*b**e, kde s je znamenko, m mantisa, b baze (=2) a e exponent, takze musis zjistit zdali je pocet nul na konci mantisy neostre vetsi nez exponent*(-1), coz bych asi delal kupou bitovych soucinu, takze klasicke porovnani je jednodussi...
tak som si odskusal tri metody ako zistit ci je cislo cele alebo nie. kod:
#include <iostream>
#include <cmath>
#include <cfloat>
using namespace std;
int main() {
double vstup = 0, desatinnaCast = 0, celaCast = 0;
cout << "Zadaj cislo: ";
cin >> vstup;
cout << endl << endl;
desatinnaCast = modf(vstup, &celaCast);
if(desatinnaCast != 0) {
cout << "Cislo je desatinne! ... 1. test" << endl;
}
else {
cout << "Cislo nieje desatinne! ... 1. test" << endl;
}
if(floor(vstup) < vstup && floor(vstup)+1 > vstup) {
cout << "Cislo je desatinne! ... 2. test" << endl;
}
else {
cout << "Cislo nieje desatinne! ... 2. test" << endl;
}
double compare = DBL_EPSILON * 100;
if(!(vstup + compare > long(vstup) && vstup - compare < long(vstup))) {
cout << "Cislo je desatinne! ... 3. test" << endl;
}
else {
cout << "Cislo nieje desatinne! ... 3. test" << endl;
}
return 0;
}
vyzera to tak ze prve 2 metody funguju takmer stale (az na vstup ako napr. x.9999999999999999999999) ale tretia nejak nefunguje pri velkych celych cislach. mozno som zle pocopil to co tmi napisal tak mozno keby mohol najst chybu v 3. podmienko bol by som rad :).
To Wizard : podminku tam mas spravne (tedy pokud ji nemam spatne ja), problem bych asi videl v tom ze davas na vstup cisla vetsi nez long (takze misto long typuj na long long) nebo se pricteni compare k velkemu cislu se neprojevi, tedy pricita se k tem radum ktere uz si ono cislo nepamatuje - a v takovou chvili podminka celkem logicky zklame - tedy ta konstanta compare je asi prilis mala (na druhou stranu bude-li prilis velka, muze se ti stat ze chybne urci desetinne cislo jako celociselne); pripadne muzes tu nerovnost jeste udelat neostrou - ale to postihne jen pripady kdyz to cele cislo bude i v pameti vystupovat jako cele (coz zpravidla nastava jen pri cteni vstupu)
docela se divim ze ti prvni metoda chodila bez problemu, asi to bude tim ze cislo jen nacitas a nijak s nim nepocitas. test rovnosti (popr. nerovnosti) cisla realneho a celeho skoro nikdy nevyjde dobre, protoze i kdyz ti z nejake operace vyjde 2, pocitac si ji ulozi nepresnosti vypoctu jako 2.0000000000000001 nebo tak neco. proto se pouziva nejaka mala konstanta a netestuje se rovnost, ale prislusnost do intervalu.
tva druha metoda funguje vpodstate stejne: vzhledem k tomu ze floor(x)+1 je vzdy vetsi nez x (mozna pro zaporna ne, nevim...), tak se testuje jen x>floor(x) - coz ovsem nastava i tehdy, kdyz se ti v nejakem nevyznamnem radu obevi malinkate cislo, takze cele cislo muze byt mylne prohlaseno jako desetinne - floor(x) udela v podstate to same co long(x) (az na rozsah), takze i tady by bylo lepsi pricist si tam tu malou konstantu.
zkus treba zadavat suda cisla a pred testem je vydel dvojkou.
ale pokud ti nejde o to testovat vysledky operaci ale jen cisla na vstupu, mozna bude lepsi to kontrolovat podle formatu vstupu: tedy nactes cele cislo jako retezec a zkontrolujes jestli je v nem desetinna tecka:)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Ošetření vstupů — založil vollf82
Ošetření vstupu — založil Caken
Ošetření vstupu — založil Troy585
Ošetření vstupu — založil Erlesh
Osetreni vstupu — založil Prometheus
Moderátoři diskuze