Sunteți pe pagina 1din 23

COLEGIUL NATIONAL

LUCRARE

DE

ATESTAT

ELEV:

PROF. COORD.

MAI 2022
TEMA PROIECT:

Recursivitate.Studiu de caz-recursivitate in vectori(II)

1
GENERALITATI

 Definitii
Notiunea de recursivitate din programare este derivata in mod natural din notiunea
de recusivitate din matematica, unde o notiune este definita recursiv daca in cadrul
definitiei sale apare insasi notiunea ce se defineste.
Exemple:
-factorial

1 daca n=0
n!=
n *(n-1)! daca n>0
-sirul fibonacci
f(0)=0,
f(1)=1,
f(i)=f(i-1)+f(i-2) pentru i>1.

-cel mai mic divizor comun


a daca a=b
cmmdca,b)=
cmmdc(b,a mod b)daca a<> b
Etc.

In programare, instrumentul necesar si suficient pentru a exprima programe recursive este


subprogramul pentru ca subprogramul da un nume unei actiuni care poate fi invocata prin
numele respectiv.
Recursivitatea poate fi directa atunci cand in corpul subprogramului apare apelul acelui
subprogram, sau indirecta daca apelul apare in corpul altui subprogram care se apleleaza din
primul subprogram.
Autoapelul provoaca o noua activare a aceluiasi subprogram, ceea ce presupune executia
instructiunilor subprogramului, incepand cu prima instructiune a acestuia si pana la autoapel,
cand se activeaza din nou subprogramul s.a.m.d. Ca atare, partea de inceput a subprogramului se
poate executa de o infinitate de ori. Pentru a se evita o asemenea situatie trebuie ca autoapelul
subprogramului sa fie conditionat de indeplinirea unei anumite conditii. Daca conditia de
autoapel (C) este indeplinita, atunci subprogramul este reactivat (reapelat), in caz contrar sirul de
activari (apeluluri) ale subprogramului se intrerupe si se executa secventele ramase de executat
din subprogram, activate in ordine inversa activarii.

2
C=adevarat C=adevarat C=adevarat
apel subprogram
(2) (4) (6) (7) (8)
(3) (5)
S (1) (9)
apel S apel S apel S
Revenire in daca C daca C daca C daca C
Programul atunci S atunci S atunci S atunci S C=fals
apelant
(15) (13) (11)
(17) (16) (14) (12) (10)

Subprogram Subprogram Subprogram Subprogram


S S S S
In figura se prezinta schematic executia unui subprogram indirect recursiv S, subprogram
ce este reapelat prin intermediul subprogramului S1.

C=adevarat
apel
subprogram S (2) (4) (6) (7) (8)
(3) (5)
(1)
apel S1 apel S apel S1 C=fals
S1 daca C S1 daca C
revenire in atunci S atunci S (9)
programul (15) (13) (11)
apelant (16) (14) (12) (10)
(17)
Subprogram Subprogram Subprogram Subprogram
S S1 S S1

Apelul unui subprogram recursiv, ca si al unuia nerecursiv presupune alocarea de memorie pe


stiva a variabilelor locale, a parametrilor si a adresei de revenire. Ca atare pentru a nu se ajunge
in situatia depasirii stivei se recomanda utilizarea unei solutii recursive numai daca numarul
autoapelului (adancimea recursivitatii) nu este mare.

3
In cazul utilizarii recursivitatii se mai recomanda utilizarea variabilelor globale pentru a se evita
crearea unor dubluri de variabile pe stiva.
Avantajul recursivitatii este acela ca:
- reduce lungimea textului sursa;
- conduce la solutii clare in comparatie cu solutiile iterative.
Recursivitatea se recomanda:
- in problemele ale caror solutii pot fi definite in termeni recursivi;
- in cazul problemelor complexe rezolvate prin backtracking.
Intotdeauna o problema recursiva are si o rezolvare iterativa si invers.
Utilizarea tehnicilor recursive nu conduce intotdeauna la solutii optime. Ca atare, se
recomanda o analiza a eficientei solutiei recursive si a celei nerecursive si alegerea solutiei celei
mai avantajoase

