Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kalkulator binarny-dziesiętny

Ostatnio zmodyfikowano 2016-11-09 17:11
Autor Wiadomość
JanRos
Temat założony przez niniejszego użytkownika
Kalkulator binarny-dziesiętny
» 2016-11-04 13:32:30
Witam, piszę autorski kalkulator, jednak nie działa mi pewna funkcja nie mam pojęcia dlaczego.
Otóż gdy zamieniam z dziesiętnego na binarny to ładnie wszystko wypisuje tą funckją:
C/C++
cin >> liczba;
dlugosc = sqrt( liczba ) + 1;
bool tablica[ dlugosc ];
while( liczba > 0 )
{
    reszta = liczba % 2;
    liczba = liczba / 2;
    tablica[ index++ ] = reszta;
}
cout << "To twoja liczba: ";
for( index; index > 0; index-- )
{
    cout << tablica[ index - 1 ];
}
Na kształt tego zrobiłem tak aby nie trzeba było wpisywać od tyłu tej liczby też tabelą, ale coś nie działa.
Podejrzewam, że jest coś nie tak w pętli for. 
C/C++
case 2: {
    int cyfra = 0, liczba = 0, index = 0itam;
    cout << "Witaj w programie konwertujacym liczby z systemu binarnego na dziesietny" << endl;
    cout << "Podaj liczbe po każdej wpisanej cyfrze naciskajac enter (uzywaj tylko cyfr 0;1). Jesli chcesz zakonczyc wcisnij 2:" << endl;
    bool tablica[ 100 ];
    while( cyfra <= 1 )
    {
        cin >> cyfra;
        if( cyfra <= 1 )
             tablica[ index++ ] = cyfra;
       
    }
    for( int kwadrat = - 1; index < 0; kwadrat++ )
    {
        liczba = liczba + cyfra *( pow( 2, kwadrat ) );
        cyfra = tablica[ index - 1 ];
        index--;
    }
    cout << "Twoja liczba to:" << liczba << endl;
}; break;
default: cout << "Podales zly numer" << endl; break;
}
Będę wdzięczny za pomoc :D.
EDIT Dałem cały case, bo dziwnie wygladło.
P-153353
pekfos
» 2016-11-04 13:45:24
Ten kod:
C/C++
for( int kwadrat = - 1; index < 0; kwadrat++ )
{
    liczba = liczba + cyfra *( pow( 2, kwadrat ) );
    cyfra = tablica[ index - 1 ];
    index--;
}
Jest do niczego.
P-153354
mateczek
» 2016-11-04 14:42:58
Uwaga !!! program nie posiada żadnych zabezpieczeń przed podaniem nie liczby :P
C/C++
#include <iostream>
using namespace std;
string liczbaToString( int liczba, int base ) {
    string temp;
    int cyfra;
    while( liczba ) {
        cyfra = liczba % base;
        liczba /= base;
        temp.insert( temp.begin(), cyfra + '0' ); // wstaw znak na początek string
    }
    return temp;
}
int stringToLiczba( string liczba, int base ) {
    int wynik = 0;
    for( int i = 0; i < liczba.size(); i++ ) {
        wynik = wynik * base +( liczba[ i ] - '0' );
    }
    return wynik;
}

string stringToSTring( string liczba, int baseSource, int baseDestination ) {
    //najpierw ciąg znaków w kodzie opisanym przez parametr "baseSource" zamieniamy na liczbę
    //następnie liczbę konwertujemy do ciągu znaków w kodzie opisanym parametrem "baseDestination";
    return liczbaToString( stringToLiczba( liczba, baseSource ), baseDestination ); //nie wiem jak z wydajnością ale działa
}
int main() {
    string napis = "101"; //wynik =5
    cout << stringToLiczba( napis, 2 ) << endl; //ciąg znaków w systemie 2 na liczbę int;
   
    int liczba = 15; //wynik =1111
    cout << liczbaToString( liczba, 2 ) << endl; //liczba int na ciąg Znaków w ststemie dwujkowym
   
    napis = "1111"; //wynik =17
    cout << stringToSTring( napis, 2, 8 ) << endl; //napis w dwójkowym na napis w ósemkowym
}
P-153356
JanRos
Temat założony przez niniejszego użytkownika
» 2016-11-04 16:53:55
Tylko ja nie chciałem słuchać czy jest do niczego czy mieć całkiem co innego tylko się dowiedzieć dlaczego "for" nie działa. Gdy trzeba było podawać liczby od końca to działało ale tabelka mi nie działa.
P-153364
mateczek
» 2016-11-04 17:11:10
jeśli chcesz sprawdzić swój algorytm użyj debuggera a zobaczysz co masz nie tak. Ogólnie mi jest ciężko po kodzie wywnioskować co chciałeś zrobić. tym bardziej po ki czort chcesz wpisywać od tyłu??. Weźmy dla przykładu system dziesiętny. i cyfry
'3','4','5'
trzy iteracje i masz liczbę
#1) 0*10+3=3;
#2) 3*10+4=34;
#3) 34*10+5=345;

nie ma potrzeby żadnego wpisywania od tyłu !!!! algorytm dla systemu dwójkowego jest:
liczba=liczba*2+cyfra;



A Zamianę z binarnego na liczbę Ci zrobiłem. Prawidłowa pętla for
C/C++
for( int i = 0; i < liczba.size(); i++ ) {
    wynik = wynik * base +( liczba[ i ] - '0' ); //za base musisz wstwić "2"
}

//co w przełożeniu na twoją sytuację jeśli w tablicy masz tylko liczby 0/1 powinno być jakoś tak: I nie ma potrzeby wpisywania od tyłu
int liczba = 0;
for( int i = 0; i < index, i++ )
{
    liczba = liczba * 2 + tablica[ i ] );
}

Jeśli chcesz na tablicy 0-1 to zobacz taki kod: (również nie ma potrzeby wpisywania od tyłu)
C/C++
#include <iostream>
using namespace std;

int main() {
    int tab[ 4 ] = { 1, 0, 1, 1 }; //talblica zer i jedynek
    int liczba = 0;
    for( int element: tab )
    {
        liczba = liczba << 1 | element; //przesuwam o jeden bit w lewo i ustawiam ostatni
    }
    cout << liczba << endl;
   
}
P-153365
JanRos
Temat założony przez niniejszego użytkownika
» 2016-11-09 17:11:37
Dziękuję za pomoc ostatecznie zrobiłem tak:
C/C++
int liczba = 0, cyfra = 0, index = 0, dlugosc = 0;
bool tablica[ 100 ];
while( cyfra <= 1 )
{
    cin >> cyfra;
    if( cyfra <= 1 )
         tablica[ index++ ] = cyfra;
   
    dlugosc++;
   
}
for( int i = 0; i < dlugosc; i++ )
{
    liczba = liczba + tablica[ index - 1 ] * pow( 2, i );
    index--;
}

cout << "Wynik to:" << liczba << endl;
I wszystko ładnie działa :D.
P-153506
« 1 »
  Strona 1 z 1