Sunteți pe pagina 1din 140

Limbaje avansate de programare

Notare:
50p – Laborator

50p – Examen
Principalele compomnente ale unui calculator
Avem doua componente distincte

Hardware Software

Componenta Hardware - reprezinta componentele


fizice ale calculatorului: procesorul, memoria RAM and
disk drives placa video ...
Componenta Software - este cea care controleaza
functionarea componetelor fizice. Acasta se face prin:
sistemul de operare in primul rand si apoi prin aplicatii
(sau programe).
Fiecare calculator are propiul limbaj care poarta denumirea
de cod masina (sau Assembly) folosit pentru efectuarea
operatiilor de baza (ciere sau scriere date, adunare, scadere,
inmultire, impartire si comparatii intre date).

Limbaj
Compilator Cod masina
avansat

Convertirea codului scris in aceste limbaje in cod masina se


face cu ajutorul unui program numit compilator.
Un avantaj major este asigurarea unei portabilitati mai
mare intre diversele masini de calcul dar si sisteme de
operare
Suma a doua numere
Asembler Limbaj avansat

c=a+b
Istoric

Fortran = Formula Translation

Fortran I: 1957 conceput de IBM


Fortran II: 1958
Fortran IV: 1962
Fortran 66: 1966 (adapted as an ANSI standard)
Fortran 77: 1977 cel mai utilizat
Fortran 90: 1990
Fortran 95: 1997
Fortran 2003: 2003
Istoric

C
1972 conceput Bell Labs (Dennis Ritchie)
1988 a fost standardizat, "ANSI C"

C++ programarea orientata pe obiecte


1979 conceput Bell Labs
1983 aprimit numele de C++ (Bjarne Stroustrup)
1998 a fost standardizat
Reprezentarea datelor in calculator

0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 …

8 bits = 1 byte

Baza 10 Baza 2 Baza 10 Baza 2


0 0 6 110
1 1 7 111
2 10 8 1000
3 11 9 1001
4 100 10 1010
5 101 255 11111111
Tipurile de date

Tipul de data intreg

Numar octeti Limite


1 [-128 127]
2 [−32,768 32,767]
4 [−2,147,483,648 2,147,483,647]
8 [-2.147e9 2.147e9]
Tipurile de date

Tipul de data real

Numar octeti Limite Cifre semnificative


4 [1.5E-45 3.4E38] 8
8 [5.0E-324 1.7E308] 16
Tipurile de date

Tipul de data caracter

Numar octeti Caractere


1 256
2 65,536
Variabila
Variabla reprezinta o zona de memorie in care se stocheza
valorea unei date.

Marimea zonei alocate unei variabile poate sa fie mai


mare sau mai mica in functie de tipul de data.

In interiorul unui program fiecare variabila trebuie sa fie


identificata un nume unic care trebuie sa inceapa cu o
litera. Numele unui variable poate insa sa contine si cifre
sau caractere speciale (exemplu _ ).
Variabila
In functie de compilator se poate face distinctia intre litere
mari si litere mici.

Exemplu:
contor_i si Contor_i

Poate sa reprezinta o acceasi variabla sau doua variabile


distincte.

In general fortran-ul nu face diferenta intre litere mai si


mici insa in C sau C++ aceasta diferenta se face.
Variabila

0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 …

adresa sau pointer

Adresa este pozitia primei casute a zonei in


care este stocata data
Tipuri de variabile
Fortran:
•integer
•real
•character
•logical (.true. / .false.)
•complex

C/C++:
•int (short / long / unsigned short / unsigned int / unsigned long)
•float/double
•char
•bool (true=1 / false=0 )
Tipuri implicite
In cazul limbajului fortran exista posibilitatea ca
variabilele sa nu trebuieasca sa fie declarate, astfel
daca varaibila incepe cu litera i,j,k,l sau m varaibila este
de tipul intreg, daca incepe cu orice alta litera variabila
este de tip real.

nume1 numel
Pentru a fi siguri ca nu utilizam tipurile implicite se
foloseste instructiunea:

implicit none
Constante literale

Constantele literale pot fi de umatoarele tipuri:


intreg: 1, -20, 100
real: 1.2, 1e-5, 1e-05, 1.; (cpp: 1)
caracter: 'c', 'f', "un sir de caractere "

Fortran: se poate folosi atat ' ' sau " "


C++: se foloseste ' ' pentru un singur caracter si " "
pentru un sir de caratere
Constante literale

Se pot folosi la initailizarea variabilelor sau la afisare:


Fortran:
a=1
nume_oras="Constanta"
C++:
a=1;
strcpy(nume_oras,"Constanta");
Program

Schema bloc a unui program

Date Date
Program
intrare iesire
Program

Etapele in realizarea unui program

I. Declarare
II. Initializare
III. Calcul
IV. Afisare
Program

I. Declarare

Inainte de a putea fi utilizate variabilele trebuiesc


declarate de aceea prima etapa a unui program este
etapa in care se declara toate variabilele

In C++ aceasta etapa poate sa nu fie distincta in


sensul ca se pot declara varibile si pe parcursul
programului.
Program

II. Initializare

Date Date
Program
intrare iesire

In aceasta etapa tuturor datelor de intrare trebuie se


atribuie o valoare.

Calulatorul nu proceseaza simbolic .


Program

III. Calcul

Etapa cea mai complicata a unui program este etapa


in care datele de iesire se calculeaza in functie de
datele de intrare pe baza unui algoritm de calcul.
Program

IV. Afisare

Date Date
Program
intrare iesire

Este etapa in care sunt afisata pe un ecran sau scrise


intr-un fisier datele de iesire.
Formatul sursei

Fortran 90:

 132 caractere pe linie

 '!' comentariu, tot ceea ce urmeaza este ignorat


de compilator

 '&' caracter de continuare a instructiunii pe linia


urmatoare

 ';' separator de instructiune nu este obigatoriu


Formatul sursei

C++:

 nu este limitat numarul de caractere pe o linie

 '//' comentariu, tot ceea ce urmeaza este ignorat


de compilator

 '/*' '*/' bloc comentat; poate contine mai multe


linii

 ';' separator de instructiune


Structura unui program

Fortran 90
Programul principal este PROGRAM nume_program
delimitat de cuvantul rezervat implicit none

PROGRAM nume …

END
si instructiunea

END sau END PROGRAM


Structura unui program

C++
Programul principal este #include <iostream>
cuprins in functia main using namespace std;
delinitata de acolade {…} int main()
{
Specific C++ librariile in care ….
sunt definite functiile implicite return 0;
trebuiesc explicit declarate. }

Exemplu:
#include <iostream>
Exemplu

Program pentru calculul sumei a doua numere

c=a+b

∈R
a,b∈ Program ∈R
c∈

Se citesc de la Se afiseaza pe
tastatura ecran
Instructiunea c=a+b
a

0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 …

b c

…1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 …

0100100 0100100 0100100


0001010 0001010
0101110
Instructiunea c=a+b
a

0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 …

b c

…1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 …

0100100 0100100 0100100


0001010 0001010
0101110
Exemplu

Program pentru calculul sumei a doua numere

c=a+b

∈R
a,b∈ Program ∈R
c∈

Se citesc de la Se afiseaza pe
tastatura ecran
Introducerea datelor de la tastatura

Fortran:
read(*,*) a,b

lista de variabile separate de virgula

C++:
cin>>a>>b;

lista de variabile separate operatorul >>


Afisarea datelor pe ecran

Fortran:
write(*,*) c

lista de variabile separate de virgula

C++:
cout<<c;

lista de variabile separate operatorul >>


Instructiuea de asignarea sau atribuire

Prin asignare unei variabile i se atribuie o valoarea ca


urmare a evaluarii unei expresii sau a unei constante
literale

Fortran:
y=sin(x)+x*x
i=1
nume_oras="Constanta"
C++:
y=sin(x)+x*x;
i=1;
char nume_oras[] ="Constanta“;
Fortran
PROGRAM suma_a_doua_numere
implicit none

! I. Declarare
real a,b,c

! II. Initializare
write(*,*) "Introduceti numerele a si b"
read(*,*) a,b

! III. Calcul
c=a+b

! IV. Afisare
write(*,*) 'Suma numerelor a si b este: ',c
END PROGRAM
C++
#include <iostream>
using namespace std;

int main()
{
// I. Declarare
double a,b,c;

// II. Initializare
cout << "Introduceti numerele a si b: ";
cin >> a >> b;

// III. Calcul
c=a+b;

// IV. Afisare
cout << "Suma numerelor a si b este: " << c << endl;

return 0;
}
Instructiuni de control al executiei unui program

Executia secventiala unui program poate fi schimbata


prin folosirea instructiunilor conditionale si a
instructiunilor repetitive. Aceste instructiuni ajuta la
implemantarea unui algoritm matematic.

Instructiuni conditionale: if, select case, switch

Instructiuni repetitive: do, do while, for, while


