Wartość liczby pozycyjnej


Podrozdziały   Tematy pokrewne

 

System dziesiętny

W rozdziale opiszemy pozycyjne systemy liczbowe. Wiedza ta znakomicie ułatwi nam zrozumienie sposobu przechowywania liczb w pamięci komputerów. Na pierwszy ogień pójdzie system dziesiętny. Dlaczego? Po prostu jest on nam najbardziej znany.

Podstawę systemu dziesiętnego tworzy liczba 10. Jest to specjalna wartość charakteryzująca system pozycyjny, od której bierze on swoją nazwę: podstawa 10 - system dziesiętny.

Zapis liczby tworzymy za pomocą cyfr, czyli umownych znaków o przypisanych wartościach od 0 do 9. Ilość cyfr jest zawsze równa podstawie systemu, czyli w systemie dziesiętnym będzie ich dziesięć. Największa cyfra jest o 1 mniejsza od podstawy (9 = 10 - 1).

Cyfry umieszczamy na kolejnych pozycjach. Każda pozycja posiada swoją wartość, którą nazywamy wagą pozycji. Wagi pozycji są kolejnymi potęgami podstawy systemu, czyli w systemie dziesiętnym są to kolejne potęgi liczby 10:

 

wagi 1000
103
100
102
10
101
1
100
cyfry 7 5 8 2
pozycje 3 2 1 0

 

Cyfra na danej pozycji określa ile razy należy wziąć wagę tej pozycji przy wyznaczaniu wartości całej liczby. Zatem w naszym przykładzie waga 1000 występuje 7 razy, waga 100 - 5 razy, waga 10 - 8 razy i waga 1 - 2 razy. Wartość liczby otrzymujemy sumując iloczyny cyfr przez wagi pozycji, na których cyfry te występują (czyli ilości tych wag):

 

7 × 1000 + 5 × 100 + 8 × 10 + 2 × 1

 

Jeśli pozycje ponumerujemy kolejno od 0 poczynając od prawej strony zapisu liczby, to waga pozycji i-tej będzie i-tą potęgą podstawy systemu. Np. pozycja nr 3 ma wagę 103, czyli 1000, a pozycja nr 2 ma wagę 102, czyli 100.

 

Zapamiętaj:

Zbiór podstawowych cech dowolnego systemu pozycyjnego o podstawie p

  1. System pozycyjny charakteryzuje liczba zwana podstawą systemu pozycyjnego.
  2. Do zapisu liczby służą cyfry.
  3. Cyfr jest zawsze tyle, ile wynosi podstawa systemu: 0,1,2,...,(p-1)
  4. Cyfry ustawiamy na kolejnych pozycjach.
  5. Pozycje numerujemy od 0 poczynając od strony prawej zapisu.
  6. Każda pozycja posiada swoją wagę.
  7. Waga jest równa podstawie systemu podniesionej do potęgi o wartości numeru pozycji.
  8. Cyfry określają ile razy waga danej pozycji uczestniczy w wartości liczby
  9. Wartość liczby obliczamy sumując iloczyny cyfr przez wagi ich pozycji

 

Podane powyżej zasady obowiązują w każdym systemie pozycyjnym.

 

Inne systemy pozycyjne

Z matematycznego punktu widzenia system dziesiętny nie jest wyróżnionym systemem zapisu liczb. Stosowany jest zapewne z uwagi na posiadanie dziesięciu palców, które w początkowym etapie nauki pełnią rolę swoistego komputera. Z drugiej strony dzieci uczą się liczb zapisywanych właśnie w tym systemie, dlatego zwykle pod pojęciem liczby rozumiemy jej zapis dziesiętny.

Aby zrozumieć inne systemy pozycyjne należy przyjąć do wiadomości, iż wartość liczby jest niezależna od sposobu jej zapisu. Dla przykładu weźmy pojęcie DOM, które w języku niemieckim zapisuje się DAS HAUS, w angielskim THE HOUSE, a w hiszpańskim LA CASA. Zapis za każdym razem jest inny, lecz znaczenie ma to samo. Przyjmijmy do wiadomości, iż inne systemy pozycyjne, to jakby inne języki, w których daną liczbę wyraża się inaczej niż w naszym systemie dziesiętnym, ale wartość liczby pozostaje taka sama.

Podane w poprzednim rozdziale zasady obowiązują w każdym systemie pozycyjnym o dowolnej podstawie. Jeśli je zrozumiesz, systemy pozycyjne przestaną być dla ciebie tajemnicą.

Oto charakterystyka dowolnego systemu pozycyjnego:

Niech podstawą będzie liczba naturalna p większa od 1 (dla p = 1 system pozycyjny degraduje się do systemu karbowego).

System posiada p cyfr: 0,1,2, ..., (p - 1). Ostatnia cyfra jest zawsze o 1 mniejsza niż podstawa p.

Kolejne wagi pozycji będą przyjmowały wartość kolejnych potęg podstawy systemu:

 

pozycja 0 - p0
pozycja 1 - p1
pozycja 2 - p2, itd.

 

Wynika stąd prosty wniosek, iż waga każdej następnej pozycji jest p-razy większa od wagi poprzedniej pozycji.

 

Przykład:

 

Wagi 4 pozycji w różnych systemach liczbowych
Podstawa
p
Wartości wag pozycji
pozycja 4 pozycja 3 pozycja 2 pozycja 1 pozycja 0
2 24 = 16 23 = 8 22 = 4 21 = 2 20 = 1
3 34 = 81 33 = 27 32 = 9 31 = 3 30 = 1
4 44 = 256 43 = 64 42 = 16 41 = 4 40 = 1
5 54 = 625 53 = 125 52 = 25 51 = 5 50 = 1
6 64 = 1296 63 = 216 62 = 36 61 = 6 60 = 1
7 74 = 2401 73 = 343 72 = 49 71 = 7 70 = 1
8 84 = 4096 83 = 512 82 = 64 81 = 8 80 = 1
9 94 = 6561 93 = 729 92 = 81 91 = 9 90 = 1
10 104 = 10000 103 = 1000 102 = 100 101 = 10 100 = 1

 

Zwróć uwagę na ostatnią kolumnę. Wynika z niej, iż waga ostatniej pozycji w każdym systemie pozycyjnym jest taka sama i określa liczbę jednostek.

Wartość liczby obliczamy sumując iloczyny cyfr przez wagi ich pozycji. Stąd otrzymujemy wzór na wartość liczby w dowolnym systemie pozycyjnym.

 

Zapamiętaj:

Wartość dziesiętna liczby zapisanej w systemie pozycyjnym o podstawie p za pomocą ciągu cyfr

 

Cn-1Cn-2...C2C1C0 wynosi Cn-1 pn-1 + Cn-2 pn-2 + ... + C2 p2 + C1 p1 + C0 p0

 

gdzie:

C - cyfra danego systemu o podstawie p
Ci - cyfra na i-tej pozycji, i = 0,1,2,...,n-1
n - ilość cyfr w zapisie liczby
p - podstawa systemu pozycyjnego

 

Ponieważ z doświadczenia wiem, iż uczniowie nie bardzo rozumieją ten prosty wzór, podaję krok po kroku metodę obliczania wartości liczby zapisanej w dowolnym systemie pozycyjnym.

 

Przykład:

Obliczyć wartość dziesiętną liczby szóstkowej 53214(6).

  1. Ponad cyframi wypisujemy wagi pozycji, pamiętając, iż pozycje numerujemy od 0 z prawa na lewo. Wagi są kolejnymi potęgami podstawy systemu. Waga danej pozycji jest zawsze równa podstawie podniesionej do potęgi o wartości numeru pozycji.
wartość wagi 64 63 62 61 60
wartość cyfry 5  3  2  1  4 
numer pozycji  4 3 2 1 0

 

  1. Tworzymy sumę iloczynów cyfr przez wagi ich pozycji
wartość wagi 64 63 62 61 60  
wartość cyfry 5  3  2  1  4  = 5 × 64 + 3 × 63 + 2 × 62 + 1 × 61 + 4 × 60
numer pozycji  4 3 2 1 0  

 

  1. Wyliczamy wagi kolejnych pozycji
wartość wagi 64 63 62 61 60  
wartość cyfry 5  3  2  1  4  = 5 × 1296 + 3 × 216 + 2 × 36 + 1 × 6 + 4 × 1
numer pozycji  4 3 2 1 0  

 

  1. Obliczamy iloczyny cyfr przez wagi pozycji
wartość wagi 64 63 62 61 60  
wartość cyfry 5  3  2  1  4  = 6480 + 648 + 72 + 6 + 4
numer pozycji  4 3 2 1 0  

 

  1. Sumujemy iloczyny i otrzymujemy wartość liczby
wartość wagi 64 63 62 61 60  
wartość cyfry 5  3  2  1  4  = 7210
numer pozycji  4 3 2 1 0  

 

I ostatecznie piszemy 53214(6) = 7210(10). Jeśli operujemy liczbami zapisanymi w różnych systemach pozycyjnych, to w celu uniknięcia niejednoznaczności liczbę opatrujemy indeksem dolnym, w którym umieszczamy wartość podstawy systemu zapisu danej liczby. Powyższa równość oznacza, iż zapis szóstkowy i dziesiętny oznacza tę samą liczbę.

 

