Sunteți pe pagina 1din 27

Fundamentele programrii

Conf. Dr. CZIBULA Istvan


Lect. Dr. Mihoc Tudor
Asist. RUS Adela
Asist. Mircea Ioan Gabriel
Asist. IONESCU Vlad

Orar
Curs: 2 ore/sapt
Seminar: 2 ore/sapt
Laborator: 2 ore/sapt

Pagina WEB
http://cs.ubbcluj.ro/~istvanc/fp
Email: istvanc@cs.ubbcluj.ro
Trimitei emailuri doar de la adrese ubbcluj.ro.

Obiective

Cunoaterea conceptelor fundamentale programrii

Introducere concepte de baz legate de ingineria software (design,


arhitectur, implementare i ntreinere)

nelegerea instrumentelor software folosite n dezvoltarea de aplicaii

nvtarea limbajului Python i utilizarea lui pentru implementarea,


testarea, rularea, depanarea de programe.

nsuirea/nbuntirea stilului de programare.

Coninut
1. Introduere n procesul de dezvoltare software
2. Programare procedural
3. Programare modular
4. Tipuri definite de utilizator - Object based programming
5. Principii de dezvoltare Arhitectur stratificat
6. Principii de dezvoltare abloane GRASP, diagrame UML
7. Testarea i inspectarea programelor
8. Recursivitate
9. Complexitatea algoritmilor
10. Algoritmi de cutare
11. Algoritmi de sortare
12. Backtracking
13. Greedy, Programare dinamica
14. Recapitulare

Evaluare
Lab (30%)
semestrului.
T
(30%)
E
(40%)

- o not pe activitatea de laborator din timpul


- examen practic (n sesiune)
- examen scris (n sesiune)

Pentru promovare trebuie s avei cel puin nota 5 la toate


(Lab,T,E >= 5)
Toate activiile sunt obligatorii
Dac nu opinei nota 5 la laborator nu putei intra in examen in
sesiunea normal.
Restane
n sesiunea de restane putei preda laboratoare dar nota maxim este
5.
Se poate re-susine examenul practic
Se poate re-susine examenul scris

Curs 1. Procesul de dezvoltare software


Ce este programarea
Elemente de baz al limbajului Python
Proces de dezvoltare bazat pe funcionaliti

Ce este programarea
Hardware / software
Hardware - computere(desktop,laptop, etc) i alte dispozitive (mobile, atm,
etc)
Software - programe sau sisteme ce ruleaz pe hardware
Limbaj de programare Notaii i reguli pentru scrierea de programe
(sintax i semantic)
Python: Limbaj de programare de nivel nalt (high level programming
language).
Interpretor Python: un program care permite rularea/interpretarea
programelor scrise in limbajul Python.
Biblioteci Python: Funcii, module, tipuri de date disponibile n Python,
scrise de ali programatori

Program 1 - Hello world


print (Hello world)

Python
Download: python.org - versiunea 3.5
Dupa instalare:
interpretor python executa programe scrise in python
IDLE Python un mic mediu de dezvoltare pentru python
Autor principal limbaj (1989): Guido van Rossum
Rol curent: benevolent dictator for life (BDFL)
PEP Python Enhancement Proposal design document providing
information to the Python community, or describing a new feature for
Python or its processes or environment.
PEP 20 The Zen of Python cateva principii de baza
PEP 8 Style Guide for Python code
Documentatie: docs.python.org
https://docs.python.org/3/reference/index.html - core syntax&semantics
https://docs.python.org/3/library/index.html - standard library

Ce fac computerele

Stocheaz date

Memoria intern

Memoria extern (hard, stick, CD, etc)


Opereaz

procesor
Comunic

Prin tastatur, mouse, ecran

Conexiuni de tip reea

Informaii i date
Date - o colecie de simboluri stocate ntr-un computer (Ex. 123 decimal
sau irul de caractere abc) sunt stochate folosind reprezentarea binara
Informaii - interpretarea unor date (Ex. 123, abc)
Procesarea datelor i informaiilor

Dispozitivele de intrare transform informaiile n date (ex. 123


citit de la tastatur)

Datele sunt stocate n memorie (ex. 1111011 pentru numrul


123)

Dispozitivele de ieire produc informaii din date


Operaii de baz ale procesoarelor

n reprezentare binar

Operaii (and, or, not; add, etc)

