Sunteți pe pagina 1din 24

Bazele programarii

calculatoarelor

Seminar 5
Algoritmi vectori part. II

2016
Probleme
1. Sa se scrie programul pentru sortarea elementelor unui vector de dimensiune n.
a) sortarea prin interschimbare (metoda bulelor)
b) sortarea prin selectie
c) sortarea prin insertie

2. Sa se scrie programul care verifica daca elementele unui vector formeaza o progresie
aritmetica

3. Fie un vector cu numere reale, de dimensiune n. Scrieti programul care insereaza


intre doua valori consecutive ale vectorului media aritmetica a acestora.

4. Scrieti programul pentru determinarea c.m.m.d.c (cel mai mare divizor comun) dintr-
un sir (vector) de numere naturale nenule.

5. Scrieti programul care determina amplitudinea unui sir de numere memorate intr-un
vector de numere reale.

6. Sa se calculeze produsul numerelor perfecte dintr-un vector cu m elemente numere


intregi.

7. Se da un vector de 100 de elemente reale. Sa se scrie programul care transforma


vectorul in multime, eliminand dublurile (operatie de compactare).

2
Problema 1a - enunt
Sa se scrie programul pentru sortarea elementelor unui
vector de dimensiune n.
a) sortarea prin interschimbare (metoda bulelor)
( WHILE (C) DO S....ENDWHILE)

Indicatie:
- se compara doua cate doua elemente Exemplu 1:
consecutive ale vectorului, interschimbadu-le in Introduceti dimensiunea
cazul neindeplinirii criteriului de ordonare. vectorului, n=4
- dupa o parcurgere intergrala a vectorului, x[0]=2
procesul se reia incepand cu primul element. x[1]=1
- elementele cu valoare mica sunt impinse catre x[2]=4
inceputul vectorului x[3]=3
- procesul se opreste cand la o parcurgere a 1.00 2.00 4.00 3.00
vectorului nu s-a produs nicio interschimare, 1.00 2.00 3.00 4.00
situatie indicata de valoarea variabilei p. Vectorul sortat este:
1.00 2.00 3.00 4.00
Problema 1a rezolvare I
INTREG n,i,p;
REAL x[100], aux;
SCRIE ("Introduceti dimensiunea vectorului, n=");
CITESTE (n); WHILE (C)
DO-FOR i=0,n-1,1 DO S....
CITESTE x(i); ENDWHILE
ENDDO;

p=1;
WHILE (p) DO
{ p=0;
da
DO-FOR i=0,n-2,1 C
IF (x[i]>x[i+1])
THEN { S
aux=x[i];
nu
x[i]=x[i+1];
x[i+1]=aux;
p=1;
}
ENDIF;
ENDDO;
}
ENDWHILE;

SCRIE ("Vectorul sortat este:");


DO-FOR i=0,n-1,1
SCRIE (x(i));
STOP.
Problema 1b - enunt
1. Sa se scrie programul pentru sortarea elementelor
unui vector de dimensiune n.
b) sortarea prin selectie (cu doua DO-FOR)

Indicatie:
- metoda consta in 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 detecta comparand un element al vectorului cu toate care il
succed, interschimbandu-le in cazul neindeplinirii criteriului de ordonare
(aceasta metoda poate avea la randul ei mai multe variante).

Exemplu
Introduceti dimensiunea vectorului, n=4
x[0]=2
x[1]=1
x[2]=4
x[3]=3
Problema 1b rezolvare II
INTREG n,i,j;
REAL x[100], aux;
SCRIE ("Introduceti dimensiunea vectorului, n=");
CITESTE(n);
DO-FOR i=0,i<n,1
CITESTE x(i);
ENDDO;

DO-FOR i=0,n-2,1
DO-FOR j=i+1,n-1,1
IF (x[i]>x[j])
THEN { aux = x[i];
x[i] = x[j];
x[j] = aux;
}
ENDIF;
END-DO;
ENDDO;

SCRIE ("Vectorul sortat este:");


DO-FOR i=0,n-1,1
SCRIE (x(i));
ENDDO;
STOP.
Problema 1c enunt (TEMA)
Sa se scrie programul pentru sortarea elementelor unui vector de
dimensiune n.
c) sortarea prin insertie (TEMA)

- se porneste de la ipoteza ca la pasul i elementele predecesoare


