Jakiś czas i tutaj prosiłem o pomoc.
Od tego czasu programy się rozwinęły i już jako tako działają.
Zamieszczam je do przetestowania i wypisania wszystkich znalezionych błędów oraz zaleceń.
Proponował bym nie skupianie się na strukturze programu a na wyłapaniu jego błędów.
Zostanie on opublikowany dla innych potrzebujących.
Jedyna opcja jakiej brakuje to konwersja do i z ujemnych liczb typu hex etc.
Pozdrawiam i liczę na odezw.
Prośba do moderatora o zamiane kodów na załączniki jeśli się da.
Wersja dla c++:
Kod
//#include<stdafx.h>
#include <cmath>
#include <iostream>
#include <string>
#include <cctype> // for toupper, isdigit
using namespace std;
// zamienia napis na liczbŕ
bool NaLiczbe(const char *n, long int &ul)
{
long int i;
for(i=0; isdigit(*n); n++)
i = i *10 +(*n - '0');
if(*n)
return false;
ul = i;
return true;
}
// pyta siŕczy zako˝czyŠ dzia-anie programu
bool Koniec()
{
string s;
cout << "Skonczyc przeliczena ? (T = TAK)";
cin >> s;
return ((s != "") && (toupper(s[0]) == 'T'));
}
// sprawdza czy sÜ dobre dane
bool DaneOK(string s, long p1, long p2)
{
bool przecinek = false;
long i,c;
if((p1 < 2) || (p1 > 36) || (p2 < 2) || (p2 > 36))
return false;
for(i = 0; i < long(s.length()); i++)
{
s[i] = toupper(s[i]);
if(s[i] == ',')
{
if(przecinek)
return false;
przecinek = true;
continue;
}
if( ((s[i] > ('0' - 1)) && (s[i] < ('9' + 1)))
|| ((s[i] > ('A' - 1)) && (s[i] < ('Z' + 1))) )
;
else
return false;
c = s[i] - 48;
if(c > 9)
c -= 7;
if(c >= p1)
return false;
}
return true;
}
void convert_to_tc(int val, int* tc)
{
for (int i = 0; i < 8; ++i) /* eight bits only */
{
tc[i] = val&1; /* test lowest bit of val */
val >>= 1; /* shift val down a bit */
}
}
string Konwertuj(string s1,long p1, long p2)
{
long c,i,Lc,Lu,w;
double rLu;
bool u;
string s2;
Lc = Lu = 0;
w = 1;
u = false;
for(i = 0; i < long(s1.length()); i++)
{
s1[i] = toupper(s1[i]);
if(s1[i] == ',')
u = true;
else
{
// sprawdzanie czy jest jaka? litera i je?li tak to zamie˝
// na jej odpowiednik w systemie dziesiŕtnym
if( (s1[i] > ('A'-1)) && (s1[i] < ('Z' +1)))
c = s1[i] - 'A' + 10;
else
c = s1[i] - '0';
if(u)
{
Lu = p1 * Lu + c;
w *= p1;
}
else
Lc = p1 * Lc + c;
}
}
rLu = (double)(Lu) / w;
s2 = "";
do
{
c = Lc % p2;
if(c < 10)
s2 = (char)(c + 48) + s2;
else
s2 = (char)(c + 55) + s2;
Lc /= p2;
} while(Lc);
if(Lu)
{
s2 += ',';
while(s2.length() < 32)
{
rLu *= p2;
c = (unsigned long)floor(rLu);
if(c < 10)
s2 += (char)(c + 48);
else
s2 += (char)(c + 55);
rLu = rLu - c;
}
while(s2[s2.length()-1] == '0')
s2.erase(s2.length()-1);
}
return s2;
}
string KonwertujBCD(string s, long p1, long p2, bool z)
{
string s2 = "";
char* ss;
char* t;
char * p = new char[ s.length() + 1 ];
strcpy( p, s.c_str() );
long hex = strtol(p, &ss, 2);
if(z)
{
// konwersja z kodu BCD
}
else
{
char* c1 = new char[4];
string s1 = Konwertuj(s,2,10);
int i = 0;
while(s1.length() > i)
{
sprintf(c1, "%04d", atoi(Konwertuj(s1.substr(i,i+1),10,2).c_str()));
s2 += c1;
i++;
}
}
return s2;
}
string KonwertujU1(string s, long p1, long p2, bool z)
{
string s2 = "";
char buffer[33];
char* ss;
long hex = strtol(s.c_str(), &ss, 2);
if(z)
{
hex = ~hex;
itoa(hex,buffer,2);
string l = buffer;
l = l.substr(l.length()-s.length(),s.length());
s2 = Konwertuj(l,2,p2);
}
else
{
hex = ~hex;
itoa(hex,buffer,2);
s2 = buffer;
s2 = s2.substr(s2.length()-s.length()-1,s.length()+1);
}
return s2;
}
string KonwertujU2(string s, long p1, long p2, bool z)
{
string s2 = "";
char buffer[33];
char* ss;
long hex = strtol(s.c_str(), &ss, 2);
if(z)
{
hex = ~hex + 1;
itoa(hex,buffer,2);
string l = buffer;
l = l.substr(l.length()-s.length(),s.length());
s2 = Konwertuj(l,2,p2);
}
else
{
hex = ~hex + 1;
itoa(hex,buffer,2);
s2 = buffer;
s2 = s2.substr(s2.length()-s.length()-1,s.length()+1);
}
return s2;
}
// g-owa funckja
int main(void)
{
char buf[256] = {0}; // bufor do pobrania podstaw, a potem zamiany na liczby
long p1,p2;
string s1,s2;
bool isMinus = false; // zmienna do sprawdzania czy jest znak minus
bool isp2Minus=false;
cout <<
"\n==========================================================================
===="
" Przelicznanie liczb zapisanych w roznych systemach pozycyjnych"
"\n==========================================================================
=====\n"
"(C)2005 Siemiatkowska Dorota, Slomiany Jaroslaw, Szczuplinski Tomasz SWPW Plock"
"\n==========================================================================
=====\n";
do{
isMinus = false;
// manipulacja na liczbie wej?ciowej
cout << "\nPodaj liczbe wejsciowa = "; cin >> s1;
if(s1[0] == '-')
{
// obcinamy znak minus (-), i zaznaczamy isMinus na prawde
s1 = s1.substr(1);
isMinus = true;
}
// manipulacja na podstawie jakÜ jest liczba wej?Šiowa
cout << "\nPodaj podstawe wejsciowa = "; cin >> buf; cin.ignore(1024, '\n');
if(!NaLiczbe(buf, p1))
{
cout <<
"\nZle dane. Obliczenia przerwane. Jako podstawe wejsciowa wpisano znak.\n"
"Wprowadz liczbe!!\nWybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
else if( p1 < 2 || p1 > 36)
{
cout <<
"\nZle dane. Obliczenia przerwane.\nMusisz podac liczbe z zakresu 2-36!.\n"
"Wybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
// manipulacja na podstawie jakÜ bŕdzie liczba wyj?Šiowa
cout << "\nPodaj podstawe docelowa = "; cin >> buf; cin.ignore(1024, '\n');
if(!NaLiczbe(buf, p2))
{
cout <<
"\nZle dane. Obliczenia przerwane. Jako podstawe docelowa wpisano znak.\n"
"Wprowadz liczbe!!\nWybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
else if( p2 < 2 || p2 > 36)
{
cout <<
"\nZle dane. Obliczenia przerwane.\nMusisz podac liczbez zakrsu 2-36!.\n"
"Wybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
cout << endl;
if(p2 == 2)
isp2Minus = true;
// tutaj sÜ ca-e przekszta-cenia, doda-em bym wiŕcej komentzarzy
// ale ten kawa-ek to nie do mnie nale¬y
if(DaneOK(s1,p1,p2))
{
s2 = Konwertuj(s1,p1,p2);
cout << (isMinus?"-":"") << s1 << "(" << p1 << ") = " << ((isMinus&& !isp2Minus) ? "-":"") << s2 << "(" << p2 << ")";
if(p2 == 2)
{
cout << " " << KonwertujBCD(s2,p1,p2,false) << "(BCD) ";
if(isMinus)
{
cout << KonwertujU1(s2,p1,p2,false) << "(U1) ";
cout << KonwertujU2(s2,p1,p2,false) << "(U2)";
}
}
else if(p1 == 2)
{
cout << "z U1 = "<< KonwertujU1(s1,p1,p2,true) << " z U2 = " << KonwertujU2(s1,p1,p2,true);
}
cout << "\n";
}
else
{
cout <<
"Zle dane. Obliczenia przerwane.\nJako liczbe do zamiany podano znak z poza zakresu 0-9 lub a-z.\n"
"Uruchom program ponownie lub\nwybierz N i ponownie wprowadz dane.\n";
}
cout << endl;
} while(!Koniec());
return 0;
}
#include <cmath>
#include <iostream>
#include <string>
#include <cctype> // for toupper, isdigit
using namespace std;
// zamienia napis na liczbŕ
bool NaLiczbe(const char *n, long int &ul)
{
long int i;
for(i=0; isdigit(*n); n++)
i = i *10 +(*n - '0');
if(*n)
return false;
ul = i;
return true;
}
// pyta siŕczy zako˝czyŠ dzia-anie programu
bool Koniec()
{
string s;
cout << "Skonczyc przeliczena ? (T = TAK)";
cin >> s;
return ((s != "") && (toupper(s[0]) == 'T'));
}
// sprawdza czy sÜ dobre dane
bool DaneOK(string s, long p1, long p2)
{
bool przecinek = false;
long i,c;
if((p1 < 2) || (p1 > 36) || (p2 < 2) || (p2 > 36))
return false;
for(i = 0; i < long(s.length()); i++)
{
s[i] = toupper(s[i]);
if(s[i] == ',')
{
if(przecinek)
return false;
przecinek = true;
continue;
}
if( ((s[i] > ('0' - 1)) && (s[i] < ('9' + 1)))
|| ((s[i] > ('A' - 1)) && (s[i] < ('Z' + 1))) )
;
else
return false;
c = s[i] - 48;
if(c > 9)
c -= 7;
if(c >= p1)
return false;
}
return true;
}
void convert_to_tc(int val, int* tc)
{
for (int i = 0; i < 8; ++i) /* eight bits only */
{
tc[i] = val&1; /* test lowest bit of val */
val >>= 1; /* shift val down a bit */
}
}
string Konwertuj(string s1,long p1, long p2)
{
long c,i,Lc,Lu,w;
double rLu;
bool u;
string s2;
Lc = Lu = 0;
w = 1;
u = false;
for(i = 0; i < long(s1.length()); i++)
{
s1[i] = toupper(s1[i]);
if(s1[i] == ',')
u = true;
else
{
// sprawdzanie czy jest jaka? litera i je?li tak to zamie˝
// na jej odpowiednik w systemie dziesiŕtnym
if( (s1[i] > ('A'-1)) && (s1[i] < ('Z' +1)))
c = s1[i] - 'A' + 10;
else
c = s1[i] - '0';
if(u)
{
Lu = p1 * Lu + c;
w *= p1;
}
else
Lc = p1 * Lc + c;
}
}
rLu = (double)(Lu) / w;
s2 = "";
do
{
c = Lc % p2;
if(c < 10)
s2 = (char)(c + 48) + s2;
else
s2 = (char)(c + 55) + s2;
Lc /= p2;
} while(Lc);
if(Lu)
{
s2 += ',';
while(s2.length() < 32)
{
rLu *= p2;
c = (unsigned long)floor(rLu);
if(c < 10)
s2 += (char)(c + 48);
else
s2 += (char)(c + 55);
rLu = rLu - c;
}
while(s2[s2.length()-1] == '0')
s2.erase(s2.length()-1);
}
return s2;
}
string KonwertujBCD(string s, long p1, long p2, bool z)
{
string s2 = "";
char* ss;
char* t;
char * p = new char[ s.length() + 1 ];
strcpy( p, s.c_str() );
long hex = strtol(p, &ss, 2);
if(z)
{
// konwersja z kodu BCD
}
else
{
char* c1 = new char[4];
string s1 = Konwertuj(s,2,10);
int i = 0;
while(s1.length() > i)
{
sprintf(c1, "%04d", atoi(Konwertuj(s1.substr(i,i+1),10,2).c_str()));
s2 += c1;
i++;
}
}
return s2;
}
string KonwertujU1(string s, long p1, long p2, bool z)
{
string s2 = "";
char buffer[33];
char* ss;
long hex = strtol(s.c_str(), &ss, 2);
if(z)
{
hex = ~hex;
itoa(hex,buffer,2);
string l = buffer;
l = l.substr(l.length()-s.length(),s.length());
s2 = Konwertuj(l,2,p2);
}
else
{
hex = ~hex;
itoa(hex,buffer,2);
s2 = buffer;
s2 = s2.substr(s2.length()-s.length()-1,s.length()+1);
}
return s2;
}
string KonwertujU2(string s, long p1, long p2, bool z)
{
string s2 = "";
char buffer[33];
char* ss;
long hex = strtol(s.c_str(), &ss, 2);
if(z)
{
hex = ~hex + 1;
itoa(hex,buffer,2);
string l = buffer;
l = l.substr(l.length()-s.length(),s.length());
s2 = Konwertuj(l,2,p2);
}
else
{
hex = ~hex + 1;
itoa(hex,buffer,2);
s2 = buffer;
s2 = s2.substr(s2.length()-s.length()-1,s.length()+1);
}
return s2;
}
// g-owa funckja
int main(void)
{
char buf[256] = {0}; // bufor do pobrania podstaw, a potem zamiany na liczby
long p1,p2;
string s1,s2;
bool isMinus = false; // zmienna do sprawdzania czy jest znak minus
bool isp2Minus=false;
cout <<
"\n==========================================================================
===="
" Przelicznanie liczb zapisanych w roznych systemach pozycyjnych"
"\n==========================================================================
=====\n"
"(C)2005 Siemiatkowska Dorota, Slomiany Jaroslaw, Szczuplinski Tomasz SWPW Plock"
"\n==========================================================================
=====\n";
do{
isMinus = false;
// manipulacja na liczbie wej?ciowej
cout << "\nPodaj liczbe wejsciowa = "; cin >> s1;
if(s1[0] == '-')
{
// obcinamy znak minus (-), i zaznaczamy isMinus na prawde
s1 = s1.substr(1);
isMinus = true;
}
// manipulacja na podstawie jakÜ jest liczba wej?Šiowa
cout << "\nPodaj podstawe wejsciowa = "; cin >> buf; cin.ignore(1024, '\n');
if(!NaLiczbe(buf, p1))
{
cout <<
"\nZle dane. Obliczenia przerwane. Jako podstawe wejsciowa wpisano znak.\n"
"Wprowadz liczbe!!\nWybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
else if( p1 < 2 || p1 > 36)
{
cout <<
"\nZle dane. Obliczenia przerwane.\nMusisz podac liczbe z zakresu 2-36!.\n"
"Wybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
// manipulacja na podstawie jakÜ bŕdzie liczba wyj?Šiowa
cout << "\nPodaj podstawe docelowa = "; cin >> buf; cin.ignore(1024, '\n');
if(!NaLiczbe(buf, p2))
{
cout <<
"\nZle dane. Obliczenia przerwane. Jako podstawe docelowa wpisano znak.\n"
"Wprowadz liczbe!!\nWybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
else if( p2 < 2 || p2 > 36)
{
cout <<
"\nZle dane. Obliczenia przerwane.\nMusisz podac liczbez zakrsu 2-36!.\n"
"Wybierz N i ponownie wprowadz dane!.\n" << endl;
continue;
}
cout << endl;
if(p2 == 2)
isp2Minus = true;
// tutaj sÜ ca-e przekszta-cenia, doda-em bym wiŕcej komentzarzy
// ale ten kawa-ek to nie do mnie nale¬y
if(DaneOK(s1,p1,p2))
{
s2 = Konwertuj(s1,p1,p2);
cout << (isMinus?"-":"") << s1 << "(" << p1 << ") = " << ((isMinus&& !isp2Minus) ? "-":"") << s2 << "(" << p2 << ")";
if(p2 == 2)
{
cout << " " << KonwertujBCD(s2,p1,p2,false) << "(BCD) ";
if(isMinus)
{
cout << KonwertujU1(s2,p1,p2,false) << "(U1) ";
cout << KonwertujU2(s2,p1,p2,false) << "(U2)";
}
}
else if(p1 == 2)
{
cout << "z U1 = "<< KonwertujU1(s1,p1,p2,true) << " z U2 = " << KonwertujU2(s1,p1,p2,true);
}
cout << "\n";
}
else
{
cout <<
"Zle dane. Obliczenia przerwane.\nJako liczbe do zamiany podano znak z poza zakresu 0-9 lub a-z.\n"
"Uruchom program ponownie lub\nwybierz N i ponownie wprowadz dane.\n";
}
cout << endl;
} while(!Koniec());
return 0;
}
Wersja js:
Kod
<html>
<head>
<title>Konwersje (Java)</title>
<meta content="text/html; charset=Windows-1250" http-equiv="content-type">
<script language="javascript" type="text/javascript">
function Konwertuj(s1, p1, p2)
{
var c, i, Lc, Lu, w;
var rLu;
var u;
var s2;
Lc = Lu = 0;
w = 1;
u = false;
s1 = s1.toUpperCase();
for(i=0; i < s1.length; i++)
{
if(s1.charAt(i) == ',')
{
u = true;
}
else
{
if( (s1.charCodeAt(i) > 64) && (s1.charCodeAt(i) < 91))
c = s1.charCodeAt(i) - 55;
else
c = s1.charCodeAt(i) - 48;
if(u)
{
Lu = p1 * Lu + c;
w *= p1;
}
else
Lc = p1 * Lc + c;
}
}
rLu = Lu / w;
s2 = "";
do
{
c = Lc % p2;
if(c < 10)
s2 = String.fromCharCode(c + 48) + s2;
else
s2 = String.fromCharCode(c + 55) + s2;
Lc = Math.floor(Lc / p2);
}while(Lc);
if(Lu)
{
s2 += ",";
while(s2.length < 32)
{
rLu *= p2;
c = Math.floor(rLu);
if(c < 10)
s2 += String.fromCharCode(c + 48);
else
s2 += String.fromCharCode(c + 55);
rLu = rLu - c;
}
while(s2.charAt(s2.length - 1) == '0')
s2 = s2.substring(0, s2.length - 1);
}
return s2;
}
function itoa(value, radix)
{
return value.toString(radix);
}
function KonwertujBCD(s, p1, p2, z)
{
var s2 = "";
var hex = parseInt(s, 2);
if(z)
{
// konwersja z kodu BCD
}
else
{
var p = "";
var i = 0;
while(s.length > i)
{
p = Konwertuj(s.substr(i, i+1), 10, 2);
var ile = p.length;
if(ile == 1)
p = "000" + p;
else if(ile == 2)
p = "00" + p;
else if(ile == 3)
p = "0" + p;
s2 += p;
i++;
}
}
return s2;
}
function KonwertujU1(s, p1, p2, z)
{
var s2 = "";
var hex = parseInt(s, 2);
if(z)
{
hex = ~hex;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length, s.length);
s2 = Konwertuj(s2, 2, p2);
}
else
{
hex = ~hex;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length - 1, s.length + 1);
}
if(s2.charAt(0) == '-')
s2 = s2.substr(1, s2.length);
return s2;
}
function KonwertujU2(s, p1, p2, z)
{
var s2 = "";
var buffer = "";
var hex = parseInt(s, 2);
if(z)
{
hex = ~hex + 1;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length, s.length);
s2 = Konwertuj(s2, 2, p2);
}
else
{
hex = ~hex + 1;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length - 1, s.length + 1);
}
if(s2.charAt(0) == '-')
s2 = s2.substr(1, s2.length);
return s2;
}
function main()
{
var s1,c,i,p1,p2,Lc,Lu,w,u,rLu,t;
var isMinus = false;
var isp2Binary = false;
s1 = document.frmprzelicz.inp_s1.value;
p1 = parseInt(document.frmprzelicz.inp_p1.value);
p2 = parseInt(document.frmprzelicz.inp_p2.value);
if(s1.charAt(0) == "-")
{
s1 = s1.substring(1, s1.length);
isMinus = true;
}
if(p2 == 2)
isp2Binary = true;
if(isNaN(p1) || isNaN(p2) || !DaneOK(s1,p1,p2))
t = "<font color=Red><b>Złe dane!</b></font>";
else
{
t = Konwertuj(s1, p1, p2);
t = ((isMinus)?"-":"") + s1 + "<sub>(" + p1 + ")</sub> = " + ((isMinus && !isp2Binary)?"-":"") +t + "<sub>(" + p2 + ")</sub>";
if(p2 == 2)
{
t += " " + KonwertujBCD(s1, p1, p2, false) + "(BCD) ";
if(isMinus)
{
t += KonwertujU1(s1, p1, p2, false) + "(U1) ";
t += KonwertujU2(s1, p1, p2, false) + "(U2)";
}
}
else if(p1 == 2)
{
t += " z U1 = " + KonwertujU1(s1, p1, p2, true) + " z U2 = " + KonwertujU2(s1, p1, p2, true);
}
}
document.getElementById("out_t").innerHTML = t;
}
function DaneOK(s,p1,p2)
{
var przecinek,i,c;
if((p1 < 2) || (p1 > 36) || (p2 < 2) || (p2 > 36))
return false;
przecinek = false;
s = s.toUpperCase();
for(i = 0; i < s.length; i++)
{
if(s.charAt(i) == ',')
{
if(przecinek)
return false;
else
{
przecinek = true;
continue;
}
}
if( ((s.charCodeAt(i) > 47) && (s.charCodeAt(i) < 58))
|| ((s.charCodeAt(i) > 64) && (s.charCodeAt(i) < 91)) )
;
else
return false;
c = s.charCodeAt(i) - 48;
if(c > 9)
c -= 7;
if(c >= p1)
return false;
};
return true;
}
function clearall()
{
document.frmprzelicz.inp_s1.value = "";
document.frmprzelicz.inp_p1.value = "";
document.frmprzelicz.inp_p2.value = "";
var t = "...";
document.getElementById("out_t").innerHTML = t;
}
</script>
</head>
<body>
<div align="center">
<form style="BORDER-RIGHT: #ff9933 1px outset;
PADDING-RIGHT: 4px;
BORDER-TOP: #ff9933 1px outset;
PADDING-LEFT: 4px;
PADDING-BOTTOM: 1px;
BORDER-LEFT: #ff9933 1px outset;
PADDING-TOP: 1px;
BORDER-BOTTOM: #ff9933 1px outset;
BACKGROUND-COLOR: #ffCC66"
name="frmprzelicz"
>
<h3 id="data_out" style="text_align: center">Przeliczenia liczb zapisanych<br>w różnych systemach pozycyjnych</h3>
<p style="TEXT_ALIGN: center">(C)2005 Siemiątkowska Dorota, Słomiany Jarosław, Szczupliński Tomasz SWPW Płock</p>
<hr>
<div align="center">
<table border="0" cellpadding="4" style="border-collapse: collapse">
<tr>
<td align="right">Liczba wejściowa =</td>
<td><input value="" name="inp_s1" id="s1" size="20" style="text-align: right"></td>
<td align="right">Podstawa wejściowa = </td>
<td><input value="" name="inp_p1" id="p1" size=20 style="text-align: right"></td>
<td align="right">Podstawa wyjściowa = </td>
<td><input value="" name="inp_p2" id="p2" size=20 style="text-align: right"></td>
</tr>
<tr></tr>
</table>
</div>
<br>
<div style="width:20%;">
<input type="button" value="Wyznacz liczbę wyjściową" name="B1" onclick="main()">
</div>
<div style="width:20%;">
<input type="button" value="Wyczyść pola" name="B2" onclick="clearall()">
</div>
<p style="TEXT-ALIGN: center" id="out_t">...</p>
</form>
</div>
</body>
</html>
<head>
<title>Konwersje (Java)</title>
<meta content="text/html; charset=Windows-1250" http-equiv="content-type">
<script language="javascript" type="text/javascript">
function Konwertuj(s1, p1, p2)
{
var c, i, Lc, Lu, w;
var rLu;
var u;
var s2;
Lc = Lu = 0;
w = 1;
u = false;
s1 = s1.toUpperCase();
for(i=0; i < s1.length; i++)
{
if(s1.charAt(i) == ',')
{
u = true;
}
else
{
if( (s1.charCodeAt(i) > 64) && (s1.charCodeAt(i) < 91))
c = s1.charCodeAt(i) - 55;
else
c = s1.charCodeAt(i) - 48;
if(u)
{
Lu = p1 * Lu + c;
w *= p1;
}
else
Lc = p1 * Lc + c;
}
}
rLu = Lu / w;
s2 = "";
do
{
c = Lc % p2;
if(c < 10)
s2 = String.fromCharCode(c + 48) + s2;
else
s2 = String.fromCharCode(c + 55) + s2;
Lc = Math.floor(Lc / p2);
}while(Lc);
if(Lu)
{
s2 += ",";
while(s2.length < 32)
{
rLu *= p2;
c = Math.floor(rLu);
if(c < 10)
s2 += String.fromCharCode(c + 48);
else
s2 += String.fromCharCode(c + 55);
rLu = rLu - c;
}
while(s2.charAt(s2.length - 1) == '0')
s2 = s2.substring(0, s2.length - 1);
}
return s2;
}
function itoa(value, radix)
{
return value.toString(radix);
}
function KonwertujBCD(s, p1, p2, z)
{
var s2 = "";
var hex = parseInt(s, 2);
if(z)
{
// konwersja z kodu BCD
}
else
{
var p = "";
var i = 0;
while(s.length > i)
{
p = Konwertuj(s.substr(i, i+1), 10, 2);
var ile = p.length;
if(ile == 1)
p = "000" + p;
else if(ile == 2)
p = "00" + p;
else if(ile == 3)
p = "0" + p;
s2 += p;
i++;
}
}
return s2;
}
function KonwertujU1(s, p1, p2, z)
{
var s2 = "";
var hex = parseInt(s, 2);
if(z)
{
hex = ~hex;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length, s.length);
s2 = Konwertuj(s2, 2, p2);
}
else
{
hex = ~hex;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length - 1, s.length + 1);
}
if(s2.charAt(0) == '-')
s2 = s2.substr(1, s2.length);
return s2;
}
function KonwertujU2(s, p1, p2, z)
{
var s2 = "";
var buffer = "";
var hex = parseInt(s, 2);
if(z)
{
hex = ~hex + 1;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length, s.length);
s2 = Konwertuj(s2, 2, p2);
}
else
{
hex = ~hex + 1;
s2 = itoa(hex, 2);
s2 = s2.substr(s2.length - s.length - 1, s.length + 1);
}
if(s2.charAt(0) == '-')
s2 = s2.substr(1, s2.length);
return s2;
}
function main()
{
var s1,c,i,p1,p2,Lc,Lu,w,u,rLu,t;
var isMinus = false;
var isp2Binary = false;
s1 = document.frmprzelicz.inp_s1.value;
p1 = parseInt(document.frmprzelicz.inp_p1.value);
p2 = parseInt(document.frmprzelicz.inp_p2.value);
if(s1.charAt(0) == "-")
{
s1 = s1.substring(1, s1.length);
isMinus = true;
}
if(p2 == 2)
isp2Binary = true;
if(isNaN(p1) || isNaN(p2) || !DaneOK(s1,p1,p2))
t = "<font color=Red><b>Złe dane!</b></font>";
else
{
t = Konwertuj(s1, p1, p2);
t = ((isMinus)?"-":"") + s1 + "<sub>(" + p1 + ")</sub> = " + ((isMinus && !isp2Binary)?"-":"") +t + "<sub>(" + p2 + ")</sub>";
if(p2 == 2)
{
t += " " + KonwertujBCD(s1, p1, p2, false) + "(BCD) ";
if(isMinus)
{
t += KonwertujU1(s1, p1, p2, false) + "(U1) ";
t += KonwertujU2(s1, p1, p2, false) + "(U2)";
}
}
else if(p1 == 2)
{
t += " z U1 = " + KonwertujU1(s1, p1, p2, true) + " z U2 = " + KonwertujU2(s1, p1, p2, true);
}
}
document.getElementById("out_t").innerHTML = t;
}
function DaneOK(s,p1,p2)
{
var przecinek,i,c;
if((p1 < 2) || (p1 > 36) || (p2 < 2) || (p2 > 36))
return false;
przecinek = false;
s = s.toUpperCase();
for(i = 0; i < s.length; i++)
{
if(s.charAt(i) == ',')
{
if(przecinek)
return false;
else
{
przecinek = true;
continue;
}
}
if( ((s.charCodeAt(i) > 47) && (s.charCodeAt(i) < 58))
|| ((s.charCodeAt(i) > 64) && (s.charCodeAt(i) < 91)) )
;
else
return false;
c = s.charCodeAt(i) - 48;
if(c > 9)
c -= 7;
if(c >= p1)
return false;
};
return true;
}
function clearall()
{
document.frmprzelicz.inp_s1.value = "";
document.frmprzelicz.inp_p1.value = "";
document.frmprzelicz.inp_p2.value = "";
var t = "...";
document.getElementById("out_t").innerHTML = t;
}
</script>
</head>
<body>
<div align="center">
<form style="BORDER-RIGHT: #ff9933 1px outset;
PADDING-RIGHT: 4px;
BORDER-TOP: #ff9933 1px outset;
PADDING-LEFT: 4px;
PADDING-BOTTOM: 1px;
BORDER-LEFT: #ff9933 1px outset;
PADDING-TOP: 1px;
BORDER-BOTTOM: #ff9933 1px outset;
BACKGROUND-COLOR: #ffCC66"
name="frmprzelicz"
>
<h3 id="data_out" style="text_align: center">Przeliczenia liczb zapisanych<br>w różnych systemach pozycyjnych</h3>
<p style="TEXT_ALIGN: center">(C)2005 Siemiątkowska Dorota, Słomiany Jarosław, Szczupliński Tomasz SWPW Płock</p>
<hr>
<div align="center">
<table border="0" cellpadding="4" style="border-collapse: collapse">
<tr>
<td align="right">Liczba wejściowa =</td>
<td><input value="" name="inp_s1" id="s1" size="20" style="text-align: right"></td>
<td align="right">Podstawa wejściowa = </td>
<td><input value="" name="inp_p1" id="p1" size=20 style="text-align: right"></td>
<td align="right">Podstawa wyjściowa = </td>
<td><input value="" name="inp_p2" id="p2" size=20 style="text-align: right"></td>
</tr>
<tr></tr>
</table>
</div>
<br>
<div style="width:20%;">
<input type="button" value="Wyznacz liczbę wyjściową" name="B1" onclick="main()">
</div>
<div style="width:20%;">
<input type="button" value="Wyczyść pola" name="B2" onclick="clearall()">
</div>
<p style="TEXT-ALIGN: center" id="out_t">...</p>
</form>
</div>
</body>
</html>