Algorytm obliczania wartości liczby pozycyjnej

Podsumujmy podane dotychczas informacje w formie algorytmu.

 

Specyfikacja problemu

Dane wejściowe

p - podstawa systemu pozycyjnego zapisu liczby, p ∈ N,   p ∈ {2,3,...,10}
s - tekst zawierający ciąg znaków ASCII przedstawiających cyfry.

Dane wyjściowe

Liczba L będąca wartością liczby o podstawie p i zapisanej w postaci ciągu znaków s. L ∈ N + {0}

Zmienne pomocnicze i funkcje

w - wagi kolejnych pozycji, w ∈ N
c - przechowuje wartość cyfry, c ∈ N + {0}
i - numery pozycji znaków w s, i ∈ N
kod(znak) - funkcja zwraca kod ASCII znaku
długość(tekst) - zwraca liczbę znaków zawartych w tekście

 

Lista kroków

K01: Czytaj p i s
K02: w ← 1;   L ← 0
K03: Dla i = długość(s), długość(s) - 1,...,1 wykonuj K04...K06.
K04:     c ← kod(s[i]) - kod('0')
K05:     L ← L + w × c
K06:     ww × p
K07: Pisz L
K08: Zakończ

 

Schemat blokowy

Odczytujemy podstawę p systemu liczbowego, w którym zapisana jest liczba. Podstawa musi należeć do zakresu od 2 do 10. Następnie odczytujemy ciąg znaków s reprezentujących cyfry. W zmiennych łańcuchowych pozycje znaków są numerowane od 1 (w C++, Pythonie i JavaScript od 0) począwszy od strony lewej do prawej.

Po odczytaniu danych wejściowych inicjujemy zmienne robocze. W zmiennej w będziemy tworzyć wagi kolejnych pozycji liczonych od prawej strony zapisu liczby. Ostatnia cyfra stoi na pozycji o wadze 1, dlatego do w wprowadzamy 1. Wartość liczby będzie wyliczana w zmiennej L. Na początku zmienna ta przyjmuje wartość 0. Zmienna i będzie wskazywała pozycje kolejnych cyfr począwszy od ostatniej, a skończywszy na pierwszej. Ostatnia cyfra ma numer równy liczbie znaków w zmiennej s (w C++, Pythonie i JavaScript wartość tę należy pomniejszyć o 1!).

Rozpoczynamy pętlę iteracyjną sterowaną zmienną i, która będzie w kolejnych obiegach przyjmować wartości pozycji cyfr w zapisie liczby. W pierwszym obiegu będzie to ostatnia pozycja, w drugim przedostatnia, itd. Pętla kończy się po przetworzeniu wszystkich znaków w łańcuchu s. (W C++ i JavaScript w warunku kontynuacji pętli iteracyjnej liczbę 1 zastępujemy liczbą 0.)

W pętli wyliczamy wartość cyfry. Cyfry w zmiennej s są przechowywane w postaci kodów znakowych ASCII (American Standard Code for Information Interchange - Amerykański, Standardowy Kod do Wymiany Informacji). Kody ASCII kolejnych cyfr mają wartości:

 

kod ASCII cyfry '0' = 48,
kod ASCII cyfry '1' = 49,
kod ASCII cyfry '2' = 50
...
kod ASCII cyfry '9' = 57

 

Aby zatem otrzymać wartość cyfry na podstawie jej kodu, odejmujemy od niego kod cyfry 0. Np. dla cyfry 2 otrzymamy 50 - 48 = 2. Wynik umieszczamy w zmiennej c.

Otrzymaną wartość cyfry c przemnażamy przez bieżącą wartość pozycji w i wynik dodajemy do L.

Przechodzimy do kolejnej pozycji. Waga następnej pozycji w systemie pozycyjnym jest zawsze większa p-razy od wagi pozycji bieżącej. Dlatego w przemnażamy przez p. Zmniejszamy indeks znaku i, a następnie wracamy na początek pętli.

Po zakończeniu pętli w zmiennej L mamy wartość liczby. Wypisujemy ją i kończymy algorytm.

 

Programy

Na podstawie algorytmu tworzymy programy obliczające wartość liczby podanej w systemie pozycyjnym o podstawach od 2 do 10. Zwróć uwagę, iż algorytm nie sprawdza poprawności danych wprowadzonych przez użytkownika. Zastanów się nad sposobami usunięcia tej wady.

 

