background image

 

 

 

Zbiór materiałów i zadań 

do 

ćwiczeń  rachunkowych 

z przedmiotu 

„Metodyka i techniki programowania 

 

Cz. I 
Formy przedstawiania liczb   w  komputerze 
Cz. II 
Formy przedstawiania algorytmów 
Projektowanie algorytmów 
 
- Materiały robocze do ćwiczeń  

 
 

 
 
 

Opracowanie:  

 

 

         

dr inż. Kazimierz Banasiak 

 

WARSZAWA 2010 

background image

 

 

Tematy ćwiczeń rachunkowych 

Część I  

 
Tematy:  
Temat  1: Konwersje i zapis liczb w różnych systemach (2godz.) 
Temat: 2 Kody ZM,U1,U2. Operacje arytmetyczne.          (2 godz.) 

 
Część II  

 

Temat: 3  Analiza problemu i specyfikacja algorytmu

 

.  (2 godz.) 

Temat  4. Projektowanie algorytmów.                               (2 godz.) 
Temat  5.  Kolokwium z tematów 1-4                                 (2 godz) 
 
Informacja o kolokwium zawarta jest w końcowej części materiału.   

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

background image

 

INFORMACJE 

 

DOSTĘPNOŚĆ MATLABA 
 

MATLAB  jest  oprogramowaniem płatnym. Oprogramowanie ma 
licencję  na  czas  studiów.  Dla  studentów  cena  87  $.  Ta  wersja 
zawiera też SIMULINK z niektórymi ToolBox’ami.  
Dystrybucja  firma:  Oprogramowanie  naukowo  techniczne. 
Kraków. 
WWW.ont.com.pl 
 
Istnieją  zbliżone  wersje darmowe o nazwach: FreeMat, SCILAB, 
(SCICOS odpowiednik SIMULINKA dla SCILABA) 

 

Literatura 

podstawowa:  
 W. Reichel, M. Stachurski, Matlab dla studentów, Witcom, Warszawa 

2009r. 

 A. Kamińska, B. Pańczyk,  Matlab. Przykłady i zadania, Mikon 2002 
 B. Mrozek, Z. Mrozek,       Matlab i Simulink. Poradnik użytkownika, 

2004 

 B. Mrozek, Z. Mrozek,  Matlab.  Uniwersalne środowisko do obliczeń 

naukowo technicznych. 

uzupełniająca: 
 M. Niedziela, Zbiór zadań z informatyki, Helion 2006 
 Matlab Help Printable documentation 
 R. Klempka, A. Stankiewicz, Programowanie z przykładami w języku 

Pascal i Matlab, 2002  

 W. Regel ,  Przykłady i ćwiczenia w programie SIMULINK.                     

Wyd.  MIKOM 2004 

 B. Mrozek, Z. Mrozek,  MATLAB Leksykon kieszonkowy. Wyd. HELION 

 

background image

 

 

Cz. I 

REPREZENTACJA LICZB     

W  KOMPUTERZE 

 

 

Materiały do ćwiczeń dla studentów   

 

Literatura: 

 M. Niedziela, Zbiór zadań z informatyki, Helion 2006 
 

 

 

 

 

background image

 

System pozycyjny zapisu liczb 

Liczby w zapisie pozycyjnym (np. 538) są przedstawiane jako łańcuchy 

cyfr (c

i

), czyli znaków przypisanych  liczbom naturalnym: 

c

i

 

 {0,1,.., R-1} 

Podstawą R pozycyjnego systemu liczenia jest ilość różnych symboli (cyfr) 
dopuszczalnych na każdej pozycji zapisu liczby. 

Natomiast rzeczywista wartość cyfry w liczbie zależy od jej pozycji zajmowanej  
w łańcuchu cyfr. Np. cyfra 5 w liczbie  535 co innego znaczy na pozycji pierwszej  
i ostatniej. Wartość liczby L jest suma cyfr mnożonych przez wagi odpowiednie 
dla pozycji, na których te cyfry występują: 

i

n

i

i

R

R

c

L

=

=0

)

(

  

 

 

(1) 

gdzie:  i  –  numery

 

pozycji  na  lewo  od  przecinka  oddzielającego  część  całkowitą  od  części 

ułamkowej( i=0, 1, ..n),  

 

L

(R)

   -wartość liczby w systemie o podstawie R w którym zapisana jest liczba 

Jeśli omawiane są reprezentacje liczb w różnych systemach to podając wartość 
liczby  należy  też  zaznaczyć  notację  system  np.  101

(d)

.  Przy  zapisie  notacji 

używane są litery bądź cyfry np. 8 –ósemkowy(lub litera q), h- heksadecymalny 
(szesnastkowy), b-binarny, d-dziesiętny (lub 10) itp.  

 

System dziesiętny-  

Podstawa R=10 oraz

 

10 cyfr: c

i

 

 {0,1,2,. . . ,9 }, 

Np. korzystając z wzoru (1)  liczbę 

32 875

 

10

 można zapisać jako: 

 
      3x10000 + 2x1000 + 8x100 + 7x10 + 5x1 

      3       2       8        7        5 

    10

4

    10

3

     10

2

     10

1

     10

0

   wagi kolejnych cyfr systemu 

W podobny sposób można też przedstawić liczby Lu <1 tzn. liczby ułamkowe:  

i

n

i

i

R

R

c

Lu

=

=

1

)

(

                      

 (2)

 

gdzie:

 

pozycje położone na prawo od przecinka mają w tej konwencji  ujemne:  

-1, -2,-3,... wartości wykładnika określającego wagę cyfry 

 Np. korzystając z (2)  liczbę 0,

625

 można przedstawić jako: 

 

6

*10

-1

 

 + 

2

*10

-2

   +  

5

*10

-3 

Korzystając z wzoru  (1) można zapisać liczbę w dowolnym systemie tzn. o 

różnych podstawach R i odczytać jej wartość w systemie dziesiętnym np.:
 

System „8” 

(237) 

8

 =2*8

2

 + 3*8

1

 + 7*8

0

=159

(10) 

 

System „4” 

(233) 

4

 =2*4

2

 + 3*4

1

 + 3*4

0

=  47

(10) 

background image

 

Reprezentacja liczb całkowitych- kod  binarny  

 
Podstawą kodu binarnego jest podstawa R=2. W takim kodzie występują  2 
cyfry: 0 i 1. Taki kod jest idealny do zapisu informacji w komputerze, bowiem 
komputery rozróżniają tylko dwa stany: 0 i 1, które zawiera  najmniejsza porcja 
informacji nazywana  bitem [b]. Zwykle stosuje się większą jednostkę bajt [B]. 
Jeden bajt to 8 bitów. Naturalnym dla komputera systemem zapisu danych jest 
system dwójkowy (binarny), lecz ze względów technicznych używa się także 
systemów: szesnastkowego (heksadecymalny) i  rzadziej- ósemkowego 
(oktalny).   
Każda liczba L może być zapisana na pewnej ilości n bitów. Ilość n bitów 
niezbędną do zapisu liczby L (dziesiętnej) można wyznaczyć z nierówności: 

2

n

   -1  ≥ L  

 

 

 

 

 

(3) 

Bitów może być oczywiście  więcej niż n. Dlatego liczba n może być 
zaokrąglona w górę do całkowitej wielokrotności 8- tak, aby była wyrażona 
w bajtach. Np. jeśli L= 968 to analizując kolejno np. n=8, 9 spełnienie 
relacji (3) nastąpi  dopiero dla n=10 bo : 

         2

10

   -1 ≥ 968               

 

Czyli minimalna liczba bitów dla liczby 968 to n=10, zaokrąglając w górę -   
potrzeba 2 bajty. Oczywiście może być też więcej bitów, wówczas na 
niewykorzystanych bitach znajdują się zera. 

W kodzie binarnym inaczej przedstawiane są liczby całkowite nieujemne, 

 a inaczej ujemne. Inaczej też zapisuje się liczby ułamkowe. 
Natomiast  w  przypadku  liczb  rzeczywistych  (tzn.  posiadających  część 
całkowitą  i  ułamkową)  ich  część  całkowita    jest  zapisywana  w  postaci 
jednego ciągu bitów a część ułamkowa w postaci drugiego ciągu.  

            W systemie o R=2 (dwójkowym, binarnym) są   dwie cyfry: 0 i 1,

 

a kolejne 

pozycje z n-pozycji liczby odpowiadają kolejnym potęgom liczby 2.  

Np.:  dla n= 4  ciąg  1 1 1 0 

(2)

 zawiera liczbę l*2

3

+1*2

2

+l*2

1

+0*2

  = 14

(10)

 

Zakładając 1 bajt (tzn. n= 8) to oznaczenia i wagi bitów są następujące: 

 

 Nr bitu:             

b

7         

b

6

     b

5

     b

4

     b

3

     b

2         

b

1

     b

                          2

7

    ……..               2

3

     2

2

     2

1

    2

  

Wagi bitów:      128    64     32    16     8       4       2     1  
Kod o takich wagach jest nazywany naturalnym kodem binarnym – NKB. 
Bit  b

o

 -jest bitem najmniej znaczacym -LSB 

(least significant bit), 

a bit najstarszy tzn. b

n-1

 - MSB 

(most significant bit) 

Największa liczba zapisana przy pomocy n bitów to Lmax= (2

n

 –1)- stąd dla 

n=8 Lmax=255 – co odpowiada jedynką na wszystkich bitach bajtu.  

 

 

background image

 

 
 
Zamiana liczby dziesiętnej ( całkowitej, dodatniej) na binarną- 
algorytm Hornera 

 
 

Dana  jest  liczba  naturalna  np.  108  zapisana  w  systemie  dziesiętnym.  Należy 
znaleźć jej notację w systemie binarnym. 
 
Sposób rozwiązania (jeden z możliwych): 

Należy dzielić całkowicie przez dwa daną liczbę oraz zapisywać resztę  
z dzielenia całkowitego. Otrzymane wartości reszt z dzielenia, zapisane w 
kolejności odwrotnej dają  zapis liczby w systemie binarnym. (na końcu  
dzielenia otrzymujemy najbardziej znaczącą cyfrę binarną),  

Rozwiązanie 

Tabela 1.    Zamiana liczby z systemu dziesiętnego na dwójkowy 

 

Działanie 

Wynik 

Reszta 

108:2 

54 

54:2 

27 

27:2 

13 

13:2 

6:2 

3:2 

1:2 

 
Sprawdzenie:  
1101101

(2)

= l*2

6

+l*2

3

+0*2

4

+l*2

3

+l*2

2

+0*2

1

+0*2° = 4+32+8+4 =108

(10) 

 
W podobny sposób można odczytać wartość dziesiętną ciągów 

przedstawiających zapis binarny liczby rzeczywistej (nieujemnej) np.:  

 
(101,

101

(2)

 =1*2

2

 + 1*2

1

 + 1*2

0

   +  

1*2

-1

 + 0*2

-2

 + 1*2

-3

  =5,625     

 

 
 
 
 
 

Wynik:  

1101100

(2) 

background image

 

Zamiana liczby dziesiętnej ( całkowitej, dodatniej) na binarną- 
algorytm zachłanny 
 
Liczbę całkowitą z systemu dziesiętnego można zamienić na  NKB jeśli właściwie 
oszacujemy niezbędną,  minimalną liczbę n bitów (na podstawie nierówności  (3))

 

Przedstawiony dalej algorytm dokonuje zamiany liczby X na postać binarną, 
dobierając kolejno wagi binarne. Każdorazowo dobiera największą z możliwych 
wag (stąd zachłanność). 
 

Algorytm zamiany metodą doboru  wag 

1)  Nadać wszystkim n- bitom wartość 0. 
2)  znaleźć najmniejszą  wartość n taką, aby zachodziła relacja: 

             2

n +1

  > X ≥2

n

      

         Nadać bitowi b

n  

wartość  b

n  

=1.  

3)  Obliczyć różnicę Y=X- 2

 Czy Y=0 ? 

TAK: Przejdz do 4.   
NIE: Podstaw X:=Y. Przejdz do punktu 2. 

      4. Koniec.   
Przykład: 
Wykorzystując algorytm. Przedstaw w NKB liczbę 88

(10)

1. Przyjmujemy początkowo n=8 i  X

(NKB)

0 0 0 0 0 0 0 0 

2. Szukamy największego n aby  2

n+1

 >  88 ≥ 2

           Dla 

n=7

 jest (2

7  

> 88 > 2

6

). 

     Czyli największą możliwą wagą jest 2

6

 .    Stąd  bit  

b

6

=1

3. Zostaje różnica Y=88-64=24  Ponieważ Y>0 to nowa wartość X=24 
2. Szukamy największego n aby  2

n+1

 >  24 ≥ 2

 .         Dla  

n=4

  jest (2

5

>24> 2

4

 ).   

 

 

   Czyli największą możliwą wagą jest  2

4

 .   Stąd

 

bit 

  b

4

=1

3. Zostaje różnica Y=24-16=8.  Ponieważ Y>0 to X=8 
2 Szukamy znów największego n aby   2

n+1

 >  8 ≥ 2

n

 .   Dla 

n=3

 jest  (2

4

>8 ≥ 2

3

 ). 

   

 

   Czyli największą możliwą wagą jest   2

3

 .  Stąd  bit  

b

3

=1

3. Zostaje różnica  Y=8 -8=0 

 Ponieważ  Y=0  to punkt 4. 

4.  KONIEC 

 
Czyli  otrzymujemy:  88

(10)

.= 0 1 0 1 1 0 0 0  

 

background image

 

Reprezentacja binarna- podstawowe operacje logiczne  

 

 

W operacjach logicznych liczba binarna jest traktowana jako zbiór 

pojedynczych cyfr binarnych. 

Operacje na bitach 

Negacja   (NOT) 

!1 = 0,        !0 = 1 

Koniunkcja  (AND) 

0 & 0 = 0,   1 & 0 = 0,  0 & 1 = 0,   

1 & 1 = 1

 

Alternatywa  (OR) 

 

0 | 0  = 0

,   1 | 0  = 1,    0 | 1  = 1,    1 | 1 = 1 

Różnica symetryczna  
  XOR 

 

0 ^ 0 = 0

,   1 ^ 0 = 1,    0 ^ 1 = 1,   

1 ^ 1 = 0

 

Przykłady:

 

 

 

  

Podstawowe operacje arytmetyczne dla liczb binarnych 

  

Dodawanie  

Liczby dwójkowe dodajemy podobnie, jak dziesiętne. Gdy po dodaniu dwóch 
cyfr uzyskuje się wartość niemożliwą do zapisania pojedynczą cyfrą, zachodzi 
tzw. 

przeniesienie.

 Odejmujemy wtedy od wyniku podstawę systemu, a do 

następnej pozycji dodajemy 1 (np. 9+8=17-10) =7

(1)7 

W przypadku liczb dwójkowych przeniesienie wystąpi już wtedy, gdy wynik 
dodawania dwu cyfr jest większy od 1. 

Jest różnica na najmłodszym 

bicie!!! 

background image

 

10 

Reguły dodawania

 

 

Reguły odejmowania: 

 

 

 
 
 
 

background image

 

11 

Mnożenie i dzielenie 

Przykłady

 

 

 

Mnożenie przez 2

 w układzie binarnym - przesunięcie liczby o jedną pozycję 

w lewo i dopisanie zera z prawej strony liczby. 

Dzielenie przez 2

 w układzie binarnym - przesunięcie liczby o jedną pozycję 

w prawo i odrzucenie ostatniej cyfry (jeśli liczba parzysta to tą cyfrą jest 
zero). 

Przykład:

   

Mnożenie przez 10 w układzie dziesiętnym i przez 2 w układzie 

dwójkowym. 

 

Podobnie mnożenie i dzielenie w układzie dwójkowym przez 4 i inne potęgi 
dwójki – można realizować jako przesunięcie w lewo (dla mnożenia)  lub w 
prawo (dla dzielenia) o odpowiednią liczbę pozycji. 

background image

 

12 

System oktalny (ósemkowy) 

 

W systemie ósemkowym (R=8) mamy do dyspozycji osiem cyfr (0, 1, 2, 

...,7), a kolejne pozycje odpowiadają kolejnym potęgom liczby 8. 

Np.    407

(8)

 = 4*8

2

+0*8

1

+7*8

0

 = 4*64+7 = 256+7 = 263

(10)

 

Przykład : 

 

Dana jest liczba naturalna n = 197 zapisana w systemie dziesiętnym. 

Należy znaleźć  jej notację w systemie ósemkowym. 

Sposób rozwiązania: 

Należy daną liczbę dzielić całkowicie przez osiem oraz zapisywać resztę z 

dzielenia całkowitego. Wartości reszty z dzielenia, zapisane w kolejności 

odwrotnej, dadzą liczbę w systemie oktalnym. 

Rozwiązanie 
Tabela . Zamiana liczby z systemu dziesiętnego na ósemkowy 

 

Działanie 

Wynik 

Reszta 

197:8 

24 

  24: 8 

 3:8 

Wynik: 305

(8)

 

Sprawdzenie: 305

(8)

 = 3*8

2

+0*8

1

+5*8° = 3*64+5 = 192+5 = 197

(10)

 

Przykład 1.3. Zamiana liczby oktalnej na binarną.  

 Dana jest liczba naturalna n = 604

(8)

  zapisana w systemie ósemkowym. Należy 

znaleźć  jej notację w systemie binarnym. 

Sposób rozwiązania: 

Ponieważ podstawą systemu oktalnego jest liczba 8 (jej zapis wymaga 3 bitów), a 

potęgą podstawy systemu binarnego 2, można zamieniać reprezentację liczb w tych 

systemach, zamieniając odpowiadające sobie cyfry (ciągi cyfr). 

Tabela. Tabela konwersji z systemu oktalnego na binarny (i odwrotnie) 

cvfra oktalna       liczba binarna 

000 

001 

010 

011 

100 

101 

110 

111 

Rozwiązanie 

Należy zamienić cyfry z systemu oktalnego na ciągi cyfr w systemie binarnym. 

 

 

Zamiana z systemu binarnego na ósemkowy wymaga  postępowania odwrotnego 

