💾 Zadanie domowe: Książka kontaktów - zajęcia 8
📌 Struktura danych - słownik
kontakty = {imie1:dane1, imie2;dane2, imie3:dane3}
📌 Import bibliotek:
- json - obsługa plików w formacie json. Umożliwia odczyt i zapisywanie danych.
- os - umożliwia dostęp do funkcjonalności systemu. Pozwala m.in. sprawdzać, czy pliki i katalogi istnieją.
if os.path.exists("kontakty.json"):
with open("kontakty.json", "r", encoding="utf8") as plik:
kontakty = json.load(plik)os.path.exist - funkcja sprawdza czy plik istnieje w katalogu, w którym uruchamiany jest program.
📁 Jeżeli istnieje to:
- otwierany jest w trybie odczytu - "r",
- encoding="utf8" używamy metody, żeby poprawnie obsłużyć polskie znaki,
- as plik - przypisujemy alias pliku,
- json.load(plik) - funkcja przypisana jako zmienna,
która wywołuje dane pliku jako słownik.
🆕 Jeżeli nie istnieje to:
- kontakty = {} - tworzy się pusty słownik kontaktów
📌 Aplikacja oparta o pętlę WHILE
aplikacja wykonuje się tak długo aż nie spełni się warunek operacji'6 - koniec'
import json
import os
if os.path.exists("kontakty.json"):
with open("kontakty.json", "r", encoding="utf8") as plik:
kontakty = json.load(plik)
else:
kontakty = {}
while True:
menu = """
Wybierz operację do wykoniania:
1 - dopisanie pozycji do ksiązki
2 - aktualizacja pozycji książki
3 - usunięcie pozycji książki
4 - wydruk imion z książki
5 - wydruk całej książki z kontaktami
6 - koniec
"""
print(menu)
kod_operacji = int(input("Wybierz kod operacji: "))
if kod_operacji == 1:
print("Wybrano dopisanie pozycji do książki")
nowy_kontak = input("Wpisz nazwę/imię dla nowej pozycji: ")
if nowy_kontak not in kontakty:
nowy_dane = input("Wpisz dane kontaktowe: ")
kontakty[nowy_kontak]= nowy_dane
print("Dodano kontakt")
else:
print("""
Kontakt o tym imieniu już istnieje.
Wybierz ponownie kod operacji.
""")
elif kod_operacji == 2:
print("Wybrano aktualizację pozycji książki")
nowy_kontak = input("Wpisz nazwę/imię do aktualizacji danych: ")
if nowy_kontak in kontakty:
aktualizacja_danych = input("Wpisz dane kontaktowe: ")
kontakty[nowy_kontak]= aktualizacja_danych
print("Kontakt został zaktualizowany")
else:
print("Nie ma kontaktu o tej nazwie/imieniu")
elif kod_operacji == 3:
print("Wybrano usunięcie pozycji z książki")
del_kontakt=input("Podaj nazwę/imie kotaktu, który chcesz usunąć: ")
if del_kontakt in kontakty:
kontakty.pop(del_kontakt)
print("Kontakt został usunięty")
else:
print("Nie ma takiego kontaktu.")
elif kod_operacji == 4:
print("Wybrano wydruk imion z książki")
for imiona in kontakty:
print(imiona, end=", ")
liczba_kontaktow = len(kontakty)
if liczba_kontaktow == 1:
odmiana = "kontakt"
elif 2 <= liczba_kontaktow % 10 <= 4 and not
(12 <= liczba_kontaktow % 100 <= 14):
koncowka = "kontakty"
else:
koncowka = "kontaktów"
print(f"Książka zawiera {liczba_kontaktow} {koncowka}")
elif kod_operacji == 5:
print ("Wybrano wydruk całej książki: ")
for imie, dane in kontakty.items():
print(f"{imie}: {dane}")
elif kod_operacji == 6:
print ("Wybrano zamknięcie programu: ")
while True:
pytanie = input("Czy chcesz zapisać zmiany?
Tak - T, Nie - N: ").strip().upper()
if pytanie in ("T", "N"):
break
print("Nieprawidłowa odpowiedź. Wpisz T albo N.")
if pytanie == "T":
with open("kontakty.json", "w", encoding="utf-8") as plik:
json.dump(
kontakty,
plik,
ensure_ascii=False,
sort_keys=True,
indent=4)
print("Zmiany zostały zapisane.")
else:
print("Zmiany nie zostały zapisane.")
break
💡 Operacja nr 4 Wydruk imion z książki
Wyświetla w jednej linii, oddzielając przecinkami wszystkie imiona z książki kontaktów, a na końcu podaje ile ich jest wraz z poprawną odmianą liczebnika.
💡 Operacja nr 6 Zamknięcie programu
Zastosowałam pętlę WHILE, która wymusza na użytkowniku wpisanie tylko
"T" - tak lub "N" - nie
Dodatkowo zastosowałam metody:
👉 .strip() aby usunąć spacje i linie z początku i końca.
👉 .upper() zamienia ciąg znaków na wielkie litery — więc t czy T traktowane są tak samo.
Następnie w pętli WHILE zagnieździłam warunek o wyborze poprawnej odpowiedzi
✅ jeżeli użytkownik wybrała "T" lub "N" przerywam pętlę.
❌ jeżeli użytkownik wybrał inną odpowiedź niż "T" lub "N", wyświetlam komunikat
print("Nieprawidłowa odpowiedź. Wpisz T albo N.") i wykonuje się ponownie początek pętli.