Dwa rodzaje dzielenia: iloraz całkowity i reszta z dzielenia
Algorytm zamiany liczby dziesiętnej na dwójkową zapisany w Pythonie
Lista: jedna nazwa na wiele wartości, indeksy liczone od zera
Gotowy program Zamiana i jego przebieg dla konkretnej liczby
Kod pokazuję z laptopa, Wy piszecie na kartce.
Rozgrzewka · 3 minuty
Co zostało z bitów i dzieleń?
Wracamy do poprzedniej lekcji.
Czym jest bit i ile różnych wartości zapiszecie na czterech bitach?
Na drzewie odcieni zieleni każdy odcień miał swój czterocyfrowy kod dwójkowy. Skąd wiadomo, że na jeden piksel takiego obrazu wystarczą 4 bity?
Zamiana liczby 123 na dwójkową: co zapisywaliście w kolejnych wierszach tabeli i w którą stronę czyta się gotowy wynik?
podręcznik Informatyka na czasie 2, s. 105–110 (7.2 Cyfrowy zapis informacji, 7.3 Algorytmy zamiany reprezentacji liczb, rys. 7.8, tab. 7.2)
Część 1 · Dwa rodzaje dzielenia
Iloraz całkowity i reszta
Dzielenie znane ze szkoły podstawowej daje wynik z częścią ułamkową: 123/2 to 61,5. Dzielenie całkowite daje sam iloraz całkowity 61, a osobno wyznacza się resztę 1. To jak rozdawanie cukierków po dwa: liczy się, ile osób dostanie pełną porcję i co zostanie w torbie.
Operator
Nazwa
Wyrażenie
Wynik
/
Dzielenie
3 / 2
1.5
//
Dzielenie całkowite
3 // 2
1
%
Reszta z dzielenia, czyli modulo
3 % 2
1
Podręcznik Informatyka na czasie 2, s. 112 (7.4 Program zamieniający liczbę dziesiętną na binarną, „Dzielenie całkowite i reszta z dzielenia”, pojęcie modulo) i s. 227 (dodatek 8, tabela operatorów arytmetycznych)
Część 1 · Algorytm
Ten sam algorytm, zapisany krokami
Tabelę dzieleń z poprzedniej lekcji da się zapisać jako powtarzane kroki. Program ma przyjąć liczbę nie większą niż 255, czyli mieszczącą się w jednym bajcie, i wypisać jej zapis dwójkowy.
Ciekawostka: pierwsze komputery wcale nie liczyły dwójkowo. ENIAC z lat czterdziestych przechowywał cyfry w pierścieniach o dziesięciu pozycjach, a jedna taka cyfra zajmowała 36 lamp elektronowych.
Podręcznik Informatyka na czasie 2, s. 111 (7.4 Program zamieniający liczbę dziesiętną na binarną, opis algorytmu w pięciu krokach, ramka „Specyfikacja”, pojęcie bajtu) · ciekawostka: en.wikipedia.org/wiki/ENIAC
Część 2 · Pierwsza próba
Pętla while, która liczy reszty
1. number = int(input("Podaj liczbę:"))
2.
3. while number > 0:
4. print(number % 2, end="")
5. number = number // 2
Zapis end="" w linijce 4. usuwa odstęp między wypisywanymi cyframi.
W linijce 1. program prosi o liczbę i zapamiętuje ją w zmiennej number. W linijkach 3.–5. powtarza dwie czynności: wyznacza resztę z dzielenia przez 2 i zapamiętuje w tej samej zmiennej iloraz całkowity.
Ten program ma jedną wadę: wypisuje reszty w kolejności ich wyznaczania, a w zapisie dwójkowym mają stać odwrotnie. Dla liczby 123 zobaczycie 1101111 zamiast 1111011.
Podręcznik Informatyka na czasie 2, s. 112 (7.4 Program zamieniający liczbę dziesiętną na binarną, „Wykorzystanie pętli while do zamiany liczby dziesiętnej na binarną”)
Część 2 · Nowa struktura danych
Lista: jedna nazwa na wiele wartości
Lista pozwala zapamiętać wiele danych bez zakładania osobnej zmiennej dla każdej z nich. Jest uporządkowana: każda wartość ma swoje miejsce, a to miejsce nazywa się indeksem. Listę można porównać do wiersza tabeli albo do rzędu ponumerowanych szafek w szatni: numer szafki to indeks, kurtka w środku to wartość. Indeksy liczymy od 0.
Podręcznik Informatyka na czasie 2, s. 113 (7.4 Program zamieniający liczbę dziesiętną na binarną, część o liście jako strukturze danych, rys. 7.10, ramka „Zapamiętaj” ze s. 115) i s. 223 (dodatek 6, „Listy”)
Część 2 · Trzy nowe narzędzia
Dokładanie, pętla for i czytanie od tyłu
append dokłada wartość na koniec listy i sam ją wydłuża, więc listę można zacząć od pustej.
reversed daje dostęp do elementów listy od ostatniego do pierwszego.
Pętla for, inaczej niż while, ma z góry ustaloną liczbę powtórzeń: idzie po elementach listy albo po liczbach z range.
numbers = [1, 3, 5]
for k in numbers:
print(k)
for k in range(1, 11):
print(k)
Pierwsza pętla wypisze 1, 3 i 5. Druga wypisze liczby od 1 do 10.
Uwaga
Program Cyfry wspak wczytuje z klawiatury osiem cyfr i wypisuje je w odwróconej kolejności.
Podręcznik zaczyna od listy z jedną wartością ([0]), więc po ośmiu obrotach pętli na liście jest dziewięć elementów, a pierwszy z nich to owo początkowe zero. W programie Zamiana tego problemu nie ma, bo lista startuje pusta.
Podręcznik Informatyka na czasie 2, s. 113–114 (7.4 Program zamieniający liczbę dziesiętną na binarną, część o wczytywaniu i wypisywaniu danych z listy, metoda append, pętla for, funkcje range i reversed) i s. 225 (dodatek 7, składnia pętli for)
Część 3 · Gotowy program
Program Zamiana
1. digits = []
2.
3. number = int(input("Podaj liczbę:"))
4. quotient = number
5.
6. while quotient > 0:
7. digits.append(quotient % 2)
8. quotient = quotient // 2
9.
10. print("Zapis binarny liczby", number, "to", end=" ")
11. for digit in reversed(digits):
12. print(digit, end=" ")
Linijka 1.: pusta lista, na razie bez wartości.
Linijka 3.: program prosi o liczbę do zamiany.
Linijka 4.: ta sama liczba trafia do zmiennej iloraz, która zmienia się w pętli.
Linijki 6.–8.: pętla dokłada do listy kolejne reszty i zapamiętuje iloraz całkowity.
Linijki 10.–12.: program wypisuje cyfry, czytając listę od końca.
Podręcznik Informatyka na czasie 2, s. 115 (7.4 Program zamieniający liczbę dziesiętną na binarną, kod źródłowy programu Zamiana z pliku swap.py)
To ta sama tabela, którą wypełnialiście ręcznie na poprzedniej lekcji. Program dopisuje reszty na koniec listy, a czyta ją od tyłu, więc ostatnia reszta staje się pierwszą cyfrą wyniku.
Podręcznik Informatyka na czasie 2, s. 110 (tab. 7.2, przebieg algorytmu dla liczby 123) i s. 115 (program Zamiana)
Ćwiczenie · na kartce · 10 minut
Ćwiczenie: program krok po kroku
Podpisz kartkę. Prześledź program Zamiana dla liczby 45: w każdym wierszu wpisz iloraz i resztę, a obok zawartość listy digits po tym obrocie pętli.
Pod tabelą zapisz tekst, który program wypisze na ekranie.
Dopisz, co zmienić w tym programie, żeby zamieniał liczbę na system ósemkowy. Podaj konkretne linijki.
Liczba | Iloraz | Reszta | Lista digits
45 | | |
| | |
| | |
| | |
| | |
Program wypisze: ......
Kto skończy wcześniej: ile cyfr ma najdłuższy wynik dla liczby mniejszej niż 256?
Dla chętnych (dom):plik swap.py z kodem ze slajdu 8, uruchomiony dla liczby 123.
Podręcznik Informatyka na czasie 2, s. 110 (wzór tab. 7.2), s. 115 (program Zamiana, ćwiczenie 6a)
Podsumowanie · Pytania kontrolne
Trzy pytania na koniec
Czym różni się wynik działania 123/2 od wyniku 123//2 i co pokazuje 123%2?
Dlaczego program Zamiana zbiera reszty na liście, zamiast wypisywać je od razu?
Element listy ma indeks 3. Który to element w kolejności i ile elementów ma lista, jeśli to jej ostatni indeks?
Podręcznik Informatyka na czasie 2, s. 112–115 (7.4 Program zamieniający liczbę dziesiętną na binarną)
Podsumowanie · Praktyka
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Własny program zamiany na dwójkowy
Python ma gotową funkcję bin: bin(3) daje napis '0b11'. Własny program pisze się po to, żeby wiedzieć, co ta funkcja robi w środku.
narzędzia
Osobno // i osobno %
Funkcja divmod zwraca jednym wywołaniem parę (a // b, a % b).
rozszerzane
Lista, do której dokładamy na koniec
Ta sama lista bywa stosem: append dokłada na koniec, pop zdejmuje ostatni element.
nadal w użyciu
Lista jako kolejka zadań
Dokumentacja Pythona odradza listę w tej roli: zdejmowanie z początku jest wolne. Do kolejek służy collections.deque.
zastępowane
reversed do czytania od tyłu
Metoda list.reverse() odwraca kolejność w samej liście, bez tworzenia nowej.
rozszerzane
Funkcje bin, divmod i reversed: docs.python.org/3/library/functions.html · lista jako stos i kolejka, append, list.reverse, collections.deque: docs.python.org/3/tutorial/datastructures.html