portofoliu probleme

43
Portofoliu probleme Probleme diverse 1. Enunt: Sa se determine valoarea numarului Pi din dezvoltarea in serie:Pi/4 = 1 - 1/3 + 1/5 - 1/7 + ... pentru n termeni. Pseudocod { int n,i, ; real Suma, pi, Termen ; Read n ; Suma ←0 ; Termen←1 ; Do_for i=1,n,1 Suma=Suma+Termen/(2*i-1) ; Termen=-Termen ; Enddo ; Pi←4*Suma ; Scrie 'Pi=", Pi; } Set de valori: Fie n=3. Pas 1)suma=0, termen=1.Pentru i=1 suma=0+1/2*1-1=1, termen=-1 Pas 2)suma=1, termen=-1.Pentru i=2, suma=1+(-1)/2*2-1=1-1/3=2/3, termen=1 Pas 3)suma=2/3, termen=1.Pentru i=3, suma=2/3+1/5=13/15 Pi=4*suma=4*13/15 Mod de retinere al algoritmului: Cunoscandu-se numarul de termeni, se va putea utiliza instructiunea de ciclare cu un numar cunoscut de pasi (FOR). Se observa ca semnul termenilor sumei alterneaza.La fiecare pas ii atribuim variabilei “termen”(pe care o initializam cu 1) opusul acesteia, dar numai dupa ce s-a efectuat suma. Codificare in C: #include <stdio.h> #include <stdlib.h> void main() { int n,i; float suma,pi,termen; printf("n="); scanf("%d",&n); suma=0;

Upload: cristina-isaila

Post on 27-Jun-2015

349 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Portofoliu probleme

Portofoliu probleme

Probleme diverse

1. Enunt: Sa se determine valoarea numarului Pi din dezvoltarea in serie:Pi/4 = 1 - 1/3 + 1/5 - 1/7 + ... pentru n termeni.Pseudocod{int n,i, ; real Suma, pi, Termen ; Read n ; Suma ←0 ; Termen←1 ; Do_for i=1,n,1 Suma=Suma+Termen/(2*i-1) ; Termen=-Termen ; Enddo ;

Pi←4*Suma ; Scrie 'Pi=", Pi;}

Set de valori: Fie n=3. Pas 1)suma=0, termen=1.Pentru i=1 suma=0+1/2*1-1=1, termen=-1

Pas 2)suma=1, termen=-1.Pentru i=2, suma=1+(-1)/2*2-1=1-1/3=2/3, termen=1Pas 3)suma=2/3, termen=1.Pentru i=3, suma=2/3+1/5=13/15Pi=4*suma=4*13/15

Mod de retinere al algoritmului:Cunoscandu-se numarul de termeni, se va putea utiliza instructiunea de ciclare cu un numar cunoscut de pasi (FOR).Se observa ca semnul termenilor sumei alterneaza.La fiecare pas ii atribuim variabilei “termen”(pe care o initializam cu 1) opusul acesteia, dar numai dupa ce s-a efectuat suma.

Codificare in C:#include <stdio.h>#include <stdlib.h>void main(){ int n,i; float suma,pi,termen; printf("n="); scanf("%d",&n); suma=0; termen=1; for (i=1;i<n;i++) { suma=suma+termen/(2*i-1); termen=-termen; } pi=4*suma; printf("%i", pi);}

Optimizare:

Page 2: Portofoliu probleme

Este optim.

2. Enunţ: Să se calculeze următoarele expresii: e1=(a+b)*(c-a); e2=(a+b)-(c-a); sqrt(e1*e2) cu toate numerele din mulţimea numerelor reale.Pseudocod {real a,b,c,e1,e2,e3,e4;read (a,b,c);e1=(a+b)*(c-a);read (e1);e2=(a+b)/(c-a);read (e2); if ((e1*e2)>=0) then e3=sqrt(e1*e2); Scrie(e3) endif}

Set de valori: Pentru a=3, b=2, c=1, e1 va fi -10 iar e2=2,5 dupa efectuarea calculelor.

Mod de reţinere al algoritmului: S-au citit numerele ce ne vor ajuta in calculul expresiei, dupa care s-au efectuat operatiile matematice, cu observatia ca la extragerea radicalului de ordin 2, produsul e1*e2>0.Codificare în C:#include <iostream.h>#include <stdio.h>#include <conio.h>#include <math.h>void main(){clrscr();float e1,e2,a,b,c, e3,e4;printf("a=");scanf("%f", &a);printf("b=");scanf("%f", &b);printf("c=");scanf("%f", &c);e1=(a+b)*(c-a);e2=(a+b)/(c-a);if ((e1*e2)>=0) {e3=sqrt(e1*e2) ;printf("radical din %f", e3);}printf(" e1= %f e2=%f n", e1,e2);getch();}

Optimizare: Este optim.

3. Enunt: Pentru n citit de la tastatura, sa se calculeze suma S=1+2!+3!+4!+….+n!Pseudocod:

Page 3: Portofoliu probleme

{Int n; real p,sread np←1s←1 do_ for i=2,n,1 do p←p*i s←s+p enddo;write s;}

Set de valori: Pentru n=3 avem: p=1,s=1 Pentru i=2 : p←2, s←3 Pentru i=3 : p←6, s←9 S=1+1*2+1*2*3+1*2*3*4=1+2+6=9

Mod de retinere al algoritmului: Se observa ca toti termenii se obtin din termenul precedent plus un nou produs. Astfel se calculeaza intai produsul 1*2*3*…*n care se aduna la suma initializata cu 0.

Codificare in C:# include <stdio.h>int n,s,p,i;void main( ){printf("n=");scanf("%d",&n);p=1;s=1;for (i=2; i<=n; i++) { p=p*i; s=s+p;}printf("%d",s);

Optimizare: Este optim.

Pobleme vectori

1. Enunt: Sa se scrie programul pentru sortarea elementelor unui vector de dimensiune n. Pseudocod{integer n,i,j; real x[100], aux;read n; do_for i=0,n,1 read (x[i]); enddo;do_for i=0,n-1,1

Page 4: Portofoliu probleme

do_for j=i+1, n,1 if x[i]>x[j] then aux←x[i]; x[i] ←x[i+1]; x[i+1] ←aux; endif; enddo;enddo;write (‘vectorul sortat este: ‘, n);do_for i=0,n,1 write (x[i]);enddo;}

