Ošetření vstupu. – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ošetření vstupu. – C / C++ – Fórum – Programujte.comOšetření vstupu. – C / C++ – Fórum – Programujte.com

 

jisla
~ Anonymní uživatel
23 příspěvků
26. 9. 2008   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 195.39.96.–
Wizard0
Stálý člen
26. 9. 2008   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 85.216.182.–
jisla
~ Anonymní uživatel
23 příspěvků
26. 9. 2008   #3
-
0
-

Děkuji, Jednoduché a pochopitelné.
Já už myslel, že budu muset testovat poslední Bit realného čísla (třeba double), jestli je nulový.
Bylo by to také řešení?

Jisla

Nahlásit jako SPAM
IP: 195.39.96.–
tmi0
Věrný člen
26. 9. 2008   #4
-
0
-

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

Nahlásit jako SPAM
IP: 213.226.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Wizard0
Stálý člen
27. 9. 2008   #5
-
0
-

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

Nahlásit jako SPAM
IP: 85.216.182.–
tmi0
Věrný člen
27. 9. 2008   #6
-
0
-

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

Nahlásit jako SPAM
IP: 213.226.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 86 hostů

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý