Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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.

//přikládám screen kódu a výsledku :D
2htC
Rphu

Předmět Autor Datum
Co tohle? fixed A příště sem dávej přímo kód. Screenshot VS je celkem k ničemu.
Wikan 14.06.2016 17:24
Wikan
Lebo pouzivas debilny cout a myslis si ze to vsetko sa nejak samo kdesi cosi. Skonvertuj si to na st…
MM.. 14.06.2016 17:29
MM..
.. resp. najdi si na to objektove fcie v tych C++ knizniciach, ne printf. Alebo to co pisal Wikan al…
MM.. 14.06.2016 17:34
MM..
Alebo skus to skonvertovat na integer, to by mohol cout aj v defaulte vypisat potom normalne (neviem…
MM.. 14.06.2016 17:39
MM..
Díky všem. vyzkouším a uvidím :)
David Rubý 14.06.2016 19:48
David Rubý
Už mi to jde. Změnil jsem proměnné z "int" na "long long" a použil header "iomanip". Potom jsem změn…
David Rubý 14.06.2016 20:47
David Rubý
podla mna si urobil uplne kraviny, ale ok :) (Napr. setprecision volaj len raz predtym). P.S. a ci…
MM.. 14.06.2016 20:50
MM..
nevíš, co bych s tím mohl udělat, aby v těch varováních nebyl takový bordel prosím? Programuju teprv…
David Rubý 15.06.2016 17:45
David Rubý
V prvom rade si musis ujasnit ze co chces mat ulozene v jakom formate. Lebo ked pouzijes celociselny…
MM.. 15.06.2016 18:46
MM..
Napr. OdpisRok01 = (cena * 20) / 100; vsetko su integery, takze podla mna ked cena bude napr. 2, tak…
MM.. 15.06.2016 18:50
MM..
takže to znamená, že si mám ty proměnné na začátku programu předefinovat na double nebo float? :)
David Rubý 15.06.2016 19:04
David Rubý
Zavisi od toho ze co tam chces ukladat a v jakej to ma byt presnosti a max.hraniciach. Preto existuj…
MM.. 15.06.2016 22:14
MM..
Ved si ten program otestuj ze co sa stane ked zadas cena = 1, ze kolko bude OdpisRok01 P.S> a celoc…
MM.. 15.06.2016 22:15
MM..
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ýc…
David Rubý 15.06.2016 22:30
David Rubý
floaty tam mas pri vypise uz teraz, pretoze tie funcie floor vracaju float. To si tiez mas pozret v…
MM.. 15.06.2016 22:57
MM..
A napr. ked niekde napises cena * 22.25 tak aj vysledok toho nasobenia bude uz float, ptz cislo 22.2…
MM.. 15.06.2016 23:00
MM..
takže pokud to chápu správně... pro největší přesnost, tak mám dělat operace s čisly, které msjí ste…
David Rubý 17.06.2016 10:52
David Rubý
Nechapes to vobec.
MM.. 17.06.2016 10:53
MM..
Jediny absolutne presny zapis v IT je celociselny tvar (int, long, apod). Ale musis vediet jak s nim…
MM.. 17.06.2016 10:57
MM..
.. v tvojom pripade ked si tam chces ratat nejake domace pocty alebo maximalne milion Kcs alebo co,…
MM.. 17.06.2016 11:02
MM..
jasný. Díky moc a promiň, že mám tak stupidní otázky. Ani jsem z toho nechtěl nějaký seriózní progra…
David Rubý 17.06.2016 13:44
David Rubý
Uz len doplnim ze keby si tam pouzil na vsetky tie cisla double (s vynimkou tej skupiny ci co to ma…
MM.. 17.06.2016 14:23
MM..
Ano, to už jsem udělal včera nebo předevčírem :) Děkuji moc. Hodně jsi mi pomohl :) poslední
David Rubý 17.06.2016 18:19
David Rubý

Alebo skus to skonvertovat na integer, to by mohol cout aj v defaulte vypisat potom normalne (neviem zhlavy), teraz tam mas typ double (to vracia funkcia floor)
P.S. pozor na hranice integeru, 2miliardy a nejake drobne. Ked treba viac tak potom este existuje 64bit integer.

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

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.

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

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ě

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

Zpět do poradny Odpovědět na původní otázku Nahoru