Set de valori: Fie n=3 si vectorul cu elementele 5,8,3.Pantru i=1, se ia primul element, 5 si se compara cu celelalte elemente ale vectorului(cu 8 si cu 3).5<8 Adevarat5<3 Fals….atunci cele 2 elemente se interschimba, vectorul fiind format din elementele 3,8,5.

Mod de retinere al algoritmului: Metoda presupune determinarea elementului minim din vector si aducerea lui pe prima pozitie, dupa care se determina minimul din vectorul ramas si aducerea lui pe a doua pozitie etc. Minimul se poate determina comparand un element al vectorului cu toate care il succed, interschimbandu-le in cazul neindeplinirii criteriului de ordonare.

Codificare in C:#include<stdio.hVoid main(){ //metoda selectieiInt n; float x[100], aux;Printf (“introduceti dimensiunea vectorului, n=”);Scanf(“%d”, &n);For(int i=0; i<n, i++) {printf(“x[%d]=”, i); scanf(“%f”, &x[i]); }For (i=0, i<n-1, i++) For(int j=i+1; j<n; j++) if (x[i]>x[j]) { aux←x[i]; x[i] ←x[i+1]; x[i+1] ←aux;}printf(“vectorul sortat este: \n”);for (i=0, i<n,;i++) printf(“%6.2f “, x[i]);}

Optimizare: Este optim.

2. Enunt: Sa se scrie programul care verifica daca elementele unui vector formeaza o progresie aritmetica.Pseudocod {integer n,i; real x[100];

Page 5: Portofoliu probleme

read n;if n<3 then write (“vectorul are mai putin de trei elemente!”) else do_for i=0,n,1 Read (x[i]); i=2; while ( i<n) and (x[i]=(x[i-1]+x[i+1])/2) do if (i=n-1) then write(‘elem. formeaza o progresie aritmetica.’) else write(‘elem. nu formeaza o progresie aritmetica.’) endif; endwhile; enddo;endif;}

Set de valori: Fie n=4 si vectorul X=(1,2,3,4). Cum n>3 , se parcurg pasii urmatori.Pentru i=2 se verifica conditiile i<n si 2=(1+3)/2.Pentru i=3 se verifica conditiile i<n si 3=(2+4)/2.Dar i=3 este si penultimul element (n-1) ce inseamna ca se va afisa ‘elem. formeaza o progresie aritmetica.’.

Mod de retinere al algoritmului: Fie X=(x1,x2,x3…xn). Elementele vectorului pot forma o progresie aritmetica daca n>2 si x[i]=(x[i-1]+x[i+1])/2, i=2, n-1. Una din modalitatile prin care putem verifica daca elementele unui vector sunt in progresie aritmetica este ca un element sa fie egal cu media aritmetica a elementului din stanga si din dreapta lui. Pentru a putea verifica conditia, numarul de elemente ale vectorului trebuie sa fie mai mare sau egal cu 3. Vectorul este parcurs pana ajunge la penultimul sau pana intalneste un element care nu respecta conditia. Daca s-a ajuns cu parcurgerea vecorului pana la penultimul, elementele vectorului sunt in progresie aritmetica.

Codificare in C:#include<stdio.h>Void main(){int n; float x[100];Printf(“introduceti dimensiunea vectorului”);scanf(“%d”, &n);If (n<3) printf(“vectorul are mai putin de trei elemente!”);Else { For(int i=0;i<n;i++) {printf(“x[%d]=”, i);scanf(“%f”, &x[i]); } While (( i<n) && (x[i] = = (x[i-1]+x[i+1])/2)) i++; if (i=n-1) printf(”elem. formeaza o progresie aritmetica.”) else printf(“elem. nu formeaza o progresie aritmetica.”) }}

Optimizare: Este optim. 3. Enunt: Dandu-se un vector de maxim 100 de elemente, sa se scrie programul pentru transformarea vectorului in multime, prin eliminarea dublurilor.Pseudocod:

Page 6: Portofoliu probleme

{int n,i,j,k, real x[100];read n;do_for i=0,n,1 read(x[i]);enddo;do_for i=0,n-1,1 do_for j=i+1,n,1 if x[i]=x[j] then do_for k=j,n-1,1 x[k]=x[k+1] enddo; endif; enddo;enddo;write (‘vectorul rezultat este: \n’);do_for i=0,n,1 write x[i];enddo;}

Set de valori: Fie n=4 x1=2 x2=3 x3=4 x4=4  s5=5 Pentru i=0 j=1 -

Pentru i=1 j=2 – Pentru i=2, j=3 k=3 x[3]=x[4], n=4, j=2

Mod de retinere al algoritmului: Pentru eliminarea dublurilor se procedeaza astfel: se parcurge vectorul de la primul si pana la ultimul element si se compara elemetul curent cu toate elementele situate in dreapta sa. Daca elemental mai este gasit, se realizeaza deplasarea valorilor cu o pozitie spre stanga si se decrementeaza numarul total.

Codificare C:#include<stdio.h>Void main(){ int n,I,j,k;float x[100];Printf(“Dimensiunea vectorului:”); scanf(“%d”,&n);For (i=0;i<n;i++) {printf(“x[%d]=”, i); scanf(“%f”, &x[i]); }For (i=0;i<n-1; i++) For (j=0;j<n;j++) If (x[i] = = x[j]) {for (k=j;k<n-1;k++) x[k]=x[k+1]; n--;j--}printf(“vectorul rezultat este: \n”);for (i=0;i<n;i++) printf (“%5.2f”, x[i]);}

Optimizare: Este optim.

4. Enunt: Se da un vector cu n elemente si doua valori a si b. Sa se calculeze media aritmetica a elementelor aflate in intrevalul inchis determinat de cele doua valori.

Page 7: Portofoliu probleme

Pseudocod :{int n,i,, real x[100];read n ;do_for i=1,n,1 read v[i];enddo ;do read a,buntil a<bs←0k←0do_for i=1,n,1 if a≤v[i]≤b then s←s+v[i] k←k+1 endif ;enddo ;if k=0 then write‘’ nu exista‘’ else write (s/k)endif ;}

