Systemy liczbowe i reprezentacja danych w komputerze - 3h


Cele ogólne
Uczeń:
  • planuje kolejne kroki rozwiązywania problemu, z uwzględnieniem podstawowych etapów myślenia komputacyjnego (określenie problemu, definicja modeli i pojęć, znalezienie rozwiązania, zaprogramowanie i testowanie rozwiązania) (I.1),
  • stosuje przy rozwiązywaniu problemów z różnych dziedzin algorytmy na liczbach: badania pierwszości liczby, zamiany reprezentacji liczb między pozycyjnymi systemami liczbowymi, działań na ułamkach z wykorzystaniem NWD i NWW (I.2b),
  • sprawdza poprawność działania algorytmów dla przykładowych danych (I.5),
  • projektuje i programuje rozwiązania problemów z różnych dziedzin, stosuje przy tym: instrukcje wejścia/wyjścia, wyrażenia arytmetyczne i logiczne, instrukcje warunkowe, instrukcje iteracyjne, funkcje z parametrami i bez parametrów, testuje poprawność programów dla różnych danych (II.1),
  • w zależności od problemu rozwiązuje go, stosując metodę wstępującą lub zstępującą (RI.1),
  • stosuje zasady programowania strukturalnego i obiektowego w rozwiązywaniu problemów (RII.2),
  • sprawnie posługuje się zintegrowanym środowiskiem programistycznym przy pisaniu, uruchamianiu i testowaniu programów (RII.3).
  • definiuje pojęcia: palindrom, funkcja, wartownik, parametr formalny, parametr aktualny.
  • wyjaśnia, czym jest parametr funkcji,
  • opisuje zadanie wartownika w kodzie źródłowym.
  • korzysta z metod dostępnych dla typu string w tworzonych programach,
  • w kodach źródłowych wykorzystuje wczytywanie wierszy danych wraz ze spacjami.
  • opisuje zalety wynikające z zapisywania podproblemów w postaci funkcji.
  • odróżnia parametry formalne i aktualne funkcji.
  • tworzy i wywołuje funkcje w języku C++.
  • Przydatne narzędzia/oprogramowanie
  • komputer z zainstalowanym środowiskiem Code::Blocks http://www.codeblocks.org/downloads/binaries
  • palindromy /wiki/
    Zapoznaj się tekstem w podręczniku strony od 61 do 72 ze szczególnym uwzględnieniem Podsumowania.

    Wskazówki, uwagi


    Lekcja 1: zagadnienie 2.1
    Lekcja 2: zagadnienia 2.2–2.3
    Lekcja 3: zagadnienia 2.4–2.5

    W modelu RGB warto wspomnieć o tym, jak zbudowany jest piksel w wyświetlaczach różnych urządzeń. Piksel składa się zwykle z trzech subpikseli, emitujących światło w kolorach czerwonym, zielonym i niebieskim. Stąd model RGB określa natężenie tych właśnie kolorów, a przypisane im wartości są niczym innym, jak informacją dla piksela, z jakim natężeniem na emitować światło każdy z jego subpikseli.

    System szesnastkowy jest obecny w programowaniu, na przykład podczas określania kolorów. W wielu językach programowania opisujemy kolory w modelu RGB, jednak natężenia kolorów podawane są w notacji heksadecymalnej. Przykładem wykorzystania systemu szesnastkowego jest też zapis kolorów w kodach HTML stron internetowych.

    Różne notacje dla kolorów w modelu RGB można zobaczyć, korzystając z narzędzia dostępnego bezpośrednio w wyszukiwarce google.com po wpisaniu frazy “RGB color picker”.

    Język C++ jest językiem statycznie typowanym. To znaczy, że programista sam określa typ zmiennych, tworząc je. W przypadku niektórych języków istnieje typowanie dynamiczne. Oznacza ono, że typ jest nadawany zmiennej na podstawie przypisanej do niej wartości. Przykładem takiego języka jest Python.

    Wprowadzając typ danych string, który jest typem obiektowym, dokonujemy wprowadzenia do programowania obiektowego. Warto poruszyć kwestię, czym jest klasa obiektu. Jednym ze sposobów wprowadzenia tego pojęcia może być pokazanie, jak bardzo klasy ułatwiają programowanie. Przykładem może być konkretny typ gier, na przykład wyścigi samochodowe. Na potrzeby takich wyścigów programiści mogą stworzyć klasę „Samochód”. Będzie w niej opisany będzie abstrakcyjny, teoretyczny samochód, który może skręcać, ma cztery koła, może przyspieszyć, zahamować itp. Takie informacje można podzielić na właściwości i zachowania (metody) samochodu. Następnie programiści mogą tworzyć kolejne samochody, dopisując jedynie do tych właściwości konkretne wartości – metody mogą się natomiast różnić się efektem działania w zależności od tego, jakie wartości mają poszczególne właściwości. Sprowadza się to do tego, że nie trzeba od początku do końca programować tego, jak ma działać każdy samochód pojawiający się w takiej grze.

    Warto podkreślić praktyczne zastosowanie łączenia zdań logicznych poprzez spójniki logiczne w zdania złożone. Dzięki temu możemy pisać kody źródłowe, które są krótsze i bardziej zwięzłe, gdyż wiele instrukcji warunkowych można zastąpić jedną.

    Realizując ćwiczenia i zadania polegające na stworzeniu kodu źródłowego o określonym działaniu, warto podkreślić, by przed przystąpieniem do pisania kodu źródłowego pamiętać o wcześniejszych etapach rozwiązywania problemów z wykorzystaniem komputera – na przykład sformułowaniu algorytmu.

    Wykorzystując zmienne typu string w języku C++, do kodu źródłowego dodaje się dyrektywę #include . Warto podkreślić, że string i iostream nie są jedynymi bibliotekami, z jakich można korzystać w tym języku. Biblioteki znacznie zwiększają możliwości języka. Można to zilustować animacją Podstawowe biblioteki języka C++, dostępną na stronie dlanauczyciela.pl.

     

    Zadanie 2 (łatwe)

    Przelicz na system dwójkowy podane poniżej liczby dziesiętne:
    10(10) = (2)  

    .

     100(10) = (2)  

    .

    1000(10) = (2)  

    .

    10000(10) = (2)  

    .

    93673(10) = (2)  

    .

     

    Zadanie 3 (dosyć łatwe)

    Ile razy wzrośnie zakres n-bitowych liczb binarnych, gdy liczbę bitów zwiększymy o 1, 2, 3, 4, m bitów? Odpowiedź uzasadnij.

    Zadanie 4 (łatwe)

    Obliczyć wartość dziesiętną następujących liczb dwójkowych:
    11,101(2) = (10)  

    .

    101,1101(2) = (10)  

    .

    1101011,11001(2) = (10)  

    .


    Zadanie 5 (łatwe)

    Przeliczyć podane liczby dziesiętne na zapis dwójkowy:
    7,6875(10) = (2)  

    .

    15,84375(10) = (2)  

    .

    27,8359375(10) = (2)  

    .


    Zadanie 6 (dosyć łatwe)

    Wyznaczyć 100 cyfr ułamkowych dwójkowego rozwinięcia liczby dziesiętnej 0,8(10).

     

    Zadanie 7 (dosyć łatwe)

    Wyznacz błąd względny i bezwzględny rozwinięcia dwójkowego liczby dziesiętnej 0,2(10) o dokładności 10 binarnych cyfr ułamkowych.






  • Zadanie 1 (łatwe)- binarne na dziesiętne



    Oblicz wartość następujących liczb binarnych:
    1100000011(2) =   

    .

    111000111(2) =   

    .

    10101010101(2) =   

    .

    11110000(2) =   

    .

    11001100110011(2) =   

    .




    Podział liczby na cyfry



    Zapisz specyfikację oraz algorytm wypisujący poszczególne cyfry liczby.


    Schemat blokowy



    Zapisz w postaci schematu blokowego algorytm obliczający dla danej liczby naturalnej liczbę jej dzielników właściwych większych od 1. Wykorzystaj pseudokod zapisany w podręczniku na stronie 17 /Ćwiczenie 5 str. 16/


    Programy w C++



    Napisz w środowisku CodeBlocks następujące programy:
    1. Program sprawdzający czy liczba jest parzysta
    2. Program wypisujący poszczególne cyfry z liczby
    3. Program wyświetlający liczbę dzielnikó właściwych liczby n większych od 1
    4. Program wypisujący NWD dla dwóch liczb naturalnych a i b



    Test wiedzy



    |
    		Pytanie 1.  Zamień liczbę 111 systemu dwójkowego na dziesiątkowy i podaj prawidłowy wynik
    
    		A/  6
    		B/  7
    		C/  10
    		D/  11
    		E/  12
    		
    		Pytanie 2  Zamień liczbę 11001 systemu dwójkowego na dziesiątkowy i podaj prawidłowy wynik
    
    		A/  20
    		B/  24
    		C/  25
    		D/  27
    		E/  31
    		
    		Pytanie 3  Zamień liczbę 101 systemu dwójkowego na dziesiątkowy i podaj prawidłowy wynik
    
    		A/  5
    		B/  7
    		C/  9
    		D/  11
    		E/  13
    		
    		Pytanie 4  Zamień liczbę 110011 systemu dwójkowego na dziesiątkowy i podaj prawidłowy wynik
    
    		A/  37
    		B/  40
    		C/  47
    		D/  50
    		E/  51
    		
    		Pytanie 5  Zamień liczbę 10001 systemu dwójkowego na dziesiątkowy i podaj prawidłowy wynik
    
    		A/  12
    		B/  14
    		C/  17
    		D/  21
    		E/  27
    
    		Pytanie 6  Zamień liczbę 56 systemu dziesiętnego na dwójkowy i podaj prawidłowy wynik
    
    		110011
    		111000
    		110101
    		110101
    		111111
    		
    		Pytanie 7  Zamień liczbę 20 systemu dziesiętnego na dwójkowy i podaj prawidłowy wynik
    
    		10100
    		11111
    		10010
    		10001
    		111101
    
    		Pytanie 8  Zamień liczbę 17 systemu dziesiętnego na dwójkowy i podaj prawidłowy wynik
    
    		A/  11111
    		B/  10101
    		C/  100101
    		D/  10111
    		E/  10001
    		
    		Pytanie 9  Zamień liczbę 120 systemu dziesiętnego na dwójkowy i podaj prawidłowy wynik
    
    		A/  1100100
    		B/  1101100
    		C/  1100110
    		D/  1000010
    		E/  1111000
    		
    		Pytanie 10  Zamień liczbę 6 systemu dziesiętnego na dwójkowy i podaj prawidłowy wynik
    
    		A/  110
    		B/  101
    		C/  100
    		D/  111
    		E/  1001
    		
    		Pytanie 11	Zamień liczbę 76 systemu ósemkowego na szesnastkowy i podaj prawidłowy wynik
    		
    		A/  A3
    		B/  4F3
    		C/  4C
    		D/  2A
    		E/  3E
    		
    		Pytanie 12  Zamień liczbę 5F systemu szesnastkowego na dziesiątkowy i podaj prawidłowy wynik
    
    		A/  79
    		B/  87
    		C/  64
    		D/  95
    		E/  112
    			
    		



    Podsumowanie



  • Instrukcja wejścia (wczytywanie danych): cin >> nazwa_zmiennej
  • Instrukcja wyjścia (wypisanie informacji na ekran) : cout << "teks do wyswietlenia" ;
    cout <<nazwa_zmiennej;
  • Instrukcja warunkowa if - else w języku C++ ma postać:
    if (warunek) instrukcja na tak;
    else instrukcja na nie;
  • Instrukcja pętli for
    for
    ( inicjalizacja zmiennej; warunek; aktualizacja zmiennej )
    {
    // Wykonywany kod, jeśli warunek został spełniony
    }
    Przykład:
    for ( int i = 0; i < 10; i++ )
    {
    cout << i << endl;
    }
  • Etapy rozwiązywania problemu: określenie problemu (zadania), podanie specyfikacji, sformułowanie rozwiązania - algorytmu, zaprogramowanie rozwiązania, testowanie rozwiązania.
  • Specyfikacja zadania to określenie danych i wyniku oraz określenie związku między nimi
  • Algorytm to skończony ciąg instrukcji prowadzących do rozwiązania problemu
  • Zapis algorytmu w języku programowania to kod źródłowy programu
  • Testowanie programu polega na wielokrotnym uruchamianiuu go dla różnych danych, dane muszą spełniać warunki specyfikacji.
  • Podstawowe instrukcje sterujące to: instrukcja warunkowa, instrukcja iteracji (pętla)
  • Translatory (które dzielimy na na kompilatory i interpretery) to programy tłumaczące kod źródłowy programu na język maszynowy.
  • Zintegrowane środowisko programistyczne (IDE) to program posiadający edytor do pisania kodu źródłowego, translator oraz funkcje ułatwiające uruchamianie programów



  • Przykładowe rozwiązania oraz komentarze do wybranych ćwiczeń i zadań
  • (ćw. 1, s. 28)
    a) Największą liczbą ośmiocyfrową w systemie dwójkowym jest 11111111, której zapis dziesiętny to 255.
    b) Największą liczbą szesnastocyfrową w systemie dwójkowym jest 1111111111111111, której zapis dziesiętny to 65535. Rozwiązanie w pliku T02_CW1.
  • (ćw. 2, s. 29) Lista kroków: Kroki 2, 3 powtarzaj, aż liczba będzie równa 0: Podziel liczbę przez 2. Część całkowitą z dzielenia liczby zapisz, a resztę z dzielenia wypisz. Rozwiązanie w pliku T02_CW2.
  • (ćw. 3, s. 31) Oczekiwany zapis w systemie szesnastkowym to B3. Rozwiązanie w pliku T02_CW3.
  • (ćw. 4, s. 32)
    a) 2 bajty to 16 bitów, czyli w zapisie binarnym 16 cyfr. Największą liczbą będzie zatem 1111111111111111 zapisane binarnie, czyli 65535 w systemie dziesiętnym.
    b) 78 w systemie binarnym to 1001110, liczba składa się z 7 znaków, czyli do zapisu potrzeba minimum 7 bitów. Rozwiązanie w pliku T02_CW4.
  • (ćw. 5, s. 34) a), c) Aby przedstawić w kodzie U2 liczbę ujemną, należy najpierw dodać do niej wartość podwojonej wagi najstarszego bitu. Na przykład, jeśli liczbę −100 chcemy zapisać w U2 za pomocą 8 bitów, dodajemy do niej liczbę 256, więc otrzymujemy: −100 + 256 = 156. Liczba −100 będzie zatem odpowiadać w kodzie U2 liczbie dziesiętnej 156, przedstawionej w sposób binarny bez znaku. b) Dla liczb nieujemnych zapis w kodzie U2 odpowiada naturalnemu zapisowi liczb binarnych. Rozwiązanie w pliku T02_CW5.
  • (ćw. 6, s. 35) Odpowiedź: −43. Rozwiązanie w pliku T02_CW6.
  • (ćw. 7, s. 36) Rozwiązanie w pliku T02_CW7.
  • (ćw. 8, s. 39) Rozwiązanie w pliku T02_CW8.
  • (ćw. 9, s. 42) a) Zapis operatora koniunkcji w języku C++ to &&. Kod źródłowy do realizacji tego podpunktu znajduje się na s. 41. Rozwiązanie w pliku T02_CW9.
  • (zad. 1) Odpowiedź: 551. Rozwiązanie w pliku T02_ZAD1.
  • (zad. 2) Odpowiedź: 89D0. Rozwiązanie w pliku T02_ZAD2.
  • (zad. 3) Z systemu szesnastkowego można dokonać bezpośredniego przeliczenia na system binarny, przeliczając poszczególne cyfry. E → 1110, 0 → 0000, A → 1010, 8 → 1000, zatem cała liczba w zapisie binarnym to 1110000010101000. Rozwiązanie w pliku T02_ZAD3.
  • (zad. 4) Odpowiedź: 35243. Rozwiązanie w pliku T02_ZAD4.
  • (zad. 5) Odpowiedź: −119. Rozwiązanie w pliku T02_ZAD5.
  • (zad. 6) Rozwiązanie w pliku T02_ZAD6.
  • (zad. 7) Rozwiązanie w pliku T02_ZAD7.
  • (zad. 8) Rozwiązanie w pliku T02_ZAD8.
  • (zad. 9) Liczba Część całkowita z dzielenia przez 4 Reszta z dzielenia przez 4 80 20 0 20 5 0 5 1 1 1 0 1 Liczbę 1100 w systemie czwórkowym można przedstawić, wykorzystując dwa znaki, ustawione parami jeden pod drugim. Poprawną odpowiedzią będzie c., gdyż kropki mogą odpowiadać cyfrze 1, a gwiazdki, cyfrze 0. Rozwiązanie w pliku T02_ZAD9.
  • (zad. 10) Rozwiązanie w pliku T02_ZAD10.
  • (zad. 11) Rozwiązanie w pliku T02_ZAD11.
  • (zad. 12) Rozwiązanie w pliku T02_ZAD12.
  • (zad. 13) Rozwiązanie /T02_ZAD13/.
  • (zad. 14) Rozwiązanie w pliku T02_ZAD14.
  • (zad. 15) Rozwiązanie w pliku T02_ZAD15.
  • (zad. 16) Rozwiązanie w pliku T02_ZAD16.
  • (zad. 17) Przy rozwiązywaniu zadania można posłużyć się także tabelą kodów ASCII ze s. 37. Zdaniem, którym firma Google podzieliła się z użytkownikami Twittera, było: I’m feeling lucky. Rozwiązanie w pliku T02_ZAD17.

    Rozwiązania do ćwiczeń z tej strony

    Ćwiczenie 5 - test
  • 1 --> B; 2 --> C; 3 --> A; 4 --> E; 5 --> C; 6 --> B; 7 --> A; 8 --> E; 9 --> E; 10 --> A; 11 --> E; 12 --> D;