Sunteți pe pagina 1din 35

Anexa 4B – Tematica pentru proba scrisă

Informatică

1. Algoritmi
1.1. Noţiunea de algoritm, caracteristici
1.2. Date, variabile, expresii, operaţii
1.3. Structuri de bază (liniară, alternativă şi repetitivă)
1.4. Descrierea algoritmilor (programe pseudocod)
2. Elementele de bază ale unui limbaj de programare (Pascal sau C, la alegere)
2.1. Vocabularul limbajului
2.2. Constante. Identificatori
2.3. Noţiunea de tip de dată. Operatori aritmetici, logici, relaţionali
2.4. Definirea tipurilor de date
2.5. Variabile. Declararea variabilelor
2.6. Definirea constantelor
2.7. Structura programelor. Comentarii
2.8. Expresii. Instrucţiunea de atribuire
2.9. Citirea/scrierea datelor
2.10. Structuri de control (instrucţiunea compusă, structuri alternative şi repetitive)
3. Subprograme predefinite
3.1. Subprograme. Mecanisme de transfer prin intermediul parametrilor
3.2. Proceduri şi funcţii predefinite
4. Tipuri structurate de date
4.1. Tipul tablou
4.2. Tipul şir de caractere
– operatori, proceduri şi funcţii predefinite pentru: citire, afişare, concatenare,
căutare, extragere, inserare, eliminare şi conversii (şir ↔ valoare numerică)
4.3. Tipul înregistrare
5. Fişiere text
5.1. Fişiere text. Tipuri de acces
5.2. Proceduri şi funcţii predefinite pentru fişiere text
6. Algoritmi elementari
6.1. Probleme care operează asupra cifrelor unui număr 2

6.2. Divizibilitate. Numere prime. Algoritmul lui Euclid


6.3. Şirul lui Fibonacci. Calculul unor sume cu termenul general dat
6.4. Determinare minim/maxim
6.5. Metode de ordonare (metoda bulelor, inserţiei, selecţiei, numărării)
6.6. Interclasare
6.7. Metode de căutare (secvenţială, binară)
6.8. Analiza complexităţii unui algoritm (considerând criteriile de eficienţă durata de
executare şi spaţiu de memorie utilizat)
7. Subprograme definite de utilizator
7.1. Proceduri şi funcţii
– declarare şi apel
– parametri formali şi parametri efectivi
– parametri transmişi prin valoare, parametri transmişi prin referinţă
– variabile globale şi variabile locale, domeniu de vizibilitate
7.2. Proiectarea modulară a rezolvării unei probleme
1.Algoritmi

1.1. Notiunea de algoritm,caracteristici


Definitie:
Algoritmul este o mulţime ordonată şi finită de paşi (instrucţiuni) prin care se prelucrează date de
intrare şi se obţin date de ieşire (rezultate), rezolvând astfel o clasă de probleme.

Un algoritm reprezinta pasii care trebuie parcursi pentru a rezolva o anumita probleama. Exemplu
de algoritm:

media aritmetica a 3 numere intregi

Date de intrare: cele 3 numere întregi


Date de iesire: media

Pas1: citeste 3 numere a,b,c


Pas2: calculeaza suma numerelor a+b+c
Pas3: calculeaza media impartind suma calculata la 3
Pas4: afiseaza media calculata

Pentru ca o maşină de calcul să poată rezolva o anumită problemă, programatorul trebuie mai întâi să
stabilească un algoritm care sa rezolve problema respectiva.

Caracteristicile algoritmilor

1) Finitudine – proprietatea algoritmilor de a furniza datele de ieşire într-un timp finit (adica dupa un
număr finit de paşi).
2) Claritatea - algoritmul trebuie să descrie operaţiile clar şi fără ambiguiăţi.
3) Generalitatea – proprietatea algoritmilor de a rezolva o intreagă clasă de probleme de acelaşi fel.
(algoritmul de rezolvare a ec. de gr. II va rezolva orice ecuatie de gradul II, indiferent de datele de
intrare)
4) Corectitudinea – spunem că un algoritm este corect dacă el furnizează în mod corect datele de ieşire
pentru orice date de intrare.
5) Realizabilitatea: orice algoritm trebuie sa poată fi codificat într-un limbaj de programare.
6) Eficienţa se referă la timpul de execuţie (în care sunt folosite resursele calculatorului: memorie,
procesor) şi la spaţiul de memorie utilizat. Un algoritm este cu atât mai eficient cu cât spaţiul de
memorie utilizat este mai mic şi numărul de operaţii mai puţine.
1.2. Date, variabile, expresii, operatori
Datele
 Informaţiile din lumea reală se pot codifica sub forma unor date.
 Data este modelul de codificare a informaţiei, accesibil calculatorului pentru
prelucrare.
 Datele sunt caracterizate de următoarele atribute: identificator (nume), valoare,
adresă de memorie, tip.
 Tipul unei date defineşte mulţimea valorilor posibile, modul de reprezentare internă,
dimensiunea locaţiei de memorie alocate şi operaţiile ce se pot efectua cu aceasta.
 Clasificarea datelor - în funcţie de valoare:
o variabile: îşi pot modifica valoarea pe parcursul execuţiei algoritmului
o constante: nu îşi modifică valoarea pe parcursul execuţiei algoritmului.
 Clasificarea datelor - în funcţie de modul de compunere:
o elementare
o structurate.
 Tipuri elementare de date:
 Întregi ;  ex. 120, -120
 Reale ;  ex. 3.12, 12.
 Logice(boolean);  ex. TRUE(adevarat), FALSE(fals)
 Caracter
 sir de caractere;  ex. 'un text' .
 pointer

 Asupra datelor se aplică operatori rezultând expresii.


Operatori C/C++
atribuire =, +=, -=, *=,/=, ...
aritmetici +, -, *, /, %, ++, --
relationali ==, >, <, >=, <=, !=
logici &&, ||, !,
pe biţi logici: ~, &, |, ^
de deplasare: <<, >>
alţii , ex: e1,e2
?: ex: e1:e2?e3; (operator condiţional)
sizeof() (determinare dimensiune)
(<tip>) (conversie de tip)
Expresii
Cu ajutorul constantelor, variabilelor si operatorilor se pot construi diverse expresii. În scrierea
expresiilor este permisa folosirea parantezelor.
Expresiile sunt de mai multe tipuri :
 Întregi: ex: 3*a+45, a mod 3, 10 div 2)
 Reale: : ex: 3*a+45.34
 Logice: Exemple : a OR b, unde a si b sunt variabile logice ; Sau (a>=b) AND (c<d) )

????Operatii
 Clasificare operatii :
 Operatii de intrare si iesire ;
 Operatii de atribuire ;
 Operatii de decizie ;

  Operatii  de intrare si iesire


Prin operatia de intrare ( de citire) se întelege introducerea datelor la un dispozitiv de intrare (ex:tastatura) intr-o
variabila(memorata in memoria interna ).
Ex: citeste a,b,c - se vor citi 3 variabile
Prin operatia de iesire (scriere ) se întelege afisarea unei date (din memoria interna) catre un dispozitiv de iesire
( ex:monitorul) .
Ex: afiseaza s - se afiseaza valoarea sumei s
   