Set de valori : Fie n=6 a=3 si b= 10 si cele 8 elemente : 4 6 0 12 13 5 2 8.5<15, s←0, k←0. Pentru i=1 : a≤4≤b: s←4, k←1

Pentru i=2 : a≤6≤b: s←10, k←2 Pentru i=3 : a≤0≤b fals Pentru i=4 : a≤12≤b fals

Pentru i=5 : a≤13≤b fals Pentru i=6 : a≤5≤b: s←15, k←3, deci va afisa 15/3=5.

Mod de retinere al algoritmului: Pentru a calcula media aritmetica a elementelor sirului, cuprinse intre doua valori calculam suma tuturor elementelor cuprinse in acel interval si urmarim in acelasi timp si cate elemente avem. Apoi impartim suma obtinuta la numarul elementelor din interval si obtinem media astfel cautata.

Codificare in C :#include<stdio.h> #include<conio.h>main(){int v[20],n,i,a,b,k,s,c;float m;printf("n=");scanf("%d",&n);for (i=0;i<n;i++){printf("v(%d)=",i);scanf("%d",&v[i]);}printf("a=");scanf("%d",&a);

Page 8: Portofoliu probleme

printf("b=");scanf("%d",&b); if (a>b){c=a;a=b;b=c;}s=0;k=0;for (i=0;i<n;i++) if ((a<=v[i])&& (b>=v[i])){s+=v[i]; k++;}if (k==0) printf("nu exista"); else { m=(float) s/k; printf("%.2f",m);}getch();}

Optimizare: Este optim.

Probleme matrici

1. Enunt: Sa se scrie un program care construieste o matrice patratica astfel: pe diagonale va fi elementul 0, in parte de nord si sud elementul 1, iar in partea de est si vest elementul 2.Pseudocod:{integer a[20][20],i,j,nwrite(“introduceti n”)read(n) do-for i=0,n,1 do-for j=0,n,1 if(j=n-i-1)or(i=j) then a[i][j]=0 else if (((j<i)and(j<n-i+1)))or((j>n-i-1)and(j>i))) then a[i][j]=2 else a[i][j]=1 endif; endif; enddo; enddo;do-for i=0,n,1 do-for j=0,n,1 write(a[i][j]); enddo;enddo;

Page 9: Portofoliu probleme

}

Set de valori:introduceti numarul de linii si de coloane : 40 1 1 02 0 0 22 0 0 20 1 1 0

Mod de retinere al algoritmului : Se va completa cu 0 acolo unde are loc una din relatiile j=n-i-1 sau i=j. Se va completa cu 2 acolo unde are loc una din relatiile (((j<i)and(j<n-i+1)))or((j>n-i-1)and(j>i))) si cu 1 in rest.

Codificare in C:#include<stdio.h>void main (){int a[20][20],i,j,k,n;printf("introduceti nr de linii si numarul de coloane:\n");scanf("%i",&n);for(i=0;i<n;i++) for(j=0;j<n;j++) if((j==n-i-1)||(i==j)) a[i][j]=0; else if (((j<i)&&(j<n-i-1))||((j>n-i-1)&&(j>i))) a[i][j]=2 ; else a[i][j]=1; for (i=0;i<n;i++) { printf("\n"); for(j=0;j<n;j++) printf("%i ",a[i][j]); } }

Optimizare: Este optim.

2. Enunt: Fie un tablou bidimensional A cu m linii si n coloane cu elemente numere intregi. Sa se calculeze media aritmetica a elementelor pare.Pseudocod :{integer n,mreal a[20],[20]read n,mdo_for i=1,m,1 do_for j=1, n,1 read a[i],[j] enddo;enddo;s←0k←0

Page 10: Portofoliu probleme

do_for i=1,m,1 do_for j=1,n,1 if a[i],[j]%2=0 then s←s+a[i],[j] k←k+1 if k=0 then write ’nu exista elemente pare’; else write s/k endif;  endif; enddo;enddo;}

Set de valori : 2 1 4 A= 1 5 8

Pentru i=1, j=1, a[1],[1]%2=0 deci s←s+2=2, k←1 i=1, j=2, a[1],[2]%2=1 i=1, j=3, a[1],[3]%2=0, deci s←s+4=6, k←2 i=2, j=1, a[2],[1]%2=1 i=2, j=2, a[2],[2]%2=1 i=2, j=3, a[2],[3]%2=1, deci s←s+8=14, k←3cum k=3<>0 va afisa 14/3=4.6

Mod de retinere al algoritmului : Pentru a determina media aritmetica a elementelor pare din matricea A vom parcurge fiecare element al matricei si de fiecare data cand vom gasi un element par il insumam si contorizam. Initial, suma s si variabila contor k au valoarea 0. In final vom imparti suma obtinuta la numarul de elemente pare, detarminand astfel media aritmetica.

Codificare in C :#include<stdio.h> #include<conio.h>main(){int v[20][20],n,m,i,j,a,b,k,s,c;float p;printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);for (i=0;i<m;i++) for (j=0;j<n;j++){printf("v[%d][%d]=",i,j);scanf("%d",&v[i][j]);}s=0;k=0;for (i=0;i<m;i++)

Page 11: Portofoliu probleme

for (j=0;j<n;j++) if (v[i][j]%2==0){s+=v[i][j];

k++;}if (k==0) printf("nu exista"); else { p=(float) s/k; printf("%.2f",p);}}

Optimizare: Este optim.

3. Enunt: Sa se calculeze transpusa matricei A de ordinul n. Pseudocod:{integer a[10][10],b[10][10]integer i,n,jwrite("numarul de linii si coloane este:" )read (n)do -for i=0,n,1 do- for j=0,n,1 read(a[i][j]) enddoenddodo -for i=0,m,1 do- for j=0,n,1 b[i][j]=a[j][i] enddoenddowrite("matricea initiala este:" )do -for i=0,n,1 do- for j=0,n,1 write(a[i][j]) enddoenddowrite("matricea transpusa este:" )do -for i=0,n,1 do- for j=0,n,1 write(b[i][j]) enddoenddo}

Set de valori:citim numarul de linii si coloane 3a[0]=2a[1]=2a[2]=3a[3]=4a[4]=3

Page 12: Portofoliu probleme

a[5]=6a[6]=7a[7]=2a[8]=9matricea initiala este :2 2 34 3 67 2 9matricea transpusa este :2 4 72 3 23 6 9

