|
Serwis Edukacyjny Nauczycieli I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
W systemach o podstawie p większej od 10 obowiązują wszystkie podane przez nas wzory i algorytmy. Jedyną różnicą są cyfry, których musi być dokładnie tyle ile wynosi podstawa p. Niestety, cyfr "wymyślono" tylko 10. Brakujące cyfry zastępujemy kolejnymi literkami alfabetu, I tak:
| litera A (lub a) odpowiada cyfrze o
wartości 10 litera B (lub b) odpowiada cyfrze o wartości 11 litera C (lub c) odpowiada cyfrze o wartości 12 ... |
Sposób ten pozwala nam zapisywać liczby w systemach pozycyjnych o podstawie od 2 do 36. Dla większych podstaw musimy wymyślić inną formę przedstawiania cyfr, ponieważ braknie nam literek. Na szczęście są to problemy czysto teoretyczne, ponieważ w informatyce będziemy się spotykać tylko z systemem dwójkowym, ósemkowym, dziesiętnym oraz szesnastkowym. Inne systemy stosowane są marginalnie.
Przykład:
Oblicz wartość liczby pozycyjnej ABCD,EF(16).
| ABCD,EF(16)= A · 163+ B · 162+ C · 161+ D · 160+ E · 16-1+ F · 16-2 |
Zastępujemy znaki cyfr ich wartościami liczbowymi:
| ABCD,EF(16)= 10 · 163+ 11 · 162+ 12 · 161+ 13 · 160+ 14 · 16-1+ 15 · 16-2 ABCD,EF(16)= 10 · 4096 + 11 · 256 + 12 · 16 + 13 · 1 + 14 · 1/16+ 15 · 1/256 ABCD,EF(16)= 40960 + 2816 + 192 + 13 + 14/16+ 15/256 ABCD,EF(16)= 43981 + 224/256+ 15/256 ABCD,EF(16)= 43981 + 239/256= 43981,93359375(10) |
Przelicz liczbę dziesiętną 2427,423 na system piętnastkowy z dokładnością do 6 cyfr po przecinku.
W systemie piętnastkowym mamy piętnaście cyfr {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E}.
Rozdzielamy liczbę na część całkowitą i ułamkową i wyznaczamy wartości kolejnych cyfr, które następnie zastępujemy odpowiadającymi tym wartością znakami cyfr.
| 2427 div 15 = | 161 | i reszta 12 | - cyfra C |
| 161 div 15 = | 10 | i reszta 11 | - cyfra B |
| 10 div 15 = | 0 | i reszta 10 | - cyfra A |
| 2427(10)= ABC(15) |
| 0,423 · 15 = | 6,345 | - cyfra 6 |
| 0,345 · 15 = | 5,175 | - cyfra 5 |
| 0,175 · 15 = | 2,625 | - cyfra 2 |
| 0,625 · 15 = | 9,375 | - cyfra 9 |
| 0,375 · 15 = | 5,625 | - cyfra 5 |
| 0,625 · 15 = | 9,375 | - cyfra 9 |
| 0,423(10)= 0,652959...(15) |
Ponieważ w części ułamkowej nie otrzymaliśmy zera, wyznaczona liczba ma
wartość przybliżoną.
Składamy obie wyznaczone części liczby w jedną całość i otrzymujemy wynik:
| 2427,423(10)= ABC,652959...(15) |
Aby poprawnie przeliczać liczby w systemach o p > 10, podamy dwa proste algorytmy, które kojarzą znak cyfry w postaci ASCII z jej wartością. Algorytmy te wykorzystujemy w programach przy przekształcaniu wartości cyfry na odpowiadający jej znak ASCII oraz przy wyliczaniu wartości cyfry na podstawie jej znaku ASCII.
| Obliczanie wartości cyfry ze znaku ASCII |
|---|
|
| Obliczanie znaku ASCII reprezentującego daną cyfrę |
|---|
|
Program przelicza liczby z jednego systemu pozycyjnego (podstawa od 2 do 36) na inny (podstawa od 2 do 36), wykorzystując podane wcześniej algorytmy. W obliczeniach na dalszych pozycjach po przecinku mogą pojawić się błędy spowodowane zaokrąglaniem wartości zmiennoprzecinkowych.
C++// Program przeliczający
// liczby z jednego systemu
// pozycyjnego na inny.
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
// Funkcja zadaje użytkownikowi
// pytanie, czy chce zakończyć
// pracę z programem. Jeśli tak,
// zwraca wartość logiczną true.
//------------------------------
bool Koniec()
{
string s;
cout << "Koniec? (T = TAK) ";
cin >> s;
return ((s != "") &&
(toupper(s[0]) == 'T'));
}
// Funkcja sprawdza, czy użytkownik
// wprowadził poprawne dane
// wejściowe. W takim przypadku
// zwraca wartość true, inaczej
// zwraca false.
//---------------------------------
bool DaneOK(string & s,
unsigned p1,
unsigned p2)
{
bool przecinek;
unsigned long i,c;
if((p1 < 2) || (p1 > 36) ||
(p2 < 2) || (p2 > 36))
return false;
przecinek = false;
for(i = 0; i < s.length(); i++)
{
s[i] = toupper(s[i]);
if(s[i] == ',')
{
if(przecinek)
return false;
else
{
przecinek = true;
continue;
}
}
if((s[i] < '0') ||
(s[i] > 'Z') ||
((s[i] > '9')
&& (s[i] < 'A')))
return false;
c = s[i] - 48;
if(c > 9) c -= 7;
if(c >= p1) return false;
}
return true;
}
// **********************
// *** PROGRAM GŁÓWNY ***
// **********************
main()
{
string s1,s2;
unsigned c,i,p1,p2,Lc,Lu,w;
bool u;
double rLu;
cout <<
"Przeliczanie liczb zapisanych\n"
"w roznych systemach pozycyjnych\n"
"-------------------------------\n"
"(C)2005 mgr Jerzy Walaszek\n";
do
{
cout << "\nLiczba wejsciowa = ";
cin >> s1;
cout << "\nPodstawa wejsciowa = ";
cin >> p1;
cout << "\nPodstawa docelowa = ";
cin >> p2;
cout << endl;
if(DaneOK(s1,p1,p2))
{
Lc = Lu = 0;
w = 1;
u = false;
for(i = 0; i < s1.length(); i++)
if(s1[i] == ',')
u = true;
else
{
c = s1[i] - 48;
if(c > 9) c -= 7;
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 += ',';
// ograniczamy cyfry
// po przecinku
w = (15 * logl(10) /
logl(p2));
while((w > 0) &&
(s2.length() < 32))
{
w--;
rLu *= p2;
c = (unsigned)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);
}
cout << s1 << "(" << p1 << ") = "
<< s2 << "(" << p2 << ")\n";
}
else
cout << "Zle dane!\n";
cout << endl;
} while(!Koniec());
return 0;
}
|
Pascal// Program przeliczający
// liczby z jednego systemu
// pozycyjnego na inny.
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//---------------------------
program Systemy;
{$APPTYPE CONSOLE}
// Funkcja zadaje użytkownikowi
// pytanie, czy chce zakończyć
// pracę z programem. Jeśli tak,
// zwraca wartość logiczną true.
//------------------------------
function Koniec : boolean;
var
s : string;
begin
write('Koniec? (T = TAK)');
readln(s);
Koniec := (s <> '') and
(UpCase(s[1]) = 'T');
end;
// Funkcja sprawdza, czy użytkownik
// wprowadził poprawne dane
// wejściowe. W takim przypadku
// zwraca wartość true, inaczej
// zwraca false.
//---------------------------------
function DaneOK(var s : string;
p1,p2 : cardinal) : boolean;
var
przecinek : boolean;
i,c : cardinal;
begin
DaneOK := true;
if (p1 < 2) or (p1 > 36) or
(p2 < 2) or (p2 > 36) then
DaneOK := false;
while (s <> '') and
(s[1] = ' ') do
Delete(s,1,1);
przecinek := false;
for i := 1 to length(s) do
case UpCase(s[i]) of
',' :
if przecinek then
begin
DaneOK := false;
break;
end
else
przecinek := true;
'0'..'9',
'A'..'Z':
begin
c := ord(UpCase(s[i])) - 48;
if c > 9 then dec(c,7);
if c >= p1 then
begin
DaneOK := false;
break;
end;
end;
else
begin
DaneOK := false;
break;
end;
end;
end;
// **********************
// *** PROGRAM GŁÓWNY ***
// **********************
var
s1,s2 : string;
c,i,p1,p2,Lc,Lu,w : cardinal;
u : boolean;
rLu : real;
begin
writeln(
'Przelicznik liczb zapisanych w roznych');
writeln(
' systemach pozycyjnych');
writeln(
'--------------------------------------');
writeln(
'(C)2005 mgr Jerzy Walaszek I LO Tarnow');
repeat
writeln;
write('Podaj liczbe wejsciowa = ');
readln(s1);
writeln;
write('Podaj podstawe wejsciowa = ');
readln(p1);
writeln;
write('Podaj podstawe docelowa = ');
readln(p2);
writeln;
if DaneOK(s1,p1,p2) then
begin
Lc := 0;
Lu := 0;
w := 1;
u := false;
for i := 1 to length(s1) do
if s1[i] = ',' then
u := true
else
begin
c := ord(UpCase(s1[i])) - 48;
if c > 9 then dec(c,7);
if u then
begin
Lu := p1 * Lu + c;
w := p1 * w;
end
else
Lc := p1 * Lc + c;
end;
rLu := Lu / w;
s2 := '';
repeat
c := Lc mod p2;
if c < 10 then
s2 := char(c + 48) + s2
else
s2 := char(c + 55) + s2;
Lc := Lc div p2;
until Lc = 0;
if Lu > 0 then
begin
s2 := s2 + ',';
// ograniczamy cyfry po przecinku
w := Round(15 * ln(10) / ln(p2));
while (w > 0) and
(length(s2) < 32) do
begin
dec(w);
rLu := rLu * p2;
c := trunc(rLu);
if c < 10 then
s2 := s2 + char(c + 48)
else
s2 := s2 + char(c + 55);
rLu := rLu - c;
end;
while s2[length(s2)] = '0' do
Delete(s2,length(s2),1);
end;
writeln(s1,'(',p1,') = ',
s2,'(',p2,')');
end
else
writeln('Zle dane.');
writeln;
until Koniec;
end.
|
Basic' Program przeliczający
' liczby z jednego systemu
' pozycyjnego na inny.
'---------------------------
' (C)2005 mgr Jerzy Wałaszek
' I Liceum Ogólnokształcące
' w Tarnowie
'---------------------------
' Funkcja zadaje użytkownikowi
' pytanie, czy chce zakończyć
' pracę z programem. Jeśli tak,
' zwraca wartość logiczną true.
'------------------------------
Function Koniec As Boolean
Dim As String s
Input "Koniec? (T = TAK) ", s
s = Ucase(s)
Return s = "T"
End Function
' Funkcja sprawdza, czy użytkownik
' wprowadził poprawne dane
' wejściowe. W takim przypadku
' zwraca wartość true, inaczej
' zwraca false.
'---------------------------------
Function DaneOK(ByVal s As String, _
ByVal p1 As UInteger, _
ByVal p2 As UInteger) _
As Boolean
Dim As Boolean przecinek
Dim As UInteger i,c,x
If (p1 < 2) Or (p1 > 36) Or _
(p2 < 2) Or (p2 > 36) Then
Return False
End If
s = LTrim(s)
przecinek = False
For i = 0 To Len(s) - 1
x = s[i]
If x = Asc(",") Then
If przecinek Then
Return False
Else
przecinek = True
End If
ElseIf (x >= Asc("0") And _
x <= Asc("9")) Or _
(x >= Asc("A") And _
x <= Asc("Z")) Then
c = x - 48
If c > 9 Then c = c - 7
If c >= p1 Then Return False
Else
Return False
End If
Next
Return True
End Function
Dim As String s1, s2
Dim As UInteger c, i, p1, p2, Lc, Lu, w
Dim As Boolean u
Dim As Double rLu
Print _
"Przelicznik liczb zapisanych w roznych"
Print _
" systemach pozycyjnych"
Print _
"--------------------------------------"
Print _
"(C)2005 mgr Jerzy Walaszek"
Do
Print
Line Input "Liczba wejsciowa = ", s1
s1 = UCase(s1)
Print
Input "Podstawa wejsciowa = ", p1
Print
Input "Podstawa docelowa = ", p2
Print
If DaneOK(s1, p1, p2) Then
Lc = 0
Lu = 0
w = 1
u = False
For i = 0 To Len(s1) - 1
If s1[i] = Asc(",") Then
u = True
Else
c = s1[i] - 48
If c > 9 Then c = c - 7
If u Then
Lu = p1 * Lu + c
w *= p1
Else
Lc = p1 * Lc + c
End If
End If
Next
rLu = Lu / w
s2 = ""
Do
c = Lc Mod p2
If c < 10 Then
s2 = Chr(c + 48) + s2
Else
s2 = Chr(c + 55) + s2
End If
Lc \= p2
Loop Until Lc = 0
If Lu > 0 Then
s2 += ","
w = Int(15 * Log(10) / Log(p2))
While (w > 0) And (Len(s2) < 32)
w -= 1
rLu *= p2
c = Int(rLu)
If c < 10 Then
s2 += Chr(c + 48)
Else
s2 += Chr(c + 55)
End If
rLu -= c
WEnd
s2 = RTrim(s2, "0")
End If
Print s1;"(";p1;") = ";s2;"(";p2;")"
Else
Print "Złe dane."
End If
Print
Loop Until Koniec
End
|
Python
(dodatek)# Program przeliczający
# liczby z jednego systemu
# pozycyjnego na inny.
#---------------------------
# (C)2005 mgr Jerzy Wałaszek
# I Liceum Ogólnokształcące
# w Tarnowie
#---------------------------
import math
# Funkcja zadaje użytkownikowi
# pytanie, czy chce zakończyć
# pracę z programem. Jeśli tak,
# zwraca wartość logiczną true.
#------------------------------
def koniec():
s = input("Koniec? (T = TAK) ")
s = s.upper()
return s == "T"
# Funkcja sprawdza, czy użytkownik
# wprowadził poprawne dane
# wejściowe. W takim przypadku
# zwraca wartość true, inaczej
# zwraca false.
#---------------------------------
def daneok(s,p1,p2):
if (p1 < 2) or (p1 > 36) or \
(p2 < 2) or (p2 > 36):
return False
s = s.lstrip()
p = False
for x in s:
if x == ",":
if p:
return False
else:
p = True
elif (x >= "0" and \
x <= "9") or \
(x >= "A" and \
x <= "Z"):
c = ord(x) - 48
if c > 9: c -= 7
if c >= p1:
return False
else:
return False
return True
print("Przelicznik liczb zapisanych")
print("w roznych systemach pozycyjnych")
print("-------------------------------")
print("(C)2005 mgr Jerzy Wałaszek")
while True:
print()
s1 = input("Liczba wejściowa = ")
s1 = s1.upper()
print()
p1 = input("Podstawa wejściowa = ")
p1 = int(p1)
print()
p2 = input("Podstawa docelowa = ")
p2 = int(p2)
print()
if daneok(s1, p1, p2):
Lc = 0
Lu = 0
w = 1
u = False
for x in s1:
if x == ",":
u = True
else:
c = ord(x) - 48
if c > 9: c -= 7
if u:
Lu = p1 * Lu + c
w *= p1
else:
Lc = p1 * Lc + c
rLu = Lu / w
s2 = ""
while True:
c = Lc % p2
if c < 10:
s2 = chr(c + 48) + s2
else:
s2 = chr(c + 55) + s2
Lc //= p2
if Lc == 0:
break
if Lu > 0:
s2 += ","
w = int(15 * math.log(10) /
math.log(p2))
while (w > 0) and \
(len(s2) < 32):
w -= 1
rLu *= p2
c = int(rLu)
if c < 10:
s2 += chr(c + 48)
else:
s2 += chr(c + 55)
rLu -= c
s2 = s2.rstrip("0")
print(f"{s1}({p1}) = {s2}({p2})")
else:
print("Złe dane.")
print()
if koniec():
break
|
| Wynik: |
Przelicznik liczb zapisanych w różnych systemach pozycyjnych ------------------------------- (C)2005 mgr Jerzy Wałaszek Liczba wejściowa = 22,1 Podstawa wejściowa = 3 Podstawa docelowa = 5 22,1(3) = 13,131313131313131313131(5) Koniec? (T = TAK) T |
JavaScript<html>
<head>
</head>
<body>
<div style="overflow-x: auto;"
align="center">
<table
border="0"
cellpadding="4"
style="border-collapse:
collapse">
<tr>
<td nowrap>
<form
name="frm"
style="text-align: center;
background-color:
#E7E7DA">
<b>Przeliczanie liczb
zapisanych<br/>
w różnych systemach
pozycyjnych</b><br/><br/>
(C)2026 mgr Jerzy Wałaszek
<hr>
<div align=center>
<table
style="border-collapse:
collapse;"
border="0" cellpadding="4">
<tr>
<td align="right">
Liczba wejściowa =
</td>
<td>
<input value="12,75"
name="inp_s1"
size="15"
style="text-align:
right;">
</td>
</tr>
<tr>
<td align="center">
Podstawa wejściowa
2...36 =
</td>
<td>
<input
value="10"
name="inp_p1"
size="15"
style="text-align:
right;">
</td>
</tr>
<tr>
<td align="center">
Podstawa docelowa
2...36 =
</td>
<td>
<input
value="2"
name="inp_p2"
size="15"
style="text-align:
right;">
</td>
</tr>
<tr>
<td colspan="2"
align="center">
<input
onclick="main();"
value="Oblicz"
name="B1"
type="button">
</td>
</tr>
</table>
</div>
<hr>
<b>Wynik:</b>
<div id="out">.</div>
</form>
</td>
</tr>
</table>
</div>
<script language="javascript">
// Program przeliczający
// liczby z jednego
// systemu pozycyjnego
// na inny.
//---------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//---------------------------
// Funkcja sprawdza, czy
// użytkownik wprowadził
// poprawne dane wejściowe.
// W takim przypadku
// zwraca wartość true,
// inaczej zwraca false.
//------------------------
function DaneOK(s,p1,p2)
{
var przecinek,i,c;
if((p1 < 2) || (p1 > 36) ||
(p2 < 2) || (p2 > 36))
return false;
przecinek = false;
for(i = 0; i < s.length; i++)
{
if(s.charAt(i) == ',')
{
if(przecinek) return false;
else
{
przecinek = true;
continue;
}
}
if((s.charAt(i) < '0') ||
(s.charAt(i) > 'Z') ||
((s.charAt(i) > '9') &&
(s.charAt(i) < 'A')))
return false;
c = s.charCodeAt(i) - 48;
if(c > 9) c -= 7;
if(c >= p1) return false;
};
return true;
}
// **********************
// *** PROGRAM GŁÓWNY ***
// **********************
function main()
{
var s1,c,i,p1,p2,Lc,Lu,w,u,rLu,t;
s1 = document.frm.inp_s1.value;
s1 = s1.toUpperCase();
p1 = parseInt(document.frm
.inp_p1.value);
p2 = parseInt(document.frm
.inp_p2.value);
if(isNaN(p1) || isNaN(p2) ||
!DaneOK(s1,p1,p2))
t = "<span style='color:Red;'>" +
"<b>Złe dane!</b></span>";
else
{
Lc = Lu = 0;
w = 1;
u = false;
for(i = 0; i < s1.length; i++)
if(s1.charAt(i) == ',')
u = true;
else
{
c = s1.charCodeAt(i) - 48;
if(c > 9) c -= 7;
if(u)
{
Lu = p1 * Lu + c;
w *= p1;
}
else
Lc = p1 * Lc + c;
}
rLu = Lu / w;
t = "";
do
{
c = Lc % p2;
if(c < 10)
t = String.fromCharCode(
c + 48) + t;
else
t = String.fromCharCode(
c + 55) + t;
Lc = Math.floor(Lc / p2);
} while(Lc);
if(Lu)
{
t += ',';
// ograniczamy cyfry po przecinku
w = (15 * Math.log(10) /
Math.log(p2));
while((w > 0) && (t.length < 32))
{
w--;
rLu *= p2;
c = Math.floor(rLu);
if(c < 10)
t += String
.fromCharCode(c + 48);
else
t += String
.fromCharCode(c + 55);
rLu = rLu - c;
}
while(t.charAt(t.length-1) == '0')
t = t.substring(0,t.length-1);
}
t = s1 + "<sub>(" + p1 + ")</sub>= " +
t + "<sub>(" + p2 + ")</sub>";
}
document.getElementById("out")
.innerHTML = t;
}
</script>
</body>
</html> |
Oblicz wartości podanych poniżej liczb pozycyjnych:
Przelicz liczbę dziesiętną o wartości 9999(10) kolejno na systemy pozycyjne. Cyfry dodatkowe wpisuj dużymi literkami.
Oblicz wartości podanych poniżej liczb stałoprzecinkowych. Wynik wpisz w postaci części całkowitej i ułamka właściwego, np. 276 2/37. Część całkowitą oddziel od ułamka dokładnie jedną spacją.
Przedstaw liczbę 2893,746(10)w systemie dwudziestkowym z dokładnością do 5 cyfr po przecinku.
W praktyce spotykamy tylko jeden system pozycyjny o podstawie większej od 10 - system szesnastkowy. Jest on powszechnie stosowany do reprezentacji kodów binarnych z uwagi na prostotę konwersji szesnastkowo binarnej. Pozostałe systemy mają znaczenie tylko teoretyczne.
Zobacz dalej...
Wartość liczby pozycyjnej | Schemat Hornera | Przeliczenia na inny zapis pozycyjny | Wartość liczby stałoprzecinkowej | Przeliczanie na zapis stałoprzecinkowy | Zapis zmiennoprzecinkowy
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.