tzn. podziału na grupy 3 bitowe (od najmłodszego bitu) i przyporządkowania 
każdej grupie cyfry ósemkowej :

          

110  000  100

(2)   

  604 

(8)

 

Wynik: 305

(8)

 

 

 

6  0  4  

(8) 

 
         101       000      100      

Wynik:  

110000100

(2)

 

background image

 

13 

System heksadecymalny 

  

 

W systemie heksadecymalnym R=16 (szesnastkowym) mamy do dyspozycji 10 

cyfr:  (0, 1, 2,...,9) oraz sześć liter (A, B, C, D, E, F). 

Wartości 10 odpowiada A, 11

 B, 12  C, 13  D, 14  E, 15 F.  Kolejne 

pozycje liczby w tym systemie odpowiadają kolejnym potęgom liczby 16. 

Np. 5C

(h)

 = 5*16

1

+12*16° = 80+12 = 92

(l0)

 

Przykład 1.4. zamiana liczby dziesiętnej na heksadecymalną 
   Znaleźć notację 

 

heksadecymalną  liczby dziesiętnej N

 = 107. 

Sposób rozwiązania: 

Należy daną liczbę dzielić całkowicie przez szesnaście oraz zapisywać resztę z 

dzielenia całkowitego (reszty 10 i więcej zapisujemy jako cyfry A,B,C,D,E,F). 
Rozwiązanie 

Tabela .  Zamiana liczby z systemu dziesiętnego na szesnastkowy 

Działanie 

Wynik 

Reszta 

107:16 

6             (11) czyli B 

6:16 

      6 

Sprawdzenie:

 

6 B 

(16) 

=6*16

11*16

0

 

 =96+ 11=107 

(10)   

 

Przykład 1.5. Zamiana liczby binarnej na heksadecymalną. 

Dana  jest  liczba  naturalna  n  =10010110011  zapisana  w  systemie  binarnym. 

Znajdź jej notację w systemie szesnastkowym. 

Sposób rozwiązania: 

Podstawą systemu jest 16 (2

4

 - co wymaga 4 bitów)  a  binarnego  2, należy więc podzielić 

ciąg bitów na grupy 4 bitowe i każdej przyporządkować odpowiednią  cyfrę systemu hex 
(wg tabeli). 

Cyfra 
 heksadecymalna 

Liczba 
 binarna 

0000 

0001 

0010 

0011 

0100 

0101 

0110 

0111 

1000 

1001 

1010 

1011 

1100 

1101 

1110 

1111 

Na liczbach hex można wykonywać typowe operacje np.: 

    1B8         

 440 

+   C7         

 199 

  

2 7 F       

 639

Wynik: 
 107

(d)

 = 6 B 

(h)

 

Rozwiązanie: 

 

Należy zamienić 
czteroelementowe ciągi cyfr 
z systemu binarnego na 
cyfry w systemie 
heksadecymalnym. 

0100   1011  0011 
   

     

4       B       3

4       B       3

4       B       3

4       B       3    

 
Wynik: 
4B3 

 

background image

 

14 

Konwersja liczb pomiędzy różnymi systemami 

Dla  znalezienia  wartości  dziesiętnej  liczby  zapisanej  w innym  systemie 

pozycyjnym  wygodnie  jest  skorzystać  z definicji.  W systemie  dwójkowym  jest 
to proste, gdyż cyfry 0 lub 1 występujące jako mnożniki wag dają 0 lub wagę, 
która jest odpowiednią potęgą 2). 

 

Np.:    liczba 

1  1  0  1  0  1

 

b

  ma  jedynki  na  poz.  o  wagach  1,4,16  i  32,  a  jej 

wartość dziesiętna wynosi 1+4+16+32 = 53 

Cyfry dwójkowe 

1

 

1

0

   1     0      1 

Wagi 

2

5

        2

4

    2

3

      2

2

     2

1

      2° 

 
Liczba 

0,1101b

  ma  jedynki  na  pozycjach  o  wagach  równych  ½,  ¼,  i 

1/16,

 

- jej wartość dziesiętna wynosi ½+ ¼ + 1/16 =13/16 

Cyfry dwójkowe: 

0 ,   1    1     0       1

 

Wagi                            2

0

  ,      2

-1

   2

-2

   2

-3

    2

-4  

 

 

W systemach innych niż dwójkowy trzeba wykonać mnożenie; np.  

Np. dla liczby: 

1BC5

h mamy: 

Cyfry szesnastkowe 

Wartość cyfr 

         

11 

12 

Wagi 

     16

3

=4096 

 16

2=

256 

16

1

 =16 

 16°=1 

 

     

    

   

 

Czyli liczba 

1BC5h = 

1x4096 +11x256 +12x16 + 5x1 =

7109(

10)

 

 

Przydatność zapisu szesnastkowego polega głównie na tym, że pozwala on 

zapisywać w zwięzłej postaci łańcuchy dwójkowe (nie zawsze reprezentujące 
liczby), które to łańcuchy w sposób naturalny opisują stan urządzeń cyfrowych. 

Z faktu, że 16 = 2

4

 wynika, że 4 cyfry dwójkowe mogą być zastąpione przez 1 

cyfrę szesnastkową.  

Konwersja  z  systemu  hexsadesymalnego  na  binarny  lub  odwrotnie  jest 

bardzo  prosta.  To  duża  zaleta  systemu  hexsadesymalnego.  Wymaga  jedynie 
zastąpienia  poszczególnych  cyfr  szesnastkowych  czwórkami  bitów  (tetradami) 
lub odwrotnie np.: 

1 1 0 1 

0 0 1 1 

1 0 0 1  

0 1 0 1 

background image

 

15 

Kod BCD(Binary Coded Decimal) 

 

Kod  dwójkowo  -  dziesiętny  BCD    służy  do  przedstawiania  liczb 

całkowitych  bez  znaku.  W  kodzie  tym  każda  cyfra dziesiętna jest zakodowana 
dwójkowo na 4 bitach, według reguł kodowania binarnego (tabela). 

Cyfra dziesiętna 

Kod BCD 

0000 

0001 

0010 

0011 

0100 

0101 

0110 

0111 

1000 

1001 

 

Kodowanie liczb ze znakiem 

 

W  układach  cyfrowych  stosowane  są  elementy  dwustanowe,  co  wystarcza 

do  odwzorowania  zapisu  dwójkowego  liczb  naturalnych  bez  znaku, 
(unsigned). 
   Dla  liczb  całkowitych  (ze  znakiem)  trzeba  dodatkowej  umowy  co  do  zapisu 
znaku, a dla liczb rzeczywistych jest konieczność wskazania miejsca przecinka. 
 Problem  liczb  całkowitych  (integer)  rozwiązuje  się  za  pomocą  tzw.  kodów 
liczbowych  stałopozycyjnych (fixed  point),  natomiast  liczby  rzeczywiste (real) 
są  zapisywane  w specjalnych  formatach  zmiennopozycyjnych  (floating  point) 
jako para liczb stałopozycyjnych. 

Obecnie  powszechnie  stosowany  jest  tzw. 

kod  uzupełnień  do  2

  –

U2

  {two's 

complement),  choć  używano  też  kodu  uzupełnień  do  1  –

U1

  i  kodu  znak-

moduł 

ZM

  {sign-magnitude).  We  wszystkich  tych  odwzorowaniach  trzeba 

brać pod uwagę wielkość kodu n (liczbę bitów), ponieważ od tego zależy postać 
zakodowanej liczby — ta sama liczba może mieć różną postać zależn i e  od tego, 
na ilu bitach jest kodowana.  

Kody U1,U2,ZM różnią się sposobem zapisu liczb ujemnych.  

Liczby dodatnie mają we wszystkich kodach taki sam zapis. 

 Kody  różnią  się  też,  dla  tego  samego  n,  zakresem  liczb.  Przydatność 
poszczególnych kodów wynika z łatwości (szybkości) wykonywania w nich 
działań arytmetycznych, a w praktyce - dodawania. 

background image

 

16 

 

Reprezentacja binarna ujemnych liczb całkowitych 

 

 
Aby poszerzyć zakres liczb trzeba stosować bit znaku. Jest on cyfrą  0 lub 1 
poprzedzająca pozostałe bity ciągu. 

Przyjęto, że dla liczb ujemnych wartość 

bitu znaku wynosi zawsze 1.

  Do zapisu liczb ze znakiem stosuje się kody 

oznaczane jako: ZM,U1 i U2.  Należy podkreślić, że dodatnia liczba dziesiętna  x 
we wszystkich kodach jest reprezentowana tym samym ciągiem bitów, czyli jest 
wyrażana w naturalnym kodzie binarnym (NKB). Bity o wartości 1 tego ciągu 
określają wagi, których suma wyraża  wartość x.  
Natomiast jeśli x jest liczbą ujemną to ciąg bitów przedstawiający x jest w 
każdym kodzie inny. Jedynym podobieństwem jest występowanie „1” na 
najstarszym bicie (bicie znaku).   

 
Kod znak- moduł   (ZM) 

 
Kod znak- moduł dla liczby x zapisywanej na n bitach jest definiowany 
następująco: 
 

                    x

  

     jeśli x ≥ 0      - oznacza zapis x  w NKB

 

x

ZM 

=

 

              

 

       

2

n-1

  +|x|

     jeśli x < 0    - definicja dla zapisu a ujemnej 

 
 
Przykład: 
Zapisać liczbę –23 w kodzie ZM na n=8 bitach. Korzystając z definicji mamy: 
 

2

n-1

  =2

7

 =128   

  1 0000000 

 |-23|=               

+0 0010111    

 

                               

1 0010111   

 -23

ZM

    

 
Po binarnym dodaniu dwu składników otrzymujemy binarny ciąg 

1 0010111

   

przedstawiający liczbę –23  w kodzie ZM.

  

 

W kodzie ZM na bicie MSB jest zapisany znak liczby, a na pozostałych bitach jej 
moduł. Dla n bitów zakres liczb jest następujący: 
[-2

n-1

 -1 :  2

n-1

 -1] 

 
Przykładowo  dla n=8 w kodzie ZM można zapisać liczby z zakresu: [-127: 127] 
W kodzie ZM istnieją 2 postacie zera (ujemne i dodatnie)- co jest wadą kodu.  
  

 

background image

 

17 

 
 
Kod  z uzupełnieniem do jedynki- U1 
 

Kod U1 dla liczby x zapisywanej na n bitach jest definiowany następująco: 
 

                    x

  

     jeśli x ≥ 0      - oznacza zapis x  w NKB

 

x

U1 

=

 

              

 

       

(2

n

 –1) - |x|

     jeśli x < 0    - definicja dla zapisu a ujemnej 

 
Przykład: 
Zapisać liczbę –23 w kodzie U1 na n=8 bitach. Korzystając z definicji mamy: 
 

2

n

 -1 =2

8

 -1=255   

  1 1111111 

 |-23|=                   

- 0 0010111    

 

                               

    1 1101000   

 -23

U1

    

Po binarnym odjęciu modułu od ciągu jedynek reprezentującego wartość (2n -1), 
otrzymujemy ciąg   1 1101000

 

, przedstawiający –23 w kodzie U1.

 

   

Wymagane w definicji odejmowanie modułu liczby od ciągu n jedynek jest 
niczym innym jak uzupełnieniem poszczególnych bitów modułu do jedynki.  
Stąd nazwa kodu. Warto zauważyć, że: 

a)  zapisując moduł liczby ujemnej a następnie,  
b)  negując bit po bicie otrzymujemy liczbę ujemną zapisaną w kodzie U1. 

 
Np. dla liczby x=-23 mamy: 
 

 Moduł   

  0 0010111    

 

       

NOT      

  1 1101000   

 - 23

U1

             

 
 
W kodzie U1 na bicie MSB jest zapisany znak liczby, a na pozostałych bitach jej 
moduł uzupełniony do „1”. Dla n bitów zakres liczb jest następujący: 
[-2

n-1

 -1 :  2

n-1

 -1] 

 
Przykładowo  dla n=8 w kodzie U1 można zapisać liczby z zakresu: [-127: 127] 
W kodzie U1 podobnie jak w ZM istnieją 2 postacie zera (ujemne i dodatnie)- co 
jest wadą kodu.  

 

 

 

 

background image

 

18 

Reprezentacja binarna ujemnych liczb całkowitych –kod  U2

 

 

Standardowo w komputerach stosuje się kod U2  (uzupełnienie do 2).  
Liczbę całkowitą x zapisuje się w kodzie U2 na n bitach następująco: 

 
 
 
Sposób A wg wzoru: 

                    x

  

     jeśli x ≥ 0      - oznacza zapis a  w kodzie binarnym (NKB)

 

x

u2 

=

 

      

       

 

       

2

n

  -|x|

     jeśli x < 0    - definicja dla zapisu a ujemnej 

Przykład: 
Zakodować na n=8 bitach liczbę -22. 

I sposób wg. wzoru A. 

1 etap 
 Zamieniamy na postać binarną liczby: 2

n

 (czyli 256)   i 22. 

                       b

8  

b

7   

b

6

  b

5

  b

4

  b

3

  b

2   

b

1

  b

0

 

Wagi bitów:              256  128   64     32    16     8      4       2      1 

 

2

n

        =         1    0   0   0    0  0   0    0   0 

22

(10)

   =               0   0   0    1  0   1    1   0 

2 etap.   

Wykonujemy odejmowanie 

2

n

  -|a|

 : 

 
Pożyczka   

 

 

Dziesiętnie 

2

n

 

 

|22|    

 

-22

u2 

 

 

 

      
      256 
   -   22 
     234

NKB

 

 

 

 

b

7

  b

6

  ...  ...  ....  b

2

  b

1

  b

 

 

gdzie: kolor zielony bit znaku 

 
Jeśli dane tzn n=8 i a=-22 podstawimy do wzoru to mamy: 
 
 2

n

  -|a| =2

8

  -|22| =256-22=234

(10)

  

 
Czyli liczbie –22 w kodzie U2 odpowiada w NKB liczba dziesiętna 234, co 
można sprawdzić dekodując ostatni wiersz (potraktowany jako zapis w NKB): 
 
1* 2

7

  + 1*  2

6

  + 1* 2

 +  1* 2

+  1*2

1

  = 128+64+32+8+2=234 

Liczba 234 jest tu uzupełnieniem modułu liczby ujemnej do liczby 256. 
Stąd wywodzi się nazwa kodu. 

background image

 

19 

Sposób B 

Liczbę całkowitą a zapisuje się w kodzie U2 na n bitach następująco: 
                  a              jeśli a ≥ 0 
 

      -2

(n-1)

  +x     jeśli a < 0 i  a >- 2

(n-1) 

 ,  gdzie x ≥ 0 

 

II sposób wg. wzoru B. 

Pierwszy składnik dla n=8 wynosi –128 i 

jest to waga bitu znaku.

  

Stąd dla liczby a=-22 mamy: x=

2

(n-1)

  +a=2

7

+(-22)=128-22=106. 

Liczba 106 powinna być zapisana na bitach 

b

6

  b

5

  b

4

  b

3

  b

2   

b

1

  b

 

Nr 
bitu 

b

b

6

  b

5

  b

4

  b

3

  b

b

1

  b

0

   

 

waga 

- 128 

64  32  16  8 

 

 

-22

u2

  

 

 

  

 

-128                 106 

=  -22

(10) 

 
                        

Sposób C 

Liczbę całkowitą a zapisuje się w kodzie U2 na n bitach wg następującego 
algorytmu: 

I.  jeśli a ≥ 0 to liczbę a zapisujemy w NKB, 

II.  jeśli a < 0 to: 

a.  zapisujemy w NKB moduł liczby a, 
b.  negujemy bit po bicie (uzupełnienie do U1), 
c.  do najmniej znaczącego bitu tzn b

0

 dodajemy 1.  

Przykład: 
Zakodować na n=8 bitach liczbę -22. 
Ponieważ liczba jest ujemna postępujemy wg punktu II. 
 
Nr bitu

 

b

b

6

  b

5

  b

4

  b

3

  b

b

1

  b

0

   

waga      

 

128 

64  32  16  8  4  2  1   

| 22

(10)

  | 

0  1 

0  1  1  0  Punkt IIa 

Negacja    

1  0 

1  0  0  1  Wynik punktu IIb 

                    +

   

 

 

 

 

 

 

1  Punkt IIc 

Wynik: 

  

 

1  0 

1  0  1  0  Liczba -22

(u2)

 

 
W wyniku postępowania bit znaku 

b

przyjmuje wartość 1, co oznacza liczbę 

ujemną. 
 
 
 

a= 

background image

 

20 

W tabeli  niżej pokazano liczby charakterystyczne dla 8-bitowego  U2 oraz 
dla porównania ich reprezentacje binarne w kodach: ZM i U1. 
 
 

n= 8 

ZM 

U1 

U2 

-127 

1 1111111    1 0000000  1 0000001 

-126 

1 1111110 

 1 0000001  1 0000010 

 

………….. 

………   

-2 

1 0000010 

 1 1111101  1 1111110 

-1 

1 0000001 

 1 1111110  1 1111111 

Zero 

0 0000000  

1 0000000 

 1 1111111 
 0 0000000 

0 0000000   jedna postać 

+1 

0 0000001 

 0 0000001  0 0000001 

+2 

0 0000010 

 0 0000010  0 0000010 

 

………….. 

   

+126 

0 1111110 

 0 1111110  0 1111110 

+127

 

0 1111111 

 0 1111111  0 1111111 

 

Arytmetyka stałoprzecinkowa 

 
W poniższej tabeli przedstawiono operacje dodawania liczb dodatnich 
przedstawionych w różnych kodach. 
 
Wartości 
dziesiętne 

Wartości w  ZM,U1,U2 
(reprezentacje 8-bitowe) 

Wartości w kodzie BCD- 9 
bitów: bit znaku + 2 tetrady 

    89 
+  45 
+134 

      

0

 1011001 

      

0

 0101101 

(1) 0  0000110 
 

(1)- oznacza przeniesienie, 
czyli , 
 że wynik jest > 128 

Zatem wynik jest: 128 + 6

 

                 0

 1000 1001 

                 

0

 0100 0101 

                 

0

 

1100 1110

 

korekcja +        