Mod de retinere al algoritmului : Pentru a calcula transpusa unei matrici folosim egalitatea b[i][j]=a[j][i], adica fiecare elemnt va fi copiat intr-o alta matrice astfel incat indicii de linie si indicii de coloane se vor schimba intre ei.

Codificare C:#include<stdio.h>Void main(){ float a[10][10], b[10][10];int n;printf(“Numarul de linii si coloane: “);scanf(“%d”, &n);for (int i=0;i<n;i++) for (int j=0; j<n; j++) { printf(“elemental [%d] [%d]= “, I,j); Scanf(“%f, & a[i][j]); }for (i=0;i<n;i++) for (int j=0; j<n; j++) { b[i][j]=a[j][i]; }printf("matricea initiala este: \n”);for (i=0;i<n;i++) { for (int j=0;j<n;j++) printf(“%2f\t”, a[i][j]); printf(“\n”); }printf("matricea transpusa este: \n" );for (i=0;i<n;i++) {for (int j=0; j<n; j++) printf(“%.2f\t”, b[i][j]); printf(“\n”); }}

Optimizare: Este optim.

4. Enunt: Pentru fiecare linie a unei matrice, sa se calculeze produsul dintre cel mai mare si cel mai mic element.Pseudocod:{integer a[10][10],v[10],min,maxinteger n,m,i,j,kwrite("m=")read(m)

Page 13: Portofoliu probleme

write("n=")read(n)do -for i=0,m,1 read (v[i])do -for i=0,m,1 do- for j=0,n,1 read(a[i][j]) enddoenddowrite("matricea initiala este :")do -for i=0,m,1 do- for j=0,n,1 write(a[i][j]) enddoenddodo -for i=0,m,1 min=a[i][0] max=a[i][0] do -for j=0,n,1 if(a[i][j]>max) then

max=a[i][j] endif if(a[i][j]<min) then

min=a[i][j] endif enddo v[i]=max*minenddodo -for i=0,m,1 write(v[i])enddo}

Set de valori:citim m=2 si n=3a[0][0]=7a[0][1]=1a[0][2]=3a[1][0]=2a[1][1]=4a[1][2]=5matricea initiala este:7 1 32 4 5Pentru i=0 min=7 max=7 ; a[0][1]=1<7 deci min=1 ; 1<a[0][2]=3<7 deci v[0]=7*1=7

i=1 deci min=2, max=2 ; a[1][1]=4>2 deci max=4, a[1][2]=5>4=> max=5 v[1]=5*2=10Se afiseza : v[0]=7 v[1]=10

Mod de retinere al algoritmului : Penru fiecare linie in parte, initializam variabila max sa fie primul ement, dupa care comparam acest max cu celelalte elemente din linia respectiva. Daca un elemnt este mai mare decat max, atunci acesta va lua valoarea max si va fii comparat la randul lui cu celelalte elemente ramase in

Page 14: Portofoliu probleme

linie sa. La fel se procedeaza si cu min. Dupa ce s-a gasit max si min pentru fiecare linie, se va face produsul dintre ele.

Optimizare: Este optim.

5. Enunt: Sa se elaboreze un algoritm care sorteaza crescator liniile unei matrici de dimensiune mxn, citita de la tastatura. Matricea obtinuta va fi afisata pe ecran.Pseudocod:{Integer a[20][20],m,n,I,j,k,aux,t write(introduceti nr de linii si coloane) read(m) read (n) do -for i=0,m,1 do- for j=0,n,1 read(a[i][j]) enddoenddo do- for t=0,m,1 do- for i=0,n-1,1 do- for j=i+1,n,1 if(a[t][i]>a[t][j]) then aux=a[t][i] a[i][t]=a[t][j] a[t][j]=aux endif enddo enddoenddodo-for i=0,m,1 do-for j=0,n,1 write(a[i][j])endooenddo}

Set de valori:citim m=3 n=36 4 93 1 902 3 4Va lucra astfel:Primul for: t=0 Al doilea for(i=0,2,1) i=0 =>j=1 compara a[0][0] cu a[0][1]=>a[0][0]>a[0][1] =>schimba a[0][0] cu a[0][1] =>j=2 compara a[0][0]=4 cu a[0][2]=9 =>a[0][0]<a[0][2] =>i=1 =>j=2 compara a[0][1]=6 cu a[0][2]=9 =>i=2 =n-1=>t=1 i=0 =>j=1 =>a[1][0]=3>a[1][1]=1 =>a[1][0]=1 si a[1][1]=3 =>j=2=>a[1][0]=1<a[1][2]=90=>

Page 15: Portofoliu probleme

i=1 =>j=2=>a[1][1]= 3<a[1][2]=90=>=>t= 2 i=0 =>j=1=>a[2][0]=2<a[2][1]=3=> =>j=2=>a[2][0]=2<a[2][2]=4=> i=1 =>j=2=>a[2][1]=3<a[2][2]=4=>se termina sortarea Si afiseaza: 4 6 91 3 902 3 4

Mod de retinere al algoritmului : Pentru fiecare linie in parte, la inceput se compara primul element (de pe prima pozitie) cu celelalte. Atunci cand gaseste un element mai mic decat el, se schimba intre ele. Se contiunua cu compararea elementului de pe prima pozitie cu elementele ramase. Daca nu se mai gaseste nici un element mai mic decat el, se trece la elementul de pe pozitia a doua si se compara, la randul lui, cu elementele ce-l urmeaza s.a.

Codificare C:#include<stdio.h>int a[20][20],m,n,i,j,k,aux,t;void main(){k=1;printf(“introduceti nr de linii si numarul de coloane\n");scanf("%i",&m);scanf("%i",&n);for(i=0;i<m;i++) { printf("\n"); for(j=0;j<n;j++) {printf("a[%i,%i]=",i,j); scanf("%i",&a[i][j]);} } for(t=0;t<m;t++) for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if( a[t][i]>a[t][j]) {aux=a[t][i]; a[t][i]=a[t][j]; a[t][j]=aux;}for (i=0;i<m;i++) { printf("\n"); for(j=0;j<n;j++) printf("%i ",a[i][j]); }}

Optimizare: Este optim.

