Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C++ binary => decimal


Friedman

Öne çıkan mesajlar

3 - 5 exercise dan sonra beynim sulandı çözemedim bi türlü hatayı . zaten dandiri bi şekilde yazdım kodları iyice karıştı aklım =/ . iyi güzel compile oluyo inputu alıyo ama sonra float point exception çekiyo. Nerde neyi yanlış yapıyorum

kod


#include <iostream>
using std::cout;
using std::cin;
using std::endl;

void convertBinary(int);
int pow(int, int);

int main() {

int num;

cout << "Gimme a binary integer : n";
cin >> num;

convertBinary(num);
}

void convertBinary(int num) {


int degrees[30];
int total = 0;

for(int i = 0; i < 30; i++) {

degrees[i] = num % pow(10,i + 1);
}

for(int j = 0; j < 30; j++) {

total += degrees[j];
}

cout << "The decimal value is : t" << total << endl;
}

int pow(int base,int exp) {

for(int i = 0; i < exp; i++) {

base *= base;
}
return base;
}



degrees[i] deki [i] görünmüyo site mi bozuldu yoksa . aha bu yazıdada görünmüyo dikdörtgen parantez aç "i" dikdörtgen parantez kapa
Link to comment
Sosyal ağlarda paylaş

biraz düzenledim zaten yarım yapmışım orda sorunu bulcam diye .
gene köşeli parantez arası i görünmüyo ama loopun içindeki degrees de var

kod


#include <iostream>
using std::cout;
using std::cin;
using std::endl;

void convertBinary(int);
int pow(int, int);

int main() {

int num;

cout << "Gimme a binary integer : n";
cin >> num;

convertBinary(num);
}

void convertBinary(int num) {


int degrees[30];
int total = 0;

for(int i = 0; i < 30; i++) {

degrees[i] = (num % pow(10,i + 1)) * pow(2,i) ;
}

for(int j = 0; j < 30; j++) {

total += degrees[j];
}

cout << "The decimal value is : t" << total << endl;
}

int pow(int base,int exp) {

if(exp == 0) {

return 1;

}

for(int i = 0; i < exp; i++) {

base *= base;
}
return base;
}


Link to comment
Sosyal ağlarda paylaş

Öncelikle o 10'un katlarına göre modunu alıyosun ama her işlem bitişinde o sayıdan bi önceki modu çıkarman lazım sanırım. Çünkü 101'in 10'a göre modu da 1, 100'e göre modu da 1. Küçükten giderken sayıları çıkarırsan düzgün çalışır mantık olarak.

Aldığın floating point hatası da sanırım int'in sınırına dayanmış olmandan olabilir, 10*30 sayısını alabilirmi bi int bilmiyorum, double falan dene istersen.
Link to comment
Sosyal ağlarda paylaş

5 yaptım şu an linuxte değilim ondan visual c++ da compile ettim konsol göçüyo her defasında . Heralde aynı problem. Şu kodda benim gözlemlediğim hiçbir problem yok alalala


#include
using std::cout;
using std::cin;
using std::endl;

void convertBinary(int);
int pow(int, int);

int main() {

int num;

cout << "Gimme a binary integer : n";
cin >> num;

convertBinary(num);
}

void convertBinary(int num) {


int degrees[5];
int total = 0;

for(int i = 0; i < 5; i++) {

degrees[i] = (num % pow(10,i + 1)) * pow(2,i) ;
}

for(int j = 0; j < 5; j++) {

total += degrees[j];
}

cout << "The decimal value is : t" << total << endl;
}

int pow(int base,int exp) {

if(exp == 0) {

return 1;

}

for(int i = 0; i < exp; i++) {

base *= base;
}
return base;
}
Link to comment
Sosyal ağlarda paylaş

Sayıyı çok küçük verdiğinde bile hata çıkıyomu? Mesela düz 1 versen noluyo? Eğer hala hata veriyosa her seferinde i'yi print ettir, sonra kaçıncı sayıda floating point hatası verdiğine bak. Öyle de bulamazsan intlerin hepsini double yap.

Son olarak da bu sorunu çözsen bile kodun hatalı sanırım. Her mod bulduktan sonra, sonucu asıl sayıdan çıkarmalısın.
Link to comment
Sosyal ağlarda paylaş

Bak örneği bi daha yaziim. 101 saysını çeviriceksin mesela ondalığa sonuç 5 çıkması lazım. Senin kod şöyle yapıyo:
101%10 * 1 = 1
101%100 * 2 = 2
101%1000 * 4 = 404

bunları toplayınca sonuç 406 çıkıyo 5'le arasında dağlar kadar fark var :) Senin yapman gereken şu:
101%10 * 1 = 1;
101-1 = 100;
100%100 *10 = 0;
100 - 0 = 100;
100%1000 = 100; hatta benim söylediğim sistemde burda patlıyo :) Buna da mod yaptığın sayı aslından yüksekmi diye bi kontrol ettirmen lazım heralde.

Veya benim uykum var saçmalıyorum, eğer öyleyse lütfen quote yapmadan yüzüme vurun hemen editliyim :D
Link to comment
Sosyal ağlarda paylaş

Şimdi tekrar baktım koda, power fonksiyonunda int base alıyosun ama base *= base yapıyosun. uzun zamandır kullanmıyorum c++ ama sanki böyle yapılamaması lazım. onu içerdeki bişeye eşitleyip işlemleri yapmayı bi dene. temp = base;
temp *= temp gibi
Ama ilk postta dediğim gibi floating point exception ya sıfırla bölme, ya sınırı aşan bi sayı yada uzak bi ihtimalle yazdığın sayıyı sayı olarak almıyodur. Eğer sayıyı düzgün almıyosa convertBinary(num) diye çağırdığında onu 0la çağırmış olucak. Heralde 0'ın herhangi bi modunu almak hata veriyodur. Böyle işte cout'ları çoğaltıp bişeyleri comment out edip hatayı bulmaya çalış :D
Link to comment
Sosyal ağlarda paylaş

Kullanıcının yazdığını int'e atmak zorunda mıyız? Öyleyse çok ufak olur çevirebileceğimiz maksimum binary sayı.
Ha eğer string de okunabilir sorun olmaz dersen, 64 bitlik sayıya kadar çevirebilirsin (unsigned int boyutu).

Kod şu:


#include <iostream>
#include <math.h>
#include <string>
using namespace std;

unsigned int cevir(unsigned int x)
{
unsigned int donus = 0;
unsigned int sayac = 0;
while(1)
{
if(x%10 == 1) donus += pow(2.0, sayac * 1.0);
sayac++;
x = x/10;
if(x == 0 || sayac > 31) break;
}
return donus;
}

unsigned int cevir(string s)
{
unsigned int donus = 0;
unsigned int sayac = 0;
for(int i = s.length() - 1; i >= 0; i--)
{
if(s.at(i) == '1') donus += pow(2.0, sayac * 1.0);
sayac++;
}
return donus;
}

int main(int argc, char* argv[])
{
unsigned int k = 0;
string s;
while(1)
{
cin >> s;
cout << cevir(s) << endl;
}
}



Edit: Bu arada sayac * 1.0 yazmamın nedeni (double)sayac yazmaya üşenmem lakjsfhşalkjflk
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...