Sunteți pe pagina 1din 131

Cuprins

Vocabular pag 3
Citirea,afisarea si atribuirea pag 3
Fisiere
Vectori
Matrici
Functii pag 32
Tipul string
Tipul sir de caractere cu char
Tipul struct
Liste alocate static
Pointeri
http://www.dponline.ro/articol.php?idarticol=77
Codeblocks

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

#include <iostream> //include fisierul iostream(in out stream) in program. Fisierul contine
// declaratiile unor functii pt. operatii de intrare/ iesire
using namespace std; //spatiul de nume std grupeaza logic functii si clase specifice P.O.O

int main() //programul (functia) principala


{ //inceput program

cout <<"Salut" << endl; //corpul programului


return 0;

} //sfarsitul programului

Programul de mai sus afisaza „Salut” pe ecran.


In C++ este diferenta intre literele mari si mici. Ex: Void ≠void , MAIN ≠main

Tipuri standard de date: 1)Tipul INTREG 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
Tip intreg

bool 1B true(1) false(0)


char 1B [0 , 255]
short int 2B [-32.768 , 32.767]
unsigned short int 2B [0 , 65.535]
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]
Tip real

float 4B [1.17549e-038 , 3.40282e+038]


double 8B [2.22507e-308 , 1.79769e+308]
long double 12B [3.3621e-4932 , 1.18973e+4932]

Afisarea momoriei ocupate si a limitelor datelor pentru un tip specificat se face:


g << "Dimensiune int: " << sizeof(int) << endl;
g << "Limite: " << numeric_limits<int>::min() << ' ' << numeric_limits<int>::max() <<endl;
VOCABULARUL
Setul de caractere 1) Litere a,b,..z,A,B…Z
2) cifre 0,1,2,…9
3) caractere speciale @!#%<,.?/ etc.

Identificatori - nume de costante , variabile sau functii - incep cu o litera sau cu _ urmata de litere
sau cifre. Ex: a12s, as33, _007

Cuvinte cheie - while,for,if , int ,cout,cin etc


Comentarii // pentru un rand
/* pentru
mai
multe
randuri */
Separatori space
, (virgula)
;
Enter

Citirea,afisarea si atribuirea

Citirea ( 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 (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 continutul 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”)
Atribuirea ( = )
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
Probleme
1.Suma a doua numere
#include <iostream>
using namespace std;
int a,b,s;
int main()
{
cout << "dati doua numere";
cin>>a>>b;
s=a+b;
cout<<"suma este:"<<s;
return 0;
}
1.1)Suma a trei numere
1.2)Produsul a 4 numere
2.Aria unui dreptunghi
#include <iostream>
using namespace std;
int l,L,aria;
int main()
{
cout << "dati latimea si lungimea dreptunghiului";
cin>>l>>L;
aria=l*L;
cout<<"aria dreptunghiului este:"<<aria;
return 0;
}
2.1)Gigel este un mare mincinos. El spune in fiecare zi cate o minciuna si drept urmare ii creste
nasul cu y cm dupa fiecare minciuna. Initial lungimea nasului lui Gigel este de x cm. Se cere sa se
afiseze care este lungimea nasului lui Gigel dupa n zile, stiind ca el spune in fiecare zi cate o
minciuna.

3.Media aritmetica a 3 numere


#include <iostream>
using namespace std;
int a,b,c;
float med;
int main()
{
cout << "trei numere a,b,c:";
cin>>a>>b>>c;
med=(float)(a+b+c)/3;
cout<<"media este:"<<med;
return 0;
}
10/3,5 = 2.85
11/4 = 2
(float)11/4 = 2.75
Operatori in C++

a)Operatori aritmetici pe numere intregi


+ (adunare) a+b
- (scadere) a-b
* (inmultire) a*b
% (modulo, restul impartirii 10%3 este 1, 125%10 este 5)
12%3=0
12%10=2
34%10=4
125%10=5
x%10= ultima cifra a lui x
235%100=35
x%100=??
12%2=0
4%2= 0
124%2=0
x%2==0 => x este par

13%2=1
5%2= 1
125%2=1
x%2==1 => x este impar
x%7==0 => x se divide cu 7
x%y==0 => x se divide cu y

( / )div = catul
13/2=6
5/2= 2
125/2=62
36/10=3
128/10=12
x/10 =x fara ultima cifra
x/100=???
12354/100=123
Ex:
#include <iostream>
using namespace std;
long long a,b,c,s,p;
int main()
{
cout<<"Dati doua numere";
cin>>a>>b;
cout<<"a mod b este:"<<a%b;
return 0;
}
/ (impartire sau div(=câtul))
1) / este „div” - atunci cand ambele numere din operatie sunt intregi
#include <iostream>
using namespace std;
int b , a, x;
int main() {
cout << "dati a si b";
cin >> a >> b;
x = a / b;
cout << "x=" << x << endl;
return 0;
}
Pentru a=101 si b=20 se afiseaza 5

2) / „este impartire” - atunci cand cel putin unul din numere este un numar real
#include <iostream>
using namespace std;
float b , a, x;
int main() {
cout << "dati a si b";
cin >> a >> b;
x = a / b;
cout << "x=" << x << endl;
return 0;
}
Pentru a=101 si b=20 se afisaza 5.05
Daca avem int a; si float b; sau float a; si int b; rezultatul afisat va fi acelasi.

Impartirea a doua numere intregi se face prin conversia catre un numar real cu comanda „(float)”
#include <iostream>
using namespace std;
int a,b;
float x;
int main() {
cout << "dati a si b";
cin >> a >> b;
x = a / (float)b; //sau (float)a/b; sau (float)a/(float)b;
cout << "x=" << x << endl;
return 0;
}
Daca a=101 si b=20 se afisaza 5.05
In C++ se pot face atribuiri de genul:
1) int <-float

#include <iostream>
using namespace std;
int a;
float x;
int main() {
cout << "dati x";
cin >> x;
a=x;
cout << "a=" << a << endl;
return 0;
}
Daca x=2.35 se afiseaza 2 (a primeste doar valoarea 2 nu si 0.35)
2) float <- int
Daca la programul anterior se face atribuirea float x=a; (se citeste a, int a=100) in x se va memora
100.00
double b;
??? b-(int)b

b) Operatori relationali
> (mai mare)
< (se subintelege!!!)
>= (mai mare si egal)
<= (mai mic si egal)
== (egal !!!!!!!)
!= (diferit)

c) Operatori de incrementare/decrementare
++ (incrementare cu 1 adica creste cu 1)
--(decrementare cu 1 adica scade cu 1)
a++ ( explicatie: a=a+1; a creste cu 1)
++a (a creste cu 1)
a-- ( explicatie: a=a-1; a scade cu 1)
--a (a scade cu 1)
#include <iostream>
using namespace std;
int a,b;

int main() {
cout << "dati a si b";
cin >> a>>b;
a++;b--; // sau echivalent ++a;--b;
cout << "a="<<a << endl;
cout << "b="<<b << endl;
return 0;
}

Pentru a=100 si b=20 se afisaza a=101 si b=19


Obs:
++a este diferit de a++ daca “a” este implicat intr-o operatie
#include <iostream>
using namespace std;
int a,b,s;
int main() {
cout << "dati a si b";
cin >> a>>b;
s=b+(++a); //mai intai se face ++a si apoi se face s=b+a
cout << "a="<<a << endl;
cout << "s="<<s << endl;
return 0;
}
Daca a=100 si b=20 se afiseaza a=101 si s=121

Daca se inlocuieste s=b+(++a); cu s=b+(a++); se afiseaza 120 (se face mai intai s=b+a si apoi se face
a++)

Ex 1:
a=3;  a=3;
b=++a; => b=4 si a=4 a++;b=a;

ex2:
a=3;  a=3;
b=a++; => b=3 si a=4 b=a;a++;

d) 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 (atentie !!!!!!!!!!!!!)
!(a<b)  a>=b (atentie !!!!!!!!!!!!!)
!(a!=b)  a==b (atentie !!!!!!!!!!!!!)

e) Operatori de atribuire
= se da (ex: a=x; a=3;)
*= (p=p*a  p*=a)
+= (s=s+a  s+=a)
-= (s=s-a  s-=a)
/= (x=x/10  x/=10)
%= (cif=cif%10  cif%=10)
&=
|=
^=

Tipul char
- Se foloseste pentru memorarea unui caracter
- (int) in fata unui caracter returneza codul ASCII a caracterului
- (char) in fata unui numar returneaza caracterul cu codul ASCII corespunzator numarului
Ex1:
#include <iostream>
using namespace std;
char a,b,c;
int main()
{
cout<<"dati un caracter " ;
cin>>a;
cout <<"caracterul citit este: " <<a<<" si are codul ASCII "<<(int)a<<endl;
b=82; // se memoreaza caracterul cu codul ASCII 82(82 este codul ASCII a R)
cout<<b<<" are codul ASCII "<<(int)b<<endl; //afiseaza caracterul cu codul ASCII 82
c='*'; //se memoreaza caracterul *
cout<<c<<" are codul ASCII "<<(int)c<<endl; //afiseaza caracterul * si codul sau ASCII 42
return 0;
}

Ex2:
#include <iostream>
using namespace std;
int x;
int main()
{
cout<<"dati un numar intre 0 si 127 " ;
cin>>x;
cout <<"caracterul cu codul ASCII introdus este: " <<(char)x<<endl;
x=x-1;
cout<<"caracterul care se afla inaintea sa este: " <<(char)x<<" "<<endl;
return 0;
}
Ex3:
//afisati cel mai mare caracter din doua citite, si caracterul dinainte si dupa primul caracter citit
#include <iostream>
using namespace std;
char a,b,c,d;
int main()
{
cout<<"dati doua caractere " ;
cin>>a>>b;
if(a>b)cout<<"caracterul mai mare este "<<a;
else cout<<"caracterul mai mare este "<<b;
cout<<endl;
c=a-1;d=a+1;
cout<<"caracterul care se afla inaintea sa este: " <<c<<" si cel dupa el este "<<d<<endl;
return 0;
}
/* for(char c=1;c<127;c++){
cout<<c<<" -> "<<(int)c<<" ";
if(c%8==0)cout<<endl;
}*/
f) Operatori logici pe biti – actioneaza la nivel de bit pe numere (adica pe reprezentarea
numarului in baza 2 !!!)
<< deplasare la stanga
>> deplasare la drepta
& si
| sau
^ sau exclusiv(xor)
~ not
A b a&b a|b a^b
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
~1=0
~0=1

Operatorul deplasare la stanga „<<” Operatorul deplasare la dreapta „>>”


a=3; a=17;
cout<<(a<<2); cout<<(a>>2);
3(10)=11(2) => 1100(2) deplasat => 12(10) deci 17(10)=10001(2) => 100(2) deplasat => 4(10) deci
(3(10)<<2)=12(10) (17(10)>>2)= 4(10)
Practic a<<x este a*2x Practic a>>x este a/2x (div)
a=1; a=13;
cout<<(a<<3); se afiseaza 8 ( 1000 ) cout<<(a>>3); se afiseaza 1

Operatorul si „&” Operatorul sau „|”


a=13; b=7; a=13; b=7;
cout<<(a&b); se afisaza 5 cout<<(a|b); se afisaza 15
13(10)=1101(2) 13(10)=1101(2)
7(10)= 0111(2) 7(10)= 0111(2)
& 0101(2) =5(10) | 1111(2) =15(10)

Operatorul sau exclusiv „^” Operatorul not „~”


a=13; b=7; ~1101=0010
cout<<(a^b); se afisaza 9
13(10)=1101(2)
7(10)= 0111(2)
1010(2) =10(10)
Prioritatea operatorilor(în ordine descrescătoare a priorității)
1. ( )[ ] paranteze rotunde, paranteze vectori (a+b)*(a-r), a[i+2]*3
2. ! ~ + - ++ -- not logic !(a>b), not pe biti, +5,-5,++a,--a
3. * -> pointeri
4. * / % inmultire, div sau impartire, mod
5. + - a+b,a-b
6. >> << deplasare pe biti
7. < > <= >= operatori relationali
8. == != operatori relationali egal, diferit
9. & „si” operator logic pe biti
10. ^ „sau exclusiv” operator logic pe biti
11. | „sau” operator logic pe biti
12. && and„si” operator logic
13. || or „sau” operator logic
14. = += -= /= %= >>= <<= operatori de atribuire
15. ++, -- a++;b--;
Ex:
1+1<<2 R:16
3%2*5=(3%2)*5=1*5=5
a<=b && z>c  (a<=b) && (z>c)
b=a[i++]+4 b=a[i]+4; i++;
a>b||c>b&&d<c  (a>b)||(( c>b)&&(d<c))
!4=0 !0=1 !!1=1 !!2=!0=1
a>!b && x<=y  !b , (a>!b) &&( x<=y)
a>b==a>c  (a>b)==(a>c)
de Morgan
not(a and b)=not a or not b not(a and b and c)=not a or not b or not c
not(a or b)=not a and not b not(a or b or c)=not a and not b and not c

Instructiunea IF
f. generala (variante a),b),c) )

if(conditie) operatie1; if(conditie) { if(conditie) operatie1;


else operatie2; operatii1;
} sau
else {
operatii2; if(conditie) {
} operatii1;
}
varianta a) varianta b) varianta c)
Explicatii:
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)
Daca if-ul sau else-ul au mai multe operatii ( 2,3,..) acestea se grupeaza intre acolade {….}
Varianta c)
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 {….}

In C++ 0 este fals si ≠0 adevarat ( 0 =fals 1=adevarat, -128 =adevarat, 65201= adevarat)
Tabel pentru conditii logice: 0 false 1 true
a b a&&b(and) a||b(or)
F F F F
F A F A
A F F A
A A A A

Pr1. 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;
}
Pr2. Max a 3 numere

#include <iostream>
using namespace std; #include <iostream>
int a,b,c; using namespace std;
int main() int a, b, c, maxi;
{ int main() {
cout << "Dati valori pentru a, b si c" << endl; cout << "dati 3 numere";
cin >>a>>b>>c; cin >> a >> b >> c;
if(a>=b && a>=c) cout<<"Maximul este a"<<endl; maxi = a;
if(b>=a && b>=c) cout<<"Maximul este b"<<endl; if (maxi < b) maxi = b;
if(c>=a && c>=b) cout<<"Maximul este c"<<endl; if (maxi < c) maxi = c;
return 0; cout<<"Max este:"<<maxi;
}var 3 cout<<max(max(a,b),c); return 0;
}
#include <iostream>
using namespace std;
int a,b,c,maxi;
int main()
{
cout << "Dati valori pentru a, b si c" << endl;
cin >>a>>b>>c;
if(a>=b && a>=c) maxi=a;
if(b>=a && b>=c) maxi=b;
if(c>=a && c>=b) maxi=c;
cout<<"Maximul este "<<maxi<<endl;
return 0;
}

Pr3. Max a 5 numere


#include <iostream> #include <iostream>
using namespace std; using namespace std;
int a,b,c,d,e,maxi; int a, b, c, d, e, maxi;
int main() int main() {
{ cout << "dati 5 numere";
cout << "Dati valori pentru a,b,c,d si e" << endl; cin >> a >> b >> c >> d >> e;
cin >>a>>b>>c>>d>>e; maxi = a;
if(a>=b && a>=c && a>=d && a>=e) maxi=a; if (maxi < b) maxi = b;
if(b>=a && b>=c && b>=d && b>=e) maxi=b; if (maxi < c) maxi = c;
if(c>=a && c>=b && c>=d && c>=e) maxi=c; if (maxi < d) maxi = d;
if(d>=a && d>=c && d>=b && d>=e) maxi=d; if (maxi < e) maxi = e;
if(e>=a && e>=c && e>=d && e>=b) maxi=e; cout<<"Max este:"<<maxi;
cout<<"maximul este:"<<maxi; return 0;
return 0; }
}

Pr4. Ec de gr.I Pr5. Ec de gr.II


a X + b =0 2x+4=0 0x+5=0 a x2 + b x +c=0 sqrt(25)=5
#include <iostream> #include <iostream>
using namespace std; #include <cmath>
int a,b; using namespace std;
float x; int a, b, c, d;
int main() float x1, x2;
{ int main() {
cout << "Dati coeficientii ecuatiei a si b" << cout << "Dati valori pentru a, b si c" << endl;
endl; cin >> a >> b >> c;
cin>>a>>b; if(a!=0){
if(a!=0){ d=b*b-4*a*c;
x=-(float)b/a; if(d>=0){
cout<<x<<endl; x1=(-b+sqrt(d))/(float)(2*a);
} x2=(-b-sqrt(d))/(float)(2*a);
else cout<<"x1="<<x1<<endl<<"x2="<<x2;
if(b==0) }
cout<<"orice x este solutie"<<endl; else
else cout <<"nu exista solutii reale";
cout<<"nu exista solutii"; }
return 0; else{
if(b!=0){
} x1=-(float)c/b;
cout <<x1<<endl;
}
else{
if (c==0)
cout<<"orice x1 e solutie a ecuatiei";
else
cout<<"nu exista solutie pt ecuatie";
}
}
return 0;
}

Pr6. Relatia intre 2 numere(<,>,=)


