Mi lehet a gond ennél a C++ programnál?
Ez a program egy tízes számrendszerből kettesbe váltó program. Valamiért csak azokat a számokat kódolja helyesen, amelyek 2 hatványai. A kód:
#include<iostream>
#include<vector>
using namespace std;
int main(int argc,char* argv[])
{
vector<int> intVec;
intVec.reserve(10);
cout<<"Please enter a positive, integer, decimal number!\t";
int decnum;
cin>>decnum;
while(decnum!=0) //Ha decnum nem 0
{
if(decnum%2==0) //Ha a kettes maradék 0
{
intVec.insert(intVec.begin(),0); //0 beszúrása az elejére
decnum/=2; //Osztjuk 2-vel
}
else if(decnum%2==1) //Ha a kettes maradék 1
{
intVec.insert(intVec.begin(),1); //1 beszúrása az elejére
decnum=decnum/2-0.5; //Osztjuk kettővel és kivonunk 0.5-öt(mert így lesz egész)
}
else cerr<<"Unexpected error!"; //Ez nem történhet meg
}
//Kiírjuk a vector tartalmát
for(vector<int>::iterator it=intVec.begin();it!=intVec.end();++it)
{cout<<*it;}
cin.ignore();
getchar();
return 0;
}
És az a probléma, ha nem 2 hatványát adom meg inputnak, akkor teljesen hibás bináris számot ír ki. Tisztában vagyok vele, hogy van olyan kifejezés ahol int-->double konverzió van, erre a fordító is figyelmeztetett, de a % (maradékképzés) operátor nem értelmezett double típusra. Gondolom, valahol a konverzió során történhet gond, tehát próbálkoztam reinterpret_cast<double>(decnum) konverzióval, de a fordító hibaüzenetet dobott, valami olyasmit hogy intről double-re nem lehetséges konvertálni. Jól gondolom-e, hogy a konverzió a ludas a hibáért? Ha igen, hogyan oldhatom meg a problémát? Ha nem, mi más lehet a probléma és hogyan oldjam meg?
(Kezdő vagyok és kb. 1,5 éve foglalkozok programozással, C++ -szal pedig kb. fél éve. Korábban Pascal-t tanultam. 14 éves vagyok és programozó szeretnék lenni.)
A segítségért előre is köszi!
"decnum=decnum/2-0.5; //Osztjuk kettővel és kivonunk 0.5-öt(mert így lesz egész) "
Ez teljesen hülyeség és fölösleges.
Mivel inteknél egészosztás történik, ezért amikor kettővel leosztasz semmiképpen nem marad 0.5 a végén, hanem egyszerűen lecsapja a végét, tehát 5/2=2 és nem 2.5.
Ez a kivonás zavar be egészen biztosan.
Igen a C++-nak megvan az a hülyesége, hogy rengeteg dolgot megtehetsz büntetlenül, ilyen ez is, vagy például a tömbök túlindexelése, aztán csak kamillázik az ember, amikor valami nem jó, ezekre nehéz lehet rájönni.
Egyébként elég szép kód, igényes munka.
Ez nem a C++ _hülyesége_, ez az előnye. Miért használnál C++-t a nehézkes szintaxissal, ha nem akarnád ezeket a hatékonysági dolgokat? Amúgy tisztességes ember nem indexeli túl a tömböket, mert tudja, hogy mekkora a tömb (eleve, nem használ tömböket sem). Kezdő persze tud vele szívni, ezért is nem szeretem, ha kezdő egyből elkezd C++-ozni. Nehéz nyelv.
Laci: az exceptionök az ÉSZREVETT hibák hibakezelésének emberibbé tételében segítenek. Semmit nem adnak hozzá az ilyen túlindexelés, túlírás, nullpointer dereferálás és hasonlók kezeléséhez. Persze ha normálisan programozol, nem is találkozol tömbbel, pointerrel.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!