Sunteți pe pagina 1din 4

Universitatea Al.I.

Cuza Iasi Facultatea de Informatic Grupa(1-10):

Nume: Facultatea:

Sectia:

Anul:

Programare I Test scris


17.02.04
Observaii: 1. Nu este permis consultarea bibliografiei. 2. Toate ntrebrile sunt obligatorii. 3. Fiecare ntrebare este notat cu 3 puncte. Repartiia punctelor la ntrebrile gril este: 1 punct alegerea corect a variantei, 2 puncte justificarea. Alegerea corect se puncteaz numai dac justificarea este total sau parial corect. 4. Nu este permis utilizarea de foi suplimentare. 1. #include <stdio.h> Programul alturat va afia: int main (void) { a. 2.000000; double x; b. 3.000000; int a = 7, b = 3; c. 2.333333; x = (int)1.5L * (double)(a/b); d. 3.500000 printf("%lf\n", x); } Justificare. a si b sunt de tip int, deci rezultatul evalurii expresiei a/b va fi intregul 2, rezultat care va fi convertit apoi in double. De asemenea, constanta 1.5 va fi convertita in int, rezultul conversiei fiind 1. In concluzie, programul va afisa 2.000000.

2. #include <stdio.h> Care este rezultatul execuiei codului #define n 24 alturat: void main() a. 048 { b. 0048 int x; c. 084 for( x = 0; x < n; x += 4 ) d. 008 { switch(x) { case 0: printf( "%d", x ); case 8: printf( "%d", x ); default: break; case n%5: printf( "%d", x ); } } } Justificare. for-ul va avea 6 iteratii: x=0,4,8,12,16,20. Pentru x=0: se afieaz 0(case 0) se afieaz 0(case 8), deoarece lipseste break pentru prima etichet case. execuia switch-ului se opreste datorita break-ului de la eticheta default Pentru x=4: se afieaz 4(case n%5) Pentru x=8 se afieaz 8(case 8) Pentru x=12,16,20 nu se afieaz nimic. 3. int f(char* s) { char *q = s;

Ce se poate spune despre funcia alturat: a) ntoarce (lungimea irului de caractere s + 1) b) va da erori la compilare

while (*++q != '\0') ; return(q-s);

c) intoarce totdeauna lungimea sirului de caractere s d) sunt cazuri cnd valoarea returnat este impredictibil

} Justificare. Iniial, q=s. La fiecare iteratie a buclei while, variabila q se mareste cu sizeof(char). Executia while-ului este oprita atunci cand q pointeaza la \0. Functia returneaza diferenta dintre cele doua adrese q si s, diferenta egala cu lungimea sirului s. Exist totui situaii cand rezultatul execuiei este impredictibil. O asemenea situaie are loc atunci cand iniial s==NULL. Astfel preincrementarea lui q duce la comportament impredictibil al programului. O alt situaie de excepie este atunci cnd iniial s=\0.

3. #include <stdio.h> Care este rezultatul execuiei codului alturat: main(){ a) 0 int i[]={4,3,2,1,0,-1}, *ptr, x=1; b) 24 ptr = i; c) 24 while ( *ptr ) x *= *(ptr++); d) 12 printf("%d", x); } Justificare. Este declarat si iniializat un tablou de intregi i. Pointerul ptr este initializat cu adresa primului element al tabloului i. Bucla while se executa att timp ct coninutul adresei referite de ptr (*ptr) este nenul. Astfel, ptr itereaz peste elementele tabloului i, si se calculeaz n variabila x produsul elementelor tabloului pn la ntlnirea primului element 0. Deci x=4*3*2=24 4. #include <stdio.h> Care este rezultatul execuiei codului alturat: a) 3; -3; -10 b) 3; 3; -6 c) 3; -3; -6 d) nedeterminat

int f(int a, int b) { if (a == 0) return b - 2; else if (b == 0) return a - 2; else if (a < 0 && b < 0) return f(a + 1, b + 1) - 2; else if (a > 0 && b > 0) return f(a - 1, b - 1) + 2; else if (a < 0) return f(a + 1, b - 1); else return f(a - 1, b + 1); } int main(void) { printf("%d; %d; %d\n", f(2, 3), f(-3, 2), f(-2, -2)); } Justificare. Programul calculeaz rezultatele execuiei apelurilor funiei f: f(2,3)=f(1,2)+2=(f(0,1)+2)+2=(1-2)+2+2=3 f(-3,2)=f(-2,1)=f(-1,0)=-1-2=-3 f(-2,-2)=f(-1,-1)-2=(f(0,0)-2)-2=(-2-2)-2=-6 Observaie. Funcia f(a,b) returneaz intotdeauna a+b-2 5. #include <stdio.h> typedef unsigned int uint; void process(uint *a, uint x, uint y, uint z) { uint m1 = 0x7; uint m2 = 0xF8; uint m3 = 0x1F00; (*a) = (m1 & x) | (m2 & (y << 3));