Operatii  de atribuire(se foloseste semnul ←)
Atribuirea este operaţia prin care puteţi schimba valoarea unei variabile. 
Ex: a ← c+4 //daca „c” are valoarea 5 rezulta ca „a” primeste valoarea 9
Operatia de atribuire se efectueaza astfel :
· Se evalueaza expresia din partea dreapta a operatiei de atribuire ;(suma dintre c si 4)
· Valoarea care se obtine astfel este preluata de variabila din partea stânga(a), iar valoarea avuta de aceasta
se pierde .

Operatii de decizie
În general, în functie de anumite conditii, trebuie facute anumite operatii sau altele. Operatia prin care testam
acele conditii se numeste operatia de decizie. În functie de rezultatul testului, algoritmul executa anumite operatii. 

 ????

1.3 Structuri de baza (liniara,alternativa,repetitiva)

Algoritmii pot fi reprezentati cu ajutorul schemelor logice si în pseudocod.

Structura liniară (secventiala)  este o secvenţă de instrucţiuni care se execută de sus in jos, o singură dată. O
astfel de structură poate să conţină instrucţiuni pentru citirea şi scrierea datelor, calcule matematice (expresii) —
instrucţiuni de atribuire.
Ex. structura liniara pseudocod Ex. structura liniara schema logica
                                        Pas 1;
                                        Pas 2;
                                        Pas 3;
                                          ...... Pas 1; 
                                       Pas n; Pas 2;
Pas 3;
......
 Pas n;

Exemplu de structura liniara


media aritmetica a 3 numere intregi

Date de intrare: cele 3 numere întregi


Date de iesire: media

citeste a,b,c
s ← a+b+c
med ← s/3
scrie med
      
Structura alternativa (de decizie)  este o operaţie de decizie şi două blocuri procedurale acţiune 1 şi acţiune 2
dintre care se execută numai unul : fie acţiune 1 în cazul în care condiţia este adevărată, fie acţiune 2 în cazul în
care condiţia este falsă.
Cele două ramuri ale structurii alternative se închid apoi în acelaşi punct al structurii care determină continuarea
algoritmuluicu operaţiile din structura următoare structurii alternative.

forma generala: schema logica


dacă condiţie atunci
acţiune 1;
altfel
acţiune 2;
sfârşit_dacă

Exista si o forma generala simplificata: schema logica


dacă condiţie atunci
acţiune 1;
sfârşit_dacă;

ex : Minimul a doua numere pseudocod


citeste a,b
dacă a<b atunci
mini ←a
altfel
mini ←b
sfârşit_dacă
scrie mini

Structura repetitiva reprezinta executare repetata a unor instructiuni in functie de o conditie.


Exista mai multe tipuri de structuri repetitive(de scris forma generala in pseudocod, sch. Logica, interpretare,ex)
1).Structura cu numar cunoscut de repetitii (pentru FOR)
Structura repetitivă pentru

Sintaxă: Schema logica

Pentru contor=vali,valf,pas executa


instrucţinuni
Sfârşit Pentru

vali - valoare initiala pentru contor


valf - valoare finala pentru contor
pas - valoarea cu care creste variabila contor la fiecare pas
Executia instrucţiunii:
Pas 1: Se initializeaza variabila contor cu vali
Pas 2: Se evalueaza conditia contor<=valf;
Pas 3: Daca conditia este false se iese din for;
Daca conditia este adevarata se executa instructiunile, apoi se creste contorul cu valoare
pas(contor←contor+pas) si se trece la Pas2
Observaţii:
 Valoarea pas poate fi si negativa
 Dacă condiţia contor<=valf are de la început valoarea fals, instrucţiunile nu se execută nici măcar o dată.
Ex: Calculati produsul p=1*2*3*..*n
Date de intrare: n intreg.
Date de iesire:p intreg
Citeste n
p1
pentru i1,n,1 executa
pp*i
sfarsit pentru
Scrie p

2) Structura cu numar necunoscut de repetitii si cu test initial( cat timp WHILE)


Structura repetitivă cu test initial cât_timp

Sintaxă: Schema logica

cât_timp (condiţie) execută


instrucţinuni
sfârşit cât timp

Executia instrucţiunii:
Pas 1: Se evaluează condiţia
Pas 2: Dacă conditia este falsă, se iese din instrucţiunea cât_timp; Dacă conditia este adevărată, se execută
instructiunile, apoi se revine la Pas 1, la evaluarea conditiei.
Observaţii:
 Instrucţiunea se execută, cât timp valoarea condiţiei este adevărat
 Dacă condiţia are de la început valoarea fals, instrucţiunea nu se execută nici măcar o dată.
Ex: Calculati produsul p=1*2*3*..*n
Date de intrare: n intreg.
Date de iesire:p intreg
Citeste n;
p1 i1
cat_timp(i<=n)executa
pp*i
ii + 1
sfarsit cat_timp
Scrie p

3) Structura cu numar necunoscut de repetitii si cu test final (executa… cat timp DO-WHILE)
Structura repetitivă cu test final executa … cât_timp

Sintaxă: Schema logica

execută
instrucţinuni
cât_timp (condiţie)

Executia instrucţiunii:
Pas 1: Se executa instructiunile
Pas 2: Dacă conditia este falsă, se iese din instrucţiunea cât_timp;Dacă conditia este adevărată, se trece la Pas 1
Observaţii:
 Instrucţiunile se execută, cât timp valoarea condiţiei este adevărat
 Instrucţiunile se execută cel putin o dată.

Ex: Calculati produsul p=1*2*3*..*n

Date de intrare: n intreg.


Date de iesire:p intreg
Citeste n;
p1; i1;
executa
pp*i
ii + 1
cat_timp(i<=n)
Scrie p

4) Structura cu numar necunoscut de repetitii si cu test final (repeta ..pana cand REPEAT UNTIL )

Sintaxa: Schema logica

repeta
instrucţinune;
pana cand conditie

Executia instrucţiunii:
Pas1: Se execută secvenţa de instructiuni, apoi se verifică condiţia

Pas2: dacă condiţia este falsă, se execută din nou secvenţa(se trece la pasul 1); Dacă valoarea este adevărată, se
iese din repetare.
Observaţii:
 este un ciclu cu test final pentru că mai întâi se execută secvenţa şi apoi se verifică condiţia;
 este un ciclu cu număr necunoscut de paşi, numărul minim de execuţii asigurat pentru secvenţă este
1 (când din start condiţia este adevărată);

Ex: Calculati produsul p=1*2*3*..*n


Date de intrare: n intreg.
Date de iesire: p intreg
Citeste n
p1
i1
repeta
pp*i
ii + 1
pana cand( i>n)
Scrie p

1.4. Descrierea algoritmilor(programe pseudocod)

  Descrierea algoritmilor se poate face cu ajutorul schemelor logice, cu pseudocod sau cu un limbaj de
