Cel zadania (~20 min)
Stwórz uniwersalny konwerter jednostek i walut. Program działa w trybie interaktywnym, oferując konwersje temperatury, długości, masy i walut. Zaimplementuj konwersję zbiorczą z użyciem map() i lambda, a także obsługę argumentów linii poleceń przez sys.argv.
Wymagania szczegółowe:
- Słownik
KONWERSJE przechowuje funkcje konwertujące jako lambda: np. "c_f": ("Celsjusz", "Fahrenheit", lambda c: c * 9/5 + 32).
- Funkcja
konwertuj(typ, wartosc) – wywołuje odpowiednią lambdę ze słownika.
- Funkcja
konwertuj_wiele(typ, wartosci) – używa map() do zbiorczej konwersji listy wartości.
- Menu z wyborem konwersji, obsługa trybu pojedynczej wartości i listy.
- Program wyświetla przykład użycia
map() i lambda do konwersji zbiorczej temperatury.
- Obsługa
sys.argv —help wyświetla instrukcję.
Wskazówki
lambda c: c * 9/5 + 32 to funkcja anonimowa. map(funkcja, lista) stosuje funkcję do każdego elementu listy. sys.argv[0] to nazwa skryptu, sys.argv[1:] to argumenty. list(map(lambda x: konwertuj(typ, x)[2], wartosci)) wykonuje konwersję zbiorczą.
import sys
KONWERSJE = {
"c_f": ("Celsjusz", "Fahrenheit", lambda c: c * 9/5 + 32),
"f_c": ("Fahrenheit", "Celsjusz", lambda f: (f-32) * 5/9),
"m_km": ("Metry", "Kilometry", lambda m: m / 1000),
"km_m": ("Kilometry", "Metry", lambda km: km * 1000),
"kg_g": ("Kilogramy", "Gramy", lambda kg: kg * 1000),
"g_kg": ("Gramy", "Kilogramy", lambda g: g / 1000),
"usd_pln": ("USD", "PLN", lambda usd: usd * 4.05),
"pln_usd": ("PLN", "USD", lambda pln: pln / 4.05),
"eur_pln": ("EUR", "PLN", lambda eur: eur * 4.35),
"pln_eur": ("PLN", "EUR", lambda pln: pln / 4.35),
}
def konwertuj(typ, wartosc):
z, na, func = KONWERSJE[typ]
return z, na, func(wartosc)
def konwertuj_wiele(typ, wartosci):
z, na, _ = konwertuj(typ, 0)
wyniki = list(map(lambda w: konwertuj(typ, w)[2], wartosci))
return z, na, wyniki
if "--help" in sys.argv:
print("Konwerter jednostek. Uzyj bez argumentow dla trybu "
"interaktywnego.")
sys.exit(0)
print("=== KONWERTER JEDNOSTEK ===")
print("\nDostepne konwersje:")
opcje = list(sorted(KONWERSJE.keys()))
for i, k in enumerate(opcje, 1):
z, na, _ = KONWERSJE[k]
print(f" {i}. {z} -> {na}")
wybor = int(input(f"\nWybierz (1-{len(opcje)}): ")) - 1
typ = opcje[wybor]
tryb = input("Tryb (1=poj, 2=lista): ")
if tryb == "2":
dane = input("Wartosci oddzielone spacjami: ")
w = list(map(float, dane.split()))
z, na, wyniki = konwertuj_wiele(typ, w)
print(f"\nKonwersja {z} -> {na}:")
for v, wynik in zip(w, wyniki):
print(f" {v} {z} = {wynik:.2f} {na}")
else:
w = float(input("Podaj wartosc: "))
z, na, wynik = konwertuj(typ, w)
print(f"{w} {z} = {wynik:.2f} {na}")
print("\n=== PRZYKLAD map() i lambda ===")
temp_c = [0, 10, 20, 30, 100]
temp_f = list(map(lambda c: c * 9/5 + 32, temp_c))
print(f"Celsjusze: {temp_c}")
print(f"Fahrenheity: {temp_f}")
PRZYKLADOWY EKRAN WYNIKOWY:
=== KONWERTER JEDNOSTEK ===
Dostepne konwersje:
1. Celsjusz -> Fahrenheit
2. EUR -> PLN
3. Fahrenheit -> Celsjusz
4. Gramy -> Kilogramy
5. Kilogramy -> Gramy
6. Kilometry -> Metry
7. Metry -> Kilometry
8. PLN -> EUR
9. PLN -> USD
10. USD -> PLN
Wybierz (1-10): 1
Tryb (1=poj, 2=lista): 1
Podaj wartosc: 25
25.0 Celsjusz = 77.00 Fahrenheit
=== PRZYKLAD map() i lambda ===
Celsjusze: [0, 10, 20, 30, 100]
Fahrenheity: [32.0, 50.0, 68.0, 86.0, 212.0]