Skip to content

Instantly share code, notes, and snippets.

@Hajto
Last active October 24, 2015 07:00
Show Gist options
  • Save Hajto/096da4559745d4420111 to your computer and use it in GitHub Desktop.
Save Hajto/096da4559745d4420111 to your computer and use it in GitHub Desktop.
Conversion between numeric systems
/*
Zrodla :
http://www.cplusplus.com/reference/stack/stack/push/
http://www.cplusplus.com/reference/string/string/
Opublikowano na pastebin.com
Dlaczego unsigned ? - bo nie niesie za soba, bo wymaga bardzo malo pamieci
Dlaczego stack ? - bo chcialem sprawdzic jak to dziala
*/
#include<iostream>
#include<stack>
#include<cstdlib>
#include<string>
using namespace std;
char znaki[]="0123456789ABCDEFGAHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|"; //tablica znakow wykorzystywanych do odtworzenia
inline unsigned char check(){
unsigned short baza;
cin>>baza;
while(baza>50||baza<2){
cout<<"Podstawa musi zawierać się w przedziale <2;50>. Podaj inną: ";
cin>>baza;
}
return baza;
}
int main(){
int decimal=0; // decimal bedzie zawieraz dziesiatna wartosc
cout<<"\t\tPodaj calkowita liczbe wejsciowa: ";
string input;
cin>>input;
cout<<"\tPodaj podstawe systemu liczbowego liczby wejsciowej: ";
unsigned char stara_baza=check();
cout<<"\tPodaj podstawe systemu liczbowego liczby wyjsciowej: ";
unsigned char nowa_baza=check();
cout<<"\t\t\t\tWynik: ";
if(stara_baza==nowa_baza)cout<<input; //skrot jezeli nie nastepuje zmiana systemu to wypisz wynik
else{
for(int i=0;i<input.length() ;++i){ // input.length sprawdzadlugosc ciagu
unsigned char znak=tolower(input[i]); //zmienia wszystko na male znaki
decimal=decimal*stara_baza+znak+((znak>='0'&&znak<='9')?-'0':-'a'+10);
}
if(nowa_baza==10)cout<<decimal; // taki skrot, jezeli nowa baza to odrazu wypisuje zmienna decimal
else if(decimal==0) cout<<'0';
else{
stack<char> output; //definicja stosu wyjsciowego
do{
output.push(znaki[decimal%nowa_baza]); // modulo, ktorego wynik dodaje element na szczyt stosu
decimal/=nowa_baza; //dzielimy
}while(decimal!=0);
while(!output.empty()){ // przyjmuje wartosc kiedy stos jest pusty
cout<<output.top(); // Zwraca element na szczycie sostu
output.pop(); // Usuwa element z gory stosu
}
}
}
cout<<"\n";
system ("pause");
return 0;
}
/* Zbedny kod z lekcji
void zamien(char &a, char &b){
char tmp=a;
a=b;
b=tmp;
}
void odwroc(char wyniki[]){
int i=0, j=counter-1;
for(int k=1;k<=counter/2;k++){
zamien(wyniki[i],wyniki[j]);
i++;
j--;
}
}
void wypisz(char wyniki[]){
for(int i=0;i<counter;i++){
cout<<wyniki[i];
}
}
*/
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
void zamien(char &a, char &b);
void odwroc(char wyniki[]);
void wypisz(char wyniki[]);
char a,b;
int counter=0;
main(){
int rt=4, nowa, stara,val=0,dyszka=0;
char znaki[]="0123456789ABCDEF";
char znak;
cout<<"Ile znakow bedzie miala liczba do konwersji??"<<endl;
cin>>rt;
char *tablica=new char[rt];
cout<<"Podaj ta liczbe \n";
for(int i=0;i<rt;i++){
cin>>tablica[i];
}
cout<<"Podaj stara baze systemu liczbowego. Od 2 do 16 \n";
cin>>stara;
cout<<"Podaj nowa baze systemu liczbowego. Od 2 do 16 \n";
cin>>nowa;
int i = rt-1, wartosc;
for(int k = 0; k < rt; k++)
{
znak = tablica[i];
i--;
switch(znak){
case 'F':
val=15;
break;
case 'E':
val=14;
break;
case 'D':
val=13;
break;
case 'C':
val=12;
break;
case 'B':
val=11;
break;
case 'A':
val=10;
break;
default:
val=(int)znak-48;
break;
}
cout<<val<<endl;
dyszka= dyszka+(pow(stara, k)*val);
}
while (dyszka>0)
{
tablica[counter]=dyszka%nowa;
counter++;
dyszka/=nowa; //po modulo trzeba podzielic
}
char *wyniki=new char[counter];
for(int i=0;counter>i;i++){
wyniki[i]=znaki[*(tablica+i)];
}
odwroc(wyniki);
wypisz(wyniki);
cout<<"\n";
system("pause");
}
void zamien(char &a, char &b){
char tmp=a;
a=b;
b=tmp;
}
void odwroc(char wyniki[]){
int i=0, j=counter-1;
for(int k=1;k<=counter/2;k++){
zamien(wyniki[i],wyniki[j]);
i++;
j--;
}
}
void wypisz(char wyniki[]){
for(int i=0;i<counter;i++){
cout<<wyniki[i];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment