zamiana liczby binarnej na dziesiętną... c++

Awatar użytkownika
grzywatuch
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 6 sie 2008, o 10:06
Płeć: Mężczyzna
Lokalizacja: Tuchów
Podziękował: 8 razy
Pomógł: 42 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: grzywatuch »

a wiec napisałem taki mały program co oblicza jak narazie wartość liczby binarnej ale jeżeli liczba w systemie binarnym ma 4 znaki:

Kod: Zaznacz cały

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

int main()
{
 int z, b=1;
   cout <<"Podaj liczbe do zamiany (w systemie binarnym):

";
   cin>>z;
   while(z=z/10)b++;

 
 float liczby[3], y=b;
 cout << "Przepisz liczbe, pamietajac, zeby po kazdej cyfrze wstawic spacje:" << endl;
 cin >> liczby[0]>>liczby[1]>>liczby[2]>>liczby[3];
 cout << "Wartosc dziesietna liczby binarnej:

"
      << liczby[0]* pow(2,y-1)+ liczby[1]* pow(2,y-2)+ liczby[2]* pow(2,y-3)+ liczby[3]* pow(2,y-4)<< endl;
cin>>z;
 return 0;
}

i mam taki problem, bo program może działać też dla np liczby binarnej co ma 5 znaków,ale....

mi by sie przydało takie jakies uogólnienie zrobić ze jak liczba ma 7 znaków to mój program wylicza to jako "b"

wtedy można by zadeklarować tablice :

Kod: Zaznacz cały

float liczby[b-1], y=b;
, zeby miala 7 liczb wpisanych do tablicy,

problem jest w tym zeby program sam zamieniał kolejna linijke:

Kod: Zaznacz cały

cin >> liczby[0]>>liczby[1]>>liczby[2]>>liczby[3];
na taka zeby byla zależna od naszego "b" czyli "b=7" wiec powinno samo zrobić taka postać:

Kod: Zaznacz cały

cin >> liczby[0]>>liczby[1]>>liczby[2]>>liczby[3]>>liczby[4]>>liczby[5]>>liczby[6];
no i przy okazji tez ostatnie wyliczenie też zeby samo zamieniał xD

i nie zabardzo wiem czy jest takie coś możliwe,


Bo program ma działać tak jak normalnie sie zamienia liczby z systemu dziesietnego na binarny:

"najpierw liczy ilośc cyfr, a potem do kolejnych poteg liczby 2 dodaje wyniki, jak jest 1 to dodaje jak jest 0 to nie dodaje tego xD"



Trochu zamieszałem ale trudno mi to lepiej wytlumaczyc xD
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: spajder »

Proponuję wczytać liczbę do stringa:

Kod: Zaznacz cały

string binarna;
cin >> binarna;
i przelecieć pętlą tego stringa:

Kod: Zaznacz cały

int dziesietna = 0;
int w = 1;
for(int i = 0; i < binarna.size(); ++i)
{
    if(binarna[i] == '1')
        dziesietna += w;
    w <<= 1;     // to samo co mnoznik = mnoznik*2, ale szybsze
}
Jeśli czegoś nie rozumiesz to pisz.
Awatar użytkownika
grzywatuch
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 6 sie 2008, o 10:06
Płeć: Mężczyzna
Lokalizacja: Tuchów
Podziękował: 8 razy
Pomógł: 42 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: grzywatuch »

no programik fajnie działa, ale...

właśnie kiedys ktos mi tu też pisał zeby to za pomoca stringa zrobic, ale ja wogule o tym nie mam pojęcia, wiec próbowałem zrobić to znajomymi dla mnie sposobami....

i szczerze mówiać ten drugi kod to wcale ani jedna linijka nie jest dla mnie zrozumiała, a mam to niestety wytłumaczyc mojemu nauczycielowi od infy i z tym bedzie problem.

jakbys mógl napisać w każdej linijce jeszcze przypisy co dokladnie kazda komenda robił to byłbym wdzieczny bardzo xD
np:

czemu deklarujemy ze "

Kod: Zaznacz cały

dziesietna = 0
int w = 1
a nie naprzykład inne liczby

Kod: Zaznacz cały

binarna.size()
co to oznacza (moze to jest ilość cyfr w liczbie??)


wogule ogólnie przydało by mi sie wiedziec jak to po kolei liczy, co w kazdym etapie ten program robi xD