0110 0110 

                 

0

 0010 0100 

przen. z I tetrady + (1) 

                

(1)

 0011 0100  

otrzymujemy:   
              

100 

  +     

3 *10   +  4 

bo przen. z II tetrady ma wagę 100  

 
Kiedy  w kodzie BCD jest 

korekcja

? – gdy po dodaniu wyniki tetrad(y) są > od 

liczby 9. 

background image

 

21 

Trzeba wtedy do każdej tetrady w której przekroczono zakres kodu BCD dodać

 

liczbę 6

W kolejnej tabeli przedstawiono odejmowanie liczb w   różnych kodach

 
War 
-tości  

Kod ZM 
(5-bitów) 

U1 

U2 

BCD 

    9 
-  7 
+ 2 

  

0

 1001 

1

 0111 

  0 0010 
 
 

     0

 1001 

   +1 1000 
(1) 0 0001 
+            1 
     0 0010

 

        0

 1001 

      +1 1001 
   (1) 0 0010 

 
W U2 przeniesienie 
jest ignorowane 

    

0

 1001 

-  1 0111 
   0 0010

 

 

W kodzie 

ZM i BCD

•  znak liczby wynika ze znaku większego modułu  
•  od większego modułu  odejmujemy mniejszy. 

W kodzie U1

  operacja odejmowania jest zastąpiona operacja dodawania 

wszystkich pozycji łącznie z bitem znaku i uwzględnieniem powstałego 
przeniesienia. Oznacza to konieczność korekcji polegającej na dodaniu 1 do 
najmniej znaczącej pozycji wyniku.  

W kodzie U2

 podobnie jak w U1 operacja odejmowania jest zastąpiona operacja 

dodawania wszystkich pozycji łącznie z bitem znaku, ale nie ma potrzeby 
korekcji. Przeniesienie jest  ignorowane. Ten algorytm jest najszybszy.  

background image

 

22 

Operacje dodawania na liczbach ze znakiem (w kodzie U2) 

 
Należy zrealizować operacje: 

a)  96 –16     co jest tożsame 96 + (-16) 
b)  16 – 96 
c)  –16 +(-96) 

Ad a)  Zamieniamy liczby 96 i –16 na kod U2 i dodajemy    te liczby. 

 

Nr bitu

 

 

b

b

6

  b

5

  b

4

  b

3

  b

b

1

  b

0

   

waga  

    

 

 

znak  64  32  16  8  4  2  1   

Przeniesienie 

(1) 

 

 

 

 

 

 

Przeniesienie jest 
ignorowane 

96

(u2)

 

 

0  0  0  0  0   

-16

(u2)

 

   + 

1  0  0  0  0   

Wynik w U2 :            

 

1  0  0  0  0       80

(10) 

W wyniku operacji otrzymujemy wartość w NKB – świadczy o tym wartość bitu 
b7=0. Przeniesienie 

(1)

 przekracza przyjęty zakres n=8 bitów i jest ignorowane. 

Ad b)    Zamieniamy liczby 16 i –96 na kod U2 i dodajemy. 
Nr bitu

 

 

b

b

6

  b

5

  b

4

  b

3

  b

b

1

  b

0

   

waga

      

 

 

znak  64  32  16  8  4  2  1   

Przeniesienie 

 

 

 

 

 

 

 

 

 

 

16

(u2)

 

 

1  0  0  0  0   

-96

(u2)

 

   + 

0  0  0  0  0   

Wynik w U2:            

 

1  0  0  0  0  -80

(10)

  

 

W wyniku operacji otrzymujemy wartość w U2 bo składniki były w U2. Wartość 
jest ujemna, bo   świadczy o tym wartość bitu b7=1.  
Czyli wynik jest:  -2

7

+ (wynik w NKB na 6 bitach)=-128+48=-80

(10). 

Lub inaczej określamy moduł: 
 

2

8

- (wynik z 8 bitów interpretowany  w NKB)=256-176=80

(10).

 

Ponieważ  o znaku wyniku świadczy b7=1 stąd  wynik=-80

(10). 

 
Ad c)  Zamieniamy liczby -16 i –96 na kod U2 i dodajemy te liczby. 
Nr bitu

 

 

b

b

6

  b

5

  b

4

  b

3

  b

b

1

  b

0

   

waga  

    

 

 

znak  64  32  16  8  4  2  1   

Przeniesienie 

(1) 

 

 

 

 

 

 

 

-16

(u2)

 

 

1  0  0  0  0   

-96

(u2)

 

   + 

0  0  0  0  0   

 Wynik:            

 

1  0  0  0  0   

-112

(10).

    

 

W wyniku operacji otrzymujemy wartość ujemną w U2 – świadczy o tym wartość bitu b7=1.  
Czyli wynik jest:  -2

7

+ (wynik w NKB na 6 bitach)=-128+16=-112

(10). 

 
 

background image

 

23 

 

Reprezentacja liczb rzeczywistych 

 

Przy reprezentacji liczb ułamkowych w komputerze nie można formalnie 

wykorzystać przecinka (bo mogą być tylko zera i jedynki). W praktyce określa się 

ilość miejsc przeznaczoną na część całkowitą i ułamkową liczby, dzięki czemu 

wiadomo, jakiej wartości odpowiada dana pozycja. Np. liczba rzeczywista jest 

reprezentowana na 4 bajtach z czego: 

 część całkowita to 2 bajty. 

 część ułamkowa to 2 bajt 

Należy także podkreślić, że ułamki z systemu dziesiętnego podaje się w notacji 
binarnej  najczęściej  z  określoną  dokładnością  (jako  liczby  przybliżone). 
Dokładność ta jest większa od wartości ostatniej pozycji przeznaczonej na zapis 
liczby. Przedstawiając np. liczbę 0,3 na 5 bitach, zapiszemy ją jako: 

 0 01001 

(2)

= 0,28125

(10)

Różnica pomiędzy 0,28125 a 0,3 wynosi 0,01875, co jest mniejsze od  

2

-5

 = 0,03125. 

Ułamki dodatnie w kodzie binarnym

 

W systemie dziesiętnym kolejne pozycje po przecinku odpowiadają kolejnym, 

ujemnym potęgom liczby 10. 

0.546 =    5*10

-1   

+ 4*10

-2   

 + 6*10

-3   

  

W systemie binarnym kolejne pozycje po umownej pozycji oznaczającej 

położenie przecinka oznaczają kolejne ujemne potęgi liczby 2.  Aby  w zapisie 
uwidocznić, że jest to ułamek  stosuje się czasem  poprzedzającą spację. Np.: 

0  1011  = 1*2

-1

  +  1*2

-3

 

 

+ 1*2

-4

 =0.5 + 0.125 +0.625=0.6875 

Czasami też można spotkać zapis z przecinkiem:   

, 1011 

 

Przykład:  Zapisać w kodzie binarnym liczbę  0,1875 
Działanie  Wynik  Cz. Ułamk.  Cz. Całk. 
0,1875*2  0,375  0,375 

0,375*2 

0,75 

0,75 

0,75*2 

1,5 

0,5 

0,5*2 

0 *2 

itp 

 

 

 

Od chwili gdy mnożymy przez zero zawsze  
część całkowita będzie zerem – czyli kolejne bity  
 nigdy nie będą 1, a to oznacza że nie wnoszą 
żadnej informacji   

Sprawdzenie: 

0  0011 =

   1*2

-3

 +1*2

-4

= 0,125 +0,0625=0,1875 

Wynik:  
 
0,1875 =0  0011 
Tu wystarczą 4 bity na 
część ułamkową ! 

background image

 

24 

Liczba ułamkowa jest tu reprezentowana dokładnie. 
 
Przykład:  Zapisać w kodzie binarnym liczbę  0,1675 
 
Działanie  Wynik  Cz. Ułamk.   Cz. Całk. 
0,1675*2  0,335  0,335 

0,335*2 

0,67 

0,67 

0,67*2 

1,34 

0,34 

0,34*2 

0,68 

0,68 

0,68 *2 

1,36 

0,36 

0,36 *2 

0,72 

0,72 

0,72*2 

1,44 

0,44 

0,44*2 

0,88 

0,88 

0,88*2 

1,76 

0,76 

itp 

 

 

 

 Tu kolejne bity  wnoszą dodatkową  informację, bo 
niektóre z nich są jedynkami  

 
Tu reprezentacja liczby 0,1675 nie jest dokładna i zależy od liczby 
uwzględnionych bitów. 
 
Liczba bitów 

Wartość zapisana 

Różnica  ∆    

0,125 

0.0425 

0,15625 

0,01125 

0,15625 

0,01125 

0,16406 

0,00344 

itp 

 

 

 Przy uwzględnianiu n bitów różnica ∆   między wartością zapisaną a rzeczywistą 
spełnia nierówność: 
 

 

∆   < 2

-n

  

 Np. dla n=4   ∆ = 0.0425 <2

-4

    (bo 0.0425 <0,0625) 

Wniosek:  

1  Liczby ułamkowe mogą nie być dokładnie reprezentowane przez 

rozwinięcie binarne, 

2  Większa liczba bitów zapewnia generalnie większą dokładność 

przybliżenia ułamka. 

Np.: Dla liczby   
0,1875 =0  0011 
Wystarczą 4 bity na dokładne reprezentowanie  ułamka. 

background image

 

25 

 
Zapis liczby rzeczywistej bez znaku w kodzie binarnym

  

Przykład:      Zapisać w kodzie binarnym liczbę 34,75

(10) 

Tabela Zamiana liczby 34 NKB     

Działanie  Wynik  Reszta 

 34 :2 

17 

17 : 2 

8  

8 : 2 

4: 2 

2:2 

1:2 

 

Tabela Zamiana liczby 0,75 na kod bin. 

 

Działanie  Wynik  Cz. Ułamk.  Cz. Całk. 

0,75 *1 

1,5 

0,5 

0,5 *2 

 

100010  11 

Stąd dodatnią liczbę  rzeczywistą 34,75

(10)   

można zapisać binarnie  jako: 

 

34,75

(10)  = 

100010  11 

 

 

 

 

Sprawdzenie: 2

5

 +2

1

 +2

-1

 +2

-2

 =32 +2 +0.5 + 0.25= 34,75 

 

 

 

 

Wynik: 
Część całkowita liczby 34,75

(10) 

 

34

(10)

= 1 0 0 0 1 0     

Wynik: 
Część ułamkowa 
liczby 34,75

(10) 

 

0,75= 0 11   

 

,,,,    

background image

 

26 

Reprezentacja ułamków w kodzie U2 

Kod U2 umożliwia reprezentację zarówno dodatnich jak i ujemnych liczb 
rzeczywistych. Stosowany jest powszechnie bowiem ułatwia operacje 
matematyczne. 

Ułamki dodatnie w kodzie U2 zapisuje się w postaci ciągu bitów o wartościach 0 
lub 1 w którym jedynki wskazują na  kombinacje wag, które po zsumowaniu 
tworzą liczbę ułamkową . Wagi są kolejnymi ujemnymi potęgami liczby 2  
zaczynając od n= -1.  

Ułamki ujemne w kodzie U2 koduje się wg wzoru: 

 

 

 

2 –X

’  

    gdzie: X

 – notacja binarna ułamka dodatniego 

Przykład: Zapisać w U2  X=-0,1875 

Etap 1.     Określenie wartości binarnej X

 

Działanie  Wynik  Cz. Ułamk.  Cz. Całk. 

0,1875*2  0,375  0,375 

0,375 *2  0,75 

0,75 

0,75   *2  1,5 

0,5 

0,5      *2  1 

Etap 2     Odjęcie binarne 2 –X

’  

     

Pożyczka 

 

 

 

0  

,

  0 

X

 

 

-0,1875

(U2) 

 

 

wagi 

 

 

 

2

-1 

-2 

2

-3 

2

-4 

Pola na prawo od kolorowej  linii oznaczają bity części ułamkowej. 

Jak  sprawdzić poprawność otrzymanej wyżej reprezentacji tzn. że : 

 

 

-0,1875

(U2)

 = 

1

  1101  ?. 

Można obliczyć 2- |-0. 1875|=1.8125  

Czyli powinna być zakodowana w NKB  liczba 1.8125.  Część całkowita jest tu 
równa 1, a w interpretacji zapisu jako liczby w U2 ta „1” symbolizuje znak.  

 

 

 

 
 

X

 =0 0011 

background image

 

27 

 

Można też  sprawdzić poprawność otrzymanej wyżej reprezentacji tzn. że : 

 

 

-0,1875

(U2)

 = 

1

  1101 

 wykonując  binarne odejmowanie 2 –X

’’  

 (gdzie X

’’  

 jest otrzymanym zapisem 

binarnym ułamka X w kodzie U2) 

Pożyczka 

Operacja 

 

 

0  

,

  0 

 X

 

 

|-0,1875|

 

 

Sprawdzenie:  1* 2

-3

 + 1*2

-4

 = 0,125 +0,0625 = 0, 1875  

Czyli otrzymany tu wynik jest modułem kodowanego ułamka. 
 
 
 

Reprezentacja liczb rzeczywistych w kodzie FP2 

 

W kodzie FP2 (floating point– kod zmiennoprzecinkowy) liczba jest zapisywana 
w postaci w2ykłaqdniczej tzn. wg wzoru: 
 

L=(–1)

S

 

 P

C

 

 

gdzie: P– podstawa systemu liczenia, m– mantysa, c– cecha 
           s– wartość bitu znaku   („1” -oznacza +, „0”- znak -)

  

 

Poniższa tabela przedstawia  strukturę 16 bitowego  kodu FP2: 

 

 

znak 

cecha 

mantysa 

bit 

15 

14 

13  12  11  10 

waga 

-16  8 

2

-1

  2

-2

  2

-3

  2

-4

  2

-5

  2

-6

  2

-7

  2

-8

  2

-9

  2

-10

 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 

 
 
 
 

 

background image

 

28 

 
Przykład 1 

Przedstawić  liczbę 125.75 w kodzie FP2.  
Szukamy n takiego, że 125.75<2n i mnożymy liczbę przez 2n i bierzemy 
część całkowitą liczby. 
125.75 * 2

7

 = 125.75*128=16096

 

(liczba parzysta) 

 

16 096 : 2 

8 048 : 2 

4 024 : 2 

2 012 : 2 

1 006 : 2 

503 : 2 

251 : 2 

125 : 2 

62 : 2 

31 : 2 

15 : 2 

7 : 2 

3 : 2 

1 : 2 

0   

 

Otrzymujemy: 

 

1 1 1 1 1 0 1 , 1 1 0 0 0 0 0  czyli 125,75 

 
Przesuwamy przecinek w lewo, tak aby był po najbardziej znaczącej 
jedynce –tu o 6 miejsc : 
 
1 , 

1 1 1 1 0 1 1 1 0 0 0 0 0

  cecha będzie 

2

6

  

 

 

 

L= (1 + 0.96484375)* 26 =125,75

 

Czyli liczbę w FP2 możemy  zapisać następująco: 

125,75 = (0 00110 1111011100)FP2

 

 
 

L=

 

(1 +

 

0.96484375)

*

 2

6

 

=125,75

 

Wartość liczby L jest w tym przypadku dokładna, ale w ogólnym przypadku 
liczba jest przedstawiana z pewnym przybliżeniem. 

Pierwsze 7 bitów – to część całkowita, 
dalsze 7 ułamkowa 
 
Ale to jest dopiero reprezentacja binarna 
liczby ułamkowej a nie liczby w kodzie 
FP2!!!  

 

0.96484375 

mantysa=0.96484375 

cecha= 6  

background image

 

29 

Dekodowanie liczby zapisanej w kodzie FP2  

Rozkodujemy teraz z powrotem liczbę w kodzie FP2 z pierwszego przykładu 
tzn: 
       (

0

 

01010

 

1111000000

)

FP2

 

Posłuży do tego przedstawiona wcześniej w tabelce struktura kodu FP2.  
Rozpatrując kolejne elementy, otrzymujemy: 

s = 0, a więc mamy: (-1)

0

 

m = 1111000000, a więc mamy: 2

-1

 + 2

-2

 + 2

-3

 + 2

-4

 

c = (01010)

U2

 = 10

, a więc mamy 

2

10

 

Składając to razem zgodnie z wzorem, otrzymujemy: 

(-1)0 * (

2

0

 + 2

-1

 + 2

-2

 + 2

-3

 + 2

-4

) * 

2

10

 =2

10

 + 2

9

 + 2

+ 2

7

 + 2

= 1024 + 512 

+ 256 + 128 + 64 = 1984 
 
 
 
 
 
 
 
Widać tu, że zakodowanie liczby w takim a nie innym systemie FP2, za pomocą 
określonej ilości bitów przeznaczonych na cechę i na mantysę spowodowało 
ograniczenie dokładności do pewnej liczby miejsc po przecinku (tym już 
przesuniętym). Stąd utrata dalszej części liczby. 
 
 
 
 
 
 
 
 

 

Składnik 

2

odpowiada jedynce przed przecinkiem, którą 

zapamiętaliśmy i nie zapisaliśmy w zakodowanej liczbie, 
oszczędzając jeden bit. Nie wolno o niej zapomnieć podczas 
rozkodowania liczby.

 

Precyzja liczby zapisanej w kodzie FP2 zależy od ilości bitów 
przeznaczonych na mantysę 

Zakres liczby zależy od ilości bitów przeznaczonych na cechę. 

background image

 

30 

 

 

Arytmetyka zmiennoprzecinkowa 

 

Operacje arytmetyczne na liczbach zmiennoprzecinkowych wykonywane są 
zgodnie z regułami, z tym że wynik zapisywany jest również w postaci cecha – 
mantysa.  
Jeżeli (np. w systemie dziesiętnym P=10) określimy dwie liczby A i B tak, że : 

 

  

A

c

A

m

A

10

=

 

        oraz    

B

c

B

m

B

10

=

 

oraz przyjmiemy, że

 

B

A

c

c

d

=

to:

 

 

B

A

c

B

d

A

c

c

m

m

B

A

B

±

=

±

 

dla

 

10

)

10

(

 

 

A

B

c

d

B

A

c

c

m

m

B

A

A

±

=

±

 

dla

 

10

)

