.:: KURS PROGRAMOWANIA W JĘZYKU PYTHON ::.
- Opis problemu
Spróbujemy teraz napisać program służący do obsługi prostej bazy danych. Będzie to baza ewidencji towarów w sklepie z narzędziami. Program obsługujący bazę powinien udostępniać poniższe funkcje:
- dostawa towaru
- sprzedaż towaru
- stan zapasów
- Projekt bazy danych
Podstawowym elementem bazy danych będzie lista towarów (narzędzi) dostępnych w magazynie. Dla każdego towaru będą pamiętane następujące dane:
- Numer identyfikacyjny
- Nazwa towaru
- Ilość (dostępna w magazynie)
- Cena sprzedaży netto (zakładamy, że wszystkie narzędzia podlegają pod stawkę VAT 22%)
- Definicja klas
Uruchommy Pythona.
Aby przejść do edycji nowego programu należy z menu File wybrać polecenie New Window. Otworzy się nowe okno, przeznaczone do edycji programu. Wybierzmy z menu File polecenie Save As. Wybieramy folder Moje dokumenty, następnie wpisujemy nazwę narzedzia.py.
# sklep z narzedziami
class Narzedzie:
id_t = 0 # Numer identyfikacyjny
nazwa = "" # Nazwa towaru
ilosc = 0 # Ilość (dostępna w magazynie)
cena_s = 0.0 # Cena sprzedaży netto
class Narzedzia:
ile = 0 # ile narzedzi na liscie
narzedzia = [] # lista narzedzi
Wciśnijmy teraz F5, aby klasy zostały zdefiniowane. Następnie wypróbujmy je wpisując:
>>> ================================ RESTART =============================
>>>
>>> n=Narzedzia()
Brak sygnału o błędzie wskazuje na to, ze klasy zostały poprawnie zdefiniowane.
- Wyświetlanie stanu magazynu
Wróćmy do edycji programu. Dopiszmy do klasy Narzedzia funkcję stan:
class Narzedzia:
ile = 0 # ile narzedzi na liscie
narzedzia = [] # lista narzedzi
def stan(self):
print "="*30
print " "*10+"Stan magazynu"
print "="*30
print
print "%-4s %-14s %-5s %-8s %-8s" % ('Kod',' Nazwa','Ilosc','C.netto','C.brutto')
for n in self.narzedzia:
print "%4d %15s %4d %8.2f %8.2f" % (n.id_t,n.nazwa,n.ilosc,n.cena_s,n.cena_s*1.22)
Funkcja stan nie jest funkcją globalną, lecz elementem klasy Narzędzia. Odwoływać się będziemy do niej w postaci: obiekt_klasy_Narzedzia.stan( ) a nie po prostu stan( ). Zmienna self oznacza, wewnątrz definicji funkcji w klasie, obiekt należący do tej klasy. Wszystkie dane przechowywane wewnątrz klasy (w tym przypadku ile i narzędzia) dostępne są po przedrostku self (np.: self.narzedzia) – bez tego przedrostka chodziłoby o zmienne globalne (zdefiniowane poza klasą) o takiej samej nazwie.
Wciśnijmy teraz F5, aby klasy zostały zdefiniowane. Następnie wypróbujmy je wpisując:
>>> ================================ RESTART =============================
>>>
>>> n=Narzedzia()
>>> n.stan()
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
>>>
Na liście nic się nie pojawiło, gdyż nie przyjęliśmy wcześniej żadnego towaru.
- Dostawa towaru
Wróćmy do edycji programu. Dopiszmy do klasy Narzedzia funkcję dostawa:
class Narzedzia:
ile = 0 # ile narzedzi na liscie
narzedzia = [] # lista narzedzi
def stan(self):
print "="*30
print " "*10+"Stan magazynu"
print "="*30
print
print "%-4s %-14s %-6s %-8s %-8s" % ('Kod',' Nazwa','Ilosc','C.netto','C.brutto')
for n in self.narzedzia:
print "%4d %15s %5d %8.2f %8.2f" % (n.id_t,n.nazwa,n.ilosc,n.cena_s,n.cena_s*1.22)
def dostawa(self):
print "="*30
print " "*10+"Dostawa towaru"
print "="*30
print
while True:
id_t=raw_input("Podaj numer identyfikacyjny towaru (ENTER-zakończ):")
if id_t=='': break;
id_t=int(id_t)
for n in self.narzedzia:
if n.id_t == id_t:
print "Towar o podanym numerze to",n.nazwa
ilosc=input("Podaj wielkosc dostawy (w sztukach):")
n.ilosc+=ilosc
break
else:
nazwa=raw_input("Podaj nazwę towaru:")
ilosc=input("Podaj wielkosc dostawy (w sztukach):")
cena_s=float(raw_input("Podaj cenę sprzedaży towaru:"))
self.narzedzia.append(Narzedzie())
self.narzedzia[self.ile].id_t=id_t
self.narzedzia[self.ile].nazwa=nazwa
self.narzedzia[self.ile].ilosc=ilosc
self.narzedzia[self.ile].cena_s=cena_s
self.ile+=1
print
Wciśnijmy teraz F5, aby klasy zostały zdefiniowane. Następnie wypróbujmy je wpisując:
>>> ================================ RESTART =============================
>>>
>>> n=Narzedzia()
Aby wypróbować dostawę piszemy:
>>> n.dostawa()
==============================
Dostawa towaru
==============================
Podaj numer identyfikacyjny towaru (ENTER-zakończ):3
Podaj nazwę towaru:Młotek
Podaj wielkosc dostawy (w sztukach):5
Podaj cenę sprzedaży towaru:4.99
Podaj numer identyfikacyjny towaru (ENTER-zakończ):7
Podaj nazwę towaru:Wkrętak
Podaj wielkosc dostawy (w sztukach):10
Podaj cenę sprzedaży towaru:3
Podaj numer identyfikacyjny towaru (ENTER-zakończ):
Aby sprawdzić bieżący stan piszemy:
>>> n.stan()
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
3 Młotek 5 4.99 6.09
7 Wkrętak 10 3.00 3.66
>>>
Ponowna dostawa:
>>> n.dostawa()
==============================
Dostawa towaru
==============================
Podaj numer identyfikacyjny towaru (ENTER-zakończ):3
Towar o podanym numerze to Młotek
Podaj wielkosc dostawy (w sztukach):5
Podaj numer identyfikacyjny towaru (ENTER-zakończ):
Aby sprawdzić bieżący stan piszemy:
>>> n.stan()
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
3 Młotek 10 4.99 6.09
7 Wkrętak 10 3.00 3.66
- Sprzedaż towaru
Wróćmy do edycji programu. Dopiszmy do klasy Narzedzia funkcję sprzedaz:
class Narzedzia:
ile = 0 # ile narzedzi na liscie
narzedzia = [] # lista narzedzi
def stan(self):
print "="*30
print " "*10+"Stan magazynu"
print "="*30
print
print "%-4s %-14s %6s %8s %8s" % ('Kod',' Nazwa','Ilosc','C.netto','C.brutto')
for n in self.narzedzia:
print "%4d %15s %5d %8.2f %8.2f" % (n.id_t,n.nazwa,n.ilosc,n.cena_s,n.cena_s*1.22)
def dostawa(self):
print "="*30
print " "*10+"Dostawa towaru"
print "="*30
print
while True:
id_t=raw_input("Podaj numer identyfikacyjny towaru (ENTER-zakończ):")
if id_t=='': break;
id_t=int(id_t)
for n in self.narzedzia:
if n.id_t == id_t:
print "Towar o podanym numerze to",n.nazwa
ilosc=input("Podaj wielkosc dostawy (w sztukach):")
n.ilosc+=ilosc
break
else:
nazwa=raw_input("Podaj nazwę towaru:")
ilosc=input("Podaj wielkosc dostawy (w sztukach):")
cena_s=float(raw_input("Podaj cenę sprzedaży towaru:"))
self.narzedzia.append(Narzedzie())
self.narzedzia[self.ile].id_t=id_t
self.narzedzia[self.ile].nazwa=nazwa
self.narzedzia[self.ile].ilosc=ilosc
self.narzedzia[self.ile].cena_s=cena_s
self.ile+=1
print
def sprzedaz(self):
print "="*30
print " "*10+"Sprzedaż towaru"
print "="*30
print
while True:
id_t=raw_input("Podaj numer identyfikacyjny towaru (ENTER-zakończ):")
if id_t=='': break;
id_t=int(id_t)
for n in self.narzedzia:
if n.id_t == id_t:
print "Towar o podanym numerze to",n.nazwa
ilosc=input("Podaj sprzedawaną ilość (w sztukach):")
if ilosc > n.ilosc:
print "Ilość przekracza stan!"
else:
n.ilosc-=ilosc
break
else:
print "Podany numer identyfikacyjny nie istnieje!"
Wciśnijmy teraz F5, aby klasy zostały zdefiniowane. Następnie wypróbujmy je wpisując:
>>> ================================ RESTART =============================
>>>
>>> n=Narzedzia()
>>> n.stan()
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
>>>
Na liście znowu nic nie ma, gdyż tworząc od nowa obiekt n straciliśmy wprowadzone wcześniej dane:
>>> n.dostawa()
==============================
Dostawa towaru
==============================
Podaj numer identyfikacyjny towaru (ENTER-zakończ):1
Podaj nazwę towaru:Miotła
Podaj wielkosc dostawy (w sztukach):3
Podaj cenę sprzedaży towaru:7.2
Podaj numer identyfikacyjny towaru (ENTER-zakończ):
Wypróbujmy sprzedaż:
>>> n.sprzedaz()
==============================
Sprzedaż towaru
==============================
Podaj numer identyfikacyjny towaru (ENTER-zakończ):1
Towar o podanym numerze to Miotła
Podaj sprzedawaną ilość (w sztukach):1
Podaj numer identyfikacyjny towaru (ENTER-zakończ):1
Towar o podanym numerze to Miotła
Podaj sprzedawaną ilość (w sztukach):5
Ilość przekracza stan!
Podaj numer identyfikacyjny towaru (ENTER-zakończ):2
Podany numer identyfikacyjny nie istnieje!
Podaj numer identyfikacyjny towaru (ENTER-zakończ):
>>> n.stan()
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
1 Miotła 2 7.20 8.78
>>>
- Zapis danych w pliku
Aby uniknąć każdorazowego wprowadzania danych do bazy od nowa, będziemy przechowywać je w pliku dyskowym "narzedzia.txt". Wróćmy do edycji programu. Dopiszmy do klasy Narzedzia funkcję zapisz:
def zapisz(self):
f1 = open("narzedzia.txt","w")
f1.write(str(self.ile))
f1.write("\n")
for n in self.narzedzia:
f1.write(str(n.id_t))
f1.write("\n")
f1.write(n.nazwa)
f1.write("\n")
f1.write(str(n.ilosc))
f1.write("\n")
f1.write(str(n.cena_s))
f1.write("\n")
f1.close()
Wciśnijmy teraz F5, aby klasy zostały zdefiniowane. Następnie wypełnijmy bazę kilkoma wpisami:
>>> n=Narzedzia()
>>> n.dostawa()
==============================
Dostawa towaru
==============================
Podaj numer identyfikacyjny towaru (ENTER-zakończ):1
Podaj nazwę towaru:Młotek
Podaj wielkosc dostawy (w sztukach):5
Podaj cenę sprzedaży towaru:5
Podaj numer identyfikacyjny towaru (ENTER-zakończ):2
Podaj nazwę towaru:Wkrętak
Podaj wielkosc dostawy (w sztukach):10
Podaj cenę sprzedaży towaru:3
Podaj numer identyfikacyjny towaru (ENTER-zakończ):
I zapiszmy je na dysku:
>>> n.zapisz()
Możemy otworzyć plik "narzedzia.txt" w notatniku:
2
1
Młotek
5
5.0
2
Wkrętak
10
3.0
- Wczytanie danych
Wróćmy do edycji programu. Dopiszmy do klasy Narzedzia funkcję wczytaj:
def wczytaj(self):
f1 = open("narzedzia.txt","r")
s = f1.readline()
s = s[:-1] # odrzucamy znak konca linii
self.ile = int(s)
for i in range (0,self.ile):
self.narzedzia.append(Narzedzie())
s = f1.readline()
s = s[:-1] # odrzucamy znak konca linii
self.narzedzia[i].id_t=int(s)
s = f1.readline()
s = s[:-1] # odrzucamy znak konca linii
self.narzedzia[i].nazwa=s
s = f1.readline()
s = s[:-1] # odrzucamy znak konca linii
self.narzedzia[i].ilosc=int(s)
s = f1.readline()
s = s[:-1] # odrzucamy znak konca linii
self.narzedzia[i].cena_s=float(s)
f1.close()
Wciśnijmy teraz F5, aby klasy zostały zdefiniowane. Następnie wczytajmy bazę z pliku:
>>> n=Narzedzia()
>>> n.wczytaj()
I sprawdźmy, że dane zostały wczytane:
>>> n.stan()
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
1 Młotek 5 5.00 6.10
2 Wkrętak 10 3.00 3.66
>>>
- Menu główne
Wróćmy do edycji programu. Poniżej definicji klasy Narzedzia napiszemy program główny:
n=Narzedzia()
n.wczytaj()
while True:
print
n.stan()
print "-"*60
print "Menu główne: [D] - Dostawa [S] - Sprzedaż [W] - Wyjście"
print "-"*60
print
c = raw_input()
if c == 'w':
break
elif c == 'd':
n.dostawa()
elif c == 's':
n.sprzedaz()
n.zapisz()
Wypróbujmy (F5):
>>> ================================ RESTART ================================
>>>
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
1 Młotek 5 5.00 6.10
2 Wkrętak 10 3.00 3.66
------------------------------------------------------------
Menu główne: [D] - Dostawa [S] - Sprzedaż [W] - Wyjście
------------------------------------------------------------
d
==============================
Dostawa towaru
==============================
Podaj numer identyfikacyjny towaru (ENTER-zakończ):1
Towar o podanym numerze to Młotek
Podaj wielkosc dostawy (w sztukach):3
Podaj numer identyfikacyjny towaru (ENTER-zakończ):3
Podaj nazwę towaru:Wiertarka
Podaj wielkosc dostawy (w sztukach):1
Podaj cenę sprzedaży towaru:180
Podaj numer identyfikacyjny towaru (ENTER-zakończ):
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
1 Młotek 8 5.00 6.10
2 Wkrętak 10 3.00 3.66
3 Wiertarka 1 180.00 219.60
------------------------------------------------------------
Menu główne: [D] - Dostawa [S] - Sprzedaż [W] - Wyjście
------------------------------------------------------------
s
==============================
Sprzedaż towaru
==============================
Podaj numer identyfikacyjny towaru (ENTER-zakończ):2
Towar o podanym numerze to Wkrętak
Podaj sprzedawaną ilość (w sztukach):1
Podaj numer identyfikacyjny towaru (ENTER-zakończ):
==============================
Stan magazynu
==============================
Kod Nazwa Ilosc C.netto C.brutto
1 Młotek 8 5.00 6.10
2 Wkrętak 9 3.00 3.66
3 Wiertarka 1 180.00 219.60
------------------------------------------------------------
Menu główne: [D] - Dostawa [S] - Sprzedaż [W] - Wyjście
------------------------------------------------------------
w
>>>
- Ćwiczenia kontrolne
I. Dodaj do klasy Narzedzie pole cena_z oznaczające cenę zakupu danego towaru.
II. Dodaj do klasy Narzedzia pole kasa. Będzie to aktualny stan kasy. Zmodyfikuj program tak, by stan zmieniał się przy każdej dostawie (o iloczyn ilości i ceny zakupu) i sprzedaży (o iloczyn ilości i ceny sprzedaży).
III. Dodaj możliwość modyfikacji danych (nazwy, kodu, ilości, cen) dowolnego towaru.
IV. Dodaj możliwość posortowania towarów na liście według: kodu, nazwy, lub ceny sprzedaży.