Zadania maturalne informatyka

Każdy przygotowywujący się do matury z informatyki spotyka się z różnymi zadaniami w języku c++. Obecnie coraz więcej szkół zaczyna korzystać z Python'a, a ja chcę w tej serii pokazać jak rozwiązywać przykładowe zadania.

Zadanie 62 - Liczby ósemkowe

Zadanie 62 z arkusza specjalnie przygotowywanych dla maturzystów zadań i rowiązań skupia się na znajomości konwersji pomiędzy systemami liczbowymi.

Arkusz z zadaniami (Matura Zbiór zadań Informatyka) możesz znaleźć pod tym linkiem

Pliki do zadania z kolei znajdują się tutaj

Nasze zadanie będę rozwiązywać w języku Python

Kod źródłowy do zadania wraz z plikami znajdziesz tutaj

Wczytywanie danych

Treść polecenia brzmi: W pliku liczby1.txt znajduje się 1000 liczb całkowitych dodatnich, zapisanych ósemkowo, maksymalnie sześciocyfrowych. Każda liczba umieszczona jest w osobnym wierszu.
W pliku liczby2.txt znajduje się 1000 liczb całkowitych dodatnich, zapisanych dziesiętnie, maksymalnie sześciocyfrowych.
Każda liczba umieszczona jest w osobnym wierszu. Napisz program(-y), za pomocą którego(-ych) rozwiążesz poniższe zadania.

def openFile(source):
  with open(source) as f:
    content = f.readlines()
    #usuniecie znakow specjalnych
    content = [x.strip() for x in content]
    return content
    
base8Numbers = openFile("liczby1.txt")
base10Numbers = openFile("liczby2.txt")
					

Zadanie wymaga od nas wczytywania dwóch plików, stąd parametr source określa plik.

Funkcji openFile() używamy tu do utworzenia globalnych tablic do póżniejszych zadań.

Systemy liczbowe

def getInBase(liczba, system):
  wynik = ""
  # kiedy liczba nie jest 0
  while liczba > 0:
    # dzielenie modulo przez system zeby dac reszte
    reszta = liczba % system
                  # konwertujemy na tekst
    wynik = wynik + str(reszta)
    # '/' dzielenie z przecinikiem
    # '//' dzielnie calkowite
    liczba = liczba // system
  # spisujemy liczby od konca (od dolu)
  wynik = wynik[::-1]
  return wynik
                    

Przy takim rodzaju zadań warto napisać funkcję, która niezależnie wypisze nam liczby w dowolnym systemie.

Specjalnie ten kod jest w języku polski, tak by łatwiej można było zrozumieć zasadę działania.

Wyszukaj w pliku liczby1.txt dwie liczby, najmniejszą i największą. Podaj wartości tych liczb w zapisie ósemkowym.

def findMinAndMax():
  #Find min
  mini = getInBase(int(min(base8Numbers)), 8)
  print("Min jest: " + str(mini))
  
  #Find max
  maxi = getInBase(int(max(base8Numbers)), 8)
  print("Max jest: " + str(maxi))
					

W pierwszym zadaniu operujemy tylko na wartościach w systemie ósemkowym.

Kolejność wykonywania kodu należy czytać od środka funckji.

Najpierw kolejno wyszukujemy min i max wartość z tablicy. Później konwertujemy tą wartośc na typ int.

Na samym końcu wywołujemy funkcję getInBase() z argumentem 8 (system).

Co ciekawe mimo, iż my mieliśmy podać odpowiedź w systemie ósemkowym. To w arkuszu odpowiedzi są one w systemie dziesiętnym.

17528 == 100210 oraz 27555248 == 77704410

Najdłuższy niemalejący ciąg

Znajdź najdłuższy niemalejący ciąg liczb występujących w kolejnych wierszach pliku liczby2.txt. Podaj pierwszy element tego ciągu oraz liczbę jego elementów. Możesz założyć, że jest jeden taki ciąg.