Efekt uruchomienia programu
Obliczanie wartości liczby zapisanej
w systemie pozycyjnym  o podstawie p
------------------------------------
(C)2005 mgr J. Wałaszek  I LO Tarnów

Podaj p (2..10) = 8

Podaj liczbę    = 755

Liczba 755(8) = 493(10)

KONIEC. Naciśnij dowolny klawisz...

 

Borland
Delphi 7.0
Personal
Edition
// Wyznaczanie wartości liczby zapisanej
// w systemie pozycyjnym o podstawie
// p równej od 2 do 10
//--------------------------------------
// (C)2005 mgr Jerzy Wałaszek
//             I Liceum Ogólnokształcące
//             im. K. Brodzińskiego
//             w Tarnowie
//--------------------------------------

program syspoz;

{$APPTYPE CONSOLE}

var
  s : string;
  p,w,L,i,c : cardinal;

begin
  writeln('Obliczanie wartosci liczby zapisanej');
  writeln('w systemie pozycyjnym  o podstawie p');
  writeln('------------------------------------');
  writeln('(C)2005 mgr J. Walaszek  I LO Tarnow');
  writeln;
  write('Podaj p (2..10) = '); readln(p);
  writeln;
  write('Podaj liczbe    = '); readln(s);
  writeln;
  w := 1; L := 0;
  for i := length(s) downto 1 do
  begin
    c := ord(s[i]) - ord('0');
    inc(L, w * c);
    w := w * p;
  end;
  writeln('Liczba ',s,'(',p,') = ',L,'(10)');
  writeln;
  writeln('Nacisnij klawisz ENTER...');
  readln;
end.
Borland
C++ Builder
6.0
Personal
Edition
// Wyznaczanie wartości liczby zapisanej
// w systemie pozycyjnym o podstawie
// p równej od 2 do 10
//--------------------------------------
// (C)2005 mgr Jerzy Wałaszek
//             I Liceum Ogólnokształcące
//             im. K. Brodzińskiego
//             w Tarnowie
//--------------------------------------

#include <iostream>
#include <string>

using namespace std;

main()
{
  string s;
  unsigned p,w,L,c;
  int i;
  char z[1];
  
  cout << "Obliczanie wartosci liczby zapisanej\n"
          "w systemie pozycyjnym  o podstawie p\n"
          "------------------------------------\n"
          "(C)2005 mgr J. Walaszek  I LO Tarnow\n\n"
          "Podaj p (2..10) = ";
  cin >> p;
  cout << "\nPodaj liczbe    = ";
  getline(cin,s);
  getline(cin,s);
  w = 1; L = 0;
  for(i = s.length() - 1; i >= 0; i--)
  {
    c = s[i] - int('0');
    L += w * c;
    w *= p;
  }
  cout << "\nLiczba " << s << "(" << p << ") = " << L << "(10)"
          "\n\nNacisnij ENTER...\n";
  cin.getline(z,1);
}
Microsoft
Visual
Basic 2005
Express
Edition
' Wyznaczanie wartości liczby zapisanej
' w systemie pozycyjnym o podstawie
' p równej od 2 do 10
'--------------------------------------
' (C)2005 mgr Jerzy Wałaszek
'             I Liceum Ogólnokształcące
'             im. K. Brodzińskiego
'             w Tarnowie
'--------------------------------------

Option Explicit On

Module Module1

 Sub Main()

    Dim s As String
    Dim p, w, L, c As UInteger
    Dim i As Integer

    Console.WriteLine("Obliczanie wartości liczby zapisanej")
    Console.WriteLine("w systemie pozycyjnym  o podstawie p")
    Console.WriteLine("------------------------------------")
    Console.WriteLine("(C)2005 mgr J. Wałaszek  I LO Tarnów")
    Console.WriteLine()
    Console.Write("Podaj p (2..10) = ") : p = Val(Console.ReadLine)
    Console.WriteLine()
    Console.Write("Podaj liczbę    = ") : s = Val(Console.ReadLine)
    Console.WriteLine()
    w = 1 : L = 0
    For i = s.Length() - 1 To 0 Step -1
      c = Asc(s.Chars(i)) - Asc("0")
      L = L + w * c
      w = w * p
    Next
    Console.WriteLine("Liczba {0}({1}) = {2}(10)", s, p, L)
    Console.WriteLine()
    Console.WriteLine("KONIEC. Naciśnij dowolny klawisz...")
    Console.ReadLine()

  End Sub

