1 Systemy liczbowe

SL-02 Systemy liczbowe
C-1

Łukasz Uszko

Seweryn Kwieciński

AGH

WEAIiIB

KANiUP

3 EC
2012/2013 Lab. Podstaw Sterowania Logicznego
  1. Celem ćwiczenia było napisanie w języku Basic programu służącego do przeliczania podanej liczby pomiędzy dwoma dowolnymi systemami liczbowymi (przynajmniej od dwójkowego do szesnastkowego) przy użyciu podstawowych instrukcji arytmetycznych, MOD, FIX, pętli, warunków itd., bez wykorzystania gotowych funkcji bibliotecznych. Gotowy program ma zapytać użytkownika o podstawę liczby wejściowej, liczbę wejściową oraz podstawę liczby wyjściowej, a następnie podać liczbę wyjściową po wykonaniu niezbędnych obliczeń.

  2. Algorytm działania całego programu przedstawiony jest poniżej:

Etap pierwszy: przeliczenie liczby 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 dodatkowo dokonać zamiany kodu ASCII odczytanego znaku na wartość liczby, której znak ten odpowiada.

Metoda zamiany: Np. zapis "804,1" wynika z:

8*102 + 0*101 + 4*100 + 1*10-1=800+0+4+0,1

Etap drugi: przeliczenie liczby z systemu dziesiętnego na dowolny system liczbowy odbywa się poprzez wielokrotne dzielenie liczby dziesiętnej przez podstawę tego systemu. Reszty z kolejnych dzieleń stanowią cyfry (od najmłodszej do najstarszej) liczby po konwersji. W przypadku podstawy większej od 10, niezbędna jest zamiana odwrotna niż w pierwszym etapie: liczby na kod ASCII i odpowiadający mu znak np.

12314=221023=22710

227/3=75 reszta 2

75/3= 25 reszta 0

25/3 = 8 reszta 1

8/3 = 2 reszta 2

2/3 = 2 reszta 2

Jak widać, konwersja liczby z jednego systemu liczbowego na drugi odbywa się dwuetapowo, z pośrednim przeliczeniem na system dziesiętny.

Ponieważ liczby przeliczane są pomiędzy naturalnymi pozycyjnymi systemami liczbowymi, w których (dla obsługiwanych przez program liczb całkowitych) zachodzi równość:


L = an − 1 • pn − 1 + an − 2 • pn − 2 + … + a1 • p1 + a0 • p0

gdzie:

pn − 1 - jest wagą cyfry: n-1 potęgą podstawy systemu liczbowego p;

 an − 1 - jest cyfrą na n-1 pozycji w liczbie, odpowiadającej n-1 potędze podstawy p.

Kod stworzonego programu przedstawia się następująco:

‘---KONWERTER SYSTEMÓW LICZBOWYCH - KWIECINSKI, USZKO
 

Dim glowna As Integer =1 'pomocnicza flaga do określenia
'wprowadzania kolejnej partii danych

Do
 
Dim As Integer Podstawa, PodstawaWyj, warunek=0,i,a
Dim LiczbaDoKonw As String
Dim PojedynczyZnakASCII As Integer
Dim LiczbaASCII As Integer
Dim Liczba10 As Integer
Dim LiczbaNa10 As Integer
Dim reszta As Integer
Dim CzescCalkowita As Integer
Dim Licznik As Integer 'liczba znaków w stringu

'-----------sprawdzanie podstawy wejściowej ------------------------------------------------------------------------------

'sprawdzanie czy podstawa jest z odpowiedniego zakresu jeśli nie to program będzie prosił o ponowne ‘podanie podstawy

'---------------------------------------------------------------------------------------------------------------------------------

Input "Wprowadz podstawe wejsciowa: ", Podstawa
Do
If Podstawa<2 Or Podstawa >16 Then

Input "Bledna podstawa, wprowadz ponownie z zakresu 2 do 16: ", Podstawa
Else
warunek=1
End If
Loop Until warunek=1
warunek=0
 
'-----------sprawdzanie podstawy wyjściowej-----------------------------------------------------------------------

'---------------------------------------------------------------------------------------------------------------------------------

Input "Wprowadz podstawe wyjsciowa: ",PodstawaWyj

