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

Zaokrouhlení double – C / C++ – Fórum – Programujte.comZaokrouhlení double – C / C++ – Fórum – Programujte.com

 

vollf820
Stálý člen
30. 7. 2007   #1
-
0
-

zdar lidi,

mam zas takovej přihlouplej problém a tak se s důvěrou obracím na vás :)

Je to prostý, mam následující kód:

Soubor 1:



#ifndef _STONEWT_H_
#define _STONEWT_H_
class Stonewt
{
private:
enum {Lbs_per_stn = 14};
int stone;
double pds_left;
double pounds;

public:
operator double();
Stonewt(double lbs);
Stonewt(int stn, double lbs, char mode = 'L');
Stonewt();
~Stonewt();
friend ostream & operator<<(ostream & os, const Stonewt & p);
void show_lbs() const;
void show_stn() const;
};
#endif

Soubor 2:
#include <iostream>

using namespace std;
#include "stonewt.h"

Stonewt::operator double()
{
return pounds;
}

Stonewt::Stonewt(int stn, double lbs, char mode)
{
stone = stn;
pds_left = lbs;
if(mode=='L')
{
pounds = stn * Lbs_per_stn + lbs;
}
else if(mode=='S')
{
pounds = stn + (lbs / Lbs_per_stn);
}
else if(mode=='P')
{
double pounds = (stn * Lbs_per_stn + lbs);

}
}

Stonewt::Stonewt()
{
stone = 0;
pounds = pds_left = 0;
}

Stonewt::~Stonewt()
{
}
ostream & operator<<(ostream & os, const Stonewt & p)
{
os << p.pounds;
}


Soubor 3:

#include <iostream>

#include <iomanip>
using namespace std;
#include "stonewt.h"

int main()
{
Stonewt taft(21, 8, 'L');
Stonewt wolfe(25, 9, 'S');
Stonewt pavarotti(30, 8, 'P');

cout<<"Vaha v librach zaokrouhlenych na cela cisla: ";
cout<<taft;
cout<<"\nVaha v stones: ";
cout<<wolfe;
cout<<"\nVaha v librach s desetinnou carkou: ";
cout<<pavarotti;

cin.get();
return 0;
}


Na a ja jen chci, aby to cout<<pavarotti; vypsalo to číslo třeba se 4 desetinejma místama, ale ono to píše v tom zkurvenym tvaru s exponenciálama - 7.33061e+268. Když ten poslední řádek upravím takto:

cout.setf(ios::fixed, ios::floatfield);

cout<<setprecision(4)<<pavarotti;


Tak to bohužel nefunguje, compilátor neháže žádnou chybu, ale program pak spadne :(
Jo, samozřejme tam mam i #include <iomanip> když sem tam dal to setprecision(4).

Díky moc za pomoc ;)

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
30. 7. 2007   #2
-
0
-

std::cout.precision(4);

std::cout<<std::fixed<<pavarotti;


btw:


ostream & operator<<(ostream & os, const Stonewt & p)
{
os << p.pounds;
return os;
}

Nahlásit jako SPAM
IP: ...–
vollf820
Stálý člen
31. 7. 2007   #3
-
0
-

Díky, ale bohužel nefunguje. Pořád to padá, jakmile to dojede k tomu řádku na vypsání pavarottiho. Mam to přesně jak jsi napsal, zkoušel jsem to i bez toho std:: (protože tam je usingnamespace std; ... ne ? ) a doplnil jsem to return os; ale ani to nepomohlo.

Ach jo to je zas zádrhel, asi na to kašlem a necham tam exponenciál :) Nebude to tím, že to cout vypisuje objekt? Třeba u toho to setprecision nefunguje. Nebo se musí nějak začlenit do přetížení operátoru << ?

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
31. 7. 2007   #4
-
0
-

V tom případě máš chybu někde jinde, potože jestli to vypíše taft a wolf správně, tak musí být někde jinde.



Stonewt::Stonewt(int stn, double lbs, char mode)
{
stone = stn;
pds_left = lbs;
if(mode=='L')
{
pounds = stn * Lbs_per_stn + lbs;
}
else if(mode=='S')
{
pounds = stn + (lbs / Lbs_per_stn);
}
else if(mode=='P')
{
double pounds = (stn * Lbs_per_stn + lbs); to double tam nemá, co dělat, protože vytváříšnovou lokální proměnnou pounds a ta nema nic spolecneho s this->pounds

}
}

Ale div9m se, 6e ten sajrajt co je v pounds shodil streamy.

Nahlásit jako SPAM
IP: ...–
vollf820
Stálý člen
31. 7. 2007   #5
-
0
-

Jakej sajrajt máš na mysli? :)

Díky už to šlape, chyba byla v tom double pounds.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
31. 7. 2007   #6
-
0
-

No, ona ta proměnná pounds nebyla nijak inicializována v případě, že se vytvářele instance s příslušnými parametry. Takže v ní byla nějaká náhodná hodnota, proto se mají ty proměnné v konstruktoru inicializovat. Takže příště můžeš dšělat něco jako:



Stonewt::Stonewt(int stn, double lbs, char mode)
:stone(stn),pds_left(lbs), pounds(0)
{
mode = ::toupper(mode);
if(mode=='L')
{
pounds = stn * Lbs_per_stn + lbs;
}
else if(mode=='S')
{
pounds = stn + (lbs / Lbs_per_stn);
}
else if(mode=='P')
{
pounds = (stn * Lbs_per_stn + lbs);
}
}

Nahlásit jako SPAM
IP: ...–
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, 34 hostů

Podobná vlákna

Zaokrouhlení double — založil Redby

Zaokrouhlení — založil Standa

Zaokrouhlení na stovky — založil FeXxy

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ý