Sunteți pe pagina 1din 21

Bazele programarii

calculatoarelor

Seminar 6
Algoritmi – vectori part. III

2020
Probleme
1. Sa se verifice daca doua siruri de numere citite de la tastatura sunt sau nu unul
anagrama celuilalt.

2. La un concurs de patinaj se cunosc cele n note obtinute de un concurent. Sa


se calculeze punctajul lui, stiind ca la determinarea mediei nu se iau in calcul
nota cea mai mica si nota cea mai mare obtinute.

3. Sa se scrie programul care realizeaza compunerea a doua permutari.

4. Sa se scrie programul care verifica daca o permutare este permutare


identica.

5. Sa se scrie programul care determina daca o permutare este transpozitie.

6. Sa se scrie programul care determina inversa unei permutari de gradul n.

7. Fie un vector care reprezinta varsta exprimata in ani a n persoane. Sa se


determine persoanele a caror varsta exprimata in luni formeaza un numar
palindrom.

2
Problema 1- enunt
Sa se verifice daca doua siruri de numere citite de la
tastatura sunt sau nu unul anagrama celuilalt.
Exemplu: Exemplu:
a= (1,2,3,3,5) Introduceti dimensiunea primului sir: 5
b= (3,1,3,2,5) Introduceti elementele primului sir:
R: ? x[0]=1
R: da
x[1]=2
a= (5,3,2,4,5) x[2]=3
b= (3,4,1,3,5) x[3]=3
R: ? x[4]=5
R: nu (fiecare nr. nu apare de acelasi nr de ori) Introduceti dimensiunea celui de-al doilea
sir: 5
Indicatii: Introduceti elementele celui de-al doilea sir:
- se declara variabilele necesare y[0]=3
- se introduc de la tastatura lungimile si y[1]=1
elementele sirurilor y[2]=3
- se verifica lungimea fiecarui sir de numere (pt. n y[3]=2
!= m va fi ok=0)
- pt. k=1se sorteaza fiecare sir de numere
y[4]=5
- se compara elementul a[i] cu b[i]. Cele doua siruri sunt anagrame.
- daca toate sunt egale, atunci se da un mesaj ca
cele doua siruri sunt anagrame, daca nu, se da
un mesaj corespunzator.
Problema 1 – rezolvare  ok=1;
 IF (n!=m) THEN ok=0;
 ELSE
