Sunteți pe pagina 1din 31

Programarea Calculatoarelor si

Limbaje de Programare I (PCLPI)


Titular curs : prof. dr. ing. Andreea Udrea
Contact : andreea.udrea@upb.ro
Birou: ED 009
Facultatea de Automatica si Calculatoare
Intro
De ce sa invatam programare?

Filozofic - realizare de algoritmi/aplicatii care ajuta in viata de zi cu zi: aplicatii web,


mobile, desktop; simulatoare de procese fizice, chimice; aplicatii medicale, economice,
uz curent; jocuri…etc

Pragmatic - job bine platit

“Skill-uri” necesare:
-> gandire algoritmica – > analiza problemei cat si gasirea, generalizarea si optimizarea
solutiei
-> niste/un limbaj/e – C, C++, C#, Java, PHP, Matlab, etc
-> ceva experienta – niste mici proiecte proprii
Organizarea materiilor de programare / ani

• Programarea Calculatoarelor si Limbaje de Programare I – cum abordez o


problema de rezolvat dpdv al programatorului; limbajul C (C++); aplicatii
simple si de complexitate medie

• Programarea Calculatoarelor si Limbaje de Programare II – C++; organizarea


datelor in structuri de tip clasa – incapsularea datelor; relatii intre clase:
derivare si agregare; aplicatii C++ de complexitate medie (an I , semestrul II)

• Programare orientata pe obiect – Java (an II , semestrul I)

• Structuri de Date si Algoritmi (an III)

• Baze de date (an III)


PCLP I - Notare
Nota finala =
_____________________________________
Examen final - 50 pcte (25pcte – grila + 25 pcte - problema)

Verificari in timpul semestrului - 2X10/pcte – 20 pcte


- saptamanile 8, 13 (la curs)
- mini-probleme (30-45 min)

Laborator - 30 pcte
- media notelor obtinute la fiecare tema de laborator
- nota se va acorda la finalul celor 2h aferente fiecarei temei de laborator
- laboratorul nu se poate recupera/face cu alta semigrupa
- pentru a intra in examen, numarul de absente acceptate la laborator este maxim 3
- in ultima saptamana de scoala se poate recupera, in caz de absenta (!nu reface),
un singur laborator
In fiecare saptamana veti avea postat pe Moodle materialul de curs, laborator si o lista cu
probleme de rezolvat (dintre acestea, 3-4 probleme vor fi selectate pentru a fi rezolvate in
timpul laboratorului).
PCLP I - Continut
▪ Ce este un algoritm. Reprezentarea algoritmilor

▪ Tipuri de date fundamentale, variabile si operatori

▪ Instructiuni

▪ Tipuri de date masive – vectori, matrice. Sortari. Siruri de caractere

▪ Tipul pointer si legatura cu tablourile

▪ Functii definite de catre utilizator si recursivitate

▪ Memorie, tipuri de variable

▪ Directive preprocesor. Limbaje compilate vs limbaje interpretate

▪ Structuri si uniuni

▪ Fisiere

▪ Structuri de date – elemente generale


Ce e un algoritm?
Algoritm = o tehnica de baza (solutie) prin care se rezolva o problema
Solutia = o secventa de pasi/operatii prin care se precizeaza modul de rezolvare al problemei

“making an omelet has an algorithm”

Etape: - stabilirea input-ului si output-ului


- stabilirea pasilor

Input = date de intrare = datele cunoscute initial, pe baza carora algoritmul calculeaza
rezultatele cerute
Ex: un numar, o matrice, un graf, o imagine, text, etc

Output = date de iesire = rezultatele asteptate in urma prelucrarii datelor de intrare(“omleta”)


Ex: factorialul unui numar, suma elementelor de pe diagonala principala a unei matrice,
distanta cea mai scurta intre doua orase, obiectul cel mai mare dintr-o imagine, cate cuvinte
are o secventa de text, etc
Caracteristicile unui algoritm

Ce caracteristici trebuie sa aiba un algoritm?

▪ Precizie – pasii sunt precis definiti

▪ Unicitate – rezultatele la fiecare pas sunt unic definite si depind doar de datele de
intrare si pasii precedenti

▪ Finitudine – algoritmul se opreste dupa un numar finit de pasi

▪ Generalitate – algoritmul poate sa fie aplicat unei multimi de intrari (ex. algoritm
care rezolva toate ecuatiile de gradul II, nu doar x^2 - 1 =0)

Cum pot sa reprezint un algoritm?


▪ Schema logica
▪ Pseudocod
▪ Limbaj programare
Schema logica
= reprezentare grafica a unui algoritm folosind un set de operatii reprezentate sub forma de
figuri geometrice - cu o anumita ordine a operatiilor de efectuat

o Start / Stop

o Citire date intrare

o Afisare/scriere date iesire

o Atribuire de valori

o Conditie
Limbaj pseudocod si limbaj de programare

• Limbaj pseudocod - ca si schema logica - e un mod de a reprezenta pasii unui


algoritm folosind text in loc de figuri geometrice
- instructiunile scrise astfel, pot fi traduse in orice limbaj
- e un limbaj universal

• Limbaj de programare - permite utilizarea de instructiuni precise – ce respecta o


sintaxa specifica si care reflecta implementarea unui algoritm gandit anterior
- C++, Java, PHP, C, Assembler, Python
- de nivel inalt, mediu, scazut
- compilate / interpretate
- rapide / lente
Exemple Probleme – Algoritmi

Pb 1 x, y, s reale (declar variabilele)


Citesc x, y (citesc valori pt DI)
Se dau doua s <- x+y (s ia valoarea x+y *)
numere reale – x Scriu s (scriu DO)
si y. Se cere sa se
calculeze suma lor
s. *fac o atribuire

DI : x, y

DO : s
Pb 2 x, y, max reale
Citesc x, y
Se dau doua numere
Daca x>y atunci max <- x
reale x si y. altfel max <- y
Sa se gaseasca Scriu max
maximul – max-
dintre ele si sa se
afiseze.

DI : x, y
DO : max

Dati alt algoritm pentru


rezolvarea problemei!

x, y, max reale
Citesc x, y
max<-y
Daca x>max atunci max <- x
Scriu max
Pb 3 n, f, i intregi
Citesc n
Sa se calculeze f <- 1
si apoi afiseze Pentru i <- 1…n, cu pas 1*
factorialul f al f <- f*i
numarului Scriu f
natural pozitiv
n. *pas 1, adica valoarea
contorului i porneste de la
1 si creste dupa executia
DI : n secventei f <- f*i cu 1 :
DO : f f <- f*1
f <- f*2

Pot sa schimb ordinea


operatiilor?
Dati alt algoritm pentru
rezolvarea problemei!
Tipuri de date

Identificati entitatile importante din problemele precedente:


- variabile: x, y, max, s, n, f, i -> au tip; au nume; au valori care se pot modifica
in algoritm (pot fi DI sau DO sau alte elemente auxiliare de care avem nevoie)
- operatori: +, *, =, > - au operanzi si genereaza un rezultat
- functii: de citire /scriere date

Tipuri de date:
Date = tot ce e prelucrat printr-un program
Un tip de date defineste multimea valorilor pe care le pot lua variabilele de acel
tip, respectiv, modul de reprezentare al acestora in memoria calculatorului si
operatiile care pot fi efectuate cu acele date.
Tipuri de date fundamentale si modificatori de tip

int - numere intregi


float, double - numere reale
char – caractere
bool – valoare de adevar; 1 sau 0; true sau false (C++; in C nu exista)
void - tip special - multimea valorilor e vida; specifica absenta oricarei valori

OBS: Pe langa aceste tipuri de date avem o serie de altele derivate - create
folosind modificatori de tip: short, long si unsigned/signed.
Cu ajutorul lor specific care e spatiul de memorie pe care o sa il ocupe o variabila
de un anumit tip (modific domeniul unui tip de baza).
Observatie: In memoria calculatorului, pentru stocarea valorilor, se foloseste
reprezentarea binara (o cifra binara (0/1) = bit).

Nr. de biti Nr. stari Semnificatie

1 Bit 21=2 Valoarea 0 sau 1

8 Octet (byte) 28=256 Pot codifica un set


de caractere
(asignez o stare
fiecarui caracter)
16 2 octeti (word) 216=65 536 Pot codifica
numere intregi cu
valori de la
-32 768 la +32 767
Presupunand ca lucram cu un compilator pe 32 biti, aveti mai jos o serie de
tipuri de date cu domeniile lor de valori:

Tip de date Nr . de octeti Domeniul de valori


int 2 -32 768…+32 767
unsigned int 2 0…65 535
long int 4 -2 147 483 648…2 147 483 647
unsigned long int 4 0…4 294 967 295
char 1 -128…127
unsigned char 1 0…255
float 4, virgula mobila [3.4*10^-38, 3.4*10^38]
reunit cu
[-3.4*10^38, -3.4*10^-38]
double 8, virgula mobila [1.7*10^-308, 1.7*10^308]
reunit cu
[-1.7*10^308, -1.7*10^-308]

long double 10, virgula mobila [3.4*10^-4932, 3.4*10^4932]


reunit cu
[-3.4*10^4932, -3.4*10^-4932]
Variabile

Variabila - o entitate dintr-un program care are un nume, un tip, o durata de viata si ocupa un
anumit spatiu de memorie
- valoarea ei poate sa se schimbe de-a lungul programului.

In C/C++, pentru a utiliza o variabila, trebuie mai intai sa o declaram:

int x; // declar un intreg cu numele x, fara valoare initiala fixata

int y=3; //declar un intreg cu numele y, cu valoare initiala 3

float a, b=2.5; // declar doua variabile de tip float: a si b; b are valoare initiala fixata: 2.5

char c, d=‘a’; // declar doua variabile de tip caracter: c si d; d are valoare initiala fixata: a

bool s=0, s1; // declar doua variabile de tip boolean: s si s1; s are valoare initiala fixata: 0 (false)

tip_date nume_var_1 [ = valoare_1];


*[]- inseamna optional (nu se pune in cod).
Observatii:
Variabile
1. Numele - e case sensitive

- poate contine orice litera din alfabet , orice cifra si simbolul _ .

- nu are voie sa inceapa cu cifra

- nu are voie sa fie un cuvant rezervat ( if, else, for, etc)

2. Variabilele se declara acolo unde se folosesc (avem nevoie de ele):

➢ in functii (secvente de cod cu un anumit nume care realizeaza un anumit set de


operatii), caz in care sunt vizibile doar in acel loc – variabile locale.

➢ in afara oricarei functii – variabile globale si atunci sunt vizibile oriunde in program.

3. Variabilele pot sa fie declarate :

➢ in C: doar la inceputul functiei /programului

➢ in C++: oriunde e nevoie de ele


Primul program
IDE – Integrated Development Environment

Ex: Dev-C++, Code:Blocks, Microsoft Visual Studio etc

Un mediu de dezvoltare (IDE) contine unelte pentru pentru:


- scrierea codului (interfata)
- compilarea, depanarea si executarea aplicatiilor (compile, debug, run)

Dev-C++ pasi:
1. File -> New -> Source File;
2. Save as: dau un nume fisierului si selectez ca tip de fisier: C++ source file – care va
pune extensia .cpp fisierului generat. Automat acest program va fi compilat ca un
program C++.

1. Cel mai simplu program C:

int main() // aceasta este o functie - cea principala = intrarea in program; unica
{ // nu face nimic
return 0; // return 0 se foloseste pentru a marca terminarea / incheierea/
} // /iesirea din functia main - cu succes
// orice aplicatie consola o sa contina minim aceasta secventa de cod
2. Un program care afiseaza un text, trece la linia urmatoare si afiseaza un numar:
#include <iostream>
using namespace std;
//includ biblioteca iostream ca sa pot sa folosesc operatorul << pentru afisare
//efectul cuvintelor rezervate using si namespace le vom discuta mai tarziu
//in principiu ma ajuta sa am acces la entitatea consola – cout