PS. ja np próbowałem zrobic program klasycznym sposobem zamiany liczby dziesietnej na binarna (no i tam wiem co kazde wszystko robi, tylko nie moge sobie poradzic z tym zeby mi liczylo dla kazdej długości liczby binarnej a nie tylko dla np 8 cyfrowej liczby binarnej xD.

Ale jak mi tamto wytlumaczysz dokładniej co kazda domenda robi to by bylo nawet lepiej bo program jest krótszy xD-- 1 grudnia 2009, 18:23 --hmm cos nie tak hehe, bo wczesniej sprawdzilem 2 liczby i dobrze obliczylo, ale np zle zamienia liczby takie jak:

100000, gdzie nie ma "1" na koncu cos tu nie dopracowane jednak jest xD
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: spajder »

Mówiłem, że jest na szybko pisane, już widzę błąd :d

Ogólnie: string to po prostu napis w c++, metoda size() podaj długość stringa czyli w tym wypadku ilość cyfr w zapisie binarnym. String można traktować jako tablicę, czyli [0] oznacza 1 znak, [2] drugi itp.
Aby zamienić z binarnego na dziesiętny trzeba przejść wszystkie te liczby, tzn. znaki w stringu. To robi pętla:

Kod: Zaznacz cały

for(int i = 0; i < binarna.size(); ++i);
najpierw będziemy operowali na elemencie 0, czyli binarna[0], potem na 1 czyli binarna[1] itp. Skończy się na ostatnim znaku.

Kod: Zaznacz cały

dziesietna = 0
int w = 1
Zmienna dziesietna zawiera ostateczny wynik. Będziemy do niego dodawać potem wartości. W jest wartością cyfry, np. w liczbie 1101 mamy:
\(\displaystyle{ 1101_2 = 1\cdot 2^3 + 1\cdot 2^2 + 0\cdot 2^1 + 1\cdot 2^0}\)
i te wartości wynoszą kolejno \(\displaystyle{ 2^3, 2^2, 2^1, 2^0}\)

Wewnątrz pętli sprawdzamy jeden znak i jeśli jest jedynką to dodajemy do liczby wartość:

Kod: Zaznacz cały

    
    if(binarna[i] == '1')
        dziesietna += w;
    w <<= 1;     // to samo co mnoznik = mnoznik*2, ale szybsze
Tu pojawia się ten błąd. Powinienem przeglądać napis od końca. Algorytm jest prosty, np. dla liczby
1100110 mamy:

1. ustawiamy dziesietna = 0, w = 1
2. wczytujemy ostatnią cyfrę, jest równa 0 więc tylko podwajamy w. w=2
3. wczytujemy poprzednią cyfrę, jest rowna 0, więc dodajemy do dziesietnej w.
Teraz dziesiętna = 0+ 2 = 2. Podwajamy w. w = 4
4. Wczytujemy poprzednią cyfrę. Jest równa 0, więc dodajemy do dziesietna w.
Teraz dziesietna = 2+4 = 6. Podwajamy w. w = 8.
5. Wczytujemy poprzednią cyfrę. Jest równa 0, więc tylko podwajamy w. w=16
6. Wczytujemy poprzednią cyfrę. Jest równa 0, więc tylko podwajamy w. w=32
7. Wczytujemy poprzednią cyfrę. Jest równa 1, więc dodajemy do dziesietna w.
dziesietna = 6 + 32 = 38. Podstajamy w. w = 64
8. Wczytujemy poprzednią cyfrę. Jest równa 1, więc dodajemy do dziesietna w.
dziesietna = 38+64 = 102. Podwajamy w. w = 128

Teraz wystarczy wypisać.
Twoim zadaniem jest odwrócenie pętli tak, aby czytała napis od końca.
Awatar użytkownika
grzywatuch
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 6 sie 2008, o 10:06
Płeć: Mężczyzna
Lokalizacja: Tuchów
Podziękował: 8 razy
Pomógł: 42 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: grzywatuch »

spajder pisze:Tu pojawia się ten błąd. Powinienem przeglądać napis od końca. Algorytm jest prosty, np. dla liczby
1100110 mamy:
hmm cos nie tak bo zle liczy nawet tą podana liczbę xD
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: spajder »

A zmieniłeś to co napisałem?
Awatar użytkownika
grzywatuch
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 6 sie 2008, o 10:06
Płeć: Mężczyzna
Lokalizacja: Tuchów
Podziękował: 8 razy
Pomógł: 42 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: grzywatuch »

hehe cos tam próbowałem.... ale nie wyszlo xD
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

zamiana liczby binarnej na dziesiętną... c++

Post autor: spajder »

To pokaż co tam wymyśliłeś, zaraz się poprawi
ODPOWIEDZ