Do
If PodstawaWyj<2 Or PodstawaWyj >16 Then
Input "Nieprawidlowa podstawa, wprowadz ponownie z zakresu 2 do 16: ",PodstawaWyj
Else
warunek=1
End If
Loop Until warunek=1
warunek=0

'------------- sprawdzanie czy dozwolone znaki w stringu----------------------------------------------------------

‘instrukcje zawarte poniżej mają na celu zapobiegnięcie przyjmowania błędnych znaków do ‘wczytywanego stringu czyli dla przykładu jeśli podstawa wejściowa jest równa 7 a wczytana liczba jako ‘string wynosi np. 6187 to dzięki tym instrukcjom zostanie zwrócony błąd i program poprosi o ponownie ‘wpisanie danej gdyż w wprowadzanej danej wystąpiła błędna wartość 8 i 7.

'---------------------------------------------------------------------------------------------------------------------------------

a=0 'flaga służąca do sprawdzania czy we wpisywanym stringu występują niepoprawne znaki
 Do Until a =1 And warunek =0
Input "Wprowadz liczbe do konwersji: ",LiczbaDoKonw
Licznik = Len(LiczbaDoKonw)
 
If Licznik>20 Then ‘maksymalna długość stringu może zawierać 20 znaków
Print "PODALES ZA DUZA LICZBE ,MAX 20 CYFR, POWTORZ!"
warunek=1
Else warunek=0 'od razu wtedy pomijam sprawdzanie czy cyfry pasują bo dalej

'mam w if-ie że warunek=0
End If
  If warunek=0 Then
For i=1 To Licznik Step +1 'jadę pętlą po wszystkich znakach ze stringa
PojedynczyZnakASCII = Asc(Mid$(LiczbaDoKonw,i,1))
 
If Podstawa>=2 And Podstawa<=9 Then 'tu dla podstaw od 2 do 9
If PojedynczyZnakASCII >=Asc("0") And PojedynczyZnakASCII < Podstawa+Asc("0") Then

a=1
Else
a=0
Print "W LICZBIE WYSTAPIL ZLY ZNAK, POWTORZ! :"
Exit For
End If
End If
 
If Podstawa>=10 And Podstawa<=16 Then ' tu dla podstaw od A do H i od a do h
If ((PojedynczyZnakASCII >=(Asc("A"))) And (PojedynczyZnakASCII < (Podstawa-10+Asc("A"))))Or((PojedynczyZnakASCII >=Asc("a")) And (PojedynczyZnakASCII < Podstawa-10+Asc("a")))Or (PojedynczyZnakASCII >=Asc("0") And PojedynczyZnakASCII < Podstawa+Asc("0")) Then
a=1
Else
a=0
Print "W LICZBIE WYSTAPIL ZLY ZNAK, POWTORZ! :"
Exit For
End If
End If
  Next i
End If
  Loop
  

'---------------sprawdzanie danych wejściowych oraz ilości znaków w stringu--------------------------------------

'---------------------------------------------------------------------------------------------------------------------------------------

For i=0 To Licznik Step +1

'----zmieniam pojedynczy znak liczby (każdy element stringa) na jego odpowiednik w ASCII --------------------

PojedynczyZnakASCII = Asc(Mid$(LiczbaDoKonw,i,1 ))

'---- sprawdzam warunek czy pojedynczy znak jest liczbą czyli jest od 0 do 9--------------------

If PojedynczyZnakASCII >= Asc("0") And PojedynczyZnakASCII <= Asc("9") Then
LiczbaASCII=PojedynczyZnakASCII-Asc("0")
End If
 
'----jeśli pojedynczy znak nie jest liczbą do tutaj sprawdzam czy wpisana litera (od a do f) jest mała----
 If PojedynczyZnakASCII>=Asc("a") And PojedynczyZnakASCII<=Asc("f") Then

'----konwertuje literę na liczbę do wyniku musze dodać 10 bo jak mam np. literę f to w ascii jest ona 66---'----zatem 66-61(kod litery a) jest 5 --------------------
LiczbaASCII=PojedynczyZnakASCII-Asc("a") +10

End If
 
'----jeśli pojedynczy znak nie jest liczbą do tutaj sprawdzam czy wpisana litera (od A do F) jest duża
 If PojedynczyZnakASCII>=Asc("A") And PojedynczyZnakASCII<=Asc("F") Then
