.:: 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.





-- back