Sunteți pe pagina 1din 35

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;
termen=1;
for (i=1;i<n;i++)
{ suma=suma+termen/(2*i-1);
termen=-termen;
}
pi=4*suma;
printf("%i", pi);
}

Optimizare:
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:
{
Int n; real p,s
read n
p←1
s←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
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 Adevarat
5<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.h
Void main()
{ //metoda selectiei
Int 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];
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:
{
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.
Pseudocod :
{
int n,i,, real x[100];
read n ;
do_for i=1,n,1
read v[i];
enddo ;
do
read a,b
until a<b
s←0
k←0
do_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);
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,n
write(“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;
}

Set de valori:
introduceti numarul de linii si de coloane : 4
0 1 1 0
2 0 0 2
2 0 0 2
0 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,m
real a[20],[20]
read n,m
do_for i=1,m,1
do_for j=1, n,1
read a[i],[j]
enddo;
enddo;
s←0
k←0
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←3
cum 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++)
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,j
write("numarul de linii si coloane este:" )
read (n)
do -for i=0,n,1
do- for j=0,n,1
read(a[i][j])
enddo
enddo
do -for i=0,m,1
do- for j=0,n,1
b[i][j]=a[j][i]
enddo
enddo
write("matricea initiala este:" )
do -for i=0,n,1
do- for j=0,n,1
write(a[i][j])
enddo
enddo
write("matricea transpusa este:" )
do -for i=0,n,1
do- for j=0,n,1
write(b[i][j])
enddo
enddo
}

Set de valori:
citim numarul de linii si coloane 3
a[0]=2
a[1]=2
a[2]=3
a[3]=4
a[4]=3
a[5]=6
a[6]=7
a[7]=2
a[8]=9
matricea initiala este :
2 2 3
4 3 6
7 2 9
matricea transpusa este :
2 4 7
2 3 2
3 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,max
integer n,m,i,j,k
write("m=")
read(m)
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])
enddo
enddo
write("matricea initiala este :")
do -for i=0,m,1
do- for j=0,n,1
write(a[i][j])
enddo
enddo
do -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*min
enddo
do -for i=0,m,1
write(v[i])
enddo
}

Set de valori:
citim m=2 si n=3
a[0][0]=7
a[0][1]=1
a[0][2]=3
a[1][0]=2
a[1][1]=4
a[1][2]=5
matricea initiala este:
7 1 3
2 4 5
Pentru 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=10
Se 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
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])
enddo
enddo
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
enddo
enddo
do-for i=0,m,1
do-for j=0,n,1
write(a[i][j])
endoo
enddo
}

Set de valori:
citim m=3 n=3
649
3 1 90
234
Va 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=>
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:
469
1 3 90
234

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 :
{
integer n,m,nr
real 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]
enddo
enddo
nr←0
do_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
enddo
enddo
if nr=0 then
write( ‘nu exista elemente prime’)
else
do_for i=1,n,1
write (b[i])
enddo
endif 
}

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←0
Pentru 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 :
#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
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
14
50
j=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=19
j=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++)
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 crescator
read (m);
do_for i=1,1,m
read(a[i]);
enddo;
read(n);
do_for i=1,1,n
read(b[i]);
enddo;
// interclasarea
i=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 neparcurse
if(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;
// afisez vectorul interclasat
do_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=5
i=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 crescator
void 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]);
// interclasarea
i=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
if(i<=m)
{ while(i<=m)
{ c[k]=a[i];
}
}
if(j<=n)
{ while(j<=n)
{ c[k]=b[j];
}
}
// afisez vectorul interclasat
for(i=1;i<=k;i++)
printf(%f\n” , c[i] )
}

Optimizare:
Este optim.

2. Enunt: Ridicarea la putere a unei matrici


Pseudocod:
{
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;
enddo;
}

Set de valori:
n=2
d=3
12
34
Va afisa
7 10
15 22
Cand 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 putere
int 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++)
{
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 vectorial
Pseudocod:
{
integer a[20], b[20],c[20], i, n
read(n);
do_for i=1,1, n
read (a[i]);
enddo
do_for j=1,1, n
read (b[j]);
enddo
do_for i=1,1,n
c[i]=a[i ]*b[i];
enddo
do_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:


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 scalar
Pseudocod:
{
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
i=2 -> S=20 + 10*3=50
i=3 -> S=50 + 2*1=52
i=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,m
read (b[j]);
k←0
do_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
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;
else
write (“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=4
i=2, j=1, a[2]=b[1] deci ok←1
i=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++)
{
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]);
}
else
printf("diferenta este multimea vida");
}

Optimizare:
Este optim.

5. Enunt: Produsul vectorial dintre fiecare doua linii a unei matrici.


Pseudocod:
{
read m,n
do_for i=1,n
do_for j=1,m,1
read a[i][j];
enddo;
enddo;
k=1;
do until (i<n)
do_for q=1,n,1
(do_for i=1, n,1
do_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 9
Pentru n=3,m=4, i=0, j=1, k=0 d[0][0]=a[0][0]*a[1][0]=20
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,j
read (n);
do_for i=1,1,n
do_for j=1,1,n
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]);
}
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.
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])
enddo
d=a[i]
r=0
i=1
do while (r<>1)& (i<n)
imp=a[i]
do while (i>1)
r=d mod imp
d=imp
imp=r
end while
end while
if r<>1 then scrie ”cmmdc”,d
else 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]);
enddo
min←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
endif
enddo
write(„Amplitudinea este:’max-min);
}
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])
enndo
k=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,s
intreg m,n,i,j
write ("m=")
read (m)
write ("n=")
read (n)
do_for i=1,m,1
do_for j=1,n,1
read (mat[i][j])
enddo
enddo
max=0
do_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
endif
enddo
do_for i=1,m,1
if v[i]=max
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]);
enddo
read (m);
do_for i=1,m,1
read (b[i]);
enddo
if n<>m then ok=0
else
do_for i=1,n-1,1
do_for j=i+1,n,1
if 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],j
intreg n,i,c,a[30],k
write("n=")
read (n)
do_for i=1,n,1
read v[i]
enddo
k=1
do_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]=c
k=k+1
enddo
k=1
do_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+1
enddo
k=1
do_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
endif
enddo
}

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]
enddo
do_for i=1,n,1
inv=0;
m=x[i]*12
do_while m<>0
inv=inv*10 + m mod 10
m=m/10
c=inv
end while
if c=x[i]*12 then y[nr]=i
Nr=nr+1
endif
enddo
if nr<>0 then
do for i=1,nr,1
write (y[i]+1)
enddo
else scrie „nu exista niciun palindrom”
endif
}