Instructiuni conitionale

Instructiounea IF

Cea mai simpla instructiune if este de forma:


Fortran:
if (expresie_logica) executa_instructiune

C++:
if (expresie_logica) executa_instructiune;

Aceasta forma se poate aplica doar in cazul in care avem de


executat doar o singura instructiune atunci cand expresia
logica din paranteze este adevarata.
Instructiunea IF

Exemplu:

Fortran:
if (x>y) max=x
sau
if (x>y) &
max=x
C++:
if (x>y) max=x;
sau
if (x>y)
max=x;
Expresia logica

O expresie logica este o expresie matematica al carei


rezultat poate sa fie adevarat sau fals si poate sa
corespunde valorilor 1 sau 0.

In c++ orice valoare intrega diferita de 0 este considerata


adevarata.

In expresiile logice se pot folosi:


- operatori numerici
- operatori de comparatie
- operatori logici.
Operatori numerici

In expresiile numerice se pot folosii urmatorii operatori:


adunare: +
scadere: -
inmultire *
inpartire /

In Fortran exista operatorul de ridicare la putere: **


r=3**5 corespunde r = 35

In C++ trebuie apelata o functie explicita pow


r=pow(3,5);
Operatori de comparatie
Fortran C++
.EQ. == ==
.NE. /= !=
.GT. > >
.GE. >= >=
.LT. < <
.LE. <= <=

Operatori logici
Fortran C++
.AND. &&
.OR. ||
.NOT. !
Exemple

Fortran C++

Asignare
a=.true. a=1;
b=.false. b=0;

Expresii logice
.not.a ≡ .false !a ≡ 0
a .or. b ≡ .true. a||b ≡ 1
a .and. b ≡ .false. a&&b ≡ 0
.not.a .or. b ≡ false !a||b ≡ 0
a.and..not.b ≡ true a&&!b ≡ 1
Prioritatea operatorilor

Ordinea de executie intr-o expresie a operatorilor este:

Fortran C++
** */
*/ +-
+- < <= > >=
< <= > >= !
.not. &&
.and. ||
.or. ==
==
Prioritatea operatorilor

Exemple:
x ∈ [a , b]

x>=a .and. x<=b x>=a && x<=b


(x>=a ) .and. (x<=b) (x>=a) && (x<=b)

x ∉ (a , b)

x<a .or. x>b x<a || x>b


(x<a) .or. (x>b) (x<a) || (x>b)
Instructiunea IF

Daca avem de executat mai multe instructiuni atunci


instructiunea if are urmatoare forma

Fortran C++

if (expresie_logica) then if (expresie_logica)


instructiune1 {
instructiune2 instructiune1;
... instructiune2;
endif ...
};
Instructiunea IF

Exemplu

Fortran C++

if (x>y) then if (x>y)


tmp=x {
x=y tmp=x;
y=tmp x=y;
endif y=tmp;
}
Instructiunea IF
Forma generala

Fortran C++

if (expresie_logica) then if (expresie_logica)


instructiunea_1_1 {
instructiunea_1_2 instructiunea_1_1;
... instructiunea_1_2;
else ...
instructiunea_2_1 }
instructiunea_2_2 else
... {
endif instructiunea_2_1;
instructiunea_2_2;
...
};
Instructiunea IF

Exemplu

Fortran

if (x>=0) then
write(*,*)"x este mai mare sau egal cu 0 “
else
write(*,*)"x este mai mic decat 0 “
endif
Instructiunea IF

Exemplu

C++

if (x>=0)
cout<<"x este mai mare sau egal cu 0 ";
else
cout<<"x este mai mic decat 0 ";
Instructiunea IF
Exemplu

Fortran

if (x>0) then
write(*,*)"x este mai mare decat 0 “
else
if(x==0) then
write(*,*)"x este egal cu 0 "
else
write(*,*)"x este mai mic decat 0 "
endif
endif
Instructiunea IF

Exemplu

C++

if (x>0)
cout<<"x este mai mare decat 0 ";
else
if(x==0)
cout<<"x este egal cu 0 ";
else
cout<<"x este mai mic decat 0;
Instructiunea IF

Instrictiunea elseif (este specifica doar in Fortran)


if (expresie_logica1) then
instructiune1_1
instructiune1_2
...
elseif(expresie_logica2) then
instructiune2_1
instructiune2_2
...
else
Instructiune1
instructiune2
...
endif
Instructiunea select case / switch

Este folosita in cazul in care avem mai multe cazuri de tratat,


