DU2

Uživatelský avatar
JJ
Matfyz(ák|ačka) level II
Příspěvky: 99
Registrován: 28. 1. 2005 14:03
Typ studia: Informatika Mgr.

DU2

Příspěvek od JJ »

No tak jsem se aktivne pustil do druheho ukolu a celkem brzy sem zjistil, ze jsem asi moc nedaval pozor.

Jak mame prevadet yytext na integery(pripadne na floaty)?

To ze atoi to nema byt mi doslo celkem rychle :) Orezavani bitu chapu, ale pokud mam v char* velke cislo (treba 30 cifer) tak to nemuzu prevest na rozumny int, ktery bych mohl oriznout.
gASK
Admin(ka) level I
Příspěvky: 635
Registrován: 9. 6. 2005 12:33
Typ studia: Informatika Mgr.
Bydliště: Konečně Vinohrady:)
Kontaktovat uživatele:

Příspěvek od gASK »

Pokud se nepletu, tak možností máš víc - nějak inteligentně si to "převádět po částech", použít ten extralong co se psal někdy loni či předloni na OOPčku jako domácí úkol nebo tak něco (jinak řečeno není problém si udělat třídu "nekončeně velkých čísel"), zpracovávat si to přímo v tom stringu (i to se tuším někdy dělalo na cvíkách) nebo použít aspoň ten jejich "longlong" či jak se to jmenuje - je tam předdefinovaná třída tvořená dvěma longama. Určitě je ještě víc přístupů, tohle je jen takový ranní "brainstorming" abych ti pomohl ubírat se správnou cestou... :twisted:
When life gives you crap, make crap golems.
Uživatelský avatar
rastik
Supermatfyz(ák|ačka)
Příspěvky: 661
Registrován: 19. 10. 2005 21:45
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

Příspěvek od rastik »

Ked na to postves atoi zistis, ze robi to orezavanie presne ako treba. Lenze nedostanes to upozornenie. Takze musis urobit to iste co atoi, ale s varovanim. A orezavanie sa da urobit fakticky automaticky, skus do 32-bit int-u vlozit prilis velke cislo a uvidis. Viac uz asi povedat nemozem.
Uživatelský avatar
Dawe
Supermatfyz(ák|ačka)
Příspěvky: 360
Registrován: 12. 10. 2004 12:32
Typ studia: Informatika Mgr.
Bydliště: Doma a nebo na koleji

Příspěvek od Dawe »

Myslím, že stačí otestovat, jestli v tom char* (resp. string) není něco většího než těch 4294967295 (2^32 -1) - (to se provede celkem snadno) a pokud jo, zařvu a pustím na to atoi a vypadne mi to co má ne? Jestli se pletu, tak mě opravte, abych to vymyslel nějak jináč
Uživatelský avatar
rastik
Supermatfyz(ák|ačka)
Příspěvky: 661
Registrován: 19. 10. 2005 21:45
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

Příspěvek od rastik »

Dawe píše:Myslím, že stačí otestovat, jestli v tom char* (resp. string) není něco většího než těch 4294967295 (2^32 -1) - (to se provede celkem snadno) a pokud jo, zařvu a pustím na to atoi a vypadne mi to co má ne? Jestli se pletu, tak mě opravte, abych to vymyslel nějak jináč
Este k tomu musis dorobit spracovanie tych zle zapisanych cisel (napr. 24j).
Uživatelský avatar
JJ
Matfyz(ák|ačka) level II
Příspěvky: 99
Registrován: 28. 1. 2005 14:03
Typ studia: Informatika Mgr.

Příspěvek od JJ »

Podle me by to melo z cisla
4294967296 ( binarne 100000000000000000000000000000000 )
melo udelat 0 (uriznutim vyssich bitu ), ale atoi z toho udela neco jako maxint
Uživatelský avatar
rastik
Supermatfyz(ák|ačka)
Příspěvky: 661
Registrován: 19. 10. 2005 21:45
Typ studia: Informatika Mgr.
Bydliště: Praha
Kontaktovat uživatele:

Příspěvek od rastik »

JJ píše:Podle me by to melo z cisla
4294967296 ( binarne 100000000000000000000000000000000 )
melo udelat 0 (uriznutim vyssich bitu ), ale atoi z toho udela neco jako maxint
Aha, mas pravdu, atoi to oreze zle. Ked som to skusal na zaciatku, tak som mal dojem ze to fungovalo. Ta moja veta s tym orezavani ale plati, vysledok je potom:

Kód: Vybrat vše

Warning (line 10): Integer number '4294967296' is out of range, will be truncated
10: unsigned integer [0]
Uživatelský avatar
Dawe
Supermatfyz(ák|ačka)
Příspěvky: 360
Registrován: 12. 10. 2004 12:32
Typ studia: Informatika Mgr.
Bydliště: Doma a nebo na koleji

Příspěvek od Dawe »

No nevím, mně když do atoi pošlu "4294967296" tak mi vrátí 0

Ale spíš sem se chtěl zeptat jak je to s tím že se to v tý interpretaci ukládá do vektoru intů ač je to unsigned int, potom z toho vyleze jiný číslo než dotoho vlezlo. Resp. vše co je do 2^31 - 1 je OK a pak to dělá bordel...
Výsledný soubor pak neodpovídá zadanýmu...
Uživatelský avatar
Tuetschek
Supermatfyz(ák|ačka)
Příspěvky: 657
Registrován: 15. 6. 2005 13:54
Typ studia: Nestuduji ale učím na MFF
Kontaktovat uživatele:

Příspěvek od Tuetschek »

Mas to truncateovat na 31 bitu, takze co je vetsi tak ma proste pretyct.
Plug 'n' Pray.
Uživatelský avatar
Dawe
Supermatfyz(ák|ačka)
Příspěvky: 360
Registrován: 12. 10. 2004 12:32
Typ studia: Informatika Mgr.
Bydliště: Doma a nebo na koleji

Příspěvek od Dawe »

Tak to dík, já myslel že na 32, tak proč mi to nikdo neřek, když jsem tu psal o 32 bitech? :?
Takže abych to nepomotal, co je největší číslo, který tam může projít bez újmy?
Uživatelský avatar
JJ
Matfyz(ák|ačka) level II
Příspěvky: 99
Registrován: 28. 1. 2005 14:03
Typ studia: Informatika Mgr.

Příspěvek od JJ »

Dawe píše:No nevím, mně když do atoi pošlu "4294967296" tak mi vrátí 0
Mas nejaky chytry atoi me to na win i na linuxu dava 2147483647 :(
Dawe píše: Ale spíš sem se chtěl zeptat jak je to s tím že se to v tý interpretaci ukládá do vektoru intů ač je to unsigned int, potom z toho vyleze jiný číslo než dotoho vlezlo. Resp. vše co je do 2^31 - 1 je OK a pak to dělá bordel...
Výsledný soubor pak neodpovídá zadanýmu...
No tebe zajimaji cisla jen do 2^31-1. Vetsi uz jsou 32-bitovy
Uživatelský avatar
JJ
Matfyz(ák|ačka) level II
Příspěvky: 99
Registrován: 28. 1. 2005 14:03
Typ studia: Informatika Mgr.

Příspěvek od JJ »

Safra pozde :)

Nejvetsi cislo je 2147483647
Uživatelský avatar
Dawe
Supermatfyz(ák|ačka)
Příspěvky: 360
Registrován: 12. 10. 2004 12:32
Typ studia: Informatika Mgr.
Bydliště: Doma a nebo na koleji

Příspěvek od Dawe »

OK, diky moc, takže sem se do toho jen trochu zamotal...
No určitě ještě za chvíli s něčím přijdu :-)
Uživatelský avatar
Dawe
Supermatfyz(ák|ačka)
Příspěvky: 360
Registrován: 12. 10. 2004 12:32
Typ studia: Informatika Mgr.
Bydliště: Doma a nebo na koleji

Příspěvek od Dawe »

Hmm tak jsem koukal na definici atoi()
Return Value.
The converted integer value of the input string.
On overflow the result is undefined.
If an error occurs 0 is returned.
V Dev-C++ mi to hezky fungovalo a jak jsem to dal do VS tak to začlo "blbnout". Dev vrací spodní bity, kdežto VS dá jak už tu bylo napsáno "maxint". Takže to chce zvolit jinej přístup ...
Uživatelský avatar
darkness
Matfyz(ák|ačka) level II
Příspěvky: 70
Registrován: 15. 1. 2005 13:24
Typ studia: Informatika Mgr.
Bydliště: pod mostem (Nuselskym)
Kontaktovat uživatele:

Příspěvek od darkness »

tak mi doslo, ze ja to cislo sice spravne oriznu, ale nehlasim tu chybu :-)
jak se vlastne hlasi chyby? tam je na to urcite nejaka funkce, ze?
Odpovědět

Zpět na „2006“