6. Enunt: Fie un tablou bidimesional A cu n linii si m coloane cu elemente numere intregi. Sa se transfere intr-un vector elementele prime din matrice.Pseudocod :

Page 16: Portofoliu probleme

{integer n,m,nrreal a[20],[20], b[20]read(n)read(m)do_for i=1,n,1 do_for j=1,m,1 read a[i],[j] enddoenddonr←0do_for i=1,n,1 do_for j=1,m,1 ok←1 do_for k=2,[a[i],[j]/2],1 if a[i],[j]%k=0 then ok←0 endif enddo if ok=1 and a[i],[j]<>1 then nr←nr+1 b[nr]←a[i],[j] endif enddoenddoif nr=0 then write( ‘nu exista elemente prime’) else do_for i=1,n,1 write (b[i]) enddoendif }

Set de valori :

4 3 2 A= 6 5 7 va afisa : b=(3,5,7)Pentru i=1, j=1, k=2,3 sau 4 => a[1],[1]% 2,3 sau 4=0; ok←0Pentru i=1, j=2, k=2 => a[1],[2]%2=1<>0, nr←1, b[1]←3 ; Pentru i=1, j=3, k=2,3 sau 4 =>a[1][3]%2,3 sau 4=0; ok←0;Pentru i=2, j=1, k=2,3 sau 4 => a[2][1]%2,3 sau 4=0; ok←0;Pentru i=2, j=2, k=2 3 sau 4 => a[2],[2]% 2 3 sau 4=1<>0 nr←3, b[2]←5 ; Pentru i=2, j=3, k=2 3 4 5 => a[2],[3]% 2 3 4 5=1 <>0 deci nr←4, b[3]←7

Mod de retinere al algoritmului : Dupa introducerea de la tastatura a matricei, initializam cu 0 variabila de ciclare nr a vectorului in care se va face tranferul elementelor prime. Testam daca fiecare element al matricei este prim si in caz afirmativ il transferam in vectorul b pe pozitia nr. In final afisam vectorul b astfel obtinut care va avea nr componente.

Codificare in C :

Page 17: Portofoliu probleme

#include <stdio.h>#include <conio.h>#include <math.h>int main(){int a[20][20],b[20],n,m,i,j,k,nr,c,ok;printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);for (i=1;i<=n;i++) for (j=1;j<=m;j++) {

printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);

}nr=0;for (i=1;i<=n;i++) for (j=1;j<=m;j++) { ok=0; if (a[i][j]>1) { c=int(sqrt(a[i][j])); for (k=2;k<=c;k++) { if (a[i][j]%k==0) ok=1; } if (ok==0) { nr=nr+1; b[nr]=a[i][j]; } } }if (nr==0) printf("nu sunt nr prime");else for (i=1;i<=nr;i++)

printf("%2d",b[i]); }

Optimizare: Este optim.

7. Enunt: Sa se realizeze programul care efectueaza inmultirea dintre un vector si o matrice.Pseudocod :{intreg n, p, j, i, k, x[10], a[10][10], y[10] ;read(n);do_for j=1,n,1

Page 18: Portofoliu probleme

read(x[i]);enddo;read(p);do_for i=1,n,1; do_for j=1,p,1 read(a[i][j]); enddo;enddo;do_for j=1,p,1 y[j]=0; do_for k=1,n,1 y[j]=y[j]+x[k]*a[k][j] enddo;enddo;do_for j=1,p,1 write(‘rezultatul inmultirii este’,y[j])enddo;}

Set de valori :n=3, x[i]=1 2 3  ;p=2 a=2 3 1 4 5 0j=1 y[1]=0 k=1 → y[1]=y[1]+x[1]*a[1][1]=>y[1]=0+1*2=2 k=2 → y[1]=y[1]+x[2]*a[2][1]=>y[1]=2+2*1=4 k=3 → y[1]=y[1]+x[3]*a[3][1]=>y[1]=4+3*5=19j=2 y[2]=0 k=1 → y[2]=y[2]+x[1]*a[1][2]=>y[2]=0+1*3=3 k=2 → y[2]= y[2]+x[2]*a[2][2]=>y[2]=3+2*4=11 k=3 → y[2]= y[2]+x[3]*a[3][2]=>y[2]=11+3*0=11=>y[j]=(19 ; 11)

Mod de retinere al algoritmului: Pentru a se putea efectua inmultirea dintre vectorul X si matricea A este obligatoriu ca numarul de elemente ale vectorului X sa fie egal cu numarul de linii ale matricei A.Rezultatul inmultirii este un vector Y cu p elemente. La inceput, ii atribuim lui y[j] valoarea 0, ulterior folosind formula recursiva y[j]=y[j]+x[k]*a[k][j].

Codificare in C :#include<stdio.h>#include<conio.h>void main(){ int n,p,i,j,k ; int x[10], a[10][10], y[10] ;printf( "\n Nr de elemente ale vectorului= ") ; scanf("%d", &n) ;for (j=0 ;j<n ; j++)  {printf ("x[%d]= ",j) ;scanf("%d", &x[j]) ; }printf("\nMatricea ") ;printf("\nNr de coloane= ") ; scanf("%d", &p) ;

for (i=0 ;i<n ;i++)

Page 19: Portofoliu probleme

for (j=0 ;j<p ; j++) {printf("a[%d][%d]= ",i, j) ; scanf("%d", &a[i][i]) ; }for (j=0 ;j<p ; j++) {y[j]=0 ; for (k=0 ;k<n ;k++) y[j]=y[j]+x[k]*a[k][j] ; } printf("\n rezultatul este : \n") ; for (j=0 ; j<p ; j++) printf("%d", y[j]) ; printf("\n") ; getch() ;}

Optimizare: Este optim.

Ultimele 6 probleme