#include <iostream> #include <iostream>
using namespace std; using namespace std;
int a,b; int a,b;
int main() int main()
{ {
cout << "Dati valori pentru a, b" << endl; cout << "Dati valori pentru a, b" << endl;
cin >>a>>b; cin >>a>>b;
if(a>b) cout<<"a >b"<<endl; if(a>b) cout<<"a >b"<<endl;
if(a<b) cout<<"a<b"<<endl; else
if(a==b) cout<<"a==b"<<endl; if(a<b) cout<<"a<b"<<endl;
return 0; else cout<<"a==b"<<endl;
} return 0;
}

//intersectia a doua intervale [a,b] si [c,d]


#include <iostream>// varianta 2(max,,min)
using namespace std;
int a, b, c, d;
int main() {
cout << "Dati valori pentru [a, b] [c,d]";
cin >> a >> b >> c>>d;
if(c<a) {swap(a,c);swap(b,d);} // swap(a,c);  aux=a;a=c;c=aux;(metoda paharelor)
if(b<c)cout<<"multimea vida";
else if(d>b)cout<<"["<<c<<","<<b<<"]";
else cout<<"["<<c<<","<<d<<"]";
return 0;
}
//intersectia a doua intervale [a,b] si [c,d]
#include <iostream>

using namespace std;


long a,b,c,d,st,dr;
int main()
{
cin>>a>>b>>c>>d;
st=max(a,c);
dr=min(b,d);
if (st<=dr) cout<<st<<" "<<dr;
else cout<<"multimea vida";
cout << "Hello world!" << endl;
return 0;
}
Pr7. Adunarea a doua durate de timp
9 30’ 20” (h1 m1 s1) +
3 42’ 50” (h2 m2 s2)
13 13’ 10” (h m s )

#include <iostream>
using namespace std;
int h, h1, h2, m, m1, m2, s, s1, s2;
int main() {
cout << "Dati valori pentru h1,h2,m1 si m2,s1,s2:" << endl;
cin >> h1 >> m1 >> s1 >> h2 >> m2 >> s2;
s = s1 + s2;
m = m1 + m2;
h = h1 + h2;
if (s >= 60) {
s = s - 60;
m = m + 1;
}
if (m >= 60) {
m = m - 60;
h = h + 1;
}
cout << h << " " << m << " " << s << endl;
return 0;
}
//var 2
#include <iostream>

using namespace std;


long h,m,s,h1,m1,s1,h2,m2,s2,ss,a,b;
int main()
{
cin>>h1>>m1>>s1>>h2>>m2>>s2;
a=h1*3600+m1*60+s1;
b=h2*3600+m2*60+s2;
ss=a+b;
h=ss/3600;
ss=ss-h*3600;
m=ss/60;
s=ss%60;
cout<<h<<" "<<m<<" "<<s;
return 0;
}
Pr8. Inversul unui numar short int
Pr9. Comparati doua date calendaristice
Pr10. Fie a,b,c laturile unui triunghi. Precizati tipul triunghlui: oarecare, isoscel, echilateral,
dreptrunghic, dreptunghic isoscel.
Pr11. Fie 3 numere a,b,c. precizati relatiile dintre ele: a=b=c,a≠b≠c,a=b≠c,a=c≠b,b=c≠a
Tema
Inversul unui numar de 3 cifre
Min 4 nr
//Fie un nr de maxim 3 cifre.Calculati inversul sau.
#include <iostream>
using namespace std;
int x, cif1, cif2, cif3, y;
int main()
{
cout << "Dati un numar x"<< endl;
cin>>x;
if(x>=0&&x<=9) y=x;
if(x>=10&&x<=99){
cif1=(x%10);
cif2=(x/10);
y=cif1*10+cif2;
}
if(x>=100&&x<=999){
cif1=(x%10);
cif2=(x/10%10);
cif3=(x/100);
y=cif1*100+cif2*10+cif3;
}
cout<<"Numarul este:"<<y<<endl;
return 0;
}
/*148 cif1=8 cif2= 4 cif3=1
cif1*100+cif2*10+cif3=800+40+1=841

1258%10=8 x%10=ultima cifra a lui x


1258%100=58 x*100=numarul format din ultimele doua cifre
1258/10=125 x/10=numarul taiat(fara ultima cifra)
345/10=34
1258/100=12 x/100= taie doua cifre din x
1258/10%10=5
*/
//suma cif. unui numar de maxim 5 cifre
#include <iostream>
using namespace std;
int x, c1, c2, c3,c4,c5,s;
int main()
{ cout<<"dati x";
cin>>x;
if (x>=0 && x<=9) s=x;
if (x>=10 && x<=99) {
c1=x%10;
c2=x/10;
s=c1+c2;
}
if (x>=100 && x<=999) {
c1=x%10;
c2=x/10%10;
c3=x/100;
s=c1+c2+c3;
}
if (x>=1000 && x<=9999) {
c1=x%10;
c2=x/10%10;
c3=x/100%10;
c4=x/1000;
s=c1+c2+c3+c4;
}
if (x>=10000 && x<=99999) {
c1=x%10;
c2=x/10%10;
c3=x/100%10;
c4=x/1000%10;
c5=x/10000;
s=c1+c2+c3+c4+c5;
}
cout<<"suma cifrelor lui x este:"<<s;

return 0;
}
//afisati cifra maxima dintr-un numar(cu maxim 3 cifre)
using namespace std;
int x, c1, c2, c3, maxi;
int main()
{ cout<<"dati valoare lui x";
cin>>x;
if (0<=x && x<=9) maxi=x;
if (10<=x && x<=99) { c1=x%10;
c2=x/10;
if (c1>c2) maxi=c1;
else maxi=c2;
}
if (100<=x && x<=999) {c1=x%10;
c2=x/10%10;
c3=x/100;
if (c1>c2) maxi=c1;
else maxi=c2;
if (maxi<c3) maxi=c3;
}
cout << "cifra maxima este:" <<maxi<< endl;
return 0;
}
//fie un numar de doua cifre. Afisati cel mai mare numar
//ce se poate forma cu cifrele sale
//ex: x=29 => 92
//x=71 => 71
#include <iostream>
using namespace std;
int x, c1, c2,nr;
int main()
{ cout<<"dati valoare lui x";
cin>>x;
c1=x%10;
c2=x/10;
if (c1>c2) nr=c1*10+c2;
else nr=c2*10+c1;
cout << "numarul maxim este:" <<nr<< endl;
return 0;
}
Instructiuni repetitive (for, while, do while)

for
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;
Probleme:

1.Calculati p=2*4*6* ..*n 2.E=1/1+1/2+1/3+…+1/n

//p=2*4*..*n
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int i,n,p; int i,n;
int main() float s;
{ int main()
cout<<"Dati un numar n par: "; {
cin>>n; cout<<"Dati n: ";
p=1; cin>>n;
for(i=2;i<=n;i=i+2) p*=i; //sau p=p*i; s=0;
cout<<"Produsul nr pare din sir este:"<<p; for(i=1;i<=n;i++) s+=(float)1/i;
return 0; cout<<"Suma este:"<<s;
} return 0;
}

3 .S=2+5+8+11+…..+n 4.S=23+43+63+…+n3
#include <iostream>
using namespace std; #include <iostream>
int i,n,s; #include<cmath>
int main() using namespace std;
{ int i,n,s;
cout<<"Dati un numar n par: "; int main()
cin>>n; {
s=0; cout << "Dati un nr n:";
for(i=2;i<=n;i=i+3) s+=i; cin>>n;
cout<<"Suma este:"<<s; for(i=2;i<=n;i=i+2) s+=i*i*i;
return 0; //s=s+pow(i,3);
} cout<<"Suma este:"<<s;
return 0;
}

5. E=1 + 1*2 + 1*2*3 + 1*2*3*4 +… 6. Suma a n numere


+1*2*3*..*n=1!+2!+3!+..+n! //suma a n numere

#include <iostream> #include <iostream>


using namespace std; using namespace std;
int i, s, n, p; int i, s, n, x;
int main() { int main() {
cout << "Dati un nr n:"; cout << "Dati un nr n:";
cin >> n; cin >> n;
p = 1; for (i = 1;i <= n;i++) {
for (i = 1;i <= n;i++) { cin >> x;
p *= i; s += x;
s += p; }
} cout << "Suma este:" << s;
//var II return 0;
//s=0; }
// for (i = 1;i <= n;i++) {
// p=1;
//for(j=1;j<=i;j++)p *= j; //calculam i!
//s += p;
// }
cout << "Suma este:" << s;
return 0;}
7.Suma numerelor pare dintr-un sir 8.Pentru un sir de n numere aflati minimul.
#include <iostream> //minimul dintr-un sir de numere
using namespace std; #include <iostream>
int i, s, n, x; using namespace std;
int main() { int i, n, x, mini;
cout << "Dati un nr n:"; int main() {
cin >> n; cout << "Dati un nr n:";
for (i = 1;i <= n;i++) { cin >> n; mini = 2000000;
cin >> x; for (i = 1;i <= n;i++) {
if(x%2==0) s += x; cin >> x;
} if (x < mini) mini = x;
cout << "Suma celor pare este:" << s; }
return 0; cout << "Minimul din sir este:" << mini;
} return 0;
}

9. Pentru un sir de n numere aflati minimul par. 10. Pentru un sir de n numere aflati maximul.
//minimul par dintr-un sir de n //Maximul dintr-un sir

#include <iostream>
#include <iostream> using namespace std;
using namespace std; int i,n,maxi,x;
int x,mini,n,i; int main()
int main() {
{ cout << "Dati un nr n:";
cout << "Dati un nr n: "; cin>>n;maxi=-20000000;
cin>>n; mini=2000000000; for(i=1;i<=n;i++){
for(i=1;i<=n;i++){ cin>>x; cin>>x;
if(x%2==0 && x<mini) mini=x; if(x>maxi) maxi=x;
}
} cout<<"Maximul este:"<<maxi;
if(mini==2000000000) return 0;
cout<<"Nu exista minim par"; }
else cout<<"Minimul par este:"<<mini;
return 0;
}

11. Pentru un sir de n numere aflati cate elemente


pozitive, negative si nule sunt.
//cate numere pozitive, negative si nule sunt intr-un
sir.

#include <iostream>
using namespace std;
int x, i, n, kn, kp, ko;
int main() { 12.Media aritmetica a numerelor pozitive dintr-
cout << "Dati un nr:"; un sir.
cin >> n; //media aritmetica a nr. pozitive dintr-un sir
for (i = 1;i <= n;i++) {
cin >> x; #include <iostream>
if (x > 0) kp = kp + 1; //kp++; using namespace std;
if (x == 0) ko = ko + 1; //ko++; int i, n, x, s, k;
if (x<0) kn = kn + 1; //kn++; float ma;
} int main() {
cout << "Nr el. pozitive este:" << kp<< endl; cout << "Dati un nr:";
cout << "Nr el. negative este:" << kn<< endl; cin >> n;
cout << "Nr el. nule este:" << ko; for (i = 1;i <= n;i++) {
return 0; cin >> x;
} if (x>0) { s += x; k++; }
}
ma = (float)s / k;
cout << "ma=" << ma;
return 0;
}

Tema
S=1/n + 2/(n-1) + 3/(n-2) +..+ n/1
S=100+98+96+94+….+12
S=1/(1*1)+ 1/(2*2)+ 1/(3*3)+.. +1/(n*n)
S=(1)*(1+2)*(1+2+3)*..*(1+2+3+…+n)
13.Divizorii unui numar x.
#include <iostream>
using namespace std;
int x, d, n;
int main()
{
cout<<"dati x";
cin>>x;
for (d=1; d<=x; d++)
if (x%d==0) cout<<d<<" ";
return 0;
}
14.Fie doua numere. Afisati numarul ce are cei mai multi divizori.
15.Verificati daca un numar este perfect.
16.Verificati daca un numar este prim.
17. Media aritmetica a numerelor pare si media 18. Fie doua numere. Afisati numarul ce are cei
aritmetica a numerelor impare. mai multi divizori.
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int i,n,x,sp,si,kp,ki; int i,n,x,y,k1,k2;
float map,mai; int main()
int main() {
cout<<"Dati un nr x:";
{
cin>>x;
cout << "Dati un nr n:";
cout<<"Dati un nr y:";
cin>>n; cin>>y;
for(i=1;i<=n;i++){ for(i=1; i<=x; i++)
cin>>x; if(x%i==0) k1++;
if(x%2==0){ sp+=x; for(i=1; i<=y; i++)
kp++;} if(y%i==0) k2++;
if(k1>k2)
else { si+=x; cout<<"x are mai multi divizori";
ki++;} else if(k1==k2) cout<<"x si y au acelasi nr de
} divizori";
map=(float)sp/kp; else cout<<"y are mai multi divizori";
mai=(float)si/ki; return 0;
}
cout<<"Media aritmetica a nr pare
este:"<<map<<endl;
cout<<"Media aritmetica a nr impare
este:"<<mai;
return 0;
}
WHILE - structura repetitiva 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.

DO WHILE - structura repetitiva 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.

Probleme
1.Descompunerea in factori primi pt. un numar x 2. Suma a n numere dintr-un sir
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int x, d, p; int i,n,x,s;
int main() { int main()
cout << "Dati un nr x:"; {
cin >> x; cout << "Dati un nr n:";
d = 2; cin>>n; i=1;
while (x != 1) { while(i<=n){
p = 0; cin>>x;
while (x % d == 0) { s+=x;
p++; i++;
x = x / d; }
} cout<<"Suma nr din sir este:"<<s;
if (p > 0) cout << d << " " << p << endl; return 0;
d++; }
}
return 0;
}
La ce putere apare x in y
Daca exista z a.i. y=xz
Calculati numarul de divizori a lui x.

3. Cmmdc a doua numere. 4.Cmmmc a doua numere.


#include <iostream> #include <iostream>
using namespace std; using namespace std;
int x,y; int a,b,p;
int main() float cmmmc;
{ int main()
cout << "Dati doua nr x si y:"; {
cin>>x>>y;
cout << "Dati doua nr a si b:";
cin>>a>>b; p=a*b;
while (x!=y) while(a!=b)
if(x>y) x=x-y; if(a>b) a=a-b;
else y=y-x; else b=b-a;
cmmmc=p/a;
cout<<"cmmdc a nr x si y este:"<<x; cout<<"cmmmc="<<cmmmc;
return 0; return 0;
}
}
do{ r=a%b;a=b;b=r;}while(r!=0);cout<<a;

Probleme cu structuri repetitive

1.Media aritmetica a numerelor pare si media 2. Fie doua numare x si y. Afisati un mesaj ce
aritmetica a numerelor impare dintr-un sir. precizeaza care numar are mai multi divizori.
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int i,n,x,sp,si,kp,ki; int i,n,x,y,k1,k2;
float map,mai; int main()
int main() {
{ cout<<"Dati un nr x:";
cout << "Dati un nr n:"; cin>>x;
cin>>n; cout<<"Dati un nr y:";
for(i=1;i<=n;i++){ cin>>y;
cin>>x; for(i=1; i<=x; i++)
if(x%2==0){ sp+=x; if(x%i==0) k1++;
kp++;} for(i=1; i<=y; i++)
if(y%i==0) k2++;
else { si+=x; if(k1>k2)
ki++;} cout<<"x are mai multi divizori";
} else if(k1==k2) cout<<"x si y au acelasi nr de
map=(float)sp/kp; divizori";
mai=(float)si/ki; else cout<<"y are mai multi divizori";
cout<<"Media aritmetica a nr pare return 0;
este:"<<map<<endl; }
cout<<"Media aritmetica a nr impare
este:"<<mai;

return 0;
}
3.Precizati daca exista numere impare intr-un sir. Fibonacci in O(1) memorie
#include <iostream> #include <iostream>
using namespace std; using namespace std;
int i,x,n,ok; int a,b,c,i,n;
int main() int main()
{ {
cout << "Dati un nr n:"; cout << "Dati n:";
cin>>n; ok=0;
cin>>n;
for(i=1;i<=n;i++){
a=0;b=1;
cin>>x;
if(x%2==1) ok=1; i=2;
} do{
if(ok==1) cout<<"Da"; c=a+b;
else cout<<"Nu"; a=b;
return 0; 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;
return 0;
}
Probleme cu cifrele unui numar!!!!!!!!!

Fisiere
Intr-o problema citirea datelor se poate face de la tastatura sau din fisier.
Afisarea rezultatelor se poate face pe ecran sau intr-un fisier.

Problema

Suma a doua numere.


Citirea numerelor se face din fisierul „gigel.in” si afisarea sumei se face in fisierul „gigel.out”;
#include <iostream>
#include<fstream>
using namespace std;
fstream f("gigel.in",ios::in); -> indicatorul f va indica la fisierul „gigel.in”
fstream g("gigel.out",ios::out); -> indicatorul g va indica la fisierul „gigel.out”
//ifstream f("gigel.in");
//ofstream g("gigel.out");
int a,b,s;
int main()
{
f>>a>>b;
s=a+b;
g<<"suma este:"<<s;
f.close();
g.close();
return 0;
}
Recitirea unui fisier
#include<fstream>//var I #include<fstream>//var II
using namespace std; using namespace std;
ifstream f("fractal.in"); ifstream f("fractal.in");
ofstream g("fractal.out"); ofstream g("fractal.out");
int a,b,s,x,y,p; int a,b,s,x,y,p;
int main() int main()
{ {
f>>a>>b; f>>a>>b;
s=a+b; s=a+b;
g<<"suma este:"<<s; g<<"suma este:"<<s;
f.close(); //fara asta nu merge f.close();
f.open("fractal.in"); fstream f("fractal.in");
f>>x>>y; f>>x>>y;
p=x*y; p=x*y;
g<<"suma este:"<<p; g<<"produsul este:"<<p;
return 0;
return 0; }
}

1.//suma unui sir de numere cu fisiere 2.Afisati minimul, maximul si cmmdc dintre
minim si maxim
#include <iostream>
#include<fstream> #include <iostream>
using namespace std; #include<fstream>
fstream f("sir.in",ios::in); using namespace std;
fstream g("sir.out",ios::out); ifstream f("sir.in");
int i,n,x,s; ofstream g("sir.out");
int main() int mini,maxi,i,n,x;
{ int main()
f>>n; {
for(i=1;i<=n;i++){ f>>n; maxi=-32000; mini=32000;
f>>x; for(i=1;i<=n;i++){
s+=x; f>>x;
} if(maxi<x) maxi=x;
g<<"suma este:"<<s; if(mini>x) mini=x;
f.close(); }
g.close(); g<<"Minimul este:"<<mini<<endl;
return 0; g<<"Maximul este:"<<maxi<<endl;
} while(mini!=maxi)
if(mini>maxi) mini=mini-maxi;
else maxi=maxi-mini;
g<<"cmmdc este:"<<mini;
f.close();
g.close();
return 0;
}
3.Precizati daca un numar este prim. 4.Afisati numerele prime din intervalul [a.b].
#include <iostream> #include <iostream>
#include<fstream> #include<fstream>
#include<cmath> using namespace std;
using namespace std; fstream f("sir.in", ios::in);
fstream f("sir.in",ios::in); fstream g("sir.out", ios::out);
fstream g("sir.out",ios::out); int a, b, i, x, j, k;
int x,k,i; int main() {
int main() f >> a >> b;
{ for (i = a;i <= b;i++) {
f>>x; x = i;k = 0;
for(i=2;i<=sqrt(x);i++) for (j = 1;j <= x;j++) {
if(x%i==0){ if (x % j == 0) k++;
k=1;break;} }
if(k==0) g<<"Da"; if (k == 2) g << x << " ";
else g<<"Nu"; }
f.close();
g.close(); f.close();
return 0; g.close();
} return 0;
}
5.Suma numerelor prime dintr-un sir de n.
#include <iostream>
#include<fstream>
using namespace std;
fstream f("sir.in",ios::in);
fstream g("sir.out",ios::out);
int n,i,x,j,k,s;
int main()
{
f>>n; s=0;
for(i=1;i<=n;i++){
f>>x; k=0;
for(j=1;j<=x;j++){
if(x%j==0) k++;}
if(k==2) s=s+x;
}
g<<s;
f.close();
g.close();
return 0;
}
Vectori
Un vector reprezinta un sir de elemente cu un nume comun asezate in ordine.
Ex: un vector cu 10 elemente: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
Declararea vectorui de mai sus in C++ se face astfel: int a[10] .
Elementele sale sunt: a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
In general nu vom folosi elemetul a[0].
Operatii de baza cu vectori
1) citirea elementelor unui vector
a)de la tastatura
cout<<"dati n";
cin >> n;
for (i = 1;i <= n;i++){
cout<<"dati element";
cin >> a[i];
}
b)din fisier
f >> n;
for (i = 1;i <= n;i++) f>>a[i];

2) afisarea elementelor unui vector


a)afisarea pe ecran
for (i = 1;i <= n;i++) cout<< a[i]<< " ";
b)in fisier
for (i = 1;i <= n;i++) g<< a[i]<< " ";
3) suma elementelor unui vector
s=0;
for (i = 1;i <= n;i++) s+=a[i];
cout<< "Suma este: "<<s;
4) minimul dintr-un sir
mini=320000;
for (i = 1;i <= n;i++)
if (mini>a[i]) mini=a[i];
cout<< "minimul este: "<<mini;

5) cate elemente pare sunt intr-un sir


k=0;
for (i = 1;i <= n;i++)
if(a[i]%2==0) k++;
cout<< "k este: "<<k;

6) inlocuiti elementele pare cu ultima cifra numarului si cele impare cu penultima cifra
for (i = 1;i <= n;i++)
if(a[i]%2==0) a[i]=a[i]%10;
else a[i]=a[i]/10%10
pr1
Suma numerelor dintr-un sir
#include <iostream>
#include<fstream>
#define MAX 1000
using namespace std;
fstream f("sir.in", ios::in);
fstream g("sir.out", ios::out);
int a[MAX], n, i, s;
int main() {
f >> n;
for (i = 1;i <= n;i++)
f >> a[i];
for (i = 1;i <= n;i++)
s+=a[i];
g << "Suma este:" << s;
f.close();
g.close();
return 0;
}

Pr2
Suma numerelor prime dintr-un sir
#include<cmath> //suma numerelor prime eficient
#include<fstream>//var II
using namespace std;
ifstream fi("mat.in");
ofstream fo("mat.out");
int r,a[101],n,d,k,b,s,x,y,p,i;
int main()
{
fi>>n;
for(i=1;i<=n;i++)fi>>a[i];

for(i=1;i<=n;i++){
//numar prim eficient
x=a[i];
if(x==0 or x==1)k=1;
else{
k=0;
r=sqrt(x);
for(d=2;d<=r;d++)
if(x%d==0){k++;break;}
if(k==0)s=s+x;
}
}
fo<<s;
// for(i=1;i<=n;i++){
// x=a[i];
// k=0;
// for(d=1;d<=x;d++)
// if(x%d==0)k++;;
// if(k==2)s=s+x;
// }
// fo<<s;
return 0;
}
Pr3
//afisati numerele vecine ce au aceiasi paritate
Varianta 1
#include <iostream>
#include<fstream>
using namespace std;
fstream f("sir.in",ios::in);
fstream g("sir.out",ios::out);
int a[1000],n,i,x,y;
int main()
{
f>>n;
for(i=1;i<=n;i++) f>>a[i];
for(i=1;i<n;i++){
x=a[i]; y=a[i+1];
if((x%2==0&&y%2==0)||(x%2==1&&y%2==1)) g<<a[i]<<" "<<a[i+1]<<endl;
}
f.close();
g.close();
return 0;
}
//afisati numerele vecine ce au aceiasi paritate
Varianta 2
#include <iostream>
#include<fstream>
using namespace std;
fstream f("sir.in",ios::in);
fstream g("sir.out",ios::out);
int a[1000],n,i,x,y;
int main()
{
f>>n;
for(i=1;i<=n;i++) f>>a[i];
for(i=1;i<n;i++){
x=a[i]; y=a[i+1];
if(x%2==y%2)) g<<a[i]<<" "<<a[i+1]<<endl;
}
f.close();
g.close();
return 0;
}
Cautarea unui element x intr-un sir.(cautarea secventiala)
#include <iostream>
using namespace std;
int a[1000],n,i,j,m,k,x;
bool gasit;
int main()
{
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";
return 0;
}
#include <iostream>
using namespace std;
int a[1000],n,i,j,m,k,x;
bool gasit;
int main()
{
cin>>n>>x;
for(i=1;i<=n;i++) cin>>a[i];
k=0;
for(i=1;i<=n;i++)
if(a[i]==x) k++;
if(k>0)cout<<"elementul exista";
else cout<<"elementul nu exista";
return 0;
}

Cautarea unui element x intr-un sir ordonat.(cautarea binara)

#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;
}
Var II
#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;
do
{
mij=(st+dr)/2;
if (a[mij]==x) return mij;
else if(a[mij]<x) st=mij+1;
else dr=mij-1;
}while(st<=dr );
return 0;
}
int main()
{
cin>>n>>x;
for(i=1;i<=n;i++) cin>>a[i];
cout<<cauta_bin(a,n,x);

return 0;
}
Fie doua multimi a si b. Afisati intersectia celor Fie doua multimi a si b. Afisati reuniunea celor
doua multimi. doua multimi.
#include <iostream> #include <iostream>
#include<fstream> #include<fstream>
using namespace std; using namespace std;
fstream f("sir.in",ios::in); fstream f("sir.in",ios::in);
fstream g("sir.out",ios::out); fstream g("sir.out",ios::out);
int a[1000],i,n,m,b[1000],j; int a[1000],b[1000],n,i,j,m,k;
int main() int main()
{ {
f>>n; f>>n;
for(i=1;i<=n;i++) f>>a[i]; for(i=1;i<=n;i++) f>>a[i];
f>>m; f>>m;
for(j=1;j<=m;j++) f>>b[j]; for(j=1;j<=m;j++) f>>b[j];
for(i=1;i<=n;i++) for(i=1;i<=n;i++) g<<a[i]<<" ";
for(j=1;j<=m;j++) for(j=1;j<=m;j++){
if(a[i]==b[j]) g<<a[i]<<" "; k=0;
g.close(); for(i=1;i<=n;i++)
return 0; if(b[j]==a[i]) k++;
} if(k==0) g<<b";
}
f.close();
g.close();
return 0;
}
Fie un sir de n elemente. Afisati sirul ordonat Fie un sir de n elemente. Afisati sirul ordonat
crescator.(Met selectiei) crescator.(Met bulelor)
#include <iostream> #include <iostream>
#include<fstream> #include<fstream>
using namespace std; using namespace std;
fstream f("sir.in",ios::in); fstream f("sir.in",ios::in);
fstream g("sir.out",ios::out); fstream g("sir.out",ios::out);
int a[145],n,i,j,aux; int a[136],i,n,aux,ord;
int main() int main()
{ {
f>>n; f>>n;
for(i=1;i<=n;i++) f>>a[i]; for(i=1;i<=n;i++) f>>a[i];
for(i=1;i<=n;i++) do{ ord=1;
for(j=i+1;j<=n;j++) for(i=1;i<n;i++)
if(a[i]>a[j]){ if(a[i]>a[i+1]){
aux=a[i]; aux=a[i];
a[i]=a[j]; a[i]=a[i+1];
a[j]=aux; a[i+1]=aux;
} ord=0;}
for(i=1;i<=n;i++) g<<a[i]<<" "; }
g.close(); while(ord==0);
return 0; for(i=1;i<=n;i++) g<<a[i]<<" ";
}
return 0;
}
Fie un sir de numere in intervalul[1,1000].Afisati //afisati elementele pare descrescator si suma
elementele ce apar de cele mai multe ori. cifrelor minimului
(cu frecventa) sir.in
sir.in 6
6 21 14 42 81 91 36
838753 sir.out
sir.out 0 1 2 3 4 5 6 7 8 9 …… 42 36 14
38 00020101200000 5
#include <iostream> #include <iostream>
#include<fstream> #include<fstream>
using namespace std; using namespace std;
fstream f("sir.in", ios::in); fstream f("sir.in",ios::in);
fstream g("sir.out", ios::out); fstream g("sir.out",ios::out);
int fr[1001], x, i, n, maxi,j; int a[1000],n,j,aux,i,sc,cif,x;
int main() { int main()
f >> n; maxi = 0; {
for (i = 1;i <= n;i++) { f>>n;
f >> x; for(i=1;i<=n;i++) f>>a[i];
fr[x]++; for(i=1;i<n;i++)
} for(j=i+1;j<=n;j++)
for (j = 1;j <= 1000;j++) if(a[i]<a[j]){
if (maxi < fr[j]) maxi = fr[j]; aux=a[i];
for (j= 1;j <= 1000;j++) a[i]=a[j];
if (maxi == fr[j]) g << j<< " "; a[j]=aux;}
f.close(); for(i=1;i<=n;i++)
g.close(); if(a[i]%2==0)
return 0; g<<a[i]<<" ";
} g<<endl;
//sortare prin insertie x=a[n];
#include <fstream> while(x!=0){ cif=x%10;
using namespace std; sc+=cif;
ifstream f("sir.in"); x=x/10;
ofstream g("sir.out"); }
int a[100],i,k,aux,n,x,fr[100]; g<<sc;
int main() f.close(); g.close();
{ return 0;
// for(i=1;i<=n;i++){ }
// k=i;
// while(k>1& //Fibonacci
// &a[k-1]>a[k]){ #include <iostream>
// swap(a[k],a[k-1]); using namespace std;
// k--; int a[100],i,n;
// } int main()
// } {
f>>n; cout << "Dati n:";
for(i=1;i<=n;i++) f>>a[i]; cin>>n;
for(i=1;i<=n;i++){ a[1]=0;a[2]=1;
aux=a[i]; for(i=3;i<=n;i++)a[i]=a[i-1]+a[i-2];
k=i; cout<<"termenul n a lui Fibonacci
while(k>1&&a[k-1]>aux){a[k]=a[k-1]; este:"<<a[n];
k--; return 0;
} }
a[k]=aux; //selectia directa
} #include <fstream>
for(i=1;i<=n;i++)g<<a[i]<<" "; using namespace std;
return 0; ifstream f("sir.in");
} ofstream g("sir.out");
int a[100],i,k,aux,n,x,j,mini;
int main()
{

f>>n;
for(i=1;i<=n;i++) f>>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++)g<<a[i]<<" ";
return 0;
}
Matrici (tablouri bidimensionale)
O matrice este un tablou cu m linii si n coloane.
Ex: o matrice a 4x5

a[1][1] a[1][2] a[1][3] a[1][4] a[1][5]

a[2][1] a[2][2] a[2][3] a[2][4] a[2][5]

a[3][1] a[3][2] a[3][3] a[3][4] a[3][5]

a[4][1] a[4][2] a[4][3] a[4][4] a[4][5]

Marice patratica
4x4

a[1][1] a[1][2] a[1][3] a[1][4]

a[2][1] a[2][2] a[2][3] a[2][4]

a[3][1] a[3][2] a[3][3] a[3][4]

a[4][1] a[4][2] a[4][3] a[4][4]

d. principala i=j
sub principala i >j
deasupra principala i<j
d. secundara i+j=n+1
sub i+j>n+1
deasupra i+j<n+1
declarare matrice: int a[100][100] 100 linii x 100 coloane (lin 0, lin 1 …lin 99)
Prima linie este formata din elementele: a[1][1] a[1][2] a[1][3] a[1][4] a[1][5]
A treia coloana:
a[1][3]
a[2][3]
a[3][3]
a[4][3]
Un element din matrice este a[i][j] si el se afla in matrice pe linia i si coloana j;
Operatii cu matrici
a)citirea unei matrici
citirea din fisier citirea de la tastatura
f>>m>>n; cout<<"dati numarul de linii si coloane:";
for(i=1;i<=m;i++) cin>>m>>n;
for(j=1;j<=n;j++) f>>a[i][j]; for(i=1;i<=m;i++)
for(j=1;j<=n;j++) {
cout<<"dati element:";
cin>>a[i][j];
}

b)afisarea unei matrici

afisarea in fisier afisarea pe ecran

for(i=1;i<=m;i++){ for(i=1;i<=m;i++){
for(j=1;j<=n;j++) g<<a[i][j]<<" "; for(j=1;j<=n;j++) cout<<a[i][j]<<" ";
g<<endl; cout<<endl;
} }

c)suma elementelor dintr-o matrice


s=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++) s+=a[i][j];
cout<<"suma din matrice este: "<<s;
Sa se construiasca o matrice astfel incat a[i][j] este Construiti matricea mxn
minimul dintre i si j Ex: pentru o matrice 5x4 rezulta
Pentu mxn(3x4) rezulta matricea 1234
1111 1234
1222 1234
1233 1234
#include <iostream> 1234
#include <fstream> #include <iostream>
using namespace std; #include <fstream>
ifstream f("sir.in"); using namespace std;
ofstream g("sir.out"); ifstream f("sir.in");
int a[100][100],m,n,i,j; ofstream g("sir.out");
int main() int a[100][100],m,n,i,j;
{ int main()
f>>m>>n; {
for(i=1;i<=m;i++) f>>m>>n;
for(j=1;j<=n;j++) for(i=1;i<=m;i++)
if(i<j) a[i][j]=i; for(j=1;j<=n;j++)
else a[i][j]=j; a[i][j]=j;
for(i=1;i<=m;i++){ for(i=1;i<=m;i++){
for(j=1;j<=n;j++) g<<a[i][j]<<" "; for(j=1;j<=n;j++) g<<a[i][j]<<" ";
g<<endl; g<<endl;}
} f.close (); g.close ();
f.close (); g.close (); return 0;
return 0; }
}
Suma de pe prima linie si suma de pe ultima Afisati elementele divizibile cu 3 si minimul din
coloana matrice.
#include <iostream> #include <iostream>
#include<fstream> #include<fstream>
using namespace std; using namespace std;
fstream f("sir.in",ios::in); fstream f("sir.in",ios::in);
fstream g("sir.out",ios::out); fstream g("sir.out",ios::out);
int a[10][10],m,n,i,j,s1,s; int a[15][20],m,n,i,j,mini;
int main() int main()
{ {
f>>m>>n; f>>m>>n; mini=32.000;
for(i=1;i<=m;i++) for(i=1;i<=m;i++)
for(j=1;j<=n;j++) for(j=1;j<=n;j++)
f>>a[i][j]; f>>a[i][j];
for(j=1;j<=n;j++) for(i=1;i<=m;i++){
s1+=a[1][j]; for(j=1;j<=n;j++)
g<<s1<<endl; g<<a[i][j]<<" ";
for(i=1;i<=m;i++) g<<endl;}
s+=a[i][n]; for(i=1;i<=m;i++)
g<<s<<endl; for(j=1;j<=n;j++)
f.close (); g.close (); if(a[i][j]%3==0) g<<a[i][j]<<" ";
return 0; g<<endl;
} for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]<mini) mini=a[i][j];
g<<mini;
f.close();
g.close();
return 0;
}
Suma elementelor si numarul elementelor pare Suma pe fiecare linie dintr-o matrice
#include <iostream> Var I
#include<fstream> #include <iostream>
using namespace std; #include<fstream>
fstream f("sir.in",ios::in);
using namespace std;
fstream g("sir.out",ios::out);
int a[10][10],s,k,i,j,n,m;
fstream f("sir.in",ios::in);
int main() fstream g("sir.out",ios::out);
{ int a[10][10],m,n,i,j,s;
f>>m>>n; int main()
for(i=1;i<=m;i++) {
for(j=1;j<=n;j++) f>>m>>n;
f>>a[i][j]; for(i=1;i<=m;i++)
for(i=1;i<=m;i++) for(j=1;j<=n;j++)
for(j=1;j<=n;j++) f>>a[i][j];
s+=a[i][j]; for(i=1;i<=m;i++){
g<<s<<endl;
s=0;
for(i=1;i<=m;i++) for(j=1;j<=n;j++)
for(j=1;j<=n;j++) s+=a[i][j];
if(a[i][j]%2==0) k++; g<<s<<endl;
g<<k; }
f.close(); f.close();
g.close(); g.close();
return 0; return 0;
} }
Suma pe fiecare linie dintr-o matrice(cu un vector Suma de pe linia p
suplimentar) var II #include <iostream>
#include <iostream> #include<fstream>
#include<fstream> using namespace std;
fstream f("sir.in",ios::in);
using namespace std;
fstream g("sir.out",ios::out);
fstream f("sir.in",ios::in); int a[10][10],m,n,p,i,j,sp;
fstream g("sir.out",ios::out); int main()
int a[10][10],b[10],m,n,i,j;
int main() {
{ f>>m>>n>>p;
f>>m>>n; for(i=1;i<=m;i++)
for(i=1;i<=m;i++) for(j=1;j<=n;j++)
f>>a[i][j];
for(j=1;j<=n;j++)
for(j=1;j<=n;j++)
f>>a[i][j]; sp+=a[p][j];
for(i=1;i<=m;i++) g<<sp;
for(j=1;j<=n;j++) f.close();
b[i]+=a[i][j]; g.close();
for(i=1;i<=m;i++) return 0;
g<<b[i]<<endl; }
f.close();
g.close();
return 0;
}

Afisarea in zig-zag a unei matrici Ordonarea elementelor dintr-o matrice


sir.in sir.in
33 33
168 7 2 1
10 8 4
345
3 1 2
279 sir.out
sir.out 112
168543279 234
#include <iostream> 7 8 10
#include<fstream> #include <iostream>
using namespace std; #include<fstream>
fstream f("sir.in",ios::in); using namespace std;
fstream g("sir.out",ios::out); fstream f("sir.in",ios::in);
int a[10][10],n,m,i,j; fstream g("sir.out",ios::out);
int main() int a[10][10],b[100],m,n,i,j,p,aux;
int main()
{
{
f>>m>>n; f>>m>>n;
for(i=1;i<=m;i++) for(i=1;i<=m;i++)
for(j=1;j<=n;j++) for(j=1;j<=n;j++)
f>>a[i][j]; f>>a[i][j];
for(i=1;i<=m;i++){ for(i=1;i<=m;i++)
if(i%2==1) for(j=1;j<=n;j++){p++; b[p]=a[i][j];}
for(j=1;j<=n;j++) g<<a[i][j]<<" "; for(i=1;i<=p;i++)
else for(j=i+1;j<=p;j++)
for(j=n;j>=1;j--) if(b[i]>b[j]){
aux=b[i];
g<<a[i][j]<<" ";}
b[i]=b[j];
f.close(); b[j]=aux;}
g.close(); p=0;
return 0; for(i=1;i<=m;i++)
} for(j=1;j<=n;j++){
p++;
a[i][j]=b[p];
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++)
g<<a[i][j]<<" ";
g<<endl;
}
f.close(); g.close();
return 0;
}

Stergerea liniei p dintr-o matrice


#include <iostream> a[1][1] a[1][2] a[1][3] a[1][4]
#include<fstream>
using namespace std;
fstream f("sir.in",ios::in); a[2][1] a[2][2] a[2][3] a[2][4]
fstream g("sir.out",ios::out);
int a[10][10],m,n,i,j,p;
int main(){ a[3][1] a[3][2] a[3][3] a[3][4]
f>>m>>n>>p;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++) a[4][1] a[4][2] a[4][3] a[4][4]
f>>a[i][j];
for(i=p;i<m;i++)
for(j=1;j<=n;j++) Sumele pe diagonalele paralele cu diagonala
a[i][j]=a[i+1][j]; principala
m--; #include <iostream>
for(i=1;i<=m;i++){ #include<fstream>
for(j=1;j<=n;j++) using namespace std;
fstream f("sir.in",ios::in);
g<<a[i][j]<<" ";
fstream g("sir.out",ios::out);
g<<endl;} int a[30][30],n,i,j,s[900];
f.close(); g.close(); int main()
return 0; {
} f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
s[n-i+j]+=a[i][j];
for(i=1;i<=2*n-1;i++)
g<<s[i]<<endl;
f.close();
g.close();
return 0;
}
Afisarea numarului de elemente vecine pare pentru Sumele pe diagonalele paralele cu diagonala
fiecare element din matrice(vecinii de sus, jos, stanga, secundara
dreapta)
#include <iostream> #include <iostream>
#include<fstream> #include<fstream>
using namespace std; using namespace std;
fstream f("sir.in",ios::in); fstream f("sir.in",ios::in);
fstream g("sir.out",ios::out);
fstream g("sir.out",ios::out);
int a[24][40],b[13][60],n,m,i,j,k;
int main()
int a[24][40],n,i,j,s[19];
{ int main()
f>>m>>n; {
for(i=1;i<=m;i++) f>>n;
for(j=1;j<=n;j++) for(i=1;i<=n;i++)
f>>a[i][j]; for(j=1;j<=n;j++)
for(j=0;j<=n+1;j++) a[0][j]=1; f>>a[i][j];
for(i=0;i<=m+1;i++) a[i][n+1]=1; for(i=1;i<=n;i++)
for(i=0;i<=m+1;i++) a[i][0]=1; for(j=1;j<=n;j++)
for(j=0;j<=n+1;j++) a[m+1][j]=1; s[i+j]+=a[i][j];
for(i=1;i<=m;i++)
for(i=2;i<=2*n;i++)
for(j=1;j<=n;j++){
k=0; g<<s[i]<<" ";
if(a[i-1][j]%2==0) k++; f.close(); g.close();
if(a[i][j+1]%2==0) k++; return 0;
if(a[i+1][j]%2==0) k++; }
if(a[i][j-1]%2==0) k++;
b[i][j]=k;
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++)
g<<b[i][j]<<" ";
g<<endl;
}
f.close(); g.close(); return 0;}
//afisare matrice in spirala
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
int k,m,i,j,n,a[100][100];
int main()
{
//matrice nepatratica
f>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
k=1;
while(k<=(min(n,m)+1)/2){
for(j=k;j<=n-k+1;j++)g<<a[k][j]<<" ";
for(i=k+1;i<=m-k+1;i++)g<<a[i][n-k+1]<<" ";
if(k!=m-k+1)
for(j=n-k;j>=k;j--)g<<a[m-k+1][j]<<" ";
if(k!=n-k+1)
for(i=m-k;i>=k+1;i--)g<<a[i][k]<<" ";
k++;
}

//matrice patratica
//f>>n;
//for(i=1;i<=n;i++)
//for(j=1;j<=n;j++)
// f>>a[i][j];
//k=1;
//while(k<=(n+1)/2){
// for(j=k;j<=n-k+1;j++)g<<a[k][j]<<" ";
// for(i=k+1;i<=n-k+1;i++)g<<a[i][n-k+1]<<" ";
// for(j=n-k;j>=k;j--)g<<a[n-k+1][j]<<" ";
// for(i=n-k;i>=k+1;i--)g<<a[i][k]<<" ";
// k++;
//}
f.close();
g.close();
return 0;
}
Functii
a)functii ce returneaza ceva ex: returneza un int sau un float sau un char etc
forma generala: Ex: suma a doua numere
tip rezultat returnat nume functie (lista parametri formali int suma(int a,int b )
functie) {
{ int s;
variabile locale s=a+b;
*corpul functiei return s;
return rezultat; }
}

b)functii ce nu returneaza nimic adica void


forma generala: Ex: suma a doua numere
void nume functie (lista parametri functie) void suma(int a,int b,int & s )
{ {
variabile locale s=a+b;
*corpul functiei }
}

#include <iostream>
using namespace std;
int x,y,ma,mi,s;
void f(int a,int b,int &suma,int &maxi,int &mini){
suma=a+b;
if(a>b)maxi=a;
else maxi=b;
if(a<b)mini=a;
else mini=b;
}
int main(){
cin>>x>>y;
f(x,y,s,ma,mi);
cout<<s<<" "<<ma<<" "<<mi;
return 0;
}
v. locale si v. globale
p. formali sau efectivi
transmiterea parametrilor prin valoare sau referinta

//doua feluri int sau void


//forma generala( tip nume parametri functiei return apel)
// v local si globale p. formali sau efectivi
// transmiterea parametrilor prin valoare sau referinta
/*
tip_rezultat nume_functie (parametri functiei){
variabile locale(daca este cazul)
corpul functiei (instructiunile functiei)
return rezultat
}
*/

Pr1.
Sa se scrie care o functie(de tip int) pentru fiecare cerinta:
a)suma a doua numere
b)calculul ipotenuzei unui triunghi dreptunghic
c)suma cifrelor unui numar x
d)suma divizorilor unui numar x
#include <fstream>
#include<cmath>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int x,y,s; //variabile globale

int suma(int a,int b){ //suma a doua numere a,b parametri formali
int s;
s=a+b;
return s;
}

float ipotenuza(float a,float b){ //ipotenuza unui triunghi dreptunghic


return sqrt(a*a+b*b);
}
int z; //variabile globale
int sumacif(int x){ //suma cif lui x
int cif,s; // x,cif,s variabile locale
s=0; // !!!!!!!!!
while(x){
cif=x%10;
s+=cif;
x=x/10;}
return s;
}
int t; //variabile globale
int sum_div(int a){ //suma divizorilor lui a
int d,s=0;
for(d=1;d<=a;d++)
if(a%d==0) s+=d;
return s;
}
int main()
{ int d;
f>>x>>y;
g<<"suma este:"<<suma(x,y)<<'\n';
g<<"ipotenuza este:"<<ipotenuza(x,y)<<'\n';
g<<"suma cifrelor lui x este "<<sumacif(x)<<'\n';
g<<"suma cifrelor lui y este "<<sumacif(y)<<'\n';
g<<"suma divizorilor lui x este "<<sum_div(x)<<'\n';
f.close();g.close();
return 0;
}
Pr2.
Sa se scrie care o functie(de tip void) pentru fiecare cerinta:
a)suma a doua numere
b)calculul ipotenuzei unui triunghi dreptunghic
c)suma cifrelor unui numar x
d)suma divizorilor unui numar x
e)inversarea continutului a doua variabile

//functii void
//forma generala( void nume parametri functiei apel)
// v local si globale p. formali sau efectivi
// transmiterea parametrilor prin valoare sau referinta

#include <fstream>
#include<cmath>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int x,y,ss,s; //variabile globale
void suma(int x, int y, int &s){ //suma a doua numere
s=x+y;
}
void ipotenuza(float a,float b,float &rez){ //ipotenuza unui triunghi dreptunghic
rez=sqrt(a*a+b*b);
}
void sumacif(int x, int &s){ //suma cifrelor lui x
int cif; // x,cif,s variabile locale
s=0; // !!!!!!!!!
while(x){
cif=x%10;
s+=cif;
x=x/10;}
}
void sum_div(int a, int &s){ //suma divizorilor lui x
int d;
s=0;
for(d=1;d<=a;d++)
if(a%d==0) s+=d;
}
void inverseaza(int &a, int &b){ // & transmitere prin adresa
int aux; //inverseaza a cu b
aux=a;a=b;b=aux; //se poate si cu comanda swap(a,b);
}
float ip;
int main()
{
f>>x>>y;
suma(x,y,ss);
g<<"suma este:"<<ss<<'\n';
ipotenuza(x,y,ip);
g<<"ipotenuza este: "<<ip<<'\n';
sumacif(x,s);
g<<"suma cifrelor lui x este "<<s<<'\n';
sumacif(y,s);
g<<"suma cifrelor lui y este "<<s<<'\n';
sum_div(x,s);
g<<"suma divizorilor lui x este "<<s<<'\n';
inverseaza(x,y);
g<<"x si y dupa inversare"<<x<<" "<<y<<'\n';
f.close();g.close();
return 0;
}

pr3
Afisati numerele dintr-un sir ce au suma cifrelor egala cu 10
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,i,a[100];

long sumacif(long x){


long cif,s;
s=0;
while(x){
cif=x%10;
s+=cif;
x=x/10;}
return s;
}

int main()
{
f>>n;
for(i=1;i<=n;i++) f>>a[i];
for(i=1;i<=n;i++)
if(sumacif(a[i])==10) g<<a[i]<<" ";
f.close();g.close();
return 0;
}*/
//Afisati numerele dintr-un sir ce sunt palindroame
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int i,n,a[100];
bool palindrom(int x){
int inv=0,y;
y=x;
while(x){
inv=inv*10+x%10;
x=x/10;
}
if(inv==y)return true;
else return false;
}
int main()
{
f>>n;
for(i=1;i<=n;i++) f>>a[i];
for(i=1;i<=n;i++)
if(palindrom(a[i])==true) g<<a[i]<<" ";
f.close();g.close();
return 0;
}
pr4
Afisati numerele dintr-o matrice ce au prop. ca atat ele cat si patratul lor sunt palindroame
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,i,j,a[10][10];

int palin(long x){


long cif,inv,y;
inv=0;
y=x;
while(x){
cif=x%10;
inv=inv*10+cif;
x=x/10;
}
if (y==inv) return 1;
else return 0;
}

int main()
{
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) f>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(palin(a[i][j])&&palin(a[i][j]*a[i][j])) g<<a[i][j]<<" ";
f.close();g.close();
return 0;
}

pr5
//
Afisati suma numerele dintr-un sir
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,i,j,a[100];
//vectorii se transmit prin referinta(prin adresa) implicit
//regula: se transmit datele si se primesc rezultatele
// in rest toate variabile vor fi locale (pentru siguranta)
int suma(int x[100],int n){
int i,s=0;
for( i=1;i<=n;i++) s+=x[i];
return s;
}

int main()
{
f>>n;
for(i=1;i<=n;i++) f>>a[i];
g<<suma(a,n)<<" ";
f.close();g.close();
return 0;
}

//pr 6
Ordonati elementele dintr-un sir cu o functie de citire vector, afisare vector, ordonare vector
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,i,j,a[100]; //vectorii se transmit prin adresa implicit !!!!
void citeste(int x[100],int &n){
int i;
f>>n;
for( i=1;i<=n;i++) f>>x[i];
}
void afiseaza(int x[100],int n){
int i;
for( i=1;i<=n;i++) g<<x[i]<<" ";
g<<'\n';//este echivalent cu g<<endl;
}
void ordonare(int x[100],int n){
int i,j;
for( i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(x[i]>x[j]) swap(x[i],x[j]);// functie ce inverseaza a[i] cu a[j] !!!
}
int main()
{ citeste(a,n);
afiseaza(a,n);
ordonare(a,n);
afiseaza(a,n);
f.close();g.close();
return 0;}

pr7
Afisati suma numerele dintr-o matrice
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,i,j,a[10][10];
//matricile si vectorii se transmit prin adresa
//regula: se transmit datele si se primesc rezultatele
// in rest totul variabile locale(pentru siguranta)
int suma1(int x[10][10],int n){
int i,j,s=0;
for( i=1;i<=n;i++)
for(j=1;j<=n;j++) s+=x[i][j];
return s;
}

int main()
{
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) f>>a[i][j];
g<<suma1(a,n)<<" ";
f.close();g.close();
return 0;
}
//pr6. Minimul dintr-o matrice ( citirea si afisarea pentru matrici+functie de minim)
//pr7. Inversati doua linii p si q dintr-o matrice
//pr8. Determinati punctele de "sa" dintr-o matrice(a[i][j] este "sa" daca este
//minimul de pe linie si maximul de pe coloana sau invers

Pr8.
Calc. suma numerelor prime dintr-un sir

#include <fstream>
#include<cmath>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
long a[100],i,n,s;

long prim(long x){


int d;
if(x==0||x==1) return 0;
for(d=2;d<=sqrt((float)x);d++)
if(x%d==0) return 0;
return 1;
}

int main()
{
f>>n;
for(i=1;i<=n;i++)f>>a[i];
for(i=1;i<=n;i++)
if(prim(a[i])) s+=a[i];
g<<s;
f.close();g.close();
return 0;
}
Pr9
Calc. suma a doua numere daca ambele sunt prime si produsul in caz contrar
#include <fstream>
#include<cmath>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
long x,y;
long prim(long a){
int d,k;
for(d=1;d<=a;d++)
if(a%d==0) k++;
if(k==2)return 1;
else return 0;
}
long prim_eficient(long a){
int d;
if(a==0||a==1) return 0;
for(d=2;d<=sqrt((float)a);d++)
if(a%d==0) return 0;
return 1;

}
int main()
{ int d;
f>>x>>y;
if(prim_eficient(x)&&prim_eficient(y)) g<<x+y;
else g<<x*y;
f.close();g.close();
return 0;
}
//tema fie 3 nr x,y,z.cal. x nr.de cifre y nr. divizori z cate cif pare are

Pr10.
Construiti o matrice cu primele elemente in ordine crescatoare ce au
exact trei divizori.
pt. n=4 se va afisa matricea de mai jos:
4 9 25 49
121 169 289 361
529 841 961 1369
1681 1849 2209 2809
obs: numerele cautate sunt patrate de numere prime!!

#include <fstream>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
int i, k, n, j, a[1000][1000], b[10000], nr;
long prim(long a ){
int d, kk;
d=0; kk=0;
for(d=1; d<=a; d++)
if(a%d==0) kk++;
if(kk==2) return 1;
else return 0;}
int main()
{f>>n;
nr=2; k=0;
while(k<=n*n){
if(prim(nr)) {k++;
b[k]=nr;
}
nr++;
}

k=1;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++){
a[i][j]=b[k]*b[k];
k++;
}
for(i=1; i<=n; i++){
for(j=1; j<=n; j++)
g<<a[i][j]<<' ';
g<<'\n';}

return 0;
}
Pr11.
//suma elementelor dintr-o matrice
#include <fstream>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
int n,i,j,a[100][100];
void citire(int x[100][100], int &n){
int i;
f>>n;
for(i=1 ; i<=n; i++)
for(j=1; j<=n; j++) f>>x[i][j];
}
void afisare (int x[100][100], int n){
int i;
for(i=1 ; i<=n; i++){
for(j=1; j<=n; j++)
g<<x[i][j]<<' ';
g<<'\n';}}
int suma (int x[100][100], int n){
int i, j, s=0;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
s+=x[i][j];
return s;
}

int main()
{
citire (a, n);
g<<suma (a,n)<<endl;
afisare(a,n);
return 0;
}
Pr12
//minimul dintr-o matrice
#include <fstream>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
int n,i,j,a[100][100],mini;
void citire(int x[100][100], int &n){
int i;
f>>n;
for(i=1 ; i<=n; i++)
for(j=1; j<=n; j++) f>>x[i][j];
}
void afisare (int x[100][100], int n){
int i;
for(i=1 ; i<=n; i++){
for(j=1; j<=n; j++)
g<<x[i][j]<<' ';
g<<'\n';}}
int minim (int x[100][100], int n){
int i, j; mini=32000;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(x[i][j]<mini) mini=x[i][j];
return mini;
}

int main()
{

citire (a, n);


g<<minim (a,n)<<endl;
afisare(a,n);
return 0;
}
Pr13
// inverseaza doua linii specificate dintr-o matrice
Sir.in
3
123
456
789
1 3 (se va inversa linia 1 cu linia 3)
Sir.out
789
456
123
#include <fstream>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
int n,i,j,a[100][100], p, q;
void citire(int x[100][100], int &n){
int i;
f>>n;
for(i=1 ; i<=n; i++)
for(j=1; j<=n; j++) f>>x[i][j];
}
void afisare (int x[100][100], int n){
int i;
for(i=1 ; i<=n; i++){
for(j=1; j<=n; j++)
g<<x[i][j]<<' ';
g<<'\n';}}
void inversare (int x[100][100], int n){
int i, j;
f>>p>>q;
for(j=1; j<=n; j++)
swap(x[p][j],x[q][j]);
}

int main()
{
citire (a, n);
inversare (a,n);
afisare(a,n);
return 0;
}
Pr14.
//Se considera o matrice patratica
// Sa se scrie o functie ce calculeaza
//cate elemente din matrice au toate cifrele pare
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,j,i,a[100][100];
void citire (int x[100][100],int&n){
int i,j;
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>x[i][j];
}
int calcul (int x){
int cif;
while(x){
cif=x%10;
if(cif%2==1) return 0;
x=x/10;
}
return 1;
}
int main(){
int k=0;
citire (a,n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(calcul(a[i][j])) k++;
if(k==n*n) g<<"DA";
else g<<"NU";
f.close(); g.close();
return 0;}
pr15
//pentru un numar x construiti numarul format din cifrele sale pare
//ex: pt x=12798 => 82
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int x;
int stergere(int x){
int cif,y=0;
while(x){
cif=x%10;
if(cif%2==0) y=y*10+cif;
x=x/10;
}
return y;
}
int main(){
f>>x;
g<<stergere(x);
f.close();
g.close();
return 0;
}
Pr16.
//verificati daca un sir este ordonat crescator
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int a[100],n,i,k;
int ordonare_cresc(int x[100], int n){
int i;
for(i=1;i<=n-1;i++)
if(a[i]>a[i+1]) return 0;
return 1;
}
int main(){
f>>n; k=0;
for(i=1;i<=n;i++)
f>>a[i];
if (ordonare_cresc(a,n)==1) g<<"DA";
else g<<"NU";
f.close();
g.close();
return 0;
}
Functii (Clasa X)
/*afisati numerele dintr-un sir ce au numarul cifrelor de 3 egal cu un y specificat
sir.in
4 (n numarul de elemnte)
2343 123 27 331 (sirul cu n elemente)
2 ( y cate cifre de 3 trebuie sa contina fiecare numar)

sir.out
2343 331 - aceste numere au 2 cifre de 3 */

#include <fstream>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
int n, k, a[100], i, y,x;
void citeste(int a[100], int &n) {
int i;
f>>n;
for(i=1; i<=n; i++)
f>>a[i];
}
int verifica( int x, int y) {
int k;
k=0;
while(x) {
if(x%10==3) k++;
x/=10;
}
if(k==y) return 1;
else return 0;

}
int main() {
citeste(a,n);
f>>y;
for(i=1; i<=n; i++)
if(verifica(a[i], y)==1) g<<a[i]<<' ';
f.close();
g.close();
return 0;
}

Fişierul text numere.in conţine pe prima linie un număr natural n (0<n<1000), iar pe a
doua linie n numere naturale cu cel mult 9 cifre fiecare, despărţite prin câte un spaţiu.
Scrieţi un program C/C++ care citeşte toate numerele din fişier şi afişează pe ecran,
separate prin câte un spaţiu, numerele de pe a doua linie a fişierului, care încep şi se
termină cu aceeaşi cifră.
Exemplu: dacă fişierul numere.in are conţinutul de mai jos
9
55 107 3 101 92 7 208 2782 80
se vor afişa
55 3 101 7 2782
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n, i, a[100], ciff, cifi,x;
void citire_sir(int a[100], int&n){
int i;
f>>n;
for(i=1;i<=n;i++)
f>>a[i];
}
int verificare_cifre(int x){
int ciff, cifi;
ciff=x%10;
while(x){cifi=x%10;
x/=10;}
if(ciff!=cifi) return 0;
return 1;
}

int main()
{
citire_sir(a,n);
for(i=1;i<=n;i++)
if(verificare_cifre(a[i])==1)g<<a[i]<<" ";
f.close();
g.close();
return 0;
}
Se considera un sir de n elemente si o cifra specificata c.
Afisati numerele din sir ce contin cifra c.
Ex:pentru fisierul de intrare de mai jos
4
231 45 34 4221
2 (cifra cautata)
se afiseza 231 4221
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,i,a[100],c,x;

void citeste_sir(int a[100],int &n){


int i;
f>>n;
for(i=1;i<=n;i++) f>>a[i];
}

int gaseste_cifra (int x, int c){


int cif;
while(x){
cif=x%10;
if(cif==c) return 1;
x=x/10;
}
return 0;
}

int main()
{
int c;
citeste_sir(a,n);
f>>c;
for(i=1;i<=n;i++)
if(gaseste_cifra(a[i],c)==1) g<<a[i]<<" ";
return 0;
}
Scrieţi definiţia completă a unui subprogram sum care primeşte prin parametrul x un
număr natural de cel mult 4 cifre şi returnează suma divizorilor numărului x, diferiţi de 1 şi
de el însuşi.
Exemplu: dacă x=10 se va returna valoarea 7 (7=2+5). (4p.)
b) Scrieţi programul C/C++ care citeşte de la tastatură un număr natural n (0<n<100), apoi
n numere naturale (cu cel mult 4 cifre fiecare). Programul determină, folosind apeluri utile
ale subprogramului sum, pentru fiecare număr natural citit, suma divizorilor săi proprii şi
afişează pe ecran sumele determinate, în ordinea crescătoare a valorilor lor, separate prin
câte un spaţiu. (6p.)
Exemplu: dacă n=5 şi numerele citite sunt 10 2 33 6 11
valorile afişate pe ecran vor fi: 0 0 5 7 14
deoarece suma divizorilor lui 10 este 7, suma divizorilor lui 2 este 0, suma divizorilor
lui 33 este 14, suma divizorilor lui 6 este 5, suma divizorilor lui 11 este 0.
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("numere.in");
ofstream g("numere.out");
int i,a[1000],b[100],r,n,s,x,j,aux;

int sum(int x){


int i,s=0;
for(i=2;i<x;i++)
if(x%i==0)
s+=i;
return s;}

int main(){
f>>n;
for(i=1;i<=n;i++)
f>>a[i];
for(i=1;i<=n;i++) b[i]=sum(a[i]);
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++)
if(b[i]>b[j]) {aux=b[j]; b[j]=b[i]; b[i]=aux;}}
for(i=1;i<=n;i++) g<<b[i]<<" ";
f.close();g.close();
return 0;
}

Tema
Subprogramul cifra primeşte prin intermediul parametrului a un număr natural cu cel mult 4
cifre şi returnează ultima cifră pară a sa. Dacă numărul nu conţine cifre pare,
subprogramul returnează valoarea -1. De exemplu, dacă a=8345, subprogramul va
returna 4.
a) Să se scrie definiţia completă a subprogramului cifra.
b) Pe prima linie a fişierului bac.in se află un număr natural nenul n (n≤15000), iar pe
a doua linie a fişierului se află un şir de n numere naturale, despărţite prin câte un spaţiu,
fiecare număr fiind format din cel mult 4 cifre.
Scrieţi un program C/C++ care citeşte numerele din fişier şi afişează pe ecran, folosind
apeluri utile ale subprogramului cifra, cel mai mare număr care se poate forma cu
ultimele cifre pare ale fiecărui element, dacă acestea există. Alegeţi o metodă de rezolvare
eficientă ca timp de executare. Dacă toate numerele de pe a doua linie a fişierului au
numai cifre impare, programul va afişa mesajul NU EXISTA.
Exemplu: dacă fişierul bac.in are conţinutul de mai jos:
7
369 113 2 0 33 1354 42
pe ecran se va afişa: 64220

Tema (suplimentara adica nu-i musai de facut)


Pr1.
Scrieţi un program C/C++ care citeşte numerele naturale nenule n şi k (k≤n≤100) şi un
tablou unidimensional cu n elemente numere întregi, fiecare având cel mult 4 cifre.
Programul modifică tabloul, permutând circular, cu k poziţii spre stânga, elementele
acestuia şi afişează pe ecran, separate prin câte un spaţiu, elementele tabloului obţinut.
Exemplu: dacă n=4, k=3 şi tabloul v=(1,2,3,4), atunci se vor afişa în ordine
elementele: 4 1 2 3.
Pr2.
a) Scrieţi doar antetul subprogramului nrdiv, care primeşte prin intermediul parametrului x
un număr natural nenul cu cel mult 4 cifre, şi returnează numărul de divizori primi ai lui x.
b) Pe prima linie a fişierului bac.in se află un număr natural nenul n (n≤1000), iar pe a
doua linie a fişierului se află un şir format din n numere naturale nenule, despărţite prin
câte un spaţiu, fiecare număr fiind format din cel mult 4 cifre. Scrieţi un program C/C++
care citeşte numerele din fişier şi care afişează pe ecran, folosind apeluri utile ale
subprogramului nrdiv, prima şi ultima valoare din şirul celor n numere citite, care au un
număr par de divizori primi. Numerele afişate vor fi separate printr-un spaţiu.
Exemplu: dacă fişierul bac.in are conţinutul de mai jos
7
30 105 20 140 7 10 5
pe ecran se va afişa:
20 10
Șiruri de caractere (varianta veche)
Tipul char
- Se foloseste pentru memorarea unui caracter
- (int) in fata unui caracter returneza codul ASCII a caracterului
- (char) in fata unui numar returneaza caracterul cu codul ASCII corespunzator numarului
Ex1:
#include <iostream>
using namespace std;
char a,b,c;
int main()
{
cout<<"dati un caracter " ;
cin>>a;
cout <<"caracterul citit este: " <<a<<" si are codul ASCII "<<(int)a<<endl;
b=82; // se memoreaza caracterul cu codul ASCII 82(82 este codul ASCII a R)
cout<<b<<" are codul ASCII "<<(int)b<<endl; //afiseaza caracterul cu codul ASCII 82
c='*'; //se memoreaza caracterul *
cout<<c<<" are codul ASCII "<<(int)c<<endl; //afiseaza caracterul * si codul sau ASCII 42
return 0;
}

Ex2:
#include <iostream>
using namespace std;
int x;
int main()
{
cout<<"dati un numar intre 0 si 127 " ;
cin>>x;
cout <<"caracterul cu codul ASCII introdus este: " <<(char)x<<endl;
x=x-1;
cout<<"caracterul care se afla inaintea sa este: " <<(char)x<<" "<<endl;
return 0;
}
Ex3:
//afisati cel mai mare caracter din doua citite, si caracterul dinainte si dupa primul caracter citit
#include <iostream>
using namespace std;
char a,b,c,d;
int main()
{
cout<<"dati doua caractere " ;
cin>>a>>b;
if(a>b)cout<<"caracterul mai mare este "<<a;
else cout<<"caracterul mai mare este "<<b;
cout<<endl;
c=a-1;d=a+1;
cout<<"caracterul care se afla inaintea sa este: " <<c<<" si cel dupa el este "<<d<<endl;
return 0;
}
/* for(char c=1;c<127;c++){
cout<<c<<" -> "<<(int)c<<" ";
if(c%8==0)cout<<endl;
}*/

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’)
 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
Citirea si afisarea
Citirea cuvant sau propozitie
Afisare orice
#include <iostream>
#include<cstring>
using namespace std;
char a[100],b[100];
char ch,e;
int main()
{
// cin>>a; //citire sir(cuvânt) pâna la spațiu
// cout<<a;

// cin.get(a,100); //citire sir(propozitie) cu cin.get( , ) var I


// cout<<a;

// cin.get(a,100,'g'); //citire sir(propozitie) cu cin.get( , , ) var II


// cout<<a;

// cin.getline(a,100); //citire sir(propozitie cu tot cu ’\n’) cu cin.getline( , ) var III


// cout<<a;

// cout<<"dati prop 1"; //citire doua propozitii cu cin.get( ) intre ele


// cin.get(a,100);
// cin.get();
// cout<<"dati prop 2";
// cin.get(b,100);
// cout<<a<<" "<<b;

/ cout<<"dati prop 1"; //citire doua propozitii cu cin.getline( )


// cin.getline(a,100);
// cout<<"dati prop 2";
// cin.getline(b,100);
// cout<<a<<" "<<b;
//citire numar si apoi sir
int n;
cin>>n;
cin.get();
cin.get(s,101);
cout<<s[n];
Pointeri
//char *p; //pointeri la char
//char c[100]="Ana are mere";
// p=c;
// cout<<p<<endl<<c+1<<endl;
// p++;
// cout<<p;

 operatori trebuie #include<cstring>


- lungime sir strlen(s2) - returneaza numarul de caractere din sir
- copiere(atribuire)
strcpy(destinatie,sursa) ex: strcpy(s1,s2); (copiaza s2 in s1)
(stregere) strcpy(a,a+2); char *p=a; strcpy(p,p+2); -sterge primele doua
caractere
strcpy(a+i,a+i+1);
- comparare
strcmp(s1,s2); (se face diferenta intre litere mici si mari)
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
(s1=s1+s2)
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.
- Cautare caracter
strchr(s1,c) - verifica daca caracterul „c” este in sir al lui s1 si returneaza adresa
unde se gaseste „c” dacă există şi NULL (0) în caz contrar.

- Extrage cuvintele dintr-un sir


(s1- este sirul din care se extrag cuvintele; separator este sirul de caractere
care pot fi intre cuvintele propozitiei char separator[]=”;’?> !”;
strtok – returneaza cate un cuvant la fiecare apel
 Primul apel!!!
strtok(s1,separator) – returneaza adresa(pointer) primului cuvant dacă
există şi NULL (0) în caz contrar.
 Restul aplelurilor!!!
strtok(NULL,separator) – returneaza adresa(pointer) urmatorului cuvant
dacă există şi NULL (0) în caz contrar.

 conversii şir de caractere şi valori numerice( trebuie #include<cstdlib>)

- 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=atod(”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

Declarare char a[100]; de la 0!!


//functii pe siruri

//strlen(sir)
//char a[100],b[100]="mama";//str=string; len=length
//cin.get(a,100);
//cout<<strlen(a);

int z=strcmp(a,b);
if(z>0)cout<<"primul este mai mare";
else if(z<0)cout<<"al doilea este mai mare";
else cout<<"sunt egale";
//strcpy(sir1,sir2)
//strcpy(b,a);cout<<"sirul b este:"<<b;

//strcat(sir1,sir2)
//strcat(b,a);
//cout<<"sirul b este: "<<b<<endl;
//cout<<"sirul a este: "<<a;

strncat(sir1,sir2,n)
//strncat(b,a,3);
//cout<<"sirul b este: "<<b<<endl;
//cout<<"sirul a este: "<<a;
return 0;
}
////Fie o propozitie. Se cere:
//a)afisati numarul de caractere ale propozitiei
//b)cate litere de 'a' contine propozitia
//c)sa se afiseze propozitia fara literele de 'c' din ea
//d)transformati toate literele propozitiei la majuscule
//e)transf. literele mari in mici si cele mici in mari
//f)cate consoane si cate vocale are o propozitie
#include <iostream>
#include<cstring>
using namespace std;
char a[100];
int i,k;
int main()
{
cout<<"dati propozitie";
cin.get(a,100);
//a)
cout<<"lungimea propozitiei:"<<strlen(a)<<endl;
// b)
for(i=0;i<strlen(a);i++)
if(a[i]=='a' or a[i]=='A')k++;
cout<<"numarul de litere de a este:"<<k<<endl;
//c)
cout<<"propozitia fara litera 'c' este:";
for(i=0;i<strlen(a);i++)
if(a[i]!='c' and a[i]!='C')cout<<a[i];
cout<<endl;
//d)
// for(i=0;i<strlen(a);i++)
// if(a[i]>='a' and a[i]<='z')a[i]=a[i]-32;
// cout<<a<<endl;
//e)
// for(i=0;i<strlen(a);i++)
// if(a[i]>='a' and a[i]<='z')a[i]=a[i]-32;
// else
// if(a[i]>='A' and a[i]<='Z') a[i]=a[i]+32;
// cout<<a<<endl;
//f)
int voc=0,con=0;
for(i=0;i<strlen(a);i++)
if((a[i]>='a' and a[i]<='z')or(a[i]>='A' and a[i]<='Z'))
if(a[i]=='a' or a[i]=='e' or a[i]=='i' or a[i]=='o' or a[i]=='u' or
a[i]=='A' or a[i]=='E' or a[i]=='I' or a[i]=='O' or a[i]=='U' )voc++;
else con++;
cout<<"numar vocale si consoane:"<<voc<<" "<<con<<endl;

return 0;
}
// ch='p';
// cout<<ch;
//citire sir pana la spatiu
// cin>>a;
// cout<<a;
//citire cu cin.get var I
// cin.get(a,100);
// cout<<a;
//citire cu cin.get var II
// cin.get(a,100,'g');
// cout<<a;
// cout<<"dati prop 1";
// cin.get(a,100);
// cin.get();
// cout<<"dati prop 2";
// cin.get(b,100);
// cout<<a<<" "<<b;

//pointeri la char
//char *p;
//char c[100]="Ana are mere";
// p=c+1;
// cout<<p<<endl<<c+1<<endl;
// p++;
// cout<<p;
//char a[100],b[100]="mama";
//cin.get(a,100);
//cout<<strlen(a);
//strcpy(b,a);cout<<"sirul b este:"<<b;
//strcat(b,a);
//cout<<"sirul b este: "<<b<<endl;
//cout<<"sirul a este: "<<a;
//strncat(b,a,3);
//cout<<"sirul b este: "<<b<<endl;
//cout<<"sirul a este: "<<a;
//impartire propozitie in cuvinte cu strtok
#include <iostream>
#include<cstring>
using namespace std;
char a[100];
char separator[]=", ?!:.";
char *p;//pointer la char
int main()
{
cin.get(a,100);
p=strtok(a,separator);
while(p){
cout<<p<<endl;
p=strtok(0,separator);//NULL este 0
}
return 0;
}
//impartire propozitie in cuvinte cu memorarea in vector de cuvinte
#include <fstream>
#include<cstring>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
char a[100],separator[]=", ?!:.",*p;//pointer la char
char cuv[10][20];//sir de 10 cuvinte cuv[0],cuv[1],…cuv[9]
//fiecare cu are maxim 19 caractere fiecare
int i,n;
int main()
{
f.get(a,100);
p=strtok(a,separator);
while(p){
n++;
strcpy(cuv[n],p);
p=strtok(0,separator);//NULL este 0
}
for(i=1;i<=n;i++)g<<cuv[i]<<endl;
return 0;
}
//ordonarea lexicografica a cuvintelor dintr-o propozitie
#include <fstream>
#include<cstring>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
char a[100],separator[]=", ?!:.",*p;//pointer la char
char cuv[10][20];//sir de 10 cuvinte cuv[0],cuv[1],…cuv[9]
//fiecare cu are maxim 19 caractere fiecare
int i,n,j;
int main()
{
f.get(a,100);
p=strtok(a,separator);
while(p){
n++;
strcpy(cuv[n],p);
p=strtok(0,separator);//NULL este 0
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(strcmp(cuv[i],cuv[j])>0)swap(cuv[i],cuv[j]);

for(i=1;i<=n;i++)g<<cuv[i]<<endl;
return 0;
}
//sterge aparitiile unui sir b dintr-un sir a
#include <fstream>
#include<cstring>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
char a[100],b[100],*p;//pointer la char
int i,n;
int main()
{
f.get(a,100);
f.get();//!!!!!!!!
f.get(b,100);
p=strstr(a,b);
while(p){
strcpy(p,p+strlen(b));
p=strstr(a,b);
}
g<<a;
return 0;
}
Bac 2009 V58 SII p5(stergeti tot ce nu este litera) 3 varriante
#include <fstream>
#include<cstring>
using namespace std;
ifstream f("sir.in");
ofstream g("sir.out");
char separator[100],s[100],cuv[100][100],*p;//pointer la char
int i,n,t;
int main()
{
// //metoda 1 merge!
// f.get(s,51);
// for(i=0;i<=strlen(s)-1;i++)
// if(s[i]<'A' or (s[i]>'Z' and s[i]<'a')or s[i]>'z')
// separator[n++]=s[i];
// g<<separator<<endl;;
// for(i=0;i<strlen(separator);i++)
// {
// p=strchr(s,separator[i]);
// if(p)strcpy(p,p+1);
// }
// g<<s;
//metoda 2 merge!
f.get(s,51);
for(i=0;i<=strlen(s)-1;i++)
if(s[i]<'A' or (s[i]>'Z' and s[i]<'a')or s[i]>'z')
separator[n++]=s[i];
p=strtok(s,separator);
while(p){
t++;
strcpy(cuv[t],p);
p=strtok(0,separator);
}
for(i=1;i<=t;i++)g<<cuv[i];
//metoda 3 merge!
// f.get(s,51);
// i=0;
// while(i<strlen(s)-1)
// if(s[i]<'A' or (s[i]>'Z' and s[i]<'a')or s[i]>'z')
// strcpy(s+i,s+i+1);
// else i++;
// g<<s;
return 0;
}
Tipul string
#include <iostream>
#include<cstring>
using namespace std;
string s,t,z,s1;
char a[100];
int k,i;
void testare_functii(){
//www.cplusplus.com/reference/ selectare "strings library" si
//classes: string - si aici este lista cu toate functiile si exemple
cout << "dati cuvant";
cin>>s; //citeste doar un cuvant!!!!!!!!!!!
cout<<"cuvantul citit este:"<<s<<endl;
cin.get();//trece peste sfarsitul de linie
cout << "dati un sir (mai multe cuvinte): ";
getline(cin,s); //citeste mai multe cuvinte
t=s; //atribuire sir
z=t+" + "+s; //concatenarea (lipirea)
cout<<"sirul citit este:"<<s<<endl;
cout<<"sirul concatenat este: "<<z<<endl<<"prima litera a sirului concatenat este:"<<z[0]<<endl;
//cate literele de "a" sunt in sir
//s.length() sau s.size() - da nr. de caractere din sirul s
k=0;
for(i=0;i<s.length();i++)
if(s[i]=='a')k++;
//cout<<"numar aparitii litera a din sirul s este:"<<k<<endl;

//sir.erase(p,li) sterge din sirul "sir" de la pozitia p, li caractere


t="mama are mere";
t.erase(1,4);
cout<<"(erase) sirul dupa stegere este:"<<t<<endl;

// sir.replace(p,m,s1) - inlocuieste in sirul "sir" de la pozitia p, m caractere cu sirul s1


s="calculator";s1="tara";
s.replace(2,5,s1);
cout<<"(replace)sirul modificat este:"<<s<<endl;

// sir.insert(p,s1) - insereaza in sirul "sir" de la pozitia p sirul s1


s="catel";s1="strave";
s.insert(2,s1);
cout<<"(insert)sirul modificat este:"<<s<<endl;

// sir.find(s1,p) - cauta in sirul "sir" sirul s1 de la pozitia p


//returneaza pozitia in care s-a gasit sirul s1!!! sau string::npos=4.294.967.295 in caz de negasit
s="calculatoculr";s1="cul";
if(s.find(s1,4)!=string::npos) cout<<"(find)sirul a fost gasit la pozitia "<<s.find(s1,4)<<endl;
else cout<<"(find)sirul nu a fost gasit"<<endl;

// sir.substr(p,lung) - returneaza din sirul "sir" un subsir de la pozitia p si lungime "lung"


s="crocodil";
cout<<"(substr) subsirul din s este:"<<s.substr(5,3)<<endl;

//sir.append(t,p,l) - adauga la sirul "sir" o parte din sirul t (de la pozitia p, l caractere)
s="catel";s1="jucaus";
s.append(s1,4,2);
cout<<"(append)"<<s<<endl;
}

//afisati cuvintele dintr-o propozitie si numarul lor


//propozitia are cuvintele separate printr-un spatiu
//varianta I
void pr1(){
int k,p;
cout<<"dati propozitie:";
getline(cin,s);
s=s+' ';k=0;
for (i=0;i<s.length();i++)
if (s[i]!=' ') cout<<s[i];
else {k++;cout <<endl;}
//varianta II
do {
k++; // s="ana are mere " =>"are mere " =>"mere "=>""
p=s.find(" ",0);
cout<<s.substr(0,p)<<endl;
s.erase(0,p+1);
}while(s.find(" ",0)!=string::npos);

cout<<"numar cuvinte:"<<k;
}
//afisati cuvintele dintr-o propozitie crescator
//propozitia are cuvintele separate printr-un spatiu

void pr2(){
int j,n,i,p;
string a[20],aux;
cout<<"dati propozitie:";
getline(cin,s);
s=s+' ';j=1;
for (i=0;i<s.length();i++)
if (s[i]!=' ') a[j]=a[j]+s[i];
else j++;
//varianta II
/*do {
p=s.find(" ",0);
a[++i]=s.substr(0,p);
s.erase(0,p+1);
}while(s.find(" ",0)!=string::npos);*/
n=j-1;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if (a[i]>a[j]){aux=a[i];a[i]=a[j];a[j]=aux;}
for(i=1;i<=n;i++) cout<<a[i]<<" ";
}
void pr3(){
//afisati cuvintele dintr-o propozitie ce au 3 vocale
//afisati cuvintele ce sunt anagrame
//afisati cele mai lungi cuvinte
}
//stergeti primul cuvant si aparitiile acestuia din propozitie
void pr4(){

string t="",s;
int p,i;
getline(cin,s);
i=0;
while(s[i]!='*')t+=s[i++];
s.erase(0,i);
while(s.find(t,p)!=string::npos){
p=s.find(t,0);
if(s[p-1]=='*'&&s[p+i]=='*') s.erase(p,t.size());
}
cout<<s;
}
//verifica daca doua cuvinte sunt anagrame
void pr5(){
string s1,s2;
int d1,d2,anag,i,j;
char aux;
cout<<"dati sirul 1";
cin>>s1;
cout<<"dati sirul 2";
cin>>s2;
d1=s1.size();
d2=s2.size();
if(d1!=d2)anag=0;
else {
for(i=0;i<=d1-1;i++)
for(j=i+1;j<=d1-1;j++)
if(s1[i]>s1[j]){aux=s1[i];s1[i]=s1[j];s1[j]=aux;}
for(i=0;i<=d2-1;i++)
for(j=i+1;j<=d2-1;j++)
if(s2[i]>s2[j]){aux=s2[i];s2[i]=s2[j];s2[j]=aux;}
if (s1==s2)anag=1;
else anag=0;
}
if(anag) cout<<"este anagrama";
else cout<<"nu este anagrama" ;
}

//anagrame var 2
void pr6(){
string s1,s2,s,t;
int d1,d2,anag,i,j;
char aux;
cout<<"dati sirul 1";
cin>>s1;
cout<<"dati sirul 2";
cin>>s2;
d1=s1.size();
d2=s2.size();
if(d1!=d2)anag=0;
else {
anag=1;
s=s1;t=s2;
for(i=0;i<d1;i++){
if(t.find(s[i])!=string::npos)
t.erase(t.find(s[i]),1);
}
if(t!="")anag=0;
s=s1;t=s2;
for(i=0;i<d2;i++){
if(s.find(t[i])!=string::npos)
s.erase(s.find(t[i]),1);
}
if(s!="")anag=0;
}
if(anag) cout<<"este anagrama";
else cout<<"nu este anagrama" ;

}
int f[128],n;
void pr7(){
string s,t,vocale="aeiou";
getline(cin,s);
n=s.size();
for(i=0;i<n;i++) f[s[i]]++;
//afisati literele distincte
for(char c='a';c<='z';c++) if(f[c]>0)cout<<c;
//afisati caracterele distincte(toate ..si /><!
for(i=0;i<=127;i++) if(f[i]>0)cout<<(char)i;
}
int main()
{
testare_functii();
//pr1();
return 0;
}

Noutati
//inlocuiti aparitiile unei litere cu alta litera si //prima si ultima litera a cuvintelor din
invers intr-un sir propozitie sa fie mari
// a si o „hopa topa” => „hapo tapo” //mama are mere => MamA ArE MarE
#include <iostream> #include <iostream>
#include<cstring> #include <cstring>
using namespace std; using namespace std;
int n,i; int main()
string s; {
char c1,c2; string s;
int main() int n,i;
{ cout<<"Dati o propozitie:";
cout<<"Dati doua caractere pentru inlocuire:"; getline(cin,s);
cin>>c1>>c2; s+=" "; n=s.size();
cin.get(); s[0]-=32;
cout<<"Dati o propozitie:"; for(i=0;i<n;i++){
getline(cin,s); if(s[i]!=' ' and(s[i+1]==' 'or s[i-1]==' '))
n=s.size(); if(s[i]>='a' and s[i]<='z') s[i]-=32;}
cout<<s<<endl; cout<<s;
for(i=0;i<n;i++){ return 0;
if(s[i]==c1) s[i]=c2; }
else
if(s[i]==c2) s[i]=c1;
}
cout<<s;
return 0;
}

/*Se citesc doua siruri de caractere.Sa se //afisati clonele unui cavant(se strege una din
afiseze pe ecran cel mai vocale)
lung sufix comun al celor doua siruri de //ex: informatica => informtic nformatca
caractere. infrmatica
macaroana =>oana #include <iostream>
faraoana #include <cstring>
*/ using namespace std;
#include <iostream> string cuv,t;
#include<cstring> int n,i;
using namespace std; int main()
string s1, s2; {
int l1,l2; cout<<"Dati cuvantul:";
int main() getline(cin, cuv);
{ n=cuv.size();
cout<<"Dati primul sir:"; t="";
getline(cin,s1); for(i=0;i<n;i++)
cout<<"Dati cel de-al doilea sir:"; if(cuv[i]!='e') t+=cuv[i];
getline(cin,s2); cout<<t<<endl;
l1=s1.size()-1; t="";
l2=s2.size()-1; for(i=0;i<n;i++)
while(s1[l1]==s2[l2]) {l1--;l2--;} if(cuv[i]!='a') t+=cuv[i];
l1++; cout<<t<<endl;
cout<<"Sufixul comun t="";
este:"<<s1.substr(l1); for(i=0;i<n;i++)
return 0; if(cuv[i]!='i') t+=cuv[i];
} cout<<t<<endl;
t="";
for(i=0;i<n;i++)
if(cuv[i]!='o') t+=cuv[i];
cout<<t<<endl;
t="";
for(i=0;i<n;i++)
if(cuv[i]!='u') t+=cuv[i];
cout<<t<<endl;
return 0;
}
Tipul struct
elev = nume,prenume,varsta,clasa,nr_absente,medie_generala(campuri)

#include <iostream>
using namespace std;
struct elev{
char nume[20];
char pren[20];
int varsta,clasa,nr_abs;
float med;
};

//int a;
elev b;
int main()
{
cout << "Dati nume si prenume" ;
cin>>b.nume;
cin>>b.pren;
cout<<" Dati varsta, clasa, abs si med ";
cin>>b.varsta>>b.clasa>>b.nr_abs>>b.med;
cout<<" Datele elevei sunt :";
cout<<endl<<b.nume<<endl<<b.pren<<endl<<b.varsta;
cout<<endl<<b.clasa<<endl<<b.nr_abs<<endl<<b.med;

return 0;
}

Pr. Se citesc datele a n elevi. Sa se afiseze lista elevilor pe ecran,

#include <iostream>
using namespace std;
struct
{
char nume[20];
char pren[20];
int varsta,clasa,nr_abs;
float med;
}a[100],e;
int i,n;
int main()
{
cout<<"dati n:";
cin>>n;
for(i=1; i<=n; i++)
{
cout << "Dati nume si prenume" ;
cin>>a[i].nume>>a[i].pren;
cout<<" Dati varsta, clasa, abs si med ";
cin>>a[i].varsta>>a[i].clasa>>a[i].nr_abs>>a[i].med;
}
cout<<" Datele elevilor sunt :"<<endl;
for(i=1; i<=n; i++)
cout<<a[i].nume<<" "<<a[i].pren<<" "<<a[i].varsta
<<" "<<a[i].clasa<<" "<<a[i].nr_abs<<" "<<a[i].med<<endl;
return 0;
}
Pr1. Se citesc datele a n elevi nume, prenume, varsta si media .Afisati descrescator dupa medie elevii
cititi de la tastatura.

#include <iostream>
using namespace std;
struct elev{ string nume, prenume;
int varsta;
float med;}a[100];
int i,j,n;
int main()
{
cout<<"Dati numarul de elevi:";
cin>>n;
for(i=1;i<=n;i++){
cout<<"Dati elevul + datele acestuia:"<<endl;
cin>>a[i].nume>>a[i].prenume>>a[i].varsta>>a[i].med;
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i].med<a[j].med) swap(a[i],a[j]);
for(i=1;i<=n;i++)
cout<<a[i].nume<<" "<<a[i].prenume<<" "<<a[i].varsta<<" "<<a[i].med<<endl;
return 0;
}

Pr2.
/*Se considera n persoane.Afiasti persoanele crescator dupa data nasterii.*/
#include <iostream>
using namespace std;
struct pers{
string nume, prenume;
struct data{ int zi, luna, an;
}datan;
int clasa;
}p[100];
int i,j,n;
int main()
{
cout<<"Dati numarul de elevi:";
cin>>n;
for(i=1;i<=n;i++)
cin>>p[i].nume>>p[i].prenume>>p[i].datan.zi>>p[i].datan.luna>>p[i].datan.an>>p[i].clasa;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++){
if(p[i].datan.an>p[j].datan.an) swap(p[i],p[j]);
if(p[i].datan.an==p[j].datan.an and p[i].datan.luna>p[j].datan.luna) swap(p[i],p[j]);
if(p[i].datan.an==p[j].datan.an and p[i].datan.luna==p[j].datan.luna and p[i].datan.zi>p[j].datan.zi)
swap(p[i],p[j]);
}
for(i=1;i<=n;i++)
cout<<p[i].nume<<" "<<p[i].prenume<<" "<<p[i].datan.zi<<" "<<p[i].datan.luna<<" "
<<p[i].datan.an<<" "<<p[i].clasa<<endl;
return 0;
}

Pr3.
/*Fie n persoane.Afisati persoanele nascute in ianuarie.*/
#include <iostream>
using namespace std;
struct pers{ string nume, prenume;
struct data{ int zi, luna, an;
}datan;
int clasa;
}p[100];
int i,n;
int main()
{
cout<<"Dati numarul de elevi:";
cin>>n;
for(i=1;i<=n;i++)
cin>>p[i].nume>>p[i].prenume>>p[i].datan.zi>>p[i].datan.luna>>p[i].datan.an>>p[i].clasa;
for(i=1;i<=n;i++)
if(p[i].datan.an==2000)
cout<<p[i].nume<<" "<<p[i].prenume<<" "<<p[i].datan.zi<<" "<<p[i].datan.luna<<" "
<<p[i].datan.an<<" "<<p[i].clasa<<endl;
return 0;
}

Pr4.

//Fie un magazie
//a)ordonati materialele dupa cantitate
//b)afisati un material cu cantitatea maxima
//c)afisati materialele achizitionate cu un an in urma(2010)
#include <iostream>
using namespace std;
struct materiale{ string den;
int cant;
float pret;
struct data{int zi,luna,an;}datan;
}p[100];
int i,j,n;
int main()
{ cout<<"Dati n:";
cin>>n;
for(i=1;i<=n;i++)
cin>>p[i].den>>p[i].cant>>p[i].pret>>p[i].datan.zi>>p[i].datan.luna>>p[i].datan.an;
//a)
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++)
if(p[i].cant>p[j].cant) swap(p[i],p[j]);
}
cout<<"lista materiale ordonate"<<endl;
for(i=1;i<=n;i++) cout<<p[i].den<<endl;
//b)
cout<<"maximul:"<<p[n].den<<endl;
//c)
for(i=1;i<=n;i++)
if(p[i].datan.an==2010) cout<<p[i].den;

return 0;
}
Pr5.