Exemplul 1: Sa se calculeze n! intr-o varianta iterativa si alta recursiva. Se stie ca :

1 daca n=0
n!=
n.(n-1)! daca n>0
Pseudocodul pentru varianta iterativa si cea recursiva:
functia FACT1(i) este: {iterativ}
f:=1;
pentru i=1,n,1 repeta
│ f=f*i

FACT1:=f
sfarsit
functia FACT2(i) este: {recursiv}
daca i>0 atunci
│ FACT2=i*FACT2(i-1)
│ altfel
| FACT2=1

Sfarsit
citeste n
pentru k=1,n,1 repeta
│ f1=FACT1(k);
│ f2:=FACT2(k);
│ scrie f1,f2

stop

Exemplul 2: Sa se genereze un sir de cifre reprezentand scrierea rasturnata a unui numar intreg
si pozitiv intr-o varianta iterativa si una recursiva.
Algoritmul de calcul se bazeaza pe aflarea cifrelor numarului prin impartiri la 10.
procedura INV1(n)este: {iterativ}
repeta

4
│ scrie n mod 10
│ n=n div 10;
└ pana n=0
sfarsit
procedura INV2(n)este: {recursiv}
scrie n mod 10
daca (n div 10)<>0 atunci
│ INV2(n div 10)

sfarsit
Programul principal:
n=12345
INV1(n);
INV2(n);
stop

Exemplul 3. Sa se determine cel mai mare divizor comun a doua numere folosind o varianta
recursiva si una iterativa pentru algoritmul lui Euclid.
In varianta iterativa se va folosi algoritmul lui Euclid in varianta clasicia iar in varianta recursiva
se va folosi definitia:
a daca a=b
cmmdc(a,b)=
cmmdc(b,a mod b) daca a<> b
functia CMMDCR(a,b) este:
daca b=0 atunci
│ CMMDC=a
│ altfel
│ CMMDCR=CMMDCR(b,a mod b);

sfarsit
functia CMMDCI(a,b) este:
daca a<b atunci
│ r=a;
│ a=b;
│ b=r;

r= a mod b;
cat timp r<>0 executa
│ a=b;
│ b=r;
│ r= a mod b;

CMMDCI:=a;
sfarsit

Programul principal:

5
scrie ’ dati numerele:'
citeste a,b
c:=CMMDCR(a,b);
scrie'CMMDCR=',c
c:=CMMDCI(a,b);
scrie 'CMMDCI=',c
stop

Sa se calculeze primele n numere din sirul lui Fibonacci folosind o varianta recursiva si
una iterativa.
Sirul numerelor lui Fibonacci 0, 1, 1, 3, 5, 8, 13, 21, ... sunt definite recursiv astfel:
f(0)=0, f(1)=1, f(i)=f(i-1)+f(i-2) pentru i>1.
functia fiboi (n) este: // varianta iterativa
i=1
a=0
b=1
daca(n<=1) atunci
│ fiboi=n
│altfel
│ cat timp (i<=n) repeta
│ │ c=a+b
│ │ a=b
│ │ b=c
│ │ i=i+1
│ └
│ fiboi=c

stop
functia fibor (n) este: // varianta recursiva
daca(n<=1) atunci
│ fibor=n
│altfel
│ fibor=fibor(n-1)+fibor(n-2)

stop
citeste n
pentru i=1,n,1 repeta
scrie fiboi(i), fibor(i)
stop

Observatie.
De obicei se asociaza o multime de entitati locale unui subprogram, adica variabile, constante,
tipuri care sunt definite local in acel subprogram si care nu au nici o semnificatie in afara ei. In
acest caz de fiecare data cand un asemenea subprogram este activat recursiv, se creaza un nou set
de variabile locale. Desi noile variabile au acelasi nume cu cele existente inainte de activarea

6
subprogramului, valorile lor sunt distincte si orice conflict de nume este evitat de regulile
domeniului de valabilitate al identificatorilor: Identificatorii se refera intotdeauna la ultimul set
de variabile creat. Aceleasi reguli se refera si la parametrii de tip valoare ai subprogramului, care
sunt inglobati prin definitie in subprogram.
Este indicat pe cat posbil a nu se folosi variabile locale in subprograme recursive pentru a nu se
depasi stiva procesorului.