programare.
Programarea structurata a inceput la inceputul anilor 70. Este un concept cu o importanta fundamentala
in scrierea algoritmilor. In general, algoritmii se eleboreaza prin utilizarea exclusiva a anumitor structuri
(liniar, alternativa, repetitiva). Prin structura se intelege o anumita forma de imbinare a operatiilor cu
care lucreaza algoritmii.
Structuri de bază:

o structurile liniară
o alternativă
o repetitivă
2.Elemente de baza ale limbajului de programare C++

2.1. Vocabularul limbajului


Vocabularul limbajului este format din : setul de caractere, identificatori, cuvinte cheie, comentarii,
separatori
 Setul de caractere 1) Litere a,b,..z,A,B…Z
2) cifre 0,1,2,…9
3) caractere speciale @!#%<,.?/ etc.

 Identificatori - reprezintă numele dat entităţilor dintr-un program C++.


Pot fi nume de costante , variabile sau functii - incep cu literă sau underscore (_) şi pot
continua numai cu litere, cifre sau underscore
Ex: a12s, as33, _007
 cuvinte cheie - reprezinta instruntiunile limbajului - while,for,if , int ,cout,cin etc
 Comentarii // pentru un rand
/* pentru
mai
multe
randuri */
 Separatori space
, (virgula)
;
Enter

2.2. Constante.Identificatori
O constant este o valoare care nu se modifica pe parcursul executiei unui program. Se declare cu
cuvantul cheie „const”.
Constantele pot fi: intregi, constantelogice( booleene), reale, de tip catacter si sir de caractere.
 Constantele de tip intregi (int,long sau long long) sunt numere întregi: 45, -123, 0, 8965 etc.
 Constantele logice(booleene) – de tip bool sunt true şi false
 Constantele de tip float sau double sunt numere reale: 3.14, 1.6867, 0.0001, 7.0
 Constantele de tip caracter (char) reprezintă un singur caracter ASCII.
De exemplu, 'a', 'h', 'O', 'F'. Caracterele se pun întotdeauna între două apostrofuri.
Sirurile de caractere, se pun între ghilimele. Exemplu: "acesta este un string.".
Simbolul "P" este un string, nu un caracter de tip char.

Identificatorii - reprezintă numele dat entităţilor dintr-un program C++.


Pot fi nume de costante , variabile sau functii - incep cu literă sau underscore (_) şi pot continua numai
cu litere, cifre sau underscore
Ex: a12s, as33, _007
2.3. Notiunea de tip de data. Operatori aritmetici, logici si relationali
Un tip de date defineste multimea valorilor pe care le pot lua datele de tipul respectiv, modul de
reprezentare a acestora in memorie, precum si operatiile care se pot efectua cu datele respective. Ex: int
x; precizeaza ca x apartine [-2.147.483.648 , 2.147.483.647], se reprezinta in memorie pe 4 Byte(32
biti),operatii permise: +,-,*.%,/, etc

Orice limbaj de programare dispune de un set de tipuri predefinite (standard)ex:int, float, char etc .
Tipuri standard de date: 1)Tipul INTREG ex: 100 , -100 (char,int,long, long long,unsigned int..)
2)Tipul REAL ex. 2.1231, -123.32, 102(float,double,long double)

TIP MEMORIE LIMITE


OCUPATA

bool 1B true(1) false(0)


char 1B [0 , 255]
short int 2B [-32.768 , 32.767]
unsigned short int 2B [0 , 65.535]
Tip intreg

int 4B [-2.147.483.648 , 2.147.483.647]


unsigned int 4B [0 , 4.294.967.295]
long 4B [-2.147.483.648 , 2.147.483.647]
unsigned long 4B [0 , 4.294.967.295]
long long 8B [-9.223.372.036.854.775.808 ,
9.223.372.036.854.775.807]
unsigned long long 8B [0 , 18.446.744.073.709.551.615]
float 4B [1.17549e-038 , 3.40282e+038]
Tip real

double 8B [2.22507e-308 , 1.79769e+308]


long double 12B [3.3621e-4932 , 1.18973e+4932]

 Operatori aritmetici
+ (adunare) a+b
- (scadere) a-b
* (inmultire) a*b
% (modulo restul impartirii 10%3 este 1, 125%10 este 5)
/ (impartire sau div(=câtul))
1) / este „div” - atunci cand ambele numere din operatie sunt intregi ex:
13/2=6 5/2= 2
2) / „este impartire” - atunci cand cel putin unul din numere este un numar real
Ex:7.0/2=3.5

 Operatori logici
! not (negat)
&& and (si)
|| or (sau)
Ex: a<=b && a<c (explicatie: a<=b si a<c)
c!=a || c!=b (c diferit de a sau c diferit de b)
!a (explicatie: not a)
!(a<=b)  a>b
!(a<b)  a>=b
!(a!=b)  a==b

 Operatori relationali
> (mai mare)
< (mai mic
>= (mai mare si egal)
<= (mai mic si egal)
== (egal
!= (diferit)
Ex: (3>1) este adevarat(valoarea 1)
(3==1) este fals (valoarea 0)

2.4. Definirea tipurilor de date


In C++ exista posibilitatea definirii unor tipuri de date noi pe baza celor standard.
Definirea unor noi tipuri de date se face astfel:

typedef descriere_tip nume_tip;

Exemplu:
typedef float real; //se defineste tipul de date „real”

ex: suma a doua numere reale


#include<iostream>
using namespace std;
typedef float real;
real a,b,s;
int main()
{
cin>>a>>b;
s=a+b;
cout<<"suma este:"<<s;
return 0;
}

Tipul enumerat defineste o multime ordonata de valori prin enumerarea identificatorilor care
desemneaza valorile. Un tip enumerat poate primi un nume:
enum tip_enumerat
{identificator 1 [=valoare 1],identificator 2 [=valoare 2], ...identificator n [=valoare n]};
identificator 1 desemneaza cea mai mica valoare, avand numarul de ordine 0; ceilalti identificatori au
numerele de ordine.
Exemple:

#include<iostream>
using namespace std;
enum disciplina{mate,info,fizica};
disciplina disc_pref=info;
int a,b,s;
int main()
{ if(disc_pref==info)cout<<"El indrageste informatica";
else cout<<"El indrageste matematica sau fizica";
return 0;}

2.5. Variabile. Declararea variabilelor


Informatiile dintr-un program trebuie salvate undeva pentru a putea fi utilizate. Variabilele sunt
responsabile de salvarea informatiilor din program. Pentru a putea utiliza variabile acestea trebuie
declarate- adica se specifica tipul si numele variabilei.
Deci o variabila este o entitate caracterizata de un nume, un tip si o valoare.
Ex: int a; //numele variabilei este „a” si este de tipul intreg
float b=2.14; //numele variabilei este „b” si este de tipul real, fiind initializata cu valoarea 2.14

2.6. Declararea constantelor


O constant este o valoare care nu se modifica pe parcursul executiei unui program. Se declare cu
cuvantul cheie „const”.
Constantele pot fi: intregi, constantelogice( booleene), reale, de tip catacter si sir de caractere.
 Constantele de tip intregi (int,long sau long long) sunt numere întregi: 45, -123, 0, 8965 etc.
 Constantele logice(booleene) – de tip bool sunt true şi false
 Constantele de tip float sau double sunt numere reale: 3.14, 1.6867, 0.0001, 7.0
 Constantele de tip caracter (char) reprezintă un singur caracter ASCII.
De exemplu, 'a', 'h', 'O', 'F'. Caracterele se pun întotdeauna între două apostrofuri.
Sirurile de caractere, se pun între ghilimele. Exemplu: "acesta este un string.".
Simbolul "P" este un string, nu un caracter de tip char.
const int Maxim = 500; const double PI = 3.14;
const bool ok=true;
const char C=’z’;
const char VOCALE[]="aeiouAEIOU";

2.7. Structura programelor. Comentarii


Forma generala a unui program in C++ (Codeblocks) este:

#include <iostream> //include fisierul iostream(in out stream) in program.


//Precizeaza compilatorului ca se vor folosi în program entităţile
//(funcţii, clase, constante, etc.) din fişierul iostream ex: cout
using namespace std; //spatiul de nume std grupeaza logic functii si clase specifice P.O.O

int main() //programul (functia) principala,functia main() se


// executa prima data
{ //inceput program

cout <<"Salut" << endl; //corpul programului, contine instructiunile programului


return 0; //returnează valoarea 0 lui main() şi totodată opreşte execuţia funcţiei.

} //sfarsitul programului
Instrucţiunile reprezintă comenzi către calculator; sarcinile pe care acesta trebuie să le îndeplinească.
Toate instrucţiunile trebuie să se termine cu punct şi virgulă ;
Puteţi avea mai multe instrucţiuni pe aceeaşi linie atâta timp cât le separaţi prin punct şi virgulă.
In program pot exista comentarii . Comentariile nu fac nimic (nu sunt instrucţiuni).
Sunt de 2 feluri:
- comentariile întinse pe un rând (încep cu //);
- comentariile întinse pe mai multe rânduri (încep cu /* şi se termină cu */).
Programul de mai sus afisaza „Salut” pe ecran.
In C++ este diferenta intre literele mari si mici. Ex: Void ≠void , MAIN ≠main

2.8. Expresii. Instructiuni de atribuire


Datele (constante sau variabile) legate prin operatori, formeaza expresii. Operatorii care pot fi aplicati
datelor in functie de tipul datelor(operanzilor).
O expresie este o combinatie corecta din punct de vedere sintactic, formata din operanzi si
operatori. Expresiile, ca si operanzii,au tip si valoare.

Operatorii pot fi:

 unari (necesita un singur operand);++,--,&,-,!

ex:++a; --b; p=&a; a=-s; x= !y;

 binari (necesita doi operanzi) +,-.*./,% etc

x=a+b; y=a-b; n=n/10; c=a%10;

 ternari (trei operanzi).

Expresie condiţională :expresie ? expresie:expresie

Operatorul condiţional ? este un operator ternar. Prima expresie se evaluează şi dacă ea este diferită
de zero sau adevărată, rezultatuleste valoarea celei de-a doua expresii, altfel rezultatul este
valoareaexpresiei a treia. De exemplu expresia: z = (a>b) ? a : b; calculeaza maximul dintre a si b si
se atribuie maximul lui z.
Atribuirea (asignarea) se noteaza cu semnul „ = ”. Atribuirea este operaţia prin care puteţi schimba
valoarea unei variabile în mod direct.
Forma generala a unei atribuiri: variabila=expresie;
Mecanismul de atribuire funcţionează astfel: se calculeaza valoarea expresiei din partea dreapta si apoi
rezultatul expresiei se da partii din stanga, care trebuie să fie o variabilă.
x=2; // x primeste valoarea 2
a=a+1; //a creste cu 1
s=s+x; //s creste cu x
p=p*x; //p creste de x ori
x=y; // lui x i se atribuie valoarea lui y

2.9. Citirea/scrierea datelor


Citirea se face cu comanda cin – realizeaza citirea variabilelor de la tastatura
cin>>a; //citeste variabila a de la tastatura
cin>>a>>b>>x; //citeste variabilele a,b si x de la tastatura

Afisarea se face cu comanda cout – realizeaza afisarea pe ecran a unui mesaj si/sau a unei variabile
1)cout<<"Salut"; //afiseaza cuvantul salut pe ecran
2)cout<<s; //afiseaza cotinutul variabilei s pe ecran
3)cout<<"suma este: "<<s<<endl;
//daca variabila s are valoarea 201 se afiseaza pe ecran „ suma este: 201” si apoi cursorul
trece la rand nou
4)cout<<"suma este: "<<s<<endl <<"produsul este: "<<p;
//afiseaza suma este: 201
produsul este: 330 (pe randuri diferite din cauza lui „endl”)

2.10. Structuri de control.


In C exista mai multe tipuri de structuri de control: instructiunea compusa, structura alternativa,
structura repetitiva cu test initial, structura repetitiva cu test final, structura repetitiva cu numar
cunoscut de pasi.
 Instructiunea compusa- se foloseste cand se doreste sa se scrie mai multe instructiuni care sa
fie interpretate ca singura instructiune.
Forma generala:
{
Instructiune 1;
Instructiune 2;
Instructiune 3;
.
Instructiune n;
}
 structura alternativa if
f. generala variante a),b)

if(conditie) operatie1;
else operatie2;

varianta a)

if(conditie) operatie1;

varianta b)

Interpretare
Varianta a)
Daca conditia este adevarata se executa „operatie1”, iar daca este falsa se executa „operatie2”.
Nu se pot executa ambele operatii ( „operatie1” si „operatie2” ).
La executia if-ului se face „operatie1” sau „operatie2”, nu se poate sa nu se execute nici una.
Varianta b)
La if-ul simplificat se realizeaza executia „operatie1” daca condita este adevarata, si daca conditia este
falsa nu se face nimic.
Daca if-ul are mai multe operatii ( 2,3,..) acestea se grupeaza intre acolade {….}-instructiunea compusa.
Ex: Min a doua numere
#include <iostream>
using namespace std;
int a,b;
int main()
{
cout <<"Dati valori pentru a si b";
cin>>a>>b;
if (a<b)
cout << "minimul este:"<<a<<endl;
else
cout << "minimul este:"<<b<<endl;
return 0;
}
 structura alternativa switch

switch(expresie) {
case expresie1: instructiune1; break;
case expresie2: instructiune2; break;
...
case expresien: instructiunen; break;
default: instructiune
}
Observatie:
Expresie 1, 2, ...n, sunt expresii constante.

Interpretare:
Se evalueaza expresie; daca valoarea ei coincide cu una din valorile expresiilor specificate se executa
secventa corespunzatoare si toate secventele care urmeaza pana la intalnirea instructiunii break sau
pana la intalnirea '}'; altfel se executa default: instructiune;
Ex:
#include<iostream>
using namespace std;
char lit;
int main()
{

cin>>lit;
switch(lit) {
case 'a': cout<<"litera tastata este a "; break;
case 'A': cout<<"itera tastata este A"; break;
default: cout<<"litera tastata nu este A sau a";
}

return 0;
}

 structura repetitiva for

Este o structura repetitiva cu numar cunoscut de pasi


forma generala:
for( i=vali; i<=valf; i++ ) operatie1
sau
for( i=vali; i<=valf; i++ ) {
operatii1
}

Comanda for are trei sectiuni:


-prima =se precizeaza conditiile initiale (ex: i=1;)
- a doua =se precizeaza conditia finala (ex: i<=n;)
- a treia =se precizeaza pasul cu care se incrementeaza contorul i
Ordinea de executie:
se face initializarea,
se verifica conditia,daca conditia este adevarata se fac operatiile,
se incrementeaza pasul,
se verifica conditia,daca conditia este adevarata se fac operatiile,
se incrementeaza pasul,……
si tot asa pana conditia devine falsa

unde vali – valoare initiala


valf – valoare finala

executie:
i - ia valorile vali,vali+1,vali+2, ….valf-1,valf si pentru fiecare valoare a lui i se executa „operatie1”.

Ex1: for(i=1;i<=n;i++) cout<<i<<” ”; se afiseaza pe ecran 1 2 3 4 5 ..n

Exista for(i=n;i>=1;i--) cout<<i<<” ”; se afiseaza pe ecran n n-1 .. 3 2 1

Exista for(i=2;i<=11;i=i+2) cout<<i<<” ”; se afiseaza pe ecran 2 4 6 8 10

Ex2: Calculati suma s=1+2+3+…100

s=0;
for(i=1;i<=100;i++) s+=i; //sau s=s+i;
cout<<”suma este: ”<<s;

 structura repetitiva while (cu test initial)


Forma generala:
while(cond) instructiune1;

sau

while(cond){
instructiuni1;
}
Execututie: Daca conditia (cond) este adevarata se realizeaza executia repetata.
Cand conditia (cond) este falsa se iese din repetare.
Ex:
Suma a n numere dintr-un sir
#include <iostream>
using namespace std;
int i,n,x,s;
int main()
{
cout << "Dati un nr n:";
cin>>n; i=1;
while(i<=n){
cin>>x;
s+=x;
i++;
}
cout<<"Suma nr din sir este:"<<s;
return 0;
}

 structura repetitiva do.. while (cu test final)


Forma generala:

do{
instructiune1;
}while(cond);

Execututie: Daca conditia (cond) este adevarata se realizeaza executia repetata.


Cand conditia (cond) este falsa se iese din repetare.

Ex:

Suma a n numere dintr-un sir


#include <iostream>
using namespace std;
int i,n,x,s;
int main()
{
cout << "Dati un nr n:";
cin>>n; i=1;
do{
cin>>x;
s+=x;
i++;
} while(i<=n);
cout<<"Suma nr din sir este:"<<s;
return 0;
}

3. Subprograme predefinite

3.1. Subprograme. Mecanismul de transfer prin intermediul parametrilor

3.2. Proceduri si functii predefinite

 Functii matematice  - se afla in biblioteca cmath

o abs(x) returneaza modulul unui numar real


o sqrt(x) returneaza radicalul unui numar real
o tan(x)-calculeaza tangenta valorii marimii x de tip double.
o exp(x)-calculeaza valoarea functiei exponentiale(e la puterea x) pentru valoarea marimii
x de tip double.
o pow(x,y)-calculeaza x la puterea y,x,y de tip double.
o ceil(x)-calculeaza cea mai mica valoarea intreaga mai mare ca si x ceil(2.3) este 3.0
o floor(x)-calculeaza cea mai mare valoarea intreaga mai mica ca si x cfloor(2.6) este 2.0
4. Tipuri structurate de date

4.1. Tipul tablou

Tabloul este o structură de date statică (dimensiunea este fixă) care memoreză o succesiune de elemente
de acelaşi tip. Elementele tabloului sunt identificate prin indici.Cele mai utilizate tipuri de tablouri sunt
vectorii (tablouri unidimensionale) si matricile (tablouri bidimensionale).

 declarare: <tip> <identify nume tablou> [<ind1>][<ind2>]...;


Ex:
int a[20]; (vector cu 20 elemente primul element a[0], ultimul element a[19])
float b[10][20]; (matrice cu 10 linii, 20 coloane prima linie este 0, ultima linie este 9)
Numele unui tablou este un pointer constant având ca valoare adresa de început a tabloului.
 initializare
float c[6]={2.5,-6,7.3,-4.7}; //s-au initializat doar primele 4 elemente din cele 6 alocate
int d[]={1,2,3,4}; //s-a alocat zona de memorie pentru 4 intregi si s-au initializat
int mat[2][3]={{1,2,3},{4,5,6}};
 accesare elemente
a[i] elementul de pe pozitia i unde i=0,...,19 pentru vector (ex: a[3]=190; )
b[i][j] elementul de pe linia i coloana j unde i=0,...9; j=0,...19 pentru matrice(ex: a[3][2]=15; )
obs: Nu se poate folosi operatia de atribuire asupra a 2 tablouri, copierea trebuie făcută element cu
element.
 Operatii cu vectori
Citire de la tastatura de la indexul 0
cout<<"dati n"; cin >> n;
for (i = 0;i < n;i++){
cout<<"dati element"; cin >> a[i];
}
Afisare pe ecran
for (i = 0;i < n;i++) cout<< a[i]<< " ";
 Operatii cu matrici
Citire de la tastatura de la indexul 0
cout<<"dati m,n"; cin >>m>> n;
for (i = 0;i < m;i++)
for (j= 0;j < n;j++){
cout<<"dati element"; cin >> a[i][j];
}
Afisare pe ecran
for (i = 0;i < m;i++) {
for (j= 0;j < n;j++)
cout<< a[i][j]<<” ”;
cout<<endl;
}

4.2. Tipul inregistrare


Inregistrarea este o structură de date ce conţine date de diferite tipuri (neomogene) numite câmpuri.

 declarare tip structura

struct [<nume structura>]


{ <tip1> <nume11>,<nume12>,...; <tip2><nume21>,<nume22>,...;
...
}lista variabile;
Ex: struct persoana //s-a declarat o structura ”persoana” cu campurile nume, prenume,
{ char nume[20], nume[20]; // varsta si sex
int varsta;
char sex;};
 declarare variabile
persoana p1,p2;
 declarare/initializare

persoana p1={”Pop”,” Ana”,10,’f’};

//se initializeaza numele cu ”Pop” , prenumele cu ”Ana”, varsta cu 10, si campul ”sex”
cu ’f’

 accesare câmpuri – se specifica numele variabilei si apoi campul

p1.nume; p1.prenume; p1.varsta, p1.sex

 atribuire/copiere

p2 = p1; //presupune copiere câmp cu câmp, bit cu bit

4.3. Tipul sir de caractere


-reuneşte mai multe caractere sub "un nume comun".
 exista doua abordări
- vector de caractere – alocare statică
-pointer la caracter – alocare dinamica
Sfârşitul logic al vectorului este marcat prin ’\0’.
 Declarare
