Commit 156f8b4a by Patryk Czarnik

Dalsze rozwiązania zadań domowych

parent 1f0d9753
# Definicje funkcji w różnych wersjach.
# Niektóre (fib_rek oraz czy_pierwsza 1 i 2) są mało wydajne, ale mimo wszystko warto takie definicje zobaczyć.
# wersja "matematyczna"
def suma_cyfr_v1(n):
wynik = 0
if n < 0:
n = -n
while n != 0:
wynik += n % 10
n //= 10
return wynik
# wersja "techniczna"
def suma_cyfr_v2(n):
cyfry = str(abs(n))
wynik = 0
for cyfra in cyfry:
wynik += int(cyfra)
return wynik
# wersja "techniczna" ze skrótowym zapisem typu comprehension
def suma_cyfr_v3(n):
return sum(int(cyfra) for cyfra in str(abs(n)))
# wersja "techniczna" ze skrótowym zapisem `map`
def suma_cyfr_v4(n):
return sum(map(int, str(abs(n))))
def silnia_rek(n):
if n <= 1: return 1
return n * silnia_rek(n-1)
def silnia(n):
iloczyn = 1
for i in range(1, n+1):
iloczyn *= i
return iloczyn
def fib_rek(n):
if n <= 1: return n
return fib_rek(n-2) + fib_rek(n-1)
def fib_tab(n):
tab = [0, 1]
for i in range(2, n+1):
tab.append(tab[-1] + tab[-2])
return tab[n]
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = a+b, a
return a
def najmniejszy_dzielnik(n):
for i in range(2, n+1):
if n % i == 0:
return i
def czy_pierwsza_1(n):
dzielniki = list()
for i in range(1, n+1):
if n % i == 0:
dzielniki.append(i)
# teraz mamy wszystkie dzielniki:
# print(dzielniki)
# liczba naturalna jest liczbą pierwszą wtedy i tylko wtedy, gdy posiada dwa dzielniki naturalne
return len(dzielniki) == 2
def czy_pierwsza_2(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
def czy_pierwsza_3(n):
from math import sqrt
if n <= 1:
return False
for i in range(2, int(sqrt(n+1))+1):
if n % i == 0:
return False
return True
def czy_pierwsza_4(n):
from math import sqrt
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(3, int(sqrt(n+1))+1, 2):
if n % i == 0:
return False
return True
def main():
# Testy funkcji dla przykładowych wartości
for x in [0, 1, 7, 17, 123, -123, 543210, 10101010, 192837]:
print(f'suma cyfr {x} v1 = {suma_cyfr_v1(x)}')
print(f'suma cyfr {x} v2 = {suma_cyfr_v2(x)}')
print(f'suma cyfr {x} v3 = {suma_cyfr_v3(x)}')
print(f'suma cyfr {x} v4 = {suma_cyfr_v4(x)}')
print()
for x in list(range(0, 21)) + [100, 200]:
print(f'silniaR({x}) = {silnia_rek(x)}')
print(f'silnia ({x}) = {silnia(x)}')
print()
for x in list(range(0, 21)) + [40]:
print(f'fibR({x}) = {fib_rek(x)}')
print(f'fibT({x}) = {fib_tab(x)}')
print(f'fib ({x}) = {fib(x)}')
for x in [50, 100, 200, 500, 1000]:
print(f'fibT({x}) = {fib_tab(x)}')
print(f'fib ({x}) = {fib(x)}')
print()
for x in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 19, 99, 100, 101, 169052003, 2147483647]:
print(f'pierwsza v1 {x} = {czy_pierwsza_1(x)}')
print(f'pierwsza v2 {x} = {czy_pierwsza_2(x)}')
print(f'pierwsza v3 {x} = {czy_pierwsza_3(x)}')
print(f'pierwsza v4 {x} = {czy_pierwsza_4(x)}')
print()
if __name__ == '__main__':
main()
# Program pozwala uruchomić wybraną funkcję dla podanego parametru.
# Podaje wynik i zmierzony czas działania.
from datetime import datetime
from funkcje_liczbowe import *
def koniec_programu(kod):
print('No to nara...')
exit(kod)
FUNKCJE = [
koniec_programu,
suma_cyfr_v1,
suma_cyfr_v2,
suma_cyfr_v3,
suma_cyfr_v4,
silnia_rek,
silnia,
fib_rek,
fib_tab,
fib,
najmniejszy_dzielnik,
czy_pierwsza_1,
czy_pierwsza_2,
czy_pierwsza_3,
czy_pierwsza_4,
]
def wypisz_funkcje():
print('Program uruchomi wybraną funkcję, gdy podasz jej numer z listy oraz argument.')
print('Funkcja numer 0 z argumentem 0 kończy program.')
print('\nFunkcje do wyboru:')
for nr, f in enumerate(FUNKCJE):
print(f'{nr:3} → {f.__name__}')
def main():
wypisz_funkcje()
while True:
try:
nr = int(input('\nPodaj numer funkcji: '))
f = FUNKCJE[nr]
x = int(input('Podaj argument (liczbę naturalną): '))
if x < 0:
raise ValueError('Liczba ujemna')
pocz = datetime.now()
wynik = f(x)
konc = datetime.now()
print('Wynik:', wynik)
print('Czas wykonania:', konc - pocz)
except Exception as e:
print('Błąd', e)
if __name__ == '__main__':
main()
'''
Napisz program, który sprawdza, czy podana liczba jest liczbą pierwszą.
'''
print('Aby przerwać, podaj -1')
while True:
liczba = int(input('Podaj liczbę: '))
if liczba < 0: break
if liczba < 2:
print(f'Liczba {liczba} NIE JEST liczbą pierwszą')
continue
for i in range(2, int(liczba**0.5)+1):
if liczba % i == 0:
print(f'Liczba {liczba} NIE JEST liczbą pierwszą')
break
else:
print(f'Liczba {liczba} JEST liczbą pierwszą')
Adam;MAŁYSZ;POL;1977-12-03;169;60
Marcin;BACHLEDA;POL;1982-09-04;166;56
Robert;MATEJA;POL;1974-10-05;180;63
Alexander;HERR;GER;1978-10-04;173;65
Stephan;HOCKE;GER;1983-10-20;178;59
Martin;SCHMITT;GER;1978-01-29;181;64
Michael;UHRMANN;GER;1978-09-09;184;64
Georg;SPAETH;GER;1981-02-24;187;68
Matti;HAUTAMAEKI;FIN;1981-07-14;174;57
Tami;KIURU;FIN;1976-09-13;183;59
Janne;AHONEN;FIN;1977-05-11;184;67
Martin;HOELLWARTH;AUT;1974-04-13;182;67
Thomas;MORGENSTERN;AUT;1986-10-30;174;57
Tommy;INGEBRIGTSEN;NOR;1977-08-08;179;56
Bjoern-Einar;ROMOEREN;NOR;1981-04-01;182;63
Roar;LJOEKELSOEY;NOR;1976-05-31;175;62
Alan;ALBORN;USA;1980-12-13;177;57
# W tym programie obliczam statystyki dla wskzanego kraju.
wybrany_kraj = input('Podaj symbol wybranego kraju, np. POL: ').upper()
liczba = 0
suma_wag = 0
suma_wzrostu = 0
ile_najwyzszy = 0
kto_najwyzszy = None
ile_najnizszy = 1000
kto_najnizszy = None
ile_najciezszy = 0
kto_najciezszy = None
ile_najlzejszy = 1000
kto_najlzejszy = None
with open('zawodnicy.csv', mode='r', encoding='UTF-8') as plik:
for linia in plik:
imie, nazwisko, kraj, data_ur, wzrost_str, waga_str = linia.strip().split(';')
if kraj == wybrany_kraj:
wzrost = int(wzrost_str)
waga = int(waga_str)
liczba += 1
suma_wag += waga
suma_wzrostu += wzrost
if wzrost > ile_najwyzszy:
ile_najwyzszy = wzrost
kto_najwyzszy = f'{imie} {nazwisko}'
if wzrost < ile_najnizszy:
ile_najnizszy = wzrost
kto_najnizszy = f'{imie} {nazwisko}'
if waga > ile_najciezszy:
ile_najciezszy = waga
kto_najciezszy = f'{imie} {nazwisko}'
if waga < ile_najlzejszy:
ile_najlzejszy = waga
kto_najlzejszy = f'{imie} {nazwisko}'
print(f'Statystyki dla kraju {wybrany_kraj}:')
print(f'Liczba zawodników: {liczba}')
print(f'Suma wag : {suma_wag}')
print(f'Średni wzrost : {suma_wzrostu / liczba :.1f}')
print(f'Najwyższy zawodnik : {kto_najwyzszy}')
print(f'Najniższy zawodnik : {kto_najnizszy}')
print(f'Najcięższy zawodnik: {kto_najciezszy}')
print(f'Najlżejszy zawodnik: {kto_najlzejszy}')
# W tym programie obliczam ogólne statystyki dla całego pliku oraz statystyki "per kraj" za pomocą słowników.
liczba = 0
suma_wag = 0
suma_wzrostu = 0
ile_najwyzszy = 0
kto_najwyzszy = None
ile_najnizszy = 1000
kto_najnizszy = None
ile_najciezszy = 0
kto_najciezszy = None
ile_najlzejszy = 1000
kto_najlzejszy = None
ile_per_kraj = {}
suma_wzrostu_per_kraj = {}
with open('zawodnicy.csv', mode='r', encoding='UTF-8') as plik:
for linia in plik:
imie, nazwisko, kraj, data_ur, wzrost_str, waga_str = linia.strip().split(';')
wzrost = int(wzrost_str)
waga = int(waga_str)
liczba += 1
suma_wag += waga
suma_wzrostu += wzrost
if wzrost > ile_najwyzszy:
ile_najwyzszy = wzrost
kto_najwyzszy = f'{imie} {nazwisko}'
if wzrost < ile_najnizszy:
ile_najnizszy = wzrost
kto_najnizszy = f'{imie} {nazwisko}'
if waga > ile_najciezszy:
ile_najciezszy = waga
kto_najciezszy = f'{imie} {nazwisko}'
if waga < ile_najlzejszy:
ile_najlzejszy = waga
kto_najlzejszy = f'{imie} {nazwisko}'
print(f'Liczba zawodników: {liczba}')
print(f'Suma wag : {suma_wag}')
print(f'Średni wzrost : {suma_wzrostu / liczba :.1f}')
print(f'Najwyższy zawodnik : {kto_najwyzszy}')
print(f'Najniższy zawodnik : {kto_najnizszy}')
print(f'Najcięższy zawodnik: {kto_najciezszy}')
print(f'Najlżejszy zawodnik: {kto_najlzejszy}')
print()
# W tym programie obliczam statystyki "per kraj" za pomocą słowników (tylko liczba i średni wzrost).
ile_per_kraj = {}
suma_wzrostu_per_kraj = {}
with open('zawodnicy.csv', mode='r', encoding='UTF-8') as plik:
for linia in plik:
imie, nazwisko, kraj, data_ur, wzrost_str, waga_str = linia.strip().split(';')
wzrost = int(wzrost_str)
ile_per_kraj[kraj] = ile_per_kraj.get(kraj, 0) + 1
suma_wzrostu_per_kraj[kraj] = suma_wzrostu_per_kraj.get(kraj, 0) + wzrost
for kraj in ile_per_kraj:
ile = ile_per_kraj[kraj]
suma = suma_wzrostu_per_kraj[kraj]
srednia = suma / ile
print(f'{kraj}: {ile} zawodników o średnim wzroście {srednia:.1f} cm')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment