miercuri, 26 mai 2010

STIATI CA:




Recursivitatea este una din notiunile fundamentale ale informaticii.Utilizarea frecventa a recursivitatii s-a facut dupa anii '80.Multe din limbajele de programare evoluate si mult utilizate(Fortran ,Cobol) nu permiteau scrierea programelor recursive.
In linii mari,recursivitatea este un mecanism general de elaborare a programelor .Ea a aparut din necesitati practice (transcrierea directa a formulelor matematice recursive) si reprezinta acel mecanism prin care un subprogram(procedura,functie) se autoapeleaza.
Mecanismul recursivităţii
-Care este mecanismul prin care programele se autoapelează? Să ne
amintim cum memorează programele parametrii transmişi: pentru memorarea parametrilor, subprogramele folosesc o zonă de memorie numită stivă.
-Memorarea parametrilor transmişi se face în ordinea în care aceştia figurează în antet: de la stânga la dreapta. Pentru parametrii transmişi prin valoare,se transmite valoarea, iar pentru cei transmişi prin referinţă se transmite adresa. În cadrul subprogramului, parametrii transmişi şi memoraţi în stivă sunt variabile. Numele lor este cel din lista parametrilor formali.
-Subprogramul lucrează cu datele aflate pe un anumit nivel al stivei
pentru variabilele transmise prin valoare, dar şi cu variabilele funcţiei
main(), dacă acestea sunt transmise prin referinţă.
-Există posibilitatea ca subprogramul să lucreze direct cu variabilele
globale fără ca acestea să fie transmise prin referinţă. După cum ştim
variabilele globale pot fi accesate din orice subprogram, dacă sunt declarate la începutul codului sursă.
-În cazul unui număr foarte mare de autoapelări, există posibilitatea ca segmentul de stivă să se ocupe total, caz în care programul se va termina cu eroare.
-Recursivitatea presupune mai multă memorie.
-O gândire recursivă exprimă concentrat o anumită stare, care se repetă la infinit. Această gândire se aplică în elaborarea algoritmilor recursivi cu o modificare esenţială: adăugarea condiţiei de terminare. În absenţa acestei condiţii nu se poate vorbi despre un algoritm deoarece aceştia sunt finiţi.

miercuri, 14 aprilie 2010

Teorie :SIRURI DE CARACTERE

SIRURI DE CARACTERE



O constanta de tip sir de caractere de declara intre doua caractere “. In memoria interna, o constanta de acest tip este retinuta sub forma unui vector de caractere. Fiecare componenta a sirului (incepand cu cea de indice 0) retine codul ASCII al caracterului pe care il memoreaza. Conventia este ca ultimul octet sa retina 0 (codul caracterului nul). Caracterul nul este memorat automat. Trebuie rezervate lungimea_sirului+1 caractere char (+1 pentru caracterul nul).
Limbajul C/C++ permite initializarea unui tablou de caractere printr-o constanta sir, care include automat caracterul null.

Exemplu :
char vect[11]=”calculator”;
char vect[]=”calculator”; (compilatorul face calculul numarului de octeti necesari)
char vect[100]=”calculator”; (s-au rezervat mai multi octeti decat era necesar)

Sirurile de caractere sunt de fapt tablouri de caractere, care au ca ultim element un terminator de sir, caracterul null.
Exemplu:
char tc[5] = {’a’, ’b’, ’c’, ’d’, ’e’}; // tablou de caractere
char sc[5] = {’a’, ’b’, ’c’, ’d’, ’\0’}; // sir de caractere cu elementele abcd
Ultima initializare este echivalenta cu:
char sc[5] = ”abcd”; //sau char sc[] = ”abcd”;
char sc1[5] = ”abcd”;
char s[10];



CITIREA / AFISAREA SIRURILOR DE CARACTERE

Sirurile de caractere pot fi initializate inca de la declarare sau citite pe parcursul programului.
a. Citirea unui sir de caractere se poate face ca citirea oricarui tablou, intr-un for, caracter cu caracter (desi nu este recomandata). In acest caz, terminatorul de sir nu este memorat automat, el trebuie pus explicit dupa ultimul caracter din sir.