char s[255]; (max 254 caractere utile + ’\0’)
char *s2;
s2 = new char[20]; (max 19 caractere +’\0’)
 Initializare
char s[]=”ABC”; (lungime vector este 4, lungime sir este 3)

 accesare caractere
s[i] - este caracterul de pe pozitia i ,i=0,...254, s1[254] este ’\0’
s[0] - este primul caracter din sir
 operatori
- lungime sir
strlen(s2) - returneaza numarul de caractere din sir
- copiere
strcpy(destinatie,sursa) ex: strcpy(s1,s2); (copiere totala)
strncpy(destinatie,sursa,n) (copiere max n caract. ) ex: strncpy(s1,s2,2)
- comparare
strcmp(s1,s2);
stricmp(s1,s2); (nu se face diferenta intre litere mici si mari)
- funcţiile de mai sus returneaza o valoare:
< 0 (dacă s1<s2 – ordine lexicografica)
= 0 (daca sunt siruri identice)
>0 (dacă s1>s2 – ordine lexicografica)
- Concatenare
strcat(s1,s2); - adauga la sirul s1 sirul s2 (maxim n caractere) la sirul s1

strncat(s1,s2,n); - adauga la sirul s1 maxim n caractere din sirul s2

 Subsir
strstr(s1,s2) - verifica daca subsirul s2 este subsir al lui s1 si returneaza adresa de început a
subşirului s2 în s1 dacă există şi NULL (0) în caz contrar.

 conversii şir de caractere şi valori numerice

- conversie sir de caractere la int - functia atoi(sir); ex: int n; n=atoi(”1234”);


- conversie sir de caractere la long - functia atol(sir); ex: long n; n=atol(”1234”);
- conversie sir de caractere la float - functia atof(sir); ex: float n; n=atof(”1234.113”);
- conversie sir de caractere la si double- functia atod(sir); ex: double n; n=atdi(”1234.52”);

-conversie int la sir de caractere itoa(val,sir,baza);


ex: char s[10]; int i=234; itoa(i,s,7); -transforma numarul i scris in baza 7 in sirul s

-conversie long la sir de caractere ltoa(val,sir,baza)


ex: char s[10]; long j=234; ltoa(j s,10); -transforma numarul j scris in baza 10 in sirul s

6. Descrierea algoritmilor(programe pseudocod)

6.1. Probleme ce opereaza asupra cifrelor unui numar

(se stie)

6.2 Divizibilitate.Numere prime. Algoritmul lui Euclid

Cmmdc –ul a doua numere se poate calcula cu Algoritmul lui Euclid (exista doua varianta prin scaderi
repetate sau prin impartiri repetate)

Algoritmul lui Euclid prin scaderi repetate – se scade din x pe y (daca x>y),sau se scade din y pe x
(daca y>x) in mod repetat până x devine egal cu y

cout << "Dati doua nr x si y:"; Ex:


cin>>x>>y; 12 | 10
while (x!=y){ 2 | 10
if(x>y) x=x-y; 2 | 8
else y=y-x; 2 | 6
} 2 | 4
cout<<"cmmdc a nr x si y este:"<<x; 2 | 2
Stop => cmmdc=2

Algoritmul lui Euclid prin impartiri repetate– împarte x la y, apoi împarte y la x%y si tot asa p ână
restul obtinut devine 0. Împartitul este cmmdc.

cout << "Dati doua nr x si y:"; 12:10=1 rest 2


cin>>x>>y; 10:2=5 rest 0(stop) =:cmmdc este 2
do{
rest=x%y;
x=y;
y=rest;
}while (rest!=0);
cout<<"cmmdc a nr x si y este:"<<x;

6.3 Sirul lui Fibonacci.Calculul unor sume cu termen general dat


Sirul lui Fibonacci este un celebru sir realizat dupa regula: fiecare număr reprezintă suma a două
numere anterioare, începând cu 0 și 1. Astfel, șirul obtinut este: 0,1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
144..etc.

Calculul termenului n al sirului lui Fibonacci cu memorie O(1)


cout << "Dati n:";
cin>>n;
a=0;b=1;
i=2;
do{
c=a+b;
a=b;
b=c;
i++;
}while (i<n);
if(n==1)cout<<"termenul n a lui Fibonacci este:"<<0;
else cout<<"termenul n a lui Fibonacci este:"<<c;

Calculul termenului n al sirului lui Fibonacci cu memorie O(n)


#include <iostream>
using namespace std;
int a[100],i,n;
int main()
{
cout << "Dati n:";
cin>>n;
a[1]=0;a[2]=1;
for(i=3;i<=n;i++)a[i]=a[i-1]+a[i-2];
cout<<"termenul n a lui Fibonacci este:"<<a[n];
return 0;
}

6.4 Determinare minim/maxim


6.5. Metode de ordonare
Un algoritm de sortare este un algoritm care pune elementele unei liste într-o anumită
ordine(crescator,descrescator,lexicografic)
Metoda Bulelor(Bubble sort) - complexitate timp O(n2)
Idee: Se parcurge repetat sirul de la inceput la sfarsit si se compara elementele vecine a [i] si a[i+1] si
daca este cazul se inverseaza. La fiecare inceput de parcurgere se presupune initial că șirul este deja
ordonat(ord=1), si daca in timpul parcurgerii se gasesc perechi vecine ce se inverseaza se pune sirul pe
neordonat(ord=0), ceea ce va impune inca o parcurgere a sirului.
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
do{
ord=1;
for(i=1;i<n;i++)
if(a[i]>a[i+1]){
swap(a[i],a[i+1]);
ord=0;
}
} while(ord==0);
for(i=1;i<=n;i++) cout<<a[i]<<" ";
ex: ordonare bubble sort pas cu pas
12 3 45 6 -1 20
3 12 45 6 -1 20
3 12 6 45 -1 20
3 12 6 -1 45 20
3 12 6 -1 20 45
-------------------------
3 12 6 -1 20 45
3 6 12 -1 20 45
3 6 -1 12 20 45
-------------------------
3 6 -1 12 20 45
3 -1 6 12 20 45
-------------------------
3 -1 6 12 20 45
-1 3 6 12 20 45

Metoda inserției - complexitate timp O(n2)-ordonarea cartilor de joc


Algoritmul de sortare prin inserţie construieşte pas cu pas lista de elemente sortate, adăugând la ea câte
un element la un moment dat. La fiecare pas un element este extras din din lista iniţială şi este introdus
în lista de elemente sortate. Elementul este inserat în poziţia corectă în lista sortată, astfel încât ea să
rămână sortată în continuare.
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++){
aux=a[i];
k=i;
while(k>1&&a[k-1]>aux)
{
a[k]=a[k-1];
k--;
}
a[k]=aux;
}
for(i=1;i<=n;i++) cout<<a[i]<<" ";
Ex numeric: sirul verde este deja ordonat; elementul rosu este cel ce va fi inserat in sirul verde
12 3 45 6 -1 20
12 3 45 6 -1 20
3 12 45 6 -1 20
3 12 45 6 -1 20

3 6 12 45 -1 20
-1 3 6 12 45 20
-1 3 6 12 20 45