Exemplul 5. Sa se afiseze in ordine inversa un sir de caractere de lungime arbitrara, terminat


prin spatiu.
Algoritmul recursiv in pseudocod::
procedura INVSIR() este:
citeste ch
daca ch<> ’ ’ atunci INVSIR();
scrie ch
sfarsit
Programul principal:
scrie’ sirul este’
INVSIR()
stop

Pentru fiecare apel al procedurii recursive INVSIR se creaza o copie a variabilei locale "ch".
Recursivitatea poate fi transformata in majoritatea cazurilor intr-o iteratie. In general,
forma nerecursiva a unui program este mai eficienta decit cea recursiva in ceea ce priveste
timpul de executie si memoria ocupata.
In alegerea caii recursive sau iterative de a rezolva o problema, programatorul trebuie
sa-si stabileasca bine prioritatile in alcatuirea programului, analizand complexitatea acestuia,
naturaletea exprimarii, usurinta proiectarii si intretinerii programului, eficienta in executie.
Daca problema de rezolvat este de complexitate redusa si programul trebuie sa aiba
eficienta maxima, iar transformarea recursivitatii in iteratii se face usor fara a dauna asupra natu-
raletii algoritmului, este de preferat varianta iterativa (ca in exemplele de mai sus).
In general, clasa de functii definite recursiv:
G(x) , daca n=0
Fn(x)=
H * Fn-1(x) , daca n>0

se poate exprima iterativ, solutia recursiva nefiind absolut necesara.


Pentru a nu se crea la fiecare apel recursiv multe copii de variabile locale, se indica,
atunci cand acest lucru este posibil, folosirea variabilelor declarate global.

Astfel, in programul urmator care determina recursiv maximul unui sir, variabilele k, j,
s-au declarat globale si nu locale.
Exemplul 6. Sa se determine maximul unui sir de numere intregi folosind o solutie
recursiva.
functia maxr(i) este:

7
daca i<n atunci
│ daca a[i]>a[j] atunci
│ │ k=i
│ │altfel
│ │ k=j
│ └
│ altfel
│ k=n
│ maxr=k

sfarsit
Programul principal:
citeste n
citeste a(i),i=1,n
scrie "Rangul elementului maxim=”,maxr(1)
scrie “Valoarea sa este”, a[maxr(1)]
stop

2. O altă funcţie recursivă cunoscută este funcţia lui Ackermann definită astfel:
A(0,n)=n+1
A(m,0)=A(m-1,1)
A(m,n)=A(m-1,A(m,n-1))
Pentru câteva valori particulare ale argumentelor, valorile acestei funcţii sunt cunoscute:
A(1,n)=n+2;
A(2,n)=2*(n+3)-3;
A(3,n)=2n+3-3.
Datorită gradului mare de recursivitate a acestei funcţii, ea este frecvent folosită ca un
criteriu de evaluare a performanţelor compilatoarelor, indicând eficienţa mecanismului de apel al
procedurilor recursive.

8
REZOLVARE TEORETICA

Programul efectueaza urmatoarele operatii:

a)Citeste si afiseaza elementele intregi ale unui


vector.
b)Verifica existenta unui element pozitiv intr-un
vector.
c)Determina numarul de aparitii ale unui element x intr-
un vector.

d)Cauta,intr-un vector ordonat,cu n elemente intregi,


elementul cu valoarea intreaga x si afiseaza pozitia in care a
fost gasit.

e)Sorteaza crescator un vector cu n numere


reale(selectia directa).

f)Genereaza toate permutarile multimii{1,2,...,n}.

g)Genereaza toate aranjamentele multimii{1,2,...,n}


luate cate m.

h)Determina cmmdc al elementelor dintr-un vector cu


numere intregi.