toate cazuri depinzand de valoarea unui parametru.

Aceasta instructiune este optionala ea se poate inlocui prin


imbicarea mai multor instructiuni if.

Avanajul acestei instructiune este ca face codul mai usor de


inteles.

Este folosita in special in programarea bazata pe evenimente


la realizarea progarmeleor de tip GUI.
Instructiunea SELECT CASE

FORTRAN

select case (valoare)


case (valoare_1)
set_instructiuni_1
case (valoare_2)
set_instructiuni_2
.............
case (valoare_N)
set_instructiuni_N
case default
set_instructiuni_implicit
end select
Instructiunea SWITCH
C++

switch (valoare)
{
case valoare_1:
set_instructiuni_1;
break;
case valoare_2:
set_instructiuni_2;
break;
..........
case valoare_N:
set_instructiuni_N;
break;
default:
set_instructiuni_implicit;
}
Instructiunea SELECT CASE

FORTRAN exemplu

select case (eveniment)


case (WM_CREATE)
set_instructiuni_descidere_fereastra
case (WM_CLOSE)
set_instructiuni_incidere_fereastra
case (WM_LBUTTONDOWN)
set_instructiuni_buton_stanga_apasat
case (WM_RBUTTONDOWN)
set_instructiuni_buton_dreapta_apasat
end select
Instructiunea SWITCH
C++ exemplu

switch (eveniment)
{
case WM_CREATE:
set_instructiuni_descidere_fereastra;
break;
case WM_CLOSE:
set_instructiuni_incidere_fereastra;
break;
case WM_LBUTTONDOWN:
set_instructiuni_buton_stanga_apasat;
case WM_RBUTTONDOWN:
set_instructiuni_buton_dreapta_apasat;
break;
}
Programe

Ordonarea a trei numere a,b,c

Rezolvarea ecuaiei de gradul doi


Ordonarea a trei numere a,b,c

Se
∈R
a,b,c∈ Program ordoneaza
crescator

Se citesc de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
real a,b,c
II. Initializare
se citesc a,b,c
III. Calcul
se ordoneaza numerele a,b,c
IV. Afisare
se afiseaza pe ecran numerele a,b si ce
in ordine crescatoare
Ordonarea a trei numere a,b,c

Se
∈R
a,b,c∈ Program ordoneaza
crescator

Se citesc de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
real a,b,c
II. Initializare
se citesc a,b,c
III. Calcul
se ordoneaza numerele a,b,c
IV. Afisare
se afiseaza pe ecran numerele a,b si ce
in ordine crescatoare
Instructiuni repetitive

Instructiunile repetitive se inpart in doua categori:

instructiuni repetitive cu pasi determinati


ex: initializare unui vector cu N elemente

instructiuni repetitive cu pasi neterminati


ex: cautarea unei solutii a unei ecuatii

Este bine ca in cazul in care se cunosc numarul de pasi sa se


foloseasca instructiunea de repetie cu pasi determinati
pentru ca executia ei este mai rapida.
Instructiunea repetitiva cu pasi determinati

Fortran
do contor: v_start , v_end , v_step
set_instructiuni
Enddo

C++
for (contor=v_start; contor<=v_end; contor++)
{
set_instructiuni;
}
Instructiunea repetitiva cu pasi determinati

Exemplu initilizare unui vector v cu N elemente:


Fortran
do i: 1 , N
write(*,*)"elementul ",i,":"
read(*,*) v(i)
enddo
C++
for (i=0; i<N; i++)
{
cout<<"elementul "<<i<<":"<<endl;
cin>>v[i];
}
Program

Calculul unui numar factorial N!


Calculul unui numar factorial N!
n
n! = ∏ i
i =1

∈N
n∈ nf ∈N
n>0
Program

Se citesc de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
integer n,nf
II. Initializare
se citeste n
III. Calcul
se calculeaza nf
IV. Afisare
se afiseaza pe ecran nf
Etapele in realizarea programului

III. Calcul
se calculeaza nf
n
n! = ∏ i
i =1

nf=1
do i=1,n
nf=nf*i
enddo
cazuri particulare:
n<0
n=0 nf=1
Instructiunea repetitiva cu pasi nedeterminati

Fortran
do contor: v_start , v_end , v_step
set_instructiuni
Enddo

C++
for (contor=v_start; contor<=v_end; contor++)
{
set_instructiuni;
}
Instructiunea repetitiva cu pasi nedeterminati

Instructiunile repetitive cu pasi nedeterminati se


executa atat timp cat valoarea unei expresii este
adevarata.

