C++ Pretypovanie

Programovacie jazyky, rady, poradňa...
Berkut
Novice
Novice
Príspevky: 9
Registrovaný: 21 aug 2009, 0:29

C++ Pretypovanie

Príspevok od používateľa Berkut »

Dobrý deň. Dá sa nejako explicitne pretypovať celé číslo na reálne, napr. int na float?
Tento program na počítanie s uhlami mi ako výstup vyhodí celé číslo, napr.

Kód: Vybrať všetko

Najprv stupne: 37
Teraz minuty: 51
A teraz sekundy: 19
37
Problém je, že ako výstup by som chcel mať reálne číslo, v tomto prípade 37.8553, s tým, že všetky premenné chcem mať najprv deklarované ako int a až po zadaní hodnôt skonvertovať na reálne čísla a potom spraviť s nimi výpočty. skúšal som pridať do kódu (na miesto, kde je teraz voľný riadok)

Kód: Vybrať všetko

float (minuty);
ale kompilátor mi to ohlásil ako chybu. Poviete mi niekto prosím prečo a či sa s tým dá niečo robiť?

Kód: Vybrať všetko

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int stupne, minuty, sekundy;
    const int C_minut_do_stupna = 60;
    const int C_sekund_do_minuty = 60;
    cout<<"Najprv stupne: ";
    cin>>stupne;
    cout<<"Teraz minuty: ";
    cin>>minuty;
    cout<<"A teraz sekundy: ";
    cin>>sekundy;  

     minuty= minuty + sekundy / C_sekund_do_minuty ;
     stupne =stupne + minuty / C_minut_do_stupna ;
     cout<<stupne<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
V programovaní som len začiatočník a hlavne v C++ ktorému sa venujem len mesiac. Za odpovede vopred ďakujem
miki690
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1255
Registrovaný: 07 okt 2005, 22:07
Bydlisko: KE
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa miki690 »

trochu o pretypovaní, snáď pomôže
http://en.wikipedia.org/wiki/Type_conversion
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa audiotrack »

float nie je funkcia, keď tak už (float)minuty. Lepšie je ale používať static_cast, interpreter_cast a dynamic_cast z linku ktorý bol uvedený nadomnou (nečítal som to, ale dúfam že tam sú popísané rozdiely. Ak nie, tak sa spýtaj). A ešte radšej by si mal rovno deklarovať float ako float keď vieš že neskôr ho ako float budeš potrebovať a predchádzať pretypovaniu, lebo v závislosti od architektúry môžu byť malé zmeny vo vnútornej štruktúre premenných a narobí ti to galibu (neskôr, keď budeš robiť väčšie programy a naučíš sa zlým zvykom)
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa johny3212 »

nevidim tam problem

Kód: Vybrať všetko

#include <iostream>
using namespace std;

int main() {
	int stupne, minuty, sekundy;
	double dStupne, dMinuty, dSekundy, vysledok;
	    const double C_minut_do_stupna = 60.0;
	    const double C_sekund_do_minuty = 60.0;
	    cout<<"Najprv stupne: ";
	    cin>>stupne;
	    cout<<"Teraz minuty: ";
	    cin>>minuty;
	    cout<<"A teraz sekundy: ";
	    cin>>sekundy;

	    dStupne = (double) stupne;
	    dMinuty = (double )minuty;
	    dSekundy = (double) sekundy;

	     dMinuty= dMinuty + dSekundy / C_sekund_do_minuty ;
	     vysledok = dStupne + dMinuty / C_minut_do_stupna ;

	     cout<<vysledok<<endl;

	return 0;
}
ale namiesto pretipovania tak daj rovno double. Dalej odporucam racej pouzivat double ako float
Berkut
Novice
Novice
Príspevky: 9
Registrovaný: 21 aug 2009, 0:29

Re: C++ Pretypovanie

Príspevok od používateľa Berkut »

No práve to pretypovanie na tomto programe nacvičujem. Kód som upravil s tými operátormi, čo spomínal audiotrack, ale výstup je stále 37.