lui x(i) sunt ordonate.

- se determina pozitia j in care valoarea lui x(i )se incadreaza


conform criteriului de ordonare.

- elementul x(i) va fi inserat in acea pozitie, dupa toate celelalte


elemente ale vectorului, incepand cu pozitia j si pana la sfarsit,
gliseaza cu o pozitie la dreapta.

- se reduce astfel numarul de insterschimbari deoarece in cazul in


care un element x(i) este mai mare decat precedentul, acesta se
considera ordonat.
Problema 1c rezolvare III
l se citesc: lungimea vectorului si elementele acestuia (i=0,n-1,1)
l
l Do-For i = 1, n-1, 1
l
l If (v[i-1] > v[i]) Then
l { j = 0;
l While ((j <= i-1) && (v[j] < v[i]))
l Do (j = j+1);
l End-While;
l aux = v[i];
l
l Do-For k = i-1, j, -1
l v[k+1] = v[k];
l End-Do;
l v[j] = aux;
l }
l End-If;
l End-Do;
l
l - afisare rezultat (vector sortat, (i=0,n-1,1))
Problema 2 - enunt
Sa se scrie programul care verifica daca elementele unui vector
formeaza o progresie aritmetica (folosind WHILE - DO)
Indicatie:
Fie X= (x1,x2,...xn).

Elementele vectorului pot forma o progresia aritmetica daca


n>2 si x(i) = (x(i-1)+x(i+1))/2, i=2,n-1

Solutie:
-pentru verificarea cerintei este putem verifica faptul ca un elemnt este egal cu
media aritmetica a elementului din stanga si din dreapa lui (nr elemente din
vector >=3).

-vectorul este parcurs pana la penultimul element sau pana la un element care
nu indeplineste conditia.

- daca s-a ajuns cu parcurgerea pana la penultimul, elementele vectorului sunt in


progresie aritmetica
Problema 2 exemplu
l Exemplu 1
l Introduceti dimensiunea vectorului, n=4
l x[0]=1
l x[1]=2
l x[2]=3
l x[3]=4
l Elementele sunt in progresie aritmetica

l Exemplu 2
l Introduceti dimensiunea vectorului, n=4
l x[0]=1
l x[1]=2
l x[2]=3
l x[3]=5
l Elementele nu formeaza o progresie aritmetica
Problema 2 rezolvare
INTREG n;
REAL x[100];
SCRIE ("Introduceti dimensiunea vectorului, n=");
CITESTE(n);

IF (n<3) THEN SCRIE (Vectorul are mai putin de trei elemente)