Expresia trebuie sa depinda de un parametru care


trebuie odata sa fie initailizat inaintea buclei si
modificat in interiorul buclei
Instructiunea repetitiva cu pasi nedeterminati
Instructiunea do while / while

Fortran
do while (expresie .eq. .true.)
set_instructiuni
enddo

C++
while (expresie==true)
{
set_instructiuni;
}
Instructiunea repetitiva cu pasi nedeterminati

In acest caz testul expresiei se face la inceputul buclei.


Daca se doreste ca testul sa se faca la sfarsitul se
foloseste instructiunea do
Fortran C++
do
do
{
set_instructiuni
set_instructiuni;
if (expresie.eq..false.) exit
}
enddo
while (expresie==true)

pentru iesirea fortata se


folosete instructiunea
break;
Instructiunea repetitiva cu pasi nedeterminati

C++
do
{
set_instructiuni;
if(expresie==1) break;
}
Instructiunea repetitiva cu pasi determinati

Exemplu initilizare unui vector v cu N elemente:


Fortran
i=1
do
write(*,*)"elementul ",i,":"
read(*,*) v(i)
i=i+1
if (i.eq.N) stop
enddo
Instructiunea repetitiva cu pasi determinati

Exemplu initilizare unui vector v cu N elemente:

C++
i=0;
do
{
cout<<"elementul "<<i<<endl;
cin>>v[i];
i++;
}
while(i<N);
Program

Evaluarea seriei Markov


1 a 
xi =  xi −1 + → a
2 xi −1 
i→∞
Calculul seriei Markov

1 a 
xi =  xi −1 + 
2 xi −1 

a ∈R x2∈R
x1∈R Program

Se citesc de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
real a,x1,x2
II. Initializare
se citeste a,x1
III. Calcul
se calculeaza x2
IV. Afisare
se afiseaza pe ecran x2 si sqrt(a)
Etapele in realizarea programului

III. Calcul
se calculeaza x2
1 a 
xi =  xi −1 + 
2 xi −1 

do i=1,n
x2=0.5*(x1+a/x1)
x1=x2
enddo

Cat este n?
Etapele in realizarea programului

III. Calcul
se calculeaza x2
1 a 
xi =  xi −1 + 
2 xi −1 

do
x2=0.5*(x1+a/x1)
if(abs(x2-x1)<eps) EXIT
x1=x2
enddo

eps – poate sa fie data de intrare


Calculul seriei Markov

1 a 
xi =  xi −1 + 
2 xi −1 

a ∈R x2∈R
x1∈R Program
eps ∈R

Se citesc de la Se afiseaza pe
tastatura ecran
Vectori si matrici

Reprezentare

V(1) V(3)
Vectori si matrici

Reprezentare

Vi
Mi,j

Pentru matrici stocarea se face prin linearizare:


in fortran: se face pe coloane
in c++: se face pe linii
Vectori - declarare

Fortran
real,dimension(i1:i2)::V

Exemple:
real,dimension(-10:10)V1 !are 21 elemente
real,dimension(21)V2 !are 21 elemente
character(Len=10):: S !are 10 de caractere

declaratii suportate:
real V1(-10:10)
real V2(21)
character(10):: S
Vectori - declarare

C++
double V[n];

Exemple:
double V1[21]; //are 21 elemente
char S[10]; //are 9 caractere

ATENTIE!
-Indexarea vectorilor si matricilor in C++ se face de la 0
-Un cazul sirurilor de caractere ultimul caracter '\0'
Matrici - declarare

Fortran
real,dimension(il1:il2,ic1:ic2)::M

real,dimension(0:10,0:10)M1 ! are 11x11 elemente


real,dimension(11,11)M2 !are 11x11 elemente
character(Len=10),dimension(10):: AS !are 10x10

declaratii suportate:
real M1(0:10,0:10)
real M2(11,11)
character(Len=10) AS(10)
Matrici - declarare

C++
double M[nl][nc];

Exemple:
double M1[11][11]; //are 11x11 elemente
char AS[10][10]; //are 10x9 caractere
Accesarea unui element

Fortran C++
Vector: Vector:
V1(-5) V1[4]
S(5:5) S[5]

Matrice: Matrice:
M1(0,0) M1[0][0]
AS(1)(5:5) AS[5][5]
Elemente specifice fortranului

Lucrul cu vectorii si matrici este aproape similar cu lucrul variabilelor


simple:

A=0 – intializarea unui vector sau o matrice cu 0


