Upload
phungphuc
View
213
Download
0
Embed Size (px)
Citation preview
FUNDAMENTELE
PROGRAMĂRII
Laura Dioşan
Excepții
și
tipuri definite de utilizator
UNIVERSITATEA BABEŞ-BOLYAI
Facultatea de Matematică şi Informatică
Conținut curs Introducere în procesul de dezvoltare software Programare procedurală Programare modulară Tipuri definite de utilizator Principii de dezvoltare a softului Testarea și inspectarea programelor Recursivitate Complexitatea algoritmilor Metode prin divizare Backtracking Algoritmi de căutare Algoritmi de sortare Recapitulare
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 2
Sumar
Excepții
Concept
Mecanism
Exemple
Tipuri de date definite de utilizator sau tipuri abstracte de date (TAD)
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 3
Excepții Concept
Sunt aruncate când, în timpul execuției unei aplicații, sunt detectate erori
Pot întrerupe execuția normală a unui bloc de cod
Mecanism
Identificarea și aruncarea lor de către
interpretorul Python
codul Python pentru a indica situații speciale
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 4
d = 0 print (5 / d) x = d * 10 Traceback (most recent call last): File "...\app.py", line 12, in <module> print(5 / d) ZeroDivisionError: division by zero
def gcd_v2(a, b): if (a == 0): if (b == 0): raise ValueError("one number must be != 0") else: return b # a == 0, b != 0 else: if (b == 0): # a != 0, b == 0 return a else: # a != 0, b != 0 while (a != b): if (a > b): a = a - b else: b = b - a return a # a == b
Excepții
Mecanism
Prinderea excepțiilor aruncate de interpretorul Python
instrucțiunea try...except
clauza finally – pt instrucțiuni care se execută în toate cazurile
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 5
try: d = 0 print (5 / d) x = d * 10 except ZeroDivisionError: print("division by zero error...") finally: print("all cases...") ---------------- division by zero error... all cases...
x = int(input("first no = ")) y = int(input("second no = ")) try: div = gcd_v2(x,y) print("gcd of ", x, " and ", y, " is ", div) except ValueError as ex: print("exceptinal case: ", ex) finally: print("do you want to try again?")
try: #code that may raise exceptions except ValueError: #code that handle the error finally: #code that is executed in all the cases
Excepții
Exemplu
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 6
x = int(input("first no = ")) y = int(input("second no = ")) try: div = gcd_v2(x,y) print("gcd of ", x, " and ", y, " is ", div) except ValueError as ex: print("exceptinal case: ", ex) finally: print("do you want to try again?")
def gcd_v2(a, b): if (a == 0): if (b == 0): raise ValueError("one number must be != 0") else: return b # a == 0, b != 0 else: if (b == 0): # a != 0, b == 0 return a else: # a != 0, b != 0 while (a != b): if (a > b): a = a - b else: b = b - a return a # a == b
def test_gcd_v2(): assert gcd_v2(0, 2) == 2 assert gcd_v2(2, 0) == 2 assert gcd_v2(3, 2) == 1 assert gcd_v2(6, 2) == 2 assert gcd_v2(4, 6) == 2 assert gcd_v2(24, 9) == 3 try: gcd_v2(0, 0) assert False except ValueError: assert True try: gcd_v2(0, -2) assert False except ValueError: assert True try: gcd_v2(-2, 2) assert False except ValueError: assert True
Tipuri definite de utilizator
Programare orientată obiect
Concepte
Principii de lucru
TAD
Concept
Definire și utilizare în Python
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 7
Tipuri definite de utilizator
Programarea orientată obiect
Dezvoltarea proiectării sistemelor care presupune utilizarea:
obiectelor – unităţi de bază, fiecare obiect fiind o instanţă a unei clase
clase – relaţionate prin relaţii de compoziţie şi moştenire
Octombrie, 2013 8 Fundamentele programării - Exceptii si TAD
Tipuri definite de utilizator POO – concepte de bază
clasă defineşte în mod abstract caracteristicile unui lucru:
caracteristici (atribute, câmpuri, proprietăţi)
comportament (metode, operaţii, trăsături)
implementarea unui TAD
obiect instanţă (obiectul actual creat în timpul rulării) a unei clase
variabilă de tip clasă
metodă modalitate de comunicare între obiecte
toate metodele formează interfaţa unui obiect
Octombrie, 2013 9 Fundamentele programării - Exceptii si TAD
Tipuri definite de utilizator
POO – caracteristici
încapsulare
capacitatea de a comprima datele cu operaţiile
ascunderea implementării controlul accesului
moştenire
Reutilizarea codului (folosirea şi îmbunăţirea codului unei clase)
polimorfism
Permite un comportament adaptat contextului
Octombrie, 2013 10 Fundamentele programării - Exceptii si TAD
Octombrie, 2013
Tipuri definite de utilizator
TAD
Exportarea unui nume (unui tip de date)
Definirea unui domeniu de valori pentru date
Definirea unei interfaţe (operaţiile TAD-ului)
Restricţionarea accesului la componentele TAD-ului (acces doar prin intermediul operaţiilor)
Ascunderea implementării unui TAD
11 Fundamentele programării - Exceptii si TAD
Octombrie, 2013
Tipuri definite de utilizator
TAD – exemplu Număr rațional
Nume:
Rațional
Domeniu:
{(a,b), a,b Z, b <> 0, cmmdc(a,b) = 1}
Operații:
Inițializare
Acces la componente (numărător, numitor)
Copiere
Comparare
Adunare/scădere/înmulțire/împărțire/etc.
...
12 Fundamentele programării - Exceptii si TAD
Octombrie, 2013
Tipuri definite de utilizator
TAD – exemplu Floare
Nume:
Floare
Domeniu:
{(denumire, înălțime, tip), denumire, tip – string, înălțime N}
Operații:
Inițializare
Acces la componente (denumire, înălțime, tip)
Copiere
Comparare
...
13 Fundamentele programării - Exceptii si TAD
Octombrie, 2013
Tipuri definite de utilizator TAD în Python – clase
Clasă
Descrie obiecte care respectă acceași specificație și care au aceleași caracteristici
Atribute – datele efective
Metode – operațiile efectuate asupra datelor
Definire
Instrucțiunile dintr-o clasă pot fi:
Funcții
Alt tip de instrucțiuni
14 Fundamentele programării - Exceptii si TAD
class ClassName: #statement1 #... #statement n
class Rational: ''' A rational number is composed by 2 numbers: numerator and denominator > 0 denominator <> 0, gcd(numerator, denominator) == 1 ''' def __init__(self, num, denom): ''' creates a new instance of Rational ''' self.numerator = num self.denominator = denom
Octombrie, 2013
Tipuri definite de utilizator
TAD în Python – clase
Obiect
O instanță a unei clase
Când se creează o variabilă obiect trebuie precizat tipul acelui obiect (eg. Rational)
15 Fundamentele programării - Exceptii si TAD
class Rational: ''' A rational number is composed by 2 numbers: numerator and denominator > 0 denominator <> 0, gcd(numerator, denominator) == 1 ''' def __init__(self, num, denom): ''' creates a new instance of Rational ''' self.numerator = num self.denominator = denom .... r1 = Rational(2,3)
Octombrie, 2013
Tipuri definite de utilizator TAD în Python – clase
Observații
Definirea unei clase implică crearea unui nou spațiu de nume (folosit ca scop local variabilele locale și funcțiile definite în clasă vor aparține acestui spațiu de nume)
Fiecare obiect (ca instanță a unei clase) are propriul spațiu de nume / tabelă de simboluri care conține toate atributele și funcțiile obiectului
Pentru inițializarea unui obiect clasa poate avea o metodă __init__ care:
este apelată automat atunci când se creează un obiect nou
trebuie să aibă cel puțin un parametru (self) care referă obiectul creat
poate avea și alți parametri (numerator, denominator)
Pot avea valori implicite
16 Fundamentele programării - Exceptii si TAD
class Rational: ''' A rational number is composed by 2 numbers: numerator and denominator > 0 denominator <> 0, gcd(numerator, denominator) == 1 ''' def __init__(self, num = 0, denom = 1): ''' creates a new instance of Rational ''' self.numerator = num self.denominator = denom
r1 = Rational(2,3) #r1 = 2/3 r2 = Rational(3) #r2 = 3/1 r3 = Rational() #r3 = 0/1
Octombrie, 2013
Tipuri definite de utilizator TAD în Python – clase
Metode Funcții definite în interiorul claselor care pot accesa datele (valorile, atributele) clasei
Orice metodă are ca prim parametru instanța curentă (obiectul curent) – self
Metodele pot avea și alți parametri (fără sau cu valori implicite)
Metodele se apelează prin numeObiect.numeMetodă(listaParametri)
Obs.: la apel nu se trece si parametrul self, ci doar ceilalți (dacă există)
17 Fundamentele programării - Exceptii si TAD
class Rational: #A rational number is composed by 2 numbers: #numerator and denominator > 0, denominator <> 0, #gcd(numerator, denominator) == 1 def __init__(self, num = 0, denom = 1): #creates a new instance of Rational self.numerator = num self.denominator = denom def getNumerator(self): # getter method # return the numerator of the rational number return self.numerator def getDenominator(self): #getter method #return the denominator of the rational number return self.denominator
def test_create(): r1 = Rational(2,3) assert r1.getDenominator() == 2 assert r1.getNumerator() == 3 r2 = Rational(5,4) assert r2.getDenominator() == 5 assert r2.getNumerator() == 4
r1 = Rational(2,3) #r1 = 2/3 print("r1 = ", r1.getNumerator(), "/", r1.getDenominator()) #r1 = 2/3
Octombrie, 2013
Tipuri definite de utilizator TAD în Python – clase
Metode Funcții definite în interiorul claselor care pot accesa datele (valorile, atributele) clasei
Orice metodă are ca prim parametru instanța curentă (obiectul curent) – self
Metodele pot avea și alți parametri (fără sau cu valori implicite)
Metodele se apelează prin numeObiect.numeMetodă(listaParametri)
Obs.: la apel nu se trece si parametrul self, ci doar ceilalți (dacă există)
18 Fundamentele programării - Exceptii si TAD
from utils import gcd class Rational: ... def __init__(self, num = 0, denom = 1): ... def getNumerator(self): ... def getDenominator(self): ... def add(self, other): ''' add two rational numbers (self + other) return a new rational number self=self+other ''' a=self.numerator*other.numerator+self.denominator*other.denominator b = self.denominator * other.denominator d = gcd(a, b) self.numerator = a // d self.denominator = b // d
def test_add(): r1 = Rational(2,3) r2 = Rational(5,4) r3 = r1.add(r2) assert r3.getNumerator() == 23 and r3.getDenominator() == 12
Octombrie, 2013
Tipuri definite de utilizator TAD în Python – clase
Metode speciale Conversie la string – utilă pentru afișări
Comparare ==
19 Fundamentele programării - Exceptii si TAD
from utils import gcd class Rational: ... def __str__(self): ''' provides a string representation of a rational number return a string ''' return str(self.numerator) + "/" + str(self.denominator) def __eq__(self, other): ''' compares 2 rational numbers: self and other return True, if self == other False, otherwise ''' if ((self.numerator == other.numerator) and (self.denominator == other.denominator)): return True else: return False
def test_str(): r1 = Rational(2,3) assert r1.__str__() == "2/3" def test_eq(): r1 = Rational(2,3) r2 = Rational(2,3) assert r1 == r2 r3 = Rational(5,3) assert r1 != r3
Octombrie, 2013
Tipuri definite de utilizator TAD în Python – clase
Metode Respectarea specificațiilor
20 Fundamentele programării - Exceptii si TAD
class Rational: ''' A rational number is composed by 2 numbers: numerator and denominator, denominator <> 0, gcd(numerator, denominator) == 1 ''‘ def __init__(self, num = 0, denom = 1): ''' creates a new instance of Rational ''' if (denom == 0): raise ValueError("0 denominator not allowed") if (num < 0) or (denom < 0): raise ValueError("numerator and denominator must be positive numbers") d = gcd(num, denom) self.numerator = num // d self.denominator = denom // d def getNumerator(self): . . . def getDenominator(self): . . .
def test_create(): r1 = Rational(2,3) assert r1.getNumerator()==3andr1.getDenominator()==2 r2 = Rational(5,4) assert r2.getNumerator()==4andr2.getDenominator()==5 r3 = Rational(25, 15) assert r3.getNumerator()==5andr3.getDenominator()==3 try: r4 = Rational(2, 0) assert False except ValueError as er: print("something goes wrong...", er) assert True try: r5 = Rational(2, -3) assert False except ValueError as er: print("something goes wrong...", er) assert True try: r6 = Rational(-2, 3) assert False except ValueError as er: print("something goes wrong...", er) assert True try: r7 = Rational(-2, -3) assert False except ValueError as er: print("something goes wrong...", er) assert True
Cursul următor
Principii de dezvoltare a softului
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 22
Materiale de citit şi legături utile
1. Limbajul Python http://docs.python.org/3/reference/index.html
2. Biblioteca standard Python http://docs.python.org/3/library/index.html
3. Tutorial Python http://docs.python.org/3/tutorial/index.html
4. Frentiu, M., H.F. Pop, Fundamentals of Programming, Cluj University Press, 2006, 220 pagini
5. Kent Beck.Test Driven Development: By Example. Addison-Wesley Longman, 2002 http://en.wikipedia.org/wiki/Test-driven_development
6. Martin Fowler. Refactoring. Improving the Design of Existing Code. Addison-Wesley, 1999 http://refactoring.com/catalog/index.html
Octombrie, 2013 Fundamentele programării - Exceptii si TAD 23
Informaţiile prezentate au fost colectate din diferite surse de pe internet, precum şi din cursurile de Fundamentele Programării ţinute în anii anteriori de către:
Lect. Dr. Adriana Guran – www.cs.ubbcluj.ro/~adriana
Lect. Dr. Istvan Czibula - www.cs.ubbcluj.ro/~istvanc
Lect. Dr. Andreea Vescan -www.cs.ubbcluj.ro/~avescan
Lect. Dr. Ioan Lazăr -www.cs.ubbcluj.ro/~ilazar
Octombrie, 2013 24 Fundamentele programării - Exceptii si TAD