9
LISTING-UL PROGRAMULUI:
Main
#include <iostream.h>
#include <stdlib.h>
#include "a.h"
#include "b.h"
#include "c.h"
#include "d.h"
#include "e.h"
#include "f.h"
#include "g.h"
#include "h.h"
void main()
{
cout<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@ RECURSIVITATEA
@@@@@@"<<endl;
cout<<" @@ Implementarea recursiva a algoritmilor pentru
prelucrarea @@"<<endl;
cout<<" @@@@@@ tablourilor de memorie
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
int x=1;
while(x==1)
{
char caracter;
cout<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@ TOATE PROGRAMELE DE MAI JOS AU FOST CONSTRUITE CU
AJUTORUL @@@@@"<<endl;
cout<<" @@@@@@@@@@ UNOR SUBPROGRAME RECURSIVE
@@@@@@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@ Programul efectueaza urmatoarele operatii:
@@@@@@"<<endl;
cout<<" @ a)Citeste si afiseaza elementele intregi ale unui
vector. @"<<endl;
cout<<" @ b)Verifica existenta unui element pozitiv intr-un
vector. @"<<endl;
cout<<" @ c)Determina numarul de aparitii ale unui element x intr-
un vector. @"<<endl;
cout<<" @ d)Cauta,intr-un vector ordonat,cu n elemente intregi,
elementul @"<<endl;

10
cout<<" @ cu valoarea intreaga x si afiseaza pozitia in care a
fost gasit. @"<<endl;
cout<<" @ e)Sorteaza crescator un vector cu n numere
reale(selectia directa).@"<<endl;
cout<<" @ f)Genereaza toate permutarile multimii{1,2,...,n}.
@"<<endl;
cout<<" @ g)Genereaza toate aranjamentele multimii{1,2,...,n}
luate cate m. @"<<endl;
cout<<" @ h)Determina cmmdc al elementelor dintr-un vector cu
numere intregi. @"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@ PROGRAM REALIZAT DE Antonescu Albert - clasa a
XII-a A @@@@@"<<endl;
cout<<" @@@@@@@@@@ Prof. BOGDAN GHEORGHIU
@@@@@@@@@@@"<<endl;
cout<<" @@@@@@@@@@ COLEGIUL NATIONAL SPIRU HARET - TECUCI
@@@@@@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" Ce program doriti sa executati?"<<endl;
cout<<" Introduceti caracterul(a,b,c,d,e,f,g sau h):";cin>>caracter;
cout<<endl;
switch(caracter)
{
case 'a':{cin.get();
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@@@@ CITIREA SI AFISAREA ELEMENTELOR INTREGI ALE UNUI
VECTOR. @@@@@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
a(); }break;
case 'b':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@@@@ SA SE VERIFICE DACA EXISTA UN ELEMENT POZITIV IN
VECTOR. @@@@@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

11
b(); }break;
case 'c':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Determina numarul de aparitii ale unui element x intr-un
vector. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

c(); }break;
case 'd':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@ Cautarea,intr-un vector ordonat,cu n elemente
intregi, @@@@@@"<<endl;
cout<<" @@@@@@ a elementului cu valoarea intreaga x si afisarea
pozitiei@@@@@@"<<endl;
cout<<" @@@@@@ in care a fost gasit.
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

d(); }break;
case 'e':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Sa se sorteze crescator un vector cu n numere reale.
@@@"<<endl;
cout<<" @@@@@@ Metoda selectiei directe
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

e(); }break;
case 'f':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;

12
cout<<" @@@ Sa se genereze toate permutarile unei multimi -
backtracking. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

f(); }break;
case 'g':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Sa se genereze toate aranjamentele unei multimi -
backtracking. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

g(); }break;
case 'h':{
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<" @@@ Sa se determine cmmdc al elementelor dintr-un
vector. @@@"<<endl;
cout<<" @@@@@@
@@@@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

h(); }break;
default:cout<<" Se introduc doar valorile a,b,c,d,e,f,g sau h.";
}
cout<<endl<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;
cout<<" @@@@ Doriti sa executati alt program?
@@@@"<<endl;
cout<<" @ Pentru DA introduceti 1, in caz contrar introduceti orice
alt numar. @"<<endl;
cout<<" @ Introduceti numarul
@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<
<endl;

13
cout<<" x="; cin>>x;
system("cls");
}
cout<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<<endl;
cout<<" @@@@@@@ SFARSIT!
@@@@@@@"<<endl;
cout<<" @@@ APASATI ORICE TASTA PENTRU A IESI DIN PROGRAM.
@@@"<<endl;
cout<<"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"<<endl;
}

