← Lekcje
Python · lekcja 20

Dzielenie całkowite i program zamiany

Systemy liczbowe, część 3 z 3

  1. Dwa rodzaje dzielenia: iloraz całkowity i reszta z dzielenia
  2. Algorytm zamiany liczby dziesiętnej na dwójkową zapisany w Pythonie
  3. Lista: jedna nazwa na wiele wartości, indeksy liczone od zera
  4. 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.

  1. Czym jest bit i ile różnych wartości zapiszecie na czterech bitach?
  2. 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?
  3. 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.

13 cukierków rozdanych po 2 na osobę 13 // 2 = 6 pełnych par 13 % 2 = 1 Dzielenie całkowite mówi, ile pełnych porcji, reszta mówi, co zostało
OperatorNazwaWyrażenieWynik
/Dzielenie3 / 21.5
//Dzielenie całkowite3 // 21
%Reszta z dzielenia, czyli modulo3 % 21
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.

Podziel liczbę przez 2 Resztę zapisz przed poprzednimi Iloraz to część całkowita wyniku iloraz > 0 ? tak: powtarzaj kroki od początku nie: koniec, wynik czytamy od ostatniej reszty do pierwszej

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.

Indeksy Wartości 0 1 2 3 4 5 6 7 10 11 7 14 4 3 20 11 items[3] to wartość 14, czyli czwarty element ósmy element ma indeks 7
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)
Część 3 · Przebieg

Co program robi z liczbą 123?

Liczba | Iloraz z dzielenia przez 2 | Reszta | Zawartość listy digits
  123  |             61             |   1    | [1]
   61  |             30             |   1    | [1, 1]
   30  |             15             |   0    | [1, 1, 0]
   15  |              7             |   1    | [1, 1, 0, 1]
    7  |              3             |   1    | [1, 1, 0, 1, 1]
    3  |              1             |   1    | [1, 1, 0, 1, 1, 1]
    1  |              0             |   1    | [1, 1, 0, 1, 1, 1, 1]

Zapis binarny liczby 123 to 1 1 1 1 0 1 1

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

  1. 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.
  2. Pod tabelą zapisz tekst, który program wypisze na ekranie.
  3. 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

  1. Czym różni się wynik działania 123/2 od wyniku 123//2 i co pokazuje 123%2?
  2. Dlaczego program Zamiana zbiera reszty na liście, zamiast wypisywać je od razu?
  3. 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 lekcjiW produkcjiStatus
Własny program zamiany na dwójkowyPython 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 koniecTa 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łuMetoda 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