Metoda selectiei - complexitate timp O(n2)


Sortarea prin selecţia directa- inseamna selectarea minimul(sau maximului) din pozitia i in dreapta şi
plasarea lui pe poziţia sa finală(pozitia i) direct în vector.

cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++){
mini=a[i];k=i;
for(j=i+1;j<=n;j++)
if(a[j]<mini)
{mini=a[j];k=j;}
swap(a[i],a[k]);
}
for(i=1;i<=n;i++) cout<<a[i]<<" ";
Ex: numeric (se afla minimul din sirul pe fond roz )
12 3 45 6 -1 20
-1 3 45 6 12 20
-1 3 45 6 12 20
-1 3 6 45 12 20
-1 3 6 12 45 20
-1 3 6 12 20 45

Metoda numărării - complexitate timp O(n2)


Se ia fiecare element a[i] şi îl vom compara cu fiecare alt element a[j] din şir pentru a numara cate
elementelor care sunt mai mici decât a[i] , respectiv a[j].Rezultatele numararii vor fi in k[i], respectiv k[j].
Pozitia pe care va sta elementul a[i] va fi k[i]+1.

cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]>a[j])k[i]++;
else k[j]++;
for(i=1;i<=n;i++)b[k[i]+1]=a[i];
for(i=1;i<=n;i++)cout<<b[i]<<" ";

6.6. Interclasarea
Se considera doi vectori ordonati(sa presupunem crescator)
Se considera doua siruri de elemente ambele ordonate( fie crescator). Interclasarea înseamnă relizarea
unui sir rezultant ordonat crescator cu elementele celor doua siruri.
Se percurg simultan cei doi vectori si se compara un element dintr-un vector cu un element din celălalt
vector. Elementul cu valoarea mai mic
este copiat în vectorul destinatie si se avanseaza la urmatorul element dupa cel copiat. Se continua
procesul pana cand se termina unul dintre cele doua siruri restul sirului ramas este copiat direct in sirul
rezultant.
#include <iostream>
using namespace std;
int i, j, n,k,a[100], b[100], c[100],m;
int main()
{
cin>>n>>m;
for(i=1; i<=n; i++)
cin>>a[i];
for(j=1; j<=m; j++)
cin>>b[j];
i=j=k=1;
while(i<=n and j<=m)
if(a[i]<=b[j]) c[k++]=a[i++];
else c[k++]=b[j++];
while(i<=n) c[k++]=a[i++];
while(j<=m) c[k++]=b[j++];
for(i=1; i<=k-1; i++) cout<<c[i]<<' ';
return 0;
}

6.7. Metode de cautare (secvențială,binară)


Căutarea secvențială complexitate O(n)
Se considera un sir de numere si un element x. Se cere sa se caute elementul x in sirul de numere si sa se
precizeze daca elementul exista in sir.

cin>>n>>x;
for(i=1;i<=n;i++) cin>>a[i];
gasit=false;
for(i=1;i<=n;i++)
if(a[i]==x) gasit=true;
if(gasit==true)cout<<"elementul exista";
else cout<<"elementul nu exista";

Căutarea binară- complexitate O(log(n))


Se considera un sir de numere ordonate si un element x. Se cere sa se caute elementul x in sirul de
numere si sa se precizeze daca elementul exista in sir.
Algoritmul funcționează pe baza tehnicii divide et impera. Valoarea căutată este comparată cu cea a
elementului din mijlocul listei. Dacă e egală cu cea a acelui element, algoritmul se termină. Dacă e mai
mare decât acea valoare, algoritmul se reia, de la mijlocul listei +1 până la sfârșit, iar dacă e mai mică,
algoritmul se reia pentru elementele de la începutul listei până la mijloc-1.b Întrucât la fiecare pas
numarul de elemente din mulțima din care se efectuează căutarea se înjumătățește, algoritmul are
complexitate logaritmică.
Ex1:
N=7, x=20
3 6 20 23 123 200 231 st=1 dr=7 mij=(1+7)/2=4( 23 ) x<23

3 6 20 23 123 200 231 st=1 dr=3 mij=(1+3)/2=2 (6 ) x>6

3 6 20 23 123 200 231 st=3 dr=3 mij=(3+3)/2=3 (20 ) x=20


-- Stop
Ex2:
N=7, x=21
3 6 20 23 123 200 231 st=1 dr=7 mij=(1+7)/2=4( 23 ) x<23

3 6 20 23 123 200 231 st=1 dr=3 mij=(1+3)/2=2 (6 ) x>6

3 6 20 23 123 200 231 st=3 dr=3 mij=(3+3)/2=3 (20 ) x>20


--

3 6 20 23 123 200 231 st=4 dr=3 Stop


#include <iostream>
using namespace std;
int a[1000],n,i,j,m,x,gasit;
int cauta_bin(int a[1000],int n, int x)
{
int mij,st=1,dr=n,gasit=0;
do
{
mij=(st+dr)/2;
if (a[mij]==x) gasit=1;
else if(a[mij]<x) st=mij+1;
else dr=mij-1;
}while(st<=dr && gasit==0);
if (gasit==1) return mij;
else return 0;}
int main()
{
cin>>n>>x;
for(i=1;i<=n;i++) cin>>a[i];
cout<<cauta_bin(a,n,x);

return 0;
}
6.8. Analiza complexitatii unui algoritm

Complexitatea reprezintă o estimare a volumului de resurse de calcul necesat executiei unui


algoritmului. Prin resurse se intelege spatial de memorie si timpul necesar executiel algoritmului.
Complexitatea memoriei se referă la volumul de memorie necesar calculelor, iar cea în timp se referă
la timpul necesar efectutării calculelor, ambele fiind exprimate ca funcții de n, unde n este mărimea
datelor de intrare.
Complexitatea in timp- este o masura a timplului de executare a algoritmului
Complexitatea este exprimată folosind notația O, notație ce reține doar termenul care crește cel mai
repede odată cu creșterea lui n, deoarece acest termen are impactul cel mai mare, ceilalți termeni
devenind neglijabili pentru valori mari ale lui n. De exemplu, dacă un algoritm are complexitatea O(n)+
O(n2)+ O(n)+ O(nlog(n, atunci complexitatea lui este O(n 2).
Complexitatea memoriei - este o masura a cantitatii de memorie utilizata
1)complexitatea memorie O(1)
Daca programul nu foloseste tablouri atunci complexitatea memoriei este O(1)
Ex: Suma elementelor unui sir.
cin>>n;
for(i=1;i<=n;i++){ cin>>x;s+=x;}
cout<<s;
2)complexitatea memorie O(n)
Daca programul foloseste tablouri unidimensionale, vectori atunci complexitatea memoriei este O(n)
Ex: Suma elementelor unui sir.
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++) s+=a[i];
cout<<s;
3)complexitatea memorie O(n2)
Daca programul foloseste tablouri bidimensionale, matrici atunci complexitatea memoriei este O(n 2)
Ex: Suma elementelor unei matrici.
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) s+=a[i][j];
cout<<s;
Complexitatea in timp- este o masura a timplului de executare a algoritmului. Cu cat algoritmul
este mai eficient cu atat complexitatea in timp este mai mica.
Categorii de comolexitate in timp:
O(1)< O(log(n))< O(n)< O(n log(n))< O(n2)< O(n2 log(n))< O(n3)< ..<O(nk)< O(2n)< O(n!)

