Sunteți pe pagina 1din 19
e 7 Functii g | rest grila _Dorolyape Precizati care dintre urmatoarele lini de program reprezinta corect, din Punet de vedere sintactic, lista de parametti i valoarea retumata de o functie cy fumele test, dacd cerem ca parametrii formals fie dou’ variable de tip intreg, *.¥ $i 0 variabilé de tip real z, si s& returneze un rezultat intreg. 9) int test (int x,y,float 2) 4) int test (int x,y/float 2) © int test (int x,int y,float 2) @ test (int x;int y:float 2) int €) test (int x,int y,float 2) int —G_Solutie Limbajul C++ permite definivea unui singur tip de module, si anume functile (spre deosebire, de exemplu, de limbajul Pascal care cunoaste functi si procedu). Programul principal est a randul sau o functe avand numele main, iy C+* nu este obligatoriu ca declararea unei functil $8 fe Insotité de specifcarea ‘Modului sau de actiune (corpul functie). O declaratie neinsoité de corpul functiei Poarta numele de prototp $i este, in reaitate, o deciaratie similara oricdrui at tip Ge date. Existé mici diferente intre sintaxa unei declarabii de functie atunci cénd aceasta este insofits de compul functiei gi prototipul functiei. Pentru a face o istincfieIntre cele doua situali vom numi antet de functe dectaratia une functi in situatla in care aceasta este Insolité de corpul functiel. Despre prototip vom discuta in contextu soluie! problemel RVILB. ‘Sintaxa unui antet de functie este: ( , ,.. ~~ _ — tipul valorilretumate de catre functie; ~~ —> numele functiei; ~~ Spar_1>,,.. . -> parametriiformali ai functiei; ~ ,,... — tipurile de date c&rora le apartin parametri; Conforma cu aceasta sintax este declarajia de la ¢). In Prezentém, pe sourt, erotile existent in ceelate variane: sso codan cat patie dc sce eee Ista bepomrdeinepuananr n° 7 MA econ scsi Vlue peu infag hanes ace, he ip np, von Contine acelagi seperatorincorect";"intantgila b). ‘R8spuns corect: ¢), © intr afirmatile de mai jos sunt adevarate? 2) Le ape une furcti, s produce inlociea paramettlr formal cu parame actual ‘) TTipul parametilor dati la apelul unel functi trebuie 88 coincida sau s8 fe compatibil cu tipul celor defini in antetul functi ©) ‘a apelul unei functi, se salveaza pe stva adresa de revenie, precum §1 Variabilele locale si parametni modulului apelat. 4) Orie functie trebuie sab Tntotdeauna cel putin un parametru ) Nici una cintre afirmaile de mai sus. —Gl_Solutie ‘Vom analiza pe rand cele patru afirmati: 2) ADEVARATA. Parametrii formali sunt identiicatorii defini in antetul functiei, iar parametrii actuali sunt variabile sau valori concrete care se transmit Parametrilor formali la apelu functiei. Intr-adevar, la apel se inlocuiesc parametri formali(identificator) cu parametrit actual (valori sau variabile). Rezulté cu caritate a valorile parametrior actual trebuie sa fie de acelagi tip sau de un tip compatiil Cu tipul parametrior formal. Prin tio compatibil se injelege, evident, orice situate in Care imbejul face 0 conversie implicit a valorilor )_ADEVARATA Pentru ca s8 ne convingem, presupunem ci avem functia cu antetul {int £(int a, int b)}. Apelul £(3, eroare, deoarece al doilea parametru actual este de tipul “sir ("134"), in vreme ce ambii parametri formali sunt de tipul int. Cum nu existd o Conversie implicit de la sr de caractre la inreg,apelul se va solda cu 0 eroare. ©) FALSA. La apelul_unei functi se salveaz’ pe stiva contextul ‘subprogramului apelant (care apeleaza) gi nu apelat.De asemenea, se depune pe siva adresa de revenir care indica linia de program imediat urmatoare celei care a facut apelul, lini la care se va reveni in modulul apelant dupa executiafuncte. Contextul subprogramului apelant este format din varabiele sale locale gi parame transmis prin valoare. Nu se salveazd pe stva paremetritransmigi prin Feferintd. Dupa Incheierea executei subprograrhului apelat, se revine In modulul ‘pela, restaurdndurse in ordineinvers8 varie salvate pe stiva, 1B Scanned with CamScanner ©) FALSA. Exist gi functi int test() c int x5; return(2#x+1) 5 , void main() { 7 prints(md,tost (1) 7 ) bile’ x, def tr; ea opereaza asupra variabill x, dering Funda tast ru 6 Fat “yncia principal RAN. aE apeiy ee a a de c&rre functia test. lspunscorect: 2) A GREATS de valor care se genx In uma execu PrOgTaMU gy mal jos: include int i,3.%7 int test(int x, int y) { return (x-y) ) void calcul(int p, int 4) { int u,v uep-i) vegtd7 Setest (ug) 7 jatost (vp): , void maing Sn2; 503; ealeul (4,3) 7 Printe ("43d854",4,5) calcu} (3,4); Prints (iaetsa\nr 4,3) 7 14 23-34 ‘Trebuie remorcat foptul c& variable 4 i 3 sunt glbale (vazue” in tt vamul) inwreme ce variable u iv sunt locale furcie calcu (Vézite” dec in ot aout cae pot ransmigo in funcja test apa én calc) Tncepem cu funciia main, Aver ~2, 3=3 9 apelul ealeul (3,3), deci caicul (2,3). In urma apelului, se inlocuiesc ‘parametrii formali cu cei actual, Rezulti p> 24> 3. In functie avem: @ usped, ue2-2, ued: 4 vegts, v=3+3, v=6, detest (u,q): se face apelul test (0,3), lar valoarea retunata este memoratd In = apelul test (0,3): rezulld x -» 0, ¥ —> 3; functia returnear x-y, adicd -3, deci 1=-3: 4 analog j=test (v,p) = jntest (6,2): = apelul test (6,2): x -> 6,¥ -> 2, fetumeazd x-y, adicd 4 => 4, Sa Incheiat executia funciiei calcul gi se revine in ‘zai, [a linia urmatoare apelulu, unde Intalnim atigarea lui 3 913 Dec, primele valor afigate sunt ~3 $i 4 In mod similar, se executa apelul calcul (3,4) (cu noile valori 3=4 9 i=-3 1), la finele cdruia vom avea i=10, j=-3, Aceste valori se afigeazd imediat dupa revenirea in main, In concluzie, sil valoilor aigate este -3 4 10 -3 Réspuns corect: €) (Cate erori va produce executia programului urmator? Hanciudecstdio-h> Hineludecaath.h> Any aphouL fist Ry Smt sie ores) i HQ) void main() 4 printf ("td",caleul(1,2)); — // (1) ) a) Una 6) Dous Tei @ Pau =e) Niciuna vs Scanned with CamScanner 1 Solutio In functia main (linia (1)s : valoares return os arametilor formal CU Paramet in uma apetu, re toe Inloeue bred adicd 2, 4242... (inig Per ericrenpee terre nit (2)). Valoarea obtinuta este de tp real, versie implicité astfel i wv inca Vator returnate este ineg. In acest C32 21 Sina zecmalelo, adic 2 t functia va retuma valoarea itreaga rez ‘RASPUNS corect: @) apocars caren 82), 2 Nigg * actu CConsideram programul urmator: Hinelude int my void P (int ée) 1 ine by be3ém; onbt2) mtd: printé ("463") 7 (8) printe(nscated\n",b,c); 17 (6) , void main() t 93; P(e)? Q) (3); HQ) printe("86d"m) 7 11) prints ("¥6d¥5d",,e) 14) f Care dintre urma&toarele afirmatii sunt adevarate? 2) In cursul execu! primului ape al funciei P, cel din nia (1), 8 vor afiga, In cording, valorile 14, 9,14 (nile (5) si (6) ) ‘) Cele doua apeluri ale functeip, din nile (1) s(2), sunt corecte gi echivalente (produc acelagiefect n rice sitatio) ©) Unia (3) afgeazd valoarea 14 ©) Linia (4) afgeaza valor 9 si 16. ©) Lafiecare execute a functeiP, se saiveaz& pe stv valoarea lui. 176 ee a in antetul functie, (void P (int &c)}, se observa cd parametiu este referint’, cu ajutorul adresei de memmorie (reamintim: daca c este o ysis prin an | intreg, atunci &e reprezinta adresa de memorie la care se va variabild de tipul marl Te9) depune g ce modifics valoarea parametri in interior func, atun nous valoare Va fi "vazuta" ulterior gi In modulul apetant ‘Analizim pe rnd afimatile dat 3) Inlnia (1) aver {2e37, (=) }. Se inocuiesc parametri formal cu cei actual, Se vaInlocul mai nti c cum gi apoim cu 3. In corp functii avem: @) ba3tm = be3#3, bed ‘e=b#2 : aceasta instructiune se va executa de fapt sub forma m=b+2, Inirucét parametrul formal e este Inlocuit cu parametrul actual min tot ‘corpul functei! Rezuita m=9+2, 2012, 2 ted. memt3 = mel143, nels, Linite (5) si (6) din corpul functeiafigeaza valorile pe care le au in acest moment variable a, b sic, Acestea sunt In ordine 24, 9, 14 (repetam feptul ca, in functie,¢ Inseamnd tot m |). Agadar, airmatia a) este adevérata ) La prima vedere, e totuna dacd scriem {m=3: P(m) ;) sau direct {B(3)). Daca parametrul ar fi fost transmis prin valoare, nu ar fi existat nici 0 iferenta intre cele dou apelur. Ins& parametrul formal c este dat prin sinonimie, deci parametrul actual trebuie s& fie tot 0 variabila, nu o constanta! In concluzie ‘apelul P(3) va genera eroare, deci afirmatia este falsd ©) Linia (3). afigeaza valoarea variable! m dup revenirea din apelul funciei P. Dar m a fost parametrul actual dat prin refernta, deci modificarea valor sale In functe este receptionaté gi acum, dupa revenirea din functie. In functe s-a obtinut m=24 (vezi afrmatia a) ), deci aceasta este valoarea pe care 0 afigeaza lina (3) (valoarea inijal8 a variabilei =, adica 3, "s-2 pierdut’). In concluzie, afirmatia este adevarata @) Linia (4) este eronata. Valorile variabilelor b gic, pe care trebuie si le afigeze, nu sunt cunoscute in acel moment: = variabila b este locala functiei P, deci valoarea ei "se pierde" dupa revenirea in main; =e nueste altceva decat un parametru formal transmis prin referint@, deci nu este vazut ca variabila la nivelul lui main (Ia apel, c este Inlocuit cu parametrul actual m, deci nicdieri nu exista vreo valoare pentru e). €) Alirmatia este falsé. Dintre parametii unei functi, se salveaza pe stiva ‘numai cei transmisi prin valoare, lar in cazul nostru e a fost transmis prin referinta. ‘Réspuns corect: a) si C). 7 Scanned with CamScanner Hor? Ce valor vais program ums Hinclude int nny void Tint n, int 6) ots = Fone): ences Seas: wel0, we20s Fiatay omat cen <* 1 6) 4,5,32,20 6) 2,4,10,19 2) 4,4,12,19 , €) 7,2,22/30 @) 2,5,10,20 2) Solutie Functia © primeste doi parametr: n prin valoare si m prin referint8. Primut apel t(a,2) inseama (2,8). In funcfe se inlocuiese parametrii formal cu cai ‘actual: n»2, m-95, Executiafuncfiei conduce 4 nfe2 a nent2ezt2ed gi ae- SmearIsSe1nd, ‘Dupa revenirea din functe se afigeazt n gi, dar: — modificarea lui n In functie “sa pierdut’, deoarece n a fost transmis prin valoare. Agadar, instructiunea {cout << n <<" ";} afigeazd Valoarea lui n anterioard apeluli, adic€ 2; = In schimb, instructiunea {cout << m << " "2} afigeaz® noua Valoare a lui m, rezultaté in timpul executiel functiel, adica 4, intrucdt Parametrul m a fost transmis prin refering’. Analog, dupé cel deal d 2, Valorie ee get doles ape B(0,m), acd 7(10,20), se vor aga i ‘Raspuns corect: ¢). precizal ce 62 va afiga In urma execute! programulu de mai jos: pinclude ant v(2)7 ant 47 void test (int x{J,int k) G x(k]=0: ) void main() i v(O}=ts vit}=: for (490; ice: 4 test (v4): printé("s2dt2d", v(0] ,v1]) + , d int) 40200 H)0212 1210 G1ziz2 et222 GL _Solutie Cictul (for (480; cet; it+)} are doi pay Contorul + are valoarea inijald 0, ciclul se executd atita timp cat i<=1 9 la fiecare nou pas valoarea lui $ ‘reste cu 1. In concluzie, variabila 4 ia pe rand valorile 0 i 1. Pentru fiecare dintre aceste valor ale lui 4, se executd apelul funcjiei test (v,), tar la revenirea din acesta se afigeaza elementele v [0] gi v{2] ale vectoruui. Inpal, v(Ol=2 9 v(t}=2 Reamintim: Numele unui tablou reprezinta adresa de memorie a primului ‘su element, insd, 0 declaratie de forma {int {J} reprezinta un pointer catre Intreg. Astfe, in cazul in care parametrul actual este numele unui tablou In limbajut C++, se realizeaza in realitate un apel prin referintS. Asttel,functia apelata dispune de adresa de inceput a tabloului utlizat ca parametru. Vom spune ca vectorul a fost transmis ca parametru prin referinta. Astfel, daca in corpul functie! se modified valorile elementelor vectorulu, atunci noile elemente vor fi "azute" gi in modulul ‘apelant, dupa revenirea In acesta. Descrierea algoritmului: Pasul 1, pentru im Se executa test(v,i), adicd test(v,0). Se inlocuiesc parametri formali cu cei actual, deci x > v gik > 0. Astfel, prin atribuirea x{k}=0 se va 179 Scanned with CamScanner (0) + 8218 prim, fu $0 pierde 0 data cy 7 wectorul este Un ye2, valor! Care sunt {ace de fapt v{0}=0. Agadar,intimpul execute ‘pas, In corpul functe! ee modficd valoarea Mt “leet Modificarea pe care 6 sufento v1) fevenirea In main, deoarece, a9 cu OT NT yyy poramet dat pn retenn, Agar. oven 10) ‘afigate la fnele primul pas Pasul 2, peniry 43: Se executd test (v, xfk}=0 > yit]=0 vem vo)e0 ¥{31%0, vl care sunt iate upd revenirea inmain, ‘RASpUNS corect: a), 4 Anciude ant m7 1, asicd tant (v3) 2% 7 vgik od ant test(int,int) void main () 4 a2: Sout << test(xxe3)/ // (1) out << x7 an ) int test(int a, int b) ‘ Ant xeaeb; for (sel; icex:it+) if (ia 66 ic) return i? return 0; ) Precizat care dintre afirmatile de mai jos sunt adevarate: 2) Instrucjunea (I) afigeazd valoarea 3 2 lamers (1) aon vores 7 ‘unctia test returneazé 0, indiferent care ar fi parametrii actuali dati la apel. Copa tcl a exec, dvrece cri coins rete ©) Programul este eronat, decarece variabila x a fost declarata de doua ori 180 «© _bl_Solutte In program exists doud declaatale variable a: la inceput programuka te decarh 0 varia gibald x. ir In furcha teat se decay o varias call x ‘Reost tapt nu constiue 0 ero: tapt me errata focal x este visialé in functia twat in care a fost dectarata lar in tot restul programilul este cunoscutd variatita global x ‘Agadar, afirmata e) esto fais Funct test conjne dou insets return Nel acest wery my serotrtss won, Exeter ia renea prime natty reece Sin ceh for dn meron funcbl ato vlowe 8 he 1 care cetar pe condia dn nv 1. ot una va eta ace Dac ru ensta Indep ei eure func va tntaree ©. ar Inc un Gaz va retura a doen care a parame actus da 19 apa Armatilec) wd) tose bc ‘Mal trebuie observat faptul cd functia test este scrisd dupa functa principala sain, de! ete opiath cr ain E post oye cova ? Os, pnt cia stl rogram gsm prottpul unc! east. Acesta ext ne tase nt sn) Observati cd prototipul este foarte avemsndtor cu antetul func), doar ci ‘se Incheie cu caracterul “;", ar Intre patanteze sau enumerat doar pune parametnior, nu gi numele acestora. Trebule mentionat c& rar fi greyt daca am fene § numele parametrior, dar © inutl Aqadar, un prototip corect este i vurmatorul: int tost(int a, int b) Pentru a stabil vaioarea de adeviy a afirmatiior a) 0) analizam functionarea programulu, Functia main Incepe prin atribuiea x2 Este vorba, fireste, despre variabila giobald x, definta la Inceputul programulus. Apoi. urmeazd apelul test (x,x+3), adic’ test (2,5) In functia test avem: = 092,bo8; — Infunctie se declara o vaniabilé locald cu numete tot x = xnatb => 5-7; de aceastd data se atribuie ui x vaicarea 7. = Inciclul £or, contorul 4 va lua pe rand valonie ,2,....6 Prima valoare a lui 4 care Indeplineyte condi “>a 66 1<>" din linia 4€, este 4=3, pentru care se executd "return 1” Aqadar, functa test Intoarce valoarea 3. Se revine in main, unde se afigeaza aceasta vaioare ‘eturata. Deci afrmatia a) este adevarata In main urmeaza instructiunea “cout << x”. Care valoare a lui x 9¢ va afiga 7 Cea globala (2), sau cea locald (7) ? Firegte cd cea giobald, decarece Variablla locala functjel test, x nu este recunoscuta in funcha main. Ayadar, atirmatja 6) este fais ‘Raspuns corect: 18h Scanned with CamScanner osoce ce valor va isa, #872 include int £(int a=1, int be2, int o=3){ return atbe void main()( int mn,p,q7 mef(); ns£(10); pe£ (12,19) 7 rE (11,23, 18) ; printé("\ntsdesdiSdé5d",m,0/P,9) 7) d Precizati valoarea de adevar a urmatoarelor afirmatii: a) Toate apelurile functiei sunt eronate. 14) Singurul ape! corect al functiei este ultimul, iar valoarea lui q va fi 52. ‘@)_ Singurul apel corect al functiei este primul, iar valoarea lui m va fi 6 ) Toate apelurile sunt corecte gi toate variabilele m, n, p, q vor avea valoarea 6. @) Toate apelurile sunt corecte, iar valorile variabilelor m, n, p, q Vor fim=6, n=15, p=34, q=52. ©) Solutio Reamintim faptul c8, tn uma unui apel al unel func, se inloculese parametri formali (ce! definia declararea functie), cu parametni actual (cei dat fa apetul func Funclia £ are trei parame, tot de tipul int, intalizai la declarare (in antetlfunctié), cu Valorie a=t, b=2, om3 Aceasta Inseamnd €& la apelu functei poate sa lipseasca unul sau mai ‘multi parametri actual (Sau chiar tti 1), In cazul in care la apel lipseste un parametru actual, compilatorl va fos! in functe valoarea cu care fost iniializat fa declarare parametrul formal sferent. Din considerentul de mai sus, puter afirma c& toate apelutile sunt corecte $8 le analizdm pe rand: 183 Scanned with CamScanner j col trel paramety, + Primul apel m0: 1g apo, desi Pe tararea uncle any Lipsese tot parameti actual la APP iyaizal Gc 34243, adica vor folosi in functie valorile oe cexpresi@l at 2, on3, Funetia va retura valent’ PEE Vaorea retrace atu vaioba' 92 ‘ bichea boi eam): " Este prezent ea on ea parameta formal 3 sca ‘a declrrea func (ant) 2 PEE acu, car 58 mOCHEr Poamet in absent celal do parma lone cu care au (08 Ml alizab forma, comlatr va f805 00a unio oe cla deciararea functiei. ee 15: Renu 15, « Altrellea apel,£02,29)? scruali, care vor inlocui primi qoj ret se Sunt prezen doar dl eran oe parame foal = > Pei "Ser acum a2, BAD 8 €=3, func care a fost initializat. In retuma 12+19+3, adicd 34, deci P=54 0, care va SUbstitul prim, 132 fost initalizat parametny ‘© Utimul apel, qnf (24/23/28)> rnoti formal Vor primi valor tri actual, deci tot} Pa Poi (tra ete on ee a fot ina). Asater =, ed ¢i 0-28, funcjia reumeaza NAZI 18, a iar valorile objinute au fost mag, in , Cel el5, pa34, 52. spans covet: e), ‘Se considera programul urmator: int £0 ‘ ‘static int art; return att; ) void main() { int a; mee (£0); cout < ) In.urma executei programului,variabila m va avea valoarea: a0 w2 3 gs as 184 _G1_solutie Col mai important aspect al acestei probleme este atrbutul static ce inscjeste declaraa variablei locale a, In iba Cer, variable. sunt vrmpeteizate de dou atibute: localzara @ duratd do vi in med obignut. 0 caraiys ocala Inceteazd $8 existe la reveniea din apeul func in care a fost Yectarata. Un alt ape va ‘nagte”o noua variabill, desigur cu acelasi nume dar fara orto logaturé cu valoarea avutdint-un ape anterior. Aributul state d8 vials Tics de moarte’, adc, desi variabila nu este recunoscut In afarafuncy, ea nu re o datd CU revenirea dintr-un apel, Cu alte cuvinte, apeluri succesive vor Tegds care, valoarea lasaté de apelul anterior Infunctie, in inia (retucn a++;}, operatorul de incrementare "++" apace In forms postfixatd. Aceasta inseamna 8: = mai Inti este returnata valoarea curenta a ll a = _ apoi este incrementata variabila a cu 3. Linia de program (mat ()+£{) } realizeaza doud apeluri succesive ale {unctel€, Insumeaza valorile returate i apo atribuie rezuitatl variable = Descrerea functions programulul pas cu pas: ‘© Executia primului apel £¢): ef = retumeazé a, deci returneaza 3; - incrementeazé a= azatt, am2 + Executia celui de-al doilea apel £ (): = Valoarea incrementaté a=2 este recuperata la acest al doilea apel, deoarew: variabila a a fost dectaraté static = retumeaza a, deci returneaza 2; = incrementeaza a= anatt, a=3 + Executiainstructiunii jms () +2) 7 = mel42 (suma valotilorretumate in uma celor doud apelu) = m3. ‘Réspuns corect: ¢). Ce valor evr aga numa execu program uma? 1 snctade cataio.t> ne eatint +p) a return 1; ? 185 Scanned with CamScanner int *£2(int *q) ( int m£1(q) return én; y void main () ni ine sy yovee (en): Brinte(n\atd 84/503) 7 ? i precouaa Gat B) OAR RAD MAP oS) Bata am —@_solutie ungia¢1 ev ane! “int *(6x)=43 > x=43 (+p reprezintd variabila referité de pointerulp, si cum p contine referinta c&tre (adresa lui) x rezulté c& ‘tp vat chiar x); = return 1 = functia £1 retumeazd 1, se revine in modulu! apelant £2, unde valoarea returnatd de catre £1 este atribuitS lui m. Rezultd m1, ‘Dupl incheierea execute funcii £2, continus executia moduluui apetant 2 euinsiuciunea return tx. Agoda, funda £2 varturna adreso varibiel m 2.cuinsM™incheie si executia funclie £2, revenindu-se In main, Instrucjunea rea geclangatapeluie a fost "y=*2 (6x)". Am spus mat Inante ca +42 (ex) care @ Wig valoarea memoraté la adresa returnatd de catre £2, adica valoarea lu renrerrgoci, Yom avea y=} pe de alta parte, am dedus ca variabila x primeste valoarea 43 in functia seoastd valoare nu se mai modficd ulterior. Agadar, programul afgeaza ‘ ile x=43 Si ved. baer ‘Réspuns corect: e), ‘Considerém urmatorul program: #include #include int * F(int taint *b) { return (#a>=¢b) 2 y void main () ( int tx, ty: x= (int) malloc sizeof (ant); // (1) y=(ant*)malioc (aizeot (int); // (2) scanf ("td %d",x,y); 1) printé("ed",*F(x,y)) 7 Ha) ‘free (x); (8) free(y): 11(6) » in impul executici programului sunt posibile urmatoarele situati: 42) Functia nu returneaza corectvaloarea dost, deoarecetipul valor retumate nu este cel defini in antetlfunctii. {) Inlocu tinitoc (1) (2), pentu alocarea dinamica a memorei putem serie s-y= (int!) malloc (sizeof (ant)) 7 )_In{ocultinitor (5) (6), pentru eliberarea memorieialocate putem scrie free(x,y) 7 @) Instruciunea scanf din linia (3) este eronattcorect_ era scant ("4d éx, 6y), deoarece nunele varabilelor cite trebule precedat in ‘scan£ de operatorul "6" e) Programul este in totalitate corect, el afigand astfel maximul a doud numere Intregi definite cu ajutorul pointerilor x gi y. 187 Scanned with CamScanner —W Solutio fectcel + PGnt ) a) Analizam functia F cu antetul oe fb, etumand 10 Un Pointe, primeste ca parameti doi pine cite IPED, maa sunt de UPL Ene), 5 catre un Inte (atat parame eat $i valOR°8 T's ceuen (ta>=*b) 2a, vvedem daca expresia returnata prin linia de prog’ este de tipul int precizat in antetul eine care se traduce astiel: nat = neaz contr func ru trig une Veo fy doe a gv amt pani cae ve etn Yor Reaminin: Soca» for noe, Spun 8 PIN lord, Fee ere ne efor neg ee a a dts ; atribuire, icin vedio con 92 ore" ortega iy sont pote mel ada st dependent de COMMU Peel, ‘a gib, la momentul apli ii operatorului *. In exresa conajonala ce mal sus, ae compar nea si *b, iy pots ru cum * este Sa ny arsipanten, ete ei (0 620 func retumesss on” Bao, func marce un pointer ce ing, acca ¢ re go apul ane, aga cum a fost precizat In anttul func. Afrmatia 2) este a ste corect, runt s-y-(int*)maltoc(sizeot ant)? a mares sa cae th = Gry se refer’ la (adteseazé) exact aceeasi 208 de amon Nu este neobigeui ca doi pointer sé confind aceeasi valoare aga cum ny {ate neobignuit a, de exemplu, do Intregi s8 contind, ambi, valoarea 92. In Sita oss, m9 ey vor repeceta ext aces re, Vestagt act yaanineetet ata as elt a a aa eS eee an ee ate aeas eet ae = ©) Daca x 9 y at fi fost cous variatiledeclarate in mod obignuit, atunci int-adevar la ira lor ar fi rebut i fie scant ("8a", éx, &y). De ce ? Pentru la ciieaflecdrel variable cu functia scant, trebuie sé. furnizém ca parametru actual o adresd. Dar, aga cum am vazut deja, asta inseamina fe 0 adresd explcits e forma ex, fie un pointer. Vectori intra in categoria adreselor explicite pentru cd rhumele proprizs reprints adresa primului element. In problema noastrd,x si sunt pointe, deci ~ parametii functel scant sunt pointer x si y c&tre variablele care se vor cit 188 = variabilele ale cdror valoti se vor citi sunt *x $i *y (dol intregi. ‘Astfel, linia (3) este corecté, dec! afirmatia o) este falsa 2). Din explcalile date la 2) relese claractiunea functe F: ea primeste poraret Ol pointer a gb, cde Integi a 9, respectv, wb, retundna un Pavargre maximul dine ei ate, ea nu retuneaza valoarea maxim! pole cle me etureaz® Un paler clre maxim, slunc cine ene axl ju-zis al celor dou’ numere intregi ? Prin analogie cu perechea “pointer x «» prio adresate *x", aver gi perechea (F <> *F), deci maximul este +P! in aceste circumstante, linia {print £ ("#d",*F(x,¥)) 2] este corecta 50 apeleazé funclia F cu parametri actuali pointerii x iy (care vor icc 5° ret formal, pointei a gb), afgandu-se maximul # (x,y). Nu ar fi fost Gerect apelul (printé ("ta", F(x,y)) 2}, pentru C8 astfel s-ar fi afigat direct coSsrea retumeta, adica pointerul cdtre maxim, iar noi dorm 8 se afgeze J celor doud numere | maximu ose) Ce valoare se va afiga in urma executiei programului de mai jos, daca de {a tastaturd se citesc valorile a7 si b=6 7 Dar pentru a=2 gi b=8 7 include #include float ma(int x, int y) t return (x+y) /2.; , float mg(int x, int y) { rates eaetcxt void calcul (int x,int y,float (#F) (int,int)) ‘ cout << Flx,y); d void main() { int a, b; cin >> a >> b; A€ (a>=b) calcul (a,b,ma) ; ‘else if ((a>0)66(b>0)) calcul (a,b,mg) ) 189 Scanned with CamScanner a) 6.5, respectiv, 4 ©) 6.5, respectiv, 6.5 €) Nici una dintre variantele anteroar®, —G2_Solutie program. fancied 208 OT etd intogi Pent ner om ane 2) net ani (rotaen ey er air artmetcs. 862 lu de a 0 conver (ey) /2. 7): punctul zecima atapat Onsale Yt ace impartites cu virgug la valoarea flotant echivaens 2.0. Avena "on rezuitat Se il Htoat th = ’ rea intreag aul ecmall y 2 peal fotze “y la 2, deoarece x gi y sunt inregi ! xpint_y)} Primeste gi €8 C8 Parametti do} sy et stoped ope valence tie introglx sly medi postive). eateot tint x int y-float, (8) (406 /498))) are un seit ora a doa Primi doi [aceth er oe = Altslea param #F) (Ant, int), 1 paromat, leat (0) Gi cic pronto punt. Nuete noosa 8g preezeze numeleacestorparamet i doar tp lO din corpu functietafigeaz8 valoarea Insirctiunea (cout. << F(x,¥):) din corp irtoared Je fore numale fone F este dat 3 parametr,prinintermediy| (reer Be De: rate dn main: calcu (0,b/=8), respect, calcul (e,b 3g). La ape, ol tela paramet este Infocuit cu numele nel fungi ma, respec, g. Acest func a fost srse anterior. ret, exeeuia programuli se produce astfe!: | SOS SRI EE atera gs = dacd a>=b,atunci se apeleazé caleut (a,b/ma); in caz contrer, dach a si b sunt pozitive, se apeleaza calcul (a, by) Ce se va Int&mpla dacd se citese valorile a7 $i b=6 ? Intrucat a>=b, va uma apelul calcul (a,b,ma). Paremetil formali vor fi inlocuiti cu parameti ‘actual: x-ra, yb gi F-oma, Asadar, In loc de x vom avea 7, in loc de y vom avea 6, lar identificatorul F este Inlocuit cu ma. Astfl, instrucjiunea (cout << (x,y) ) din compu funcfiel ealeul se traduce prin {cout << ma(7,6) }. ‘Adic8 se apeleazs funcfia ma cu parametii actuali 7 si 6, afigindu-se valoarea fwuunata. De sc elo, uerule sunt simple: a execuja func ma ve foc I" je x->7, ¥-?6, functia retumeaz’ (746) /2., adicd 6.5, iar la tevenirea ia caleal se afigeaz’ valoarea 6.5, Executia este similar’ pentru a=2 si b=8. De aceasti data acb, deci in intocui in tuna an eva execlaraTua else, respect, apell calcu (a,b,ag). Uae 9 sain tf in funcja calcul se apeleaé mai departs func my La revene se g aloarea returnata de catre mg, in spet, media geometric’ a numerelor 2 3% eres = curate ie ‘bspunscorect: 2) (Ce valoare se va afiga In urma executiei programului urmtor? # include ant £(int ny...) Sse txeened, mex{0l, 43 for (inl ;im ? maxi] : moms return m; ) void main() ( cout << £(4,12,11,23,2) 7 ) yz bu ga we G1 _Solutie Functia £ are un numér neprecizat de parametri, aspect semnalat prin prezenta celor tei puncte dupa parametrul n in antetul functiei. Cu alte cuvinte, cexistA un singur parametru fix, n, pe lang care pot exista la apel oric&ti alti arametii. Accesarea parametrilor actuali In momentul apelului se bazeaz pe feptul c& parametrii se memoreaza la adrese consecutive de memorie. Astfel: = se pleaca de la adresa ultimului parametru fix, In cazul nostru én; = ent reprezinta adresa_urmatorului parametru, adica a primului arametru variabil, apoi sn+2 este adresa celui de-al doilea parametru variabil etc In felul acesta, valorile care vor apirea la epel dupa paramettificsi vor putea fi accesafiprntr-un calcul obignuit de adrese. €) antetul functiei este gresit 191 Scanned with CamScanner Primul parame In problema roast, apt este £(4,22-1L/23°2007 To any ‘actual, 4, este valoarea parametrli formal fix. AP! P= ae Sata adroaa ene ai aft acess 62°22, yg o8 ates nan g Uitandu-ne ins& cu atentie In este inept x Ast Patanet lui VE numele eae ale vectorului x, Tipe cde apart opay 22-21, 29,21 sunt tot ereeci ent cd nia ei te, Atriouires =! jresa element . Yo recunscut'CU USUI. Se _Listin inpemerat fo. eed for, eon tat oe exe ess ost ee a atl, omental x4) este mal Tr rea mom este una iva, eCeSaTE InTUCL ig contami valores = ee Te oe tems), Va dat sears poe conor porta Te ZI maxim dintre elementele vectorulu x Intunctia main se ipéregte acest maxim retumat de cBte £, dec valoareg afigata este 23. spans covet 6) ‘Deducet ce numere va afisa programul urmator, Hinelude int & £(int a, int by 1 cxatb; return ¢7 y int &c) void main () { Ant xe2, y=3, 2117 cout << £(x,¥,2) cout << 27 £(x,¥/2)=9; cout << y 511,5 O)5,1,9 J5,1111 g)5,11,9 6) 5,5,9 192 - Y _gy Solutio Inantetulfunctiel,"int 6 £(int a, Ant b, int 0)", pare cov fe ingeamna constructia "ee" ‘In general, 0 functie retumeaza o valoare gi nu un otiect Daca punem semnul "6" In fala numelu func, realizém 0 declaratie de sinanine “sean fatfel ca valoarea relumatd s8 fie depusd la o anumita adres In felul acesta Spel funclel va ctea chiar un obiectutliznd valoarea retumatd, moty pentu 200 apelul se poate face si In sténga operatoruli de atouie.Sincrimulinors je sd aibd sens In modulul apelant gi de aceea valoarea returnata tebue s3 Prin prisma aspectelor descrise mai sus, vom analiza In continuare Fatih ata stl ih vt oe transmis prin refernta. In parametrul e se memoreaza valoarea expresie\ ab, ago) funchia returneaza e Tn functia main au loc dou apelur £ (x,y, 2) Primul apel este unul obignuit: parametriiformali a, b, ¢ se inlocuiesc cu parametit actual x=2, y=3, 2=11, iar funciaretumneazd de faptvaloarea variabiet + egald cu xty, adica 5. Primele doud afigari produc urmStoarele rezuitate: > instructiunea "cout << £(x,y,2)" tipareste valoarea returnaté de ‘ate functie, ica 5; > instructunea "cout << 2" afgeaza valoarea variable. Aceasta este acum 5, $1 nu 12. De ce ? Variabilaz s-a modifica in functe, dar 2 fost transmis ca parametru prin referinta, deci nova valoare va fi "ize si dupa revenirea in modulul apetant main | AA doilea apel, “€(x,y,2)=9" apare In stanga operatorului de atribuire, {apt posibil datorita dectaratiel de sinonimie. Valoarea intoarsd de functje este chiar tun sinonim al variabilei z declaraté in modulul apelant, main, motv pentru care atribuitea {unctioneaza corect. Instruciunea In discutie se traduce prin “sinonim lui z, retumat de £(x,y,2), primeste valoarea 9°, deci ... = devine 9. Ultima instruciune de afigare va tipar valoarea 9. In conclzie, valotie agate au fost, in ortine, 5,5 ss ‘Rlspuns corect: €) 193, | Scanned with CamScanner (F reste geité propus ern STs memora maxim 25 ¢, PAIL, Se considera un vest» oe rimele mn clemens rumen, in are fos TO ne oc mt sto1.ett) oct (ude = yea vores ‘cu numétul su de caleul, care pi 2 elemente n gi nu retueazd ric. a) void caleul (int v[nl 25) 2) void caloul (int vi25),i96 ®) 6) void calcul (int vil ,int ») @) void calcul (int vt}/7) @) void calcul (int v/int =) unctie dano, de tipul vod (nu retureaza nimic), aa gencn t aa anea Fanci asl int la apels& dm ca parame ‘variabilele Intregi a, b $i c’ a) demo(int a, int by dnt a): 6) denotine 9, tnt bj inte); ©) demo(a,b,c) i d) demo (aibie) 7 @) demo(int a, b, oF .VIL3. Scriet o funcfe D care pimeste ca parametru un numa Intreg ‘i returneaz’ valoarea lui a+2. 4) ant D (int a) ( a imepuaemst | ne D tant De(at2); ) @ Ane D (int al | d) int D (int a) { ‘return (a*2] return a¢2; } y ) Niciuna dntre variantele anterioare. ae P.VILA, Care dintre afirmatile de mai jos sunt adevarate ? 2) Perametri defini In antetul une! functi se numese actualy, iar cei care par la apelul funcfel se numesc formali 0) Valoarea retumata de c&tre 0 functie poate fi transmis ca parametru altel func ©) Variabilele de tip tablou nu se pot transmite ca parametrifunctilor. 194 riabilele globale Sunt cunoscute pe tot parcursul programulu in care au a) atin toate module cre umeacd Sela care ou fot aaa «Sphere a P.VILS. Avantajele utilizar functor intr-un program sunt to obfine 0 economisie a spafiului de memorie rezervat vari 2) oben eal program a 1p) Oviezd mal mare in executa programa Posibiitatea dea executa de mai mute oi instrucfunilecuprns into func, Om program care conjnefunci poate fi urmart i corecat mai uz ict und intr aventajete de mai sus, ee .VIL.6. Deduceti sirul de valori care se afigeazd in urma execute! progeamulul urmtor. finclude Ant 8,f7 int sf (int a) t fa; return (at ) void main() ( fe10; sms£(£); print? ("¥6d86d", 9, £); E610; sxs£(10); staf (£) ; printé ("46d86d", 8,£) ; Fe; west (£); s3f(20) 5 printé ("t6d86d",5,£) 7 , a) 100,10,10000,10,10000,10 4) 100,0,100,0,100,0 @) 0,0,0,0,0,-30 d) 100,0,10000, 0,16960,0 2) 100,0,0,0,210000,-10 ee eee ee EE XIL7. Determinal valone pe care le af'geaza program de mal jos: #includecstdio.h> ant xv 195 Scanned with CamScanner int T(int m, int n) { mentx: nel; return (ntyta) : y void main() { y10; xel2: prince ("3d ")T(x/¥))? printe("e3de3d "/,¥) 7 , 43,2210.) 43,12,10. 6).47,20,22, @) 44,2244 6) 44,12,21 P.VILS. Fie program #includecstdio.h> ‘ate2; bes onatb; y void main() ( int x,y/2 x2; ya? Pixye); + pines ("e3de3de3a",x,y/8) > y Functia F primegte ca parametri trei numere intregi a, b si Cum trebuie scris. antetul complet al functiei, astfel inc&t programul sa afigeze, in ordine, valorle 4 477 4) void F (inta, intb, into) _b) void F (int a, int Gb, int éc) ©) void F (int 6a, intb, int éc) dj) void F (int éa, int b, int c) €) void F (int éa, int &b, int £0) ee 196 P.VIL9. Fie programele urmatoare: ramel PL AU Programnul P2 (iretude Pinclude void apel(int 6a, int én) void apel(int &m, int n) y porate realy ‘ ) Ue een wid mating y ‘ sea: SEIT, do { . while ( cond) aD ‘ seen yenarees | lapen (ey): iMeeae (coal Vs berritroney 7 ) ) Care dintre urmatoarele afirmati este adevarata? 2) In situatia tn care concitia (expresia logicd) cond este "y>0", programul Pi va intra int-un ciclu infinit +) Insituatia in care condita (expresia logicd) cond este "y<10", programul P2va afiga opt valor ¢) Daca inlocuim cond cu "y<=0" in ambele programe, ele vor deveni cechivalente (adicd vor produce aceleasirezultate). @) Dacd inlocuim cond cu "y<=0" In programul Pi, acesta va afiga valorile x=14 gives @) Daca inlocuim cond cu "y<5" in programul P2, acesta va afiga valorile x=24 gi v5, 1 P,VIL.20. Ce valoare trebuie citité in variabila m astfel, Incat_programul turmaitor 88 afigeze valoarea 4? include void F(int énr, int x) ‘ do { ex/2 }while (x50) 7 197 Scanned with CamScanner ) void main() ( int mn; scant ("td”, 6) 7 20; F(n,m): printé("id",n) ) ajiz O33 gu P.VELLi, Precizal, cre de tunel ‘numarul x este prim, respectiv, 0 In C3z Y Be pune =) 2 fae pint =) i ‘ int 4 int 4,0: for Ga2:icesit) For (anzsicxsit+) ie (x8i==0) AE (xtie=0) 807 return 07 else ok-17 return ok y , |9 Be print ») see eee Th q qi ' int 4; int iokets : for (i=2;i void main () t int vi201,i,n7 ealeul (v,2.5,10) ) 198 void caloul (int v{1, float x, int a) { ) Funcjia eau, find scr dupd main, are nevoie de un prcotp care trebui pasa ranta lu main, Cum poate arta acest prottip? g) void calcul (int v, float x, int a) void calcul (int vi], float x, int a) 3B void caleul (int, float, int); @ void caloul (int (J, float, int); @) void calcul (int +, float, int) 5 , P.VIL13. Deduceti ce valori va afiga, in ordine, programul urmitor? #include Ant ul5) ,v{5) -w{5],t(5) 47 void calcul (int tw, int *t) { for (in0;4<3;i44) { wit)=0; etJ=via}-wti) > ) ? void main () t for (ixt t uli]=2eint; v[ije3ei-2; w(A}eu(]+via}; t(4]=07 <3;i4+) y calcul (w/t) : for (i=0;i<3;it+) cout <<" " dnt ftint 965, int 22) Cees wrat2*btt? H void main) c cout < £007 VILA. Se considers urmatoru! program: ant (ant x, int x5) a static int me: esx: return way 72: , void main() int aber aee()7 be, EOE ) Care dinre cele rel apelur realizate in main sunt corecte? 42) Numai pimele dou apelu sunt corecte lar valrile vaiabilelor a gb vor fi a=], be8, 'b). Numai primele dou8 apeluri sunt corecte iar valle variabilelor a sib vor f ast, bend ‘o)_ Numa al dolleaapel este corect, sn urma execute li se va objine b=8, d) Numai al doilea apel este corect, si In urma executjei lui se va objine b=-1. @) Toate cele tei apeluri sunt corect. 200 re p.vEL.t6. Fle func F de mat jos: int + F (int a, int tb, int @) {ge ceastbte) /3: foturn €; ) Presupunem c& sunt dectarate urm&toarele variable: int *, *y, 2, *m, 47 Care dintre secventele de program de mai jos nu afigeaz’ corect valoarea retunaté de ctr func F? 2 2 2) oe (ued 44.94") X,Y, 62) 5 cin >> x >> ty >> 2 seemed ("Naa #82) 7 cout << *F(R,¥/2)7 gd Qe sete,y.2)7 Bet (x,y, 2) 7 cout << a cout int *intreg(float *P) return (int *)P/ y void main() t ant ny float ==-3.567 pevintreg (6x) 7 , a) ava avea valoarea ~3. ) n va avea valoarea ~6. F ©) mw va.avea In rici un caz valoile de la a) sau 6) @) va aves valoarea ~3.56. ) Programul confine erori de sintaxa. med P.VILA9. Ce valér se vor afiga In urma executiel programulul urmator? include int qi int *A(int *m, int tn) ‘ snetmtl; ometntl; 202 void B(int *p) ‘ ant yas yer (YP) y void main() t int y=9/x B(6x) cout << xo ce yF , 2) programulesteeronat 4) 0519 6) 510) 549) Ogio functle £1 gi £2 avand prototipuril void £1 (int (+p) (81) void £2(int pf4} (81); ‘Analizali corectitudinea apelurilor celor dou8 funefi In urmatorul program: void main() ( ant m{4] (81, (+a) [8] ,42[817 £1 (m); £2(m) 7 £1(q); £2(q) ; £12); £2(2)7 ) 4) Numai primele patru apelur sunt corecte. 5) Numai primele doua apeluri sunt corecte ) Numai primele dou’ apelur sunt gresite. @) Toate apelurile sunt gresite. <@) Toate apelurile sunt corecte. P.VIL21. Ce reprezintd declaratia urmatoare: ant *(#£) (int #*) 7 a) Este gresité sintactic. ‘6) Functie care primeste argument pointer la Intreg gi Intoarce pointer la Intreg ©) Pointer catre intreg. @) Pointer catre funciie care are argument pointer c&tre Intreg si Intoarce pointer ‘ctr intreg €) O altd semnificatie decat cele de la 6), c) si d). 203 Scanned with CamScanner P.VIL.22. Fie programuls Hincludeciostream.b> Ant plus (int x) 1 return xt+; ) int minus (int x) ane (9F2) (int) void test (int p,int q/int cert) (Ant) t o: Af (p 66 @) cout << Fl else cout << F2(@)7 , void main() iat an2,b05: ‘test (a,b plus,minus) | ‘test (3,0,pius sinus) : pias (a) minus (B))? pus (3) mines (0)) , cose poate spune despre apourilefuncek test realzate din main? determinand afigarea valotior 2, respectiy 2) Primele dou8 apelur sunt corece, ‘ar utmele dou8 sunt erate 2) Prime doud pel srt erect, determin afigarea valor 3, respect, -3, ja limete dou sunt ernat. g) Drirele ds ape ur covet, deterindnd afigarea valor 2, respect 2 iar primele dou sunt erat. ) Utimele dova apelu sunt caret, delerminand afgarea valor 3, respect, iar primete doud sunt erate €@) Toate cele patru ape sunt erate. SS AVIL23. Ce valoare se va aig in urma execute program urmator? # include int f(int m,...) { int tancntl, beat? 204 roturn nt (a+b) ; ) void main() 4 cout << £(3,2,11,5,8)7 ) g)2t 238 8) 30.) arte unc este gregt P.VII.24, Ce trebuie pus in locul secventei 00% atte inca programul de 10s 88 fumnizeze minimul unui numdr variabil de argumente, precizat la apel prin valoarea lui n? #includa double f(int n, 4 double min=* (double *) (én¢1) ; for(int isl;i Oe Oe char &£ (char *p,int n) { return *(pen};) void main() 205 Scanned with CamScanner py ranct 6) "abo Hinclude int *£(int én) ( return én: ) void main() ; qynaune ot Qi 6) Arline’ e greg 2) Ambele F.vIT27, Anaizat program de maijos preczai care dniveafimatile ate sunt ae int £1 (ant 6) q return el: ) ant *€2(int *P) t int and, 2) Inurma execute’ liniei £1 (b), valoarea variabilei b va fi 4. 2) Inurma execute’ tniei £1 (b)=5, valoarea variabilel b va fi 5. 206 4 sma eecutlil £2 (6), cae vant va 4, We eect it 23 tan) vanes rena toe eae cle wan hncte 21 one ne @) Mecariem in functia principalé main Neat prin nck un VI.28. Se dau urmatoarele programe {7s (1 seen 1 ey (ig (0296) return ana-32; Af (0296) retuen a32 d void saint) void main() i ‘nee metas char xe'x') filer! “ ’ ’ ‘Ategetirpunsunie corecto: .2)_-Ambele programe contin err ’D) Primul program este corect In final x va avea valoarea *x* @) Al dailea program este corect In final x va avea vaioarea *x @)Ambele programe fac acelag Iucru ‘e) Ambele programe sunt corecte, dar nu fac acolag cru VIL29. Precizati valoarea variabilei n rezultata In uma execute: Programul ant £(char a(2]) ( int iso; while (alit+]); return 4; void main() 1 ARE Bee (rabedee gh"); ao 2 os ) Programul are erori de sintaxa. SEER ny ) Corpul functiei contne © bucia infinite. 207 Scanned with CamScanner os Cap. VII. Functii VII.1.b)sic) VII.2.c) VIL3. c) si d) VII.4. b) sid) VIL5. a), c) sid) VIL6.e) VIL7.b) VIL8. c) VIL9.a),b) sie) VIL.L0. a), b), c) sid) VIL11.c) VIL42. 1) VIL13.b) VIL14, b) VIE.15.a) VII.16.¢) VIL17.b) VI0418.c) VIE49.b) VIL20.a) VIL21. d) ~~ VII.22. a) VIL.23.a) VIN.24.b) VII.25.b) VII.26. d) VII.27.a) VII.28.b) VII.29. c) Scanned with CamScanner

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