C=A+B – suma a doi vectori sa matrici de aceeasi dimensiune
C=A*B – produsul a doi vectori sa matrici de aceeasi dimensiune
(inmultirea se face element cu element)

Pentru inmultirea a doua matrici se foloseste functia implicita MATMUL

C=matmul(A,B)
Elemente specifice fortranului

Subvector sau submatrice

A= B(1:5)
D= C(1:5,2:4)

Redimensionarea unui vector sau matrice

A=reshape(B,(/3, 3/) )
A=reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /),(/3, 3/) )
Program

Inmultirea a doua matrici

Cm , p = Am ,n Bn , p

n
C i , j = ∑ Ai ,k Bk , j
k =1
Inmultirea a doua matrici

Cm , p = Am ,n Bn , p

A ∈R m,n ∈ R m,p
C∈
∈ R n,p
B∈ Program

Se citesc de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
integer,parameter::Nmax=3
real,dimension(Nmax,Nmax)::A,B,C1,C2
integer m,n,p
II. Initializare
se citeste m,n,p,A,B
III. Calcul
se calculeaza C
IV. Afisare
se afiseaza pe ecran C
Program

Sortare a unui vector


Sortarea unui vector

v ∈R n v ∈R n
Program Sortat
crescator

Se citeste de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
integer,parameter::Nmax=100
real,dimension(Nmax)::V
integer n
II. Initializare
se citeste n,V
III. Calcul
se ordoneaza vectorul V
IV. Afisare
se afiseaza pe ecran vectorul ordonat V
Program

Verificarea parantezelor deschise si inchise intr-o expresie


Verificare paranteze

linie corect /
un sir de caratere
Program
incorect

Se citeste de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
character(200)::line
II. Initializare
se citeste variabila linie
III. Calcul
se verifica parantezele
IV. Afisare
se afiseaza pe ecran daca este expresia
este corecta sau nu
Unitati de program - functii si proceduri

Unitatile de program reprezinta o secventa de cod parametrizata


care executa anumite operatii si care poate fi apelata din alte
unitati de program.
Datele cu care lucreaza aceste unitati pot fi:

Variabile locale sunt datele care se declara in interiorul unitatii si


nu sunt vazute de unitatea apelanta.

Variabile globale sunt datele care se vad atat in programul


principal cat si in orice alta untate de program.

Variabile ficive sunt datele care se face transferul de informatie


intre unitatea de program si unitatea de program apelanta (prin
aceasta incluzand si programul principal).
Unitati de program - functii si proceduri

Acest transfer de date da posibilitatea ca blocuri de instructiuni


care au aceeasi functie dar care operaza cu date diferite sa fie
scrise doar o singura data in codul sursa.

Este un mare avantaj atat la scrierea programului cat si la debug-


area programului.

Datele fictive trebuiesc declarate in antetul functiei sau


procedurii.
Unitati de program - functii si proceduri

In mod uzual daca transferul de informatie se face printr-o


valoarea returnata de subprogram ea poarta denumirea de
functie (exact ca in matematica) daca insa transferul de date se
face prin parametrii fictivi atunci subprogramul poarta denumirea
de procedura.

Aceste concepte sunt valabile in fortran si pascal, in C exista doar


conceptul de functie, in sensul printr-o functie se poate sau nu
intoarce o valoare iar parametrii fictivi se pot initializa atat prin
copiere cat si prin referinta (alias)
Unitati de program - functii si proceduri
Fortran

[prefix] FUNCTION nume(lista nume arg. fictive)


implicit none
<[declarare nume]>
<declarare argumente fictive>
....
nume=valoare
END FUNCTION [nume]

SUBROUTINE nume(lista nume arg. fictive)


implicit none
<declarare argumente fictive>
....
END SUBROUTINE [nume]
Unitati de program - functii si proceduri

C++

[prefix] FUNCTION nume(lista nume arg. fictive+delclarare)


{
...
return [valoare]
}
Exemple
Fortran

real FUNCTION Negative(x)


real x
Negative=-x
END FUNCTION

sau

FUNCTION Negative(x)
real Negative, x
Negative=-x
END FUNCTION
Exemple
Fortran

SUBROUTINE Negative(x,negative_x)
Real,INTENT(IN)::x
Real,INTENT(OUT)::negative_x
negative_x = -x
END SUBROUTINE

sau

SUBROUTINE Negative(x)
Real,INTENT(INOUT)::x
x=-x
END SUBROUTINE
Exemple

C++

double Negative(double x)
{
return -x;
}

sau

