Transformarea structurilor repetitive
CAT TIMP -> REPETA
cat timp (expresie logica) executa
instructiune
sfarsit cat timp
<=>
daca (expresie logica) atunci
repeta
instructiune
pana cand (NOT expresie logica)
sfarsit daca
REPETA -> CAT TIMP
repeta
instructiune
pana cand (expresie logica)
<=>
instructiune
cat timp (NOT expresie logica) executa
instructiune
sfarsit cat timp
CAT TIMP -> EXECUTA..CAT TIMP
cat timp (expresie logica) executa
instructiune
sfarsit cat timp
<=>
daca (expresie logica) atunci
executa
instructiune
cat timp (expresie logica)
sfarsit daca
EXECUTA CAT TIMP -> CAT TIMP
executa
instructiune
cat timp (expresie logica)
<=>
instructiune
cat timp (expresie logica) executa
instructiune
sfarsit cat timp
PENTRU -> CAT TIMP
A)pentru i <- li,ls,pas executa for (i=1;i<=n;i++)
instructiune
sfarsit pentru
<=>
i <- li
cat timp i<=ls executa
instructiune
i <- i+pas
sfarsit cat timp
B)pentru i <- ls,li,-pas executa
instructiune
sfarsit pentru
<=>
i <- ls
cat timp i>=li executa
instructiune
i <- i-pas
sfarsit cat timp
CAT TIMP -> PENTRU
nu este intotdeauna posibil (este necesara instructiune de forma i <- i+pas sau i
<- i-pas)
PENTRU -> REPETA
A)pentru i <- li,ls,pas executa
instructiune
sfarsit pentru
<=>
i <- li
daca li<=ls atunci
repeta
instructiune
i <- i+pas
pana cand (i>ls)
sfarsit daca
B)pentru i <- ls,li,-pas executa
instructiune
sfarsit pentru
<=>
i <- ls
daca ls>=li atunci
repeta
instructiune
i <- i-pas
pana cand (i<li)
sfarsit daca
REPETA ..PANA CAND -> EXECUTA..CAT TIMP (la traducere in C++)
repeta
instructiune
pana cand (expresie logica)
<=>
executa
instructiune
cat timp (NOT expresie logica)
do
{
instructiune;
}
while (NOT expresie logica);
ALGORITMI ELEMENTARI
1. PRELUCRAREA NUMERELOR NATURALE NENULE <= n
cin>>n;
for (i=1;i<=n;i++)
{
//prelucrarea lui i;
}
2. CITIREA SI PRELUCRAREA A n NUMERE
cin>>n;
for (i=1;i<=n;i++)
{
cin>>x;
//prelucrarea lui x;
}
n=5
x=12 3 5 78 18
3. PRELUCRAREA NUMERELOR INTREGI DIN INTERVALUL [a,b] (a<=b)
- crescator
cin>>a>>b;
for (i=a;i<=b;i++)
{
//prelucrarea lui i;
}
- descrescator
cin>>a>>b;
for (i=b;i>=a;i--)
{
//prelucrarea lui i;
}
4. CITIREA SI PRELUCRAREA A n PERECHI DE NUMERE
cin>>n;
for (i=1;i<=n;i++)
{
cin>>x>>y;
//prelucrarea perechii x,y;
}
5. CITIREA A n NUMERE SI PRELUCRAREA PERECHILOR DE NUMERE CONSECUTIV CITITE IN SIR
cin>>n>>x;
for (i=2;i<=n;i++)
{
cin>>y;
//prelucrarea perechii x,y;
x=y;
}
N= 4 12,43,2,9 => (12,43), (43,2),(2,9)
6. PRELUCRAREA DIVIZORILOR UNUI NUMAR
a) PROPRII
cin>>n;
for (d=2;d<=n/2;d++)
if (n%d==0)
// prelucrarea lui d;
b) TOTI DIVIZORII
cin>>n;
for (d=1;d<=n;d++)
if (n%d==0)
// prelucrarea lui d;
7. TESTAREA PROPRIETATII DE NUMAR PRIM
cin>>n;
OK = 1; // pp ca n este numar prim
for (d=2;d<=n/2;d++) //for (d=2;d*d<=n;d++)
if (n%d==0)
OK = 0; //n nu este prim deoarece are cel putin un divizor propriu
if (OK==1 && n>1) // prelucrarea lui n ca numar prim
else // prelucrarea lui n ca numar neprim
8. PRELUCRAREA DIVIZORILOR UNUI NUMAR
a)cin>>n;
for (d=1;d<=n;d++)
if (n%d==0)
// prelucrarea lui d
b)(eficient***)
cin>>n;
for (d=1;d*d<n;d++)
if (n%d==0)
// prelucrarea lui d si a lui n/d;
if (d*d==n)
// prelucrarea lui d (pentru patrate perfecte)
9. PRELUCRAREA CIFRELOR UNUI NUMAR
cin>>n;
while (n>0)
{
c=n%10;
n=n/10;
// prelucrarea cifrei c; - oglinditul lui n : o=o*10+c;
- determinarea unui numar x care are cifre din n, in
aceeasi ordine ca in n :
x=x+p*c; p=p*10;
}
x=45 845 2845
c=8 2 3
p=100 1000 10000
n=8971460 => x=8460
n=739 73 7 0
c=9 3 7
o=0 9 93 937
10. CEL MAI MARE DIVIZOR COMUN (A,B!=0)
a) cin>>a>>b;
while (a!=b)
if (a>b)
a=a-b;
else
b=b-a;
cout<<a;
a=15 9 3
b=6 3
a=1000000 999998 999996... 2 =>aprox 500000 pasi
b=2
b) cin>>a>>b;
while (b!=0)
{
r=a%b;
a=b;
b=r;
}
cout<<a;
a=15 6 3
b=6 3 0
r=3 0
a=1000000 2
b=2 0
r=0
11. CEL MAI MIC MULTIPLU COMUN (A,B!=0)
b) cin>>a>>b;
ca=a; cb=b;
while (b!=0)
{
r=a%b;
a=b;
b=r;
}
m=ca*cb/a; //produsul numerelor initiale div cmmdc
a=2^3*5*7^2
b=2^2*3*7^2
=> m = 2^3 * 3 * 5 * 7^2
m = (2^3*5*7^2)*(2^2*3*7^2)/(2^2*7^2) = ...
12. DETERMINAREA PUTERII LA CARE APARE FACTORUL PRIM d IN DESCOMPUNEREA IN FACTORI
PRIMI A LUI n
p=0;
while (n%d==0)
{
n=n/d;
p++;
}
cout<<p;
13. DESCOMPUNEREA IN FACTORI PRIMI
cin>>n;
d=2;
while (n!=1)
{
p=0;
while (n%d==0)
{
n=n/d;
p++;
}
if (p>0)
// prelucrarea lui d si/sau p
d++;
}
48 | 2
24 | 2
12 | 2
6 | 2
3 | 3
1 |
21 | 3
7 | 7
1 |
14. CITIREA SI PRELUCRAREA UNUI SIR DE NUMERE CARE SE TERMINA CU VALOAREA 0 CARE NU
FACE PARTE DIN SIR
cin>>x;
while (x!=0)
{
// prelucrarea lui x;
cin>>x;
}
15 12 0
15. DETERMINAREA CELUI MAI MARE NUMAR x<n SI CARE ARE O PROPRIETATE
cin>>n;
do
{
n--;
testarea proprietatii lui n;
}
while (n nu are proprietatea);
n=25 => x=23
cin>>n;
x=n;
do
{
x--;
OK <- 1
for (d=2;d<=x/2;d++)
if (x%d==0)
OK <- 0;
}
while (OK==0);
cout<<x;
16. DETERMINAREA CELUI MAI MIC NUMAR x>n SI CARE ARE O PROPRIETATE
n=25 => x=29
cin>>n;
x=n;
do
{
x++;
OK = 1;
for (d=2;d<=x/2;d++)
if (x%d==0)
OK = 0;
}
while (OK==0);
cout<<x;
17. PRIMII n TERMENI FIBONACCI
1 1 2 3 5 8 13 21
cin>>n;
a=1; b=0; // nu fac parte dintre termenii Fibonacci
for (i=1;i<=n;i++)
{
c=a+b;
cout<<c<<' ';
a=b;
b=c;
}
a=1 0 1 1 2
b=0 1 1 2 3
c=1 1 2 3
18. TERMENII FIBONACCI <=x
1 1 2 3 5 8 13
x=20
cin>>x;
a=1; b=0; // nu fac parte dintre termenii Fibonacci
while (a+b<=x)
{
c=a+b;
cout<<c<<' ';
a=b;
b=c;
}
19. TESTAREA EXISTENTEI UNUI ELEMENT CARE ARE O PROPRIETATE SI CARE FACE PARTE
DINTR-O MULTIME
ok=0; // pp ca nu exista niciun element cu proprietatea ceruta
Se parcurg elementele multimii
testarea proprietatii elementului
daca elementul are proprietatea atunci
ok=1
sfarsit daca
sfarsit parcurgere
ok=0;
cin>>n;
for (i=1;i<=n;i++)
{
cin>>x;
.......
if (x are proprietatea)
ok=1;
}
20. TEST DACA TOATE ELEMENTELE DINTR-O MULTIME AU O PROPRIETATE
ok=1; // pp toate elementele au proprietatea ceruta
Se parcurg elementele multimii
testarea proprietatii elementului
daca elementul NU are proprietatea atunci
ok=0
sfarsit daca
sfarsit parcurgere
ok=1;
cin>>n;
for (i=1;i<=n;i++)
{
cin>>x;
.......
if (x NU are proprietatea)
ok=0;
}
21. a) PRELUCRAREA SECVENTELOR DE ELEMENTE CARE AU O PROPRIETATE (LUNGIMEA CELEI
MAI MARI SECVENTE DE NUMERE PARE CONSECUTIVE CA POZITITE IN SIR)
n=10
x=23 45 6 22 8 5 6 8 0 10 => lmax=4
6 22 8 6 8 0 10
cin>>n;
lmax=0;
l=0;
for (i=1;i<=n;i++)
{
cin>>x;
if (x are proprietatea)
l++;
else
{
if (l>lmax)
lmax=l;
l=0;
}
}
if (l>lmax)
lmax=l; ///prelucrarea ultimei secvente
b) PRELUCRAREA SECVENTELOR DE ELEMENTE CARE AU O PROPRIETATE CE DEPINDE DE
ELEMENTUL PRECEDENT (LUNGIMEA CELEI MAI MARI SECVENTE DE NUMERE CRESCATOARE SI
CONSECUTIVE CA POZITIE IN SIR)
n=9
3 8 5 2 6 8 9 1 2
cin>>n>>x;
l=1; lmax=0;
for (i=2;i<=n;i++)
{
cin>>y;
if (x<=y) l++;
else
{
if (l>lmax) lmax=l;
l=1;
}
x=y;
}
if (l>lmax) lmax=l;
x=3 8 5 2 6 8 9 1
y=8 5 2 6 8 9 1 2
l=1 2 1 1 2 3 4 1 2
lmax=0 2 4
22. Transformare din baza 10 in baza b
cin>>n>>b;
x=0; p=1;
while (n!=0)
{
c=n%b;
x=x+p*c;
p=p*10;
n=n/b;
}
cout<<x;
23. Transformare din baza b in baza 10
cin>>n>>b;
x=0; p=1;
while (n!=0)
{
c=n%10;
x=x+p*c;
p=p*b;
n=n/10;
}
cout<<x;
24. CITIREA SI PRELUCRAREA UNUI SIR DE NUMERE, PANA LA INTRODUCEREA VALORII 0, CARE
NU FACE PARTE DIN SIR
cin>>x;
while (x!=0)
{
//prelucrarea lui x
cin>>x;
}
MATRICE
TIPURI DE PROBLEME
A) CITIRE N (EVENTUAL M) SI CONSTRUIRE MATRICE CU N LINII SI N (EVENTUAL M) COLOANE
#include <iostream>
using namespace std;
int a[101][101],n,m,i,j..;
int main()
{
cin>>n>>m;
for (i=1;i<=n;i++)
for (j=1 ;j<=m; j++)
if (...) a[i][j]=...;//a[i][j]=element aflat pe linia i si
coloana j
for (i=1;i<=n;i++)
{
for (j=1 ;j<=m; j++) cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
B) CITIRE N (EVENTUAL M) SI MATRICE SI PRELUCRARE ELEMENTE MATRICE
#include <iostream>
using namespace std;
int a[101][101],n,m,i,j..;
int main()
{
cin>>n>>m;
for (i=1;i<=n;i++)
for (j=1 ;j<=m; j++)
cin>a[i][j];
for (i=1;i<=n;i++)
for (j=1 ;j<=m; j++)
//prelucrarea lui a[i][j];
//afisare rezultat
return 0;
}
Ba) PRELUCRAREA ELEMENTELOR MATRICEI
for (i=1;i<=n;i++)
for (j=1 ;j<=m; j++)
//prelucrarea lui a[i][j];
Bb) PRELUCRAREA ELEMENTELOR MATRICEI PATRATICE IN FUNCTIE DE DIAGONALA PRINCIPALA
- numerotare 1..n
for (i=1;i<=n;i++)
for (j=1 ;j<=n; j++)
if (i==j) //prelucrarea lui a[i][i], element de pe diagonala
principala;
else if (i<j) //prelucrarea lui a[i][j], element aflat deasupra
diagonalei principale;
else //prelucrarea lui a[i][j], element aflat sub diagonala
principala;
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
- numerotare 0..n-1
for (i=0;i<n;i++)
for (j=0 ;j<n; j++)
if (i==j) //prelucrarea lui a[i][i], element de pe diagonala
principala;
else if (i<j) //prelucrarea lui a[i][j], element aflat deasupra
diagonalei principale;
else //prelucrarea lui a[i][j], element aflat sub diagonala
principala;
Bc) PRELUCRAREA ELEMENTELOR MATRICEI PATRATICE IN FUNCTIE DE DIAGONALA SECUNDARA
- numerotare 1..n
for (i=1;i<=n;i++)
for (j=1 ;j<=n; j++)
if (i+j==n+1) //prelucrarea lui a[i][n+1-i], element de pe
diagonala secundara;
else if (i+j<n+1) //prelucrarea lui a[i][j], element aflat
deasupra diagonalei secundare;
else //prelucrarea lui a[i][j], element aflat sub diagonala
secundara;
- numerotare 0..n-1
for (i=0;i<n;i++)
for (j=0 ;j<n; j++)
if (i+j==n-1) //prelucrarea lui a[i][n-1-i], element de pe
diagonala secundara;
else if (i+j<n-1) //prelucrarea lui a[i][j], element aflat
deasupra diagonalei secundare;
else //prelucrarea lui a[i][j], element aflat sub
diagonala secundara;
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33
Ca) PRELUCRAREA ELEMENTELOR DE PE DIAGONALA PRINCIPALA
for (i=1;i<=n;i++)
// prelucrarea lui a[i][i];
Cb) PRELUCRAREA ELEMENTELOR DE PE DIAGONALA SECUNDARA (numerotare 1..n)
for (i=1;i<=n;i++)
// prelucrarea lui a[i][n+1-i];
PRELUCRAREA ELEMENTELOR DE PE DIAGONALA SECUNDARA (numerotare 0..n-1)
for (i=0;i<n;i++)
// prelucrarea lui a[i][n-1-i];
Da) PRELUCRAREA ELEMENTELOR PE LINII INTR-O MATRICE A(N,M) - determinarea minimului
de pe fiecare linie
for (i=1;i<=n;i++) // pentru fiecare linie
{
// initializare mn=2000000000;//mn=a[i][1];
for (j=1;j<=m;j++)
if (a[i][j]<mn) mn=a[i][j];
// afisare/comparare...
cout<<mn<<' ';
}
Db) PRELUCRAREA ELEMENTELOR PE COLOANE INTR-O MATRICE A(N,M) - determinarea
minimului de pe fiecare coloana
for (j=1;j<=m;j++) // pentru fiecare coloana
{
// initializare mn=2000000000;
for (i=1;i<=n;i++)
if (a[i][j]<mn) mn=a[i][j];
// afisare/comparare
cout<<mn<<' ';
}
Ea) STERGEREA UNEI LINII (linia k din a(m,n))
for (i=k+1;i<=m;i++)
for (j=1;j<=n;j++)
a[i-1][j]=a[i][j];
m--;
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
41 42 43 44 45
m=4
n=5
k=2
Eb) STERGEREA UNEI COLOANE (coloana k din a(m,n))
for (j=k+1;j<=n;j++)
for (i=1;i<=m;i++)
a[i][j-1]=a[i][j];
n--;
Ec) INSERAREA UNEI LINII (pe linia k din a(m,n))
for (i=m;i>=k;i--)
for (j=1;j<=n;j++)
a[i+1][j]=a[i][j];
for (j=1;j<=n;j++)
cin>>a[k][j];
m++;
Ed) INSERAREA UNEI COLOANE (pe coloana k din a(m,n))
for (j=n;j>=k;j--)
for (i=1;i<=m;i++)
a[i][j+1]=a[i][j];
for (i=1;i<=m;i++)
cin>>a[i][k];
n++;
FUNCTII IN C++
1. Functii operand
- intorc un rezultat prin numele lor
- contin cel putin o instructiune return
- pot fi de tip int, float, char
- de obicei contin in antet doar parametri de intrare
tip int sau float (real)
int nume_functie(tip1 param1, tip2 nume2, ...)
float nume_functie(tip1 param1, tip2 nume2, ...)
Apelul functiilor operand:
cout<<nume_functie(p1,p2,..); //p1,p2 parametri de apel sau efectivi
x=nume_functie(p1,p2,..);
if (nume_functie(p1,p2,..)==1)...
2. Functii procedurale (void)
- intorc rezultate prin parametri de iesire SAU afiseaza seturi de valori
- NU contin instructiune return
- de obicei contin in antet parametri de intrare, eventual de iesire
- se folosesc si pentru modifcarea tablourilor; tablourile sunt transmise oricum
prin adresa si NU trebuie sa scriem & inaintea lor
void nume_functie(int n, int v[]) SAU
void nume_functie(int n, int v[101])
- afiseaza seturi de valori
void nume_functie(int n, ...)
- returneaza rezultate prin parametri de iesire
void nume_functie(int n, ..., int &x, ...)
Apelul functiilor procedurale:
nume_functie(n, ...,x, ...);
cout<<x;
ALGORITMI PENTRU TABLOURI UNIDIMENSIONALE (VECTORI)
Declararea unui vector:
int v[101]; // vector cu maxim 100 de elemente numere intregi (numerotate 1..100)
Citirea unui vector
cin>>n;
for (i=1;i<=n;i++)
cin>>v[i];
Afisarea unui vector
for (i=1;i<=n;i++)
cout<<v[i]<<' ';
1. Cautarea secventiala (se citesc un vector v, cu n elemente, si un numar x; sa se
afiseze mesajul "da", daca x exista in vector, "nu" in caz contrar)
ok=0; //pp ca x nu exista in vector
for (i=1;i<=n;i++)
if (v[i]==x)
ok=1;
if (ok)
cout<<"da";
else
cout<<"nu";
2. Cautarea binara (se citesc un vector v, ordonat crescator, cu n elemente, si un
numar x; sa se afiseze mesajul "da", daca x exista in vector, "nu" in caz contrar)
- algoritm eficient - complexitate O(log n)
1 2 3 4 5 6 7 8
n=8 v={2,4,7,9,11,12,15,23} x=11 => da
i=1 5
j=8 5
m=4 6 5
n=8 v={2,4,7,9,11,12,15,23} x=10 => nu
i=1 5
j=8 5 4
m=4 6 5
i=1;
j=n;
ok=0;
while (i<=j && ok==0)
{
m=(i+j)/2;
if (v[m]==x) ok=1;
else if (v[m]<x) i=m+1;
else j=m-1;
}
if (ok)
cout<<"da";
else
cout<<"nu";
Obs. In cazul in care vectorul este ordonat descrescator:
if (v[m]>x) i=m+1;
else j=m-1;
3. Sortarea crescatoare a elementelor unui vector - sortarea prin interschimbare
(selectie directa)
n=6 v={3,1,9,4,2,1}
i=1 v={1,3,9,4,2,1}
i=2 v={1,1,9,4,3,2}
i=3 v={1,1,2,9,4,3}...
se compara fiecare element cu toate elementele aflate dupa el in vector; in cazul
in care nu sunt asezate corespunzator, se interschimba
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++)
if (v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
Obs. Pentru sortarea descrescatoare: if (v[i]<v[j])
4. Sortarea crescatoare a elementelor unui vector - sortarea prin metoda bulelor
n=6 v={3,1,9,4,2,1}
i=1 v={1,3,4,2,1,9}
i=2 v={1,3,2,1,4,9}
i=3 v={1,2,1,3,4,9}
i=4 v={1,1,2,3,4,9}
i=5 v={1,1,2,3,4,9}
se compara elementele consecutive ca pozitie in vector si se interschimba daca este
cazul; se repeta aceasta operatie de parcurgere a vectorului, pana cand, la o
parcurgere, nu mai are loc nicio interschimbare
do
{
ok=1; //pp ca vectorul este ordonat
for (i=1;i<n;i++)
if (v[i]>v[i+1])
{
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
ok=0; //daca am facut o interschimbare, vectorul nu era ordonat
}
}
while (ok==0);
4*. Sortarea prin selectie (la fiecare pas i al algoritmului se determina minimul
din elementele inca nesortate si se interschimba cu elementul de pe pozitia i)
n=6 v={3,1,9,4,2,1}
n=6 v={1,3,9,4,2,1}
n=6 v={1,1,9,4,2,3}
n=6 v={1,1,2,4,9,3}
n=6 v={1,1,2,3,9,4}
n=6 v={1,1,2,3,4,9}
for (i=1;i<n;i++)
{
mn=v[i]; poz=i;
for (j=i+1;j<=n;j++)
if (v[j]<mn)
{
mn=v[j];
poz=j;
}
aux=v[poz]; v[poz]=v[i]; v[i]=aux;
// v[poz]=v[i]; v[i]=mn;
}
4**. Sortarea prin numarare
n=6 v={3,1,9,4,2,1}
nr={3,0,5,4,2,1}
b={1 1 2 3 4 9}
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++)
if (v[i]>v[j])
nr[i]++;
else
nr[j]++;
for (i=1;i<=n;i++)
b[nr[i]+1]=v[i];
4***.Sortarea prin insertie
n=6 v={3,1,9,4,2,1}
a={1,1,2,3,4,9}
a[1]=v[1];
for (i=2;i<=n;i++)
{
j=1;
while (v[i]>a[j])
j++;
for (k=i-1;k>=j;k--)
a[k+1]=a[k];
a[j]=v[i];
}
5. Sortarea prin interclasare (se citesc doi vectori ordonati crescator, a cu n
elemente si b cu m elemente; sa se construiasca al treilea vector c, care sa
contina elementele din vectorii dati, de asemenea ordonate crescator) -
complexitate O(n+m)
n=5 a={3,5,8,9,12}
m=7 b={1,2,4,5,6,7,7}
i=1 2 3
j=1 2 3 4 5..8
k=0 1 2 3 4 5 6
c={1,2,3,4,5,5,6,7,7,8,9,12}
i=1; //parcurge vectorul a
j=1; //parcurge vectorul b
k=0; //memoreaza cate elemente am adaugat in vectorul c
while (i<=n && j<=m)
if (a[i]<b[j])
{
k++; c[k]=a[i];
i++;
}
else if (a[i]>b[j])
{
k++; c[k]=b[j];
j++;
} else {....i++;j++;}
if (j>m)
for (q=i;q<=n;q++)
{
k++; c[k]=a[q];
}
if (i>n)
for (q=j;q<=m;q++)
{
k++; c[k]=b[q];
}
6. Prelucrarea perechilor de elemente din vector
a) v[i], v[j] / 1<=i<j<=n (v[i] este pus in pereche cu oricare dintre v[j], aflate
dupa el (ca pozitie) in vector)
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++)
// prelucrarea perechii v[i], v[j]
v={1,1,2,9,4,3} n=6
(1,1) (1,2) (1,9) (1,4) (1,3) (1,2) (1,9)... (4,3) nr perechi: (n-1)+(n-
2)+...+1 = n*(n-1)/2
b) v[i], v[i+1] / 1<=i<n (perechi de elemente consecutive ca pozitie in vector)
for (i=1;i<n;i++)
//prelucrarea perechii v[i], v[i+1]
v={1,1,2,9,4,3}
(1,1) (1,2) (2,9) (9,4) (4,3) nr perechi: n-1 perechi
c) v[i], v[j] egal departate de mijlocul vectorului (sau de capete)
v={1,1,2,9,4,3}
1 2 3 4 5 6 numarul de perechi este n/2
(1,3) (1,4) (2,9)
*
for (i=1;i<=n/2;i++)
//prelucrarea perechii v[i], v[n-i+1]
i=1 => n
i=2 => n-1
**
i=1; j=n;
while (i<j)
{
//prelucrarea perechii v[i], v[j]
i++; j--;
}
7. a) STERGEREA UNUI ELEMENT DE PE POZITIA k A UNUI VECTOR (1<=k<=n)
Ex. n=6 v={2,1,9,6,3,7} k=3
1 2 3 4 5 6
k k+1..n
for (i=k+1;i<=n;i++)
v[i-1]=v[i];
n--;
b) STERGEREA TUTUROR ELEMENTELOR CARE AU O PROPRIETATE (STERGEREA MULTIPLA)
Ex. n=6 v={2,1,4,6,3,7} => k=1 v={1,4,6,3,7} n=5 => k=2 v={1,6,3,7} n=4 => k=2
v={1,3,7} n=3 =>...
k=1;
while (k<=n)
{
testarea proprietatii lui v[k];
if (v[k] are proprietatea)
{
for (i=k+1;i<=n;i++)
v[i-1]=v[i];
n--;
}
else k++;
}
8. a) INSERAREA UNUI ELEMENT PE POZITIA k A UNUI VECTOR (1<=k<=n)
Ex. n=6 v={2,1,9,6,3,7} k=3
for (i=n;i>=k;i--)
v[i+1]=v[i];
n++; cin>>v[k];
b) INSERAREA A CATE UNUI ELEMENT DUPA FIECARE ELEMENT CARE ARE O PROPRIETATE
(INSERAREA MULTIPLA)
Ex. n=6 v={2,1,4,6,3,7} => k=1 v={2,x,1,4,6,3,7} n=7
k=1;
while (k<=n)
{
testarea proprietatii lui v[k];
if (v[k] are proprietatea)
{
for (i=n;i>=k+1;i--)
v[i+1]=v[i];
n++; cin>>v[k+1];
k=k+2;
}
else k++;
TEST PENTRU PATRAT PERFECT
if (sqrt(i)==(int)sqrt(i))....
SAU
x=sqrt(i); // x memoreaza partea intreaga a radicalului
if (sqrt(i)==x) ....
DECLARARE STRUCT
struct elev // elev este tip de data creat de utilizator (poate memora mai multe
date de tipuri diferite in campurile sale)
{
char nume[31]; // nume este un camp care poate memora maxim 30 d caractere
float medie; // medie este un camp care poate memora media reala a elevului
} e1,e2; // doua variabile de tip elev
SAU
struct elev
{
char nume[31];
float medie;
};
elev e1,e2;
SAU
struct
{
char nume[31];
float medie;
} e1,e2,e[26]; //e[26] este un vector care poate memora maxim 25 de elevi (daca
numerotarea incepe cu pozitia 1)
CITIRE SI AFISARE VARIABILE DE TIP STRUCT
cin>>[Link]; //[Link]
cin>>[Link];
cin>>e[4].nume; cin>>e[4].medie;
COMPARAREA A DOUA VARIABILE STRUCT
if (strcmp([Link],[Link])==0 && [Link]==[Link]) //daca sunt egale e1 si e2
ATRIBUIREA VARIABILELOR STRUCT
e1=e2; // e ok, lui e1 i se atribuie e2
FISIERE:
#include <fstream>
using namespace std;
ifstream fin("[Link]"); //deschiderea fisierului pentru citire
ofstream fout("[Link]"); //deschiderea fisierului pentru scriere
1)
54
fin>>x;
2)
56 7
fin>>x>>y;
3) sir de n numere
4
43 2 87 999
fin>>n;
for (i=1;i<=n;i++)
{
fin>>x;
....;
}
4) sir de numere pentru care nu se cunoaste numarul lor
43 2 87 999...
while (fin>>x)
{
prelucrarea lui x;
}
5) perechi de numere despre care nu se stie cate sunt
43 2
87 999
5 7
22 65
...
while (fin>>x>>y)
{
prelucrarea lui x si y;
}