Numer 膰wiczenia: 1 |
Konrad Syrek Jaros艂aw Szewczyk |
Data: 20.11.2011r. |
---|---|---|
Wydzia艂 EAIiE, rok 3 EC |
Celem 膰wiczenia by艂o napisanie kodu programu zamieniaj膮cego liczb臋 w dowolnym systemie liczbowym na dowolny inny przy podaniu charakterystycznych danych.
Program aby zamieni膰 liczb臋 musi pierwsze zamieni膰 ja na system dziesi臋tny, nast臋pnie dopiero przelicza na system zadany.
Dziesi臋tny system liczbowy, zwany te偶聽systemem arabskim聽to pozycyjny聽system liczbowy, w kt贸rym podstaw膮 pozycji s膮 kolejne pot臋gi liczby聽10. Do zapisu聽liczb聽potrzebne jest wi臋c w nim 10聽cyfr:聽0,聽1,聽2,聽3,聽4,聽5,聽6,聽7,聽8,聽9.
Jak w ka偶dym pozycyjnym systemie liczbowym, liczby zapisuje si臋 tu jako ci膮g cyfr, z kt贸rych ka偶da jest mno偶nikiem kolejnej pot臋gi liczby stanowi膮cej podstaw臋 systemu. Cz臋艣膰 ca艂kowit膮 i u艂amkow膮 oddziela聽separator dziesi臋tny.
Metoda zamiany: Np. zapis "5045,7" wynika z:
Aby przeliczy膰 liczb臋 z systemu dziesi膮tkowego na inny, 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. Zapisujemy reszty z dzielenia od ko艅ca.
Zapis za pomoc膮 algorytmu:
Dane:聽liczba聽LICZ聽- prawid艂owa liczba naturalna w systemie dziesi臋tnym oraz system liczbowyQ, 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 wykonujemy:
Zmiennej pomocniczej POM przypisujemy reszt臋 z dzielenia LICZ/Q
Je艣li POM<10, to do liczby wynikowej WYN dopisujemy cyfr臋 POM
Je艣li natomiast 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:
'Program s艂u偶膮cy do przeliczania podanej liczby pomi臋dzy dwoma dowolnymi systemami liczbowymi'
1 Dim p As Integer 'deklaracja zmiennej p - podstawa wprowadzanej liczby, 2 'zmienna typu liczba ca艂kowita'
3 Dim b As String 'zmienna b - podstawa liczby przeliczanej, zmienna typu 4 '艂a艅cuch znak贸w(tekst)'
5 Dim przel As Integer 'zmienna przel - podstawa konwertowanej liczby'
6 Dim kod As Integer 'zmienna kod - zwraca warto艣膰 kodu ASCII podanego 7 'znaku przy pomocy funkcji Asc()'
8 Dim znak As String 'zmienna znak - zawiera zwr贸cony przy pomocy 9 'instrukcji Mid$() fragment tekstu
10 '(wprowadzonej liczby) '
11 Dim k As Integer 'zmienna k - podaje przy pomocy instrukcji Len() 12 'ilo艣膰 znak贸w zadanego tekstu '
13 Dim i As Integer 'zmienna i - pozycja znaku w zamienianej na 14 'tekst liczbie, u偶yta w p臋tli for'
15 Dim cyfra As Integer 'zmienna cyfra - kod ASCII danej cyfry po 16 'rozr贸偶nieniu znak贸w'
17 Dim liczb10poj As Integer 'zmienna liczb10poj -warto艣膰 dziesi臋tna 18 'pojedynczej cyfry w liczbie dziesi臋tnej
19 Dim reszta As Integer 'zmienna reszta - zwraca reszt臋 z dzielenia 20 'liczby dziesi臋tnej
21 'przez podstaw臋 liczby konwertowanej(przy 22 'pomocy instrukcji Mod)'
23 Dim calkowita As Integer 'zmienna calkowita - zwraca warto艣膰 ca艂kowit膮 24 'z dzielenia liczby dziesi臋tnej
25 'przez podstaw臋 liczby konwertowanej(przy 26 'pomocy instrukcji Fix()'
27 Dim a As Integer 'zmienna a - podaje przy pomocy instrukcji 28 'Len() ilo艣膰 znak贸w zmiennej u'
29 Dim As Integer wynik_dzies=0 'zmienna wynik_dzies - ustawiona na warto艣膰 30 'pocz膮tkow膮 r贸wn膮 zero,
31 'zawiera warto艣膰 liczby przeliczanej na 32 'system dziesi臋tny'
33 Dim u As String 'zmienna u - zawiera w postaci tekstu cyfry 34 'przekonwertowanej liczby'
35 Dim koncowy_wynik As String 'zmienna koncowy_wynik - ostateczny wynik 36 'konwersji liczb w postaci 艂a艅cucha znak贸w'
37 Dim znak_2 As String 'zmienna znak_2 - zawiera zwr贸cony przy 38 'pomocy instrukcji Chr$()znak tekstowy
39 'odpowiadaj膮cy podanemu kodowi ASCII (dla 40 'przekonwertowanej liczby)'
41
42 Input "Podaj podstawe liczby:",p 'wprowadzenie warto艣ci zmiennej p'
43 Input "Podaj liczbe przeliczana:",b 'wprowadzenie warto艣ci zmiennej b'
44 k=Len(b) 'wpisuje do zmiennej k ilo艣膰 znak贸w 45 'wprowadzonej liczby'
46
47
48 For i=1 To k 'p臋tla for s艂u偶膮ca do obliczania 49 'kodu ASCII 48 pojedynczych 50 'znak贸w wprowadzonej liczby'
51 znak=Mid$(b,i,1) 'zwraca odpowiedni fragment wprowadzonej liczby'
52 kod=Asc(znak) 'zwraca warto艣膰 kodu ASCII zmiennej znak'
53
54 'p臋tla if s艂u偶膮ca do wyliczenia kodu ASCII z rozr贸偶nieniem cyfr od 0 55 'do 9 oraz 'liter od A do F dla system贸w liczbowych o podstawie wi臋kszej 56 'ni偶 10'
57 If kod>=Asc("0")And kod<=Asc("9") Then
58 cyfra=kod-Asc("0") 'przyjmuje warto艣膰 dla cyfr 59 'od 0 do 9'
60 ElseIf kod<=Asc("F")And kod>=Asc("A") Then
61 cyfra=kod-Asc("A")+10 'przyjmuje warto艣膰 dla 59 liter od A do F'
62 ElseIf kod<=Asc("f")And kod>=Asc("a") Then
63 cyfra=kod-Asc("a")+10 'umo偶liwia wpisywanie r贸wnie偶 ma艂ych liter 64 'od a do f'
65 End If 'zako艅czenie p臋tli if'
66
67
68 'por贸wnuje zmienn膮 cyfra ze zmienn膮 p(podstaw臋 wprowadzonej liczby)
69 'gdy wprowadzona liczba jest nieprawid艂owa ko艅czy program'
70 If cyfra>=p Then
71 Print "Podana liczba jest nieprawidlowa" 'wypisuje informacj臋 na 72 'ekranie'
73 End 'ko艅czy program'
74 End If 'zako艅czenie p臋tli if'
75
76 liczb10poj=cyfra*(p^(k-i)) 'oblicza warto艣膰 pojedynczej 77 'liczby dziesi臋tnej
78 'k- ilo艣膰 cyfr w liczbie 79 'i - numer pozycja danej cyfry'
80 wynik_dzies +=liczb10poj 'wprowadzona liczba przeliczona 81 'na system dziesi臋tny'
82 Next i
83
84
85 Print "Liczba dziesietnie wynosi:";wynik_dzies 'wypisuje na ekranie 86 'wynik dziesi臋tnie'
87 Input "Podaj podstawe konwertowanej liczby:",przel 'wprowadzenie 88 'warto艣ci zmiennej przel'
89
90 'p臋tla do - przeliczanie liczby z systemu dziesi臋tnego na dowolny od 2 91 'do 16'
92 Do
93 reszta=wynik_dzies Mod przel 'zwraca reszt臋 z dzielenia'
94 calkowita=Fix(wynik_dzies/przel) 'zwraca liczbe ca艂kowit膮 z 95 'dzielenia'
96 'p臋tla if do wyznaczenia zmiennej znak_2 '
97 If reszta >= 0 And reszta <= 9 Then
98 znak_2=Chr$(reszta+Asc("0")) 'gdy cyfra w liczbie zawiera si臋
99 'od 0 do 9'
100 ElseIf reszta >= 10 And reszta <= 15 Then
101 znak_2=Chr$(reszta+Asc("A")-10) 'gdy cyfra w liczbie zawiera si臋 102 'od 10 do 15'
103 End If
104 Print "";wynik_dzies;"/";przel;"=";calkowita;" r";reszta 'pokazuje 105聽 'na ekranie algorytm konwersji liczby
106 'z systemu dziesi臋tnego na dw贸jkowy'
107 u=u+Str(znak_2)
108 wynik_dzies=calkowita 'kolejna dzielona liczba jest r贸wna zwr贸conej 109 'liczbie ca艂kowitej z poprzedniego dzielenia'
110
111 Loop Until calkowita=0 'wykonuje w p臋tli do momentu, gdy zmienna 112 'calkowita=0'
113
114 a=Len(u) 'wpisuje do zmiennej a ilo艣c znak贸w zmiennej 111 tekstowej u'
115
116 'p臋tla do s艂u偶膮ca do wy艣wietlenia na ekranie ko艅cowego wyniku'
117 Do
118 If a=0 Then
119 Print " ";b;"(";p;" )";"=";koncowy_wynik;"(";przel;" )" 'wy艣wietla na 120 'ekranie ko艅cowy wynik konwersji'
121 Exit Do 'ko艅czy p臋tl臋 do'
122 Else
123 koncowy_wynik=koncowy_wynik+Mid$(u,a,1) 'zmienna 122 tekstowa tworz膮ca 124 'wynik w postaci 艂a艅cucha znak贸w'
125 a=a-1 'odejmuje 1 od zmiennej a do 126 'momentu, gdy a=0'
127 End If
128 Loop
129
130 'program zatrzymuje si臋 przed zako艅czeniem i czeka na naci艣ni臋cie 131 dowolnego klawisza'
132 Print "Nacisnij dowolny klawisz aby wyjsc z programu..."
133 Do While Len(inkey)=0
134 Sleep 50
135 Loop