INTREG n,m, i, j, ok;  { DO-FOR i=0, n-2, 1
REAL x[100], y[100], aux;  DO-FOR j = i+1, n-1, 1
 {
WRITE ("Introduceti dimensiunea primului sir:");  IF (x[i] > x[j]) THEN { aux = x[i];
READ (n);  x[i]=x[j];
WRITE ("Introduceti elementele primului sir:\n");  x[j]=aux;
DO-FOR i = 0,n-1,1  }
READ (x(i));  ENDIF;
ENDDO;  IF (y[i] > y[j]) THEN { aux = y[i];
 y[i]=y[j];
WRITE ("Introduceti dimensiunea celui de-al  y[j]=aux;
 }
doilea sir:");
 ENDIF;
READ (m);
 }
WRITE ("Introduceti elementele celui de-al  ENDDO;
doilea sir:\n");  ENDDO;
DO-FOR i = 0,m-1,1 
READ (y(i));  DO-FOR i=0, n-1, 1
ENDDO;  IF (x[i]!=y[i]) THEN ok=0;
 ENDIF;
 ENDDO;
In loc de DO_FOR,  }
se poate si cu WHILE_DO ?  ENDIF;
 IF (!ok) THEN SCRIE ("Cele doua siruri nu sunt
R: anagrame.");
i=0;  ELSE SCRIE ("Cele doua siruri sunt
while ((i<n) && (x[i]==y[i])) do i=i+1; anagrame.");
endwhile;  ENDIF;
if (i==n) then write (“sunt anagrame”)  STOP.
else write (“nu sunt anagrame”);
Problema 2 - enunt
La un concurs de patinaj se cunosc cele n note obtinute de un concurent. Sa
se calculeze punctajul lui, stiind ca la determinarea mediei nu se iau in
calcul nota cea mai mica si nota cea mai mare obtinute.
Indicatii:
- se citesc de la tastatura nr. de note si notele
- se initializeaza variabila total = 0.0, iar min si max cu primul element din vector
- vectorul asociat notelor obtinute de un concurent se parcurge secvential intr-o
structura DO-FOR de la primul la ultimul element si se determina elementul minim
si elementul maxim.
- se calculeaza punctajul lui ca raport intre suma notelor (care sunt diferite de nota
cea mai mica si nota cea mai mare) si numarul notelor. OBS. Se va folosi un
contor k pentru a se retine nr. de note ce va fi luat in calcul)

Exemplu: Rezultat:
Introduceti nr. de note: 5 Nota 1=7 //nu se va lua in considerare
Introduceti elementele sirului: Nota 2=8 //k=1
Nota 1=7 Nota 3=7 //nu se va lua in considerare
Nota 2=8 Nota 4=9 //k=2
Nota 3=7 Nota 5=10 //nu se va lua in considerare
Nota 4=9 Punctajul este: 8.50 --- (8+9)/2 = 8.50
Nota 5=10
Problema 2 – rezolvare
 REAL note[10], total, media, min, max;
k=0;
 INTREG int n,k,i;

DO-FOR i = 0, n -1, 1
 WRITE ("Introduceti nr. de note:");
IF ((note[i]!=max) && (note[i]!=min))
 READ (n);
THEN {
 WRITE ("Introduceti elementele sirului:\n");
total = total + note[i];
 DO-FOR i = 0, n-1, 1
k = k+1;
 READ (note(i));
}
 ENDDO;
ENDIF;

ENDDO;
 total = 0;
 min = note[0];
IF (k!=0) THEN {
 max = note[0];
media = total / k;

WRITE ("Punctajul este:", media);
 //se determina nota maxima si nota minima
}
 DO-FOR i= 0,n-1,1
ENDIF;
 { IF (note[i]>max) THEN max=note[i];
STOP.
 ENDIF;

 IF (note[i]<min) THEN min=note[i];
 ENDIF;
 }
 ENDDO;

Problema 3 - enunt
Sa se scrie programul care realizeaza compunerea a doua permutari

• Ce este o permutare ?
R: numărul de posibilități de rearanjare a unei liste ordonate de valori (sau obiecte).

• Exemplu de permutare pentru n=3 ?


R:
123
213
...

• Cate permuatari vor fi pentru n=3?


R: 3! = 3*2*1 = 6

• Exemplu de reprezentare pentru o permutare cu n=5.

• Care este asemanarea dintre permutare si vector?


Problema 3 - enunt
Sa se scrie programul care realizeaza compunerea a doua permutari

Teorie:

Indicatii:
Fie a si b doi vectori in care se retin permutarile initiale si c vectorul care contine
permutarea compusa.
Obs: in limbajul C elementele sunt memorate in masive incepand de la pozitia 0,
iar elementele din cadrul permutarii incep de la 1.
Problema 3 - exemplu
Exemplu
 Introduceti gradul permutarilor:3
(a o b)(x) = a(b(x))
 Introduceti elementele primei permutari:
 a(1)=2
 a(2)=1
 a(3)=3

 Introduceti elementele celei de-a doua


permutari:
 b(1)=3
 b(2)=2
 b(3)=1

 Cat este rezultatul compunerii permutarilor ?


 R:
 1 2 3 -> pozitii
 3 1 2 -> valori
Problema 3 - rezolvare
 INTREG n, i, a[100], b[100], c[100]; • DO-FOR i = 0, n-1, 1
• c[i] = a[b[i]-1];

• ENDDO;
 WRITE ("Introduceti gradul permutarilor:"); •
 READ (n); • WRITE ("Rezultatul compunerii
 permutarilor este:\n");
 WRITE ("Introduceti elementele primei • DO-FOR i = 0,n-1, 1
permutari:\n"); • WRITE (i+1);
• ENDDO;
 DO-FOR i = 0, n-1, 1
• WRITE (“\n”);
 READ (a(i)); • DO-FOR i=0, n-1, 1
 ENDDO; • WRITE (c(i));
 • ENDDO;
 WRITE ("Introduceti elementele celei de-a doua
permutari:\n"); • STOP.
 DO-FOR i = 0, n-1, 1
 READ (b(i));
 ENDDO;

Problema 4 - enunt
Sa se scrie programul care verifica daca o permutare este permutare identica
(pseudocod si schema logica).

• Ce este o permutare identica ?

Exemple
Exemplu 1: Exemplu 2:
Introduceti gradul permutarii: 3 Introduceti gradul permutarii: 3
Introduceti elementele permutarii: Introduceti elementele permutarii:
a(1)=2 a(1)=1
a(2)=1 a(2)=2
a(3)=3 a(3)=3
Nu este permutare identica. Permutare identica.
1 2 3 1 2 3
2 1 3 1 2 3

Indicatii:
- se citesc gradul permutarii si elementele.
- se verifica intr-un DO-FOR dupa i daca fiecare valoare a lui a[i] este egala cu i+1. Daca in final (i = = n)
atunci permutarea este identica.
Problema 4 - rezolvare
 INTREG n,i, a[100];

 WRITE ("Introduceti gradul permutarii:");
 READ (n);
 WRITE ("Introduceti elementele permutarii:\n");
 DO-FOR i = 0, n-1, 1
 READ (a(i));
 ENDDO;

 DO-FOR (i = 0, i<n && a[i] = = i+1, 1)


 ENDDO;
 IF (i = = n) THEN SCRIE ("Permutare identica.\n");
 ELSE SCRIE ("Nu este permutare identica.\n");
 ENDIF;

 DO-FOR i = 0, n-1, 1
 WRITE (i+1);
 ENDDO;
 WRITE ("\n");
 DO-FOR i = 0, n-1, 1
 WRITE (a(i));
 ENDDO;
 STOP.
Problema 5 - enunt
Sa se scrie programul care determina daca o permutare este transpozitie.

Ce conditie trebuie sa ideplineasca o permutare pentru a fi o transpozitie?

 Exemplul 1: Exemplul 2:
 Introduceti gradul permutarii:3 Introduceti gradul permutarii:3
 Introduceti elementele permutarii: Introduceti elementele permutarii:
 a(1)=3 a(1)=1
 a(2)=2 a(2)=2
 a(3)=1 a(3)=3
 Permutarea este transpozitie: 3 Permutarea nu este transpozitie.
 1 2 3 1 2 3
 3 2 1 1 2 3
Problema 5 – indicatie si exemple
Indicatii:
 - se citesc gradul si elementele permutarii
 - intr-un DO-FOR se numara cate elemente sunt diferite fata de permutarea
identica.
 - in variabila dif se va retine cate elemente sunt diferite in raport cu pozitiile
pe care le au iar in variabila poz pe ce pozitie se afla tranzpozitia
 - daca dif este diferit de 2 atunci se da mesaj ca permutarea nu este
transpozitie, altfel se da mesajul ("Permutarea este transpozitie: ", poz);

Exemplul 2:
 Exemplul 1: Introduceti gradul permutarii:3
 Introduceti gradul permutarii:3 Introduceti elementele
 Introduceti elementele permutarii: permutarii:
 a(1)=3 a(1)=1
 a(2)=2 a(2)=2
 a(3)=1 a(3)=3
 Permutarea este transpozitie: 3 Permutarea nu este transpozitie.
 1 2 3 1 2 3
 3 2 1 1 2 3
Problema 5 – rezolvare
 INTREG n,i, a[100], dif, poz;
IF (dif != 2) THEN SCRIE ("Permutarea nu

este transpozitie.\n");
 WRITE ("Introduceti gradul
permutarii:"); ELSE SCRIE ("Permutarea este
 READ (n); transpozitie: ", poz);
 WRITE ("Introduceti elementele ENDIF;
permutarii:\n");
 DO-FOR i=0, n-1, 1
 READ (a(i)); DO-FOR i = 0, n-1, 1
 ENDDO; WRITE (i+1); //pozitii permutare
 ENDDO;
 dif=0; WRITE ("\n");
 DO-FOR i = 0, n-1, 1 DO-FOR i = 0, n-1,1
 IF (a[i] != i+1) THEN WRITE (a(i)); //valori permutare
 { dif = dif+1; ENDDO;
 poz = i+1; STOP.
 }
 ENDIF;
 ENDDO;


Problema 6 - enunt
Sa se scrie programul care determina inversa unei permutari de gradul n.

Indicatie:

Obs: in C elementele sunt memorate in masive incepand de la pozitia 0, iar


elementele din cadrul permutarii incep de la 1.
Problema 6 – exemple
 Exemplu
 Introduceti gradul permutarii:3
 Introduceti elementele permutarii:
 a(1)=2
 a(2)=3
 a(3)=1
 Elementele inversei permutarii ?
 1 2 3
 3 1 2
Problema 6 – rezolvare
 INTREG n,i, a[100], b[100];

 WRITE ("Introduceti gradul permutarii:");
 READ (n);
 WRITE ("Introduceti elementele permutarii:\n");
 DO-FOR i = 0, n-1,1
 READ (a(i));
 END-DO;

 DO-FOR i = 0, n-1, 1
 b[a[i]-1] = i+1;
 ENDDO;

 WRITE ("Elementele inversei permutarii:\n",i+1);
 DO-FOR i = 0, n-1,1
 WRITE (i+1);
 ENDDO;
 WRITE ("\n");
 DO-FOR i = 0, n-1, 1
 WRITE (b(i));
 ENDDO;
 STOP.
Problema 7 - enunt
Fie un vector care reprezinta varsta exprimata in ani a n persoane. Sa se
determine persoanele a caror varsta exprimata in luni formeaza un
numar palindrom.

Indicatie:

- un numar palindrom este acela egal cu valoarea sa privita in oglinda.

Alte exemple de tip text:


- cuvinte: calabalac, aerisirea, cojoc, etajate,
etalate, etc
- propozitii: Ele fac cafele, Ele ne seduc cu
desenele, etc.

Exemplu rulare
Introduceti dimensiunea sirului: 3
Introduceti elementele sirului (varsta in ani)
x[0]=21 //21*12 = 252 este palindrom
x[1]=37 //37*12 = 444 este palindrom
x[2]=35 //35*12 = 420 nu este palindrom
Persoanele a caror varsta exprimata in luni formeaza un palindrom sunt:
1
2
Problema 7 - rezolvare
 INTREG n,m,x[100], y[100],i, nr, inv,c; IF (nr)
 THEN { SCRIE ("Persoanele a caror varsta
 SCRIE ("Introduceti dimensiunea sirului");
exprimata in luni formeaza un palindrom sunt:\n");
 CITESTE (n);
DO-FOR i = 0,nr-1,1

 SCRIE ("Introduceti elementele sirului");
SCRIE (y[i]+1);
 DO-FOR i=0, n-1, 1 ENDDO;
 SCRIE (x(i)); }
 ENDDO; ELSE SCRIE ("Nu exista niciun palindrom");
 nr =0 ; ENDIF;
 DO-FOR i = 0, n-1, 1 STOP.
 { inv = 0;
 m = x[i]*12;
 WHILE (m) DO {
 inv = inv*10 + m%10;
 m = m/10;
 c = inv;
 }
 ENDWHILE;

 IF (c = = x[i] * 12) THEN { y[nr] = i;
 nr = nr+1;
 }
 ENDIF;
 }
 ENDDO;


nr=0;
Problema 7 - rezolvare i=0 //x[0]=21
inv=0
m=x[0]*12 = 252
 Exemplu rulare
while (m!=0) // aici m=252
 Introduceti dimensiunea sirului: 3 DO
 Introduceti elementele sirului (varsta in ani) {
 x[0]=21 //21*12 = 252 este palindrom inv = 0*10 + 252 % 10 = 2
 x[1]=37 //37*12 = 444 este palindrom m = 252/10 = 25 //cat - /
c=2
 x[2]=35 //35*12 = 420 nu este palindrom
}

 Persoanele a caror varsta exprimata in luni formeaza un //se reintra in while


palindrom sunt (pozitie in vector + 1): while (m!=0) //aici m=25
 1 DO
 2 {
inv = 2*10+25%10 = 20+5 = 25
m = 25/10 = 2
c = 25
}

//se reintra in while


while (m!=0) //aici m=2
DO
{
inv = 25*10 + 2%10 = 250 +2 = 252
m=2/10 = 0
c = 252

//se reintra in while


while (m!=0) //aici m=0 -> se iese din while

if (c==x[0]*12) //252 == 21*12


then {
y[0] = 0;
nr = 0 + 1;
}
i=1 ....
i=2 ....
i=3 – se iese din DO-FOR

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