End Module
JavaScript
<html>
  <head>
  </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="frmsyspoz">
        <h3 id="data_out" style="text-align: center">
          Obliczanie wartości liczby zapisanej<br>
          w systemie pozycyjnym o podstawie p
        </h3>
        <p style="TEXT-ALIGN: center">
          (C)2005 mgr Jerzy Wałaszek&nbsp;&nbsp; I LO w Tarnowie
        </p>
        <hr>
        <div align="center">
          <table border="0" cellpadding="4"
                 style="border-collapse: collapse">
            <tr>
              <td align="right">podstawa (2...10) =</td>
              <td>
<input value="5" name="inp_p" size="20" style="text-align: right">
              </td>
            </tr>
            <tr>
              <td align="right">liczba =</td>
              <td>
<input value="23314" name="inp_s" size="20" style="text-align: right">
              </td>
            </tr>
          </table>
        </div>
        <p style="TEXT-ALIGN: center">
          <input onclick="main();"
                 type="button"
                 value="Oblicz wartość liczby"
                 name="B1">
        </p>
        <p id="out_t" style="TEXT-ALIGN: center">...</p>
      </form>

<script language=javascript>

// Wyznaczanie wartości liczby zapisanej
// w systemie pozycyjnym o podstawie
// p równej od 2 do 10
//--------------------------------------
// (C)2005 mgr Jerzy Wałaszek
//             I Liceum Ogólnokształcące
//             im. K. Brodzińskiego
//             w Tarnowie
//--------------------------------------

function main()
{
  var s,p,w,L,c,i,t;

  p = parseInt(document.frmsyspoz.inp_p.value);
  s = document.frmsyspoz.inp_s.value;
  t = "<font color=Red><b>Złe dane</b></font>";
  if(!isNaN(p) && !(s==""))
  {
    w = 1; L = 0;
    for(i = s.length - 1; i >= 0; i--)
    {
      c = s.charCodeAt(i) - 48;
      L += c * w;
      w *= p;
    };
    t = s + "<sub>(" + p + ")</sub> = " + L + "<sub>(10)</sub>";
  };
  document.getElementById("out_t").innerHTML = t;
}
</script>
    </div>
  </body>
</html>

 

Tutaj możesz przetestować działanie prezentowanego skryptu:

Obliczanie wartości liczby zapisanej
w systemie pozycyjnym o podstawie p

(C)2005 mgr Jerzy Wałaszek   I LO w Tarnowie
podstawa (2...10) =
liczba =

...

 


DLA
GENIUSZA

Zadania

Zadanie 1 (proste)

Oblicz wartości podanych poniżej liczb pozycyjnych:
1221(3) =   

.

2333(4) =   

.

42231(5) =   

.

435(6) =   

.

6883(9) =   

.

 

Zadanie 2 (proste)

Zinterpretuj zapis 1111 kolejno jako liczbę dwójkową, czwórkową, ósemkową i oblicz jej wartość dziesiętną.
1111(2) =   

.

1111(4) =   

.

1111(8) =   

.

 

Zadanie 3 (proste)

Jaką rolę spełniają cyfry w zapisie liczby?

 

Zadanie 4 (dosyć proste)

Dla jakiej najmniejszej wartości podstawy systemu pozycyjnego zapis 25014 ma sens jako zapis liczby.
pmin =   

.

 Odpowiedź uzasadnij.

 

Zadanie 5 (dosyć proste)

W pewnym systemie pozycyjnym o podstawie p liczba o zapisie 23(p) ma wartość dziesiętną 13(10). Oblicz wartość podstawy p tego systemu.
p =   

.

 

Zadanie 6 (średnio trudne)

W pewnym systemie pozycyjnym o podstawie p wartość dwucyfrowej liczby, której zapis zbudowany jest z dwóch identycznych cyfr tego systemu, jest równa dziesięciokrotnej wartości cyfry użytej w zapisie. Wyznacz podstawę tego systemu.
p =   

.

 

Zadanie 7 (średnio trudne)

Jak zmieni się zapis n-cyfrowej liczby w systemie pozycyjnym o podstawie p, jeśli jej wartość przemnożymy przez pm, gdzie m = 1,2,3,... ?

 

Podsumowanie

Przeanalizuj podany w tym rozdziale algorytm i wyznacz dla n-cyfrowej liczby ilość wymaganych operacji odejmowania, dodawania i mnożenia. Wyniki zapisz w odpowiedniej tabelce. Posłużą nam one później do celów porównawczych z algorytmem Hornera.

 


Zobacz dalej...

Schemat Hornera | Przeliczenia na inny zapis pozycyjny | Wartość liczby stałoprzecinkowej | Przeliczanie na zapis stałoprzecinkowy | Systemy pozycyjne o podstawie większej od 10 | Zapis zmiennoprzecinkowy



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.