1. Enunt: Sa se scrie un program care realizeaza interclasarea unui vector.Pseudocod:{ integer n,m,i,j,k;real a[90],b[90],c[90];// cei 2 vectori trebuie sa fie ordonati crescatorread (m);do_for i=1,1,m read(a[i]);enddo;read(n); do_for i=1,1,n read(b[i]);enddo;// interclasareai=1;j=1;k=0;do_while (i<=m) and (j<=n) if (a[i]<b[j]) then c[k]=a[i] else c[k]=b[j]; endif;end while;// adaugam elementele ramase neparcurseif(i<=m) then do_while(i<=m) c[k]=a[i]; end while;endif;if(j<=n) then do_while(j<=n) c[k]=b[j]; end while;endif;

Page 20: Portofoliu probleme

// afisez vectorul interclasatdo_for i=1,1,k write(c[i] );enddo;}

Set de valori: Fie A=( 1 5 8 11), m=4 B=( 0 2 6 9 13), n=5i=1, j=1, k=0 => a[1]>b[1] (1>0) => c[0]=b[1]=0 j=2 => a[1]<b[2] (1<2) => c[1]=a[1]=1;i=2, j=2 => a[2]>b[2] (5>2) => c[2]=b[2]=2; j=3 => a[2]<b[3] (5<6) => c[3]=a[2]=5;i=3, j=3 => a[3]>b[3] (8>6) => c[4]=b[3]=6; j=4 => a[3]<b[4] ( 8<9) => c[5]=a[3]=8;i=4, j=4 => a[4]>b[4] (11>9) => c[6]=b[4]=9; j=5 => a[4]<b[5] (11<13) => c[7]=a[4]=11; A mai ramas j=5<=n => c[8]=b[5]=13 Se va afisa: C=(0 1 2 5 6 8 9 11 13)

Mod de retinere al algoritmului: Se compara intai elementele din fiecare vector cu acelasi indice; cel care are valoarea mai mica este trecut in vectorul C, celalalt fiind comparat cu urmatorul element din celalalt vector.

Codificare in C:#include<stdio.h>int n,m,i,j,k;float a[90],b[90],c[90],// cei 2 vectori trebuie sa fie ordonati crescatorvoid main (){printf("m=");scanf("%d",&m); for (i=1;i<m;i++) scanf("%d",a[i]);printf("n=");scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",b[i]);// interclasareai=1;j=1;k=0;while((i<=m)&&(j<=n)) { if(a[i]<b[j]) { c[k]=a[i]; } else { c[k]=b[j]; } }// adaugam elementele ramase neparcurse

Page 21: Portofoliu probleme

if(i<=m){ while(i<=m) { c[k]=a[i]; }}if(j<=n){ while(j<=n) { c[k]=b[j]; }}// afisez vectorul interclasatfor(i=1;i<=k;i++)printf(%f\n” , c[i] )}

Optimizare: Este optim.

2. Enunt: Ridicarea la putere a unei matriciPseudocod:{Intreg a[20][20],c[20][20],n,i,j,p,d;Write(Introduceti dimensiunea”);Read(n); do-for i=0,n,1 do-for j=0,n,1 read(a[i][j]); enddo;enddo;write(“introduceti puterea”); read(d);p=1; while(p<d) do-for i=0,n,1 do-for j=0,n,1 do-for k=c[i][j]=0,n,1 c[i][j]=c[i][j]+a[i][k]*a[k][j]; enddo; enddo; enddo; do-for i=0,n,1 do-for j=0,n,1 a[i][j]=c[i][j]; c[i][j]=0; enddo; enddo; p=p+1; endwhile do-for i=0,n,1 do-for j=0,n,1 write(a[i][j]); enddo;

Page 22: Portofoliu probleme

enddo;}

Set de valori:n=2d=31 23 4 Va afisa 7 1015 22Cand p=1=>1<3=> A= 1 2 3 4 =>i=0 =>j=0 =>k=0=c[0][0]=> c[0][0]=c[0][0]+a[0][0]*a[0][0]=0+1*1=1 =>k=1=> C[0][0]=1+a[0][1]*a[0][1]=1+2*3=7 =>j=1 =>k=0=c[0][1]=> C[0][1]=0+a[0][0]*a[0][1]=0+1*2=2 =>k=1=> C[0][1]=2+a[0][1]*a[1][1]=2+2*4=10 =>i=1 =>j=0=> K=0=c[1][0] C[1][0]=0+a[1][0]*a[0][0]=0+3*1=3 =>k=1 C[1][0]=6+a[1][1]*a[1][0]=3+12=15 =>j=1=> K=0=c[1][1] C[1][1]=0+a[1][0]*a[0][1]=0+3*2=6 K=1=> C[1][1]=6+a[1][1]*a[1][1]=6+16=22 Mod de reţinere al algoritmului: Se inmulteste matricea a cu ea insasi de d ori. Se retine valoarea obtinuta la un pas p<d in matricea c, iar la pasul urmator, matricea a va lua valorile din matricea c. Se foloseste formula C[i][j]=c[i][j]+b[i][k]*a[k][j].

Codificare in C:#include<stdio.h>//ridica o matrice la o putereint a[20][20],n,i,j,k,p,d,c[20][20];void main(){printf("introduceti nr n \n");scanf("%i",&n);printf("dati puterea");scanf("%i",&d);for(i=0;i<n;i++) {

Page 23: Portofoliu probleme

printf("\n"); for(j=0;j<n;j++) {printf("a[%i,%i]=",i,j); scanf("%i",&a[i][j]);} } p=1; while (p<d) { for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=c[i][j]=0;k<n;k++) c[i][j]+=a[i][k]*a[k][j]; for(i=0;i<n;i++) for(j=0;j<n;j++) {a[i][j]=0; a[i][j]=c[i][j]; c[i][j]=0;} p+=1;}for(i=0;i<n;i++) {for(j=0;j<n;j++) printf("%i ",a[i][j]); printf("\n");}}

Optimizare: Este optim.

3. Enunt: Produsul vectorial si scalar a a doi vectori.Produsul vectorialPseudocod:{integer a[20], b[20],c[20], i, nread(n);do_for i=1,1, n read (a[i]);enddodo_for j=1,1, n read (b[j]);enddodo_for i=1,1,n c[i]=a[i ]*b[i];enddodo_for i=1,1,n write(c[i]);enddo}

Set de valori:a=(1,5,5,3)b=(1,6,3,9)c=(1*1,5*6,5*3,3*9)=(1,30,15,27)

Mod de reţinere al algoritmului:

Page 24: Portofoliu probleme

Se parcurg cu ajutorul unui contor cei doi vectori si se inmultesc elementele corespunzatoare din primul vector cu cele din cel de-al doilea vector, iar rezultatul se introduce intr-un nou vector.

