0% au considerat acest document util (0 voturi)
3 vizualizări20 pagini

Teorie

Documentul descrie transformările structurale ale structurilor repetitive în programare, inclusiv echivalențele între diferite tipuri de bucle și instrucțiuni. De asemenea, sunt prezentate algoritmi elementari pentru prelucrarea numerelor naturale, citirea și prelucrarea numerelor, determinarea divizorilor, testarea proprietății de număr prim și lucrul cu matrice. În final, se discută despre citirea și prelucrarea unui șir de numere și despre transformările între diferite baze numerice.

Încărcat de

alexiaioanadiaconu
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca TXT, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
3 vizualizări20 pagini

Teorie

Documentul descrie transformările structurale ale structurilor repetitive în programare, inclusiv echivalențele între diferite tipuri de bucle și instrucțiuni. De asemenea, sunt prezentate algoritmi elementari pentru prelucrarea numerelor naturale, citirea și prelucrarea numerelor, determinarea divizorilor, testarea proprietății de număr prim și lucrul cu matrice. În final, se discută despre citirea și prelucrarea unui șir de numere și despre transformările între diferite baze numerice.

Încărcat de

alexiaioanadiaconu
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca TXT, PDF, TXT sau citiți online pe Scribd

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;
}

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