Pierwszy wpis z serii „Matura z Informatyki w języku python”. W tym materiale pokażemy rozwiązania do zadań z matury z roku 2015. Przeanalizujemy treść zadania 4 oraz rozwiązania krok po kroku.
Wstęp do zadań z matury z Informatyki 2015 w języku Python
Zadania z matury z Informatyki z 2015 roku można znaleźć pod tym linkiem. Będzie to część 2, która skupia się na części programistycznej.
Zadanie 4 – liczby binarne
W pliku liczby.txt znajduje się 1000 liczb naturalnych zapisanych binarnie. Każda
liczba zapisana jest w osobnym wierszu. Pierwsze pięć wierszy zawiera następujące liczby:
11010100111
11110111111011101
1010100111010100
1101111111111111111111010100101010101001
1010110011001101010011110101010101010111
Każda liczba binarna zawiera co najwyżej 250 cyfr binarnych, co oznacza, że w wielu
językach programowania wartości niektórych z tych liczb nie da się zapamiętać
w pojedynczej zmiennej typu całkowitoliczbowego, np. w języku C++ w zmiennej typu
int.
Napisz program, który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku
wynik4.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie.
Zadanie 4.1
Podaj, ile liczb z pliku liczby.txt ma w swoim zapisie binarnym więcej zer niż jedynek.
Przykład: Dla zestawu liczb:
101011010011001100111
10001001
1000000
101010011100
100010
wynikiem jest liczba 3 (3 pogrubione liczby mają w swoim zapisie więcej zer niż jedynek).
Rozwiązanie
Jak wiemy tekst czyli zmienna typu string przechowuje znaki jako zmienne typu char. Stąd pierwszym rozwiązaniem, które możemy rozważyć jest iterowanie się wiersz po wierszu i sumowanie ilości wystąpień znaku '0′ oraz '1′. Stwórzmy taka funkcje:
def ilosc_liczb_0_niz_1(liczby): ilosc_takich_liczb = 0 for liczba in liczby: liczba0 = 0 liczba1 = 0 for char in liczba: if char == '0': liczba0 += 1 elif char == '1': liczba1 += 1 if liczba0 > liczba1: ilosc_takich_liczb += 1 else: pass return ilosc_takich_liczb
Następnie wczytajmy sobie liczby testowe i sprawdźmy poprawność działania naszego algorytmu:
test_liczby = [ '101011010011001100111', '10001001', '1000000', '101010011100', '100010' ] test_wynik = ilosc_liczb_0_niz_1(test_liczby) zdany = test_wynik == 3 print(f'Czy test się udał ? {zdany}')
Jak widać udało nam się potwierdzić działanie naszego rozwiązania na przykładzie. Teraz wczytując plik tekstowy załączony do egzaminu, możemy znaleźć ostateczną odpowiedź.
liczby = [] with open('liczby.txt', 'r') as liczby_plik: for line in liczby_plik: line = line.strip() liczby.append(line) wynik = ilosc_liczb_0_niz_1(liczby) print(f'Ilość takich liczb: {wynik}')
Zadanie 4.2
Podaj, ile liczb w pliku liczby.txt jest podzielnych przez 2 oraz ile liczb jest podzielnych
przez 8.
Przykład: Dla zestawu liczb:
101011010011001100000 (*),(**)
10001001
100100 (*)
101010010101011011000 (*), (**)
100011
trzy liczby są podzielne przez 2 (*) i dwie liczby są podzielne przez 8 (**).
Rozwiązanie
Wiemy, że liczby podzielne przez 8 są również podzielne przez 2. Dodatkowo w pythonie istnieje możliwość łatwej konwersji liczb binarnych w formacie tekstowym na zmienne typu integer. Wykorzystamy tą możliwość do obliczenia reszty z dzielenia. Pamiętajmy, że w zmiennej liczby przechowujemy liste liczb z pliku liczby.txt
def zad2(liczby): podzielne_przez_2 = 0 podzielne_przez_8 = 0 for liczba in liczby: liczba = int(liczba, 2) if liczba % 2 == 0: podzielne_przez_2 += 1 if liczba % 8 == 0: podzielne_przez_8 += 1 print(f'Podzielne przez 2: {podzielne_przez_2}') print(f'Podzielne przez 8: {podzielne_przez_8}')
Dzięki funkcji int(’tekst’, 2) z parametrem 2 dajemy informacje ze tekst który podaliśmy jako input jest zapisem binarnym liczby. Po tej konwersji zostaje nam jedynie sprawdzenie wyniku reszty z dzielenia przez 2 oraz 6
Zadanie 4.3
Znajdź najmniejszą i największą liczbę w pliku liczby.txt. Jako odpowiedź podaj
numery wierszy, w których się one znajdują.
Przykład: Dla zestawu liczb:
101011010011001100111
10001001011101010
1001000
101010011100
1000110
najmniejsza liczba to: 1000110
największa liczba to: 101011010011001100111
Prawidłowa odpowiedź dla powyższego przykładu to: 5, 1.
Rozwiązanie
Dla ułatwienia najpierw przerobimy sobie wartości w formie binarnej na wartości w formacie liczb całkowitych. Następnie zapiszemy sobie liczbę maksymalną którą znaleźliśmy oraz minimalną. Ostatecznie potrzebujemy podać wiersz tej liczby zaczynając od wiersza numer 1, skorzystamy z funkcji list.index() która zwraca wartość indexu w liście dla parametru wejściowego oraz dodamy + 1, gdyż numeracja wierszy w liście zaczyna się od 0 a nie od 1.
def zad3(): lista_liczb_int = [int(x, 2) for x in liczby] maks = max(lista_liczb_int) minim = min(lista_liczb_int) print(maks) print(f'Maksymalna wartość w linii {lista_liczb_int.index(maks} + 1}') print(f'Minimalna wartość w linii {lista_liczb_int.index(minim) + 1}')
Podsumowanie
Wyniki każdego z zadań na maturze należy podać w postaci pliku wynik4.txt który ostatecznie powinien wyglądać tak:
1 422 2 Podzielne przez 2: 500 Podzielne przez 8: 123 3 Maksymalna wartość w linii 925 Minimalna wartość w linii 859