sprawko zsica

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.


Wyszukiwarka

Podobne podstrony:
El sprawko 5 id 157337 Nieznany
LabMN1 sprawko
Obrobka cieplna laborka sprawko
Ściskanie sprawko 05 12 2014
1 Sprawko, Raport wytrzymałość 1b stal sila
stale, Elektrotechnika, dc pobierane, Podstawy Nauk o materialach, Przydatne, Sprawka
2LAB, 1 STUDIA - Informatyka Politechnika Koszalińska, Labki, Fizyka, sprawka od Mateusza, Fizyka -
10.6 poprawione, semestr 4, chemia fizyczna, sprawka laborki, 10.6
PIII - teoria, Studia, SiMR, II ROK, III semestr, Elektrotechnika i Elektronika II, Elektra, Elektro
grunty sprawko, Studia, Sem 4, Semestr 4 RŁ, gleba, sprawka i inne
SPRAWKO STANY NIEUSTALONE, Elektrotechnika, Elektrotechnika
SPRAWOZDANIE Z farmako, Farmacja, II rok farmacji, I semstr, fizyczna, Fizyczna, Sprawozdania z fizy
mmgg, Studia PŁ, Ochrona Środowiska, Chemia, fizyczna, laborki, wszy, chemia fizyczna cz II sprawka
Zadanie koncowe, Studia PŁ, Ochrona Środowiska, Biochemia, laborki, sprawka
Piperyna sprawko PŁ, chemia produktów naturalnych, ćw. 5 PIPERYNA
03 - Pomiar twardości sposobem Brinella, MiBM Politechnika Poznanska, IV semestr, labolatorium wydym
Sprawozdanie nr 1 CECHY TECHNICZNE MATERIAfLOW BUDOWLANYCH, Budownictwo studia pł, sprawka maater
Sprawko badanie twardosci, Studia, WIP PW, I rok, MATERIAŁY METALOWE I CERAMICZNE, SPRAWOZDANIA
sprawko z ćwiczenia 11, Farmacja, II rok farmacji, I semstr, fizyczna, Fizyczna, Sprawozdania z fizy

więcej podobnych podstron