int main() {
cout<<“SALUT!”; // afisez pe consola – cout, folosind operatorul <<, textul SALUT!
cout<<endl; // trece la linia urmatoare
cout<<2.5; //cu operatorul << pot afisa orice tip de date de baza

// cout<<“SALUT!”<<endl<<2.5; //are acelasi efect ca cele 3 instructiuni precedente

return 0;
}
OBS: // - comentarii de linie; /*…*/ - comentarii bloc - nu au efect –ignorate la compilare

Cum as putea sa afisez valoarea unei variabile x, intregi, cu valoarea initiala 10, respectiv,
cu valoarea citita de la tastatura? Stiti sa faceti citirea/afisarea altfel?
3. Citirea de la tastatura a valorilor pentru variabile si afisarea lor :
#include <iostream>
using namespace std;

int main() {
int x, y; // declar doua variabile de tip intreg, locale (se gasesc intr-o functie)
// au o valoare initiala oarecare !!!NU SUNT INITIALIZATE CU 0
cout<<“Dati valori pentru x si y (cu spatiu intre ele sau pe linii diferite):”;

cin>>x; // citeste de la tastatura valoarea variabilei x


cin>>y; // citeste de la tastatura valoarea variabilei y

//sau: cin>>x>>y; // citeste de la tastatura valoarea variabilei x si apoi a lui y

cout<<“Valoarea lui x este”<<x<<endl; //afisez text:” Valoarea lui x este” si valoarea lui x
cout<<“Valoarea lui y este”<<y<<endl; //apoi trec pe linie noua (endl)
return 0;
}
OBS! Daca o sa “copy – paste”-ati codul din pdf-uri este posibil ca simbolurile “ ” sa
fie diferite de cele folosite de IDE-ul Dev-C++ si veti avea un mesaj de eroare de tipul:
[Error] stray '\223' in program Solutie: Rescrieti simbolurile!
3. Variabile globale si locale (diferente)
OBS: Doar variabilele globale sunt initializate automat cu 0.
#include <iostream>
using namespace std; #include <iostream>
//variabile globale (in afara oricarei functii) using namespace std;
int x;
int main() {
float y; //variabile locale (in functia main)
double z; int x;
char c; float y;
double z;
char c;
int main() {
cout<<“Valoarea lui x e ”<<x<<endl; cout<<“Valoarea lui x e ”<<x<<endl;
cout<<“Valoarea lui y e ”<<y<<endl; cout<<“Valoarea lui y e ”<<y<<endl;
cout<<“Valoarea lui z e ”<<z<<endl; cout<<“Valoarea lui z e ”<<z<<endl;
cout<<“Valoarea lui c e ”<<c<<endl; cout<<“Valoarea lui c e ”<<c<<endl;

return 0;
return 0; }
}

Valoarea lui c este ‘\0’ – simbolizeaza final de sir de caractere


Operatori
Expresie = combinatie de operatori si operanzi => rezultat (valoare unica de tip intreg, real,
bool, etc )
Tipuri de operatori:
▪ unari – un singur operand: ☺ a; a☺
▪ binari – doi operanzi: a ☺ b
▪ ternari – trei operanzi: conditie ? instr_1 : instr_2

Notiuni importante:
• precedenta = ordinea efectuarii operatiilor = prioritatea operatorilor
Ex: a=b+c*d; se executa *, apoi +, apoi = (rezultatele intermediare se stocheaza in variabile
temporare, fara nume, care exista pana la finalizarea instructiunii)
OBS: Precedenta poate sa fie modificata prin utilizarea de () - pe oricate niveluri e necesar.
Ex: a=(b+c)*d; se executa +, apoi *, apoi =

• asociativitatea = ordinea de asociere cand folosim un operator de mai multe ori in aceeasi
expresie
Ex: a+b+c; care + se executa mai intai? Cel din stanga sau cel din dreapta?
Prioritate
mare

Prioritate
mica
Operatori – Exemple si discutii

• Operatori de atribuire aritmetica