LiczbaASCII=PojedynczyZnakASCII-Asc("A")+10 'konwertuje literę na liczbę
End If
 
'--------------------------------------------------------------------------------------
LiczbaNa10=LiczbaASCII*Podstawa^(Licznik-i) 'konwertuje liczbe do systemu dziesiątkowego
Liczba10=Liczba10+LiczbaNa10
 
Next i 'koniec pętli while
 
Print "Liczba w systemie 10-tkowym:"; Liczba10

'--------------------------------------------------------------------------------------
 
 
Dim tablica(100) As String 'deklaracja tablicy w której będę zapisywał wynik wyjściowy
Dim k As Integer = 0 'licznik pomocniczy do numeracji miejsc w tablicy i przypisanie mu wartości 0
 
'--------------------------------------------------------------------------------------
Do 'początek pętli tu będę dzielił modulo

'----zwraca mi resztę z dzielenia czyli jak dziele np. 15/6 to mam'2 r 3 i zwróci mi 3 --------------------

reszta = Liczba10 Mod PodstawaWyj

'----zwraca mi część całkowitą za pomocą funkcji Fix czyli jak dziele np 15/6 to mam 2 r 3 i zwróci mi 2 -----
CzescCalkowita = Fix(Liczba10/PodstawaWyj)

Print ; Liczba10;" / ";PodstawaWyj;" = ";
Print ; CzescCalkowita;
Print " r"; reszta
 
If reszta>=10 And reszta <=16 Then 'jeśli reszta jest w tym przedziale to znaczy że to jest litera

'----przekonwertuje mi cyfrę na znak i zapisze do tablicy np. reszta jest 10 to wpisze w tablice A

tablica(k)=Chr$(Asc("A")-10+reszta)
End If
 
If reszta>=0 And reszta<=9 Then 'jak reszta w tym przedziale to liczba

'----polecenie Str zwraca ciąg znaków reprezentujący liczbę lub ciąg znaków Unicode
tablica(k)=Str( reszta )

End If

Liczba10=CzescCalkowita 'będę przypisywał dotąd aż CzescCalkowita =0 bo wtedy koniec
k=k+1
Loop Until CzescCalkowita = 0
 
'--------------------------------------------------------------------------------------
Dim x As Integer 'pomocniczo do pętli jako numerator tablicy
Print "PO KONWERSJI: ";
For x=0 To k
Print tablica(k-x); 'średnik na końcu pozwala na wypisanie wszystkiego w jednej linii
Next l
Print "("; PodstawaWyj ; ")= " ; LiczbaDoKonw; "(" ;Podstawa; ")"

'--------------------------------------------------------------------------------------
Input "Wprowadzenie innej liczby (1), KONIEC (0)", glowna
Loop Until glowna=0

‘----koniec programu-------------------------------------------------------------------------------------------------------------

Wnioski:

W ćwiczeniu uzyskaliśmy dość zaawansowany program służący do przeliczania liczby pomiędzy dwoma dowolnymi systemami liczbowymi (z zakresu 2-16).

Nasz program zapewnia:

  1. obsługiwanie liczb o podstawach od 2 do 16.

  2. Odporność na wpisywanie błędnych danych – sygnalizuje to bardzo wyraźnie.

  3. Łatwość w użyciu dzięki jasnej sygnalizacji kolejnych kroków

  4. Optymalizacje kodu

  5. Wielokrotność działania

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.


Wyszukiwarka

Podobne podstrony:
prezentacja rzymski system liczbowy
systemy liczbowe, informatyka
systemy liczbowe
Systemy Liczbowe, systemy liczbowe1, SYSTEM BINARNY
Pozycyjne systemy liczbowe
prezentacje zaawans, systemy liczbowe LO
Sprawozdanie Automatyka systemy liczbowe, SGGW Technika Rolnicza i Leśna, Automatyka
Szesnastkowy system liczbowy
17-09-2005 Wstęp do informatyki Systemy Liczbowe, Systemy Liczbowe
systemy liczbowe 4
Tabela (Systemy Liczbowe)
Dwójkowy system liczbowy
Ósemkowy system liczbowy, NAUKA, algorytmy i struktury danych, WAT
Pozycyjne systemy liczbowe
Dziesiętny system liczbowy, NAUKA, algorytmy i struktury danych, WAT
systemy liczbowe 4

więcej podobnych podstron