Na końcu dam gotowy program, jaki już posiadam.
Realizuje on konwersje w każdą stronę miedzy systemami liczbowymi z zakresu od 2 do 36. I wszystko działa.
Dodatkowo jest zaimplementowana została detekcja błędów i sprawdzanie czy wpisano cyfrę a nie cokolwiek innego.
Prezentuje program:
Kod
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
bool Koniec()
{
string s;
cout << "\nSkonczyc przeliczena ? (T = TAK)";
cin >> s;
return ((s != "") && (toupper(s[0]) == 'T'));
}
int NaLiczbe(const char *n)
{
int i;
for(i=0; isdigit(*n); n++)
i = i *10 +(*n - '0');
if(*n)
{
printf("\nZle dane. Obliczenia przerwane. Jako liczbe do zamiany wpisano znak.\nWprowadz liczbe z zakresu 0 - 9!!\nWybierz N i ponownie wprowadz dane.\n");
}
return i;
}
int NaLiczbe2(const char *n)
{
int i;
for(i=0; isdigit(*n); n++)
i = i *10 +(*n - '0');
if(*n)
{
printf("\nZle dane. Obliczenia przerwane. Jako podstawe wpisano znak.\nWprowadz liczbe z zakresu 2 - 10!!\nWybierz N i ponownie wprowadz dane.\n");
}
return i;
}
int main(void)
{
string s;
unsigned long c,L,p;
char buf[256] = {0};
do
{
cout <<
"\n==========================================================================
====\n"
" Zamian liczby decymalnej na zapis w systemie pozycyjnym o podstawie p"
"\n==========================================================================
=====\n"
"(C)2005 Siemiatkowska Dorota, Slomiany Jaroslaw, Szczuplinski Tomasz SWPW Plock"
"\n==========================================================================
=====\n"
"\nPodaj liczbe do zamiany = ";
cin >> buf;
cin.ignore(1024, '\n');
if(!(L = NaLiczbe(buf)))
{
continue;
}
cout << "\nPodaj podstawe z zakresu (2..10) = ";
cin >> buf;
cin.ignore(1024, '\n');
if(!(p = NaLiczbe2(buf)))
{
continue;
}
else
if ((p<2)|(p>10)) {printf("\n\nZle dane. Obliczenia przerwane. Podano podstawe nie zawarta w przedziale 2 - 10\n"
"Wybierz N i ponownie wprowadz dane.\n"); continue; }
cout << "\n" << L << "(10) = ";
s = "";
do
{
c = L % p;
s = char(c + 48) + s;
L = L / p;
} while(L != 0);
cout << s << "(" << p << ")\n\n";
} while(!Koniec());
return 0;
}
#include <string>
#include <sstream>
using namespace std;
bool Koniec()
{
string s;
cout << "\nSkonczyc przeliczena ? (T = TAK)";
cin >> s;
return ((s != "") && (toupper(s[0]) == 'T'));
}
int NaLiczbe(const char *n)
{
int i;
for(i=0; isdigit(*n); n++)
i = i *10 +(*n - '0');
if(*n)
{
printf("\nZle dane. Obliczenia przerwane. Jako liczbe do zamiany wpisano znak.\nWprowadz liczbe z zakresu 0 - 9!!\nWybierz N i ponownie wprowadz dane.\n");
}
return i;
}
int NaLiczbe2(const char *n)
{
int i;
for(i=0; isdigit(*n); n++)
i = i *10 +(*n - '0');
if(*n)
{
printf("\nZle dane. Obliczenia przerwane. Jako podstawe wpisano znak.\nWprowadz liczbe z zakresu 2 - 10!!\nWybierz N i ponownie wprowadz dane.\n");
}
return i;
}
int main(void)
{
string s;
unsigned long c,L,p;
char buf[256] = {0};
do
{
cout <<
"\n==========================================================================
====\n"
" Zamian liczby decymalnej na zapis w systemie pozycyjnym o podstawie p"
"\n==========================================================================
=====\n"
"(C)2005 Siemiatkowska Dorota, Slomiany Jaroslaw, Szczuplinski Tomasz SWPW Plock"
"\n==========================================================================
=====\n"
"\nPodaj liczbe do zamiany = ";
cin >> buf;
cin.ignore(1024, '\n');
if(!(L = NaLiczbe(buf)))
{
continue;
}
cout << "\nPodaj podstawe z zakresu (2..10) = ";
cin >> buf;
cin.ignore(1024, '\n');
if(!(p = NaLiczbe2(buf)))
{
continue;
}
else
if ((p<2)|(p>10)) {printf("\n\nZle dane. Obliczenia przerwane. Podano podstawe nie zawarta w przedziale 2 - 10\n"
"Wybierz N i ponownie wprowadz dane.\n"); continue; }
cout << "\n" << L << "(10) = ";
s = "";
do
{
c = L % p;
s = char(c + 48) + s;
L = L / p;
} while(L != 0);
cout << s << "(" << p << ")\n\n";
} while(!Koniec());
return 0;
}
A teraz napisze, o co bardzo Was Prosze.
O takie zmodyfikowanie w/w kodu, aby możliwa była konwersja jak do tej pory jednak wzbogacona jeszcze o konwersje u1 i u2 do i z w/w formatów kodowania.
Jednak l i p są sprawdzane czy są znakiem. To daje ze nie można zamienić -10 w dec na np. liczbę bin.
Chciałbym wzbogacić program, aby pozwalał:
Liczbę ujemna zamienić na dowolna, i dowolna na ujemna.
I do tego jest mi właśnie potrzebna u1 i u2. Oczywiście zamiana z u1 na u1 i na odwrót tez jest potrzebna.
Nie wiem czy wszystko odpowiednio opisałem.
Jeśli będą pytania odpowiem na nie.
Pozdrawiam.