SL-02 | Systemy liczbowe | |
---|---|---|
C-2 | Czarnik Tomasz Rybka Anna |
AGH WEAIiE KANiUP |
3 EC | ||
2011/2012 | Lab. Podstaw Sterowania Logicznego |
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ń.
Algorytm działania całego programu przedstawiony jest poniżej:
Zamieszczony w nim algorytm zamiany liczb wygląda natomiast następująco:
Jak widać, konwersja liczby z jednego systemu liczbowego na drugi odbywa się dwuetapowo, z pośrednim przeliczeniem na system dziesiętny (liczba D).
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.
Aby wykonać 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.
Drugi etap: 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.
Kod stworzonego programu przedstawia się następująco:
#Include Once "windows.bi" Dim As UShort cp : Dim As Integer ercp cp=1250 : ercp=SetConsoleOutputCP(cp) |
|
---|---|
Dim As Integer B1, B2, i, cyfra, D, kod, C, U Dim As String L1, L2, znak |
deklaracje poszczególnych zmiennych oraz ich typów; |
pocz: Input "Podaj podstawę pierwszej liczby"; B1 If B1<2 Or B1>16 Then Print "PODAJ PODSTAWE OD 2 DO 16" Goto pocz End If |
zapytanie o podstawę systemu liczbowego liczby przeliczanej; wczytanie tej liczby jako B1; weryfikacja czy jest to podstawa systemu obsługiwanego przez program (od 2 do 16) – jeśli nie, prośba o podanie stosownej i powrót do początku; |
Input "Podaj pierwszą liczbę"; L1 i=0 Do While i<Len(L1) If Valint(Mid$(L1,1+i,1))>B1 Then Print "niepoprawna liczba w " ;B1; "-owym systemie liczbowym" Goto koniec End If i=i+1 Loop |
zapytanie o liczbę przeliczaną; wczytanie jej jako L1; w pętli: sprawdzenie czy podana liczba jest poprawna dla zadeklarowanego systemu liczbowego, poprzez badanie kolejnych znaków – jeśli nie, wyświetlenie komunikatu o błędzie i przejście do końca programu; |
pocz2: Input "Podaj podstawę drugiej liczby"; B2 If B2<2 Or B2>16 Then Print "PODAJ PODSTAWE OD 2 DO 16" Goto pocz2 End If |
zapytanie o podstawę docelowego systemu liczbowego; wczytanie wartości jako B2; weryfikacja czy jest to podstawa systemu obsługiwanego przez program; |
i=0 D=0 L2="" |
rozpoczęcie pierwszego etapu: przeliczania na liczbę dziesiętną – początkowe deklaracje zerowych wartości zmiennych (oraz „pusty” string); |
Do While i<Len(L1) znak=Mid$(L1, Len(L1)-i, 1) kod=Asc(znak) If kod>=Asc("0") And kod<=Asc("9") Then cyfra=kod-Asc("0") ElseIf kod>=Asc("A") And kod<=Asc("F") Then cyfra=kod-Asc("A")+10 ElseIf kod>=Asc("a") And kod<=Asc("f") Then cyfra=kod-Asc("a")+10 Else Print "niepoprawna liczba "; L1 Goto koniec End If |
w pętli: odczytywanie kolejnych znaków liczby (od najmłodszego); zapisanie ich jako zmiennej znak; zapisanie jako zmiennej kod kodu ASCII odczytanego znaku; przeliczenie kodu ASCII na wartość liczbową prezentowaną przez dany znak w odpowiednim systemie liczbowym; weryfikacja poprawności znaku w systemach liczbowych obsługiwanych przez program – jeśli niepoprawny, wyświetlenie komunikatu o błędzie i przejście do końca programu; |
D=D+cyfra*B1^i i=i+1 Loop |
obliczenie liczby dziesiętnej: dodanie do jej początkowej wartości iloczynu cyfry o danej wadze i tej wagi; inkrementacja licznika pętli; |
Print "liczba dziesiętna:" ; D | wypisanie na ekran obliczonej wartości liczby dziesiętnej |
Do While D<>0 C=Fix(D/B2) U= D Mod B2 Print ;D; "/" ;B2; " " ;C; " r " ;U D=C |
w pętli: wykonanie wielokrotnego dzielenia liczby dziesiętnej przez podstawę docelowego systemu liczbowego; zapisanie części całkowitej z dzielenia jako C; zapisanie reszty z dzielenia jako U; wypisanie na ekran przebiegu dzielenia; podstawienie D=C zapewniające dalsze dzielenie części całkowitej; |
If U<10 Then L2=Str(U)+L2 Else znak=Chr(U-10+Asc("A")) L2=znak+L2 End If Loop |
zapisanie liczby w docelowym systemie dziesiętnym L2 jako sumy reszt z kolejnych dzieleń (typu string) od najmłodszej do najstarszej: jeśli reszta jest mniejsza od 10, dopisanie jej jako string bezpośrednio na najstarszej pozycji; jeśli jest równa lub większa, zapisanie jej jako znaku; |
Print "Pierwsza liczba: "; L1; "(";B1; ")" Print "Druga liczba: "; L2; "(";B2; ")" |
wypisanie na ekran wyniku konwersji: podanie obu liczb wraz z ich podstawą; |
koniec: Do While Len(inkey)=0 Sleep 50 Loop |
Programowanie w języku Basic jest stosunkowo łatwe, pozwala więc na szybkie napisanie nieskomplikowanych, ale przydatnych programów, takich jak powyższy.
Napisany program spełnia założenia ćwiczenia: konwertuje liczby pomiędzy wymaganymi systemami liczbowymi, nie podaje również błędnych rezultatów w przypadku pomyłki użytkownika. Korzystanie z niego pozwala na łatwe przeliczanie liczb pomiędzy różnymi systemami, oszczędzając żmudnych obliczeń nie gorzej, niż korzystanie z bardziej zaawansowanych programów.
Stworzenie powyższego programu pozwoliło zarówno na bliższe zapoznanie się z podstawowymi komendami języka Basic, jak i obserwację jak złożoną operacją jest konwersja liczb pomiędzy różnymi systemami liczbowymi.