10

(

 

 

)

(

10

B

A

c

c

B

A

m

m

AB

+

=

 

 

B

A

c

c

B

A

m

m

B

A

=

10

 

 

Np.: A=2230 = 0,223E

4

   

  
        B=125   =0,125E

3

    

              C

> C

B

   

 d= C

 -C

B

 =4-3=1  

 
A+B=(0,223E

4

+0.125)E

3

 =(2,23+0,125)E

3

 =2,355E

3

 =0,2355 E

4

    

 

W podobny sposób możemy zapisywać operacje dodawania, odejmowania, 
mnożenia i dzielenia jeśli przyjmiemy, że podstawą  jest P=2 a nie 10 –jak 
powyżej. 

 
 
 

background image

 

31 

Kodowanie informacji tekstowej 

 

Do kodowania informacji tekstowej wykorzystuje się   
kod 

ASCII (American Standard Code for Information Interchange).

 W tym kodzie 

znaki są: 

• 

zapisywane w jednym bajcie, można w ten sposób zakodować 256 różnych 
znaków 

• 

ASCII obejmuje: 

– 26 małych liter alfabetu łacińskiego 
– 26 dużych liter alfabetu łacińskiego 
– 10 cyfr 
– spacje 
– znaki specjalne, np. ! "#$% & 
–  znaki sterujące (kody ASCII od 0 do 31), np. przejdź do nowego wiersza 

(oznaczenie LF od Line Feed), powrót karetki do początku wiersza (CR, od słów 
Carriage Return), tabulator, koniec tekstu (EOT, od słów End of Text) 

• 

kody ASCII powyżej 127 to tzw. zestaw rozszerzony; zapisuje się w nim znaki 
narodowe i znaki semigrafiki symbole np. pozwalające tworzyć na ekranie ramki 
itp.) 

 

  Obecnie  do  użytku  wprowadzany  jest  nowy  sposób  kodowania  znaków  o  nazwie 
UNICODE.  Jest  to  16-bitowy  standard,  w  którym  jest  miejsce  na  wszystkie  alfabety 
narodowe,  dotychczas  jeszcze  niezbyt  powszechny.  W przyszłości  pozwoli  on  na 
uniknięcie  niedogodności  związanych  z  ograniczoną  pojemnością  kodu  ASCII  i 
koniecznością  instalowaniem stron kodowych. 

background image

 

32 

 

Tabela.  Kody znakowe ASCII 

Dec  Hex   Bin      Znak 

Dec  Hex   Bin      Znak 

Dec  Hex   Bin       Znak 

0  

   00    0000000  NUL ' 0' 

1     01    0000001  SOH       
2     02    0000010  STX       
3     03    0000011  ETX       
4     04    0000100  EOT       
5     05    0000101  ENQ       
6     06    0000110  ACK       
7     07    0000111  BEL '\a'  
8     08    0001000  BS  '\b'   
9     09    0001001  HT  '\t'    
10   0A    0001010  LF  '\n'  
11   0B    0001011  VT  '\v'  
12   0C    0001100  FF  '\f'   
13   0D    0001101  CR  '\r'  
14   0E    0001110  SO      
15   0F    0001111  SI        
16   10    0010000  DLE    
17   11    0010001  DC1    
18   12    0010010  DC2    
19   13    0010011  DC3    
20   14    0010100  DC4    
21   15    0010101  NAK   
22   16    0010110  SYN    
23   17    0010111  ETB    
24   18    0011000  CAN   
25   19    0011001  EM      
26   1A    0011010  SUB   
27   1B    0011011  ESC    
28   1C    0011100  FS       
29   1D    0011101  GS      
30   1E    0011110  RS      
31   1F    0011111  US      

32   20    0100000  spacja  

33   21    0100001  !          
34   22    0100010  ``         
35   23    0100011  #          
36   24    0100100  $          
37   25    0100101  %        
38   26    0100110  &         
39   27    0100111  '           
40   28    0101000  (          
41   29    0101001  )          
42   2A    0101010  *         

43   2B    0101011  + 
44    2C    0101100  ,   
45    2D    0101101  -  
46    2E    0101110  .   
47    2F    0101111  /   

48    30    0110000  0   
49    31    0110001  1   
50    32    0110010  2   
51    33    0110011  3   
52    34    0110100  4   
53    35    0110101  5   
54    36    0110110  6   
55    37    0110111  7   
56    38    0111000  8   
57    39    0111001  9   

58    3A    0111010  :   
59    3B    0111011  ;   
60    3C    0111100  <  
61    3D    0111101  = 
62    3E    0111110  >  
63    3F    0111111  ?   
64    40    1000000  @ 
65    41    

1000001  A 

66    42    1000010  B 
67    43    1000011  C 
68    44    1000100  D 
69    45    1000101  E 
70    46    1000110  F 
71    47    1000111  G 
72    48    1001000  H 
73    49    1001001  I 
74    4A    1001010  J 
75    4B    1001011  K 
76    4C    1001100  L 
77    4D    1001101  M 
78    4E    1001110  N 
79    4F    1001111  O 
80    50    1010000  P 
81    51    1010001  Q 
82    52    1010010  R 
83    53    1010011  S 
84    54    1010100  T 
85    55    1010101  U

 

86    56    1010110  V 
87    57    1010111  W 
88    58    1011000  X 
89    59    1011001  Y 
90    5A    1011010  Z 

91    5B    1011011  [ 
92    5C    1011100  \   '\\' 
93    5D    1011101  ] 
94    5E    1011110  ^ 
95    5F    1011111  _ 
96    60    1100000  ` 
97    

61    1100001  a 

98    62    1100010  b 
99    63    1100011  c 
100   64    1100100  d 
101   65    1100101  e 
102   66    1100110  f 
103   67    1100111  g 
104   68    1101000  h 
105   69    1101001  i 
106   6A    1101010  j 
107   6B    1101011  k 
108   6C    1101100  l 
109   6D    1101101  m 
110   6E    1101110  n 
111   6F    1101111  o 
112   70    1110000  p 
113   71    1110001  q 
114   72    1110010  r 
115   73    1110011  s 
116   74    1110100  t 
117   75    1110101  u 
118   76    1110110  v 
119   77    1110111  w 
120   78    1111000  x 
121   79    1111001  y 
122   7A    1111010  z 

123   7B    1111011  { 
124   7C    1111100  | 
125   7D    1111101  } 
126   7E    1111110  ~ 
127   7F    1111111  DEL 

 

 

background image

 

33 

 

Reprezentacja kolorów i kodowanie grafiki 

Reprezentacja kolorów 
 

• 

Różne częstości światła widzialnego mają różne barwy. 

• 

Każdą z nich można uzyskać łącząc 3 kolory: czerwony, zielony i niebieski 
(

system RGB

). 

• 

RGB jest stosowany w telewizji, monitorach komputerowych. 

• 

Do druku stosuje się system odbiciowy. 

• 

Biały papier odbija wszystkie barwy, czarny pochłania wszystkie. 

• 

Barwniki pochłaniają wybrane barwy, odbijają pozostałe. 

• 

System CMY: barwniki cyan (sinoniebieski), magenta (purpurowy), yellow żółty). 

• 

Suma C+M+Y teoretycznie daje barwę czarną, w praktyce nieładny, 
ciemnobrązowy kolor. 

• 

Dlatego: CMYK (dodatkowo czarny barwnik), ale obrazy kodowane w CMYK’u nie 
wyglądają ładnie  monitorze. 

 

Kodowanie grafiki 2D 

• 

Grafika rastrowa: 

•  obraz złożony z kropek (pikseli), zwany bitmapą, 
•  barwa każdego piksela kodowana na określonej ilości bitów, 
•  8 bitów – 256 kolorów, 16 bitów – 65536 kolorów, 24 bity – 16.8 milionów kolorów 

(tzw. true color), 

•  większa ilość bitów  stosowana wtedy, gdy obraz ma podlegać obróbce (np. 

wydobyciu niewidocznych szczegółów) 

•  przy powiększaniu rozmiarów bitmapy jakość się pogarsza, 

• 

formaty rastrowe: 

GIF, PNG, JPEG, TIFF, 

•  GIF (Graphics Interchange Format), 8 bitów, bezstratna kompresja 
•  umożliwia animację,  (ale tylko 256 kolorów), 
•  tworzenie GIF-ów wymaga opłat licencyjnych, dlatego stworzono format 

zastępczy: PNG (Partable Network Graphics) 

•  PNG koduje obrazy na 1-49 bitach, bezstratna kompresja 
•  JPEG (Joint Photographic Experts Group)-zaletą jest 24 bitowe kodowanie oraz 

kompresja z utratą danych (im gorsza jakość, tym mniejszy plik wynikowy; w 
praktyce stosuje się parametr jakości 75, JPEG może zapisać kolory w systemie 
RGB lub CMYK; 

background image

 

34 

• 

Grafika wektorowa: 

–  Obraz złożony z wektorów (odcinek kodują współrzędne początku, końca 

i barwa), 

–  okrąg: współrzędne środka, promień i barwa 

–  grafikę wektorowa można przeskalowywać (oraz deformować) bez utraty 

jakości, 

–  rysunek w formacie wektorowym zajmuje znacznie mniej miejsca, niż w postaci 

bitmapy, ale zdjęcia lepiej zapisywać jako bitmapy, 

–  programy pracujące z bitmapami często nazywają się malarskimi (np. 

PaintShopPro), grafiką wektorową - rysunkowymi (np. CorelDraw); 

• 

Grafika 3D

 - przedstawiana na płaszczyźnie jako rzut 3 wymiarowej sceny; 

zaawansowane techniki pozwalają na zmianę projekcji, na „poruszanie się” w 
prezentowanej przestrzeni (np. gry komputerowe, standardem w Internecie jest 
format VRML (Virtual Reality Markup Language); 

• 

 

Animacja

 - formaty MPEG, QuickTime, AVI. 

 

background image

 

35 

 
 

 

 
 
 
 
 
 
 
 
 
 

Cz II 

 
 
 

FORMY PRZEDSTAWIANIA ALGORYTMÓW. 

PRZYKŁADY PROJEKTOWANIA ALGORYTMÓW 

 

 

Materiały do ćwiczeń dla studentów

 

background image

 

36 

Algorytm  

Algorytm to sposób (schemat) postępowania prowadzący do rozwiązania danego, 
problemu. Lub mówiąc  inaczej algorytm to skończony ciąg operacji na obiektach (mogą 
to być np. liczby, relacje między liczbami typu a>b, teksty) ze ściśle ustalonym 
porządkiem wykonywania, dający możliwość realizacji zadania z określonej klasy. 
Algorytm w sensie informatycznym wykorzystuje określone dane o zdefiniowanych 
strukturach (np. liczby całkowite, rzeczywiste, zespolone, tablice jedno i wielowymiarowe, 
rekordy itp ) i daje określone wyniki. 
Algorytm powinien posiadać cechy: 
  Poprawność – dla każdego zestawu poprawnych danych  wyniki powinny być 

poprawne; 

  Skończony- dla każdego zestawu poprawnych danych algorytm powinien dawać 

poprawne wyniki po skończonej liczbie kroków, 

  Określoność – z algorytmu musi wynikać jednoznacznie jaka ma być realizowana 

następna operacja, 

  Efektywność- algorytm powinien realizować zadanie przy możliwie najmniejszej 

liczbie kroków, 

  Uniwersalność- powinien rozwiązywać nie tylko specyficzne zadanie ale całą 

klasę zadań. 

Algorytm można zapisać w postaci: 

  Opisu słownego, 

  Listy kroków, 

  Schematu blokowego (flow diagram, flow chart), 

  Pseudokodu 

Opis słowny

 algorytmu jest ogólną ale mało precyzyjną formą prezentacji  . Niesie ona 

ryzyko niejednoznaczności przy złożonych algorytmach. Stosuje się ją dla 
zasugerowania rozwiązania. Popularnym sposobem jest lista kroków postępowania. 
Kroki stanowią opis operacji i są zazwyczaj mieszaniną sformułowań matematycznych i 
języka naturalnego. Kolejność kroków jest zgodna z opisem. Wyjątkiem jest operacja 
przejścia do wskazanego kroku lub też zakończenia algorytmu. 

Schemat blokowy

 (sieć działań)  składa się z symboli graficznych w których opisywane 

są operacje algorytmu. np. zmiany kolejności kroków 
 
 

 

 

 

 

 

TAK 

 
 

 

 

 

       NIE 

Stosuje się różne kształty symboli dla rozróżnienia operacji. Następstwo operacji 
określają strzałki. Jest doskonałą komunikacją między „zleceniodawcą” a programistą. 
Jednak złożone problemy trudno jest przedstawić przy pomocy tego typu schematów. 
Dlatego stosuje się różne poziomy szczegółowości (od ogółu do szczegółu- schemat 
zstępujący ). 

Pseudokod

  jest wygodną formą prezentacji algorytmów. Bazuje na opisie w języku 

zbliżonym do bardzo ogólnej formy języka programowania (np. typu Pascal). Występują 
tu bardzo uproszczone formy opisu operacji wprowadzania i wyprowadzania danych. W 

a>b 

background image

 

37 

opisach algorytmów przy wykorzystaniu pseudokodu stosuje się typowe nazwy instrukcji  
występujące w niektórych językach wysokopoziomowych jak np: 

 If (warunek)  then instrukcja1 

else  instrukcja2   

 for  zmienna:=war_poczatkowa  step  war_kroku  until  war_koncowa do 

instrukcja lub blok instrukcji, 

W powyższym zapisie pierwsza konstrukcja zmienia sterowanie kolejności wykonywania 
instrukcji (kroków). Drugi z zapisów określa tzw. pętlę, która  pozwala na  wielokrotne 
powtarzanie wykonania określonych instrukcji. Pętla for jest stosowana jęśli dokładnie 
wiadomo ile razy ma nastąpić powtarzanie. Jeśli liczba powtórzeń nie jest znana to 
stosowane są inne konstrukcje pętli  np. pętla typu: 
 

while (warunek)  do 

 

instrukcja lub blok instrukcji 

. Wówczas badany jest pewien warunek logiczny i  tylko  w przypadku jego prawdziwości 
następuje kolejne wykonanie pętli.  
 
Wśród algorytmów wyróżnia się: 

 sekwencyjne – instrukcje wykonywane kolejno, ale mogą też wystąpić  ewentualne 

rozgałęzienia, 

 iteracyjne- to algorytmy w których pewne grupy instrukcji są wykonywane 

wielokrotnie (ściśle zadaną liczbę razy lub wynikającą z przebiegu obliczeń), 

 rekurencyjne- to algorytmy które wywołują same siebie dla zmieniających się 

danych 

 

Algorytm powinien posiadać specyfikację  gdzie określamy dane z jakich algorytm 
korzysta oraz wyniki które powinien dawać, a także niezbędne  zmienne pomocnicze. 

W algorytmach mogą również występować wyrażenia które są zbudowane ze 
zmiennych, stałych,  operatorów (np. +, - , *, /)  i funkcji matematycznych. Wyrażenia 
mogą też przybierać postać wyrażeń warunkowych. Wówczas do ich budowy 
wykorzystywane są operatory relacyjne (np. =, >, <, <=, >=, <>). 

 W algorytmach występują często tzw. operacje przypisania (np. x:=x +5), określające, 
że obliczona wartość wyrażenia z prawej strony zostanie podstawiana pod zmienną ze 
strony lewej.  

 

  

  

background image

 

38 

Przykład sformułowania prostego algorytmu: 

Zadanie 
Sformułuj algorytm obliczający pole prostokąta. Zapisz algorytm w postaci listy 
kroków, schematu blokowego i pseudokodu.  
a)   Specyfikacja algorytmu: 

Dane wejściowe: 
a- 

pierwszy bok, liczba rzeczywista dodatnia- w cm, 

b- 

drugi bok, liczba rzeczywista dodatnia- w cm. 

Wynik

:   P –pole prostokąta (w cm

2

     Lista kroków: 
 

K1: Wczytaj wartość pierwszego boku i podstaw pod zmienną a, 

 

K2: Wczytaj wartość drugiego boku i podstaw pod zmienną b, 

 

K3: Oblicz pole i podstaw pod zmienną p 

 

K4: Wyświetl wynik p 

   b)   Pseudokod: 
      

Program  pole

                                         {nagłówek} 

      zmienne 

                  

a,b,p: real

                                    {deklaracja zmiennych} 

      

begin

                                                        {początek właściwego programu} 

          

czytaj (a)                                        

{wczytanie danych} 

          

czytaj(b) 

          

P:=a*b

                                                   {obliczenia} 

          

wyświetl(„Pole wynosi   P=”, p)

     {wyświetl wynik} 

      

end 

                                                        {koniec właściwego programu} 

c)  Schemat blokowy:                 d)  Zapis w języku programowania 

                                                                         ( np. Pascal) 

 

 
 
 
 
 
 
 
 
 
 
 

Start 

Wprowadź: a  
Wprowadź: b 

Oblicz:  P:=a*b 

Pisz:”Pole wynosi P=”  P  
 

Stop 

program   pole 
var 
   a, b, p: real; 
begin 
  readln(a); 
  readln(b); 
  p:=a*b; 
  write(’Pole P= ’,p:4:2,’ cm2’) 
end. 

background image

 

39 

Rozwiązanie danego problemu przy zastosowaniu odpowiednio przygotowanego 
programu komputerowego wymaga realizacji wielu etapów etapów projektowych i 
uruchomieniowych. Problem ten przedstawiono na poniższym rysunku, zakładając, że  
dotyczy to  programu komputerowego obliczającego pole prostokąta.  
 

 

 

 
 
 
 
 

 
 

 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 

 
Na rysunku pokazano drogę od problemu, który wymaga rozwiązania do programu 
komputerowego rozwiązującego problem, przy założeniu, że potrafimy poprawnie 
sformułować algorytm. Pętle sugerują, że niektóre etapy będą powtarzane z powodu 
różnego rodzaju błędów, których trudno uniknąć przy bardziej złożonych problemach. 
Pierwsza grupa błędów wynika zwykle z błędnych zapisów algorytmu w języku 
programowania. Druga grupa dotyczy błędów wykonania wynikających  z 
niepoprawności algorytmu lub niewłaściwego kodowania w danym języku. Aby 
skompilować program (tzn. przetłumaczyć go na ciąg rozkazów w zapisie zero-
jedynkowym zrozumiałym dla komputera) to musi on być całkowicie zgodny ze 
standardem danego języka (tu Pascala).  Ale uzyskanie programu  poprawnego 
językowo nie musi oznaczać, że poprawnie rozwiązuje problem. Stąd może ponownie 
wynikać konieczność zmiany jego wersji źródłowej – co pokazuje większa pętla. 
Czasami również będzie konieczność jej rozszerzenia tzn. zmiany  algorytmu. 

Program 

komputerowy 

2. Testowanie – 
usuwanie błędów 
logicznych 

Algorytm 

Algorytm 

Algorytm 

Algorytm 
rozwiązania

rozwiązania

rozwiązania

rozwiązania    

Problem ! 

Wykonanie programu

  

Program 

źródłowy 

Wyniki 

Dane 

Start 

Wprowadź: a  

Wprowadź: b 

Oblicz:  P:=a*b 

Pisz:”Pole i P=”  P  

 

Stop 

program   pole 

var 

   a, b, p: real; 

begin 

  readln(a); 

  readln(b); 

  p:=a*b; 

  write(’Pole P= ’,p:4:2,’ cm2’) 

end. 
 

Kompilacja 

1

. Uruchamianie 

   (usuwanie błędów 
   językowych)

 

background image

 

40 

Prezentacja algorytmów i ich analiza 

 

W niżej przedstawionym algorytmie pokazano iteracyjne powtarzanie niektórych 
kroków oraz sposób jego analizy. 
 
Przykład:  
Znaleźć największy wspólny dzielnik (NWD(n,m) ) liczb całkowitych m i n 
Najbardziej znanym algorytmem rozwiązującym ten problem jest algorytm  Euklidesa (ok. 
300r p.n.e.). 
Specyfikacja 
Dane: m, n – liczby całkowite,                  Założenie: n 

≥ m 

Wynik: NWD(n,m) 

Algorytm: 
K1. Podziel n przez m. Niech r będzie resztą z dzielenia. 
K2. jeśli r=0 to wynikiem jest m. KONIEC. 
K3. Wykonaj: 

 n:=m    m:=r 
 Przejdz do K1 

 
Przykład: 1     NWD(n=12, m=6) 
K1. n/m=12/6= 2  r=0  
K2  r=0 . Stąd m=6 jest poszukiwaną liczbą tzn. NWD(12,6)=6 
 
Przykład: 2     NWD(n=12, m=8) 

      

K1. n/m=12/8= 1  r=4  

      K2  r≠0 .  
      K3  n:= 8 m:=4 
 

K1    n/m=8/4=2    r=0 

           K2   r=0 . Stąd m=4 jest  . czyli NWD(12,8)=4 
 
Przykład: 3   Określ  NWD(n=44, m=16) 
K1. n/m=44/16= 2  r=12  
K2  r≠0 .  
K3  n:= 16 m:=12 
 

K1    n/m=16/12=1    r=4 

           K2   r≠0 . 
           K3    n=12 m=4 
 

 

K1 n/m=3   r=0 

Dla dobranych wariantów danych algorytm daje poprawne wyniki. 

 

 

 
 

background image

 

41 

Reprezentacja blokowa  algorytmu NWD 
 

 Na poniższym rysunku przedstawiono schemat blokowy algorytmu NWD(n,m) z 
iteracyjnym powtarzaniem kroków. Na rysunku przedstawiono typowe oznaczenia 
graficzne stosowane w schematach blokowych dla zaznaczenia: 

 Początku i końca algorytmu, 
 Operacji związanych z wprowadzaniem danych i wyprowadzaniem wyników, 
 Wykonywania operacji obliczeniowych i przypisywania wartości, 
 Sterowaniem kolejnością wykonania instrukcji, 
 Powtarzaniem wybranych działań w algorytmie.  
 

Wykorzystana tu operacja n mod m jest wyjaśniona dalej. 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

                                                          NIE 

                                                                                        

 

                                                            

TAK 

 
 
 
 
 
 
 
 
 
 
 

W Wordzie elementy graficzne 
występują w zakładce :Rysuj 

 

Autokształty: Schematy blokowe, 
Strzałki blokowe 

START 

          KONIEC 

Wprowadz: n,m 

a := n  

b:=m

 

 r≠0   

n :=  m 

m :=  r 

Wypisz: 
NWD(

a,b

)= m 

r:= n mod m 

Kształty Wejścia/ 

Wyjścia 

Instrukcje 

przypisania 

Podjęcia decyzji 

(sterowanie) 

background image

 

42 

 

Operacja „MODULO” 

Można    zdefiniować  dodawanie,  odejmowanie  i   inne  operacje,  tzw.  "modulo".  Są  one 
istotne  w  w  teorii  algorytmów  i  metodach  szyfrowania.  Niech  n  mod  m  oznacza 
standardową „operację modulo.  Z definicji:  

n mod m=n-((n div m)*m) 

gdzie:   div- dzielenie całkowite   np. 365 div 7 =52 

 

 

 ( a zwykłe dzielenie daje 365/7= 52.14285) 

stąd: 365 mod 7 = 365 – 52*7 = 365 – 364=  1   

Inny zapis: 

 

 

m

m

n

n

m

n

=

mod

 

gdzie: 

 

m

n

- podłoga z dzielenia liczb n i m. 

Zapis

 

x

czytamy: Dla dowolnej liczby rzeczywistej x 

 

x

 (czytaj: „podłoga x” ) oznacza 

największą liczbę całkowitą  mniejszą lub równą x. Zapis

 

x

(czytamy „sufit x”) oznacza 

najmniejszą liczbę całkowitą większą lub równą x. Dla wszystkich liczb rzeczywistych: 

 

 

1

1

+

<

<

x

x

x

x

x

 

Dla każdej liczby całkowitej n:  

 

n

n

n

=

+

2

/

2

/

   

 
Dzielenie modulo 
 
Jeżeli dzielimy dwie  liczby całkowite to często wynikiem jest

 

ułamek. 

Część ułamkowa wynika z reszty dzielenia całkowitego dwu dzielonych  liczb. 
Aby określić jaka zostanie reszta (jako liczba integer) stosuje się dzielenie modulo.  
Np wynikiem operacji modulo  7/2 będzie liczba  1, bo część całkowita dzielenia [7/2]=3 a  
reszta r = 7 – 3* 2= 1.  
. Jeżeli wynikiem dzielenia jest liczba całkowita np: 4/2=2, to wynikiem dzielenia modulo 
jest 0 (4 % 2=0). W ten sposób bada się np. parzystość liczby. 
 
Przykłady operacji modulo .  
 
16 mod 16 = 0   10 mod 16 = 10  17 mod 16=  1  20 mod 16 = 4 

background image

 

43 

Czas wykonania programu a złożoność obliczeniowa.  

Niech będzie dany pewien algorytm A o którym przyjmiemy założenia: 

• 

czas wykonania operacji elementarnej  wynosi 1µs, 

• 

czas  wykonania  algorytmu  (liczba  operacji)  jest  proporcjonalny  do 
pewnej funkcji matematycznej 

W tabeli przedstawiono czasy wykonania programów dla algorytmów różnej 
klasy

 
 

Rozmiar danych (wartość n w algorytmie) 

Klasa 
algorytmu 

10 

20 

30 

40 

50 

0,000 01s 

0,000 02s 

0,000 03s 

0,000 04 

0,000 05 

n

0,000 1s 

0,000 4s 

0,000 09s 

0,001 6s 

0,002 5s 

n

3

 

0,001s 

0,008s 

0,027s 

0,064s 

0,125s 

2

n

 

0,001s 

1,0s 

17,9min 

12,7dni 

35,7 
lat 

3

n

 

0,59s 

58min 

6,5 
lat 

3855 
wieków 

2*10

6

  

wieków 

n

!

 

3,6s 

756 
wieków 

8,4*10

6

 

wieków 

9,6*10

48

 

wieków 

2,6*10

66

 

wieków 

 

Algorytmy  ocenia  się  na  podstawie  różnych  kryteriów  zależnych  od  okoliczności  ich 
stosowania. Zazwyczaj istotna jest prostota i „elegancja”, czas działania, dokładność 
obliczeń (dla algorytmów numerycznych). Często wybór algorytmu jest kompromisem 
między  np.  prostotą  a  efektywnością.  Algorytmy  prostsze  są  łatwiejsze  do 
zrozumienia,  implementacji  programowej  i  testowania,  ale  zwykle ich czas realizacji 
jest  dłuższy.    Bardziej  efektywne  algorytmy  są  zwykle  bardziej  skomplikowane. 
Wymagają stosowania bardziej złożonych technik programowania np. rekurencji. 

Podstawowymi zasobami  każdego algorytmu są : 

 czas wykonania, 

 

wielkość zajmowanej pamięci

Analiza  algorytmu  polega  na  określeniu  niezbędnych  zasobów  do  jego  wykonania. 
Należy uwzględnić też jego poprawność, prostotę i użyteczność praktyczną. Analiza 
kilku  algorytmów  dla  danego  problemu  pozwala  zwykle  na  wybór  najlepszego  pod 
względem czasu jak i pamięci. 

 

Wielkość  zasobów  komputerowych  potrzebnych  do  wykonania  algorytmu 

określa  się  mianem 

złożoności  obliczeniowej.

  Dla  wielu  algorytmów  czas  ich 

wykonania  i wielkość  pamięci  powiększa  się  gdy  wzrasta  wielkość  zestawu  danych. 
Dlatego  często  złożoność  obliczeniowa  traktowana  jest  jako  funkcja  zależna  od 
rozmiaru danych wejściowych, nazywanego rozmiarem problemu lub zadania,  który 
jest liczbą całkowitą wyrażającą wielkość zestawu danych. Na przykład w problemie 
sortowania za rozmiar problemu przyjmuje się liczbę elementów ciągu wejściowego, 
a przy wyznaczaniu wyznacznika macierzy- liczbę wierszy i kolumn. 

 

Pozostaje  jeszcze  kwestia  określania  jednostki  złożoności  obliczeniowej.  W 

przypadku złożoności pamięciowej za jednostkę przyjmuje się komórkę pamięci.  
W zależności od kontekstu może to być bajt lub inna jednostka pamięci zajmowanej 
przez  wartość  typu  prostego.  Np.  dla  algorytmów  działających  na  zmiennych  typu 
real,  jest to zwykle 8 bajtów.  

background image

 

44 

W  przypadku  złożoności  czasowej  w  algorytmie  wyróżnia  się  charakterystyczne 
operacje  o  tej  własności,  że  całość  wykonanej  przez  algorytm  pracy  jest 
proporcjonalna do liczby tych operacji. Są to operacje dominujące. Np. w algorytmie 
sortowania liczb taką operacją  jest porównanie dwu elementów ciągu wejściowego i 
ich  ewentualne  przestawienie,  a  w  algorytmach  obliczania  wyznacznika  macierzy- 
operacje arytmetyczne +,*,- /. 
Jednostką miary  złożoności czasowej jest wykonanie jednej operacji dominującej.  

 

Zaletą tak zdefiniowanej  złożoności czasowej jest jej uniwersalność i niezależność 
od: 
 

 

szybkości procesora, 

 

cech języka programowania i umiejętności programisty.

 

Złożoność  czasowa  staje  się  miarą  jego  efektywności  czasowej,  a  własności 
algorytmu zależą tylko od niego i rozmiaru danych. 
W rzeczywistości nie jest zupełnie prawdą ponieważ  czas wykonania algorytmu np. 

sortowania  może się różnić dla danych o tym samym rozmiarze. Np. 
w posortowanym  ciągu wejściowym nie wystąpią przestawienia elementów, a gdy 
jest odwrotnie posortowany liczba przestawień jest największa. Stąd czasami bierze 
się pod uwagę tylko operacje porównania. 

 Do oceny złożoności czasowej algorytmów wykorzystuje się pewne notacje, które 
mówią jak wygląda ta złożoność obliczeniowa jeśli liczba danych „n” rośnie. 

Najczęściej stosowaną jest notacja O duże

. Celem stosowania tej notacji jest 

pokazanie charakteru wzrostu złożoności obliczeniowej (np. liniowa, kwadratowa, 
logarytmiczna).  

Oto przykłady najważniejszych rodzajów złożoności algorytmów 

 

Rodzaj złożoności 

Przykład 

O(1) 

Stała 

Dostęp do elementu tablicy 

O(logn) 

logarytmiczna 

Przeszukiwanie binarne 

0(n) 

liniowa 

Przeszukiwanie sekwencyjne 

O(nlogn) 

Liniowo-logarytmiczna 

Sortowanie kopcowe 

0(n

2

kwadratowa 

Sortowanie bąbelkowe 

O(n

3

sześcienna 

Mnożenie macierzy 

O(2

n

wykładnicza 

Algorytm plecakowy 
Wieże Hanoi 

O(n

!

wykładnicza 

Generowanie permutacji 

 

Gdzie: O(…) tzw notacja O duże określająca złożoność 

obliczeniową algorytmu 

Jest oczywistym, że złożoność obliczeniowa przekłada się na czas 
obliczeń na konkretnej platformie sprzętowej (komputerze).  

background image

 

45 

  

Analiza algorytmu przeszukiwania sekwencyjnego 

 
Problem przeszukiwania określony jest też jako wyszukiwania. Jego specyfikacja 
jest następująca: 
Dane: 

x

element

i

a

tablicy

w

a

a

a

liczb

n

Ciąi

n

[]

,

,

,

2

1

K

 

Wynik: 

Indeks „k” taki, że x=a

k

 lub –1, gdy x nie ma w ciągu

  

 
Najprostszy algorytm zwany jest przeszukiwaniem sekwencyjnym (sequential 
search), polega na przeglądaniu kolejnych elementów ciągu i kończy się, gdy 
poszukiwany element zostanie znaleziony lub cały ciąg zostanie przeszukany. 
Algorytm można zapisać następująco: 
 

Function SEQUENTIAL-SEARCH(a[1..n],x) 

for k:=1 to n do 

2

 

 

if  x=a[k] then 

3

 

 

     return k 

4

 

return –1 

 
Można powiedzieć  złożoność algorytmu zależy gdzie w tablicy znajduje się 
szukany element” – jeśli w ogóle jest! 
Operacjami dominującymi w algorytmie są porównania. Ich liczba jest równa 
liczbie wykonań pętli for. Najlepszy przypadek jest jeśli x jest pierwszym 
elementem ciągu, a najgorszy gdy ostatnim lub nie występuje. Zatem: 
 

 

 

 

 

W(n)=T(n)=n   -(przypadek Worst) 

 

 

 

 

 

B(n)=T(1)=1     (przypadek Best) 

Stosując notację O duże: 

T(n)=W(n)=O(n) 

W ocenie algorytmów bardziej istotne są oceny pesymistyczne, 
czyli najdłuższe czasy działania dla dowolnych danych rozmiaru n z 
powodu, że: 

• 

Algorytm nie będzie działał dłużej, 

• 

Przypadek pesymistyczny  jest częsty np. brak inf. w bazie, 

Przypadek „średni” - często zbliżony do pesymistycznego 

 

Przeanalizujmy przypadek średni. Założymy że prawdopodo-bieństwo zdarzenia , 
że 

występuje w ciągu wynosi 

p

, oraz że jeśli w nim występuje to 

prawdopodobieństwo zdarzenia, że występuje na pozycji 

k

 wynosi 

p/n

, a 

prawdopodo-bieństwo zdarzenia, że nie występuje w ciągu wynosi 

(1-p)

.  

W każdym obiegu pętli 

for

 

sprawdza się czy element 
tablicy jest równy  
szukanemu elementowi 

(wiersz2) . Jeśli tak jest 
zwracana jest wartość 
indeksu 

(wiersz 3) 

background image

 

46 

Zatem p-stwo 

p

k

 zdarzenia 

ω

k, 

że algorytm wykona

 k 

porównań przy poszukiwaniu 

wartości 

x

 wynosi: 

)

(

)

1

(

1

,

,

2

,

1

(

n

k

p

n

p

n

k

n

p

p

k

=

+

=

=

K

 

Przypadek 

k=n

 oznacza: 

•  Element x jest na pozycji n (ostatniej), 
•  Lub element x nie występuje, ale żeby to stwierdzić trzeba przejrzeć 

wszystkie elementy od 1 do n. 

Stąd p

k

 dla k=n jest sumą zdarzeń. 

Niech

 X

n

 

oznacza zmienną losową, której wartościami są liczby porównań 

wykonywanych przez algorytm dla danych rozmiaru 

n:  

( )

)

,

,

2

,

1

(

n

k

k

X

k

n

K

=

=

ω

 

Jej wartość oczekiwana wynosi: 

( )

( )

(

)

(

)

(

) ( )

2

2

1

1

2

1

1

1

1

1

1

p

p

n

p

n

n

n

n

p

p

n

k

n

p

p

n

n

p

k

p

X

X

E

n

k

n

k

n

k

k

k

n

n

+

 −

=

+

+

=

=

+

=

+

=

=

=

=

=

ω

 

Ostatecznie średnia A(n) (Average) liczba porównań w algorytmie przy założeniu, 
że p-stwo wystąpienia poszukiwanego elementu wynosi 

p

, jest określona 

zależnością: 

( )

( )

2

2

1

p

p

n

X

E

n

A

n

+

 −

=

=

 

 
 
Na podstawie tej zależności rozpatrzmy przypadki: 
 

 Jeśli

 p=1, 

tzn. 

x  

 na pewno występuje -  to 

A(n)=(n+1)/2

. Czyli średnio 

przeszukuje się połowę ciągu, 

 Jeśli 

p=1/2

,  to 

A(n)=(3n+1)/4

 Czyli średnio przeszukuje się 3/4  elementów 

ciągu, 

  Jeśli 

p jest bliskie zera

 to 

A(n)

 jest bliski 

n. 

Czyli średnio trzeba przeszukać 

cały ciąg. 

X –nie wystąpi w ciągu 

Ale taka suma =n(n+1)/2 

background image

 

47 

 
 

Algorytmy iteracyjne 

 

W sytuacjach praktycznych często występuje konieczność powtarzania pewnych 
obliczeń. W algorytmach i programowaniu służą do tego pętle. Algorytmy i programy 
wykorzystujące mechanizm pętli nazywamy iteracyjnymi. Dla każdej pętli muszą być 
określone: 

warunki początkowe (rozpoczęcia pętli); 

operacje wykonywane w pętli; 

warunek zakończenia pętli 

Np. w przypadku sumowania n liczb kolejną liczbę dodajemy do dotychczasowego 
wyniku dodawania. Wielokrotne dodawanie zastępujemy wówczas jedną, powtarzaną 
wielokrotnie operacją dodawania.  Oczywiście liczba powtórzeń operacji dodawania musi 
wynosić dokładnie n, a pierwszy istniejący wynik musi mieć wartość 0 nadaną mu przed 
zainicjowaniem pętli. Ten wynik spełnia rolę pewnego akumulatora kumulującego 
dodane wartości.  
Warunek zakończenia pętli jest bardzo istotny. Złe jego określenie może spowodować, 
że pętla nigdy się zakończy (pętla nieskończona). 
Warunek zakończenia pętli może występować: 

 na początku pętli- wówczas decyduje czy instrukcje pętli będą wykonane czy 

pominięte. 

 na końcu pętli - wówczas decyduje czy instrukcje pętli będą powtórzone kolejny 

raz, czy też nastąpi realizacja dalszej części algorytmu (programu).  

Jako ciekawostkę można podać, że pętle nieskończone są czasami  stosowane 
świadomie i odgrywają istotną rolę w programowaniu. 
Są stosowane wtedy gdy nie można przewidzieć ile razy pętla ma być powtórzona.  
Fizyczną interpretację można podać obserwując kasjerkę w sklepie, która nie wie ile jest 
artykułów  w koszyku. Przed przystąpieniem do obsługi musi ona wyzerować rachunek 
(nadanie wartości początkowej). Następnie pobiera  z koszyka kolejny towar, odczytuje 
jego cenę i dodaje do dotychczasowej sumy. Tę czynność  powtarza dotąd dopóki 
koszyk nie jest pusty. Tu stwierdzenie  że koszyk jest pusty jest warunkiem logicznym. 
Jeśli ten warunek jest prawdą to następuje zakończenie realizację pętli. 

Inny przykład to oczekiwanie   na włączenie pewnego urządzenia (drukarki itp). 

Takie oczekiwanie może być czasami bardzo długie a program cierpliwie  sprawdza w 
pętli pewien bajt pamięci (rejestr stanu urządzenia)  którego zawartość świadczy o 
dostępności do urządzenia. 

background image

 

48 

Przykład formy  pisania i przedstawiania programów  

 

Zadanie  1. 

 
Przedstaw algorytm i napisz program w Matlabie, który będzie wielokrotnie powtarzał 
wykonywanie pewnego ciągu poleceń Matlaba . O kolejnym powtórzeniu programu 
powinien zadecydować operator odpowiadając twierdząco lub przecząco na pytanie 
zadane przez program.  
 
Np. pytanie może być sformułowane następująco:  

Czy zakończyć ? (Podaj: tak/nie)    

Dopóki w odpowiedzi będzie wprowadzany przez operatora  tekst „nie” program będzie 
wielokrotnie powtarzał obliczenia i  drukował komunikat o liczbie powtórzeń np: 
      „Jest to n=….. powtorzenie”.  

 

Specyfikacja algorytmu programu: 

Dane wejściowe: 
koniec- zmianna znakowa (string) mogąca przyjmować  wartości „tak” lub 
„nie” 
 
Dane wejściowe: 
- n                  - liczba całkowita oznaczająca ilość wykonań programu, 
-  komunikat:   -  „Jest to n=.....powtorzenie programu”. 

 

 Lista kroków: 
 

1.  Nadaj zmiennym wartości: n:=0,  koniec=’nie’ 
2.  Jeśli zmienna koniec = ’tak’   to przejdź do punktu 7. 

(w przeciwnym razie kontynuacja tzn. przejście do następnego punktu).  

3.  Zwiększ  n  tzn.  n:=n+1 
4.  Wyświetl komunikat i wstaw wartość n w odpowiednie m-ce tekstu: 

„Jest to n =.....powtorzenie programu”. 

5.  Poproś o odpowiedz: czy kontynuować wykonanie wyświetlając 

komunikat: Czy zakończyć ? (Podaj: t=tak / n=nie) 

6.   Pobierz wpisany przez operatora tekst z klawiatury do zmiennej koniec. 
     Przejdz do punktu 2. 
7.  Koniec  

Powyższy algorytm zawiera pętlę, a liczba jej wykonań jest nieznana. Stąd 
wynika, że w praktycznej realizacji powinna być zastosowana pętla while.

 

Na rys. 1a  przedstawiono obraz okna edytora  Matlaba. W oknie widoczne są 
instrukcje programu realizujące postawione zadanie. Program jest zapisany jako 
m-plik o nazwie PowtarzajObl1 w katalogu work (domyślnym) systemu Matlab. 

background image

 

49 

>> PowtarzajObl1 
 
POWTARZANIE OBLICZEN 
 
JEST TO 

n=1

 POWTORZENIE  

 
Czy zakończyć? (Podaj: tak / nie) 

nie

 

JEST TO 

n=2

 POWTORZENIE  

 
Czy zakończyć? (Podaj: tak / nie) 

nie 

 JEST TO 

n=3

 POWTORZENIE  

Czy zakończyć? (Podaj: tak / nie) 

tak

 

>> 

Na rys.  1b  przedstawiono przykład wprowadzanych danych i wyników 
wyświetlanych przez program PowtarzajObl1. Komunikacja operatora z 
programem odbywa się przy pomocy klawiatury, a wyniki  dialogu oraz wyniki 
wyjściowe są wyświetlane w oknie konsoli (inaczej Command Window) 
Matlaba.  W zakresie pętli umieszczono tylko polecenie wydruku informujące o 
numerze powtórzenia pętli. 

 

 
Rys. 1a Program realizujący 
zadanie (wygląd okna 
edytora Matlaba) : 

 
 
 
 
 
 
 
 
 
 

 
 

Rys. 1b. Przykład wyników 
testowania programu 
 

 
 
 
 
 
 
 
 
 

Uwaga:  
Program drukuje na ekranie (w oknie Command Window)  wyniki tylko czarną 
czcionką. Dla wyróżnienia istotnych elementów w powyższym przykładzie 
wyników zmieniono kolor czcionki i tak: 

 Liczbę n powtórzeń komunikatu, drukowaną i zmienianą przez program, 

zaznaczono kolorem zielonym, 

 

Wprowadzane przez operatora odpowiedzi zaznaczono kolorem 

niebieskim.

 

Dodatkowo w celu zwiększenia przejrzystości wprowadzono też puste 

wiersze.

 

 

 

background image

 

50 

 

 

Zadanie  2.

 

 
Sformułuj algorytm obliczający sumę ciągu n liczb wprowadzanych do komputera.   
Ilość liczb jest pierwszą wprowadzaną wartością. 

Specyfikacja algorytmu: 

Dane wejściowe: 

-     n- liczba całkowita określająca ilość wprowadzanych liczb; 
-     ciąg n liczb rzeczywistych 

Wynik: 

Sum- liczba rzeczywista  określająca sumę wprowadzonych dotychczas liczb. 

Zmienne pomocnicze:

 

i -  liczba całkowita (licznik powtórzeń); 
liczba-  liczba rzeczywista przyjmująca wartość kolejno wprowadzanych liczb 

Lista kroków: 

1. 

Wczytaj z klawiatury liczbę określającą ilość liczb  i zapisz ją w 
zmiennej 

n

2. 

Zmiennej 

Sum

 przypisz wartość początkową 

0

3. 

Zmiennej 

i

 przypisz wartość początkową 

0

4. 

Wczytaj wartość liczby wprowadzonej z klawiatury  
i zapamiętaj ją w zmiennej 

liczba

5. 

Zwiększ wartość licznika 

jeden

6. 

Do dotychczasowej sumy (

Sum

) dodaj wczytaną liczbę (

liczba

). 

7. 

Jeśli 

i <n

 to wróć do kroku 4. 

8. 

Wyświetl wartość zmiennej 

Sum

.  Koniec    

Rys. 2 Schemat   blokowy 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Wczytaj: n 

i :=0 
Sum=0.0 

i  < n

 

Wyświetl: 
Sum 

Początek

 

Koniec 

i :=i+1

 

Sum :=Sum +liczba 

Wczytaj: liczba 

Tak/True 

Nie/False

    

Pseudokod programu: 
Program  SumaLiczb 
zmienne: 
 

n, i              - całkowite 

 

liczba, Sum- rzeczywiste 

początek  
    czytaj(n) 
    i:=0 
    Sum:=0 
powtarzaj dopóki  i  < n   
 

czytaj(liczba) 

 

i:=i+1 

 

Sum:=Sum +liczba 

pisz(Sum)  
koniec 

background image

 

51 

 

 

Poniżej przedstawiono różne formy zapisu tego algorytmu w pseudokodzie. 
 
a) 

 

 

 

 

 

 

b) 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

c) 

 

 

 

 

 

 

d)

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Pseudokod programu: 

 

Program  SumaLiczb 
zmienne 
 

n, i- całkowite 

 

liczba, Sum- rzeczywiste 

początek  
    czytaj(n) 
    i:=0 
    Sum:=0 

powtarzaj  dopóki  i  < n   

 

czytaj(liczba) 

 

i:=i+1 

 

Sum:=Sum +liczba 

pisz(Sum)  
koniec

 

Pseudokod programu:

 

 

Program  SumaLiczb 
zmienne 
 

n, i- całkowite 

 

liczba, Sum- rzeczywiste 

begin 
    read(n) 
    i:=0 
    Sum:=0 
while  i  < n  do 
 

read(liczba) 

 

i:=i+1 

 

Sum:=Sum +liczba 

write(Sum)  
end 

Pseudokod programu:

 

 

Program  SumaLiczb 

zmienne 

 

n, i- całkowite 

 

liczba, Sum- rzeczywiste 

begin 

    read(n) 

    Sum:=0 

for i:=1 step 1 until n do 

    begin 

       read(liczba) 

       Sum:=Sum +liczba 

   end 

write(Sum)  

end 

Pseudokod programu:

 

 

Program  SumaLiczb 

zmienne 

 

n, i- całkowite 

 

liczba, Sum- rzeczywiste 

begin 

    read(n) 

    i:=0 

    Sum:=0 

do 

       read(liczba) 

        i:=i+1 

        Sum:=Sum +liczba 

 while  i  < n   

write(Sum)  

end 

background image

 

52 

Zadanie 3 

 

Opracuj algorytm programu który wczytuje ciąg liczb. Liczby mogą być  dodatnie i 
ujemne lub tylko dodatnie albo tylko ujemne. Wczytywanie liczb kończy się,  jeżeli 
wprowadzono już 99 liczb lub podano liczbę zero. Program ma wyznaczyć  ile było 
liczb dodatnich oraz  najmniejszą  z wprowadzonych liczb dodatnich (jeśli były). 
 Dane wejściowe: 

ciąg n liczb rzeczywistych (n-nieznane, n<100)  

Wynik: 

n- liczba całkowita określająca ilość wprowadzonych liczb; 

m- liczba całk. określająca ilość wprowadzanych liczb dodatnich  (m≤n); 

min- liczba rzeczywista  określająca najmniejszą wprowadzoną liczbę 

dodatnią

 

Zmienne pomocnicze:

 

 

i -  liczba całkowita (licznik powtórzeń); 
x- 

liczba rzeczywista przyjmująca wartość kolejno wprowadzanych liczb 

Przykład wyników:  

   

    Wprowadzono n=27  liczb   Liczb dodatnich m= 12  min =  0.75      

lub     

     

Wprowadzono n=18 liczb    Brak liczb dodatnich

 

Lista kroków (wersja 1):   

 

 

Lista kroków (wersja 2): 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Wersja 1 jest krótsza bo narzucono tu wstępną wartość min=999999 (aby ustrzec 
się błędów wartość ta powinna być największą możliwą liczbą !). W wersji 2 nie 
jest wymagane podanie wstępnej wartości min ale algorytm jest bardziej złożony.

     Wprowadzanie danych oraz 

 określenie n oraz m 

1.  Nadaj zmiennym wartości:  

 

n :=0  m:=0    

 

2.  Wczytaj  liczbę do zmiennej 

x

3.  Zapamiętaj x jako min:

  min:=x

 

4.  Jeśli 

x=0   lub n=99

 

 

 to pkt. 

11

 

5.  Aktualizuj ilość wczytanych

:  

n:=n+1

 

6.  Jeśli 

x>0

  to 

m=m+1

  

7.  Jeśli 

min<0

 to

 min=x

 

8.  Jeśli 

x >0

 

and x < min

 to:  

  

min:= x

  

9.  Wczytaj liczbę do zmiennej  

x

      

10. Przejdź do kontynuacji od punktu. 

4

  

 Wydruki     wyników 

11. Jeśli 

m>0

 to drukuj wartości: 

n=.....        m=.......min=........

 

W przeciwnym razie drukuj: 

Brak Liczb dodatnich 
n=.......

  

12. Koniec 

 

Wprowadzanie danych oraz                               

       określenie n oraz m

 

1.  Nadaj zmiennym wartości : 

n :=0  m:=0    min=999999

 

2.  Wczytaj  liczbę do zmiennej 

x

3.  Jeśli 

x=0   lub n=99

 

 

to  pkt.  

8.

 

4.  Aktualizuj ilość wczytanych liczb

:  

n:=n+1

 

5.  Jeśli 

x>0

  to 

m=m+1

  

6.  Jeśli 

x >0

 

and x < min

 to: 

  

min:= x

      

7.  Przejdź do kontynuacji od pktu 

2.

 

      Wydruki     wyników 

8.  Jeśli 

m>0

 to drukuj wartości: 

n=.....        m=.......min=........

 

W przeciwnym razie drukuj: 

Brak Liczb dodatnich 
n=.......

  

9.  Koniec 

 

background image

 

53 

Poniżej, dla ułatwienia analizy  powtórzono algorytm dla zadania 3 w 
postaci listy kroków i przedstawiono 2 formy jego zapisu w  
pseudokodzie. 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
  

 

                                                            

 

Lista kroków (wersja 2): 

1.  Nadaj zmiennym wartości:  

 

n :=0  m:=0    

 

2.  Wczytaj  liczbę do zmiennej 

x

3. 

min:=x

 

4.  Jeśli 

x=0   lub n=99

 

 

 to pkt. 11 

5.  Aktualizuj ilość wczytanych

:  n:=n+1

 

6.  Jeśli 

x>0

  to 

m=m+1

  

7.  Jeśli 

min<0

 to

 min=x

    

8.  Jeśli 

x >0

 

and x < min

 to:  

  

min:= x

  

9.  Wczytaj liczbę do zmiennej  

x

      

10. Przejdź do kontynuacji od punktu.4   

 Wydruki     wyników 

11. Jeśli 

m>0

 to drukuj wartości: 

n=.....        m=.......min=........

 

W przeciwnym razie drukuj: 

Brak Liczb dodatnich 
n=.......

  

12. Koniec 

 

Pseudokod programu (wersja 2):

Program  MAX 
zmienne 
 

n,m - całkowite 

 

x, min- rzeczywiste 

begin 
n:=0,   m:=0 
read(x) 
min:=x 
while (n  < 99 &  x ≠ 0 ) do 
 begin 
      n:=n+1     
      if x>0         then            m:=m+1 
      if nin<0      then           min:=x 
      if (x>0 & x<min) then  min:=x 
     read(x) 
 end 
if m>0    then 
     write(n, m, min)

 

else 
     write(n, Brak liczb dodatnich) 
end 

 

Pseudokod programu(Wersja 1):

 

Program  MAX 
zmienne 
 

n,m - całkowite 

 

x, min- rzeczywiste 

begin 
n:=0,   m:=0 min=999999 
read(x) 
while (n  < 99 &  x ≠ 0)  do 
  begin 
      n:=n+1     
      if x>0   then m:=m+1 
      if (x>0 & x<min) then  min:=x 
     read(x) 
  end 
if m>0 
    write(n, m, min) 
else 
     write(n, Brak liczb dodatnich) 
end 

 

Lista kroków(wersja 1): 
 

Wprowadzanie danych oraz                               
 określenie n oraz m

 

1.  Nadaj zmiennym wartości początkowe: 

 

n :=0  m:=0    min=999999

 

2.  Wczytaj  liczbę do zmiennej 

x

3.  Jeśli 

x=0   lub n=99

 

 

to przejdź do 

pkt.  8. 

4.  Aktualizuj ilość wczytanych liczb

:  

n:=n+1

 

5.  Jeśli 

x>0

  to 

m=m+1 

 

6.  Jeśli 

x >0

 

and x < min

 to wykonaj 

 operacje:  

min:= x

  

   

 

7.  Przejdź do kontynuacji od punktu.2. 

      Wydruki     wyników 

8.  Jeśli 

m>0

 to drukuj wartości: 

n=.....        m=.......min=........

 

W przeciwnym razie drukuj: 

Brak Liczb dodatnich 
n=.......

  

9.  Koniec 

 

background image

 

54 

Zadanie 4

 

Opracuj algorytm programu, który wczytuje i zapamiętuje w tablicy o nazwie A ciąg 
liczb. Wprowadzane liczby mogą być  dodatnie i ujemne lub tylko dodatnie albo 
tylko ujemne. Wczytywanie liczb kończy się,  jeżeli wprowadzono już 99 liczb lub 
podano liczbę zero. Program powinien wyznaczyć i poinformować jaka była 
najmniejsza  z wprowadzonych liczb dodatnich (jeśli były liczby dodatnie) oraz ile 
było liczb dodatnich.  
Dane wejściowe: 

ciąg n liczb rzeczywistych (n- nieznane, n<100)

  

Wynik:     n- liczba całkowita określająca ilość wprowadzanych liczb; 

m- liczba całkowita określająca ilość wprowadz. liczb dodatnich  (m≤n); 

min- najmniejsza wprowadzona liczba dodatnia (liczba rzeczywista  ).

 

Zmienne pomocnicze:

 

 

i -  liczba całkowita (licznik powtórzeń); 

x  - liczba rzeczywista przyjmująca wartość kolejno wprowadzanych liczb 

  A[1:99]- tablica zapamiętująca   ciąg n liczb rzeczywistych 

Przykład wyników:  

   

    Wprowadzono n=27  liczb   Liczb dodatnich m= 12  MIN =  0.75      

lub     

     

Wprowadzono n=18 liczb    Brak liczb dodatnich

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Lista kroków 

 

Wprowadzanie danych oraz określenie n oraz m 

1.  Nadaj zmiennym wartości początkowe: 

n :=0  m:=0  i=0

 

2.  Wczytaj  liczbę do zmiennej 

x

3.  Jeśli 

x=0   lub n=99

 

 

to przejdź do 

pkt.7

4.  Zapamiętaj 

x

 w tablicy:  

       

n:=n+1

         

A[n]:=x

      

5.  Jeśli 

x>0

  to 

m=m+1  min:=x

 

6.  Przejdź do kontynuacji od punktu. 

2

 

Wyszukiwanie min (jeśli były liczby dodatnie)     

7.  Jeśli  

m=0

 lub 

n=0

 to przejdź do  pkt.

12 

8.  Zwiększ 

i:=i+1 

9.  Jeśli 

A[i] > 0

  and  

A[i] < min

  to wykonaj: 

         

min:= A[i]

  

  

 

11 

Jeśli

 i < n

  to  kontynuuj od  pkt  

8.

 

 Wydruki     wyników

  

     12. Jeśli 

m>0

 to drukuj wartości: 

       

n=.....        m=.......min=........

 

      W przeciwnym razie drukuj: 
      

Brak Liczb dodatnich 

       n=.......

  

13.  Koniec    

 

Pseudokod programu

  

Program  MIN  DODATNIA 
zmienne 
 

n,m, i- całkowite 

 

x, min- rzeczywiste 

begin 
n:=0,   m:=0, i=0 
read(x) 
while (n  <99 &  x ≠ 0)  do 
 begin 
      n:=n+1      A[n]:=x     
      if x>0 then 
         begin 
             m:=m+1  min:=x; 
         end 
     read(x) 
 end 
for i:=1 step 1 until n do 
begin 
   if  A[i]>0 & A[i] < min then 
        min:=A[i] 
end 
 
if (m>0 and n>0) then 
write(n, m, min) 
else 
write(n, Brak Liczb dodatnich ) 
end 

 

background image

 

55 

Zadanie 5

 

 
Opracuj algorytm programu który sprawdza czy podana liczba jest liczbą pierwszą. 

Uwaga:  Liczba pierwsza to liczba naturalna podzielna przez 1 i samą siebie np. 1,3 
Dane wejściowe: 
n – analizowana liczba całkowita >2  
Wynik:

 

Komunikat  postaci np.: „Podana liczba jest liczbą pierwszą” 
Zmienne pomocnicze:

 

podz -  liczba całkowita, aktualny podzielnik

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

Lista kroków (wersja 1): 

 

1. 

Wczytaj wartość n. 

2. 

podz:=2 

3. 

Jeśli n mod podz =0 to:  

Pisz(To nie   pierwsza) 
Przejdz do punktu 7 

4. 

podz:=podz+1 

5. 

Jeśli podz < n to przejedz do 3 

6. 

Pisz (To liczba pierwsza)

 

7. 

Koniec

 

Pseudokod programu: 

Program CZY_PIERWSZA 
Zmienne 
 

n, podz-  całkowite 

 

pierwsza: logiczna 

begin 
   read(n) 
   pierwsza=true   podz:=2 
   while (pierwsza=true) and (podz < n) 
       begin 
 

if (n mod podz =0) then 

 

    pierwsza=false 

             else   
 

     podz:=podz+1 

         end 
  if (pierwsza=true) 
      write(n, To  liczba pierwsza) 
  else 
      write(n, To nie  pierwsza) 
end 
 

True

True

True

True    

Wczytaj

: n 

podz :=2 

podz  < n 

Wyświetl:  Licz. Pierwsza 

Początek 

podz :=podz+1 

False

False

False

False    

n mod

 

podz 

Koniec 

Wyświetl:  To nie 
jest  Licz. Pierwsza 

False

False

False

False    

True

True

True

True    

n mod

 

podz- to działanie 

wyznacza resztę z 
dzielenia całkowitego 
n/podz 
np.:  11 mod 2=1 
         10 mod 2=0

 

background image

 

56 

Algorytmy rekurencyjne 

 

W programowaniu często zagadnienia większe są dzielone na pewne ściśle określone 
fragmenty i są one poddawane odrębnie algorytmizacji i programowaniu. Wówczas 
program rozwiązujący całościowo zagadnienie składa się z kilku (co najmniej 2) 
elementów, które są określane  jako: 

 program główny (zwykle krótki) 
 podprogramy 

Podprogramy są wywoływane z programu głównego, a miejsce ich wywołania wynika z 
algorytmu rozwiązania problemu. Program główny komunikuje się z programami w 
następujący sposób: 

 przekazuje do podprogramu niezbędne dla obliczeń dane (liczby, tablice liczb 

zmienne logiczne itp.) 

 odbiera z podprogramów wyniki obliczeń 

Podprogramy są realizowane w postaci: 

 funkcji 
 procedur 

W niektórych językach (np. w Matlabie) procedury formalnie nie występują, ale z jednego 
skryptu może być wywołany inny skrypt w którym jest realizowana wydzielona część 
obliczeń, co przypomina wywołanie procedury. 
Najczęściej funkcje są tak konstruowane, że w wyniku ich wykonania otrzymuje się jedną 
wartość liczbową lub np. tablicę wartości. Są 2 rodzaje funkcji: 
-  standardowe pisane przez producentów oprogramowania np. funkcja sin(alfa) 
   obliczająca wartość sinusa dla zadanego kąta alfa. 
-  własne pisane na użytek rozwiązywania określonego problemu. 
Funkcje wymagają ściśle określonych danych i są w programie wywoływane przez 
użycie ich nazwy i podanie parametru (lub parametrów). Np. zapis x=sin(alfa) wywołuje 
ciąg instrukcji realizujący algorytm obliczania wartości sinus dla zadanego kąta alfa 
podawanego w radianach. Obliczona wartość jest podstawiana pod zmienną x. 
Podobnie jest z funkcjami własnymi. 
Czyli funkcje inaczej mówiąc są oddzielnymi programami o nadanej im nazwie, najlepiej 
takiej, żeby kojarzyła się z przeznaczeniem. Zwykle w ich definicji występuje na początku 
słowo kluczowe 

function. 

 

Algorytmy rekurencyjne są konstruowane tak by można było je zapisać w postaci 

funkcji. Cechą charakterystyczną jest to, że dla uzyskania wyników obliczeń wywołują 
one same siebie. 

 

 

Wykorzystanie rekurencji jest wygodne w rozwiązywaniu wielu problemów ze 

względu na krótki kod. Oczywiście zagadnienia rozwiązywane rekurencyjnie dają się 
rozwiązywać z zastosowaniem metod wykorzystujących iterację.  
Istotę rekurencji i jej zaletę przedstawiono poniżej. 
Mamy obliczyć wartość 2N . Jak to zrobić aby nie użyć operacji potęgowania ? 
 
 

background image

 

57 

Sposób 1. – Skorzystanie ze wzoru: 
A

N

 = e

N*ln(A)

    czyli   2

N

 = e

N*ln(2)

  

Zakładając dostępność  funkcji     ex  oraz ln(x) są dostępne we wspomnianym 
języku to wydaje się, że obliczenie nie sprawi problemu (dotyczy tu liczb A, N>0). 
Ale wynik powinien być liczbą całkowitą a obliczenie wg wzoru tego nie zapewnia. 
  
 Sposób 1. – Skorzystanie ze wzoru: 
2

N

 =( 2

N-1

 )*2    

i iteracyjnie obliczamy kolejno: 
 2

 = 1 

 2

1

 = ( 2

0

  )* 2  

 2

 =( 2

1

  )* 2  

 2

 =( 2

2

  )* 2  

 2

 =( 2

3

  )* 2 

 2

 =( 2

4

  )* 2   

.................... 
 2

 =( 2

N-1

  )* 2   

  
 
 Sposób 2.  - Rekurencyjnie stosując 
tzw. metodę „dziel i zwyciężaj” 

    

( )

 

( )

e

nieparzyst

N

gdy

parzyste

N

gdy

N

gdy

N

N

N

=

=

2

2

2

2

2

2

2

*

2

0

1

 

 
gdzie:└ ┘-oznacza zaokrąglenie w dół do najbliższej liczby całkowitej 

Powyższy algorytm jest logarytmicznym. 
 Np. dla N=1000 2

N

 = ok.  10

301

 – niewyobrażalnie dużo obliczeń !!!.   

    

Uwaga: Np. dla 

N=1000

 w 

kolejnych krokach 
wykładnik „x” wynosi: 

-  X=  1000/2= 

500

 

X=  500/2= 

255 

X= 250/2= 

125 

X= 125/2= 

62 

-  X= 62/2=  

31

 

-  X= 31/2= 

15

    itd. 

Aby wykonać obliczenia 
trzeba wykonać rekurencję 
10 razy a to: 

 lg 

2

 1000=9.97≈ 10  

Ale liczba obliczeń jest i tak 

duża, ale zależy ona tylko od N 

(liniowo) 

Oczywiście można obliczyć to 

obliczyć rekurencyjnie: 

 2

     =  ( 2

N-1

  )* 2  zstępująco 

    2

N-1 

   =  ( 2

N-2

  )* 2  itp.

      

   

background image

 

58 

2

2

2

1

2

1

0

*

=

=

n

n

 

Zadanie 6

 

Opracuj rekurencyjny algorytm programu który oblicza wartość 2

n

 , gdzie n jest 

dowolną liczbą całkowitą. 
Rozwiązanie 
Jednym ze sposobów jest skorzystanie z definicji: n-tej potęgi liczby 2 można 
zdefiniować następująco: 
 
 

 

 

 

 

 

     dla n=0 

n-ta potęga liczby 2= 

 

 

 

 

       dla n>0  

 

 

 

Specyfikacja algorytmu: 

Dane wejściowe: 
     n – wykładnik  (n≥0) jest liczbą przekazywaną do funkcji przez tzw. wartość.  
Wynik: 
     np2- liczba całkowita, wartość n-tej potęgi liczby 2 (tzn. 2

n

). 

Zmienne pomocnicze: 
     Nie występują . 
Lista kroków: 

1.  Jeśli n=0  to potega:=1 
2.  Jeśli n>0  to potega:=2*potega(n-1) 

Pseudokod: 

function np2=potega(n) 
begin 

                if n=0 then 

       np2:=1 

                   else 
                   np2:= 2*potega(n-1) 

end 

Działanie: 
        Funkcja wywoływana jest następująco np. dla n=3 
 

 

X= potega(3) 

       Po wykonaniu obliczeń wartość X=8 
    Wykonanie przebiega następująco: 
 
Etap 1  

2* potega(2)   

 

 

 

 

 

2*4=8         Wynik 

 
Etap 2  

 

2* potega(1)   

 

 

 

2*2=4 

 
Etap 3  

 

 

2* potega(0)   

 

2* 1=2 

 
Etap 4  

 

 

 

 

potega(0)=1

   

 

 
 

Aktualne wyniki 
są odkładane na 
stosie (zejście w 
głąb stosu) 

„Obrazy wyników” są 
pobierane ze stosu i 
uzupełniane (cofanie 
rekurencji) 

Wartość znana ! 

background image

 

59 

SPRAWOZDANIE Z WYKONANIA ĆWICZENIA LABORATORYJNEGO 

 

 

 

 

 

Przykład 

 
 Temat:  ……… Wykonywanie obliczeń  z wykorzystaniem pętli typu for. 
 
Nazwisko i imię: 
(drukowane) 

KOWALSKI 

MICHAŁ 

Data wykonania: 

30.10.2008 

Grupa: E8X3S1 
Podgrupa:  A 

Prowadzący: 
 

Mgr inż. Wójcik  

Jerzy 

 

1.  Treść zadania  
 

Zadanie 

1

 

 

Sformułuj algorytm i napisz program obliczający sumę ciągu n liczb 

wprowadzanych do komputera.   Ilość liczb jest pierwszą wprowadzaną wartością. 

Wyświetl wyniki podając w jednym wierszu ilość sumowanych liczb i wynik. To 

wyświetlanie zrealizuj dwoma sposobami:  stosując instrukcje sprintf i disp.  

Przedstaw algorytm obliczeń w postaci listy kroków, schematu blokowego i zapisu 

w pseudokodzie. 

 
2. 

Specyfikacja algorytmu. Lista kroków. 

 

Dane wejściowe: 

 

-     n- liczba całkowita określająca ilość wprowadzanych liczb; 

-     ciąg n liczb rzeczywistych 

 

Wynik: 

 

Sum- liczba rzeczywista  określająca sumę wprowadzonych dotychczas liczb. 

 

Zmienne pomocnicze: 

i -  liczba całkowita (licznik powtórzeń); 

liczba-  liczba rzeczywista przyjmująca wartość kolejno wprowadzanych liczb 

 

Lista kroków: 

9. 

Wczytaj z klawiatury liczbę określającą ilość liczb  i zapisz ją w zmiennej 

n

10. 

Zmiennej 

Sum

 przypisz wartość początkową 

0

11. 

Zmiennej 

i

 przypisz wartość początkową 

0

12. 

Wczytaj wartość liczby wprowadzonej z klawiatury  

i zapamiętaj ją w zmiennej 

liczba

13. 

Zwiększ wartość licznika 

jeden

14. 

Do dotychczasowej sumy (

Sum

) dodaj wczytaną liczbę (

liczba

). 

15. 

Jeśli 

i <n

 to wróć do kroku 4. 

16. 

Wyświetl wartość zmiennej 

Sum

.  Koniec    

 

 
 
 
 

background image

 

60 

 
3.  Schemat  blokowy algorytmu. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

3.  Program w Matlabie 

 

 

 
 
 

Wczytaj: 

i :=0 

Sum=0.0 

i  < n 

Wyświetl: 
n, Sum 

Początek 

Koniec 

i :=i+1 

Sum :=Sum

+liczba 

Wczytaj: 

Tak/True 

Nie/False

background image

 

61 

4. Przykład wyników testowania 

Poniżej zamieściłem przykład testowania programu. 
Widoczne są tu dwa podstawowe okna: 

 Command  
 Workspace 

Przedstawiają one treść konwersacji przy wprowadzaniu danych i wyprowadzaniu wyników 
oraz typu zmiennych i zajętość pamięci (okno Workspace). 
 

 

 

2.  Sposób realizacji zadania. Wnioski 
 

Celem było sumowanie liczb. Ponieważ z treści wynika,  ilość liczb  
jest znana to jest ona pobierana jako pierwsza dana i podstawiana do zmiennej n.  
Następnie program powtarza n razy iterację: 

 Pobiera liczbę do sumowania; 
 Dodaje liczbę do dotychczasowej sumy. 

Ponieważ ilość powtórzeń jest znana to zastosowałem pętlę for- jako najprostsze 
rozwiązanie. 
Wyprowadzanie wyników wymagało  wyprowadzenia informacji w postaci 
komunikatu wyświetlonego w jednym wierszu. Zrealizowałem to następująco: 
I-sposób 
 

Wstawiam dane w odpowiednie miejsca  tekstu, który ma być 

wydrukowany. W programie  do przechowywania tekstu użyłem zmiennej 
komunikat. Tekst reprezentowany zmienną takstową  jest macierzą wierszową 
zawierającą ciąg znaków ASCII. Jest to widoczne w oknie Work Space. 

background image

 

62 

Kody  ASCII można podejrzeć wykorzystując instrukcję konwersji double w 
sposób jak niżej: 

>> kody=double(komunikat) 
kody = 
  

Columns 1 through 17  

    83   117   109    97    32    53    32   108   105    99   122    98    32   119   121   110   111 
  Columns 18 through 33

  

   

115   105    58    32    83   117   109    61    32    51    55    46    53    54    57    55

 

Odwrotną zamianę realizuje funkcja char jak pokazałem poniżej: 

>> char(kody) 
ans = 

Suma 5 liczb wynosi: Sum= 37.5697 

>> 

 Instrukcja sprintf umożliwia wstawienie danych w odpowiednie m-ca tekstu.  
Instrukcja zawiera tekst (‘...........’) i listę wartości zmiennych wstawianych w 
tym tekście. Miejsca wstawiania są zaznaczone znakami % ( np.  wiersz 21), po 
których jest określenie formatu (tu całościowo określają go litery %d i %f 
stosownie do typu zmiennych.)  
II – sposób  
 

Użycie tylko instrukcji disp wymaga łączenia stringów.  Można to 

zrealizować używając tej instrukcji w postaci disp([teksty laczone]). 
Lączone teksty składowe muszą być oddzielone przecinkami. Wstawienie liczby 
jako elementu tekstu wymaga konwersji liczby na tekst. I tak: 

 int2str(n)- zamienia liczbę całkowitą n na ciąg znaków ASCII; 
 num2str(Sum)- zamienia liczbę rzeczywistą na ciąg znaków ASCII. 

Reasumując, mogę powiedzieć, ze napisany program działa poprawnie i 
realizuje postawione zadanie

background image

 

63 

Zadania 

 

Zadanie 1 

Przedstaw algorytm i wykonaj program, który wczytuje liczbę x i informuje czy 
to liczba dodatnia, ujemna czy równa zero.

 

Zadanie 2 

Przedstaw algorytm i wykonaj program, który dla zadanych dowolnych liczb  a 
oraz b zapewni by  spełniały one  relację a ≤ b. 

Zadanie 3 

Sformułuj algorytm i wykonaj program, który dla podanych dwu wartości a i b 
obliczy ich średnią arytmetyczną i geometryczną (jeśli to możliwe). 

Zadanie 4 

Sformułuj algorytm który dla podanych dwu wartości a i b obliczy ich iloraz 
(jeśli to możliwe).

 

 

Zadanie 5 

Przedstaw algorytm i wykonaj program, który dla zadanych dowolnych liczb  a, 
b oraz c zapewni by wykonać takie operacje by wartości wyjściowe a i b 
spełniały one  relację   a ≤ b≤  c. 

Zadanie 6 

Przedstaw algorytm i wykonaj program, który dla zadawanych wartości 
typowych ocen: 2, 3, 3.5, 4, 4.5, 5 przyporządkuje oznaczenie słowne: ndst., dst, 
dst plus, db,  db plus, bdb). 

Zadanie 7

  

Zmienna x jest oceną którą otrzymałeś z Mtp1 (2, 3, 3.5,4,4.5, 5). Zaprojektuj 
algorytm i wykonaj program, który poprosi o podanie oceny i interpretując ją 
odpowie: 

 Nie zaliczyłeś. Przykro mi! 
 Wybrnąłeś, ale chyba nie jesteś orłem. 
 No, nieźle! 
 Brawo. Tak trzymaj! 
 Super! 

Zadanie 8 
Sformułuj algorytm i napisz program, który dla podanej wartości x (w stopniach) 
sprawdzi i poinformuje, czy  funkcja sin(x): 

 Ma miejsce zerowe (tzn. sin(x)=0) 
 Przyjmuje wartość max, 
 Przyjmuje wartość min. 

background image

 

64 

Zadanie 9 
 

Przedstaw algorytm i wykonaj program, który dla zadawanych wartości  a , b 
oraz c określi która z tych zmiennych określa wartości  najmniejszą, a która 
największą ( np. min=b, max=a); 

Zadanie 10 

Przedstaw algorytm i wykonaj program, który dla zadawanych wartości  a , b oraz 
c (długości boków trójkąta) sprawdzi i poinformuje czy z zadanych boków można 
utworzyć trójkąt. 
Wskazówka: Sprawdzić relacje boków. 
 

Zadanie 11 

Wartości  a , b oraz c  są współczynnikami równania kwadratowego typu: 
a*x^2 +b*x +c=0 
 Podać algorytm i napisać program, który w zależności od wartości a,b,c określi: 

 czy równanie ma pierwiastki (np. Brak pierwiastków rzeczywistych), 
 Ile istnieje pierwiastków (np. Równanie ma 1 pierwiastek).  

Zadanie 11 

Wartości  a , b oraz c  są współczynnikami równania kwadratowego typu: 
a*x^2 +b*x +c=0 
 Podać algorytm i napisać program, który w zależności od wartości a,b,c określi: 

 czy równanie ma maksimum i ile ono wynosi bądź też, 
 czy równanie ma maksimum i ile ono wynosi.  

 

Zadanie 12 

Wartości  a , b oraz c  są współczynnikami równania kwadratowego: 
a*x^2 +b*x +c=0 
 Podać algorytm i napisać program,  który w zależności od wartości a,b,c określi 
wartości liczbowe jego  pierwiastków.  

Zadanie 13 

Dane są liczby całkowite  a i b (a,b>0) i takie, ze a<b. Zaprojektuj algorytm i 
wykonaj program, który oblicza sumę i iloczyn liczb całkowitych z przedziału [a,b]. 

Zadanie 14 

Dane są dwie liczby całkowite  a i b (a,b>0) i takie, ze a<b. Zaprojektuj algorytm i 
wykonaj program, który oblicza sumę i iloczyn liczb parzystych z przedziału [a,b]. 
 

Zadanie 15 

Dane są dwie liczby całkowite  a i b (a,b>0) i takie, ze a≠b. Zaprojektuj algorytm i 
wykonaj program, który oblicza sumę i iloczyn liczb nieparzystych z przedziału 
[a,b]. 

background image

 

65 

Zadanie 16 

Zaprojektuj algorytm i wykonaj program, który dla  wprowadzanych liczb będzie 

określał, czy są one całkowite czy nie

Zadanie 17

 

Wartości  a , b oraz c  są  długościami boków trójkąta. Należy zaprojektować 
algorytm i wykonać program sprawdzający czy z zadanych boków można utworzyć 
trójkąt. Rozwiąż problem tak aby wykorzystać wzór  Herona. 

Zadanie 18

 

Wartości  a , b oraz c  są  długościami boków trójkąta. Należy zaprojektować 
algorytm i wykonać program sprawdzający czy z zadanych boków można utworzyć 
trójkąt prostokątny. 

Zadanie 19

 

Wartości  a , b oraz c  są  długościami boków trójkąta. Należy zaprojektować 
algorytm i wykonać program sprawdzający czy z tych boków można zbudować 
trójkąt prostokątny jeśli tak to należy poinformować, która z wartości określa 
przeciwprostokątną a które są przyprostokątnymi.  

Zadanie 20

 

Wartości  boków trójkąta prostokątnego mogą być wprowadzane w dowolnej 
kolejności i są pamiętane jako: b1 , b2 oraz b3. Zaprojektuj algorytm i wykonaj 
program obliczający  pole trójkąta (nie  korzystać z wzoru Herona).  

Zadanie 21

 

Sformułuj algorytm napisz program kalkulatora, który dla podanych dwu 
dowolnych wartości liczbowych a i b oraz znaku operacji Zn (dopuszczalne 
wartości Zn to: +, -, *, /, s, g (gdzie: s- średnia arytmetyczna, g- średnia 
geometryczna) wykona stosowne działanie i poda jego wynik lub zasygnalizuje 
przyczynę błędu.  
 

Zadanie 22

 

Przedstaw algorytm i napisz program wczytujący n liczb  i informujący czy 
kolejna, podana  liczba jest: 

 Całkowita 
 Pierwsza, 
 Parzysta czy nie 

 

Zadanie 23 

Przedstaw algorytm i napisz program wczytujący  liczby  i informujący czy 
kolejna, podana  liczba jest: 

 Całkowita 
 Pierwsza, 
 Parzysta czy nie 

Ilość badanych liczb nie jest znana. 

background image

 

66 

 

Zadanie  24   

Sformułuj algorytm napisz program, który dla zadawanej wartość x (powinna to 
być liczba całkowita <1000)  określi jej strukturę np. dla liczby 73 w postaci:  

 Setek-        0 
 Dziesiątek- 7 
 Jedności     3 

Zadanie  25   

Sformułuj algorytm napisz program, który dla podawanych  zarobków osób A i 
B (wynoszących np. 1183 zł i 834 zł) określi jakie nominały (200, 100, 50, 20, 
10, 5, 2, 1zł) i w jakiej liczbie trzeba posiadać, żeby bez potrzeby rozmieniania 
wypłacić obu osobom dokładnie należne kwoty. 

 

Zadanie 26 

Wartości  a , b oraz c  są współczynnikami równania kwadratowego typu: 
a*x^2 +b*x +c=0 
 Podać algorytm i napisać program, który w zależności od wartości a,b,c określi: 

 rodzaj ekstremum (min lub max), 
 wartość ekstremalną funkcji.  

Uwaga: Ekstremum wyznaczyć metodą poszukiwania. 

Zadanie 27 

Sformułuj algorytm i napisz program, który pobierze n liczb i zapamięta je w 
wektorze A[1:n], a następnie tak przestawi liczby w wektorze A tak, by były one 
uporządkowane niemalejąco tzn: najmniejsza wartość powinna znaleźć się w 
A[1] a największa w A[n], a dla każdej pary  A[i-1] i A[i] powinna zachodzić 
relacja A[i-1] ≤ A[i]. 

Wskazówka: 
Szukaj max elementu i zamień jego wartość z  ostatnim n-tym elementem  tablicy. Następnie 
ponownie szukaj w tablicy max elementu (ale spośród n-1 elementów) i zamień go z 
elementem n-1 itp. Np. 
Dla n=6  mamy przykładowo dane:  A=[3, 7, 1,11,6,4]- dane wejściowe 
 

Kolejno otrzymamy:              A=[3, 7, 1, 4,6,11] 

           A=[3, 6, 1, 4,7,11]    
           itp. aż do: 
           A=[1, 3, 4, 6,7,11]- dane uporządkowane! 

Zadanie 28 

Sformułuj algorytm i napisz program, który pobierze n liczb i zapamięta je w 
wektorze A[1:n], a następnie tak przestawi liczby w wektorze A tak, by były one 
uporządkowane malejąco tzn: największa  wartość powinna znaleźć się w A[1] a 
najmniejsza w A[n], a dla każdej pary  A[i-1] i A[i] powinna zachodzić relacja 
A[i-1] ≥ A[i]. 

background image

 

67 

 

Zadanie 29 

Sformułuj algorytm i napisz program, który: 

 Pobierze dwie nieujemne wartości xa oraz xb  takie, że 0≤  xa< xb oraz xb 

≤ 180 stop. 

 

obliczy pole powierzchni wyznaczone przebiegiem funkcji sin(x) w 

przedziale [xa, xb]

.  

Wskazówka:  
W przedziale [xa,xb] możesz narysować  prostokąt o małej  wartości boku (np. 1/100 
długości przedziału) na osi x i wysokości takiej jaką przyjmuje wartość funkcji sin w 
miejscu wrysowania. Jeśli pokryjesz  przedział [xa,xb] dużą liczbą kolejno po sobie 
wrysowanych prostokątów o ustalonej wartości boku na osi x to sumując ich pola 
możesz w przybliżeniu wyznaczyć pole powierzchni pod krzywą sin w zadanym 
przedziale. 

Zadanie 30 

Sformułuj algorytm i napisz program, który: 

 Pobierze liczby a,b,c (współczynniki równania kwadratowego), 

 

obliczy pole powierzchni położonej między osią x a krzywą wyznaczoną 

przez równanie.

  

 

Zadanie 31 

Sformułuj algorytm i napisz program, który będzie wczytywał liczby całkowite, 
nieujemne  i informował ile bitów jest niezbędne aby przedstawić daną liczbę w 
naturalnym kodzie binarnym (NKB). 

Zadanie 32 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę dziesiętną 
N, całkowitą i bez znaku na liczbę w naturalnym kodzie binarnym (NKB) i w 
zależności od wielkości zadanej liczby przedstawiał ją na 8 lub 16 bitach. 
Przyjmij, że max zadawana liczba N to 65536.  

Wskazówka: 
 Dzieląc zadaną liczbę przez podstawę systemu binarnego (tzn. 2) otrzymujemy pewien wynik 
całkowity i resztę  0 lub 1. Reszta to kolejna cyfra zapisu binarnego. W dalszym postępowaniu 
wynik traktujemy jako liczbę i kontynuujemy postępowanie, aż do chwili gdy wynik ma 
wartość 0. Otrzymane cyfry reszt zapisane w kolejności odwrotnej przedstawiają zapis 
binarny liczby N. 

Zadanie 33 

Sformułuj algorytm i napisz program, który dla podawanych ciągów binarnych 
będzie określał jaką liczbę dziesiętną one określają. 

Zadanie 34 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę dziesiętną 
N, całkowitą i bez znaku na liczbę heksadecymalną. 

background image

 

68 

Zadanie 35 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę 
heksadecymalną na liczbę dziesiętną. Przyjmij, że ilość cyfr liczby 
heksadecymalnej nie przekracza 8. 

Wskazówka: 
W ogólnym przypadku liczba heksadecymalna jest zmienną tekstową. Zastosuj stosowne funkcje 
Matlaba umożliwiające analizę tekstu.  
 

Zadanie 36 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę dziesiętną 
N, całkowitą i bez znaku na liczbę w naturalnym bodzie binarnym (NKB) i w 
zależności od wielkości zadanej liczby przedstawiał ją na 8 lub 16 bitach. 
Przyjmij, że max liczba N to 65536.  

Wskazówka: Przyjmij wagi poszczególnych bitów systemu binarnego :b

7

 ,b

6

....,b

1

, b

0

. ( np. dla 

8 bitów będą to wartości:b

7

 =128 b

6

=64...........b

1

=2 b

0

=1. Liczbę N można przedstawić jako 

sumę iloczynów wartości bitów i wag:  
N=X

7

 *128 +X

6

*64+..........X

1

*2+X

0

*1 (gdzie: X

i  

mają wartość o lub 1). 

 Jeśli dana waga występuje to odpowiada jej jedynka jeśli nie 0. Np.  N= 96 można zamienić 
na binarną metodą doboru wag. I tak waga 128 ponieważ jest większa od liczby N to nie może 
wchodzić w skład sumy wag czyli wartość bitu b

7

 =0. Kolejna największa  waga 64 jest 

mniejsza od  N czyli musi być wybrana stąd b

6

 =1. Pozostaje do „zagospodarowania” N=96-

64=32. Z tą liczbą postępujemy podobnie jak poprzednio. Postępowanie kontynuujemy dopóki 
N>0. 

Zadanie 37 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę dziesiętną 
N, całkowitą i bez znaku na liczbę w systemie oktalnym.

 

Zadanie 38 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę oktalną na 
liczbę dziesiętną. 

 

Wskazówka: 
Potraktuj, że wczytywana liczba jest  zmienną tekstową. Zastosuj w algorytmie funkcje 
stosowne w Matlabie,  umożliwiające analizę tekstu. Wartości dziesiętne kodu ASCII dla 
kolejnych cyfr to: 0-48, 1-49, 2-50,3-51 ...,9-57. W Matlabie kody ASCII można uzyskać 
stosując funkcję double. Np

  

A=double(‘347’) da wynik w postaci macierzy liczb: A=[51 52 55]. 

Odwrotna funkcja zamieniająca kod ASCII na liczbę to char. Np. char(51)=3. 
 

Zadanie 39 

Sformułuj algorytm i napisz program, który po wprowadzeniu imienia będzie 
identyfikował płeć. 
Program powinien informować o wyniku identyfikacji  w postaci: 
To prawdopodobnie imię męskie! lub To prawdopodobnie imię męskie! 

Wskazówka: 
Wypisz kilka imion żeńskich. Na jaką literę się najczęściej kończą. Spróbuj to wykorzystać w 
algorytmie. 

background image

 

69 

Zadanie 40 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę dziesiętną 
N, całkowitą i bez znaku na liczbę w  wybranym  systemie o R=4 lub R=8. 
Efektem programu powinna być informacja: 
Podana liczba D=xxxx w systemie o podstawie R=yy ma następujące cyfry: 
C1 C2 .....itp... 

Zadanie 41 

Sformułuj algorytm i napisz program, który będzie zamieniał liczbę z 
dowolnego systemu o podstawie R na liczbę dziesiętną 

 

Zadanie 42 

Sformułuj algorytm i napisz program, który będzie zamieniał podaną liczbę 
ułamkową na liczbę binarną 16 bitową i wartość tej liczby wyświetlał w postaci 
heksadecymalnej. 

 
Zadanie 43 

Sformułuj algorytm i napisz program, który będzie zamieniał podaną liczbę 
całkowitą dodatnią lub ujemną na kod U2 i przedstawiał jej wartość w postaci 4 
cyfr heksadecymalnych. 

Uwaga: 
Zadbać by wprowadzana liczba nie przekroczyła zakresu, który może być przedstawiony 
czterema cyframi heksadecymalnymi.

 

 
Zadanie 43 

Sformułuj algorytm i napisz program, który będzie wczytywał ciąg liczb do 
momentu wpisania liczby 0 i dla wczytanego ciągu wyznaczy liczbę minimalną 
i maksymalną. 

 
Zadanie 44 

Sformułuj algorytm i napisz program, który będzie wczytywał ciąg liczb 
dodatnich do momentu wpisania liczby 0 i dla wczytanego ciągu wyznaczy 
wartość średnią i odchylenie standardowe. 

Uwaga: 
Spróbuj, czy potrafisz rozwiązać ten problem bez pamiętania w tablicy wczytywanych 
wartości. 

 

 
Zadanie 45 

Sformułuj algorytm i napisz program, który będzie wczytywał ciąg liczb do 
momentu wpisania liczby 0 i dla wczytanego ciągu wyznaczy wartość 
najmniejszej  liczby dodatniej (jeśli były takie liczby). 

background image

 

70 

 
Zadanie 46 

Sformułuj algorytm i napisz program, który będzie wczytywał ciąg liczb do 
momentu wpisania liczby 0 i dla wczytanego ciągu wyznaczy wartość 
największą   liczby ujemnej (jeśli były takie liczby). 

 
Zadanie 47 

Sformułuj algorytm i napisz program, który będzie sprawdzał czy w ciągu 
wczytanych n liczb występuje podana do sprawdzenia liczba x. 

 
Zadanie 48 

Sformułuj algorytm i napisz program, który określi jaki jest największy wspólny 
dzielnik liczb dla podanej pary liczb n,m  (n>m). 

Uwaga: 
Zastosuj odejmowanie od liczby większej liczby mniejszej do momentu otrzymania wyniku 
zero. Po każdym kroku liczba, która była odjemną staje się liczbą większą a odjemnikiem staje 
się liczb, która była różnicą. 
 

Zadanie 49 

Sformułuj algorytm i napisz program, który wczyta n-elementowy wektor 
wierszowy A oraz macierz B i wykona operacją mnożenia   A*B. Program 
powinien kontrolować poprawność wprowadzania danych.  

Uwaga: 
Wykonaj to zadanie stosując wbudowane operacje macierzowe oraz bez stosowania tych 
operacji. 

 

Zadanie 50 

Sformułuj algorytm i napisz program, który wczyta n-elementowy wektor 
wierszowy A oraz macierz B i wykona operacją mnożenia   B*A

T

. Program 

powinien kontrolować poprawność wprowadzania danych.  

Uwaga: 
Wykonaj to zadanie stosując operacje macierzowe oraz bez stosowania tych operacji 

Zadanie 51 

Sformułuj algorytm i napisz program, który wczyta macierz A oraz macierz B i 
wykona operacją mnożenia   A*B. Program powinien kontrolować poprawność 
wprowadzania danych.  

Uwaga: 
Wykonaj to zadanie stosując operacje macierzowe oraz bez stosowania tych operacji