Ex:
 Complexitate timp - O(1) –in general se fac cateva calcule

Calculati suma s=1+2+3+..+n


cin>>n;
s=n*(n+1)/2;
cout<<s;

 Complexitate timp - O(log(n)) cautarea binara


 Complexitate timp -O(n) - se fac calcule in cadrul unei structuri repetitive for,while, do
while
Ex1: Calculati suma s=1+2+3+..+n
cin>>n;
for(i=1;i<=n;i++) s+=i;
cout<<s;

Ex2: Suma elementelor unui sir.


cin>>n;
for(i=1;i<=n;i++){ cin>>x;s+=x;}
cout<<s;

 Complexitate timp -O(n log(n)) QuickSort, MergeSort


 Complexitate timp -O(n2) - se fac calcule in cadrul unor structuri repetitive imbricate

Ex: Suma elementelor unei matrici.


cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) s+=a[i][j];
cout<<s;

ordonarea Bubble Sort, ordonarea prin selectie si ordonarea prin insertie si prin numarare are
tot complexitate O(n2)
7. Subprograme definite de utilizator

Subprogramele sunt părţi ale unui program, identificabile prin nume, care se pot apela la
cerere prin intermediul acestor nume.

7.1. Proceduri si functii


O functie este un subprogram descris intr-un limbaj de programare.
Functiile sunt de doua tipuri:
o Functie ce returneaza o valoare
o Functie ce nu returneaza nici o valoare (in C++ echivalent cu procedura)
 Declarare si apel
Declararea:
tip_returnat nume_funcţie (lista parametrilor formali) //acesta este antetul functiei
{
instrucţiune; // corpul funcţiei
}
tip_returnat: -reprezintă tipul rezultatului calculat şi returnat de funcţie şi poate fi: int, char, char*, long,
float, void, etc. În cazul în care tipul rezultatului este diferit de void, corpul funcţiei trebuie să conţină
cel puţin o instrucţiune return. Înstrucţiunea return va specifica valoarea calculată şi returnată de
funcţie care trebuie să fie de acelaşi tip ca şi tip_returnat.
nume_funcţie : -reprezintă numele dat funcţiei de către cel ce o defineşte, pentru a o putea apela.
lista parametrilor formali -reprezintă o listă de declaraţii de variabile separate prin virgulă. Această listă
poate să fie şi vidă.
instrucţiune:-este o instrucţiune vidă sau o instrucţiune simplă sau o instrucţiune compusă.
Apelul
nume_funcţie (lista parametrilor efectivi);
Aplelul se face prin specificarea numelui functiei urmat de lista parametrilor;
In cazul unei functii ce returneaza o valoare aplelul functiei va fi implicat intr-o operatie deoarece
numele functiei are o valoare returnata.

 Parametri formali si parametri efectivi(actuali)


Parametri formali apar în antetul subprogramului şi sunt utilizaţi de subprogram pentru
descrierea abstractă a unui proces de calcul .
Parametri actuali apar în instrucţiunea de apelare a unui subprogram.
 Parametri transmisi prin valoare, parametri transmisi prin referinata
La apelul prin valoare – se transmite o copie a parametrului actual.
Valorile transmise la apelul unei functii sunt memorate în stivă. Datorită faptului că, după
terminarea execuţiei unei functii, stiva este eliberată, în cazul apelului prin valoare parametrul
actual nu se modifică (se operează asupra unei copii a parametrului efectiv)
La apel prin referinţă - se transmite adresa parametrului actual.
În cazul apelului prin referinţă, functia, cunoscând adresa parametrului actual, acţionează direct
asupra locaţiei de memorie indicată de aceasta, modificând valoarea parametrului actual.
În C++, implicit apelul este prin valoare. Pentru a specifica un apel prin referinţă, în lista
parametrilor formali, numele parametrului formal va trebui precedat de cuvântul simbolul &.

 Variabile locale si variabile globale, domeniu de vizibilitate


Variabile locale
Variabilele locale sunt variabilele ce se declara în interiorul unei funcţii.
Ele sunt vizibile doar de funcţia care le-a declarat.
Variabilele locale au initial o valoare reziduala diferita de 0.
Variabile globale
Variabilele globale sunt declarate înafara oricărei funcţii.
Ele pot sunt vizibile (pot fi utilizate) în tot programul (în programul principal şi în functii) din
momentul declarării lor.
Variabilele globale sunt initializate cu 0.
Ex1: de trasmitere prin valoare; parametri actuali x si y trasmit valoarea parametrilor formali a si b
#include <iostream>
using namespace std;
int x,y,s; //variabile globale
int suma(int a,int b){ //suma a doua numere a,b parametri formali
int s; //variabile locale s,a,b
s=a+b;
return s;
}
int main()
{
cin>>x>>y;
g<<"suma este:"<<1+suma(x,y)<<'\n'; //parametri efectivi x,y
return 0;
}

Ex2: de trasmitere prin adresa; Parametrul actual ss este transmis prin adresa parametrului formal s;
parametri actuali x si y trasmit valoarea parametrilor formali a si b
#include <iostream>
using namespace std;
int x,y,ss; //variabile globale
void suma(int a, int b, int &s){ //suma a doua numere parametrul s – trasmitere prin adresa
s=a+b;
}
int main()
{
cin>>x>>y;
suma(x,y,ss); //apel functie void; parametri efectivi x,y,ss; parametrul ss este trasmis prin adresa
g<<"suma este:"<<ss<<'\n';
return 0;
}
7.2. proiectarea modulara a rezolvarii unei probleme
Prin proiectare(programare) modulară înţelegem metoda de proiectare(programare) a unui algoritm
pentru rezolvarea unei probleme prin folosirea modulelor.
Modulul este considerat o unitate structurală de sine stătătoare, fie program, fie subprogram, fie o
unitate de program.
Programarea modulară se bazează pe descompunerea problemei în subprobleme şi proiectarea şi
programarea separată a subalgoritmilor corespunzători.
Avantajele programării modulare:
• Descompunerea unei probleme complexe în subprobleme este un mijloc convenabil şi eficient de a
reduce complexitatea.
• Testarea unui modul se poate face mult mai uşor decât testarea întregului algoritm.
• Permite munca mai multor programatori. S-a ajuns astfel la munca în echipă, prin care se ajunge la
scurtarea termenului de realizare a produsului program.
• Modulele se pot refolosi ori de câte ori avem nevoie de ele. Astfel, s-a ajuns la compilarea separată a
subprogramelor şi la păstrarea subprogramelor obţinute în biblioteci de subprograme, de unde ele se
pot refolosi la nevoie.
• Reutilizabilitatea acestor subprograme duce la mărirea productivităţii în programare, dar şi la
creşterea siguranţei în realizarea unui produs corect.

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