Elemente de baz ale unui program Python


Program 2 - Adding two integers

# Reads two integers


a = input("Enter the
b = input("Enter the
c = int(a) + int(b)
print("The sum of ",

and prints the sum of them


first number: ")
second number: ")
a, " + ", b, " is ", c)

Elemente lexicale
Un program Python este alctuit din mai multe linii de cod
Comentarii
ncep cu # i in pn la sfritul liniei

ncep cu i in mai multe rnduri, pn la un nou

Identificatori: secvene de caractere (litere, cifre, _) care ncep cu o liter


sau cu _
Literali: notaii pentru valorile constante sau pentru tipuri definite de
utilizator

Modelul de date
Toate datele ntr-un program Python obiecte
Un obiect are :

o identitate adresa lui n memorie

un tip care determin operaiile posibile precum i valorile pe


care le poate lua obiectul

o valoare.
Odat creat, identitatea i tipul obiectului nu mai pot fi modificate.
Valoarea unor obiecte se poate modifica
Obiecte mutabile - se poate modifica
Obiecte ne-mutabile nu se poate modifica

Tipuri de date standard


Tipul de date definete domeniul de valori posibile i operaiile permise asupra
valorilor din domeniu.
Numerice Numerele sunt inmutabile odat create valoare nu se mai poate
schimba (operaiile creaz noi obiecte).

int (numere ntregi):

numerele ntregi (pozitive i negative), dimensiune limitat doar de


memoria disponibil

Operaii: +, -, *, /, //, **, % comparare:==,!=,<, > operaii pe bii: |, ^,


&, <<, >>, ~

Literali: 1, -3
bool (boolean):

Valorile True i False.

Operaii: and, or, not

Literali: False, True; 0, 1


float (numere reale):

numerele reale (dubl precizie)

Operations: +, -, *, / comparare:==,!=,<, >

Literals: 3.14

Tipuri de date standard


Secvene:
Mulimi finite i ordonate, indexate prin numere ne-negative.
Dac a este o secven atunci:

len(a) returnez numrul de elemente;

a[0], a[1], , a[len(a)-1] elementele lui a.


Examples: [1, a]

Stringuri:
este o secven inmutabil;
caractere Unicode .
Literali: abc, abc

Liste

secven mutabil
ex: [] sau [1, a, [1, 3]]

Liste
operaii:

creare [7, 9]

accesare valori,lungime (index, len), modificare valori (listele sunt mutabile),


verificare daca un element este in lista (2 in [1, 2, 'a'])

stergere inserare valori (append,insert,pop) del a[3]

slicing, liste eterogene

listele se pot folosi in for

lista ca stiv(append, pop)

folositi instructiunea help(list) pentru mai multe detalii despre operaii posibile

# create
a = [1, 2, 'a']
print (a)
x, y, z = a
print(x, y, z)

# slicing
print (a[:2])
b = a[:]
print (b)
b[1] = 5
print (b)
# indices: 0, 1, ..., len(a) 1
a[3:] = [7, 9]
print (a[0])
print(a)
print ('last element = ', a[len(a)-1]) a[:0] = [-1]
print(a)
# lists are mutable
a[0:2] = [-10, 10]
a[1] = 3
print(a)
print (a)
# lists as stacks
stack = [1, 2, 3]
stack.append(4)
print (stack)
print (stack.pop())
print (stack)

# nesting
c = [1, b, 9]
print (c)

#generate lists using range


l1 = range(10)
print (list(l1))
l2 = range(0,10)
print (list(l2))
l3 = range(0,10,2)
print (list(l3))
l4 = list(range(9,0,-1))
print (l4)

#list in a for loop


l = range(0,10)
for i in l:
print (i)

Tuple
Sunt secvene inmutabile. Conine elemente, indexat de la 0
Operations:

Crearea - packing (23, 32, 3)

eterogen

poate fi folosit in for

unpacking
# Tuples are immutable sequences
# A tuple consists of a number of
values separated by commas
# tuple packing
t = 12, 21, 'ab'
print(t[0])
# empty tuple (0 items)
empty = ()

# sequence unpacking
x, y, z = t
print (x, y, z)

# tuple with one item


singleton = (12,)
print (singleton)
print (len(singleton))
#tuple in a for
t = 1,2,3
for el in t:
print (el)

# Tuples may be nested


u = t, (23, 32)
print(u)

Dicionar
Un dicionar este o multime de perechi (cheie, valoare).
Cheile trebnuie sa fie imutabile.
Operations:

creare {} sau {'num': 1, 'denom': 2}

accesare valoare pe baza unei chei

adaugare/modificare pereche (cheie, valoare)

tergere pereche (cheie, valoare)

verificare dac cheia exist


#create a dictionary
a = {'num': 1, 'denom': 2}
print(a)

#set a value for a key


a['num'] = 3
print(a)
print(a['num'])

#get a value for a key


print(a['num'])
#delete a key value pair
del a['num']
print (a)

#check for a key


if 'denom' in a:
print('denom = ', a['denom'])
if 'num' in a:
print('num = ', a['num'])

Variables
Variabl:
nume
valoare
tip
domeniu
operaii
locaie de memorie

Variabl in Python:
nume
valoare
tip
domeniu
operaii
locaie de memorie

Introducerea unei variabile ntr-un program asignare


Expressi
O combinaie de valori, constante, variabile, operatori i funcii care sunt
interpretate conform regulilor de preceden, calculate i care produc o alt
valoare
Exemple:

numeric : 1 + 2

boolean: 1 < 2

string : 1 + 2
Funcii utile:
help(instructiune) - ajutor
id(x) identitatea obiectului
dir()
locals() / globals() - nume definite (variabile, funcii, module, etc)

Instruciuni
Operaiile de baz ale unui program. Un program este o secven de
instruciuni

Atribuire/Legare

Instructiunea =.

Atribuirea este folosit pentru a lega un nume de o variabil

Poate fi folosit i pentru a modifica un element dintr-o secvena


mutabil.

Legare de nume:

x = 1 #x is a variable (of type int)

Re-legare name:

x = x + 2 #a new value is assigned to x

Modificare secven:

y = [1, 2] #mutable sequence

y[0] = -1#the first item is bound to-1

Blocuri

Parte a unui program care este executat ca o unitate

Secven de instruciuni

Se realizeaz prin identarea liniilor (toate instruciunile identate


la acelai nivel aparin aceluiai bloc

Instruciuni - If, While


if conditie:
bloc de instructiuni
elif conditie:
bloc de instructiuni
else:
bloc de instructiuni
while conditie:
bloc de instructiuni
[break]
[continue]
def gcd(a, b):
"""
Return the greatest common divisor of two positive integers.
"""
if a == 0:
return b
if b == 0:
return a
while a != b:
if a > b:
a = a - b
else:
b = b - a
return a

print (gcd(7,15))

Instruciuni For
for variabila in lista:
bloc de instructiuni
[break]
[continue]
else:
bloc de instructiuni
#use a list literal
for i in [2,-6,"a",5]:
print (i)
#using a variable
x = [1,2,4,5]
for i in x:
print (i)
#using range
for i in range(10):
print (i)
for i in range(2,100,7):
print (i)
#using a string
s = "abcde"
for c in s:
print (c)

Cum se scriu programe


Roluri n ingineria software
Programator/Dezvoltator

Folosete calculatorul pentru a scrie/dezvolta aplicaii


Client (stakeholders):

Cel interesat/afectat de rezultatele unui proiect.


Utilizatori

Folosesc/ruleaz programul.
Un proces de dezvoltare software este o abordare sistematic pentru
construirea, instalarea, ntreinerea produselor software. Indic:

Paii care trebuie efectuai.

Ordinea lor
Folosim la fundamentele programrii: un proces de dezvoltare
incremental bazat pe funcionaliti (simple feature-driven development
process)

Enun (problem statement)


Enunul este o descriere scurt a problemei de rezolvat.
Calculator - Problem statement
(client) are nevoie de un program care ajut elevii (users) sa
invee despre numere raionale.
Programul ar trebui sa permite elevilor s efectueze operaii aritmetice
cu numere raionale
Profesorul

Cerine (requirements)
Cerinele definesc n detaliu de ce este nevoie n program din perspectiva
clientului. Definete:

Ce dorete clientul

Ce trebuie inclus n sistemul informatic pentru a satisface


nevoile clientuli.
Reguli de elaborare a cerinelor:

Cerinele exprimate corect asigur dezvoltarea sistemului


conform ateptrilor clienilor. (Nu se rezolv probleme ce nu s-au
cerut)

Descriu lista de funcionaliti care trebuie oferite de sistem.

Funcionalitile trebuie s clarifice orice ambiguiti din enun.

Funcionalitate
O funcie a sistemului dorit de client
descrie datele rezultatele i partea sistemul care este afectat
este de dimensiuni mici, poate fi implementat ntr-un timp relativ scurt
se poate estima
exprimat n forma aciune rezultat obiect
Aciunea o funcie pe care aplicaia trebuie s o furnizeze
Rezultatul este obinut n urma execuiei funciei
Obiect o entitate n care aplicaia implementeaz funcia

Calculator List de Funcionaliti


F1. Adun un numr raional n calculator.
F2. Sterge calculator.
F3. Undo reface ultima operaie (utilizatorul poate repeta
aceast operaie).

Proces de dezvoltare incremental bazat pe funcionaliti


Se creaz lista de funcionalitai pe baza enunului

Se planific iteraiile (o interaie conine una/mai multe


funcionaliti)

Pentru fiecare funcionalitate din iteraie

Se face modelare scenarii de rulare

Se creaz o lista de tascuri (activiti)


Se implementeaz i testeaz fiecare activitate

Iteraie: O perioad de timp n cadrul creia se realizeaz o versiune


stabil i executabil a unui produs, mpreun cu documentaia suport
La terminarea iteraiei avem un program funcional care face ceva util
clientului
Examplu: plan de iteraii
Iteratio Planned features
n
I1

F1. Adun un numr raional n calculator.

I2

F2. Sterge calculator.

I3

F3. Undo reface ultima operaie (utilizatorul poate repeta


aceast operaie).

Modelare - Iteration modeling


La fiecare nceput de iteraie trebuie analizat funcionalitatea care urmeaza a fi
implementat.
Acest proces trebuie sa sigure nelegerea funcionalitii si sa rezulte un set de pai
mai mici (work item/task), activitai care conduc la realizarea funcionalitii
Fiecare activitate se poate implementa/testa independent

Iteraia 1 - Adun un numr raional n calculator.


Pentru programe mai simple putem folosi scenarii de rulare (tabelar) pentru a
nelege problema i modul n care funcionalitatea se manifest n program. Un
scenariu descrie interaciunea ntre utilizator i aplicaie.
Scenariu pentru funcionalitatea de adaugare numar raional
Utilizator
a

Program

Descriere

Tiprete totalul curent


Adun un numr raional

b 1/2
c

1/2

Adun un numr raional

d 2/3
e
f

5/6

Tiprete totalul curent


Adun un numr raional

h -6/6
i

Tiprete totalul curent


Adun un numr raional

1/6

Tiprete totalul curent

Tiprete totalul curent

List de activiti
Recomandri:

Definii o activitate pentru fiecare operaie care nu este


implementata deja (de aplicaie sa de limbajul Python), ex. T1, T2.

Definii o activitate pentru implementarea interaciunii programutilizator (User Interface), ex. T4.

Definii o activitate pentru a implementa operaiile necesare


pentru interaciune utilizator cu UI, ex. T3.

Determinai dependenele ntre activiti (ex. T4 --> T3 --> T2 ->T1, unde --> semnific faptul ca o activitate depinde de o alt
activitate).

Facei un mic plan de lucru (T1,T2,T3,T4)

T1

Determinare cel mai mare divizor comun (punctele g, I din scenariu)

T2

Sum dou numere raionale (c, e, g, i)

T3

Implementare calculator: init, add, and total

T4

Implementare interfa utilizator

Activitate 1. Determinare cel mai mare divizor comun


Cazuri de testare
Un test case conine un set de intrri i rezultatele ateptate pentru fiecare intrare.
Date: a, b

Rezultate: gcd (a, b): c, unde c este cel mai mare divizor comun

23

24

64

02

20

24 9

-2 0

ValueError

0 -2

ValueError

Curs 1. Procesul de dezvoltare software


Ce este programarea
Elemente de baz al limbajului Python

Proces de dezvoltare bazat pe funcionaliti

Curs 2. Programare procedural


Funcii n Python
Cum se scriu funcii
Dezvoltare dirijat de teste (Test Driven Development

Referine
1.
2.
3.

The Python language reference. http://docs.python.org/py3k/reference/index.html


The Python standard library. http://docs.python.org/py3k/library/index.html
The Python tutorial. http://docs.python.org/tutorial/index.html