Sunteți pe pagina 1din 7

TEMA INFORMATICA ANDREI MIHAI COSMIN 10E

I.
1. Structuri de date.
Definitie: Prin structura de date se intelege un ansamblu de date
caracterizat prin relatiile existente intre ele si opreatiile care se pot
efectua cu aceste date.
Structura de tip lista liniara: O lista liniara reprezinta o colectie de
noduri x1, x2…xn aflate intr-o relatie de ordine. Astfel x1 reprezinta
adresa primului nod , x2 adresa celui de-al doilea , xn ultimul nod.
Nod: variabila de tip oarecare, de obicei structurat.
Operatii premise:
• Accesul la oricare nod al listei, pentru citire sau modificare a
informatiei continute de acesta
• Adaugarea unui nod indiferent de pozitia pe care o ocupa in lista
• Stergerea unui nod indifferent de pozitie
• Schimbarea unui nod in cadrul listei
2. Liste particulare: stiva si coada
Stiva este o lista liniara la care singurele operatii premise sunt:
adaugarea unui element in stiva, eliminarea, consultarea sau modificarea
ultimului element in stiva. Stiva functioneaza pe principiul LIFO (Last
in, first out), in care toate operatiile se fac la un singur capat.
Coada este o lista liniara la care operatiile de inserare/adaugare se fac
la unul din capete, iar toate operatiile de stergere/consultare/modificare
se fac la celalalt capat. In cadrul cozii alocate secvential (vector) se
observa fenomenul de migrare al datelor catre ultimele componente ale
vectorului coada(componente de indice mare). Coada functioneaza pe
principiul FIFO (First in, first out)
3. Recursivitatea
Definitie: Recursivitatea este un mecanism general de elaborare al
programelor. Ea consta in posibilitatea ca un subprogram sa se
autoapeleze.
Memorare parametrilor in stiva:
1. Pentru memorarea parametrilor, subprogramul foloseste o zona
de memorie numita stiva.
2. Memorarea parametrilor se face in ordinea in care figureaza in
antet.
3. In cazul parametrilor transmisi prin valoare, se memoreaza
valoarea transmisa, iar in cazul transmiterii parametrilor prin
referinta, se memoreaza adresa variabilei.
4. In cazul programelor, parametrii transmisi si memorati in stiva
sunt variabile. Numele lor este cel din lista parametrilor formali.
Mecanismul recursivitatii:
1. La primul apel al subprogramului se depun in stiva, in ordine,
parametrii formali. Deasemenea rezerva spatiu si pentru
variabile locale. Acesta este un prim nivel al stivei.
2. In cazul in care se autoapeleaza pe un al doilea nivel al stivei, se
depundin nou parametrii transmisi si se rezerva un nou spatiu
pentru variabile locale
Exemplu:
int factorial(int n)
{ if (n==0) return 1;
else return n*factorial(n-1); }

4. Divide et Impera (DEI): tehnica speciala prin care se pot rezolva


anumite probleme. Ea presupune descompunerea unei probleme in doua
sau mai multe subprobleme, care se rezolva, iar solutia finala se obtine
prin combinarea solutiilor subproblemelor. Deasemena fiecare
subproblema, se poate descompune la randul ei in alte doua
subprobleme. Procesul se repeta pana cand se ajunge la subprobleme
care se pot rezolva imediat.
Metoda DEI admite rezolvare recursiva.
Elaborarea unui algoritm DEI presupune doua posibilitati:
1. Am ajuns la o problema care admite o rezolvare imediata, caz in
care se rezolva si se revine la apel.
2. Nu am ajuns in situatia de la 1. , caz in care descompunem
problema in doua sau mai multe subprobleme, pt fiecare din ele
reapeland functia, combinam solutiile si revenim din apel.
II. Probleme
int f(int x, int p)
{ if (x==0) return 0;
else return f(x/10,p*10)+x*p; }
a)f(4,4)
1. 4==0 FALS, rezulta return f(0,40)+16
2. 0==0 ADEVARAT, rezulta return 0;
REZULTAT FINAL: 0+16=16.
b)f(225,1)
1. 225==0 FALS, rezulta return f(22,10)+225;
2. 22==0 FALS, rezulta return f(2,100)+220;
3. 2==0 FALS, rezulta return f(0,1000)+200;
4. 0==0 ADEVARAT, rezulta return 0;
REZULTAT FINAL: 0+200+220+225=645
2. #include <iostream>
#include <math.h>
using namespace std;
int f(int a, int b, int n)
{
if (n==0)
{
cout<<a<<endl<<b;
}
else
return f((a+b)/2,sqrt(a*b),n-1);
}
int main()
{
int a,b,n;
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
cout<<"Aflam termenul: "; cin>>n;
cout<<f(a,b,n);
}
3. #include <iostream>
using namespace std;
int v[100],i,j,n;
void f(int a)
{
int mij=(1+n)/2,k=0;
for(i=1;i<=mij;i++)
{
if (a==v[i])
{
cout<<i<<" ";
}
else
if (a!=v[i])
{
k++;
}
}
for(j=mij+1;j<=n;j++)
{
if (a==v[j])
{
cout<<j<<" ";
}
else
if (a!=v[i])
{
k++;
}
}
if (k==n)
cout<<"Numarul nu exista in sir.";
}
int main()
{
int a;
cout<<"n=";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"v["<<i<<"]=";
cin>>v[i];
}
for(i=1;i<=n;i++)
{
cout<<v[i]<<" ";
}
cout<<endl<<"Numarul caruia doriti sa ii aflati
pozitia: ";
cin>>a;
cout<<"Numarul "<<a<<" se afla pe pozitia
(pozitiile): ";
f(a);
}