//Fie o farmacie( medicament - nume,data expirarii, pret si cantitate


//a) afisati medicamentele ordonate descrescator dupa nume
//b)medicamentele de stoc 0
//c)afisati datele despre un medicament citit de la tastatura
#include <iostream>
using namespace std;
struct medicament{
string nume;
struct dataexpirarii {
int zi,luna,an;
}data;
int pret,cantitate;
}a[100];
int i,j,n;
string c;
int main()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i].nume>>a[i].pret>>a[i].cantitate>>a[i].data.zi>>a[i].data.luna>>a[i].data.an;
//a)
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i].nume<a[j].nume) swap(a[i],a[j]);
for(i=1;i<=n;i++)
cout<<a[i].nume<<" "<<a[i].pret<<" "<<a[i].cantitate<<" "<<a[i].data.zi<<" "
<<a[i].data.luna<<" "<<a[i].data.an<<" "<<endl;
//b
for(i=1;i<=n;i++)
if(a[i].cantitate==0) cout<<" "<<a[i].nume<<" "<<a[i].pret<<" "<<a[i].cantitate<<" "
<<a[i].data.zi<<" "<<a[i].data.luna<<" "<<a[i].data.an;
//c
cin>>c;
for(i=1;i<=n;i++)
if(c==a[i].nume) cout<<a[i].nume<<a[i].pret<<a[i].cantitate<<a[i].data.zi
<<a[i].data.luna<<a[i].data.an;
return 0;
}
Liste alocate static
Lista
Lista este structura de date secventiala in care se pot face diferite operatii:
1. creare lista
2.adaugare element la sfarsitul listei
3. adaugare element pe o pozitie specificata
4. stergerea unui element pe o pozitie specificata
5.afisarea listei

#include <iostream>
using namespace std;
void creare (int a[100], int &n)
{
int i;
cout<<"Dati n:";
cin>>n;
for (i=1; i<=n; i++) {cout<<"Dati element: "; cin>>a[i]; }
}
void adaugare_sf (int a[100],int &n)
{
int y;
cout<<"Dati element: ";cin>>y;
n++;a[n]=y;
}
void adauga (int a[100], int &n)
{
int x,p,i;
cout<<"Dati element de adaugat si pozitia lui: ";
cin>>x>>p;
for (i=n; i>=p; i--)
a[i+1]=a[i];
a[p]=x;
n++;
}
void stergere (int a[100], int &n)
{
int i,p;
cout<<"Dati pozitia care doriti sa fie stearsa: ";
cin>>p;
for (i=p; i<=n-1; i++)
a[i]=a[i+1];
n--;
}
void listare (int a[100], int n)
{
int i;
cout<<"Lista este: ";
for (i=1; i<=n; i++)
cout<<a[i]<<' ';
}
int main()
{
int a[100],n,x;
do
{
cout<<endl<<"MENIU"<<endl;
cout<<"Tastati 1 pentru creare lista. "<<endl;
cout<<"Tastati 2 pentru adaugare element la sfarsitul listei. "<<endl;
cout<<"Tastati 3 pentru adaugare element pe o pozitie specificata. "<<endl;
cout<<"Tastati 4 pentru stergerea unui element pe o pozitie specificata. "<<endl;
cout<<"Tastati 5 pentru afisarea listei. "<<endl;
cout<<"Tastati 9 pentru iesire. "<<endl;
cin>>x;
if (x=='1') creare (a,n);
if (x=='2') adaugare_sf (a,n);
if (x=='3') adauga (a,n);
if (x=='4') stergere (a,n);
if (x=='5') listare (a,n);
//cin>>z;
}
while (x!='9');

return 0;
}

Coada
Coada este o lista speciala pentru care avem doua operatii:
1.adaugarea se face la sfarsit
2.extragerea elementelor se face de la inceput
#include <iostream>
#include<windows.h> //contine system ("cls"); ce sterge ecranul
#include <conio.h> //biblioteca de functii - contine getch() functie ce citeste un caracter
//de la tastatura fara afisarea lui pe ecran
using namespace std;
void adaugare_sf (int a[100],int &n)
{
int y;
cout<<"Dati element: ";
cin>>y;
n++;
a[n]=y;
}
void stergere (int a[100], int &n)
{
int i;
for (i=1; i<=n-1; i++)
a[i]=a[i+1];
n--;
}
void listare (int a[100], int n)
{
int i;
cout<<"Coada este: ";
for (i=1; i<=n; i++)
cout<<a[i]<<' ';
}
int main()
{
int a[100],n,x;
n=0;
do
{system ("cls");
cout<<endl<<"MENIU pt. operatii cu coada"<<endl;
cout<<"Tastati 1 pentru adaugare element la coada. "<<endl;
cout<<"Tastati 2 pentru stergerea unui element din coada. "<<endl;
cout<<"Tastati 3 pentru afisarea cozii. "<<endl;
cout<<"Tastati 9 pentru iesire. "<<endl;
x=getch();
if (x=='1') adaugare_sf (a,n);
if (x=='2') stergere (a,n);
if (x=='3') listare (a,n);
getch();
}
while (x!='9');

return 0;
}
Stiva
Stiva este o lista speciala pentru care avem doua operatii ce se fac ambele in capul stivei
1.adaugarea se face in capul stivei
2.extragerea elementelor se face din capul stivei

#include <iostream>
#include<windows.h> // pentru system("cls");
#include <conio.h>
using namespace std;
void adaugare_sf (int a[100],int &n)
{
int y;
cout<<"Dati element: "; cin>>y;
n++; a[n]=y;
}
void stergere (int a[100], int &n)
{
n--;cout<<"s-a sters elementul "<<a[n+1]<<"din stiva";
}
void listare (int a[100], int n)
{
int i;
cout<<"Stiva este: ";
for (i=1; i<=n; i++)
cout<<a[i]<<' ';
}
int main()
{
int a[100],n,x;
n=0;
do
{system("cls");
cout<<endl<<"MENIU pt. stiva"<<endl;
cout<<"Tastati 1 pentru adaugare element la stiva "<<endl;
cout<<"Tastati 2 pentru stergerea unui element din stiva. "<<endl;
cout<<"Tastati 3 pentru afisarea stivei. "<<endl;
cout<<"Tastati 9 pentru iesire. "<<endl;
x=getch();
if (x=='1') adaugare_sf (a,n);
if (x=='2') stergere (a,n);
if (x=='3') listare (a,n);
getch();
}
while (x!='9');
return 0;
}
Pointeri
#include <iostream> Pr2.
using namespace std; //creare lista de elemente si afisare pe ecran
struct complex { //adaugarea elementelor se face la inceput
int re,im; //suma elementelor pare din lista
}; #include <iostream>
int *r; using namespace std;
complex *a,*b,*c;//declarare pointer struct nod
int main() {
{ int info;
a=new complex;//creare v. dinamica in nod * urm;
Heap;pointerul a indica la ea };
b=new complex; nod *p,*q,*prim;
c=new complex; int i,n,x;
cin>>a->re>>a->im; int main(){
cin>>b->re>>b->im; prim=0;
c->re=a->re+b->re; cin>>n;
c->im=a->im+b->im; for(i=1; i<=n; i++){
cout<<c->re<<" "<<c->im; cin>>x;
delete a;delete b;delete c;//stergere v. p=new nod;
dinamica p->info=x;
return 0; p->urm=prim;
} prim=p;
Pr1. }
/*Sa se creeze o lista de n elemente si sa se cout<<"lista este:";
afiseze pe ecran lista*/ p=prim;
#include <iostream> while(p){
using namespace std; cout<<p->info<<" ";
struct nod{ p=p->urm;
int info; }
nod *urm;}; //suma elementelor pare din lista
nod *p, *q, *prim; int s=0;
int i,n,x; p=prim;
int main(){ while(p) {
prim=0; if(p->info%2==0) s+=p->info;
cin>>n; p=p->urm;
for(i=1;i<=n;i++){ }
cin>>x; cout<<"suma este:"<<s;
p=new nod; return 0;
p->info=x; }
p->urm=prim;
prim=p;
}
p=prim;
while(p){
cout<<p->info<<" ";
p=p->urm;
}
return 0;
}

Pr3. Pr4.
/*Introducerea in lista la sfarsit a si afisarea /*Sa se afiseze produsul elementelor impare
listei*/ dintr-o lista*/
#include <iostream> #include <iostream>
using namespace std; using namespace std;
struct nod { struct nod{
int info; int info;
nod *urm; nod *urm;};
}; nod *p, *q, *prim;
nod *p, *prim, *c; int i,n,x,pr;
int i, n, x; int main(){
int main() { prim=0;
cin >> n;prim = 0; cin>>n;
for (i = 1;i <= n;i++) { for(i=1;i<=n;i++){
c = new nod; cin>>x;
cout << "Dati elemente:"; p=new nod;
cin >> x; p->info=x;
c->info = x; p->urm=prim;
c->urm = 0; prim=p;}
if (prim) { pr=1;
p = prim; p=prim;
while (p->urm) p = p->urm; while(p){
p->urm = c; if(p->info%2==1)
} pr*=p->info;
else prim=c; p=p->urm;}
} cout<<"prod elem impare este:"<<pr;
p = prim; return 0;
while (p){ cout<<p->info<<" "; p = p->urm;} }
return 0;
}

/*Sa se creeze o lista de n elemente cu prim si ultim*/


#include <iostream>
using namespace std;
struct nod{
int info;
nod *urm;};
nod *p, *q, *prim,*ultim;
int i,n,x;
int main(){
prim=ultim=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
p=new nod;
p->info=x;
p->urm=0;
if(prim==0){prim=ultim=p;}
else{
ultim->urm=p;
ultim=p;
}
}
p=prim;
while(p){
cout<<p->info<<" ";
p=p->urm;
}
return 0;
}
Pr5.
operatii cu coada: adaugare, extragere, listare folosind un meniu

#include <iostream>
#include<conio.h>
#include<windows.h>
using namespace std;
struct nod
{
int info;
nod* adr;
};
nod* v1,*v2;

void adauga(nod * &v1,int x)


{
nod *c,*p;
c=new nod;
c->info=x;
c->adr=0;
if(v1)
{
p=v1;
while(p->adr) p=p->adr;
p->adr=c;
}
else v1=c;
}

void extrage(nod * &v1,int &x)


{
nod *c;
c=v1;
x=c->info;
v1=c->adr;
delete c;
}

void listare(nod *v)


{
nod *c;
cout<<"elmentele listei sunt:";
c=v;
while(c)
{
cout<<c->info<<" ";
c=c->adr;
}
cout<<endl;
}

int main()
{
int x,y;
nod *prim;
prim=0;
do
{
system("cls"); //sterge ecranul
cout<<"operatii cu coada"<<endl;
cout<<"tastati 1 pentru adaugare"<<endl;
cout<<"tastati 2 pentru extragere"<<endl;
cout<<"tastati 3 pentru listare"<<endl;
cout<<"tastati 4 pentru iesire din program"<<endl;
cin>>x;
if(x==1){cout<<"dati element";cin>>y;adauga(prim,y);}
if(x==2){ if (!prim)cout<<"stiva vida";
else
{
extrage(prim,y);
cout<<"elementul extras este:"<<y;
}
}
if(x==3) listare(prim);
getch();
} while(x!=4);
return 0;
}

Pr6.
//Adaugare elemente in coada (coada cu prim(prim) si ultim(u))
#include <iostream>
using namespace std;
struct nod {
int info;
nod *urm;
};
nod *p, *prim, *c,*u;
int i, n, x;
int main() {
prim=0;
cin >> n;
for (i = 1; i <= n; i++) {
c = new nod;
cout << "Dati elemente:";
cin >> c->info ;
c->urm = 0;
if (prim) {
u->urm=c;
u=c;
}
else {
prim=c;
u=c;
}
}
while (prim) {
cout<<prim->info<<" ";
prim = prim->urm;
}
return 0;
}
Pr7.
/*Se considera o coada cu santinele.Sa se extraga un element.*/
#include <iostream>
using namespace std;
struct nod{
int info;
nod *urm;
};
nod *p, *st1, *st2, *c;
int i, n, x;
void adaugare_coada(nod*&st1, nod*&st2, int x){
nod*p=new nod;
st2->urm=p;
st2->info=x;
st2=p;}
int extragere_coada(nod*&st1, nod*&st2, int&x){
if(st1->urm!=st2){
c=st1->urm;
st1->urm=c->urm;
x=c->info;
delete c;
return 1;
}
return 0;
}
void afisare_coada(nod *st1, nod*st2){
p=st1->urm;
while(p!=st2){
cout<<p->info<<" ";
p=p->urm;
}
cout<<endl;
}

int main(){
int i;
st1=new nod;
st2=new nod;
st1->urm=st2;
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
adaugare_coada(st1, st2, x);
}
afisare_coada(st1, st2);
if(extragere_coada(st1, st2, x))
cout<<"Elementul sters este:"<<x<<endl;
else cout<<"Nu se poate sterge element pt. ca coada este vida";
afisare_coada(st1, st2);
return 0;
}