Exemplu:
char c[20];
for(int i=0;i < =5;i++) cin>>c[i];
cout < <>> . Caracterul nul este adaugat automat. Dezavantajul este ca in acest fel nu se pot citi siruri care contin mai multe cuvinte separate prin spatii. Citirea sirului se sfarseste la intalnirea primului caracter blank (de ex, daca se citeste “ora de informatica”, variabila c va retine numai “ora”).
Exemplu
char c[30];
cin > > c;
cout < <>

Teste grila din variante STRUCTURI

Varianta 5,Subiectul II :

1.Variabila d, declarată alăturat, memorează în câmpurile a şi b
lăţimea şi, respectiv, lungimea unui dreptunghi. Care dintre
următoarele instrucţiuni atribuie câmpului aria al variabilei d
valoarea ariei dreptunghiului respectiv? (4p.)
struct dreptunghi
{
float a,b,aria;
}d;
a. d.aria==d.a*d.b; RASP :d
b. aria.d=a.d*b.d;
c. aria.d=d.a*d.b;
d. d.aria=d.a*d.b;

Varianta 52,Subiectul II:

1. Considerăm declararea alăturată folosită
pentru a memora numele, prenumele şi cele
2 note ale unui elev.
Care dintre instrucţiunile de mai jos
calculează în variabila reală m media
aritmetică a notelor elevului ale cărui
informaţii sunt memorate în variabila x? (4p.)
struct elev{
char nume[10],prenume[20];
float nota1,nota2;
} x;
a. m=(x.nota1+x.nota2)/2; b. m=(nota1+nota2)/2;
c. x.m=(x.nota1+x.nota2)/2; d. m=(x,nota1+x,nota2)/2; RASP : a

Varianta 51, Subiectul II:

1. Considerăm declararea alăturată
folosită pentru a memora numele,
prenumele şi media unui elev.
Care dintre expresiile de mai jos are ca
valoare prima literă a numelui unui
elev ale cărui informaţii sunt memorate
în variabila p? (4p.)
struct elev{
char nume[10],prenume[20];
float medie;
}p;
a. p.nume[1]
b. p.nume[0] RASP :b
c. p.nume
d. nume[1]

Varianta 43,Subiectul II:

3. Variabila x, declarată alăturat, memorează în câmpurile med1 şi
med2 mediile semestriale ale unui elev. Scrieţi o expresie a cărei
valoare va fi media anuală a acestui elev. (6p.)
struct elev { RASP: float medan;
medan=(x.med1+x.med2)/2;
int matricol;
float med1,med2;} x;

Varianta 47,Subiectul II

4. În declararea alăturată, câmpurile a şi b ale înregistrării
reprezintă numărătorul, respectiv numitorul unei fracţii. Care este
expresia cu care se pot înlocui punctele de suspensie în secvenţa
de mai jos astfel încât dacă fracţia memorată în variabila f se
simplifică prin numărul natural nenul k se afişează mesajul DA?
if ( … ) cout < < ” DA”;
(6p.)
RASP : (a%k==0) && (b%k==0)
struct rap { int a, b; } f;
int k;

Varianta 37,Subiectul II:
1. Fie declarările alăturate. Dacă variabila x reţine informaţii despre un elev, precizaţi care este varianta corectă ce afişează prima literă din numele acestuia? (4p.)
struct elev{ char nume[30]; float nota;}; elev x;
a. cout < < nume;
b. cout < < x;
c. cout < < x.nume;
d. cout < < x.nume[0]; RASP : d

Varianta 62 ,Subiectul II:
2.Considerând declarările alăturate, care dintre următoarele referiri este corectă din punct de vedere sintactic ? (4p.)
struct complex {float re,im;};
complex x,y;
a. complex.re
b. x.re RASP: b
c. complex.x
d. re.x

Varianta 64,Subiectul II:
1. Considerând declarările alăturate, care dintre următoarele referiri este corectă din punct de vedere sintactic ? (4p.)
struct datan{int zi,ln,an;};
struct elev {char nume[30]; datan dn,da;} e;
a. e.datan.ln
b. nume.e
c. e.dn.an[2]
d. e.dn.zi RASP: d