void Negative(double x, double &negative_x)


{
Negative_x=-x;
}
Exemple

C++

void Negative(double &x)


{
x=-x;
}
Functii si proceduri implicite

Functii de conversie de tip

-REAL(i) converteste un interg la un real


-INT(x) converteste un real al un intreg prin trunchiere
-DBLE(a) converteste un intreg sau real la un real in dubla precizie
-IACHAR(c) pozitia caracterului ‘c’ din tabele ASCII
-ACHAR(i) returneaza caraterul la pozitia i din tabela ASCII
Functii si proceduri implicite

Functii matematice

-sin(x)
-cos(x)
-tan(x)
-asin(x)
-acos(x)
-atan(x)
-atan2(x,y)
-exp(x)
-log(x)
-log10(x)
-sqrt(x)
Functii si proceduri implicite

-ABS(x) modulul unui numar


-CEILING(x) cel mai mic intreg fata de numarul x (trunchiere)
-FLOOR(a) cel mai mare intreg fata de numarul x (adugare)
-MOD(a,b) restul impartiri lui a la b
-SIGN(a,b) transfera semnul lui b lui a ( abs(a)*b/abs(b) )
-MAX(a1,a2,a3,…) maximul argumnentelor
-MIN(a1,a2,a3,…) minimul argumnentelor
Functii si proceduri implicite

Functii pentru siruri de caractere

-ADJUSTL(str) ajustare la stanga


-ADJUSTR(str) ajustare la dreapta
-INDEX(sir,subsir) pozitia subsir in sir
-LEN(sir) lungime sir
-LEN_TRIM(sir) lungime sir fara spatiile de sfarsit
Program

Calculul sin(x)

x3 x5 x 7
sin( x) = x − + − + ...
3! 5! 7!
Calcul sin(x)
x3 x5 x 7
sin( x) = x − + − + ...
3! 5! 7!

x ∈R sinx ∈R
n ∈N Program

Se citeste de la Se afiseaza pe
tastatura ecran
Etapele in realizarea programului

I. Declarare
real x,sinx
Integer n
II. Initializare
se citeste x si n
III. Calcul
se calculeaza sinx
IV. Afisare
se afiseaza pe ecran sinx
Functii recursive

Functiile recursive sunt functiile care se apeleaza pe ele insele.

Din punct de vedere al codului scris un algoritm recursiv in general


este mult mai mic decat daca am scrie accelesi codul nerecursiv.

In fortran declararea functiile recursive trebuiesc definite explicit


prin cuvantul rezervat RECURSIVE si sa contina cuvantul rezevat
RESULT care declara variabila a carei valoarea va fi rezultatul
intors de catre functie
Functii recursive
Fortran

recursive FUNCTION nume(lista nume arg. fictive) results(var)


implicit none
<declarare var>
<declarare argumente fictive>
....
var = valoare
END FUNCTION [nume]
Functii recursive
Exemplu

recursive function Factorial(n) result(nf)


implicit none
integer, intent(in)::n
integer nf

if (n>0) then
nf=n*Factorial(n-1)
else
nf=1
endif

end function
Alocarea dinamica

Alocarea dinamica are vantajul ca face posibila utilizarea intregii


memorii disponibile a calculatorului.

Face posibil stocarea optimizata a datelor in memorie. In sensul ca


datele nu se aloca toate datele la inceputul programului ci se pot
aloca si dealoca pe masura ce avam sau nu avem nevoie de ele.

Nu mai este necesar de a define o valoare maxima pentru vectori


si matrici.
Alocarea dinamica

Alocarea dinamica are vantajul ca face posibila utilizarea intregii


memorii disponibile a calculatorului.

Face posibil stocarea optimizata a datelor in memorie. In sensul ca


datele nu se aloca toate datele la inceputul programului ci se pot
aloca si dealoca pe masura ce avam sau nu avem nevoie de ele.

Nu mai este necesar de a define o valoare maxima pentru vectori


si matrici.
Alocarea dinamica

Fortran

real,dimension(:),allocatable::V
real,dimension(:,:),allocatable::M

allocate(V(10),STAT=err)
allocate(M(10,10),STAT=err)

deallocate(V)
deallocate(M)

Functia ALLOCATED(nume_var) se poate folosi pentru a verifica


daca o variabila este alocata sau nu.
Alocarea dinamica
cpp

double *V;
double **M;

V=new int [100000];


M=new int*[n];
for(i=0;i<N;i++)
M[i]=new int[m];

