Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

konop11

c++ konwersja liczb binarnych, decymalnych i heksadecymalnych

Polecane posty

Witam forumowiczów. Otóż dostałem do napisania w szkole konwerter, który zamieni liczby z binarnych na 10siątkowe i na odwrót, binarnych na heksadecymalne i na odwrót, i z heksadecymalnych na binarke + na odwrót. Poradziłem sobie z decymalne -> binarne, jednak kiedy umieściłem to w switch'u dziwnie zapetla i ciągle prosi o podanie liczby do konwersji - 1 próba dobrze zamienia, przy kolejnych program się zapętla, ten sam kod w pojedynczyzm programie działa bardzo dobrze. Głowny problem dotyczy binarne->decymalne, od wczoraj się z tym głowię, kombinuje na wiele sposobów i w ramach desperacji użyłem goto. i Dalej nic. Nie proszę o podanie kodu tylko o małą pomoc w poprawie i znalezieniu błędu.

#include <iostream>
#include <cstdlib>
#include <math.h>
#include <sstream>

using namespace std;

int decbin()
{    
    int liczba;
string konwert;
cout<<"podaj liczbe do konwersji: ";
    cin>>liczba;

        while(liczba!=0)
        {
            if (liczba%2==1) konwert="1"+konwert;
            if (liczba%2==0) konwert="0"+konwert;
            liczba=liczba/2;
    
        }
cout<<konwert<<"\n";
}


int bindec()
{
string x;
cout<<"podaj liczbe do konwersji: ";
cin>>x;
float suma;
int licznik,licznik2;
licznik=x.size();
cout<<x.size();

while (licznik2!=licznik)
{
if (x[x.size()]=1)
{suma=1;
goto aa;}

if (x[licznik]=1) suma=suma+pow(2,licznik);
aa:
licznik++;
cout<<suma;

}

//while (licznik!=x.size())
}

int main()
{

string konwert;
char menu;
cout<<"Wybierz operacje:\n 1 dziesiatkowy na binarny\n 2 binarny na dziesiatkowy\n";
cin>>menu;    

switch (menu)

{
case '1': decbin();
case '2': bindec();
break;
}
system("pause");
}

Dopiero zacząłem pisać w c++, używam dev-C++.

Link do komentarza
Udostępnij na innych stronach

Dopiero zacząłem pisać w c++, używam dev-C++.
Polecam zmianę na Visual Studio 2010 Express Edition. Dev jest bardzo przestarzały. To już nie jest tylko kwestia mało nowoczesnego IDE, ale także archaicznego wręcz kompilatora. W FAQ do programowania znajduje się link.

Co do zadania:

- liczby całkowite są przechowywane w pamięci w formie binarnej. Proponowałbym to wykorzystać i zwyczajnie wypisać bit po bicie bez żadnej konwersji.

- strumienie IO obsługują format ósemkowy, dziesiętny i szesnastkowy. O ile nikt Cię nie zmusza, to nie ma sensu samemu tego robić.

- liczby binarne konwertuje się na szesnastkowe po cztery bity na raz. Cztery bity przyjmują wartości <0:15> czyli <0:Fh>.

Skoro jedynym formatem, którego nie obsłuży biblioteka są liczby binarne, to tak naprawdę potrzebujesz jedynie funkcji konwertującej pobrany string na int i funkcji wyświetlającej poszczególne bity z inta. Reszta to tylko odpowiednie manipulowanie strumieniami.

Link do komentarza
Udostępnij na innych stronach

"Co do zadania:

- liczby całkowite są przechowywane w pamięci w formie binarnej. Proponowałbym to wykorzystać i zwyczajnie wypisać bit po bicie bez żadnej konwersji.

- strumienie IO obsługują format ósemkowy, dziesiętny i szesnastkowy. O ile nikt Cię nie zmusza, to nie ma sensu samemu tego robić.

- liczby binarne konwertuje się na szesnastkowe po cztery bity na raz. Cztery bity przyjmują wartości <0:15> czyli <0:Fh>."

Problem polega na tym że jednak muszę to sam zrobić a nie korzystać z bibliotek, bo to do szkoły :wink: oczywistym jest że sam bym się tym nie męczył.

A może jakieś pomysły dlaczego przy wykonywaniu funkcji zamieniającej dec-> bin się zapętla? Problem chyba w switch'u leży bo ta procedura w osobnym programie działa idealnie, jesli w switchu resztę zakomentuję to też jest ok.

Link do komentarza
Udostępnij na innych stronach

Faktycznie, to jest to :huh:

Kurcze brakuje mi jeszcze chyba talentu żeby to napisać :tongue: , co do 2giej procedury bin_>dec to muszę spróbować tej konwersji ze stringu na int. To w takim razie kiedy hexy będe konwertował to jakiego typu już użyć? Bo tam występują i liczby i literki, char a poźniej konwertować na różne? Może te pytania wydadzą się idiotyczne ale no staram to zrozumieć, nie tylko mieć :happy:

edit:

próbuje skonwertować int-->string ale każdy znak pojedynczo(żeby rozróżniał 0 i 1) znalazłem coś takiego:

string str = "123";
int i;
istringstream iss(str);
iss >> i;

działa to dla całości jednak dla pojedynczych znaków stringa już występuje błąd:

39 C:\Documents and Settings\Daniel\Pulpit\liczby.cpp invalid conversion from `char' to `std::_Ios_Openmode'

39 C:\Documents and Settings\Daniel\Pulpit\liczby.cpp initializing argument 1 of `std::basic_istringstream<_CharT, _Traits, _Alloc>::basic_istringstream(std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'

Jest on dla mnie oczywisty ale jakoś nie mam jakoś pojęcia jak to ominąć:(

Link do komentarza
Udostępnij na innych stronach

1. Zmień IDE, bo Dev to kupa - przepuści syfny kod i nie zawsze zadziała to, co powinno działać. Nabierzesz złych nawyków.

2. Formatowanie kodu - wypadałoby o tym pomyśleć. W Visualu zajmuje to sekundę (chyba, że masz 1k linii), a kod robi się dużo bardziej przejrzysty.

3. Nie używaj goto.

4. Jeśli w if (x[licznik]=1) masz "=", to po co w ogóle robić warunek?

5. http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

6. Funkcja typu int, która nic nie zwraca - kompilator nie powinien czegoś takiego przepuścić. Albo coś returnujesz, albo robisz funckję typu void.

Link do komentarza
Udostępnij na innych stronach

No zmieniłem już na Microsoft Visual Studio 2010 Express troszkę dużo to zajmowało :tongue: dziś poprawię popoprawiam to co już mam. i jeszcze jedno takie pytanie nieco offtopujące: dlaczego w tym visualu nie mogę wczytać zwykłego pliku *.cpp tylko muszę to zapisać jako nowy projekt? :dry:

Link do komentarza
Udostępnij na innych stronach

i jeszcze jedno takie pytanie nieco offtopujące: dlaczego w tym visualu nie mogę wczytać zwykłego pliku *.cpp tylko muszę to zapisać jako nowy projekt?
Nie mam problemów, żeby otworzyć/utworzyć dowolny plik tekstowy bez tworzenia projektu.

Menu File > Open > File

Menu File > New > File

Można też dwu kliknąć plik w eksploratorze, bo Visual staje się domyślnym programem dla plików .h .c .hpp .cpp .asm itd.

Oczywiście bez projektu nie da rady takiego pliku skompilować.

Problem polega na tym że jednak muszę to sam zrobić a nie korzystać z bibliotek, bo to do szkoły
Jak to się ma do tego, że próbujesz używać stringstreama ? On też jest częścią biblioteki. Coś niezbyt dokładnie przedstawiłeś wymagania :)
Link do komentarza
Udostępnij na innych stronach

Problem polega na tym że jednak muszę to sam zrobić a nie korzystać z bibliotek, bo to do szkoły. Jak to się ma do tego, że próbujesz używać stringstreama ? On też jest częścią biblioteki. Coś niezbyt dokładnie przedstawiłeś wymagania :)

Źle się wyraziłem, chodziło mi o to że muszę sam napisać konwersje liczb a nie konwertować je za pomocą poleceń bibliotek bo przecież można chyba liczby konwertować pojedynczymi komendami. :happy: w piątek się za to na porządne wezmę bo jutro mam egzamin na prawko ;p

poprawiony kod wygląda tak:

#include <stdafx.h>
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <sstream>

using namespace std;

void decbin()//dec->bin
{    
    int liczba;
    string konwert;
    
    cout<<"podaj liczbe do konwersji: ";
    cin>>liczba;

        while(liczba!=0)
        {
            if (liczba%2==1) konwert="1"+konwert;
            if (liczba%2==0) konwert="0"+konwert;
            liczba=liczba/2;
    
        }
    
        cout<<konwert<<"\n";    //wyświetla wynik
}


void bindec()//bin->dec
{
string x;
int ytab[10];
int licznik,licznik2;


    cout<<"podaj liczbe do konwersji: ";
    cin>>x;

licznik=x.size();
licznik2=0;

while (licznik2!=licznik)
    {
        string str= x[licznik2];
        istringstream iss(str);
        iss>>ytab[licznik2];

        cout<<ytab[licznik2];
        licznik2++;}
    }
}

int main()
{

string konwert;
char menu;

    cout<<"Wybierz operacje:\n 1 dziesiatkowy na binarny\n 2 binarny na dziesiatkowy\n";
    cin>>menu;    

switch (menu)
    {
case '1':
     {
     decbin();
     break;
     }

     /*case '2':
     {
     bindec();
     break;
     }*/

break;
    }

system("pause");
}

i nadal problem występuje w zmiennych kiedy próbuję wczytać z tablicy :icon_mad: :

void bindec()//bin->dec
{
string x;
int ytab[10];
int licznik,licznik2;


    cout<<"podaj liczbe do konwersji: ";
    cin>>x;

licznik=x.size();
licznik2=0;

while (licznik2!=licznik)
    {
        string str= x[licznik2];
        istringstream iss(str);
        iss>>ytab[licznik2];

        cout<<ytab[licznik2];
        licznik2++;}
    }
}

Oczywiście nie kończyłem tej drugiej procedury bo nie mogę skonwertowanych liczb zapisać:(

Link do komentarza
Udostępnij na innych stronach

Kombinowałem, męczyłem się, szukałem w internecie i mam takie coś:

//pisane w microsoft visual c++
#include <stdafx.h>
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <sstream>

using namespace std;

void decbin()//dec->bin
{    
    int liczba;
    string konwert;
    
    cout<<"podaj liczbe do konwersji: ";
    cin>>liczba;

        while(liczba!=0)
        {
            if (liczba%2==1) konwert="1"+konwert;
            if (liczba%2==0) konwert="0"+konwert;
            liczba=liczba/2;
    
        }
    
        cout<<"liczba w systemie dwojkowym : "<<konwert<<"\n";    //wyświetla wynik
}


void bindec()//bin->dec
{
    string bin;
double licznik1,licznik2,i=0;
double dec=0;
    cout<<"podaj liczbe w systemie dwojkowym : ";
    cin>>bin;

    licznik1=licznik2=bin.length()-1;
    for(i=0;i<=licznik1;i++)
    if(bin[i]=='1')dec=dec+pow(2,licznik2--);
    else licznik2--;
        
    cout<<"liczba w systemie dziesietnym : "<<dec<<endl;
    
}
void hexdec()//16->10
{
    string hex;
    cout<<"Podaj liczbe w systemie szesnastkowym: ";
    cin>>hex;
    double suma=0;
    double licznik1,licznik2,i=0;
    licznik1=licznik2=hex.length()-1;
    for(i=0;i<=licznik1;i++)
    
                        if (hex[i]=='a') suma=suma+(10*pow(16, licznik2--));
                        else
                        if (hex[i]=='b') suma=suma+(11*pow(16, licznik2--));
                        else
                        if (hex[i]=='c') suma=suma+(12*pow(16, licznik2--));
                        else
                        if (hex[i]=='d') suma=suma+(13*pow(16, licznik2--));
                        else
                        if (hex[i]=='e') suma=suma+(14*pow(16, licznik2--));
                        else
                        if (hex[i]=='f') suma=suma+(15*pow(16, licznik2--));
                        else
                        suma=suma+hex[i]*pow(16, licznik2--);
            licznik2--;
    
    cout<<"liczba w systemie dziesiatkowym to: "<<suma<<endl;
}

int main()
{

string konwert;
char menu;

    cout<<"Wybierz operacje:\n 1 dziesiatkowy na binarny\n 2 binarny na dziesiatkowy\n 3 heksadedymalny na decymalny\n";
    cout<<" 4 decymalny na heksadecymalny \n 5 heksadecymalny na binarny \n 6 binarny na heksadecymalny";
    cout<<endl<<"wybieram: ";
    cin>>menu;    

switch (menu)
    {
case '1':
     {
     decbin();
     break;
     }

     case '2':
     {
     bindec();
     break;
     }
     case '3':
     {
     hexdec();
     break;
     }
     default: cout<<"nic nie wybrales\n";
    

break;
    }

system("pause");
}

tylko teraz mały problem w 3ciej procedurze, gdyż hex przyjmuje róznie dziwne i niezrozumiałe dla mnie wartości np 50. Wie ktoś dlaczego?

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...