universitatea babeŞ facultatea de matematică şi...

24
FUNDAMENTELE PROGRAMĂRII Laura Dioşan Excepții și tipuri definite de utilizator UNIVERSITATEA BABEŞ-BOLYAI Facultatea de Matematică şi Informatică

Upload: phungphuc

Post on 02-Aug-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

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

Recapitulare

Excepții

TAD

Octombrie, 2013 Fundamentele programării - Exceptii si TAD 21

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