Codificare in C:#include<stdio.h>void main(){int a[20],b[20],c[20],n,i,j;printf("n=");scanf("%d",&n);for (i=0;i<n;i++){printf("a(%d)=",i);scanf("%d",&a[i]);}for (i=0;i<n;i++){printf("b(%d)=",i);scanf("%d",&b[i]);}for (i=0;i<n;i++)c[i]=a[i]*b[i];for (i=0;i<n;i++)printf("%d ",c[i]);}

Optimizare: Este optim.

Produs scalarPseudocod:{integer a[20], b[20], s, i, n;read(n);do_for i=1,1,n read(a[i]);enddo;do_for j=1,1,n read (b[j]);enddo;s←0;do_for i=1,1,n s←s+a[i]*b[i]; write(‘produsul scalar al celor doi vectori este ‘,s)enddo;}

Set de valori:

a=(4,10,2,1)b=(5,3,1,4)i=1 -> s=4*5=20

Page 25: Portofoliu probleme

i=2 -> S=20 + 10*3=50i=3 -> S=50 + 2*1=52i=4 -> S=52 + 1*4=58

Mod de reţinere al algoritmului: Se inmulteste elementul de pe pozitia i din primul vector cu elementul tot de pe pozitia i din cel de-al doilea vector, rezultatul accestora fiind insumat cu s.

Codificare in C:#include<stdio.h>void main(){int a[20],b[20],n,i,j,s;printf("n=");scanf("%d",&n);for (i=0;i<n;i++){printf("a(%d)=",i);scanf("%d",&a[i]);}for (i=0;i<n;i++){printf("b(%d)=",i);scanf("%d",&b[i]);}s=0;for (i=0;i<=n;i++)s=s+a[i]*b[i];printf("%d",s);}

Optimizare: Este optim.

4. Enunt: Diferenta dintre doua multimi.Pseudocod:{integer a[20], b[20], c[20], i, j, k, m, n;read(n);do_for i=1,1,n read(a[i]);enddo;read(n);do_for j=1,1,mread (b[j]);k←0do_for i=1,1,n ok←0 do_for j=1,1,m if a[i]=b[j] then ok←1 endif; if ok=0

Page 26: Portofoliu probleme

then c[k]=a[i]; k←k+1;

endif;enddo;enddo;if k<>0 then do_for i=1,1,k-1 write (c[i]); enddo; elsewrite (“Dif este multimea vida”);endif;}

Set de valori:A=(1,3,6,4,6)B=(3,2,1)i=1: k=1, j=1, cum a[1]<>b[1] deci c[1]=a[1]=1, k=2 j=2, cum a[1]<>b[2] deci c[2]=a[1], k=3 j=3, cum a[1]<>b[3] deci c[3]=a[1], k=4i=2, j=1, a[2]=b[1] deci ok←1i=3, j=1 cum a[3<>b[1] deci a[]Y=(1,3,4)

Mod de gandire al algoritmului: Pentru fiecare element al multimii A se face testul daca apartine sau nu multimii B. In caz de neapartenenta se adauga unei multimi C, initial vide. O variabila k (cu valoare initiala 1) retine indicele componentei din c care va memora urmatorul element care se adauga multimii diferenta. In final se afiseaza C.

Codificare in C:#include<stdio.h>void main(){int a[20],b[20],c[20],n,m,k,i,j,ok;printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);for (i=0;i<n;i++){printf("a(%d)=",i);scanf("%d",&a[i]);}for (i=0;i<m;i++){printf("b(%d)=",i);scanf("%d",&b[i]);}k=0;for (i=0;i<n;i++){

Page 27: Portofoliu probleme

ok=0;for (j=0;j<m;j++)if (a[i]==b[j]) ok=1;if (ok==0) {c[k]=a[i]; k=k+1; }}if (k!=0){for (i=0;i<k;i++)printf("%d ",c[i]);}elseprintf("diferenta este multimea vida");}

Optimizare: Este optim. 5. Enunt: Produsul vectorial dintre fiecare doua linii a unei matrici.Pseudocod:{read m,ndo_for i=1,n

do_for j=1,m,1read a[i][j];

enddo;enddo;k=1;do until (i<n) do_for q=1,n,1

(do_for i=1, n,1do_for j=1,m,1

c[k][j]=a[i][j]*a[i+1,j];enddo;k=k+1;

enddo);do_for i=1 ,k,1

do_for j=1,m,1 read c[i][j];enddo;

enddo;}

Set de valori: 4 3 2 Fie A= 5 2 3

1 6 10 2 8 9Pentru n=3,m=4, i=0, j=1, k=0 d[0][0]=a[0][0]*a[1][0]=20

Page 28: Portofoliu probleme

k=1 d[0][1]=a[0][1]*a[1][1]=6 k=2 d[0][2]=a[0][2]*a[1][2]=6

nr=1 s.a

Mod de retinere al algoritmului: Se parcurge fiecare linie in parte si se inmulteste vectorial cu celelalte.

Codificare in C:#include <stdio.h>#include <math.h>void main(){int a[20][20],d[20][20],n,m,i,j,k,nr;printf("n=");scanf("%d",&n);printf("m=");scanf("%d",&m);for (i=0;i<m;i++) for (j=0;j<n;j++) {

printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);

}nr=0;for (i=0;i<m-1;i++) for (j=i+1;j<m;j++) { for (k=0;k<n;k++)

d[nr][k]=a[i][k] * a[j][k];nr=nr+1;

}for (i=0;i<nr;i++){ for (j=0;j<n;j++)printf("%4d",d[i][j]);printf("\n");}}

Optimizare: Se putea folosi o functie care sa efectueze produsul scalar a doua linii din o matrice.

6. Enunt: Fie A o matrice patratica de numere reale. Sa se calculeze suma elementelor de sub diagonala principala, suma elementelor de peste diagonala principala si suma elementelor de pe diagonala principala.Pseudocod:{real [20],[20]integer n,s1,s2,s3,i,jread (n);do_for i=1,1,n do_for j=1,1,n

Page 29: Portofoliu probleme

read a[i],[j]; enddo;enddo;s1←0;s2←0;s3←0;do_for i=1,1,n s1=s1+a[i][i] write (‘suma elementelor de pe diag principala este s1=’,s1);enddo;do_for i=1,1,n-1 do_for j=i+1,1,n s2=s2+a[i],[j] write(‘suma elem de deasupra diag principala este s2=’,s2); enddo;enddo;do_for i=2,1,n do_for j=1,1, i-1 s3=s3+a[i],[j] write (‘suma elem de sub diag principala este s3=’,s3); enddo;enddo;}