Kód: Vybrať všetko

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int stupne, minuty, sekundy;
    const int C_minut_do_stupna = 60;
    const int C_sekund_do_minuty = 60;
    cout<<"Najprv stupne: ";
    cin>>stupne;
    cout<<"Teraz minuty: ";
    cin>>minuty;
    cout<<"A teraz sekundy: ";
    cin>>sekundy;
    static_cast<double>(C_minut_do_stupna);
    static_cast<double>(C_sekund_do_minuty);
    static_cast<double>(minuty);
    static_cast<double>(stupne);
    static_cast<double>(sekundy);
    minuty= minuty + sekundy / C_sekund_do_minuty ;
     stupne =stupne + minuty / C_minut_do_stupna ;
     cout<<stupne<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa johny3212 »

a ten co som ti tam dal ja, si neskusal?, tam som ti spravil vystup desatinne cislo ako si chcel, tak ho skus. to je prva varianta.
Druha varianta je pouzit aj vstupy ako desatiine miesta. To co ti dal audiotrack nerob, ked robis v c++ iba mesiac a mas este vela problemov so zakladnou strukturov.
miki690
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1255
Registrovaný: 07 okt 2005, 22:07
Bydlisko: KE
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa miki690 »

operator ktory si pouzil funguje, ale musis to niekam priradit ... napr dminuty=static_cast<double>(minuty); a potom s tym pracovat, lebo na koniec si pracoval aj tak s typom int
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa johny3212 »

mno ved keby mal dobre ID, tak mu tam vypise upozornenie, ze to nema efekt :).
miki690
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1255
Registrovaný: 07 okt 2005, 22:07
Bydlisko: KE
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa miki690 »

môže a nemusí ... to už je vec prekladača...
juho
Star
Star
Používateľov profilový obrázok
Príspevky: 551
Registrovaný: 11 máj 2007, 21:16

Re: C++ Pretypovanie

Príspevok od používateľa juho »

to static_cast<double>(stupne); z tade vyhod radsej
sice neviem co mas za kompilator ci ti nebude praskat ze honota typu const sa neda pretuypovat ale tak:
stupne =stupne + minuty / (float alebo double je to podla teba co das inak tato premenna je typu int tak ti to robi defaultne celociselne deledie a prechadzas z pascalu tak "div")C_minut_do_stupna ;
Berkut
Novice
Novice
Príspevky: 9
Registrovaný: 21 aug 2009, 0:29

Re: C++ Pretypovanie

Príspevok od používateľa Berkut »

Teda ak tomu správne rozumiem, keď je nejaká premenná už raz celočíselná, tak z nej desatinnú už nijako nespravím. Jediné čo sa s tým dá robiť je vytvoriť si ešte jednu, reálnu premennú a do nej priradiť hodnotu tej celočíselnej. Je tak?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa audiotrack »

nie je tak
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++ Pretypovanie

Príspevok od používateľa johny3212 »

Berkut, ja stale nechapem o co ti ide?, padli ti tu asi tri navrhy a ukazky a stale nechapes?, ja potom nechapem teba. Ty chces pretypovat deklarovanu premennu? Mno so zakladnymi premennymi to nepojde, uvedom si vec, ze napretypujes premennu ale jej hodnotu, ktoru vytiahnes pri danej operacii.

takze toto je blbost, chapes uz preco?

Kód: Vybrať všetko

int main() {
	int stupne, minuty;
	    cout<<"Najprv stupne: ";
	    cin>>stupne;
	    cout<<"Teraz minuty: ";
	    cin>>minuty;
	    stupne = (double)stupne / (double) minuty;

	     cout<<stupne<<endl;
	return 0;
}
tak pouzi to, co sme ti davali uz viaceri.

najlepsie riesenie bude toto:

Kód: Vybrať všetko

int main() {
	double stupne, minuty;
	    cout<<"Najprv stupne: ";
	    cin>>stupne;
	    cout<<"Teraz minuty: ";
	    cin>>minuty;
	    stupne = stupne / minuty;

	     cout<<stupne<<endl;
	return 0;
}
Berkut
Novice
Novice
Príspevky: 9
Registrovaný: 21 aug 2009, 0:29

Re: C++ Pretypovanie

Príspevok od používateľa Berkut »

Uhádol si, čo som chcel. Takže teraz už chápem.

A ďakujem všetkým za odpovede.
Napísať odpoveď