SL-02 |
Systemy liczbowe |
|
3 EC |
Monika Turowska |
AGH WEAIiE KANiUP |
2011/2012 |
Lab. Podstaw Sterowania Logicznego |
|
Temat: Systemy pomiarowe
Obiekt: program komputerowy zrealizowany z wykorzystaniem języka Basic służący do przeliczania podanej liczby pomiędzy dwoma dowolnymi systemami liczbowymi
Narzędzia: Kompirator FreeBasic języka Basic
Cel ćwiczenia: napisanie programu służącego do przeliczania podanej liczby pomiędzy dwoma dowolnymi systemami liczbowymi.
Opracowanie ćwiczenia:
System pomiarowy - to odpowiednio zorganizowany zestaw elementów stanowiący całość organizacyjną i objęty wspólnym sterowaniem, przeznaczony do wydobycia informacji pomiarowej z obiektu badanego i przekazania jej obserwatorowi w użytecznej formie.
W celu realizacji ćwiczenia, aby zamienić liczbę program musi po pierwsze zamienić ją na system dziesiętny, następnie przeliczyć ją na system zadany.
Liczby są przeliczane pomiędzy naturalnymi pozycyjnymi systemami liczbowymi, dla których zachodzi równość:
gdzie:
- jest wagą cyfry: n-1 potęgą podstawy systemu liczbowego p;
- jest cyfrą na n-1 pozycji w liczbie, odpowiadającej n-1 potędze podstawy p.
Aby przeliczyć liczbę z dowolnego systemu liczbowego na system dziesiętny, należy każdą kolejną cyfrę przeliczanej liczby pomnożyć przez jej wagę, a następnie zsumować. W przypadku, gdy podstawa liczby przeliczanej jest większa od dziesięciu, program musi dokonać zamiany kodu ASCII odczytanego znaku na wartość liczby, której znak ten odpowiada.
Natomiast, aby przeliczyć liczbę z systemu dziesiętnego na inny, dowolny system liczbowy, wykonujemy dzielenie z resztą liczby przez podstawę systemu liczbowego, na który jest przeliczana. Iloraz tych liczb ponownie dzielimy przez podstawę systemu liczbowego, aż do wyniku 0. Reszty z dzielenia zapisujemy od końca.
Algorytm konwersji liczb:
Dane: liczba `LICZ' - prawidłowa liczba naturalna w systemie dziesiętnym oraz system liczbowy `Q', do którego będziemy dokonywać konwersji
Wynik: liczba `WYN' powstała w wyniku zapisania liczby LICZ w systemie liczbowym Q
Liczbie wynikowej `WYN' przypisujemy ciąg pusty, tak, że jej zawartość jest pusta
Jeśli `Q'>10, to dla każdej z liczb od 10 do `Q'-1 (włącznie) wprowadzamy specjalne oznaczenie (zwyczajowo przyjmuje się 10=A, 11=B, 12=C, 13=D itd.)
Dopóki liczba `LICZ' jest różna od 0:
zmiennej pomocniczej `POM' przypisujemy resztę z dzielenia `LICZ'/'Q'
jeśli `POM'<10, to do liczby wynikowej `WYN' dopisujemy cyfrę `POM'
jeśli `POM'>=10, to do liczby wynikowej `WYN' dopisujemy jako cyfrę ten symbol, który odpowiada liczbie `POM'
`LICZ' przypisujemy część całkowitą z ilorazu `LICZ'/'Q'
Odwracamy kolejność cyfr w liczbie `WYN' i kończymy algorytm. Liczba wynikowa to liczba `WYN'.
Kod programu:
1 Dim p As Integer |
'deklaracja zmiennej p - podstawa wprowadzanej liczby, zmienna typu liczba całkowita' |
2 Dim b As String |
'zmienna b - podstawa liczby przeliczanej, zmienna typu łańcuch znaków(tekst)' |
3 Dim przel As Integer |
'zmienna przel - podstawa konwertowanej liczby' |
4 Dim kod As Integer |
'zmienna kod - zwraca wartość kodu ASCII podanego znaku przy pomocy funkcji Asc()' |
5 Dim znak As String |
'zmienna znak - zawiera zwrócony przy pomocy instrukcji Mid$() fragment tekstu (wprowadzonej liczby) ' |
6 Dim k As Integer |
'zmienna k - podaje przy pomocy instrukcji Len() ilość znaków zadanego tekstu ' |
7 Dim i As Integer |
'zmienna i - pozycja znaku w zamienianej na tekst liczbie, użyta w pętli for' |
8 Dim cyfra As Integer |
'zmienna cyfra - kod ASCII danej cyfry po rozróżnieniu znaków' |
9 Dim liczb10poj As Integer |
'zmienna liczb10poj -wartość dziesiętna pojedynczej cyfry w liczbie dziesiętnej' |
10 Dim reszta As Integer
|
'zmienna reszta - zwraca resztę z dzielenia liczby dziesiętnej przez podstawę liczby konwertowanej (przy pomocy instrukcji Mod)' |
11 Dim calkowita As Integer
|
'zmienna całkowita - zwraca wartość całkowitą z dzielenia liczby dziesiętnej przez podstawę liczby konwertowanej (przy pomocy instrukcji Fix()' |
12 Dim As Integer wynik_dzies=0
|
'zmienna a - podaje przy pomocy instrukcji Len() ilość znaków zmiennej u zmienna wynik_dzies - ustawiona na wartość początkową równą zero, zawiera wartość liczby przeliczanej na system dziesiętny' |
13 Dim u As String |
'zmienna u - zawiera w postaci tekstu cyfry przekonwertowanej liczby' |
14 Dim koncowy_wynik As String |
'zmienna końcowy_wynik - ostateczny wynik konwersji liczb w postaci łańcucha znaków' |
15 Dim znak_2 As String
|
'zmienna znak_2 - zawiera zwrócony przy pomocy instrukcji Chr$()znak tekstowy odpowiadający podanemu kodowi ASCII (dla 40 przekonwertowanej liczby)' |
16 Input "Podaj podstawe liczby:",p |
'wprowadzenie wartości zmiennej p' |
17 Input "Podaj liczbe przeliczana:",b |
'wprowadzenie wartości zmiennej b' |
18 k=Len(b) |
'wpisuje do zmiennej k ilość znaków wprowadzonej liczby' |
19 For i=1 To k |
'pętla for służąca do obliczania kodu ASCII pojedynczych znaków wprowadzonej liczby' |
20 znak=Mid$(b,i,1) |
'zwraca odpowiedni fragment wprowadzonej liczby' |
21 kod=Asc(znak) |
'zwraca wartość kodu ASCII zmiennej znak' |
22 If kod>=Asc("0")And kod<=Asc("9") Then |
'pętla if służąca do wyliczenia kodu ASCII z rozróżnieniem cyfr od 0 do 9 oraz liter od A do F dla systemów liczbowych o podstawie większej niż 10' |
23 cyfra=kod-Asc("0") |
'przyjmuje wartość dla cyfr od 0 do 9' |
24 ElseIf kod<=Asc("F")And kod>=Asc("A") Then |
|
25 cyfra=kod-Asc("A")+10 |
'przyjmuje wartość dla liter od A do F' |
26 ElseIf kod<=Asc("f")And kod>=Asc("a") Then |
|
27cyfra=kod-Asc("a")+10 |
'umożliwia wpisywanie również małych liter od a do f' |
28 End If |
'zakończenie pętli if' |
29 If cyfra>=p Then |
'porównuje zmienną cyfra ze zmienną p (podstawę wprowadzonej liczby) gdy wprowadzona liczba jest nieprawidłowa kończy program' |
30 Print "Podana liczba jest nieprawidlowa |
'wypisuje informację na ekranie' |
31 End |
'kończy program' |
32 End If |
'zakończenie pętli if' |
33 liczb10poj=cyfra*(p^(k-i))
|
'oblicza wartość pojedynczej liczby dziesiętnej k- ilość cyfr w liczbie i - numer pozycja danej cyfry' |
34 wynik_dzies +=liczb10poj |
'wprowadzona liczba przeliczona na system dziesiętny' |
35 Next i
|
|
36 Print "Liczba dziesietnie wynosi:";wynik_dzies |
'wypisuje na ekranie wynik dziesiętnie' |
37 Input "Podaj podstawe konwertowanej liczby:",przel
|
'wprowadzenie wartości zmiennej przel' |
38 Do |
'pętla do - przeliczanie liczby z systemu dziesiętnego na dowolny od 2 do 16' |
39 reszta=wynik_dzies Mod przel |
'zwraca resztę z dzielenia' |
40calkowita=Fix(wynik_dzies/przel |
'zwraca liczbę całkowitą z dzielenia' |
41 If reszta >= 0 And reszta <= 9 Then |
'pętla if do wyznaczenia zmiennej znak_2 ' |
42znak_2=Chr$(reszta+Asc("0"))
|
'gdy cyfra w liczbie zawiera się od 0 do 9' |
43 ElseIf reszta >= 10 And reszta <= 15 Then |
|
44 znak_2=Chr$(reszta+Asc("A")-10) |
'gdy cyfra w liczbie zawiera się od 10 do 15' |
45 End If |
|
46 Print"";wynik_dzies;"/";przel;"=";calkowita;" r";reszta
|
'pokazuje na ekranie algorytm konwersji liczby z systemu dziesiętnego na dwójkowy' |
47 u=u+Str(znak_2) |
|
48 wynik_dzies=calkowita |
'kolejna dzielona liczba jest równa zwróconej liczbie całkowitej z poprzedniego dzielenia' |
49 Loop Until calkowita=0 |
'wykonuje w pętli do momentu, gdy zmienna calkowita=0' |
50 a=Len(u) |
'wpisuje do zmiennej a ilość znaków zmiennej tekstowej u' |
51 Do |
|
52 If a=0 Then |
'pętla do służąca do wyświetlenia na ekranie końcowego wyniku' |
53 Print " ";b;"(";p;" )";"=";koncowy_wynik;"(";przel;" )" |
'wyświetla na ekranie końcowy wynik konwersji'
|
54 Exit Do |
'kończy pętlę do' |
55 Else |
|
56koncowy_wynik=koncowy_wynik+Mid$ (u,a,1)
|
'zmienna tekstowa tworząca wynik w postaci łańcucha znaków' |
57 a=a-1 |
'odejmuje od zmiennej a do momentu, gdy a=0' |
58 End If |
|
59 Loop |
|
60 Print "Nacisnij dowolny klawisz aby wyjsc z programu..."
|
'program zatrzymuje się przed zakończeniem i czeka na naciśnięcie dowolnego klawisza' |
61 Do While Len(inkey)=0 |
|
62 Sleep 50 |
|
63 Loop |
|
Wnioski: W ćwiczeniu uzyskaliśmy w program służący do przeliczania liczby pomiędzy dwoma dowolnymi systemami liczbowymi.
Program zawiera podstawowe wymagania, takie jak:
obsługiwanie liczb o podstawach od 2 do 16.
program pyta użytkownika o podstawę liczby przeliczanej (wejściowej), liczbę przeliczaną oraz o podstawę liczby wyjściowej
program wykonuje potrzebne przeliczenia, wyświetla liczbę wg podstawy wyjściowej.
Do realizacji wykorzystaliśmy podstawowe instrukcje arytmetyczne: MOD, FIX, pętle, warunki, itp. bez wykorzystania gotowych funkcji bibliotecznych wykonujących przeliczenia pomiędzy systemami liczbowymi.
Podsumowując uzyskaliśmy prosty program konwertujący liczby, na podstawie którego zostały poznane podstawy języka Basic.