delete [] V;
for(i=0;i<N;i++)
delete [] M[i];
delete [] M;
Alocare dinamica

Se aloca si
n,m ∈N
Program dealoca
V ∈ Rn
M ∈Rm,n

Se citeste de la
tastatura
Etapele in realizarea programului

I. Declarare
real x,sinx
Integer n
II. Initializare
se citeste x si n
III. Calcul
se calculeaza sinx
IV. Afisare
se afiseaza pe ecran sinx
Scrierea si citirea datelor folosind un fisier

Pentru a retine datele rezultate in urma rularii unui program sau a


in cazul in care datele de intrare in program sunt multe (exemplu
o matrice de 20x20 = 400 elemente) este foarte util ca aceste date
sa fie scrise sau citite dintr-un fisier.

Operatiile care trebuiesc facute sunt:

deschiderea unui fisier pentru scriere sau citire

scrierea / citirea datelor

inchiderea fisierului
Scrierea si citirea datelor folosind un fisier

Fortran

deschiderea unui fisier pentru citire


OPEN(UNIT=1, FILE=‘v1.dat’, status='old',iostat=err)

scrierea / citirea datelor


READ(1,*)v(i)

inchiderea fisierului
CLOSE(1)
Scrierea si citirea datelor folosind un fisier

Fortran

deschiderea unui fisier pentru scriere


OPEN(UNIT=2, FILE=‘v2.dat’, status=‘new’,iostat=err)

scrierea / citirea datelor


WRITE(2,*)v(i)

inchiderea fisierului
CLOSE(2)
Daca fisierul exista trebuie folosit ca parametru pentru status
‘replace’ sau ‘unknown’
Scrierea si citirea datelor folosind un fisier
cpp

double *V;
double **M;

V=new int [100000];


M=new int*[n];
for(i=0;i<N;i++)
M[i]=new int[m];

delete [] V;
for(i=0;i<N;i++)
delete [] M[i];
delete [] M;
Scrierea si citirea datelor folosind un fisier

C++

deschiderea unui fisier pentru citire


fstream f1;
f1.open ("m1.dat",ios::in);

scrierea / citirea datelor


f1>>m[i];

inchiderea fisierului
f1.close();
Scrierea si citirea datelor folosind un fisier

C++

deschiderea unui fisier pentru scriere


fstream f2;
f2.open (“m2.dat",ios::out);

scrierea / citirea datelor


f2<<m[i];

inchiderea fisierului
f2.close();
Program citire / scriere din fisier

V ∈ Rn V ∈ Rn
M ∈Rm,n Program M ∈Rm,n

Se citesc din Se scriu in


fisier fisier
Etapele in realizarea programului

I. Declarare
real,dimension(10)::V
real,dimension(10,10)::M
integer nl,nc
Integer n
II. Initializare
se citeste din fisier nl, nc, V si M
III. Calcul

IV. Afisare
se scrie in fisier V si M
Subiecte

1. Se citesc 5 numere sa genereze toate perechile de doua numere


insa un numar poate sa apara doar o singura data (nu conteaza
ordinea numerelor in pereche)

2. Care este valoarea elementului 5 al sirului generat dupa


urmatorul algoritm:
si + 2 = si + 2 ⋅ si −1
Se citesc de la tastatura s1 si s2 (i>2)

3. Afisati pe ecran numerele mai mari decat 10 si mai mici decat n


(se citeste de la tastatura) care sunt formate doar din cifre
identice.
Subiecte

4. Se consideră un vector unidimensional x cu n componente


numere reale. Calculati suma elementelor mai mari decat 0

5. Se citeste dintr-un fisier o matrice de numere reale cu m linii si


n coloane. Calculati produsul elementelor mai mari decat 0 si
numarul lor.

6. Sa se initialize o matrice cu m linii si n coloane astfel incat


2
2  2+i 
Ai , j = sin   i, j ≥ 1
 j 
Matricea se aloca dinamic
Subiecte
7. Se citeste dintr-un fisier o matrice de numere reale cu m linii si
n coloane. Calculati produsul elementelor mai mari decat 0 si
numarul lor.

8. Se citeste un text de la tastatura care poate sa contina una sau


mai multe propozitii. Verificati ca propozitiile incep cu litera mare.

9. Se citeste un text de la tastatura verificati de cate ori apare


litera 'a' si cuvantul 'si' (nu avem diacritice).

10. Se dau două numere naturale a, b cu maxim 9 cifre. Sa se


determine numarul de cifrele comune numerelor a şi b.
(a si b se citesc ca siruri de caractere)

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