Kezdőoldal » Számítástechnika » Programozás » Mi lehet a gond ennél a C++...

Mi lehet a gond ennél a C++ programnál?

Figyelt kérdés

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!



2013. jan. 8. 18:28
 1/9 anonim ***** válasza:

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

2013. jan. 8. 18:34
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:
Köszi a választ, ezt eddig nem tudtam az intekről :) Mondom hogy kezdő vagyok. Pascal-ban rögtön leállt volna a program ha nem gondoskodok róla hogy ami egész az tényleg egész legyen. Ott külön függvény van csonkolásra. Jó lenne már elszakadnom a Pascal-tól.
2013. jan. 8. 18:38
 3/9 anonim ***** válasza:
Így van, ki is próbáltam, anélkül jó.
2013. jan. 8. 18:38
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
Figyelj, ha egy kicsit tudsz várni akkor megírom ide neked a pascal programot, én abba tanulok, ha nem baj, azt meg sztem már áttudod írni, mivel ismered a szintaxisát.
2013. jan. 8. 18:38
Hasznos számodra ez a válasz?
 5/9 A kérdező kommentje:
Átírtam a megfelelő sort és jól működik :) Köszi!
2013. jan. 8. 18:39
 6/9 anonim ***** válasza:

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.

2013. jan. 8. 18:40
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:
Azért vannak az exception-ök, hogy intelligensebben tudjuk kezelni a hibákat, és ne csak bumm, megálljon a program és vége a világnak. És azért lehet sok mindent megtenni, mert vannak exception-ök, amikkel kezelhetők. :)
2013. jan. 8. 20:35
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:
És ez hogy a rákba jön ide?
2013. jan. 8. 20:42
Hasznos számodra ez a válasz?
 9/9 iostream ***** válasza:

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.

2013. jan. 8. 23:18
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!