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 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
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ń.
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
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ó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.
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.
Zachęcam cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.