ELSE { DO-FOR i=0,n-1,1
CITESTE x(i);
ENDDO;

i=1;
WHILE ((i<n-1) && (x[i] = = (x[i-1] + x[i+1])/2)) DO i=i+1;
ENDWHILE;

IF (i = = n - 1) THEN SCRIE ("Elementele sunt in progresie aritmetica");


ELSE SCRIE ("Elementele nu formeaza o progresie
aritmetica");
ENDIF;

}
ENDIF;
STOP
Problema 3 - enunt
Fie un vector cu numere reale, de dimensiune n. Scrieti programul
care insereaza intre doua valori consecutive ale vectorului
media aritmetica a acestora.

Indicatie:
l se parcurge vectorul pana la penultimul
l se deplaseaza toate valorile spre dreapta cu o pozitie si se insereaza
media aritmetica.
l dupa fiecare inserare se incrementeaza indicele cu 2 pentru a nu insera si
media dintre medie si element.

Exemplu
Introduceti dimensiunea vectorului, n=3
x[0]=1
x[1]=2
x[2]=3
Vectorul actualizat cu media este:
1.00 1.50 2.00 2.50 3.00
Problema 3 rezolvare numerica
l Exemplu
k=3 (k=n) l Introduceti dimensiunea vectorului, n=3
l x[0]=1
i=0 l x[1]=2
l x[2]=3
l Vectorul actualizat cu media este:
While (i<k-1) DO ... l 1.00 1.50 2.00 2.50 3.00
0<2 -> j=3 -> x[3] = x[2] = 3
j=2 -> x[2] = x[1] = 2
j=1 -> j>i+1 (1>1) cond.nu este indeplinita => se iese din for
-> x[1] = (x[0]+x[1])/2 = (1+2)/2=1.5
-> i=i + 2 = 0 +2= 2
-> k = k +1 = 3 +1 = 4
k=4
i=2
2<3 -> j=4 -> x[4] = x[3] = 3
j=3 -> j>i+1 (3>3) cond. nu este indeplinita => se iese din for
-> x[3] -> (x[2]+x[3])/2 = (2+3)/2=2.5
-> i = i +2 = 2 + 2 = 4
-> k = k +1 = 4 +1
k=5
i=4
4<4 cond. nu este indeplinita, se iese din WHILE
Se afiseaza vectorul creat.
Problema 3 - rezolvare
l INTREG n,i,j,k,p;
l REALx[100];
l
l SCRIE ("Introduceti dimensiunea vectorului, n=");
l CITESTE(n);
l
l DO-FOR i=0,n-1,1
l CITESTE x(i);
l ENDDO;

l k=n;
l i=0;
l WHILE (i<k-1)
l DO {
l DO-FOR ( j=k, j>i+1, j=j-1 ) x[j] =x[j-1];
l x[j] = (x[i]+x[i+1])/2;
l i=i+2;
l k=k+1;
l }

l SCRIE ("Vectorul nou este:");


l DO-FOR i=0,k-1,1
l SCRIE (x(i));
l STOP.
Problema 4 - enunt
Scrieti programul pentru determinarea c.m.m.d.c (cel mai mare
divizor comun) dintr-un sir (vector) de numere naturale nenule.
Indicatie:
- Fie sirul X=(x1,x2,...,xn). Pentur determinrea cmmdc al sirului X se
foloste proprietatea acestuia de asocivitate :

CMMDC1 cmmdc (x1,x2)


CMMDC2 = cmmdc (CMMDC1, x3)
....................
CMMDCn-1 = cmmdc (CMMDCn-2, xn)
..................
CMMDC = CMMDCn-1

- Procesul se opreste cand:


-> sirul de numere a fost epuizat, caz in care cmmdc a fost
determinat,
-> fie cand in urma unei impartiri restul este 1, caz in care
numerele sunt prime intre ele.
Problema 4 - rezolvare
INTREG d, imp, r, x[50],n,i; RULARE
CITESTE ( n); Introduceti dimensiunea sirului, n=2
DO-FOR i=0,n-1,1 x[0]=24
CITESTE (x(i)) ; x[1]=18
ENDDO;
i=1
d = x[0]; r=24%18=6 /* %- preia restul
r = 0; impartirii lui 24 la 18
i = 1; d=18
WHILE ((r!=1) && (i<n)) imp=6
DO { imp = x[i];
DO { r=18%6=0
r=d%imp; d=6
d=imp; imp=0
imp=r;
} i=2
UNTIL (r<=1);
ENDDO; CMMDC = 6
i++;
}
ENDWHILE;

IF (r!=1) THEN SCRIE ("CMMDC =", d)


ELSE SCRIE ("Numerele sunt prime intre ele");
ENDIF;
STOP.
Problema 5 - enunt

l Scrieti programul care determina amplitudinea unui sir de


numere memorate intr-un vector de numere reale.

Indicatii:
Amplitudinea unui sir de numere se determina ca diferenta (in valoarea
absoluta) dintre maximul si minimul din sirul respectiv.

Exemplu
Introduceti dimensiunea sirului, n=3
x[0]=2
x[1]=1
x[2]=3
Amplitudinea este 2.00
Problema 5 - rezolvare
l INTREG n,i;
l REAL x[100], min, max;
l CITESTE ( n);
l DO-FOR i=0,n-1,1
l CITESTE (x(i)) ;
l ENDDO;

l min = x[0]
l max = x[0]
l DO-FOR i=1,n-1,1
l IF (x[i]<min) THEN min = x[i]
l ELSE IF (x[i]>max) THEN max=x[i]
l ENDIF;
l ENDIF;
l ENDDO;
l SCRIE ("Amplitudinea este ", max-min);
l STOP.
Problema 6 - enunt
Sa se calculeze produsul numerelor perfecte dintr-un vector cu m
elemente numere intregi.

Indicatie:
l un numar este perfect daca se poate scrie ca suma a divizorilor sai
naturali, mai putin el insusi.

Exemple:
l 6=1+2+3
l 28=1+2+4+7+14
l 496=1+2+4+8+16+31+62+124+248
l 8.128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064
Problema 6 rezolvare numerica
l p=1 Exemplu rulare
l nr=0 Introduceti dimensiunea sirului, n=3
x[0]=6
l i = 0,2,1 x[1]=28
l i=0 x[2]=2
l { s=0 Produsul numerelor perfecte este 168.
l (j=1,6/2=3,1)
l j=1 daca 6 % 1 = 0 => s=s+1=1
l j=2 daca 6 % 2 = 0=> s= 1+2 = 3
l j=3 daca 6 % 3 = 0=> s=3+3 =6
l daca s = = x[0] (6= =6) atunci { p=1* 6 = 6
l nr = 0 + 1 = 1
l }
l i=1
l { s=0
l (j=1,28/2=14,1)
l j=1 daca 28 % 1 = 0 => .......
l ......
l j = 14 daca 28 % 14 = 0 => s = 14 + 14 = 28
l daca s = = x[1] (28 = = 28) atunci { p= 6*28 = 168
l nr = 1 + 1 = 2
l }
l i = 2 .........
Problema 6 rezolvare
l INTREG n,s,i,j, x[100], p, nr;
l CITESTE ( n);
l DO-FOR i=0,n-1,1
l CITESTE (x(i)) ;
l ENDDO;
l p =1 //produsul
l nr = 0 //nr. de numere perfecte
l DO-FOR i = 0,n-1,1 {
l s=0
l DO-FOR j=1,x[i]/2,1
l IF (x[i]%j ==0) THEN s=s+j;
l ENDIF;
l ENDDO;
l IF (s= =x[i]) THEN {
l p=p*x[i];
l nr=nr+1;
l }
l ENDIF;
l }
l ENDDO;
l IF (nr) THEN SCRIE("Produsul numerelor perfecte este", p);
l ELSE SCRIE("Nu exista numere perfecte in sir.");
l ENDIF;
l STOP
Problema 7 - enunt
Se da un vector de 100 de elemente reale. Sa se scrie
programul care transforma vectorul in multime,
eliminand dublurile (operatie de compactare).

Indicatie:
l Se parcurge vectorul de la primul pana la ultimul elemnt
si se compara elementul curent cu toate situate in
dreapta sa.
l Daca elementul mai este gasit se realizeaza deplasarea
valorilor cu o pozitie spre stanga si se decrementeaza
numarul total.
Problema 7 rezolvare numerica
Introduceti dimensiunea vectorului, n=5 V.valori inainte de modificarea pozitiei j=3 si k=4
x[0]=1 x[0]= 1.00
x[1]=2 x[1]= 2.00
x[2]=1 x[2]= 2.00
x[3]=2 valori dupa schimbarea pozitiei n=3, j=2, k=3.
x[4]=1
VI.valori inainte de modificarea pozitiei j=2 si k=3
I. fara schimbarea pozitiei j=1 si k=-1 si n=5 x[0]= 1.00
II. valori inainte de modificarea pozitiei j=2 si x[1]= 2.00
k=-1 valori dupa schimbarea pozitiei n=2, j=1, k=2.
x[0]= 1.00
x[1]= 2.00 Rezultat:
x[2]= 2.00 Vectorul compactat este:
x[3]= 1.00 1.00 2.00
III.valori dupa schimbarea pozitiei n=4, j=1,
k=4.
IV.fara schimbarea pozitiei j=2 si k=4 si n=4
Problema 7 rezolvare
l INTREG n,i,j,k,p;
l REALx[100];
l SCRIE ("Introduceti dimensiunea vectorului, n=");
l CITESTE(n);
l DO-FOR i=0,n-1,1
l CITESTE x(i);
l ENDDO;

l k=-1
l DO-FOR i=0,n-1,1
l DO-FOR j=i+1,n-1,1
l IF (x[i] == x[j]) THEN {
l DO-FOR k=j,n-2,1
l x[k]=x[k+1];
l ENDDO;
l n=n-1
l j=j-1
l }
l ENDIF;
l ENDDO;
l ENDDO;

l SCRIE ("Vectorul compactat este:");


l DO-FOR i=0,n-1,1
l SCRIE (x(i));
l ENDDO;
l STOP.

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