Matura z informatyki - rozwiązania zadań

Numery telefonów - zadanie typu maturalnego

W pliku numery.txt zapisanych jest 1000 numerów telefonów (jeden numer na wiersz). Numery telefonów są zapisane bez żadnych dodatkowych znaków (tylko cyfry). Maksymalna długość numeru telefonicznego to 15 cyfr. Przykładowe numery w tym pliku to:

8532920888
6105000455181
646454074

Zadania do wykonania:

  1. Podaj liczbę numerów telefonów, które zawierają co najmniej trzy te same cyfry obok siebie (np. 111, 222 itd.).
  2. Wszystkie numery telefonów o tej samej liczbie cyfr tworzą jedną "rodzinę". Podaj liczbę niepustych rodzin numerów telefonów.
  3. Każdą rodzinę numerów telefonów zapisz w oddzielnym wierszu pliku rodziny_numerow.txt. Numery każdej rodziny wymień w kolejności rosnącej, oddzielone jedną spacją.

Plik do pobrania - numery.txt

Kod w języku Python

import re
from collections import defaultdict

def czy_powtarzajace_cyfry(numer):
    return bool(re.search(r'(\d)\1\1', numer))

def liczba_numerow(nazwa_pliku):
    liczba = 0
    with open(nazwa_pliku, 'r') as plik:
        for linia in plik:
            numer = linia.strip()
            if czy_powtarzajace_cyfry(numer):
                liczba += 1
    return liczba

print("Odp. 1: ", liczba_numerow('numery.txt'))

def liczba_rodzin_numerow(nazwa_pliku):
    dlugosci = set()
    with open(nazwa_pliku, 'r') as plik:
        for linia in plik:
            numer = linia.strip()
            dlugosci.add(len(numer))
    return len(dlugosci)

print("Odp. 2: ", liczba_rodzin_numerow('numery.txt'))

def zapisz_rodziny_numerow(nazwa_pliku_we, nazwa_pliku_wy):
    rodziny = defaultdict(list)
    with open(nazwa_pliku_we, 'r') as plik_we:
        for linia in plik_we:
            numer = linia.strip()
            rodziny[len(numer)].append(numer)

    with open(nazwa_pliku_wy, 'w') as plik_wy:
        for dlugosc in sorted(rodziny.keys()):
            numery = rodziny[dlugosc]
            numery.sort()
            plik_wy.write(' '.join(numery) + '\n\n')

zapisz_rodziny_numerow('numery.txt', 'rodziny_numerow.txt')

Szczegółowy opis kroków powyższego kodu:

  1. Importowanie modułów: Moduły re i collections są importowane. re jest modułem do obsługi wyrażeń regularnych, a collections zawiera narzędzia do obsługi różnych struktur danych, w tym defaultdict.
  2. Definicja funkcji czy_powtarzajace_cyfry: Ta funkcja przyjmuje ciąg znaków (numer) jako argument i sprawdza, czy zawiera on trzy powtarzające się cyfry. Zwraca True, jeśli tak, i False w przeciwnym razie.
  3. Definicja funkcji liczba_numerow: Ta funkcja przyjmuje nazwę pliku jako argument. Otwiera plik, czyta każdą linię (która reprezentuje numer telefonu), sprawdza, czy numer zawiera trzy powtarzające się cyfry, i zwiększa licznik, jeśli tak. Zwraca liczbę numerów z trzema powtarzającymi się cyframi.
  4. Wywołanie funkcji liczba_numerow i wypisanie wyniku: Wywołuje funkcję liczba_numerow dla pliku o nazwie 'numery.txt' i wypisuje wynik z etykietą "Odp. 1: ".
  5. Definicja funkcji liczba_rodzin_numerow: Ta funkcja, podobnie jak poprzednia, przyjmuje nazwę pliku jako argument. Otwiera plik, czyta każdą linię (numer telefonu) i dodaje długość numeru do zbioru. Na koniec zwraca liczbę unikalnych długości numerów, co reprezentuje liczbę "rodzin" numerów.
  6. Wywołanie funkcji liczba_rodzin_numerow i wypisanie wyniku: Wywołuje funkcję liczba_rodzin_numerow dla pliku o nazwie 'numery.txt' i wypisuje wynik z etykietą "Odp. 2: ".
  7. Definicja funkcji zapisz_rodziny_numerow: Ta funkcja przyjmuje dwie nazwy plików jako argumenty. Otwiera pierwszy plik, czyta każdą linię (numer telefonu) i dodaje numer do listy w słowniku rodziny, gdzie kluczem jest długość numeru. Następnie otwiera drugi plik, sortuje klucze słownika i dla każdej długości zapisuje numer telefonu (sortując numery) do pliku.
  8. Wywołanie funkcji zapisz_rodziny_numerow: Wywołuje funkcję zapisz_rodziny_numerow dla plików o nazwach 'numery.txt' i 'rodziny_numerow.txt', odpowiednio jako plik wejściowy i wyjściowy.

Kod w języku C++

Ten kod działa w sposób bardzo podobny do kodu Pythona, ale zamiast korzystać z funkcji wbudowanych w Pythonie, używa podstawowych konstrukcji języka C++ do osiągnięcia tych samych celów.

Opis tego kodu w języku C++, krok po kroku (wraz z numerami linii):

1-5: Importowanie odpowiednich bibliotek, które będą wykorzystywane w kodzie.

7-9: Definicja funkcji czy_powtarzajace_cyfry. Ta funkcja przyjmuje ciąg znaków jako argument i sprawdza, czy zawiera trzy powtarzające się cyfry zwracając true jeśli tak i false w przeciwnym razie.

11-18: Definicja funkcji liczba_numerow. Ta funkcja otwiera plik o podanej nazwie, czyta linie jako numery telefonów i zwiększa licznik, jeśli numer zawiera trzy powtarzające się cyfry.

20-28: Definicja funkcji liczba_rodzin_numerow. Ta funkcja otwiera plik o podanej nazwie, czyta linie jako numery telefonów i zwiększa wartość w mapie dla klucza odpowiadającego długości numeru. Zwraca liczbę kluczy w mapie, co jest równoznaczne z liczbą "rodzin" numerów.

30-41: Definicja funkcji zapisz_rodziny_numerow. Ta funkcja otwiera plik wejściowy, czyta linie jako numery telefonów i dodaje je do wektora w mapie, której kluczem jest długość numeru. Następnie otwiera plik wyjściowy i dla każdej długości zapisuje numery (po posortowaniu) do pliku.

43-49: Funkcja main, która jest punktem startowym programu. Wywołuje powyższe funkcje i wypisuje odpowiedzi.

Do pobrania:

kod Python

kod C++

© 2023 MaturaInformatyka.pl || Kontakt: admin(malpa)maturainformatyka.pl

Search