Powtorzenie semestru: algorytmy, programowanie w Pythonie, testowanie
ð Podstawa programowa: I+IIPonizej znajdziesz podsumowanie kluczowych tematow z calego semestru. Uzyj tego jako materialu do powtorki przed sprawdzianem.
Algorytm to skonczony, uporzadkowany zbior jednoznacznych krokow prowadzacych do rozwiazania problemu.
# Przyklad pseudokodu: Wyszukiwanie liniowe
# WEJSCIE: lista L, szukana wartosc x
# WYJSCIE: indeks x w L lub -1
DLA i OD 0 DO dlugoscLlisty - 1:
JESLI L[i] == x:
ZWROC i
ZWROC -1
# Typy danych w Pythonie
liczba_calkowita = 42 # int
liczba_zmiennop = 3.14 # float
tekst = "Hello, World!" # str
prawda = True # bool
lista = [1, 2, 3, 4, 5] # list
# Konwersja typow
x = int("42") # str -> int
y = float("3.14") # str -> float
z = str(42) # int -> str
# Operatory
print(10 // 3) # 3 (dzielenie calkowite)
print(10 % 3) # 1 (reszta z dzielenia)
print(2 ** 10) # 1024 (potegowanie)
# if-elif-else
wiek = int(input("Podaj wiek: "))
if wiek < 0:
print("Bledny wiek!")
elif wiek < 13:
print("Dziecko")
elif wiek < 18:
print("Nastolatek")
elif wiek < 65:
print("Dorosly")
else:
print("Senior")
# Operatory logiczne: and, or, not
if wiek >= 18 and wiek <= 65:
print("Wiek produkcyjny")
# Petla for - znana liczba powtorzen
for i in range(5): # 0, 1, 2, 3, 4
print(i, end=" ")
for i in range(2, 10, 2): # 2, 4, 6, 8
print(i, end=" ")
# Petla while - powtarzaj dopoki warunek prawdziwy
n = 1
while n <= 100:
print(n, end=" ")
n *= 2 # 1, 2, 4, 8, 16, 32, 64
# break i continue
for i in range(10):
if i == 3:
continue # pomin 3
if i == 7:
break # zakoncz na 7
print(i, end=" ") # 0 1 2 4 5 6
# Definiowanie funkcji
def pole_prostokata(a, b):
"""Oblicza pole prostokata o bokach a i b."""
return a * b
# Wywolanie
wynik = pole_prostokata(5, 3)
print(f"Pole: {wynik}") # Pole: 15
# Funkcja z parametrem domyslnym
def powitanie(imie, jezyk="pl"):
if jezyk == "pl":
return f"Czesc, {imie}!"
else:
return f"Hello, {imie}!"
print(powitanie("Jan")) # Czesc, Jan!
print(powitanie("Jan", "en")) # Hello, Jan!
# Tworzenie i podstawowe operacje
lista = [10, 20, 30, 40, 50]
print(lista[0]) # 10 (pierwszy element)
print(lista[-1]) # 50 (ostatni element)
print(lista[1:3]) # [20, 30] (wycinanie)
# Metody list
lista.append(60) # dodaj na koniec
lista.insert(0, 5) # wstaw na pozycji 0
lista.remove(30) # usun wartosc 30
lista.pop() # usun ostatni
lista.sort() # posortuj
lista.reverse() # odwroc
# List comprehension
kwadraty = [x**2 for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
parzyste = [x for x in range(20) if x % 2 == 0]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
tekst = "Python jest Super"
print(len(tekst)) # 17 (dlugosc)
print(tekst.lower()) # "python jest super"
print(tekst.upper()) # "PYTHON JEST SUPER"
print(tekst.split()) # ["Python", "jest", "Super"]
print(tekst.replace("Super", "swietny"))
print(tekst[0:6]) # "Python" (wycinanie)
print(tekst[::-1]) # odwrocony tekst
# Sprawdzanie
print("Python" in tekst) # True
print(tekst.startswith("Py")) # True
print(tekst.isdigit()) # False
# f-stringi
imie = "Jan"
wiek = 16
print(f"Nazywam sie {imie} i mam {wiek} lat.")
# Wyszukiwanie liniowe - O(n)
def szukaj_liniowo(lista, x):
for i in range(len(lista)):
if lista[i] == x:
return i
return -1
# Wyszukiwanie binarne - O(log n) - lista MUSI byc posortowana
def szukaj_binarnie(lista, x):
lewy, prawy = 0, len(lista) - 1
while lewy <= prawy:
srodek = (lewy + prawy) // 2
if lista[srodek] == x:
return srodek
elif lista[srodek] < x:
lewy = srodek + 1
else:
prawy = srodek - 1
return -1
# Sortowanie babelkowe - O(n^2)
def sortuj_babelkowo(lista):
lista = lista.copy()
n = len(lista)
for i in range(n - 1):
for j in range(n - 1 - i):
if lista[j] > lista[j + 1]:
lista[j], lista[j + 1] = lista[j + 1], lista[j]
return lista
def fibonacci(n):
"""Zwraca n-ty wyraz ciagu Fibonacciego (iteracyjnie)."""
if n <= 0: return 0
if n == 1: return 1
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
# Pierwsze 10 wyrazow: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
# Uzywaj assert do testowania
def jest_pierwsza(n):
if n < 2: return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
# Testy
assert jest_pierwsza(2) == True
assert jest_pierwsza(7) == True
assert jest_pierwsza(4) == False
assert jest_pierwsza(1) == False
assert jest_pierwsza(0) == False
assert jest_pierwsza(-5) == False
print("Testy OK!")
Odpowiedz na pytania (forma ustna lub pisemna):
for a while?1. Algorytm to skonczony, uporzadkowany zbior krokow prowadzacych
do rozwiazania problemu.
Cechy: skonczony (zatrzymuje sie), jednoznaczny (kazdy krok
jest jasny), poprawny (daje prawidlowy wynik).
2. Petla for - uzywamy gdy znamy liczbe powtorzen
(np. for i in range(10)).
Petla while - uzywamy gdy nie znamy liczby powtorzen,
powtarzamy dopoki warunek jest prawdziwy
(np. while n > 0).
3. O(n) - zlozonosc liniowa - czas rosnie proporcjonalnie
do rozmiaru danych. Przyklad: wyszukiwanie liniowe.
O(n^2) - zlozonosc kwadratowa - czas rosnie z kwadratem
rozmiaru. Przyklad: sortowanie babelkowe.
4. Wyszukiwanie binarne dziala na posortowanej liscie i w kazdym
kroku odrzuca polowe elementow. Dla 1000 elementow:
liniowe - max 1000 krokow, binarne - max 10 krokow (log2 1000).
5. Dane brzegowe to skrajne wartosci: pusta lista, zero,
jeden element, bardzo duza liczba. Testujemy dla nich,
bo wlasnie tam najczesciej pojawiaja sie bledy.
Napisz funkcje statystyki(lista), ktora dla podanej listy liczb zwraca slownik z kluczami: "min", "max", "srednia", "suma", "ilosc". Obsluz pusta liste (zwroc None). Napisz testy.
def statystyki(lista):
"""Oblicza statystyki dla listy liczb."""
if len(lista) == 0:
return None
return {
"min": min(lista),
"max": max(lista),
"srednia": sum(lista) / len(lista),
"suma": sum(lista),
"ilosc": len(lista)
}
# Testy
wynik = statystyki([4, 8, 15, 16, 23, 42])
assert wynik["min"] == 4
assert wynik["max"] == 42
assert wynik["suma"] == 108
assert wynik["ilosc"] == 6
assert wynik["srednia"] == 18.0
# Testy brzegowe
assert statystyki([]) == None
assert statystyki([5])["min"] == 5
assert statystyki([5])["max"] == 5
assert statystyki([-3, -1, -2])["min"] == -3
assert statystyki([0, 0, 0])["srednia"] == 0.0
print("Testy statystyk OK!")
Napisz program, ktory: (1) wczytuje od uzytkownika zdanie, (2) wyswietla liczbe slow, (3) wyswietla najdluzsze slowo, (4) wyswietla zdanie z odwrocona kolejnoscia slow, (5) wyswietla ile razy kazda litera wystepuje w zdaniu (bez spacji, male litery).
zdanie = input("Podaj zdanie: ")
# Przykladowe zdanie: "Python jest swietnym jezykiem programowania"
# 1. Liczba slow
slowa = zdanie.split()
print(f"Liczba slow: {len(slowa)}")
# 2. Najdluzsze slowo
najdluzsze = max(slowa, key=len)
print(f"Najdluzsze slowo: {najdluzsze} ({len(najdluzsze)} znakow)")
# 3. Odwrocona kolejnosc slow
odwrocone = " ".join(slowa[::-1])
print(f"Odwrocone: {odwrocone}")
# 4. Liczba wystapien kazdej litery
tekst_maly = zdanie.lower().replace(" ", "")
licznik = {}
for litera in tekst_maly:
if litera in licznik:
licznik[litera] += 1
else:
licznik[litera] = 1
# Sortowanie po liczbie wystapien (malejaco)
posortowane = sorted(licznik.items(), key=lambda x: x[1], reverse=True)
print("\nCzestosc liter:")
for litera, ile in posortowane:
print(f" '{litera}': {ile}")
Napisz program, ktory implementuje prosty system ocen uczniow: (1) Funkcja dodaj_ocene(dziennik, uczen, ocena) - dodaje ocene do slownika, (2) Funkcja srednia_ucznia(dziennik, uczen) - oblicza srednia, (3) Funkcja najlepszy_uczen(dziennik) - zwraca ucznia z najwyzsza srednia, (4) Funkcja statystyki_klasy(dziennik) - srednia klasy, najwyzsza i najnizsza ocena. Uzyj slownika {imie: [lista_ocen]}.
def dodaj_ocene(dziennik, uczen, ocena):
"""Dodaje ocene uczniowi. Tworzy wpis jesli nie istnieje."""
if ocena < 1 or ocena > 6:
print(f"Bledna ocena: {ocena} (dozwolone 1-6)")
return
if uczen not in dziennik:
dziennik[uczen] = []
dziennik[uczen].append(ocena)
def srednia_ucznia(dziennik, uczen):
"""Oblicza srednia ocen ucznia."""
if uczen not in dziennik or len(dziennik[uczen]) == 0:
return 0
return sum(dziennik[uczen]) / len(dziennik[uczen])
def najlepszy_uczen(dziennik):
"""Zwraca imie ucznia z najwyzsza srednia."""
if len(dziennik) == 0:
return None
najlepszy = None
najlepsza_sr = 0
for uczen in dziennik:
sr = srednia_ucznia(dziennik, uczen)
if sr > najlepsza_sr:
najlepsza_sr = sr
najlepszy = uczen
return najlepszy
def statystyki_klasy(dziennik):
"""Zwraca statystyki calej klasy."""
if len(dziennik) == 0:
return None
wszystkie = []
for oceny in dziennik.values():
wszystkie.extend(oceny)
if len(wszystkie) == 0:
return None
return {
"srednia_klasy": sum(wszystkie) / len(wszystkie),
"najwyzsza": max(wszystkie),
"najnizsza": min(wszystkie),
"liczba_ocen": len(wszystkie)
}
# Testowanie
dziennik = {}
dodaj_ocene(dziennik, "Jan", 5)
dodaj_ocene(dziennik, "Jan", 4)
dodaj_ocene(dziennik, "Jan", 5)
dodaj_ocene(dziennik, "Anna", 6)
dodaj_ocene(dziennik, "Anna", 5)
dodaj_ocene(dziennik, "Anna", 6)
dodaj_ocene(dziennik, "Piotr", 3)
dodaj_ocene(dziennik, "Piotr", 4)
dodaj_ocene(dziennik, "Piotr", 3)
# Srednie uczniow
for uczen in dziennik:
print(f"{uczen}: oceny={dziennik[uczen]}, "
f"srednia={srednia_ucznia(dziennik, uczen):.2f}")
# Najlepszy uczen
print(f"\nNajlepszy uczen: {najlepszy_uczen(dziennik)}")
# Statystyki klasy
stat = statystyki_klasy(dziennik)
print(f"Srednia klasy: {stat['srednia_klasy']:.2f}")
print(f"Najwyzsza ocena: {stat['najwyzsza']}")
print(f"Najnizsza ocena: {stat['najnizsza']}")
# Asserty
assert srednia_ucznia(dziennik, "Jan") == 14/3
assert najlepszy_uczen(dziennik) == "Anna"
assert stat["najwyzsza"] == 6
assert stat["najnizsza"] == 3
print("\nWszystkie testy OK!")