Sunteți pe pagina 1din 6

Teorie - Recursivitate ,Structuri,Siruri de caractere

Recursivitate
Recursivitate este proprietatea functiilor de a se autoapela.
(Un arbore este format din ramuri.
O ramura este formata din ramuri
mai mici.O ramura mai mica este
formata din ramuri si mai mici....)
Structura este formata din:
tip functie_recursiva (parametru formal)
{ ..
..
..
conditie de oprire
ramura de continuare
functie_recursiva (parametru formal modificat)
}
Toate instructiunile din program se executa
de cate ori este apelata functia.
Orice functie recursiva trebuie sa contina
o cinditie de oprire respectiv,de
continuare.
La fiecare reapel al functiei se executa
aceeas segventa de instructiuni
La fiecare reapel,in zona de
stiva a memoriei:
-se ocupa un nivel nou
-se memoreaza valoarea parametrilorformali transmisi prin valoare
-adresa parametrilor formali transmisi prin referinta
-adresa de revenire
-variabilele cu valorile din momentul respectiv
Obs:Toate instructiunile din subprogram se executa pentru fiecare reapel
-se executa instructiunile din functie pana la instructiunea de reapel
-se executa din nou aceeas segventa de instructiuni pana la conditia de oprire
-procedeul se reia pana la intalnirea conditiei de oprire
Pentru fiecare apel s-a salvat in stiva
un nivel,apoi pentru fiecare dintre
aceste apeluri se executa instructiunile
ramase in functie cu valoarea datelor
din varful stivei(atentie!vor fi in

ordine inversa introducerii lor in stiva).

Exemplu:
Se ia secventa de program ce se va afisa pentru n=15,x=2?
void F(int n,int x)
{if (x>n) cout<<0; else if(x%4<=1) F(n,x+1) else {f(n,x+3); cout<<1; } }

Rezolvare: n=15 x=2 x nu este mai mare decat n trecem pe ramura else 2%4=0 este
mai mic decat 1 facem F(15,3) x3%4<=1 => F(15,4)
x 4%4<=1 => F(15,5)
x 5%4<=1 => F(15,6)
x 6%4<=1 (=2) trecem la urmatoru else => F(15,9)
x 9%4<=1 => F(15,10)
x 10%4<=1 (=2) => F(15,13)
x 13%4<=1 => F(15,14)
x 14%4<=1 (=2) => F(15,17)
x
Acum golim stiva
pt fiecare else apelat afisam "1"
Rezultat "01111"
Verificare daca un numar este prim.
#include < iostream.h >
int prim(int n,int d)
{if (d==1) return 1;
else if(n%d==0) return 0;
else return prim(n,d-1);
}
int main()
{int n;
cin>>n;
if (prim (n,n/2)==1) cout<<"este prim"; else cout<<"nu este prim"; }

Citirea si afisarea unui vector


#include < iostream.h >;
int a[20],n;
void citire(int a[20],int n)
cin>>a[n];
if(n>1) citire(a,n-1);

}
void afisare(int a[20],int n)
if (n>1) afisare(a,n-1);
}
int main()
{cout<<"n="; cin>>n;
citire(a,n);
afisare(a,n);
}

Cifra maxima / minima / cmmdc dintr-un vector.


int maxim(int a[30],int n)
{if(n==0) return max;
else if(a[n]>max) max=a[n];
return maxim(a,n-1);
}
int minim(int nr)
{if(nr==0) return min;
else if(nr%10 return minim(nr/10);
}
int cmmdc(int a,int b)
{if(a==b) return a;
else if(a>b) return cmmdc(a-b,b);
else return cmmdc(a,b-a);
}

Structuri

Structura este un tip de data structural care imi permite


asocierea mai multor date care pot fi de tipuri diferite.
ex: date despre un elev:
-nume
-prenume
-medie informatica
date despre un material
-denumire
-pret
-cantitate

O structura ee defineste prin:


struct [ < nume > ]
{< tip 1 > camp 11,camp 12,...;
< tip 2 > camp 21,camp 22,...;
...
}[var 1,var 2...;]
ex:
struct elev
{char nume[20],prenume[20];
unsigned nota;
}//s-a definit tipul elev
elev a[100],x; //am declarat variabile de tipul elev
ex:
struct
{char denumire[30];
unsigned pret,cantitate;
}v[100],aux;
Structura de mai sus este anonima.In acest caz variabilele trebuie
declarate dupa inchiderea acoladei.
Accesarea informatiilor:
nume_var.nume_camp
ex: x.nume
a[i].nume
Informatiile asociate unei structuri se numesc "campuri" sau "membri".
ex:-pentru strructura elev avem cmpurile nume,prenume si nota
-pentru structura anonima avem campurile denumire,pret si cantitate

Problema:
Pentru elevii unei clase se cunosc numele,prenumele si media.Sa se afiseze numele
elevului cu cea mai mare medie.
#include
struct elev
{char nume[20],prenume[30];
float media;
}a[40],aux;

int n,i,k;
void citire(elev a[40],int &n)
{int i;
cout << "n="; cin >> n;
for(i=1;i<=n;i++) {cout << "nume" << i << ":"; cin >> a[i].nume;
cout << "prenume" << i << ":"; cin >> a[i].prenume;
cout << "medie" << i << ":"; cin >> a[i].medie;
}
}
int maxim(elev a[40],int n)
{int i,k;
float max;
max=0;
for(i=1;i<=n,i++) if(a[i].med>max) {max=a[i].med';
k=i;
}
cout << a[i].nume;
}
int main()
{citire(a,n);
maxim(a,n);
}

Siruri de caractere

Definitie:Succesiunea de caractere intr-un vector (tablou


unidimensional) de tip char.
ex: char cuv[15]; <- tablou de maxim 15 elemente de tip "char"
Acesta poate fi reprezentat in memorie astfel:
ex:cuv[15]

Citirea si afisarea:
# include < iostream.h >

10

11

12

13

14

int main()
{char cuv[15];
//citirea
cout << "introdu cuvant";
cin >> cuv;
//afisarea
cout << "cuvant citit" << cuv;
}
Cu cout si cin se pot citi doar siruri ce nu contin caractere albe.
Pentru celelalte se foloseste functia cin.get.

Functii care opereaza cu sirurile:


!Este necesara introducerea bibliotecii string.h
strlen -determina lungimea unui sir;
strcpy-copiaza un sir in alt sir;
strcat(char *dest,const char *sursa)-adauga la sfarsitul sirului destinatie o copie
a sirului sursa;
strchr-cauta aparitii ale unui caracter in sir de la stanga la dreapta,returnand
adresa primei aparitii;
strstr-cauta aparitii ale unui subsir in sir si returneaza adresa primului elem din
subsir;
strcmp-compara 2 siruri,returneaza o valoare < decat 0 data s10 daca s1>s2;

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