int a=3, b=4; int a=3, b=4; int a=3, b=4; int a=3, b=4;

a=a*b+4; a*=b+4; a+=(a*=b)+4; a+=a*=b+4;

cout<<a<<“ “<<b; cout<<a; cout<<a;


cout<<a<<“ “<<b;
//=3*(4+4)=24 4 //a devine 12 //a=3*8=24
//16 4
//28 =12+16 //48 //24+24
Operatori – Exemple si discutii
Atribuirea ( = )
int x=1, y =2, z=3;
x=y+z;//x=5, y si z nu isi schimba valoarea
z=x=y;
//Asociativitate de la dreapta la stanga: x ia valoare lui y, se returneaza valoarea noua a
//lui x intr-o variabila temporara si apoi z ia valoarea din acea variabila

Adunare (+) Adunare cu atribuire (+=)


int rez, x=1,y=2,z=3; int a=2,b=3,c=1;
rez=x+y+z; a+=b+=c;
//<=> a+=(b+=c);
//<=> rez= (x+y)+z;

Incrementare (++) post /prefixata


int x=1;
cout<<x++; // valoarea lui x se schimba dupa terminarea instructiunii unde apare ++
cout<<++x; // valoarea lui x se schimba in instructiunea unde apare ++
Se afiseaza 1 3
Operatori – Exemple si discutii
Operatori relationali

int i=2, j = 2, k=4;


i>k - are valoarea 0 (false)
i!=k - are valoarea 1 (true)
i<=j==1 - are valoare de adevar 1(true) <=> (i<=j)==1
i=k<i - i ia valoarea 0 (false) <=> i=(k<i)
Operatori – Exemple si discutii
Operatori logici
int a=2, b=1;
!(a<2)&&(b<2) //true
(a+2<2)||(b<2) //true

Verificati daca numerele intregi a, b si c sunt mai mari ca 10. Daca aceasta conditie e
indeplinita afisati 1 (adevarat), altfel 0;

#include <iostream> Tema


Cum verific daca:
using namespace std; - a si b sunt mai mici sau egale
int main( ){ cu 3 si c mai mare ca 2.
- a sau b sunt mai mici sau
int a,b,c; egale cu 3 si c mai mare ca 2?
cout<<"Dati valorile pentru a,b si c:"<<endl; - a e par?

cin>>a>>b>>c; //puteam sa fac altfel?


cout<< (a>10 && b>10 && c>10);
/*sau*/ cout<< (a>10)&& (b>10)&& (c>10); /*dar nu: cout<< a>10 && b>10 && c>10;
return 0; //operatorul<< are precedenta mai mare decat operatorii relationali
} // si mai mica decat cei logici
Operatori – Exemple si discutii

Operatorul conditional ?:

expresie1?expresie2:expresie3;

 daca expresie1 este adevarata, atunci executa expresie2, altfel executa


expresie3.

Determinati maximul dintre doua numere intregi:

//in main

int a, b, max;

cin>>a>>b; //citesc valorile pentru a si b

(a>b)? (max=a) : (max=b);

cout<<max;

//…
Conversii de tip
int a=3;
float b=4;
cout<<((b+a)/2)<<endl;
//3.5 - primul operand al operatorului + este de tip float=> rezultatul e de tip float

cout<<((a+a+a)/2)<<endl;
//4 - primul operand al operatorului + este de tip int => rezultatul impartirii e int

Conversii implicite de tip


Ce se afiseaza?
int n;
float x=1.33;
n=x;
cout<<n ;
//n=x; conversie automata/implicita din float in int cu pierdere de informatie
Conversii de tip

Conversii explicite de tip


-se foloseste operatorul specializat pentru conversie:
(tip)expresie.

Exemplu:

int k=2, m=3;


float media;
media=(float) (k +m)/2;
//se face un cast asupra sumei k+m care e transformata din int in float
//sau
media=((float) k +m)/2;
//se face un cast asupra lui k care e transformat din int in float; suma, in urma
//adunarii, e de tip float

*conversie = cast (eng.)

S-ar putea să vă placă și