Skocz do zawartości

[C++] Zamiana systemu dziesiętnego na wszystkie inne


kuuba2

Recommended Posts

Witam,

jak w temacie, zwracam się z prośbą o pomoc przy tym programie.

Próbuję zrobić program, trochę już mam, ma przeliczać liczby z dziesiętnego systemu na wszystkie inne, zrobiłem wszystkie podstawowe od dwójkowego do dziewiątkowego, szesnastkowy też zrobiłem bo wystarczyło użyć

cout << hex << x;
jednak mam problem z resztą systemów, np. trzynastkowy, przy zamianie liczby z dziesietnego na trzynastkowy, nie wiem jak to wszystko ująć, by do mojej reszty z dzielenia zostały przypisywane znaki odpowiednio do ich ilości w systemie

np.

334\13 | reszty 9

25\13 | reszty 12 odpowiada w tym systemie litera C

1 | reszty 1

a więc 334 w dziesiętnym to 1C9 w trzynastkowym, tylko jak zapisać to w kodzie, aby program to sam wyliczył?

Poniżej daje to co już mam:

# include <iostream>
int main ()
{
 using namespace std;
cout <<"Zamiana liczb pomiedzy dziesietnym, a innymi systemami"<<endl<<endl;
int tab[1]={0};
int ile=0;
int x,y;
cout <<"Podaj liczbe w systemie dziesietnym, ktora chcesz zamienic:";
cin>>x;
cout <<"Na jaki system chcesz zamienic?\n 2 - dwojkowy\n 3 - trojkowy\n 5 - piatkowy\n 6 - szostkowy\n 7 - siodemkowy\n 8 - osemkowy\n 9 - dziewiatkowy\n 11 - jedenastkowy\n 13 - trzynastkowy\n 16 - szesnastkowy\n 20 - dwudziestkowy\n";
cin>>y;
if (y==16)
{
cout <<"Wartosc w systemie szesnastkowym:\n";
cout << hex << x;
cout <<" \n";

      system("PAUSE");

    return 0;
}

else if (y!=16);
{
while(x>0)
{
 tab[ile]=x%y;
 x/=y;
 ile++;
}
for(int i=ile-1; i>=0; i--) cout<<tab[i];
cout<<endl;

 cin>>x;
 return 0;
}
}


Dziękuję za wszelką pomoc i wskazówki.

Odnośnik do komentarza
Udostępnij na stronach

Generalnie konwersję z dziesiętnego systemu na jakikolwiek inny robimy w następujący sposób. Np. dla ósemkowego:

liczba 79 w ósemkowym:

bierzemy najwyższą możliwą potęgę podstawy (w tym wypadku 8^2 = 64) i dzielimy liczbę 79 przez 64 otrzymujemy 1 i resztę 15

przechodzimy o jedną potęgę w dół, czyli 8^1 = 8, dzielimy 15 / 8 wychodzi 1 reszta 7

przechodzimy o jedną potęgę w dół, czyli 8^0 = 1, dzielimy 7 / 1 wychodzi 7 bez reszty.

Czyli wynik końcowy to 117.

Jeśli reszta wyjdzie nam mniejsza niż następny dzielnik to w danej potędze jest 0 i reszta przechodzi na niższą potęgę jak np. przy liczbie 130

druga potęga: 130 / 64 = 2 reszta 2 // wynik[2] = 2;

pierwsza potęga: 2 / 8 = 0 reszta 2 // wynik[1] = 0;

zerowa potęga: 2/1 = 2 reszta 0 // wynik[0] = 2;

wynik 202.

Jak byś miał jakieś problemy w implementacji to pisz.

Co do pytania jak to ująć, jak już masz te wyniki to musisz mieć tablicę z odpowiednimi znakami np.

znaki[0]=0;

znaki[1]=1;

...

znaki[10]=A;

...

znaki[15]=F;

i a wynik wyświetlasz w pętli od najwyższej potęgi

for(int potega = najwyzsza_potega; potega >=0;potega--)
cout << znaki[wynik[potega]];
cout << endl;
Odnośnik do komentarza
Udostępnij na stronach

heheh niestety mam ogólnie w ogóle problemy z wrzuceniem/stworzeniem tego kodu tak żeby działało :-X

Generalnie konwersję z dziesiętnego systemu na jakikolwiek inny robimy w następujący sposób. Np. dla ósemkowego:

liczba 79 w ósemkowym:

bierzemy najwyższą możliwą potęgę podstawy (w tym wypadku 8^2 = 64) i dzielimy liczbę 79 przez 64 otrzymujemy 1 i resztę 15

przechodzimy o jedną potęgę w dół, czyli 8^1 = 8, dzielimy 15 / 8 wychodzi 1 reszta 7

przechodzimy o jedną potęgę w dół, czyli 8^0 = 1, dzielimy 7 / 1 wychodzi 7 bez reszty.

Czyli wynik końcowy to 117.

Jeśli reszta wyjdzie nam mniejsza niż następny dzielnik to w danej potędze jest 0 i reszta przechodzi na niższą potęgę jak np. przy liczbie 130

druga potęga: 130 / 64 = 2 reszta 2 // wynik[2] = 2;

pierwsza potęga: 2 / 8 = 0 reszta 2 // wynik[1] = 0;

zerowa potęga: 2/1 = 2 reszta 0 // wynik[0] = 2;

wynik 202.

Jak byś miał jakieś problemy w implementacji to pisz.

Co do pytania jak to ująć, jak już masz te wyniki to musisz mieć tablicę z odpowiednimi znakami np.

znaki[0]=0;

znaki[1]=1;

...

znaki[10]=A;

...

znaki[15]=F;

i a wynik wyświetlasz w pętli od najwyższej potęgi

for(int potega = najwyzsza_potega; potega >=0;potega--)
cout << znaki[wynik[potega]];
cout << endl;
Odnośnik do komentarza
Udostępnij na stronach

To tu masz kolejną podpowiedź:

Żeby znaleźć największą potęgę podstawy mniejszą od liczby którą konwertujesz możesz użyć tego kodu


//... Wczytywanie danych
int i = 1;
do_potegi[0] = 1;
do_potegi[1] = podstawa;
if(zadana_liczba >= podstawa)
{
while ( do_potegi[i] < liczba_do_konwersji)
 {
i++;
do_potegi[i] = do_potegi[i-1] * podstawa;
}
najwyzsza_potega = i - 1;

//... Dzielenie z resztą

for(int potega = najwyzsza_potega; potega >=0;potega--)
cout << znaki[wynik[potega]];
cout << endl;

} 
else
cout << znaki[zadana_liczba];
cout << endl;

Brakuje tylko wczytywania danych i samego dzielenia z resztą i zapisania wyników w tablicy.

Odnośnik do komentarza
Udostępnij na stronach

Gość
Ten temat jest zamknięty i nie można dodawać odpowiedzi.
×
×
  • Dodaj nową pozycję...