Pr8.
/*Se considera o stiva cu santinele.Sa se extraga un element.*/
#include <iostream>
using namespace std;
struct nod{
int info;
nod *urm;
};
nod *p, *st1, *st2, *c;
int i, n, x;
void adaugare_stiva(nod*&st1, nod*&st2, int x){
nod*p=new nod;
p->info=x;
p->urm=st1->urm;
st1->urm=p;
}
void extragere_stiva(nod*&st1, nod*&st2, int x){
if(st1->urm==st2) cout<<"Nu se poate extrage element";
else{
c=st1->urm;
st1->urm=c->urm;
delete c;
}
}
void afisare_stiva(nod *st1, nod*st2){
p=st1->urm;
while(p!=st2){
cout<<p->info<<" ";
p=p->urm;
}
}

int main(){
int i;
st1=new nod; st2=new nod; st1->urm=st2;
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
adaugare_stiva(st1, st2, x);
}
extragere_stiva(st1, st2, x);
afisare_stiva(st1, st2);
return 0;
}

Pr9.
/*Se considera o lista cu santinele.Sa se creeze o alta lista din ea care sa
contina elementele impare*/
#include <iostream>
using namespace std;
struct nod{
int info;
nod *urm;
};
nod *p, *st1, *st2, *st3, *st4, *c;
int i, n, x;
void adaugare(nod*&st1, nod*&st2, int&x){
nod*p=new nod;
st2->urm=p;
st2->info=x;
st2=p;
}
void afisare(nod *st1, nod*st2){
p=st1->urm;
while(p!=st2){
cout<<p->info<<" ";
p=p->urm;}
}
int main(){
int i;
st1=new nod; st2=new nod; st1->urm=st2;
st3=new nod; st4=new nod; st3->urm=st4;
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
adaugare(st1, st2, x);
}
cout<<"Lisa initiala este:";
afisare(st1, st2);
cout<<endl;
p=st1->urm;
while(p!=st2){
if(p->info%2!=0)
adaugare(st3, st4, p->info);
p=p->urm;
}
afisare(st3, st4);
return 0;
}

Pr10.
/*Se considera o lista cu doua santinele.Sa se stearga primul elem par din lista.*/
#include <iostream>
using namespace std;
struct nod{
int info;
nod *urm;};
nod *p, *st1, *st2, *c;
int i, n, x;
void adaugare_lista(nod*&st1, nod*&st2, int x){
nod*p=new nod;
st2->urm=p;
st2->info=x;
st2=p;
}
void afisare_lista(nod *st1, nod*st2){
p=st1->urm;
while(p!=st2){
cout<<p->info<<" ";
p=p->urm;}
}
int extragere_prim_par(nod*&st1, nod*&st2, int&x){
p=st1;
while(p->urm->info%2!=0)
p=p->urm;
if(p->urm!=st2){
c=p->urm;
p->urm=c->urm;
x=c->info; delete c; return 1;}
return 0;
}

int main(){
int i;
st1=new nod;
st2=new nod;
st1->urm=st2;
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
adaugare_lista(st1, st2, x);}
if(extragere_prim_par(st1, st2, x))
cout<<"S-a sters primul elem par:"<<x;
else cout<<"Nu se poate efectua stergere";
cout<<endl;
afisare_lista(st1, st2);
return 0;
}
Pr10;
//Se considera o lista circulara.
//afisati lista
#include <iostream>
using namespace std;
struct nod{
int info;
nod *urm;
};
nod *p, *prim;
int i, n, x;
void adaugare(nod *&prim,int x){
nod*p=new nod;
p->info=x;
p->urm=prim;
prim=p;
}
void afisare(nod*prim){//afisare lista circulara
p=prim;
do{
cout<<p->info<<" ";
p=p->urm;
}while(p!=prim);
}
int main(){
int i;
prim=0;
cin>>n;
for(i=1;i<=n;i++){
cin>>x;
adaugare(prim,x);
}
p=prim;
while(p->urm) p=p->urm;
p->urm=prim;//se face lista circulara
cout<<"Lisa initiala este:";
afisare(prim);

return 0;
}
Teste de informatică

Expresii in C/C++ (apărut la 1 iulie 2010)

Se acordă 1 punct din oficiu. Fiecare subiect va fi notat cu un punct

1. Care din următoarele expresii furnizează rezultatul 1 dacă a şi b sunt ambele pozitive:
a) (a > 0) && (a > b)
b) a*b > 0
c) (a > 0) || (b>0)
d) (a*b > 0) && (b > 0)

2. Considerăm că variabila a are valoarea –13. Cărui tip poate aparţine această variabilă:
a) unsigned int
b) long
c) char
d) double

3. Care din următoarele expresii au valoarea 1 :


a) (3 < 7) && (2 < 0) || (6 = = 4)
b) (3 < 7) || (2 < 0) || (6 = = 4)
c) ! (2 < 0) || (6 = = 4)

4. Dacă a, b, c, d sunt variabile de tip int, ce valoare are expresia E = a/b/c – a dacă a=36, b=6, c=6, d=4?

5. Dacă N este o variabilă de tip unsigned int, ce rezultat se obţine prin expresia: N & 15 ? Cu ce este
echivalentă această expresie?

6. Fie expresia m = a > (m = b>c ? b : c) ? a : m Ce determină această expresie?

7. Fie expresia: (N >> 3) & 1 Daţi un exemplu de valoare pentru N astfel încât expresia să furnizeze rezultatul
1 şi un exemplu de valoare pentru N astfel încât expresia să furnizeze rezultatul 0. Ce face expresia?

8. Daţi valori pentru variabilele de tip int a, b, c astfel încât expresia a < b < c să furnizeze rezultatul 0.

9. Scrieţi un program care citeşte un număr natural N de 3 cifre şi determină în variabila M şi apoi afişează
numărul obţinut din N prin eliminarea cifrei din mijloc.

Functii(completare)
/*
//maximul din sir cu int
#include <iostream>
using namespace std;
int a[100], n, i;
int maxim (int a[100], int n)
{
int maxi=0,j;
for (j=1; j<=n; j++)
if (maxi<a[j]) maxi=a[j];
return maxi;
}
int main()
{
cout << "Dati un numar n";
cin>>n;
for (i=1; i<=n; i++)
{
cout<<"dati un element a"<<endl;
cin>>a[i];
}
cout<<"maximiul este: "<< maxim(a,n);

return 0;
}*/
/*
//maximul din sir cu void
#include <iostream>
using namespace std;
int a[100], n, i,M;
void maxim (int a[100], int n,int & MaxRez)
{
int maxi=-1000000,j;
for (j=1; j<=n; j++)
if (maxi<a[j]) maxi=a[j];
MaxRez=maxi;
}
int main()
{
cout << "Dati n";
cin>>n;
for (i=1; i<=n; i++)
{
cout<<"dati un el:"<<endl;
cin>>a[i];
}
maxim(a,n,M);cout<<"maximul este: "<<M;

return 0;
}*/
/*
//produsul el. pare dintr-un sir cu int si void
#include <iostream>
using namespace std;
int a[100], n, i,pr;
int produs1 (int a[100], int n)
{
int p=1,j;
for (j=1; j<=n; j++)
if (a[j]%2==0) p*=a[j];
return p;
}
void produs2 (int a[100], int n,int &p)
{
int j;
p=1;
for (j=1; j<=n; j++)
if (a[j]%2==0) p*=a[j];
}
int main()
{
cout << "Dati n";
cin>>n;
for (i=1; i<=n; i++)
{
cout<<"dati un el:"<<endl;
cin>>a[i];
}
cout<<"prod par este: "<<produs1(a,n);
produs2(a,n,pr);cout<<"prod este:"<<pr;
return 0;
}
*/
/*
//ordonare sir
#include <iostream>
using namespace std;
int a[100], n, i,j,pr;
int main()
{
cout << "Dati n";
cin>>n;
for (i=1; i<=n; i++)
{
cout<<"dati un el:"<<endl;
cin>>a[i];
}
cout<<"sir initial"<<endl;
for(i=1;i<=n;i++)cout<<a[i]<<" ";
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]>a[j])swap(a[i],a[j]);
cout<<endl<<"sir final"<<endl;
for(i=1;i<=n;i++)cout<<a[i]<<" ";
*ordonare sir descrescator
*afisare
return 0;
}
*/
//
//Ordonati elementele dintr-un sir cu o functie de citire vector, afisare vector, ordonare vector
#include <fstream>
using namespace std;
ifstream f("functii.in");
ofstream g("functii.out");
int n,i,j,a[100]; //vectorii se transmit prin adresa implicit !!!!
void citeste(int x[100],int &n)
{
int i;
f>>n;
for( i=1; i<=n; i++) f>>x[i];
}
void afiseaza(int x[100],int n)
{
int i;
for( i=1; i<=n; i++) g<<x[i]<<" ";
g<<endl;
}
void ordonare(int x[100],int n)
{
int i,j;
for( i=1; i<=n; i++)
for(j=i+1; j<=n; j++)
if(x[i]>x[j]) swap(x[i],x[j]);// functie ce inverseaza a[i] cu a[j] !!!
}
int main()
{
citeste(a,n);
afiseaza(a,n);
ordonare(a,n);
afiseaza(a,n);
f.close();
g.close();
return 0;
}
Altele
//Se considera o matrice mxn.

//Sa se afiseze :

//a)cate el pare sunt pe prima linie

//b)cate el de pe prima coloana sunt egale cu 3

//c) sa se af. o matr identica ca dim cu prima in care sa apara 0 pt el par si 1 pt el impar

#include <iostream>

using namespace std;

int a[15][20],m,n,i,j,k;

int main()

cout<<"dati m,n ";

cin>>m>>n;

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

cin>>a[i][j];

for(i=1;i<=m;i++){
for(j=1;j<=n;j++)

cout<<a[i][j]<<" ";

cout<<endl;

//a)

for(j=1;j<=n;j++)

if(a[1][j]%2==0)k++;

cout<<"nr de el pare de prima linie este:"<<k;

cout<<endl;

//b)

for(i=1;i<=m;i++)

if(a[i][1]==3)k++;

cout<<"el egale cu 3 de pe prima coloana:"<<k;

cout<<endl;

//c)

for(i=1;i<=m;i++){

for(j=1;j<=n;j++)

if(a[i][j]%2==0) cout<<0<<" ";

else cout<<1<<" ";

cout<<endl;

return 0;

//Se considera o matrice mxn.

//Sa se afiseze :

//a)cate el pare sunt pe prima linie

//b)cate el de pe prima coloana sunt egale cu 3


//c) sa se af. o matr identica ca dim cu prima in care sa apara 0 pt el par si 1 pt el impar

#include <iostream>

using namespace std;

int a[15][20],m,n,i,j,s,mini,cif;

int main()

cout<<"dati m,n ";

cin>>m>>n;

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

cin>>a[i][j];

for(i=1;i<=m;i++){

for(j=1;j<=n;j++)

cout<<a[i][j]<<" ";

cout<<endl;

//a)

cout<<"ultima linie";

for(j=1;j<=n;j++)

if(a[m][j]%5==0)

cout<<a[m][j]<<" ";

cout<<endl;

//b)

cout<<"ultima coloana";

for(i=1;i<=m;i++)

if(a[i][n]==5)
cout<<"el egale cu 5 sunt:"<<a[i][n]<<" ";

cout<<endl;

//c)

s=0;

mini=a[1][1];

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

if(mini>a[i][j])mini=a[i][j];

while(mini){cif=mini%10;s+=mini;mini=mini/10;}

cout<<"suma cifrelor este:"<<s;

return 0;

Programul scrie un fisier cu n numere generate aleator(functia rand() )

//genereaza un fisier cu n elemente nr.in

#include<fstream>

#include<iostream>

#include<time.h>

#include<stdlib.h>

using namespace std;

int i,j,n,m;

fstream g("nr.in",ios::out);

int main () {

cout<<"dati n"; cin>>n;

g<<n<<" "<<endl;

srand(time(NULL));
for(i=1; i<=n; i++)

if (i%15==0) g<<rand()%1000<<" "<<endl;

else g<<rand()%1000<<" ";

g.close();

return 0;

//ordonare prin interclasare - complexitate O(nlog(n))

# include <fstream>

using namespace std;

int a[14005],n,b[14005];

fstream f("nr.in",ios::in);

fstream g("nr.out",ios::out);

void sort (int p,int q)//----------------------

int m;

if (a[p]>a[q])

{ m=a[p];a[p]=a[q];a[q]=m;}

void interc (int p,int q,int m)

int i,j,k;

i=p; j=m+1; k=1;

while (i<=m && j<=q)

if (a[i]<=a[j]) b[k++]=a[i++];

else b[k++]=a[j++];
while (i<=m) b[k++]=a[i++];

while (j<=q) b[k++]=a[j++];

k=1;

for (i=p;i<=q;i++)a[i]=b[k++];

void divimp (int p,int q)//---------------------

int m;

if ((q-p)<=1) sort (p,q);

else

m=(p+q)/2;

divimp (p,m);

divimp (m+1,q);

interc (p,q,m);

int main ()//----------------------------------------

{int i;

f>>n;

for (i=1;i<=n;i++) f>>a[i];

divimp (1,n);

for (i=1;i<=n;i++) g<<a[i]<<" ";

f.close();g.close();

return 0;

}
//ordonarea cu metoda QuickSort - complexitate O(nlog(n))

#include<fstream>

#include<time.h>

using namespace std;

fstream f("nr.in",ios::in);

fstream g("nr.out",ios::out);

int a[500005],n,k;

void poz(int li,int ls,int&k)

int i=li,j=ls,c,i1=0,j1=-1;

while(i<j)

if(a[i]>a[j])

c=a[j];

a[j]=a[i];

a[i]=c;

c=i1; i1=-j1; j1=-c;

i=i+i1; j=j+j1;

k=i;

void quick(int li,int ls)

int k;

if(li<ls)
{

poz(li,ls,k);

quick(li,k-1);

quick(k+1,ls);

int main()

int i,t1,t2;

f>>n;

for(i=1;i<=n;i++) f>>a[i];

t1=clock();

quick(1,n);

t2=clock();

g<<(float)(t2-t1)/CLK_TCK<<" secunde"<<CLK_TCK<<endl;

for(i=1;i<=n;i++)

if (i%15==0) g<<a[i]<<" "<<endl;

else g<<a[i]<<" ";

g.close(); f.close();

return 0;

//ordonarea cu metoda QuickSort - complexitate O(nlog(n)) existenta in C++

#include <iostream>

#include<fstream>

#include <algorithm>
using namespace std;

fstream f("sir.in",ios::in);

fstream g("sir.out",ios::out);

int a[55],n,i,j,aux;

int main()

//sortarea elementelor de la a[0],a[1], ..a[n-1]

f>>n;

for(i=0; i<n; i++)

f>>a[i];

sort(a,a+n);

for(i=0; i<n; i++)

g<<a[i]<<" ";

g<<endl;

//sortarea elementelor de la a[1],a[2], ..a[n]

/* f>>n;

for(i=1;i<=n;i++)

f>>a[i];

sort(a+1,a+n+1);

for(i=1;i<=n;i++)

g<<a[i]<<" ";

g<<endl;*/

f.close(); g.close();

return 0;

}
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:
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.

1.2. Date, variabile, expresii, operatii


Date
 Orice algoritm porneste de la anumite date de intrare, le prelucreaza, iar în final obtine date de
iesire .
  Exista mai multe tipuri de date.
Exemple :
 Întregi ;  ex. 120, -120
 Reale ;  ex. 3.12, 12.
 Logice;  ex. TRUE(adevarat), FALSE(fals)
 Caracter
 sir de caractere;  ex. 'un text' .
Variabile
Tipurile de variabile coincid cu tipurile de date.
Printr-o variabila întelegem un ansamblu de patru elemente:
 Numele variabilei ;
 Tipul ei ;
 Valoarea ei la un moment dat ;
 Adresa variabilei;
 
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 ( folosesc operatorii +, -, * (pentru înmultire), DIV (pentru câtul împartirii întregi), MOD
(pentru restul împartirii întregi ex: 3*a+45, a mod 3, 10 div 2 )
 Reale (operanzii care le alcatuiesc sunt constante si variabile întregi sau reale.Pe langa operatorii +, -,
* utilizati în cadrul expresiilor întregi putem utiliza si altii cum ar fi de exemplu  '/' (pentru împartirea
cu zecimale ). Rezultatul evaluarii lor este întotdeauna un numar real )

 Logice (Rezultatul lor poate avea numai doua valori :TRUE sau FALSE; Operatorii sunt cei din logica
matematica : OR, AND, NOT .De asemenea este permis sa folosim si operatorii <, >, >= (mai mare sau
egal), <= (mai mic sau egal), <> (diferit).
Exemple : a OR b, unde a si b sunt variabile logice ;
Sau (a>=b) AND (c<d) )
 De tip sir de caractere ( Se folosesc constante si variabile de tip sir de caractere . Operatorul  +  are
semnificatia de concatenare (scrierea a celor doua siruri unul dupa altul ).
Exemplu 'aca'+'sa' rezulta 'acasa'
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 2;
                                       Pas n;
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)

Trebuie sa se cunoasca rezolvarea problemelor cu reprezentarea in pseudocod.


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
Tip intreg

bool 1B true(1) false(0)


char 1B [0 , 255]
short int 2B [-32.768 , 32.767]
unsigned short int 2B [0 , 65.535]
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]
Tip real

float 4B [1.17549e-038 , 3.40282e+038]


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;
}
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(n2).
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(n2)
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

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)

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