A
#include<iostream.h>
int v[100],n;
void citeste(int i)
{
if(i<=n)
{cout<<"v["<<i<<"]=";
cin>>v[i];
citeste(i+1);}
}
void afiseaza(int i)
{
if(i<=n)
{cout<<v[i]<<" ";
afiseaza(i+1);}
}
void a()
{
cout<<"Introduceti lungimea logica a vectorului:";
cin>>n;
citeste(1);
cout<<"Elementele citite sunt:";
afiseaza(1);
}

B
#include <iostream.h>
int v1[100],n1;
int pozitiv(int i)
{
if(i>n1)

14
return 0;
else
if(v1[i]>0)
return 1;
else
return pozitiv(i+1);
}
void b()
{int i;
cout<<"Introduceti lungimea logica a vectorului:";cin>>n1;
for(i=1;i<=n1;i++)
{
cout<<"v["<<i<<"]=";
cin>>v1[i];
}
cout<<"Elementele vectorului sunt:";
for(i=1;i<=n1;i++)
cout<<v1[i]<<" ";
cout<<endl;
if(pozitiv(1))
cout<<"S-a gasit cel putin un element pozitiv.";
else
cout<<"Nu s-a gasit niciun element pozitiv.";

C
#include <iostream.h>
int v2[100],n2;
int gasit(int el,int k)
{
if(k==n2)
return (el==v2[n2]);
else
return (el==v2[k])+gasit(el,k+1);
}
void c()
{
int el,i;
cout<<"n=";cin>>n2;
cout<<"Elementul care se cauta:";cin>>el;
for(i=1;i<=n2;i++)
{
cout<<"v["<<i<<"]=";
cin>>v2[i];
}
for(i=1;i<=n2;i++)

15
cout<<v2[i]<<" ";
cout<<endl;
if(gasit(el,1)==0)
cout<<"Elementul "<<el<<" nu exista in vector.";
else
if(gasit(el,1)==1)
cout<<"Elementul "<<el<<" s-a gasit o singura data in
vector.";
else
cout<<"Elementul "<<el<<" exista in vector de
"<<gasit(el,1)<<" ori.";
}

D
#include <iostream.h>
int v3[100],n3,elem;
void cautare(int p,int u,int &pozitia)
{
int m;
if(p<=u)
{
m=(p+u)/2;
if(elem==v3[m])
pozitia=m;
else
if(elem<v3[m])
cautare(p,m-1,pozitia);
else
cautare(m+1,u,pozitia);
}
}
void d()
{
int i,pozitia=0;
cout<<"n=";cin>>n3;
cout<<"Elementul care se cauta=";cin>>elem;
for(i=1;i<=n3;i++)
{
cout<<"v["<<i<<"]=";
cin>>v3[i];
}
cautare(1,n3,pozitia);
if(pozitia==0)
cout<<"Elementul nu exista";
else
cout<<"Elementul se afla pe pozitia "<<pozitia;

16
}
E
#include <iostream.h>
float v4[100];
int n4;
void sortare(int i,int j,int n)
{
float aux;
if(i!=n-1)
{
if(v4[j]<v4[i])
{
aux=v4[i];
v4[i]=v4[j];
v4[j]=aux;
}
if(j!=n-1)
sortare(i,j+1,n);
else
sortare(i+1,i+2,n);
}
}
void e()
{
int i;
cout<<"n=";cin>>n4;
for(i=0;i<n4;i++)
{
cout<<"v["<<i<<"]=";
cin>>v4[i];
}
sortare(0,1,n4);
cout<<"Vectorul ordonat este:";
for(i=0;i<n4;i++)
cout<<v4[i]<<" ";
cout<<".";
}
F
#include <iostream.h>
int n5,st[100],solutii=0;
void init(int k)
{
st[k]=0;
}
int succesor(int k)
{

17
if(st[k]<n5)
{
st[k]++;
return 1;
}
else
return 0;
}
int valid(int k)
{
for(int i=1;i<k;i++)
if(st[i]==st[k])
return 0;
return 1;
}
int solutie(int k)
{
return k==n5;
}
void tipar()
{solutii++;
for(int i=1;i<=n5;i++)
cout<<st[i]<<" ";
cout<<endl;
}
void back(int k)
{
init(k);
while(succesor(k))
{if(valid(k))
if(solutie(k))
tipar();
else
back(k+1);}
}
void f()
{
cout<<"n=";cin>>n5;
cout<<"Permutarile de "<<n5<<" sunt:"<<endl;
back(1);
cout<<"S-au gasit "<<solutii<<" solutii.";
}
G
#include <iostream.h>
int n6,st1[100],solutii1=0,m6;
void init1(int k)
{

18
st1[k]=0;
}
int succesor1(int k)
{
if(st1[k]<n6)
{
st1[k]++;
return 1;
}
else
return 0;
}
int valid1(int k)
{
for(int i=1;i<k;i++)
if(st1[i]==st1[k])
return 0;
return 1;
}
int solutie1(int k)
{
return k==m6;
}
void tipar1()
{solutii1++;
for(int i=1;i<=m6;i++)
cout<<st1[i]<<" ";
cout<<endl;
}
void back1(int k)
{
init1(k);
while(succesor1(k))
{if(valid1(k))
if(solutie1(k))
tipar1();
else
back1(k+1);
}
}
void g()
{
cout<<"n=";cin>>n6;
cout<<"m=";cin>>m6;
cout<<"Aranjamentele de "<<n6<<" luate cate "<<m6<<"
sunt:"<<endl;
back1(1);

19
cout<<"S-au gasit "<<solutii1<<" solutii.";
}
H
#include <iostream.h>
int vector[100],n7;
int cmmdc(int prim,int ultim)
{
int mijloc,y,t;
if(prim==ultim)
return vector[prim];
else
{
mijloc=(prim+ultim)/2;
y=cmmdc(prim,mijloc);
t=cmmdc(mijloc+1,ultim);
while(y!=t)
if(y>t)
y=y-t;
else
t=t-y;
return y;
}
}
void h()
{
cout<<"n=";cin>>n7;
for(int i=1;i<=n7;i++)
{
cout<<"v["<<i<<"]=";
cin>>vector[i];
}
cout<<"Cel mai mare divizor comun este "<<cmmdc(1,n7)<<".";
}

20
BIBLIOGRAFIE:

1.Waite M., Prata St., Martin D. ,”C Primer Plus”, Howard W. Sans & C0, 1986
2.Jamsa K., Klander L.- Totul despre C si C++. Manual fundamental de
programare in C si C++. Teora 2002
3.Schildt H. – C manual complet. Teora 1998
4. Schildt H. – C++ manual complet. Teora 1998
5.Kernighan B., Ritchie D. – The C Programming Language, Printice Hall,1988
6.Cristea V., Kalisz E., Giumale C., Panoiu F.- Limbajul C standard, Teora 1992
7.Marian Gh., si alti- Modele de grile pentru examenele de diploma si absolvire,
Editura Universitaria 2004 ISBN 973-8043-503-3
8.Patrascoiu O., Marian Gh., Mitroi N. – Elemente de grafuri si combinarorica.
Metode, algoritmi si programe, Editura ALL 1993 ISBN 973-571-017-X
9. Patrascoiu O., Mitroi N. , Marian Gh.- Limbajul C, Teorie si programe, Editura
Microcomputer Service, Craiova, 1994.
10.Petrovici V., Goicea F. – Programare in limbajul C, Ed. Tehnica 1988
11.Marian Gh., Badica C., Lascu M.,Iordache S.-Limbajul C-Aplicatii, Editura
Spirit Romanesc, Craiova 1997
12.Mocanu M., Marian Gh., Badica I., C., Badica P., C. - 333 probleme de
programare, Editura TEORA, Bucuresti, 1993.

21
CUPRINS:

Tema proiect…………………………………………………………….1

Generalitati…………………………………………………………..….2

Rezolvare teoretica…………………………………………………..….9

Listing-ul programului………………………………………………...10

Bibliografie…………………………………………………………….21

22

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