
C++ jak vypnout výpis v semilogaritmickém tvaru
Ahoj,
začínám programovat a rozhodl jsem se otestovat své dosavadní znalosti a naprogramovat kalkulačku odpisů. Logicky mi vše funguje. Možná mi vytknete, že to mám zbytečně složitě, ale dělám to tak, abych tomu sám rozuměl :D
Teď k mému problému. Když mi program vypisuje větší čísla, tak si vypíšou v semilogaritmickém tvaru. Nevím, jak to obejít. Budu rád za každou radu.
Děkuji.
Už mi to jde. Změnil jsem proměnné z "int" na "long long" a použil header "iomanip". Potom jsem změnil "cout" na "stl::cout << std::fixed << std::setprecision(o) <<..." a vše více méně běží podle mých představ.
Díky za rady. :)
podla mna si urobil uplne kraviny, ale ok :)
(Napr. setprecision volaj len raz predtym).
P.S. a citaj si aj warningy, ono to neni len tak convertovat hore dole formaty, tie warningy to pise aby si na to daval pozor.
nevíš, co bych s tím mohl udělat, aby v těch varováních nebyl takový bordel prosím? Programuju teprve asi týden, tak se prosím nediv, že mám možná tak dementní otázky :)
//přikládám svůj kód...
17160
V prvom rade si musis ujasnit ze co chces mat ulozene v jakom formate. Lebo ked pouzijes celociselny (int, long) tak potom napriklad 50/100 = 0. Takze si musis aj ujasnit jake operacie s tym chces robit. Pripadne to mat vsetko v vzdy ulozene v halieroch. A celociselne typy maju pevne hranice (max. cislo). Ale na druhej strane to je vzdy presne.
Ked to chces mat ulozene s plavajucou ciarkou (float, double) tak tam sa robia matematicke operacie aj s desatinnymi miestami (50/100 = 0.5), ale neni to nikdy ulozene uplne presne, cim vyssie cislo tym vacsia odchylka od toho co tam ma byt skutocne ulozene, preto existuje float (mensia presnost) a double (vacsia presnost) a este par dalsich.
Ked si definujes premenne tak by si to mal mat uz ujasnene ze co ma byt co. Nasledne si u funkcii ktore pouzivas sledujes ze jake maju vstupne a vystupne parametre, aby sa ti automaticky nekonvertoval float na int, ptz tam potom z 0.5 vznikne cista 0, apod. Alebo konverzia double na float znizi presnost (napr. ak mas 100miliard a 50 halierov tak to moze z toho urobit 99miliard 999tisic a 30 halierov). Preto tam su tie warningy.
Napr.
OdpisRok01 = (cena * 20) / 100;
vsetko su integery, takze podla mna ked cena bude napr. 2, tak OdpisRok01 bude cista 0. Si si isty ze to je tak spravne?
takže to znamená, že si mám ty proměnné na začátku programu předefinovat na double nebo float? :)
Zavisi od toho ze co tam chces ukladat a v jakej to ma byt presnosti a max.hraniciach. Preto existuje aj jedno aj druhe a rozhodovat sa ma vyvojar podla toho co ON zrovna potrebuje. Ono sa to da zadefinovat aj ako celociselne ale ratat vsetko v halieroch, potom nebudes potrebovat ziadne desatinne cisla nikdy, a ani operacie s nimi. (ale je nutne tie operacie potom robit v spravnom poradi najprv nasobit az potom delit a ne naopak).
Ked si to vsetko zadefinujes ako double, tak to bude vsetko desatinne, ale a)musis si riesit zaokruhlovanie a spravne vypisovanie na obrazovku, a b) pri velmi velkych cislach (triliony apod) to uz nebude presne na haliere.
Ved si ten program otestuj ze co sa stane ked zadas cena = 1, ze kolko bude OdpisRok01
P.S> a celociselne veci ako skupina apod samozrejme ostane ako integer. A mal by si si testovat uzivatelsky vstup, on tam uzivatel moze trebars napisat aj skupinu "bodni sa" :D
(neviem teraz zhlavy co urobi cin ked ma parsovat integer a uzivatel napise string, bud vrati 0 alebo hodi exception, alebo obe veci naraz, je to urcite napisane v referencii k cin, link na nejaku referenciu dal uz wikan vyssie, najdi si tam cin.
Ono jde o to, že by se to mělo vždy každé číslo zaokrouhlovat. Ale asi máš pravdu. Mám tam potom výchylky třeba 1KČ asi v důsledku těch haléřů. Takže když se rozhodnu pro proměnné double nebo float, tak musím upravit výpis na obrazovku a zaohrouhlování. Výpis upravím tak, že použiju printf.
To je to, co jsem zatím jakž takž pobral :)
floaty tam mas pri vypise uz teraz, pretoze tie funcie floor vracaju float. To si tiez mas pozret v referencii ze jaky vstup a vystup berie nejaka funkcia, a citat tie warningy tie ta upozornuju na automaticke konverzie pri ktorych moze nastat problem.
A napr. ked niekde napises cena * 22.25 tak aj vysledok toho nasobenia bude uz float, ptz cislo 22.25 je float. (a desatinne cislo * integer = desatinne cislo)
Naprogramoval si to proste uplne nahodne ptz si od zaciatku nemal jasno co kde mas ulozene v jakom formate. Preto sa ma najprv studovat, az potom nieco programovat. Aby z toho neliezlo ze mam 500eur a kupil som pracku za 300eura a program napise ze mate este v penazenke 250eura :)
takže pokud to chápu správně... pro největší přesnost, tak mám dělat operace s čisly, které msjí stejný datový typ. A jelikož floor vrací float, tak mám vše předefinovat na float. Potom to bude přesně a správně...
Nevím, jestli to chápu správně
Nechapes to vobec.
Jediny absolutne presny zapis v IT je celociselny tvar (int, long, apod). Ale musis vediet jak s nimi robit operacie, aby si dosiahol to co potrebujes. Vsetky operacie s nimi su celociselne, desatinne miesta sa po operacii odseknu.
Vsetky desatinne tvary maju v PC nejaku odchylku. float je najmenej presny, double je presnejsi. Ked chces pouzivat double, a nejaka funkcia vracia float, tak bud tu funkciu nepouzijes ale pouzijes funkciu ktora vracia double (funkcie maju aj viac moznych verzii a automaticky sa pouzije ta podla toho jaky parameter si tam dal, ked das double moze sa pouzit double verzia, to si mas najst k prislusnej funkcii v jej referencii, je to vsetko zdokumentovane a studovat to mas ty, ja tu nebudem opisovat 3 strany z referencie. Link na nejaku referenciu kniznicnych fcii viz wikan.)
Alebo druha moznost je ze si vyratas resp. odhadnes ze ci ta chyba floatu v tvojom pripade je nepodstatna a pouzijes float (zavisi od toho jake velke cisla a jake operacie s tym robis, s tym sa proste musis zaoberat ked chces take veci programovat seriozne. Inac je to len plusminus autobus bastel, jak dnes uz asi vsetko lebo vsetko robi nejaky cinan a ind a ini traktoristi)
.. v tvojom pripade ked si tam chces ratat nejake domace pocty alebo maximalne milion Kcs alebo co, tak vpohode staci aj presnost floatu. Odchykla je tusim na 8.platnej cifre ci tak nejak (tiez to je jasne definovane u toho formatu, staci si dat do google slova float presnost a studovat - to je ta cinnost ktora je nutna pred vyvojom serioznych aplikacii).
jasný. Díky moc a promiň, že mám tak stupidní otázky. Ani jsem z toho nechtěl nějaký seriózní program. Spíš jenom něco na trénování a zlepšení se. Každopádně nastuduju :)
Díky moc :)
Uz len doplnim ze keby si tam pouzil na vsetky tie cisla double (s vynimkou tej skupiny ci co to ma byt celociselne 1-6), tak by tam bolo vsetko v double aj tie fcie potom vracaju double a nemal by si asi ziadne warningy.
Ano, to už jsem udělal včera nebo předevčírem :)
Děkuji moc. Hodně jsi mi pomohl :)