#znajduje rosnacy ciag
def findIncreasingString(dataList):
  #Needed 999 elements
  leng = len(dataList)
  longest = list()#najwiekszy ciag
  incr = list() #bufor niemalejacego ciagu
  
  #konwersja na typ int
  for i in range(leng):
    dataList[i] = int(dataList[i])
    
            #zabezpieczenie przed out of range
  for idx in range(leng - 1):
    #sprawdza nastepny wyraz
    if dataList[idx + 1] >= dataList[idx]:
      incr.append(dataList[idx])
    #nastepny wyraz jest niemalejacy
    else: 
      incr.append(dataList[idx])#dodaje ostatni rosnacy wyraz
      #porownuje dlugosci
      if len(incr) > len(longest):
        #jesli nowy jest wiekszy to nadpisuje
        longest = incr
      #czysci bufor
      incr = list()
  
  return longest
  
def theLongestString():
  stringsList = findIncreasingString(base10Numbers)
  print("Pierwszym elementem jest: " + str(stringsList[0]))
  print("Dlugosc wynosi: " + str(len(stringsList)))
  					

Pierwsze linijki odpowiadają za incjalizację zmiennych.

Poźniej każdy element jest rzutowany na typ int, tak by można było na nim wykonywać operację porównania.

Kod kolejno porównuje elementy z tablicy dataList czyli nasze liczby.

Jeśli kolejne wartości są rosnące lub stałe to dodaje je do bufora incr.

Jeśli następna liczba okaże się mniejsza to doda ostatni rosnący element, a później wybierze większy ciąg.

Porównywanie liczb

Porównaj wartości liczb zapisanych w wierszach o tych samych numerach w plikach liczby1.txt i liczby2.txt. Podaj liczbę wierszy, w których:
a) liczby mają w obu plikach taką samą wartość;
b) wartość liczby z pliku liczby1.txt jest większa od wartości liczby z pliku liczby2.txt.

def compareNumbers():
  theSame = 0
  bigger = 0
  numbs1 = list()#liczb1.txt (typ int)
  numbs2 = list()#liczb2.txt (typ int)
  
  #rzutuje str na int
  for k in range(1000):
    numbs1.append(int(base8Numbers[k]))
    numbs2.append(int(base10Numbers[k]))
  
  for i in range(1000):
    #konwersja na ta sama podstawe
    num1 = numbs1[i]
    num2 = int(getInBase(numbs2[i], 8))
    
    #sprawdzenie wartosci
    if num1 == num2:
      theSame = theSame + 1
      
    if num1 > num2:
      bigger = bigger + 1
      
  print("Takich samych jest: " + str(theSame))
  print("Wiekszych jest: " + str(bigger))
  					

W drugiej pętli wykonują się najważniejsze operacje. Najpierw liczby z systemu dziesiątkowego konwerowane są na ósemkowy.

Następnie wartości są sprawdzane pod względem warunków. Jeżeli któryś z warunków zostaje spełniony to przypisany mu licznik zwiększa wartość o jeden.

Występowanie liczby

Podaj, ile razy w zapisie dziesiętnym wszystkich liczb z pliku liczby2.txt występuje cyfra 6 oraz ile razy wystąpiłaby ta cyfra, gdyby te same liczby były zapisane w systemie ósemkowym.

def findSix():
  howManyIn8 = 0
  howManyIn10 = 0
  
  for number in base10Numbers:
    
    #10base
    for letter10 in str(number):
      if letter10 == "6":
        howManyIn10 = howManyIn10 + 1
        
    #8base
    newNumb = getInBase(number, 8)
    for letter in newNumb:
      if letter == "6":
        howManyIn8 = howManyIn8 + 1
    
  print("W sys. dzies.: " + str(howManyIn10))
  print("Zapisane osemkowo: " + str(howManyIn8))
                    

Ostatnie zadanie okazuje się zaskakująco proste.

Iterując po wszystkich liczbach w pliku liczby2.txt. Najpierw rzutujemy liczbę na typ str.

Po stringach możemy z kolei iterować jak po tablicy. Póżniej wystarczy już tylko porównać konkretne cyfry (tutaj letter)

findMinAndMax()
theLongestString()
compareNumbers()
findSix()
                    

TL;DR

Skopiuj cały kod do jednego pliku w kolejności podanej w tekście. UWAGA wyniki w plikach z odpowiedziami nie są zapisane tak samo jak w tym kodzie.

shop
Otwórz Sklep Play

Zachęcam cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.