Varianta 65,Subeictul II:
1. Considerând declarările alăturate, care dintre următoarele referiri este corectă din punct de vedere sintactic ? (4p.)
struct punct{float x,y;};
struct cerc {float raza; punct centru;} c;
a. c.punct.y
b. c.raza.punct
c. c.centru.x Rasp :c
d. c.y.centru

Varianta 66,Subiectul II:
1. Cum se poate accesa prima literă a denumirii unui produs ale cărui caracteristici sunt memorate în variabila p, declarată alăturat? (4p.)
struct produs{ char denumire[15]; int pret;}p;
a. produs.denumire[0]
b. denumire.p[0]
c. p.denumire[0] Rasp :c
d. p- > denumire[0]

Varianta 67,Subiectul II:

1. Cum se poate accesa prima literă a numelui unei
persoane ale cărei date de identificare sunt
memorate în variabila p, declarată alăturat? (4p.)
struct persoana{
char nume[20],prenume[20];
int varsta;} p;
a. p.nume[0] Rasp:a
b. persoana.nume[0]
c. p- > nume[0]
d. nume.p[0]


Varianta 68,Subiectul II:

1. Cum se poate accesa prima literă a denumirii unui material ale
cărui caracteristici sunt memorate în variabila m, declarată
alăturat? (4p.)
struct material{
char denumire[20];
int pret;} m;
a. denumire.m[0]
b. m- > denumire[0]
c. material.denumire[0]
d. m.denumire[0] Rasp :d


Varianta 69,Subiectul II:

1. Cum se poate accesa prima literă a numelui unui
elev ale cărui date de identificare sunt memorate
în variabila e, declarată alăturat? (4p.)
struct elev{
char nume[20],prenume[20];
int varsta;}e;
a. e- > nume[0]
b. e.nume[0] Rasp:b
c. elev.nume[0]
d. nume.e[0]

Varianta 70,Subiectul II :

1. Ştiind că fiecare dintre variabilele var1, var2 memorează numele
şi nota câte unui elev în forma dată de declararea alăturată,
indicaţi care dintre următoarele instrucţiuni determină, în urma
executării, memorarea în variabila reală m a mediei aritmetice a
notelor celor doi elevi. (4p.)
struct elev
{ char nume[30];
float nota;
}var1,var2;
a. m=(var1.nota+var2.nota)/2; Rasp :a
b. m=var1.nota+var2.nota/2;
c. m=(var1+var2).nota/2;
d. m=nota(var1+var2)/2;

Varianta 71,Subiectul II:

4. Fiecare dintre variabilele declarate alăturat memorează numele
şi nota câte unui elev.
Scrieţi secvenţa de instrucţiuni prin care se citesc de la
tastatură numele şi nota pentru fiecare dintre variabilele e1 şi
e2 şi apoi se afişează numele elevului cu nota cea mai mare.
Dacă cele două note sunt egale, se va afişa numele elevului
memorat în variabila e1. (6p.)
struct elev{
char nume[20];
float nota;
};
elev e1,e2;


Rasp:
cout < < ”numele primului elev “ ; cin > > e1.nume;
cout < < ”nota primului elev “ ; cin > > e1.nota;
cout < < ”numele celui de al 2-lea elev “ ; cin > > e.2 .nume;
cout < < ” nota celui de al 2-lea elev “ ; cin > > e1.nota;
if(e1.nota>=e2.nota) cout < < e1.nume;
else cout < < e2.nume ;
http://infoscience.3x.ro/c++/siruridecaractere.htm


SUBPROGRAME

Definitie.
Subprogramul este prin urmare un ansamblu alcatuit din tiputi de date, variabile si instructiuni scrise in vederea unei anumite prelucrari (calcule, citiri, scrieri), care se identifica printr-un nume si care poate fi executat doar daca este apelat .

Avantajele utilizarii subprogramelor:
· Modularizarea problemei (descompunerea in subprobleme)
· Reutilizarea aceleasi secvente de mai multe ori (in contexte diferite)
· Depanarea si intretinerea mai usoara



