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ă.









marți, 13 aprilie 2010




De ce folosim recursivitatea :
1. Adancimea apelurilor recursive este relativ superficiala ,comparat cu marimea problemei .
2.Versiunea recursiva executa aceeasi cantitate de munca precum versiunea nerecursiva .
3. Solutia recursiva este mai scurta si mai simpla decat solutia nerecursiva .
Procesul recursiv este procesul care,in timpul executiei ,genereaza aparitia unor procese similare lui, aflate in legatura directa cu procesul care le genereaza.Se considera ca o notiune este definita recursiv daca in cadrul definitiei ,apare insasi notiunea care se defineste .Procesele descrise prin subprograme sunt procese finite.De aceea ,trebuie definita conditia de terminare
Recursivitatea este frecvent folosita in prelucrarea structurilor de date definite recursiv. Un subprogram recursiv trebuie scris astfel incat sa respecte regulile :
a) Subprogramul trebuie sa poata fi executat cel putin o data fara a se autoapela ;
b)Subprogramul recursiv se va autoapela intr-un mod in are se tinde spre ajungerea in situatia de executie fara autoapel.Pentru a permite apelarea recursiva a subprogramelor, limbajul Pascal dispune de mecanime speciale de suspendare a executiei programului apelant, de salvare a informatiei necesare si de reactivare a programului suspendat .Pentru implementarea recursivitatii se foloseste o zona de memorie in care se poate face salvarea temporala a unor valori. La fiecare appel recursiv al unui subprogram se salveaza in aceasta zona de memorie starea curenta a executiei sale.Desi variabilele locale ale subprogramului apelant au aceleasi nume cu cele ale subprogramului apelat, orice referire la acesti identificatori se asociaza ultimului set de valori alocate in zona de memorie. Zona de memorie ramane alocata pe tot parcursul executie subprogramului apelat si se dealoca in momentul revenirii in programul apelat. Zona de memorie nu este gestionata explicit de programator ci de catre limbaj.La terminarea executiei subprogramului apelat recursiv, se reface contextul programului din care s-a facut apelul. Datorita faptului ca la fiecare autoapel se ocupa o zona de memorie, recursivitatea este eficienta numai daca numarul de autoapelari nu este prea mare pentru a nu se ajunge la umplerea zonei de memorie alocata.Recursivitatea ofera avantajunl unor solutii mai clare pentru probleme si a unei lungimi mai mici a programului. Ea prezinta insa dezavantajul unui timp mai mare de executie si a unui spatiu de memorie alocata ami mare. Este de preferat ca atunci cand programul recursiv poate fi transformat intr-unul iterativ sa se faca apel la cel din urma .