Care este rezultatul execuiei codului alturat: a) 785 b) 6 c) 83 d) 123

(*a) = (*a) | (m3 & (z << 8)); } void main(){ uint b; process(&b, 1, 2, 3); printf("%d\n", b); } Justificare. m1=00000000 00000111 m2=00000000 11111000 m3=00011111 00000000 m1 & 1=00000000 00000001 2<<3=00000000 00010000 m2&(2<<3)=00000000 00010000 (*a)=00000000 00010001 3<<8=00000011 00000000 m3&(3<<8)=00000011 00000000 (*a)=00000011 00010000(2)=...=785(10) Valoarea variabilei b dupa executia functiei este 785, care este si afisata. 6. S se scrie ce afieaz urmtorul program atunci cnd este executat. Justificare. void main(){ #include <stdio.h> struct Punct p = {3, 5}; struct Punct { printf("(%f, %f)\n", p); double x, y; f(&p); }; printf("(%f, %f)\n", p); void f(struct Punct * pp) { g(&p); pp->x = - pp->x; printf("(%f, %f)\n", p); } f(&p); void g(struct Punct * pp) { printf("(%f, %f)\n", p); pp->y = - pp->y; } } Rspuns. Funciile f i g au ca argument adresa unei structuri Punct i au ca efect negarea datelor x, respectiv y, modificare care se pstreaz i dup terminarea execuiei funciilor(datorit transmiterii parametrilor prin adres). Prin urmare, cele patru printf-uri vor afia: (3,5) (-3,5) (-3,-5) (3,-5) 7. Se d programul de mai jos care la execuie d urmtoarea ieire: Afisare tablou : 0 1 2 3 Afisare tablou : 0 1 2 3 4 5 6 7 maresteDim(&tab, df, &dr, pas); int main() { df += pas; int df=4, dr=6, pas = 4, i; for(i=df-pas;i<df;i++) int* tab; tab[i] = i; tab = (int*)malloc(dr*sizeof(int)); printf("\n Afisare tablou :"); for(i=0;i<df;i++) for(i=0;i<df;i++) tab[i] = i; printf(" %d", tab[i]); printf("\n Afisare tablou :"); free(tab); for(i=0;i<df;i++) } printf(" %d", tab[i]); Se cere s se implementeze funcia maresteDim(), inndu-se cont de urmtoarele observaii: tab este un tablou unidimensional de numere ntregi alocat dinamic; df numarul de elemente folosite in tablou; dr numarul de elemente alocate pentrul tabloul tab; pas cu ct se va mari tabloul; - funcia va servi la redimensionarea unui tablou de numere ntregi astfel nct s nu se altereze elementele tabloului; - pas se presupune a fi un numar strict pozitiv;

- se presupune ca exist memorie suficient pentru mrirea tabloului. Rspuns: //prototipul functiei void maresteDim(int**,int,int*,int); //... //definitia void maresteDim(int **ptab, int df, int* dr, int pas){ int *temp,i; *dr=*dr+pas; temp=(int*)malloc((*dr)*sizeof(int)); for(i=0;i<df;i++) *(temp+i)=*(*ptab+i); free(*ptab); *ptab=temp; }

9-10. S se scrie un program care determin de cte ori apar primele cinci litere din alfabet ntr-un fiier. Nu se face distinie ntre literele mari i cele mici. Rspunsul se va scrie pe urmtoarea foaie.
#include <stdio.h> #include <ctype.h> int main(){ int contor[]={0,0,0,0,0}; char c; int i; FILE *f; f=fopen("input.txt","r"); if(!f) { printf("Nu a fost deschis"); return 1; } while((c=getc(f))!=EOF){ c=toupper(c); if(c>='A' && c<='E') contor[c-'A']++; } for(i=0;i<5;i++) if(contor[i]) printf("Litera %c apare de %d ori\n",'A'+i,contor[i]); return 0;