Set de valori: 4 8 Pentru i=1 s1=4, pentru i=2 => s1=4+3=10.Fie A= 0 3 Pentru i=1, j=2 => s2=8.

Pentru i=2, j=1 => s3=0.

Mod de retinere al algoritmului: Pentru calculul sumei elementelor de pe diagonala principala, trebuie respectata regula ca elementele au aceiasi indici. Pentru calculul sumei elementelor de deasupra diagonalei principale, elementele au indicii liniilor cu 1 mai mic decat indicele coloanelor. Pentru calcului sumei elementelor de sub diagonala principala, elementele au indicele coloanelor cu 1 mai mic decat cel al liniilor.

Codificare in C:#include<stdio.h> #include<conio.h>main(){int a[20][20],n,m,i,j,s1,s2,s3;float p;printf("n=");scanf("%d",&n);for (i=0;i<n;i++) for (j=0;j<n;j++){printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);}

Page 30: Portofoliu probleme

s1=0;s2=0;s3=0;for (i=0;i<n;i++)s1=s1+a[i][i];printf("%d",s1);for (i=0;i<=n-1;i++) for (j=i+1;j<=n;j++) s2=s2+a[i][j]; printf("%5d",s2);for (i=1;i<=n;i++) for (j=0;j<=i-1;j++) s3=s3+a[i][j]; printf("%5d",s3);}

Optimizare: Este optim.

Page 31: Portofoliu probleme

Temă Săptămâna 4

12. Să se scrie programul pentru determinarea c.m.m.d.c. dintr-un şir de numere naturale nenule.Pseudocod:{

read (n)do_for i=1,n,1

read (a[i])enddod=a[i]r=0i=1do while (r<>1)& (i<n)

imp=a[i]do while (i>1)

r=d mod impd=impimp=r

end whileend while

if r<>1 then scrie ”cmmdc”,delse scrie”Nr sunt prime intre ele”

endif}

13. Să se scrie programul care determină amplitudinea unui şir de numere memorate într-un vector de elemente reale.Pseudocod:{ real x[100]; real min,max intreg i,n write(„n=”); read (n); do_for i=1,n,1 read(x[i]); enddomin←x[1];max←x[1];do_for i=2,n,1 if x[i]<min then min←x[i] else if x[i]>max then max←x[i] endif endifenddowrite(„Amplitudinea este:’max-min);}

Page 32: Portofoliu probleme

14. Să se scrie programul care determină toate numerele prime dintr-un şir de numere naturale.Pseudocod:{intreg v[20], n, i, j, k, pr[20]read (n)do_for i=1,n,1

read(v[i])enndok=0;do_for i=1,n,1

nd=0;Do_for j=1,v[i],1

if (v[i] mod j == 0) then nd=nd+1;if (nd==2) then {k=k+1;

pr[k]=v[i]; write (v[i]);}

enddo}

Temă Săptămâna 5

14. Fie o matrice de dimensiuni mxn reprezentând profiturile nete obţinute de m societăţi într-o perioadă de n ani. Afişaţi societăţile care au înregistrat profitul maxim pe întreaga perioadă analizată.Pseudocod:{ real mat[20][20],v[20],max,sintreg m,n,i,jwrite ("m=")read (m)write ("n=")read (n)do_for i=1,m,1 do_for j=1,n,1

read (mat[i][j]) enddoenddomax=0do_for i=1,m,1 s=0 do_for j=1,n,1

s=s+mat[i][j] enddo v[i]=s if s>max then max=s endifenddodo_for i=1,m,1 if v[i]=max

Page 33: Portofoliu probleme

then write (" Societatea ",i)enddo}

15. Să se verifice dacă două şiruri de numere citite de la tastatură sunt sau nu unul anagrama celuilalt.Pseudocod:{read ( n);do_for i=1,n,1

read (a[i]);enddoread (m);do_for i=1,m,1

read (b[i]);enddoif n<>m then ok=0

else do_for i=1,n-1,1

do_for j=i+1,n,1if a[i]>a[j] then

aux=a[i];a[i]=a[j];a[i]=aux;

endif;if b[i]>b[j]

aux=b[i];b[i]=b[j];b[i]=aux;

endif;enddo;do_for i=1,n,1

if a[i]<>b[i] then ok=0;endif;

enddo;if ok=0 write („cele doua siruri nu sunt anagrame”)

else write („cele doua siruri sunt anagrame”)}

16. Să se scrie programul pentru determinarea numărului de apariţii ale fiecărui caracter din alfabetul limbii engleze într-un şir de caractere. Nu se va ţine cont de diferenţele dintre literele mari şi literele mici.{ caracter v[100],jintreg n,i,c,a[30],kwrite("n=") read (n)do_for i=1,n,1 read v[i]enddok=1do_for j='a','z',1

Page 34: Portofoliu probleme

c=0 do_for i=1,n,1

if (v[i]=j) then c=c+1 endif

enddo a[k]=c k=k+1enddok=1do_for j='A','Z',1 c=0 do_for i=1,n,1 if(v[i]=j)

then c=c+1 endif

enddo a[k]=a[k]+c k=k+1enddok=1do_for j='a','z',1

if (a[k]=0)then write ("Litera ",j," nu apare in sir")

else scrie ("Litera ",j," apare in sir de ",a[k]," ori")k=k+1

endifenddo}

17. Fie un vector care reprezintă vârsta exprimată în ani a n persoane. Să se determine persoanele a căror vârstă exprimată în luni formează un număr palindrom.Pseudocod:{Read (n)Do_for i=1,n,1

read v[i]enddodo_for i=1,n,1

inv=0;m=x[i]*12do_while m<>0

inv=inv*10 + m mod 10m=m/10c=inv

end whileif c=x[i]*12 then y[nr]=i

Nr=nr+1endif

enddoif nr<>0 then do for i=1,nr,1

Page 35: Portofoliu probleme

write (y[i]+1)enddoelse scrie „nu exista niciun palindrom”

endif}