Documente Academic
Documente Profesional
Documente Cultură
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
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).
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
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;
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:
Indicatie:
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
}