O funcţie este formata din antet si corp:
antet_funcţie
{corpul_funcţiei
}
Sau:
tip_val_return nume_func (lista_declaraţiilor_param_ formali)
{declaraţii_variabile_locale
instrucţiuni
[return valoare]
}


Antetul unei functii:
Prima linie reprezintă antetul funcţiei, în care se indică: tipul funcţiei, numele acesteia şi lista declaraţiilor parametrilor formali.
La fel ca un operand sau o expresie, o funcţie are un tip, care este dat de tipul valorii returnate de funcţie în funcţia apelantă. Dacă funcţia nu întoarce nici o valoare, în locul tip_vali_return se specifică void. Dacă tip_val_return lipseşte, se consideră, implicit, că acesta este int.
Nume_funcţie este un identificator
Lista_declaraţiilor_param_formali (încadrată între paranteze rotunde) constă într-o listă (enumerare) care conţine tipul şi identificatorul fiecărui parametru de intrare, despărţite prin virgulă. Tipul unui parametru poate fi oricare, chiar şi tipul pointer. Dacă lista parametrilor formali este vidă, în antet, după numele funcţiei, apar doar parantezele ( ), sau (void).


Corpul funcţiei este un bloc, care implementează algoritmul de calcul folosit de către funcţie. În corpul funcţiei apar (în orice ordine) declaraţii pentru variabilele locale şi instrucţiuni. Dacă funcţia întoarce o valoare, se foloseşte instrucţiunea return valoare. La execuţie, la întâlnirea acestei instrucţiuni, se revine în funcţia apelantă.


În limbajul C/C++ se utilizează declaraţii şi definiţii de funcţii.

Declaraţia conţine antetul funcţiei şi informează compilatorul asupra tipului, numelui funcţiei şi a listei parametrilor formali (în care se poate indica tipul parametrilor formali şi numele acestora). Declaraţiile de funcţii se numesc prototipuri, şi sunt constituite din antetul funcţiei.
Definiţia conţine antetul funcţiei şi corpul acesteia. Nu este admisă definirea unei funcţii în corpul altei funcţii.

Apelul şi prototipul funcţiilor

O funcţie poate fi apelată printr-o construcţie urmată de punct şi virgulă, numită instrucţiune de apel, de forma:
nume_funcţie (lista_parametrilor_efectivi);

Parametrii efectivi trebuie să corespundă cu cei formali ca ordine şi tip. La apel, se atribuie parametrilor formali valorile parametrilor efectivi, după care se execută instrucţiunile din corpul funcţiei. La revenirea din funcţie, controlul este redat funcţiei apelante, şi execuţia continuă cu instrucţiunea următoare instrucţiunii de apel, din funcţia apelantă. O altă posibilitate de a apela o funcţie este aceea în care apelul funcţiei constituie operandul unei expresii (apelul functiei intervine intr-o expresie). Acest lucru este posibil doar în cazul în care funcţia returnează o valoare, folosită în calculul expresiei(doar pentru functiile cu tip).

Parametrii declaraţi în antetul unei funcţii sunt numiţi formali, pentru a sublinia faptul că ei nu reprezintă valori concrete, ci numai ţin locul acestora pentru a putea exprima procesul de calcul realizat prin funcţie. Ei se concretizează la execuţie prin apelurile funcţiei.
Parametrii folosiţi la apelul unei funcţii sunt parametri reali, efectivi, concreţi, actuali iar valorile lor vor fi atribuite parametrilor formali, la execuţie. Utilizarea parametrilor formali la implementarea funcţiilor şi atribuirea de valori concrete pentru ei, la execuţie, reprezintă un prim nivel de abstractizare în programare. Acest mod de programare se numeşte programare procedurală şi realizează un proces de abstractizare prin parametri.

Variabilele declarate în interiorul unei funcţii, cât şi parametrii formali ai acesteia nu pot fi accesaţi decât în interiorul acesteia. Aceste variabile sunt numite variabile locale şi nu pot fi accesate din alte funcţii. Domeniul de vizibilitate a unei variabile este porţiunea de cod la a cărei execuţie variabila respectivă este accesibilă. Deci, domeniul de vizibilitate a unei variabile locale este funcţia în care ea a fost definită.