Sunteți pe pagina 1din 79

Caietul de sarcini

la practica de specialitate I
Scopul:
consolidarea cunoștințelor acumulate în procesul de instruire teoretică, precum și
utilizarea lor în practică, pregătirea specialiștilor calificați, gata să țină piept concurenței pe piața
forței de muncă.
Competențe specifice
CS1. Aplicarea metodelor de algoritmizare, de formalizare, de analiză, de sinteză și de
programare pentru soluționarea problemelor legate de prelucrarea automatizată a informației.
CS2. Translarea algoritmilor frecvent utilizați într-un limbaj de programare (Pascal, C++).
CS3. Formarea deprinderilor de interacțiune interpersonală și de lucru în grup;
În conformitate cu planul de învățământ, durata practicii este de 90 ore (12 zile, ultima zi
destinată susținerii practicii) și se finalizează cu prezentarea și susținerea portofoliului de
practică. Portofoliu (anexa) este evaluat și notat după sistemul general de evaluare (1 - 10) de
conducătorul practicii.
Cerințe:
 se va studia, în detaliu, problema propusă de coordonatorul practicii și se va realiza un
program (în limbajul C++ și/sau Pascal) pentru aceasta problemă, punându-se accent pe
interfața cu utilizatorul (ferestre, meniuri, help etc.);
 se va realiza un program care, în funcție de specificul unității, să realizeze controlul unui
proces sau gestiunea unei baze de date(de dimensiuni reduse);
 fișierul sursă al programului împreună cu un set de date de test se vor salva pentru a fi
prezentate la susținerea practicii.
 în portofoliu de practică se vor descrie: problema studiată, varianta de rezolvare (eventual
descrierea programelor existente), cerințele generale ale programului (necesarul de
memorie și timp) și documentațiile de utilizare;
Practica se va finaliza cu prezentarea unui raport asupra practicii și cu o demonstrație pe
calculator a produsului soft elaborat.
Fiecare student va întocmi agenda de practică tehnologică care va consemna:
 numele și prenumele, anul de studii;
 locul de desfășurare al practicii și perioada;
 activitatea desfășurată în fiecare zi de practică, reieșind din sarcinile prevăzute în programa
analitică;
Conținuturi
Nr. Unități de conținut Nr. de ore
Introducere. Familiarizarea cu sarcina individuală de lucru în procesul
1 4
practicii de inițiere.
2 Elemente de programare modulară în limbajele: Pascal și C/C++. 12
Aplicații ale tehnicilor de programare utilizate în procesul de studiu în
3 24
baza limbajelor: Pascal și C++.
4 Elemente de programare orientată pe obiecte în baza limbajului C++ 24
5 Formarea deprinderilor de lucru în echipe. 16
6 Prezentarea raportului pentru practică 10
Total 90

Modulul 1: Elemente de programare modulară în limbajele: Pascal și C/C++.

Fișiere
1) Fișierul date.in conține 3 valori separate printr-un singur spațiu, care reprezintă vârsta,
înălțimea și genul unei persoane. Să se scrie un program care determină greutatea ideală a
unei persoane cunoscând înălțimea, vârsta și genul persoanei (f sau m). Formulele de calcul
sunt:

Gmasculin = 50 + 0.75 * (înălțime - 150) + (vârsta - 20) / 4,


Gfeminin = Gmasculin – 10,
unde înălțimea este exprimată în cm și vârsta în ani.. La ecran se va afișa greutatea ideală.
Toate datele despre persoană (vârsta, înălțimea, genul, greutatea ideală) se vor scrie în
fișierul date.out.
2) Fișierul date.in conține 3 numere întregi separate printr-un singur spațiu. Să se elaboreze
un program care va afișa aceste numere unul sub altul, afișând în dreptul fiecăruia unul
dintre cuvintele ”PAR” sau ”IMPAR”. Rezultatul va fi afișat la ecran cât și în fișierul
date.out.
3) Fișierul date.in conține 3 numere întregi distincte separate printr-un singur spațiu. Să se
elaboreze un program care va specifica care dintre numere are valoare maximală, minimală
și care nu este nici minim nici maxim. Rezultatul va fi afișat la ecran cât și în fișierul
date.out.
4) Fișierul date.in conține 12 numere întregi separate printr-un singur spațiu care reprezintă
temperaturile medii ale lunilor unui an, ca numere întregi. Să se afișeze cu două zecimale
media anuală a temperaturilor pozitive și a celor negative. Rezultatul va fi afișat la ecran
cât și în fișierul date.out.
5) Fișierul date.in conține n numere întregi separate printr-un singur spațiu. Primul număr
reprezintă numărul de numere din fișier. Datele din fișier reprezintă mediile a n elevi, ca
numere reale. Să se afișeze cea mai mare și cea mai mică medie. Să se verifice dacă sunt
corigenți. Rezultatul va fi afișat la ecran cât și în fișierul date.out.
Exemplu: Date de intrare: 4 9.50 4.25 9.66 6.33; Date de ieșire: max=9.66 min=4.25 1
corigent.
6) Fișierul date.in conține n numere întregi separate printr-un singur spațiu. Primul număr
reprezintă numărul de numere din fișier. Să se afișeze numărul minimal, maximal, numărul
de elemente pare, impare și media numerelor cu două zecimale. Rezultatul va fi afișat la
ecran cât și în fișierul date.out.
7) Fișierul date.in conține elementele unei matrice. În prima linie sunt scrise numărul de linii
și de coloane separate printr-un spațiu. Pe următoarele linii sunt scrise elementele matricei.
Elaborați un program care va afișa la ecran și va scrie în fișierul date.out elementele
matricei și pozițiile pe care se află valoarea maximală.
8) Fișierul date.in conține elementele unei matrice. În prima linie sunt scrise numărul de linii
și de coloane separate printr-un spațiu. Pe următoarele linii sunt scrise elementele matricei.
Elaborați un program care va afișa la ecran si va scrie în fișierul date.out elementele
matricei și suma de pe fiecare linie.
9) Fișierul date.in conține elementele unei matrice. În prima linie sunt scrise numărul de linii
și de coloane separate printr-un spațiu. Pe următoarele linii sunt scrise elementele matricei.
Elaborați un program care va afișa la ecran si va scrie în fișierul date.out elementele
matricei și minimul de pe fiecare coloană.
10) Fișierul date.in conține un șir de caractere. Elaborați un program care va determina numărul
de majuscule din șir. Rezultatul va fi afișat la ecran cât și în fișierul date.out.
11) Fișierul date.in conține un șir de caractere. Elaborați un program care va înlocui cifrele din
șir cu semnul ”+”. Rezultatul va fi afișat la ecran cât și în fișierul date.out.
12) Fișierul date.in conține un șir de caractere. Elaborați un program care va afișa doar cifrele
din șir. Rezultatul va fi afișat la ecran cât și în fișierul date.out.
13) Fișierul date.in conține un șir de caractere. Elaborați un program care va determina numărul
de cifre din șir. Rezultatul va fi afișat la ecran cât și în fișierul date.out.
14) Fișierul date.in conține un șir de caractere. Elaborați un program care va înlocui vocalele
din șir cu spațiu. Rezultatul va fi afișat la ecran cât și în fișierul date.out.
15) Fișierul date.in conține un șir de caractere. Elaborați un program care va determina numărul
de caractere speciale (paranteze, operatori aritmetici) din șir. Rezultatul va fi afișat la ecran
cât și în fișierul date.out.
16) În fișierul date.in sunt scrise mai multe numere întregi. Elaborați un program prin
intermediul căruia se vor adăuga numerele pare din fișierul date.in în fișierul date.out.
17) Elaborați un program prin intermediul căruia va fi creat un fișier. Numele fișierului se va
citi de la tastatură. În fișier vor fi scrise toate numerele pare mai mici decât n (n<10000), n
se citește de la tastatură.
18) Elaborați un program prin intermediul căruia va fi creat un fișier. Numele fișierului se va
citi de la tastatură. În fișier vor fi scrise toate numerele impare mai mici decât n (n<10000),
n se citește de la tastatură.
19) Fișierul date.in conține mai multe numere reale (cel puțin 2). Elaborați un program prin
intermediul căruia în acest fișier se va adăuga media aritmetică a ultimelor 2 numere.
20) Fișierul date.in conține mai multe numere reale (cel puțin 2). Elaborați un program prin
intermediul căruia în acest fișier se va adăuga media aritmetică a numerelor din fișier.
21) În fișierul date.in este scris un număr întreg pozitiv mai mic decât 1000. Elaborați un
program care va adăuga în fișier un triunghi:
a) b) c)
4 4 4
1 1234 1
12 123 21
123 12 321
1234 1 4321

22) În fișierul date.in sunt scrise mai multe cuvinte, fiecare cuvânt este separat printr-un singur
spațiu. Elaborați un program prin intermediul căruia se va afișa la ecran conținutul
fișierului, cel mai lung cuvânt și cel mai scurt cuvânt.
23) Să se creeze un fișier care va conține informații (denumirea și prețul) la o listă de produse
alimentare.
a) Să se afișeze denumirea produselor cu cel mai mic preț;
b) Fiind dat un preț, să se afișeze denumirile produselor cu acest preț;
c) Să se afișeze lista produselor în ordinea lexicografică a denumirii lor;
d) Să se afișeze lista produselor în ordinea descrescătoare a prețurilor;
e) Să se păstreze lista ordonată în c) într-un alt fișier;
f) Să se insereze în fișierul creat în e) un nou produs dat respectând ordinea.
24) Să se creeze un fișier care va conține informații (numele, prenumele, anul nașterii, salariul,
sexul) despre angajații unei întreprinderi.
a) Să se afișeze lista angajaților de sex feminin;
b) Să se calculeze salariul mediu al unui angajat;
c) Să se afișeze lista persoanelor cu salariul mai mic decât cel mediu;
d) Fiind date numele și prenumele unui angajat, să se afișeze toată informația despre acest
angajat;
e) Să se păstreze în alt fișier conținutul fișierului original, în ordinea lexicografică a
numelui, prenumelui;
f) Să se creeze în fișierul creat în e) un nou angajat respectând ordinea.
25) Se dă un fișier text în care fiecare rând reprezintă 2 numere naturale separate printr-un
spațiu. Să se creeze un alt fișier, ce inserează între cele 2 numere ale fiecărui rând media
aritmetică a acestor numere.
Exemplu: Fișierul de intrare:

28 24
10 15
4 71
Fișierul de ieșire:
28 26 24
10 12,5 15
4 37,5 71
26) Se dă un fișier text în care fiecare rând conține cel mult 255 de caractere. Să se construiască
un alt fișier, care nu va conține rândurile de lungime maximală ale primului fișier.
27) Se dă un fișier text în care fiecare rând conține cel mult 255 de caractere. Să se afișeze
cuvântul (eventual cuvintele) care se repetă de cele mai multe ori.
28) a) Se dă un fișier text în care fiecare rând conține cel mult 255 de caractere și care reprezintă
un șir de numere naturale separate printr-un spațiu. Să se afișeze pentru fiecare rând textul
”DA” sau ”NU”, în funcție de faptul dacă șirul este sau nu ordonat crescător.
b) Se dă un fișier text în care fiecare rând conține cel mult 255 de caractere și care reprezintă
un șir de numere naturale separate printr-un spațiu. Să se afișeze pentru fiecare rând textul
”DA” sau ”NU”, în funcție de faptul dacă șirul este sau nu ordonat descrescător.
Subprograme

1) Să se definească o funcție pentru calcularea factorialului și să se calculeze cu ajutorul ei


combinări din n elemente luate câte m. Numerele naturale m și n sunt date. Formula de
calcul:
𝒏!
𝑪𝒎
𝒏 = .
𝒎! (𝒏 − 𝒎)!
2) Definind funcția-putere, să se calculeze valoarea expresiei:
𝑆 = 1 + 0,52 + 0,54 + 0,56 + 0,58 .
3) Să se definească funcțiile max(a, b) și min(a, b), care returnează respectiv cel mai mare și
cel mai mic dintre numerele reale a și b, apoi să se calculeze valoarea expresiei:
a) S=max(min(𝑎1 , 𝑎2 ),max(𝑎3 , 𝑎4 ))+min(max(𝑎5 , 𝑎6 ),min(𝑎7 , 𝑎8 )), unde 𝑎1 , 𝑎2 , … , 𝑎8
sunt numere reale date;
b) T=min(𝑎1 , 𝑎2 )+min(𝑎3 , 𝑎4 )+...+min(𝑎9 , 𝑎10 )+max(𝑎1 , 𝑎2 )+max(𝑎3 , 𝑎4 )+...+max(
𝑎9 , 𝑎10 ) unde 𝑎1 , 𝑎2 , … , 𝑎10 sunt numere reale date.
4) Se dă o mulțime de puncte în plan. Să se calculeze cea mai mică distanță dintre oricare 2
puncte posibile.
5) a) Să se descrie o funcție care va returna numărul de divizori proprii ai numărului natural
dat (divizorii proprii sunt diferiți de 1 și de numărul dat).
b) Utilizând funcția din a), să se afișeze numerele naturale mai mici decât 10 000, care au
exact n divizori proprii, unde n este un număr natural dat mai mic decât 20.
6) De la tastatură se citește un număr întreg n, n<100 000. Elaborați un program cu funcții
prin intermediul căruia se va determina:

a) Numărul de cifre;
b) Numărul de cifre pare;
c) Numărul de cifre impare;
d) Suma cifrelor;
e) Cifra maximă;
f) Cifra minimă;
g) Media aritmetică a cifrelor;
h) Cifrele care se repetă de cel puțin două ori;
i) Cifrele numărului separate printr-un sigur spațiu;
j) Divizorii numărului;
k) Inversul numărului;
l) Mesajul ”PRIM”, dacă numărul este număr prim;
m) Cel mai mare număr posibil creat din aceste cifre.
7) De la tastatură se citesc două numere întregi. Elaborați un program cu funcții prin
intermediul căruia se va determina:

a) Suma numerelor;
b) Produsul numerelor;
c) Media aritmetică a numerelor;
d) Cel mai mare divizor comun;
e) Cel mai mic multiplu comun;
f) Numărul minim;
g) Numărul maxim;
h) Suma numerelor în formatul a+b=c, dacă a și b reprezintă numerele citite;
i) Produsul numerelor în formatul a*b=c, dacă a și b reprezintă numerele citite;
j) Toți divizorii comuni;
k) Cinci multipli comuni;
l) Cifrele care se conțin în ambele numere;
m) Cifrele care sunt în primul număr și nu sunt în al doilea număr;
n) Va afișa mesajul ”PRIETENE”, dacă numerele sunt prietene. Două numere se numesc
prietene, dacă numărul de divizori este același.
8) De la tastatură se citesc trei numere întregi. Elaborați un program cu funcții prin
intermediul căruia:

a) Se va determina cel mai mare divizor comun al numerelor;


b) Se va determina cel mai mic multiplu comun al numerelor;
c) Se va determina valoarea maximă;
d) Se va determina valoarea minimă;
e) Se vor afișa toți divizorii comuni;
f) Se vor afișa cei mai mici trei multipli comuni.
g) Se va verifica dacă numerele citite pot fi lungimile laturilor unui triunghi;
g.1. Se va determina aria triunghiului, dacă valorile citite pot forma un triunghi;
g.2.Se va determina perimetrul triunghiului, dacă valorile citite pot forma un triunghi;
h) Se vor afișa soluțiile reale ale ecuației 𝑎𝑥 2 + 𝑏𝑥 + 𝑐 = 0 dacă a, b, c reprezintă
coeficienții ecuației.
9) De la tastatură se citesc două numere întregi. Pentru fiecare dintre următoarele cazuri să se
creeze câte o procedură, prin intermediul căreia se va determina:

a) Suma numerelor;
b) Produsul numerelor;
c) Media aritmetică a numerelor;
d) Cel mai mare divizor comun;
e) Cel mai mic multiplu comun;
f) Numărul minim;
g) Numărul maxim.
10) Se consideră tipul de date timp (ora:min:sec). Elaborați un program prin intermediul căruia
se va crea câte o procedură pentru:

a) Citirea timpului de la tastatură;


b) Afișarea timpului la ecran, în formatul ora:min:sec, dacă 0≤sec≤59 și 0≤min≤59.
c) Determinarea sumei dintre cele două variabile de tipul timp;
d) Determinarea diferenței dintre cele două variabile de tipul timp;
e) Determinarea valorii maximale;
f) Determinarea valorii minimale;
11) Se consideră tipul de date data (an:luna:zi). Elaborați un program prin intermediul căruia
se va crea câte o procedură pentru:

a) Citirea datei de la tastatură;


b) Afișarea datei la ecran, în formatul an:luna:zi, dacă 1≤zi≤30 și 1≤luna≤12.
c) Determinarea sumei dintre cele două variabile de tipul data;
d) Determinarea diferenței dintre cele două variabile de tipul data;
e) Determinarea valorii maximale;
f) Determinarea valorii minimale;
12) Se consideră tipul de date polinom (𝑎𝑥 2 + 𝑏𝑥 + 𝑐). Elaboraţi un program prin intermediul
căruia se va crea câte o procedură pentru:

a) Citirea coeficienților polinomului de la tastatură;


b) Afișarea polinomului la ecran, în formatul 𝑎𝑥 2 + 𝑏𝑥 + 𝑐, dacă a, b, c reprezintă
coeficienții polinomului.
c) Determinarea sumei dintre cele două polinoame;
d) Determinarea diferenței dintre cele două polinoame;
e) Determinarea polinomului maxim;
f) Determinarea polinomului minim;
g) Determinarea soluțiilor reale ale polinomului.
13) Se dau numerele reale pozitive, a, b, c care sunt lungimile laturilor unui triunghi. Să se
calculeze lungimile medianelor triunghiului.
Indicație: Lungimea medianei corespunzătoare laturii de lungimea a se calculează cu
ajutorul formulei 𝑚𝑎 = 0,5√2𝑏 2 + 2𝑐 2 − 𝑎2 .
14) Se consideră un triunghi cu lungimile laturilor egale cu a, b, c, - numere reale. Pentru
fiecare dintre următoarele cazuri să se creeze câte o procedură, prin intermediul căreia:
a) Se va citi de la tastatură lungimile laturilor;
b) Se va determina dacă valorile a, b și c au fost introduse corect (pot forma un triunghi),
în caz contrar se va repeta operația de citire, până când valorile nu vor fi introduse
corect;
c) Se va determina aria și perimetrul triunghiului;
d) Se va afișa tipul triunghiului (ascuțit, drept, obtuz).
15) Se dau numerele reale pozitive, a, b, c care sunt lungimile laturilor unui triunghi. Să se
calculeze înălțimile triunghiului.
ℎ𝑎 ∗𝑎
Indicație: Să se utilizeze formula 𝐴 = , unde A este aria triunghiului, iar ℎ𝑎 – înălțimea
2

corespunzătoare laturii a.
16) Să se descrie o funcție care va returna valoarea true, dacă numărul natural dat este prim,
altfel – valoarea false. Utilizând funcția de mai sus, să se afișeze toți divizorii primi ai
numărului natural dat n.
17) Se dă un vector cu n (1<n<100) componente numere întregi. Să se afle:
a) cel mai mare divizor comun (CMMDC) al componentelor vectorului.
Indicație: CMMDC(𝑎1 , 𝑎2 , … , 𝑎𝑛 )=CMMDC(𝑎𝑛 , 𝐶𝑀𝑀𝐷𝐶(𝑎1 , 𝑎2 , … , 𝑎𝑛−1 ))
b) cel mai mic multiplu comun (CMMMC) al componentelor vectorului.
Indicație: CMMMC(𝑎1 , 𝑎2 , … , 𝑎𝑛 )=CMMMC𝑎𝑛 , 𝐶𝑀𝑀𝑀𝐶(𝑎1 , 𝑎2 , … , 𝑎𝑛−1 )
18) Să se definească o funcție care determină dacă un număr natural dat este pătrat perfect.
Utilizând această funcție, să se determine care dintre componentele unui vector dat de
numere naturale sunt pătrate perfecte.
19) Să se definească un subprogram care va efectua:
a) adunarea a două fracții;
b) înmulțirea a două fracții;
c) simplificarea unei fracții până la o fracție ireductibilă;
d) compararea a două fracții.
20) Să se definească un subprogram care va:
a) aduna două numere complexe;
b) înmulți două numere complexe;
c) împărți două numere complexe;
d) calcula modulul unui număr complex;
e) ridica la putere un număr complex.
21) Să se definească un subprogram care va:
a) aduna două matrice pătrate;
b) înmulți două matrice pătrate;
c) calcula transpusa unei matrice pătrate;
d) calcula inversa unei matrice pătrate.
22) Să se definească un subprogram care va:
a) aduna măsurile a două unghiuri (exprimate în grade, minute, secunde);
b) scădea măsurile a două unghiuri;
c) înmulți măsura unui unghi cu un număr natural;
d) împărți cu rest măsurile a două unghiuri;
e) compara măsurile a două unghiuri.
23) Să se definească un subprogram care va:
a) aduna două intervale de timp (exprimate în secunde, minute, ore, zile, săptămâni);
b) scădea două intervale de timp;
c) înmulți un interval de timp cu un număr natural;
d) împărți cu rest două intervale de timp;
e) compara două intervale de timp.
24) Să se definească un subprogram care va.
a) aduna o dată calendaristică (o dată calendaristică este exprimată de un triplet de forma
(zi, luna, an)) cu un număr de zile, rezultatul fiind o dată calendaristică;
b) aduna o dată calendaristică cu un număr de luni, rezultatul fiind o dată calendaristică;
c) scădea dintr-o dată calendaristică un număr de zile, rezultatul fiind o dată
calendaristică;
d) scădea dintr-o dată calendaristică un număr de luni, rezultatul fiind o dată
calendaristică;
e) scădea două date calendaristice, rezultatul fiind numărul de zile dintre aceste date.
25)
a) Să se scrie o funcție care va efectua adunarea a două numere naturale, al cărei rezultat
poate avea până la 255 de cifre.
b) Utilizând funcția din a), să se realizeze un program pentru înmulțirea unui număr
natural cu un număr mai mic decât 100, al cărei rezultat poate avea până la 255 de cifre.
26) Să se descrie o funcție care va efectua înmulțirea a două numere naturale, fiecare conținând
până la 100 de cifre.
27) Să se descrie o funcție care va efectua împărțirea (exactă sau cu rest) a unui număr ce
conține până la 255 de cifre la un număr mai mic decât 1000.
28) Să se efectueze adunarea, scăderea și înmulțirea a două numere date într-o bază dată,
diferită de 10. Rezultatul se va afișa în aceeași bază.
Indicație. Se pot utiliza două funcții: una pentru conversia în sistemul zecimal, alta – din
sistemul zecimal.
29) Se dă numărul natural n. Să se determine al n-lea termen din șirul Fibonacci:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
De exemplu, pentru n = 8 se va afișa 21.
30) Să se definească un program care va calcula derivata unui polinom de o nedeterminată.
Pentru reprezentarea polinomului să se utilizeze tipul string.
Exemplu: ‘3*x^4-12*x^3+125*x-39’ reprezintă polinomul 3𝑋 4 − 12𝑋 3 + 125𝑋 − 39.
31) Ipotezele lui Goldbach.
a) Să se reprezinte fiecare număr par mai mare sau egal cu 6 și mai mic decât 1000 ca
sumă a două numere prime impare.
Exemplu: 100 = 97 + 3 = 89 + 11 = 71 + 29 = ...
b) Să se reprezinte fiecare număr natural mai mare decât 1 și mai mic decât 1000 ca sumă
a cel mult trei numere prime.
32) Să se descrie o funcție care va efectua împărțirea cu rest a două numere naturale, fiecare
fiind compus din cel mult 255 de cifre.
33) Formulele lui Ramanujan.
Să se calculeze:

a) √1 + 2√1 + 3√1 + 4√1 + ⋯

Să se compare rezultatul cu 3.


b) 8 − √8 + √8 − √8 − √8 + √8 − ⋯, unde semnele rădăcinilor se repetă în grup

câte trei: -,+,-.


Să se compare rezultatul cu 1 + 2√3 sin 20°

c) √11 − 2√11 + 2√11 − 2√11 − 2√11 + ⋯, unde semnele rădăcinilor se repetă în

grup câte trei: -,+,-.


Să se compare rezultatul cu 1 + 4 sin 10°.

d) √23 − 2√23 + 2√23 + 2√23 − 2√23 + ⋯, unde semnele rădăcinilor se repetă în

grup câte trei: -,+,+.


Să se compare rezultatul cu 1 + 4√3 sin 20°.

34) Se dau numerele naturale b și n, unde 1<b<10. Să se definească un subprogram care va:
a) verifica dacă un număr dat este scris corect în sistemul de numerație cu baza b;
b) aduna două numere scrise în sistemul de numerație cu baza b;
c) scădea două numere scrise în sistemul de numerație cu baza b;
d) înmulți două numere scrise în sistemul de numerație cu baza b;
e) împărți două numere scrise în sistemul de numerație cu baza b;
f) transforma un număr din sistemul de numerație cu baza b în sistemul zecimal de
numerație;
g) transforma un număr din sistemul zecimal de numerație în sistemul de numerație cu
baza b.
35) Problema lui Fermat. Să se găsească un număr, astfel încât suma cubului numărului și
divizorilor proprii ai numărului să fie pătrat perfect.
36) Se dau coordonatele a n (3<n<50) puncte din plan. Definind o funcție care determină dacă
3 puncte sunt sau nu coliniare, să se determine dacă fiecare 3 din cele n puncte sunt
necoliniare.
37) Se consideră un tablou unidimensional. Elaborați un program cu funcții/proceduri prin
intermediul cărora:
a) De la tastatură se vor citi elementele tabloului;
b) Se vor afișa elementele tabloului la ecran;
c) Se vor sorta elementele crescător;
d) Se vor inversa elementele tabloului;
e) Va fi determinat elementul maximal;
f) Va fi determinat elementul minimal;
g) Se va determina numărul de elemente maximale;
h) Se va determina numărul de elemente minimale.
38) Se consideră două tablouri cu numere întregi, a și b. Elaborați un program utilizarea
funcțiilor/procedurilor prin intermediul cărora:
a) De la tastatură se citesc elementele tablourilor;
b) Se afișează la ecran elementele tablourilor;
c) Va determina suma elementelor fiecărui tablou;
d) Va determina diferența elementelor fiecărui tablou;
e) Va crea un nou tablou care va conține toate elementele tabloului a și b;
f) Va crea un nou tablou format doar din elementele comune ambelor tablouri.
39) Se consideră un tablou bidimensional cu numere întregi. Elaborați un program cu
funcții/proceduri prin intermediul cărora:
a) De la tastatură se vor citi elementele tabloului;
b) Se vor afișa elementele tabloului la ecran;
c) Va fi determinat elementul maximal;
d) Va fi determinat elementul minimal;
e) Se va determina numărul de elemente maximale;
f) Se va determina numărul de elemente minimale;
g) Se vor afișa sumele pe linii;
h) Se vor afișa sumele pe coloane;
i) Se vor sorta elementele crescător pe linii;
j) Se va determina suma elementelor de pe perimetrul tabloului.
40) Se consideră un șir de caractere. Elaborați un program cu funcții/proceduri, prin
intermediul căruia:
a) Se va determina dacă șirul este palindrom;
b) Se vor afișa doar vocalele din șir;
c) Se vor afișa doar cifrele din șir;
d) Se va determina numărul de cuvinte din șir;
e) Se vor sorta crescător elementele șirului;
f) Se va inversa șirul;
g) Se va determina cuvântul de lungime minimă;
h) Se va determina cuvântul de lungime maximă;
i) Se va inversa fiecare cuvânt din șir.
41) Elaborați un program prin intermediul căruia vor fi create proceduri pentru conversia
numerelor în șir de caractere și invers:
a) Procedură pentru transformarea șirului în număr întreg, dacă șirul conține doar cifre;
b) Procedură pentru transformarea unui număr întreg în șir;
c) Procedură pentru transformarea șirului în număr real, dacă șirul conține doar cifre și
caracterul punct;
d) Procedură pentru transformarea unui număr real în șir.
Recursia

1) De la tastatură se citește un număr întreg. Elaborați un subprogram recursiv, prin


intermediul căruia se va determina valoarea expresiilor:
a) 1 + 3 + 5 + ⋯ + 2𝑛 − 1;
b) 2 + 4 + 6 + ⋯ + 2𝑛;
c) 2 + 5 + 8 + ⋯ + 3𝑛 − 1;
d) 1 + 5 + 9 + ⋯ + 4𝑛 − 3;
1 1 1 1
e) + 7 + 12 + ⋯ + 5𝑛−3 ;
2
1 1 1 1
f) + 8 + 13 + ⋯ + 5𝑛−2 ;
3
1 1 1 1 1
g) − + − + − ⋯ + (−1)𝑛 .
2 4 8 16 2𝑛

2) Să se calculeze coeficienții binomiali 𝐶1𝑛 , 𝐶𝑛2 , 𝐶𝑛𝑛 obținuți în urma dezvoltării unui binom
la puterea n (n > 2), știind că are loc următoarea relație de recurență:
𝑛−𝑘+1
𝐶𝑛𝑘 = 𝐶𝑛𝑘−1 și 𝐶0𝑛 = 1, pentru orice 1 ≤ 𝑘 ≤ 𝑛.
𝑘

3) Se dă numărul natural n. Să se calculeze suma:


a) 2*2+3*4+4*6+5*8+6*10+...+n*2(n-1);
1 2 3 𝑛
b) 𝑆𝑛 = + (3∗5) + (5∗7) + ⋯ + (2𝑛−1)∗(2𝑛+1).
(1∗3)

4) Se citește de la tastatură numărul natural dat n. Folosind un subprogram recursiv, să se


calculeze suma 1 + 2 + ... + n.
𝑛 − 1, 𝑑𝑎𝑐ă 𝑛 > 10
5) Să se calculeze valoarea funcției 𝑓: ℕ → ℕ, 𝑓 = { , pentru
𝑓(𝑓(𝑛 + 2)), 𝑑𝑎𝑐ă 𝑛 ≤ 10
argumentul dat n.
6) Se consideră un tablou unidimensional cu numere întregi. Elaborați un subprogram
recursiv prin intermediul căruia:
a) De la tastatură se citesc elementele acestui tablou unidimensional;
b) Se vor afișa elementele tabloului în ordinea citirii lor;
c) Se vor afișa elementele tabloului în ordine inversă a citirii lor;
d) Va determina suma elementelor;
e) Va determina suma elementelor pare;
f) Va determina suma elementelor impare;
g) Va afișa elementele pare;
h) Va afișa elementele impare;
i) Va verifica existenta numărului k în tablou (k se introduce de la tastatură);
j) Va verifica existenta numerelor pare în tablou.
7) Elaborați un subprogram recursiv prin intermediul căruia:
a) Se va determina produsul dintre două numere întregi prin adunări repetate;
b) Se va determina câtul dintre două numere întregi prin scăderi repetate;
c) Se va determina restul împărțirii dintre două numere întregi prin scăderi repetate.
8) Elaborați un subprogram recursiv, prin intermediul căruia se va determina dacă un număr
întreg, este sau nu număr prim.
9) Să se determine cel mai mare divizor comun a două numere naturale. Să se scrie varianta
recursivă.

a, a  b

CMMDC(a, b)  cmmdc(a  b, b), a  b
cmmdc(a, b  a), b  a

10) Se cere de scris un program, varianta recursivă, pentru calculul șirului de numere
Fibonacci:1,1,2,3,5,8,...21.
11) Să se determine cel mai mare divizor comun a trei numere naturale. Să se scrie varianta
recursivă.

a, a  b

CMMDC(a, b)  cmmdc(a  b, b), a  b
cmmdc(a, b  a), b  a

12) Se cere de scris un program, varianta recursivă, care afișează la ecran suma primelor n
termeni ai șirului de numere: 1,5,9,13,17,...,4n-3,...
0, n  0
S ( n)  
S (n  1)  4 * n  3
13) Este dat șirul de numere 1,6,11,16,21,…. Să se determine suma primelor n numere a
șirului dat. Să se scrie varianta recursivă.
1, n  0
S ( n)  
5 * n  4  S (n  1)
14) Calcularea valorilor a două funcții f(x) și g(x). Să se alcătuiască un program utilizând
recursia indirectă pentru a calcula valorile funcțiilor
 g ( x  1), x  1  f ( x)  1, x  0
f ( x)   și g ( x)  
 x  2, x  1  x, x  0
15) Aplicând recursivitatea indirectă să se determine valorile funcțiilor

 2, x  3


x

 x 1
2
,x  0  2, x  0
x


a( x)  b( x  2),3  x  6 , b( x)  a( x)  5,0  x  5 , c( x)  a( x  1),0  x  5 .
c( x  1), x  6 c(1)  1, x  5 b( x  1), x  5

  

16) Să se alcătuiască un program pentru calcularea funcției Ackerman:

n  1, m  0

Ack (m, n)   Ack (m  1,1), n  0
 Ack (m  1, Ack (m, n  1)), m, n  0

17) Sunt date 2 funcții:

2 2  1, x  5
 x 
 4 5 x  3x  2, x  1
2

f ( x)   x  2,5  x  8 și g ( x)  
3, x  8  x  x  5, x  1
2



De calculat:
a) Compoziția f(g(f(x)));
b) Compoziția g(f(g(x)));
c) Compoziția f(g(f(g(f(x))))).
18) Aplicând recursivitatea indirectă să se determine valorile funcțiilor:

𝑎, 𝑥 = 0 𝑏, 𝑥 = 0
𝐴𝑛 = {𝑎𝑛−1 + 𝑏𝑛−1 + 𝑐𝑛−1 , 𝑥 > 0 𝐵𝑛 = { 3 ,𝑥 > 0
√𝑎𝑛−1 ∗ 𝑏𝑛−1 ∗ 𝑐𝑛−1
3
𝑐, 𝑥 = 0
𝐶𝑛 = {
√𝑎𝑛−1 + 𝑏𝑛−1 + 𝑐𝑛−1 , 𝑥 > 0
19) Se dă numărul natural n, n<65000, și numărul natural b de o cifră. Să se scrie
reprezentarea numărului n în baza b. Să se scrie varianta recursivă.
20) Să se alcătuiască un program pentru calcularea funcției Hermite.

1, n  0

H (n, x)  2 x, n  1
2 x * H (n  1, x)  2(n  1) * H (n  2, x)), n  2

21) Să se alcătuiască un program pentru calcularea funcției Cebîșev.

1.n  0

T (n, x)  2 x, n  1
2 x * T (n  1, x)  T (n  2, x), n  2

22) Să se alcătuiască un program pentru calcularea funcției Manna Pnueli.

 x  1, x  12
F ( x)  
F ( F ( x  2)), x  12
23) Să se alcătuiască un program recursiv pentru calcularea polinoamelor Legendre definite
prin relațiile:
1
𝐿0 (𝑥) = 1, 𝐿1 (𝑥) = 𝑖 [(2𝑖 − 1)𝑥𝐿𝑖−1 (𝑥) − (𝑖 − 1)𝐿𝑖−2 (𝑥)], unde i=2, …, n.
24) Se dă un număr natural n. Se cere să se elaboreze un program recursiv care ne va genera
toate partițiile numărului n.

25) Se dă numărul natural n. Să se calculeze valorile funcțiilor 𝑓, 𝑔: ℕ → ℕ, în n, dacă


a) f(0) = 1, f(1) = 2;
b) g(0) = 3, g(1) = 4;
c) f(x) = f(x - 1) + g(x - 1) ;
d) g(x)=2g(x-1)+3f(x-1), pentru orice număr natural x >1.
26) Se dă un fișier text cu numere naturale, după care urmează un număr întreg negativ.
Folosind un subprogram recursiv, să se calculeze suma numerelor naturale din fișier.
27) Se dă numărul natural n. Să se genereze toate submulțimile mulțimii {1, 2, …, n}.
28) Se dă o matrice pătrată A(n, n) de numere întregi. Să se calculeze determinantul matricei,
utilizând formula descompunerii după prima linie:
a) det 𝐴 = ∑𝑛𝑖=1(−1)𝑖+1 𝑎𝑖1 ∗ det 𝐵𝑖 ,
b) Unde Bi este matricea obținută din A eliminând prima linie și coloana i.
29) Se dă numărul natural n. O persoană trebuie să urce o scară cu n trepte. Știind că la
fiecare pas persoana poate să urce una sau două trepte (evident, consecutive), să se
determine numărul de moduri în care persoana poate urca scara.
30) Fie n localități notate cu numerele 1, 2, ..., n. Între fiecare două dintre aceste localități
există sau nu drum. În cazul în care există, se știe și lungimea drumului. Fiind date două
localități, să se determine dacă se poate ajunge dintr-o localitate în alta și să se determine
drumul de lungime minimă dintre aceste localități.
31) Fie dat numărul natural n. Să se genereze toate permutările din n elemente a mulțimii
A={1,2,3,…, n}.
Se numesc permutări ale unei mulțimi A cu n elemente toate mulțimile ordonate care se
pot forma cu cele n elemente ale lui A. Pentru n ∈ N*, avem Pn = 1*2*3*...*n=n!
32) Să se genereze aranjamentele din n luate câte k a mulțimii A={1,2,… n}. 𝐴𝑚
𝑛 =
𝑛!
𝑛(𝑛 − 1) … (𝑛 − 𝑚 + 1) = (𝑛−𝑚)! , 𝑛 ≥ 𝑚

33) Să se genereze combinări din n elemente luate câte m. Numărul combinărilor a n


elemente luate câte m este calculată cu formula:
n!
Cnm =
m! (n − m)!
34) Fiind dată o hartă cu n țări, se cer toate soluțiile de colorare a hărții aplicând cel mult 4
culori, astfel încât două țări cu frontiera comună să fie colorate diferit.

Exemplu:
Țara 1 este vecină cu țările 2 și 4.
Țara 2 este vecină cu țările 1,3,4 și 5.
Țara 3 este vecină cu țările 2,4 și 5.
Țara 4 este vecină cu țările 2 și 5.
Țara 5 este vecină cu țările 2,3 și 4.
O soluție ar fi:
1 2 1 3 4
35) Se dă un labirint sub formă de matrice cu m linii și n coloane. Fiecare element al matricei
reprezintă o cameră a labirintului. Într-una din camere, de coordonate x și y se găsește un
om. Se cere să se găsească toate ieșirile din labirint.

36) Se consideră n orașe numerotate de la 1 la n. Un comis-voiajor trebuie să-și prezinte


produsele în cele n orașe fără a trece de două ori prin același oraș cu condiția să se
întoarcă în orașul de start. Între orașe poate exista drum direct sau nu. Să se determine
toate rutele posibile pe care poate să se deplaseze comis-voiajorul.
37) Considerându-se o tablă de șah de dimensiune n x n, să se determine toate modalitățile de
amplasare a n regine pe tabla de șah astfel încât să nu se atace reciproc (două regine se
atacă dacă se află pe aceeași linie, coloană, sau diagonală).

Structuri dinamice de date

1) Prin intermediul structurilor dinamice de date, creați tipul de date telefon cu câmpurile:
marca, culoare, anul fabricării, prețul. În baza acestui tip elaborați un program prin
intermediul căruia se va gestiona datele despre telefoanele mobile (minim 10 telefoane).
Citirea datelor se va efectua din fișier. Programul va conține un meniu cu următoarele
opțiuni:
a) Afișarea tuturor telefoanelor;
b) Afișarea celor mai noi telefoane;
c) Afișarea celor mai scumpe telefoane;
d) Căutarea telefoanelor după marcă;
e) Căutarea telefoanelor după preț, cu indicarea prețului minim și maxim;
f) Sortarea telefoanelor descrescător după anul fabricării;
g) Sortarea telefoanelor crescător după marcă;
h) Inserare datelor despre un telefon nou;
i) Excluderea unui telefon.
2) De la tastatură se citesc cuvinte. Să se creeze o listă simplu înlănțuită ordonată alfabetic,
care conține în celule cuvintele distincte și frecvența lor de apariție. Se va afișa conținutul
listei în ordine alfabetică
3) De la tastatură se citesc mai multe numere întregi. Să se creeze o listă ordonată crescător.
4) De la tastatură se citește numărul n și numele a n copii. Să se simuleze următorul joc: cei
n copii stau într-un cerc. Începând cu un anumit copil, se numără copiii în sensul acelor de
ceasornic. Fiecare al n-lea copil iese din cerc. Câștigă ultimul copil rămas în joc.
5) Se consideră un depou de locomotive cu o singură intrare și cu o singură linie de cale ferată,
care poate cuprinde oricâte locomotive. Să se scrie programul care realizează
dispecerizarea locomotivelor din depou. Programul prelucrează comenzi de intrare în
depou a unei locomotive, de ieșire din depou a unei locomotive și de afișare a
locomotivelor din depou.
6) De la tastatură se citesc cuvinte (șiruri de caractere). Să se scrie un program care creează
un arbore de căutare, care conține în noduri cuvintele și frecvența lor de apariție. Să se
afișeze apoi cuvintele în ordine lexicografică crescătoare și frecvența lor de apariție.
7) Informațiile pentru medicamentele unei farmacii sunt: nume medicament, preț, cantitate,
data primirii, data expirării. Evidenta medicamentelor se tine cu un program care are drept
structură de date un arbore de căutare după nume medicament. Să se scrie programul care
execută următoarele operații:
a) creează arborele de căutare;
b) caută un nod după câmpul nume medicament și actualizează câmpurile de informație;
c) tipărește medicamentele în ordine lexicografică;
d) elimină un nod identificat prin nume medicament;
e) creează un arbore de căutare cu medicamentele care au data de expirare mai veche
decât o dată specificată de la terminal.
8) Se consideră o listă unidirecțională câmpul informațional al fiecărei celule conține un
număr real. Scrieți un program care ar adăuga între oricare două celule vecine a listei
inițiale celule noi, câmpul informațional al cărora va fi media aritmetică a numerelor din
celulele vecine.
Ieșire: La ecran se afișează valorile câmpurilor informaționale ale celulelor listei
modificate.
9) Să se creeze o listă din 100 de numere aliatoare întregi.
a) Să se determine prin parcurgerea listei suma numerelor pozitive;
b) Să se afișeze numerele în ordinea inversă generării;
c) Să se afișeze numerele în ordinea generării.
10) Utilizând o stivă, să se afișeze descompunerea zecimală a unui număr întreg dat n.
Exemplu: pentru n=-345 se va afișa n=-3*10^2+4*10+5
11) Să se creeze o listă ce va conține numele, vârsta și telefonul a 10 persoane.
a) Să se afișeze la ecran primele 5 persoane din listă;
b) Să se afișeze la ecran persoanele de pe pozițiile pare din listă;
c) Să se afișeze la ecran persoanele cu vârsta mai mare de 20 de ani;
d) Să se determine poziția în listă a persoanei cu numele dat.
12) Pentru fiecare student dintr-o grupă se știe numele și 3 note la o sesiune
a) Să se creeze lista studenților în ordinea lexicografică a numelui;
b) Să se creeze lista studenților în ordinea descrescătoare a notei medii;
c) Să se creeze lista studenților cu nota medie mai mare decât 5 în ordinea lexicografică
a numelui;
d) Să se elimine restanțierii din lista creată în b).
13) Se citesc de la tastatură două șiruri de numere întregi mai mici decât 1000 până când se
citește un alt fel de număr și se formează două liste-mulțimi.
a) Să se afișeze mulțimile;
b) Să se afișeze reuniunea și intersecția mulțimilor din a).
14) Se citesc de la tastatură două șiruri de numere întregi. Sfârșitul fiecărui șir este marcat prin
prezența pe poziția i a numărului i.
a) Să se formeze al treilea șir format din elementele primelor două șiruri;
b) Să se ordoneze crescător elementele șirului al treilea.
15) Se dă un fișier text.
a) Să se formeze lista cuvintelor din text în ordinea alfabetică;
b) Să se calculeze numărul cuvintelor de lungime maximală.
16) Se consideră o listă de cuvinte. Să se scrie un subprogram:
a) pentru inserarea unui cuvânt la începutul listei;
b) pentru inserarea unui cuvânt la sfârșitul listei;
c) pentru verificarea existenței unui cuvânt în listă;
d) pentru ștergerea unui cuvânt din listă.
17) Să se genereze 2 liste de numere întregi
a) Să se creeze a treia listă formată din numerele care se întâlnesc doar în una dintre
primele două liste;
b) Să se creeze a treia listă concatenând primele două liste și ordonând crescător
componentele ei.
18) Se dau două liste de numere întregi
a) Să se scrie un subprogram care verifică dacă listele sunt egale;
b) Să se scrie un subprogram care verifică dacă o listă se conține în alta;
c) Să se scrie o funcție care returnează numărul de componente comune ale listelor.
19) Funcția OFS(v) returnează numărul de octeți ce reprezintă adresa variabilei v, relativ de
segmentul în care se află ea. Se dă o matrice de numere întregi. Să se arate că elementele
matricei A(m, n) se scriu în memorie în ordinea:
a11, a12, ..., a1n, a22, ..., a2n, ..., amn
20) Se dă un fișier text. Să se afișeze ”răsturnatul” conținutului fișierului.
21) Se dă o listă de numere întregi. Să se scrie un subprogram care din lista dată formează două
liste: una formată din numerele negative, alta – din celelalte numere.
22) Un polinom de o singură nedeterminată se poate reprezenta printr-o listă, unde fiecare
celulă a listei este un monom al polinomului. Să se realizeze un algoritm ce efectuează:
a) adunarea a două polinoame;
b) scăderea a două polinoame;
c) înmulțirea a două polinoame.
23) Un număr natural mare poate fi reprezentat printr-o listă, unde fiecare celulă a listei conține
o cifră a numărului. Să se realizeze un algoritm care va efectua:
a) adunarea a două numere naturale mari date;
b) scăderea a două numere naturale mari date;
c) înmulțirea a două numere naturale mari date.
24) Să se realizeze un algoritm care va efectua înmulțirea a două polinoame de mai multe
nedeterminate. Polinoamele se vor citi din fișiere text.
25) Din fișierul date.in se citește un număr natural k și apoi de pe a doua linie numere întregi.
Construiți o listă liniară simplu înlănțuită care să conțină numerele întregi citite în ordinea
din fișier.
Permutați lista cu k poziții spre stânga și afișați valorile din listă.
Indicație: se vor scrie și folosi funcții pentru adăugarea unei valori la sfârșitul listei și
pentru ștergerea primului nod al listei și vor fi folosite pentru permutarea cerută.
Exemplu:
date.in
3
1 2 3 4
date.out
4123
26)
a) Să se creeze o LLDI care să memoreze numere întregi citite dintr-un fișier text;
b) Să se scrie o funcție care primește ca parametru adresa primului nod al listei și o
afișează în ambele sensuri;
c) Să se scrie o funcție care primește ca parametru adresa p a unui nod și un număr natural
x și adaugă după nodul indicat de p un nod care să conțină valoarea x;
d) Să se scrie o funcție care primește ca parametru adresa p a unui nod și șterge nodul
indicat de p;
e) Folosind funcțiile de punctele b), c) și d) să se adauge după nodul al doilea un nod cu
informația 7, să se șteargă al treilea nod și apoi primul nod și să se afișeze lista în
ambele sensuri după fiecare dintre aceste operații.
27) Să se creeze o listă liniară dublu înlănțuită cu noduri care să conțină:
- câmpul info număr întreg de maxim 4 cifre;
- câmpurile prec și urm care să conțină informații de legătură spre nodul anterior,
respectiv următor din listă.
a) Să se afișeze lista în ambele sensuri;
b) Să se șteargă toate nodurile din lista cu excepția primului și a ultimului nod.
28)
a) Să se creeze o listă liniară simplu înlănțuită care să memoreze următoarele informații
despre elevii unei clase formată din n elevi:
- numele (șir de maxim 20 de caractere)
- prenumele (șir de maxim 20 de caractere)
- 3 note într-un vector cu 3 componente reale
b) Să se afișeze numele, prenumele și media fiecărui elev;
c) Să se scrie o funcție care calculează și returnează media clasei.
29) Se consideră o listă liniară dublu înlănțuită în ale cărei noduri sunt memorate cifre. Să se
scrie o funcție care primește ca parametru adresa primului nod al listei și verifică dacă
numărul care se compune din cifrele memorate în listă în ordine este sau nu palindrom.

Arbori Binari
1) Se citește un arbore cu n vârfuri dat prin vectorul TATA.
a) Să se afișeze muchiile arborelui; 2
b) Să se construiască și să se afișeze matricea de adiacență a
arborelui. 1 3
Exemplu: Pentru vectorul TATA 2 0 2 1 3 se vor afișa
muchiile [1,2] [2,3] [1,4] [3,5] și matricea de adiacență:
4 5
01010
10100
01001
10000
00100
2) Se citește un arbore cu n vârfuri dat prin vectorul muchiilor și apoi se citește vârful
rădăcină. Să se construiască și să se afișeze vectorul TATA.
Exemplu: Pentru un arbore cu 5 noduri, cu muchiile [1,2] [2,3] [1,4] [3,5] și rădăcina 2 se
obține vectorul TATA 2 0 2 1 3
2

1 3

4 5

3) Se citește un arbore cu n vârfuri dat prin vectorul muchiilor și apoi se citește vârful
rădăcină. Să se calculeze și să se afișeze numărul de niveluri ale arborelui.
Exemplu: Pentru un arbore cu 5 noduri și muchiile [1,2] [2,3] [1,4] [3,5] numărul de

2
niveluri este 3.

1 3

4 5
4) Se citește un arbore cu n vârfuri dat prin vectorul TATA.
a) Să se afișeze gradele vârfurilor;
b) Să se afișeze pentru fiecare vârf nivelul pe care se află (numerotarea nivelelor începe
de la 0-rădăcina).

Exemplu: Pentru vectorul TATA 2 0 2 1 3 se vor afișa următorii vectori:


Gradele: 2 2 2 1 1
2
Nivelele: 1 0 1 2 2

1 3

4 5
5) Se citește un graf neorientat cu n vârfuri și m muchii etichetate prin costuri (ponderi)
pozitive. Graful este dat prin vectorul muchiilor. Se cere să se determine un arbore parțial
de cost minim (are suma costurilor muchiilor sale minimă).
6) Din fișierul date.in se citește un număr natural n reprezentând numărul de vârfuri ale unui
arbore binar și apoi vectorii S și D pentru descendenții fiecărui nod din arbore.
a) Să se parcurgă arborele în preordine, inordine și postordine;
b) Să se parcurgă arborele pe nivele;
c) Să se calculeze și să se afișeze înălțimea arborelui.

Exemplu:
date.in
7
2400700
3560000
Se va afișa:
Preordine: 1 2 4 5 7 3 6
Inordine: 4 2 7 5 1 3 6
Postordine: 4 7 5 2 6 3 1
Pe nivele: 1 2 3 4 5 6 7
Adâncimea: 3
7) Arbore parțial de cost minim (cu algoritmul lui Kruskal).
Exemplu:
date.in 351
58 451
123 date.out
132 341
154 351
143 132
236 123
341 *soluția nu este unică
8) Arbore parțial de cost minim (cu algoritmul lui Prim).
Exemplu:
date.in 351
58 451
123 date.out
132 132
154 341
143 351
236 123
341 *soluția nu este unică
9) Se dă un arbore prin vectorul de tip TATA. Calculați și afișați distanța dintre oricare două
vârfuri ale arborelui sub forma unei matrici.
Distanța dintre două vârfuri este egală cu lungimea lanțului care le unește.
Exemplu:
date.in
6
202131
date.out
012131
101222
210313
123042
321404
123240
10) Se citește un număr natural n. Construiți un arbore cu proprietatea că fiecare vârf are
numărul de descendenți direcți cu 1 mai mare decât nivelul pe care se află. Excepție fac
frunzele și nodul pentru care se termină cele n vârfuri.
Astfel, rădăcina (aflată pe nivelul 0) are un singur descendent direct, vârful de pe nivelul
1 are 2, cele de pe nivelul 2 au câte trei, etc.
Arborele va fi reprezentat prin vectorul legăturilor de tip TATA.
Exemplu:
n=15
Vectorul TATA:
012233344455556
11) Se dă un arbore binar cu n noduri prin vectorii de descendenți S și D. Afișați vectorii T și
P (reprezentarea cu legături ascendente de tip TATA și respectiv poziția descendentului:
-1 pentru stânga, 1 pentru dreapta).
Exemplu:
date.in 00
12 00
23 00
45 0 12
06 00
78 date.out
09 0 1 1 2 2 3 4 4 5 6 6 11 (T)
10 11 0 -1 1 -1 1 1 -1 1 1 -1 1 1 (P)
00
12) Se dă un arbore binar cu n noduri prin vectorii de descendenți S și D. Afișați pe rânduri
separate:
- frunzele arborelui;
- vârfurile cu un singur descendent direct;
- vârfurile cu doi descendenți direcți.

Exemplu:
date.in 00
12 00
23 0 12
45 00
06 date.out
78 frunzele: 7 8 9 10 12
09 vârfurile cu un singur descendent: 3
10 11 5 11
00 vârfurile cu doi descendenți: 1 2 4 6
00
13) Se dă un arbore cu n vârfuri având muchiile etichetate cu costuri numere naturale.
Calculați costul între oricare două vârfuri ale arborelui.
Exemplu:
date.in date.out
5 (n) 0 4 5 10 11
1 2 4 (i j cost) 40967
135 5 9 0 15 16
246 10 6 15 0 1
451 11 7 16 1 0
14) Se citește un vector A cu n elemente numere întregi. Plasați indicii 1,2...n într-un arbore
binar astfel încât în urma parcurgerii în inordine a acestuia să se afișeze vectorul A sortat
crescător. Arborele binar va fi reprezentat prin vectorii S și D.
Exemplu:
n=7
A=3 4 1 2 9 0 6
Vectorii S și D rezultați sunt:
S=3 0 6 0 7 0 0
D=2 5 4 0 0 0 0
iar vectorul A sortat:
A=0 1 2 3 4 6 9
15) Se dă o expresie aritmetică în forma poloneză prefixată. Expresia este formată din
operatorii + - / * %, iar operanzii sunt dintr-un singur caracter.
Construiți arborele binar asociat expresiei citite și afișați expresia în forma normală
(infixată).
Exemplu:
/-+*5314+27
în forma normală este (((5*3)+1)-4)/(2+7)
16) Se dă un arbore binar cu n vârfuri prin vectorii S și D. Stabiliți dacă este plin, sau
complet, sau nici unul dintre cazuri.
Exemple:
7 6
23 23
45 45
56 60
00 00
00 00
00 00
00 complet
plin
17) Se dă un număr natural n. Construiți un arbore binar complet cu vârfurile 1,2...n astfel
încât în urma parcurgerii pe nivele să fie afișate valorile 1,2...n.
Se vor afișă vectorii S și D.
Exemplu:
n=8
S=2 4 6 8 0 0 0 0 0
D=3 5 7 9 0 0 0 0 0
18) Se dă un arbore cu n noduri prin vectorul de referințe de tip TATA. Să se determine dacă
arborele poate fi reprezentat ca un lanț.
Exemple:
n=6
T=0 1 1 2 3 2 răspunsul este nu
n=6
t=0 1 1 2 3 5 răspunsul este da
19) Se dau doi arbori cu rădăcină prin doi vectori de tip TATA. Determinați dacă cei doi
arbori cu rădăcină reprezintă același arbore (diferă doar în urma alegerii rădăcinilor
diferite)
Exemplu:
date.in
5
01122
31022
date.out
da
20) În fișierul date.in se dă un arbore binar cu n vârfuri (cel mult 1000) prin vectorii S și D
(pentru fiecare vârf se precizează fiul stâng și apoi cel drept). Să se calculeze și să se
afișeze pentru fiecare vârf v numărul de vârfuri din subarborele care îl are pe v ca
rădăcină.
Exemplu:
date.in 3
6 2
35 1
06 6
00 1
12 1
00
00
date.out
21) În fișierul date.in se dă un arbore binar cu n vârfuri (cel mult 1000) prin vectorii S și D
(pentru fiecare vârf se precizează fiul stâng și apoi cel drept). Să se calculeze și să se
afișeze numărul de nivele ale arborelui și apoi câte vârfuri se află pe fiecare nivel.
Exemplu:
date.in
6
35
06
00
12
00
00
date.out
3
123
22) Se dă un arbore cu n vârfuri (cel mult 99) prin vectorul TATA. Folosind algoritmul
asemănător cu algoritmul Roy-Floyd, determinați și afișați cel mai lung lanț elementar
din arborele citit.
Exemplu:
date.in
8
20252537
date.out
452378
23) Într-o firma sunt n angajați, numerotați de la 1 la n, fiecare angajat având un singur șef
direct, cu excepția directorului, care nu are șef. Ierarhia firmei este dată printr-un vector
de tip TATA. Fiecare angajat al firmei are un salariu dat printr-un număr natural.
Angajații și șeful sunt recompensați astfel: câștigul fiecărui salariat este egal cu salariul
său la care se adaugă media aritmetică a câștigurilor subordonaților săi direcți. Media
aritmetică se rotunjește prin adaos la un număr întreg (de exemplu 5.33 se rotunjește la
6). Angajații care nu au subordonați direcți câștigă doar salariul.
Calculați care este câștigul directorului firmei.
Exemplu:
date.in
8 (numărul de angajați)
4 3 0 3 2 1 2 1 (vectorul TATA)
2 6 4 3 7 3 1 5 (salariul fiecărui angajat)
date.out
14
24) Se dau în fișierul date.in numerele n, p și q unde n este numărul de noduri ale unui arbore
iar p și q sunt noduri din arbore. Apoi se citește vectorul TATA prin care este reprezentat
arborele. Afișați lanțul elementar de la vârful p la vârful q.
Exemplu:
date.in
725
4170771
date.out
2175
25) Să se citească de la tastatură n numere naturale, care se adaugă, pe măsură ce se citesc,
într-o stivă implementată dinamic, apoi să se adauge aceste numere într-un arbore binar
de căutare de unde se vor lista: toate numerele din arbore în preordine, în ordine și în
postordine, toate numerele divizibile cu un număr furnizat de la tastatură, toate pătratele
perfecte și să se calculeze media lor aritmetică.
26) Să se implementeze un arbore unde fiecare nod are maxim 3 copii, aranjați după
următoarea regulă:
- numărul nodului copilului din stânga este mai mic decât jumătate din numărul
nodului rădăcină;
- numărul nodului copilului din mijloc este cuprins între numărul nodului rădăcină
împărțit la 2 și numărul nodului rădăcină;
- numărul nodului copilului din dreapta este mai mare decât numărul nodului rădăcină.
După crearea arborelui de mai sus să se listeze în postordine, în ordine și în preordine
vectorii de parcurgere ai arborelui.
27) Evidenta articolelor dintr-un magazin se tine într-un arbore binar de căutare cu stocurile
articolelor și printr-un arbore binar de căutare cu tranzacțiile efectuate (intrări și ieșiri din
magazin). Pentru fiecare nod din arborele stoc se reține: cod articol (un număr întreg
cuprins între 100 și 999), denumire articol (un text alfabetic și numeric), unitatea de
măsură, un șir de 2 caractere (bc, kg, ml, mp, mc, t, l), preț, cantitate iar pentru fiecare
nod din arborele cu tranzacții se reține: cod tranzacție (1 - intrare articole în gestiune, 2 -
ieșire articole din gestiune (vânzări)), cod articol (un număr întreg cuprins între 100 și
999), denumire articol (un text alfabetic și numeric), unitatea de măsură, un șir de 2
caractere (bc, kg, ml, mp, mc, t, l), preț, cantitate. Gestiunea articolelor din magazin se
ține printr-un meniu de comenzi de forma:
i → intrare articole în magazin;
e → ieșire articole din magazin (vânzări) ;
s → operarea tranzacțiilor în arborele cu stocuri (stoc articol = stoc inițial + intrări
– ieșiri) ;
1 → lista intrărilor în magazin (fizic și valoric);
2 → lista ieșirilor din magazin (vânzările fizice și valorice);
0 → lista stocurilor finale din magazin (fizice și valorice);
d → ștergerea din arborele de stocuri a articolelor care au stocurile epuizate
(zero).
Observație: Pentru toate informațiile tastate se vor face validările necesare.
28) Să se creeze un arbore de căutare pentru n numere complexe, în care fiecare nod va
conține ca informație utilă partea reală și partea imaginară a unui număr complex de
forma x + iy.
- să se parcurgă în postordine, în ordine și în preordine arborele binar creat listându-se
numerele complexe, conjugatele acestora, și modulele lor
- să se listeze numerele complexe care au partea reală nulă
- să se listeze numerele complexe care au partea imaginară nulă
- utilizând o funcție, să se șteargă din arbore numerele complexe care au partea reală și
partea imaginară egală și apoi să se listeze din nou numerele complexe ramase.
29) Elaborați un program care construiește arborele genealogic propriu pe parcursul a trei sau
patru generații. Nodul-rădăcină conține numele, prenumele și anul nașterii, iar nodurile
descendente conțin datele respective despre părinți.
30) Scrieți o funcție recursivă care returnează numărul nodurilor unui arbore binar.
Transcrieți această funcție într-o formă nerecursivă.

Modulul 2„Aplicații ale tehnicilor de programare utilizate în procesul de studiu în baza


limbajelor: Pascal și C/C++”

Tehnica Trierii

1) Se consideră numerele naturale din mulțimea {1, 2, 3, ..., n}. Să se determine toate
elementele acestei mulțimi, pentru care suma cifrelor este egală cu un număr dat m.
2) Se consideră numerele naturale din mulțimea {1, 2, 3, ..., n}, n<100000, n se citește din
fișier. Să se determine toate elementele acestei mulțimi, pentru care suma cifrelor este un
număr impar, divizibil cu trei;
3) Fișierul date.in conține mai multe caractere, să se afișeze cea mai lungă secvență de
caractere identice. Dacă sunt mai multe secvențe, se va afișa prima.
Exemplu: Date de intrare: aabsssdadaaab; Date de ieșire: sss.
4) Se consideră numerele naturale din mulțimea {1, 2, 3, ..., n}, n<100000, n se citește din
fișier. Să se determine toate elementele acestei mulțimi, pentru care suma cifrelor este
divizibilă cu a și cu b, a și b se citesc din fișier.
5) Se consideră mulțimea P={P1,P2,...,Pn} formată din n puncte (2≤n≤30) pe un plan
euclidian. Fișierul date.in conține pe prima linie numărul n, care reprezintă numărul de
puncte din plan pe liniile următoare se regăsesc coordonatele punctelor. Fiecare punct Pj
este definit prin coordonatele sale xj, yj . Elaborați un program care afișează la ecran
coordonatele punctelor Pa, Pb distanța dintre care este maximă. Distanța dintre punctele
Pj, Pm se calculează cu ajutorul formulei:

𝑑𝑗𝑚 = √(𝑥𝑗 − 𝑥𝑚 )2 + (𝑦𝑗 −𝑦𝑚 )2

6) Pe o suprafață plană sunt mai multe puncte, date prin coordonatele lor. Fișierul date.in,
care pe prima linie conține numărul de puncte din plan, iar pe următoarele linii sunt scrise
coordonatele punctelor. Elaborați un program prin intermediul căruia se va determina
numărul maximal de triunghiuri care pot fi formate din aceste puncte cu condiția că:
a) Triunghiurile formate nu se intersectează;
b) Triunghiurile formate sunt înscrise;
c) Triunghiurile formate au un vârf comun.

La ecran se va afișa numărul de triunghiuri.


7) În notația (a)x litera x reprezintă baza sistemului de numerație, iar litera a - un număr scris
în sistemul respectiv. Elaborați un program care calculează, dacă există, cel puțin o
rădăcină a ecuației (a)x = b, unde a și b sunt numere naturale, iar x este necunoscuta.
Fiecare cifră a numărului natural a aparține mulțimii {0, 1,2, ..., 9}, iar numărul b este
scris în sistemul zecimal.
Exemplu: rădăcina ecuației (160)x = 122 este x=8, iar ecuația (5)x=10 nu are soluții.
Estimați complexitatea temporală a programului elaborat.
8) Într-o pușculiță se află N monede de diferite valori cu greutatea totală G grame. Greutatea
fiecărei monede de o anumită valoare este dată în tabelul ce urmează.

Valoarea monedei, lei Greutatea monedei, grame


1 1

5 2
10 3

25 4

50 5

Elaborați un program care determină suma minimă S care ar putea să fie în pușculiță.
9) Elaborați un program care determină câte puncte cu coordonate întregi se conțin într-o
sferă de raza R cu centrul în originea sistemului de coordonate. Se consideră că R este un
număr natural, 1≤R≤30. Distanța d dintre un punct cu coordonatele (x, y, z) și originea
sistemului de coordonate se determină după formula: 𝑑 = √𝑥 2 + 𝑦 2 + 𝑧 2 .

Tehnica Greedy

1) Problema spectacolelor. Într-o sală într-o zi trebuie planificate n spectacole. Pentru


fiecare spectacol se cunoaște intervalul în care se desfășoară: (început, sfârșit). Se cere să
se planifice un număr maxim de spectacole astfel încât să nu se suprapună.
2) Problema rucsacului. O persoană are un rucsac cu care poate transporta o greutate
maximă G. Persoana are la dispoziție n obiecte și cunoaște pentru fiecare obiect greutatea
și câștigul care se obține în urma transportului său la destinație. Se cere să se precizeze ce
obiecte trebuie să transporte persoana în așa fel încât câștigul să fie maxim. Persoana are
posibilitatea să taie obiectele
3) Problema bancomatelor. Scrieți un program, care afișează modalitatea de plată, a unui
bancomat, folosind un număr minim de bancnote, a unei sume întregi S de lei
(S<100000). Plata se efectuează folosind bancnote cu valoarea 1, 5, 10, 50, 100, 200 și
500 de lei. Numărul de bancnote de fiecare valoare se citește din fișierul text date.in, care
conține 7 rânduri, în fiecare din care sunt indicate numărul de bancnote respectiv de 1, 5,
10, 50, 100, 200 și 500 de lei.
4) Suma componentelor prime. Fie A o variabilă indexată, ale cărei componente A(1),
A(2),..., A(n) sunt numere naturale nenule. Să se determine suma componentelor care sunt
numere prime. Atunci când un număr prim se repetă, el va fi luat în considerație o
singură dată.
5) La un concurs de automobilism de la linia de start până la final sunt plasate n stații de
benzină (la diferite distanțe). Având rezervorul plin, mașina unui concurent poate
parcurge cel mult o distanță d (în kilometri). Concurentul dorește să se oprească de cât
mai puține ori și desigur să parcurgă întreg drumul de la punctul de start la cel final.
Descrieți o metodă eficientă pe care trebuie să o aplice concurentul și arătați că strategia
respectivă conduce la o soluție optimă.
6) Memorarea fișierelor pe benzi magnetice. Se consideră n fișiere f1, f2, ..., fn care trebuie
memorate pe o bandă magnetică. Elaborați un program care determină ordinea de
amplasare a fișierelor pe bandă astfel încât timpul mediu de acces să fie minim. Se
presupune că frecvența de citire a fișierelor este aceeași, iar pentru citirea fișierului fi
(i=1, 2, ..., n) sunt necesare ti secunde.
7) Hrubele de la Cricova. După o vizită la renumitele hrube de la Cricova un informatician
a construit un robot care funcționează într-un câmp divizat în pătrățele (fig. 1). Robotul
poate executa doar instrucțiunile SUS, JOS, DREAPTA, STÂNGA, conform cărora se
deplasează în unul din pătrățelele vecine. Dacă în acest pătrat este un obstacol, de
exemplu, un perete sau un butoi, are loc un accident și robotul iese din funcțiune.
1 2 3 4 5 6 7 8 9

1 Robotul

2
Intrare Ieșire
3

Fig. 1. Câmpul de acțiune al robotului

Elaborați un program care, cunoscând planul hrubelor, deplasează robotul prin încăperile
subterane, de la intrarea în hrube la ieșire. Colecția de vinuri fiind foarte bogată, nu se
cere vizitarea obligatorie a tuturor încăperilor subterane.
Datele de intrare: Planul hrubelor este desenat pe o foaie de hârtie liniată în pătrățele.
Pătrățelele hașurate reprezintă obstacolele, iar cele nehașurate - spațiile libere. Pătrățelele
de pe perimetrul planului, cu excepția celor de intrare sau ieșire, sunt hașurate prin
definiție. În formă numerică planul hrubelor este redat prin tabloul A cu m linii și n
coloane. Elementele A[i,j] ale acestui tablou au următoarea semnificație: 0 - spațiu liber;
1 - obstacol; 2 - intrarea în hrube; 3 - ieșirea din hrube. Inițial, robotul se află în pătrățelul
pentru care A[i,j]=2. Fișierul date.in conține pe prima linie numerele m, n separate prin
spațiu. Pe următoarele m linii se conțin câte n numere A[i,j] separate prin spațiu.
Datele de ieșire: Fișierul date.out va conține pe fiecare linie câte una din instrucțiunile
SUS, JOS, DREAPTA, STÂNGA scrise în ordinea executării lor de către robot.
Restricții: 5 ≤ m, n ≤ 100. Timpul de execuție nu va depăși 3 secunde.
Exemplu:
date.in date.out
7 9 SUS
1 1 1 1 1 1 1 1 DREAPTA
1 1 0 0 1 0 0 0 DREAPTA
0 1 1 0 1 0 0 1 DREAPTA
0 1 1 1 0 0 0 1 DREAPTA
0 0 0 1 1 0 1 0 SUS
1 0 1 0 1 1 0 0 SUS
0 0 0 1 0 1 1 2 DREAPTA
1 1 1 1 1 3 1 DREAPTA
JOS
JOS
JOS
Indicații: La fiecare pas selectați din mulțimea {SUS, JOS, DREAPTA, STÂNGA} câte
o instrucțiune în așa fel, încât robotul să se deplaseze numai de-a lungul unui perete.
8) Fiind dată o tablă de șah de dimensiunea n x n și un cal în colțul stânga sus al acesteia, se
cere să se deplaseze calul pe tablă astfel încât să treacă o singură dată prin fiecare pătrat
al tablei. Soluția va fi afișată ca o matrice n x n în care sunt numerotate săriturile calului.

Exemplu: pentru n=11


1 26 85 30 23 28 99 120 21 104 101
84 31 24 27 86 119 22 103 100 121 20
25 2 83 80 29 98 107 118 115 102 105
32 81 34 87 108 79 116 97 106 19 114
3 36 69 82 75 88 109 112 117 96 93
64 33 76 35 70 111 78 95 92 113 18
37 4 63 68 77 74 89 110 57 94 91
40 65 38 71 62 67 56 73 90 17 54
5 44 41 66 49 72 61 58 55 14 11
42 39 46 7 60 51 48 9 12 53 16
45 6 43 50 47 8 59 52 15 10 13
9) Meniuri. La inaugurarea unui restaurant sunt prezente mai multe persoane. Clienții își
aleg din meniul pus la dispoziție câte o specialitate. Dar deocamdată restaurantul a
angajat un singur bucătar care pregătește mâncărurile una după alta, deci clienții nu pot fi
serviți decât pe rând. Presupunând că bucătarul se apucă de lucru după ce s-au strâns
toate comenzile, stabiliți în ce ordine trebuie să pregătească specialitățile, astfel încât
timpul mediu de așteptare a clienților să fie minim.
Date de intrare: Prima linie a fișierului de intrare date.in conține un număr natural n,
reprezentând numărul clienților. Următoarea linie conține n numere întregi, reprezentând
timpul necesar pregătirii mâncărurilor comandate, în ordine, pentru cele n persoane.
Aceste numere vor fi separate prin câte un spațiu.
Date de ieșire: Fișierul de ieșire date.out va conține două linii. Pe prima linie se va scrie
un număr real cu două zecimale, reprezentând timpul mediu de așteptare, iar pe a doua
linie se vor afla n numere, reprezentând numerele de ordine ale persoanelor din
restaurant, în ordinea în care trebuie servite.
Restricții și precizări:
- 1 ≤ n ≤ 1000;
- 1 ≤ t ≤ 100, unde t reprezintă timpul necesar preparării unei specialități de mâncare;
- dacă există mai multe soluții, în fișier se va scrie una singură.

Exemplu:
date.in
5
30 40 20 25 60
date.out
86.00
34125
10) Submulțimi. Se consideră o mulțime având n elemente numere întregi. Să se determine o
submulțime de sumă maximă a acesteia.

Date de intrare: Prima linie a fișierului de intrare date.in conține numărul n, iar pe
următoarea linie se află cele n numere întregi, separate prin câte un spațiu.
Date de ieșire: Fișierul de ieșire date.out va conține o singură linie pe care se vor afla
numerele din submulțimea de sumă maximă, separate prin câte un spațiu.
Restricții și precizări:
- 1 ≤ n ≤ 1000
- Dacă problema are mai multe soluții, în fișier se va scrie una singură.

Exemplu:
date.in
3 6 0 2 7 –3
date.out
3627
11) Stații. Patronul unei companii private de transport în comun a primit de la primăria
orașului aprobarea de a putea folosi o parte din stațiile Regiei Locale de Transport în
Comun. Stațiile disponibile sunt situate de-a lungul arterei principale a orașului. El se
hotărăște să introducă o cursă rapidă care să străbată orașul, de la un capăt la celălalt, pe
artera principală. Pentru început se ocupă de stațiile situate de aceeași parte a drumului.
Patronul are o dilemă: dacă opririle vor fi prea dese, atunci străbaterea orașului va dura
prea mult și va plictisi călătorii, iar dacă stațiile sunt prea rare, călătorii vor fi prea putini.
De aceea, criteriile după care patronul stabilește stațiile în care va opri cursa rapidă sunt:
- Între două stații alăturate să fie cel puțin x metri.
- Numărul total de stații să fie maxim.

Ajutați patronul să aleagă stațiile!


Date de intrare: Vom considera stațiile situate pe aceeași parte a arterei principale
numerotate în ordine, dintr-un capăt până în celălalt cu 1, 2, ..., n. Prima linie a fișierului
de intrare date.in conține un număr natural n, reprezentând numărul de stații situate pe
artera principală. Următoarea linie conține n – 1 numere întregi ai, i = 1, 2, ..., n – 1 cu
semnificația: ai este distanța dintre stația i și stația i + 1. Aceste numere vor fi separate
prin câte un spațiu.
Date de ieșire: Fișierul de ieșire date.out va conține două linii. Pe prima linie se va scrie
un număr întreg k care reprezintă numărul maxim de stații alese de patron, iar pe a doua
linie se vor afla k numere, reprezentând numerele de ordine ale acestor stații. Numerele
vor fi scrise în ordine crescătoare.
Restricții și precizări:
- 1 ≤ n ≤ 1000;
- 1 ≤ ai ≤ 2000, i = 1, 2, ..., n – 1;
- 1 ≤ k ≤ 1000;
- Dacă există mai multe soluții, în fișier se va scrie una singură.

Exemplu:
date.in
10 60
100 50 25 25 50 10 10 80 20
date.out
5
12589
12) Cutii. Al Bundy este în dificultate! Are n + 1 cutii de pantofi și n perechi de pantofi
identificate prin valorile 1, 2, ..., n (n perechi sunt așezate în n cutii, iar o cutie este
liberă). Dar, din păcate, pantofii nu se află la locurile lor. Până să vină Gary (șefa lui),
Bundy trebuie să potrivească pantofii în cutii. Dar pentru că Gary poate să apară în orice
clipă și Bundy nu vrea să fie prins că nu își face treaba cum trebuie, aranjarea pantofilor
trebuie făcută rapid și în așa fel încât să nu trezească bănuieli; prin urmare, dacă scoate o
pereche de pantofi dintr-o cutie, trebuie să o pună imediat în cutia liberă. Ajutați-l pe Al
Bundy să aranjeze pantofii la locurile lor printr-un număr minim de mutări.

Date de intrare: Prima linie a fișierului de intrare date.in conține numărul n de cutii.
Linia a doua conține n + 1 numere distincte, separate prin câte un spațiu, reprezentând
dispunerea inițială a perechilor de pantofi în cutiile numerotate de la 1 la n + 1. Printre
cele n + 1 numere unul singur are valoarea 0 și corespunde cutiei goale. Linia a treia
conține n + 1 numere separate prin câte un spațiu, reprezentând configurația finală cerută,
în care valoarea 0 se află pe poziția căruia îi corespunde cutia goală.
Date de ieșire: Fișierul de ieșire date.out va conține pe prima linie un număr întreg k,
reprezentând numărul minim de mutări.
Restricții și precizări:
- 1 < n < 100.

Exemplu:
date.in
4
34102
40213
date.out
4
Explicații:
Mutarea 1: perechea 1 se mută din cutia 3 în cutia 4
Mutarea 2: perechea 2 se mută din cutia 5 în cutia 3
Mutarea 3: perechea 3 se mută din cutia 1 în cutia 5
Mutarea 4: perechea 4 se mută din cutia 2 în cutia 1
13) Subșiruri. Se dă un șir de n numere întregi. Să se descompună acest șir în număr minim
de subșiruri strict crescătoare, astfel încât numerele lor de ordine (din șirul dat) să fie
ordonate crescător în subșirurile formate.
Date de intrare: Prima linie a fișierului de intrare date.in conține numărul n, reprezentând
numărul de elemente din șir. Următoarea linie conține cele n numere întregi, separate prin
câte un spațiu.
Date de ieșire: Fișierul de ieșire date.out va conține pe prima linie un număr întreg k,
reprezentând numărul minim de subșiruri care se pot forma. Pe următoarele k linii vor fi
descrise subșirurile crescătoare. Un subșir va fi precizat prin numerele de ordine ale
elementelor din șirul inițial, despărțite prin câte un spațiu.
Restricții și precizări:
- 1 ≤ n ≤ 10000;
- elementele șirului sunt numere cuprinse în intervalul [0, 40000].

Exemplu:
date.in
10
2316837957
date.out
3
12458
367
9 10
Explicație:
Se pot forma 3 subșiruri crescătoare:
2, 3, 6, 8, 9
1, 3, 7
5, 7
14) Medici. O asociație caritabilă asigură consultații medicale gratuite pentru cei fără
posibilități materiale. Există un singur cabinet dotat cu aparatură medicală. Din acest
motiv la un moment dat un singur medic poate face consultații. Asociația apelează la n
medici de diverse specialități, care își oferă benevol serviciile. Fiecare prezintă un singur
interval [si, fi] de-a lungul aceleiași zile, în care este disponibil. Ajutați asociația să
realizeze o planificare a consultațiilor în cabinet, astfel încât numărul de medici să fie
maxim.

Date de intrare: Prima linie a fișierului de intrare date.in conține numărul n al medicilor.
A doua și a treia linie conțin orele de început și respectiv orele de sfârșit, corespunzătoare
celor n medici (numere întregi). Numerele sunt separate prin câte un spațiu.
Date de ieșire: Fișierul de ieșire date.out va conține pe prima linie un număr k,
reprezentând numărul maxim de medici care se pot selecta, astfel încât să fie îndeplinită
condiția din enunț. A doua linie va conține k numere care vor reprezenta indicii medicilor
selectați.
Restricții și precizări:
- 1 ≤ n ≤ 1000;
- 1 ≤ fi < si ≤ 1000, pentru i = 1, 2, ..., n.

Exemplu:
date.in
2 6 20 4
3 8 23 7
date.out
3
143
15) O întreprindere care fabrică produse alimentare (unt, marmeladă, ulei, etc.) dispune de
suma S pentru fabricarea anumitor produse. Se știe că există n produse care pot fi
fabricate și pentru fiecare produs se cunoaște costul obținerii unui kg (litru) din produsul
respectiv, precum și prețul de vânzare a unui kg (litru) din produsul respectiv. Scrieți un
program care determină ce produse pot să fie fabricate de întreprindere și în ce cantitate,
astfel încât să se obțină o sumă maximă la vânzarea lor.
16) Codul Gray. Pentru primele 8 numere naturale, în tabelul de mai jos, observați numărul
scris în baza 10, în binar și în codul Gray. După cum puteți observa, codul Gray se
caracterizează prin faptul că reprezentarea a două numere consecutive diferă exact cu o
poziție binară.
Număr În cod binar În cod Gray

0 000 000

1 001 001

2 010 011

3 011 010

4 100 110

5 101 111

6 110 101
7 111 100

Fiind dat un număr natural în binar, b1b2...bn, scrieți un subprogram care convertește
numărul în cod Gray, g1g2...gn, după următorul algoritm:
g1=b1;
gk=(bk+bk-1) modulo 2; pentru k=2,3,...,n.
Exemplu:
n=5, în binar avem 101, iar în Gray avem: 1(1+0) (0+1)=111.
n=7, în binar avem 111, iar în Gray avem: 1(1+1) (1+1)=100.
 Observați faptul că soluția se construiește bit cu bit, ceea ce justifică includerea
acestei probleme în tehnica Greedy.
17) Fiind dat un număr natural în cod Gray, g1g2...gn, scrieți o funcție care convertește
numărul în binar b1b2...bn după următorul algoritm:

b1=g1;
bk=(gk+bk-1) modulo 2; pentru k=2,3,...n
Exemplu:
n=5, în Gray avem 111, iar în binar avem: 1(1+1) (1+0)=101.
n=7, în Gray avem 100, iar în binar avem: 1(0+1) (0+1)=111.
18) Scrieți un program care afișează codurile Gray ale primelor numere naturale citite.
19) Se consideră o mulțime X cu n elemente. Să se elaboreze un algoritm eficient și să se
scrie un program pentru generarea șirului tuturor submulțimilor lui X, A1,A2,...,Ai+1 astfel
încât Ai+1 să se obțină din Ai, prin adăugarea sau scoaterea unui element.
20) Problema colorării hărților. Sunt date N țări, precizându-se relațiile de vecinătate. Se
cere să se determine o posibilitate de colorare a hărții (cu cele N țări), astfel încât să nu
existe țări vecine colorate la fel.
21) Turiști. O agenție de turism montan are n ghizi capabili să însoțească grupurile de turiști
străini în drumeții montane. Toate drumețiile care se organizează durează exact m zile.
Un ghid poate să însoțească într-o drumeție un singur grup, el fiind nedisponibil pentru
alte grupuri în acea perioadă. La agenție se adună p solicitări înainte de începerea
sezonului. Fiecare din cele p grupuri solicitante specifică data la care dorește să înceapă
drumeția. Ajutați directorul agenției să aleagă numărul maxim de grupuri care vor putea
fi însoțite de ghizi pe parcursul unui an întreg. În plus, el a hotărât că dacă există solicitări
care au data de început d în timpul sezonului și s-ar putea desfășura în totalitate doar dacă
se depășește ultima zi a sezonului, se prelungește sezonul cu zilele necesare.
Date de intrare: Prima linie a fișierului de intrare date.in conține numerele k, n, m și p,
despărțite prin câte un spațiu (k reprezintă numărul zilelor din sezon, n este numărul
ghizilor, m reprezintă durata drumețiilor, iar p reprezintă numărul solicitărilor). Pe
următoarea linie sunt scrise datele di (i = 1, 2, ..., p) pe care grupurile le-au scris pe
solicitări.
Date de ieșire: Fișierul de ieșire date.out conține un număr întreg care reprezintă numărul
maxim de solicitări rezolvate.
Restricții și precizări:
- 1 ≤ n ≤ 100;
- 1 ≤ m ≤ 14;
- 1 ≤ p ≤ 1000;
- 1 ≤ k ≤ 365;
- 1 ≤ di ≤ k (i = 1, 2, ..., p).

Exemplu:
date.in
20 2 5 8
8 2 10 10 4 9 6 19
date.out
5
Explicații:
Exemplul poate corespunde următoarei situații:
- primul ghid rezolvă solicitările care încep în zilele 2, 8 și 19
- al doilea ghid rezolvă solicitările care încep în zilele 4 și 9

Tehnica Reluării
1) Labirintul. Se consideră planul unui labirint desenat pe o foaie de hârtie liniate în
pătrățele. Pătrățelele hașurate reprezintă obstacolele, iar cele nehașurate - camerele și
coridoarele labirintului. În memoria calculatorului planul labirintului, este redat prin
matricea A=||aij||n*m 1≤n, m≤30, unde aij= 1, dacă pătrățelul este hașurat, aij=0, în caz
contrar. Călătorul se poate deplasa dintr-un pătrățel nehașurat numai atunci când ele au o
latură comună. Elaborați un program care găsește, dacă există, un drum din pătrățelul B
în pătrățelul C
1 2 3 ... j ... m

2 B
3

...

... C

2) Elaborați un program care afișează la ecran toate modurile de a descompune un număr


natural în sumă de k numere naturale distincte.
Exemplu: pentru n=9 și k=3 soluțiile sunt: 1+2+6,2+3+4,1+3+5 3.
3) Avem la dispoziție 6 culori: alb, galben, roșu, verde, albastru și negru. Să se precizeze
toate drapelele tricolore care se pot proiecta, știind că trebuie respectate regulile:
a) Orice drapel are culoarea din mijloc galben sau verde;
b) Cele trei culori de pe drapel sunt distincte.
4) Dintr-un grup de n persoane, dintre care p femei, trebuie formată o delegație de k
persoane, din care 1 femei. Să se precizeze toate delegațiile care se pot forma.
5) La o masă rotundă se așază n persoane. Fiecare persoană reprezintă o firmă. Se dau k
perechi de persoane care aparțin unor firme concurente. Se cere să se determine toate
modalitățile de așezare la masă a persoanelor astfel încât să nu stea alături două persoane
de la firme concurente.
6) Se consideră n (n<50) săculețe, numerotate respectiv: 1, 2, 3,..., n. Săculețul i conține mi
monede de aceiași valoare Vi. Elaborați un program care afișează la ecran modul de plată
a unei sume p cu monedele din săculețe.
7) Dintr-un fișier se citesc numele și notele medii a x clase de elevii. Fiecare clasă este
formată din minim a și maxim b studenți (2<a<b<30). Studenții necesită a fi grupați în
grupuri de câte x studenți, din fiecare grupă este selectat câte un student, astfel încât
media notelor grupului să fie egală cu 8. Afișați lista tuturor grupelor, care pot fi formate,
enumerând numele elevilor din fiecare grupă.
8) Se dau n (n≤50.000) dominouri. Să se determine o modalitate de construire al unui șir,
care să conțină toate dominourile, respectând regula jocului domino. Această regulă
prevede că numerele înscrise pe fetele corespunzătoare a două dominouri consecutive
trebuie să fie egale. Dominourile pot fi alese în ordine oarecare și rotite.
Date de intrare: Prima linie a fișierului de intrare date.in se va afla numărul n al
dominourilor. Pe următoarele n linii se vor afla câte două numere separate printr-un
singur spațiu, reprezentând cele două numere înscrise pe dominoul corespunzător.
Date de ieșire: Pe prima linie a fișierul date.out va trebuie să afișați 1, dacă există soluție
și 0 dacă nu. Dacă există soluție vor urma exact n linii, care descriu șirul construit.
Fiecare număr de ordine va fi urmat de un spațiu și de un număr, care poate fi 0 sau 1 și
va fi egal cu 1 în cazul în care dominoul corespunzător a fost rotit.
9) Se citește un număr natural n>=4. Să se afișeze toate permutările mulțimii {1, 2, ... n}
care au proprietatea că diferența absolută a oricăror 2 elemente alăturate este cel puțin
egală cu 2.

Exemplu: Pentru n=4 se obțin permutările 2 4 1 3 și 3 1 4 2.


10) Pe o tablă de șah n x n sunt plasate m piese marcate prin valoarea -1, iar prin valoarea 0
sunt marcate pozițiile libere. Într-o poziție (i0,j0) se află un cal. Să se determine traseul
format din număr minim de pași pe care calul poate sa mănânce toate piesele de pe tablă
fără a trece de 2 ori prin aceeași poziție. Se citesc mai întâi n și m, iar apoi m perechi
reprezentând coordonatele pieselor. Ultimele se citesc coordonatele calului. Traseul va fi
marcat într-o matrice care se va afișa.
11) Fie n>0, natural. Să se scrie un program care să afișeze toate partițiile unui număr natural
n.

Numim partiție a unui număr natural nenul n o mulțime de numere naturale nenule {p1,
p2, …, pk} care îndeplinesc condiția p1+p2+ …+pk = n.
Exemplu: pentru n = 4 programul va afișa:
4 = 1+1+1+1
4 = 1+1+2
4 = 1+3
4 = 2+2
4=4
12) Se dă o permutare a primelor n numere naturale. Se cer toate permutările care se pot
obține din aceasta încât nici o succesiune de două numere, existentă în permutarea
inițială, să nu mai existe în noile permutări.
13) Se cer toate soluțiile de așezare în linie a m câini și n pisici astfel încât să nu existe o
pisică așezată între doi câini.
14) Anagrame. Se citește un cuvânt cu n litere . Se cere să se tipărească toate anagramele
cuvântului citit. Se poate folosi algoritmul pentru generarea permutărilor.
15) Se dau primele n numere naturale. Dispunem de un algoritm de generare a combinărilor
de n elemente luate câte p pentru ele. Se consideră un vector cu n componente șiruri de
caractere, unde, fiecare șir reprezintă numele unei persoane. Cum adaptați algoritmul de
care dispuneți pentru a obține combinările de n persoane luate câte p?
16) Se citesc n numere naturale distincte. Se cere o submulțime cu p elemente astfel încât
suma elementelor sale să fie maximă în raport cu toate submulțimile cu același număr de
elemente.
17) Să se determine 5 numere de câte n cifre, fiecare cifră putând fi 1 sau 2, astfel încât
oricare dintre aceste 5 numere să coincidă exact în m poziții și să nu existe o poziție în
care să apară aceeași cifră în toate cele 5 numere.
18) Fiind dat un număr natural pozitiv n, se cere să se producă la ieșire toate descompunerile
sale ca sumă de numere prime.
19) Attila și regele. Un cal și un rege se află pe o tablă de șah. Unele câmpuri sunt “arse”,
pozițiile lor fiind cunoscute. Calul nu poate călca pe câmpuri “arse“, iar orice mișcare a
calului face ca respectivul câmp să devină “ars“. Să se afle dacă există o succesiune de
mutări permise (cu restricțiile de mai sus), prin care salul să poată ajunge la rege și să
revină la poziția inițială. Poziția inițială a calului, precum și poziția regelui sunt
considerate “nearse“.
20) Se dau n puncte în plan prin coordonatele lor. Se cer toate soluțiile de unire a acestor
puncte prin exact p drepte, astfel încât mulțimea punctelor de intersecție ale acestor
drepte să fie inclusă în mulțimea celor n puncte.
21) Găsiți toate soluțiile naturale ale ecuației 3x+y+4xz=100.
22) Să se ordoneze în toate modurile posibile elementele mulțimii {1,2,…,n} astfel încât
numerele i, i+1, …, i+k să fie unul după celălalt și în această ordine (i=1,i+k≤ n).
23) Se consideră o mulțime de n elemente și un număr natural k nenul. Să se calculeze câte
submulțimi cu k elemente satisfac, pe rând, condițiile de mai jos și să se afișeze aceste
mulțimi.
a) Conțin p obiecte date;
b) Nu conțin nici unul din q obiecte date;
c) Conțin exact un obiect dat, dar nu conțin un altul;
d) Conțin exact un obiect din p obiecte date;
e) Conțin cel puțin un obiect din p obiecte date;
f) Conțin r obiecte din p obiecte date, dar nu conțin alte q obiecte date;
24) Se dă un număr natural par n. Să se determine toate șirurile de n paranteze care se închid
corect.
Exemplu: pentru n=6: ((( ))), (() ()), () () (), () (()), (()) ()
25) Se dau n puncte albe și n puncte negre în plan, de coordinate întregi. Fiecare punct alb se
unește cu câte un punct negru, astfel încât din fiecare punct, fie el alb sau negru, pleacă
exact un segment. Să se determine o astfel de configurație de segmente astfel încât
oricare două segmente să nu se intersecteze. Se citesc n perechi de coordonate
corespunzând punctelor negre.
26) Să se genereze toate permutările de n cu proprietatea că oricare ar fi 2≤i≤n, există 1≤j≤i
astfel încât |v(i)-v(j)|=1.

Exemplu: pentru n=4, permutările cu proprietatea de mai sus sunt:


2134,2314,3214,2341,3241,3421,4321.
27) O trupă cu n actori își propune să joace o piesă cu a acte astfel încât:
a) Oricare două acte să aibă distribuție diferită;
b) În orice act există, evident, cel puțin un actor;
c) De la un act la altul, vine un actor pe scena sau pleacă un actor de pe scenă
(distribuția a două acte consecutive diferă prin exact un actor).

Să se furnizeze o soluție, dacă există vreuna.


28) Fiind dat un număr natural n și un vector v cu componente numere întregi, se cere:
a) Să se determine toate subșirurile crescătoare de lungime [n/5]
b) Să se calculeze p1+p2+...+pk, unde pk reprezintă numărul subșirurilor crescătoare
de lungime k.
29) Pe malul unei ape se găsesc c canibali și m misionari. Ei urmează să treacă apa și au la
dispoziție o barcă cu 2 locuri. Se știe că, dacă atât pe un mal, cât și pe celălalt avem mai
mulți canibali decât misionari, misionarii sunt mâncați de canibali. Se cere să se scrie un
program care să furnizeze toate soluțiile de trecere a apei, astfel încât să nu fie mâncat
nici un misionar.
30) Se dă un careu sub formă de matrice cu m linii și n coloane. Elementele careului sunt
litere. Se dă, de asemenea, un cuvânt. Se cere să se găsească în careu prefixul de lungime
maximă al cuvântului respectiv. Regula de căutare este următoarea:
a) Se caută litera de la începutul cuvântului;
b) Litera următoare se caută printre cele 4 elemente învecinate cu elementul care
conține litera de început, apoi printre cele 4 elemente învecinate cu elementul care
conține noua literă, ș.a.m.d.
31) Se dau coordonatele a n puncte din plan. Se cere să se precizeze 3 puncte care determină
un triunghi de arie maximă. Ce algoritm vom folosi? Scrieți un program ce va utiliza
algoritmul dat.
32) Fiind date numele a n soldați, ce algoritm vom utiliza pentru a lista toate grupele de câte
k soldați? Se știe că într-o grupă, ordinea prezintă importanță. Scrieți un program ce va
utiliza algoritmul dat.
33) Fiind date n numere naturale, ce algoritm vom utiliza pentru a determina eficient o
submulțime maximală de numere naturale distincte? Scrieți un program ce va utiliza
algoritmul dat.
34) Dispunem de un algoritm care generează permutările prin backtracking. Primele două
permutări afișate sunt: 321,312. Care este următoarea permutare care va fi afișată? Scrieți
un program ce va utiliza algoritmul dat.
35) Se citește un număr natural n. Să se afișeze toate modurile în care poate fi descompus ca
produs de numere naturale diferite de 1 și n.

Exemplu:
36 poate fi descompus ca:

2*2*3*3
2*2*9
2*18
3*3*4
.....
36) Se consideră mulțimea B={b1, b2,..., bn} formată în primele n litere ale alfabetului latin.
Elaborați un program bazat pe metoda reluării care generează toate submulțimile Bi= Bi
⊆B, formate exact din q litere.

Indicație: Fiecare submulțime Bi poate fi reprezentată prin vectorul caracteristic X= ||xk||n,


1, 𝑑𝑎𝑐ă 𝑏𝑘 ∈ 𝐵𝑖
unde 𝑥𝑘 = {
0, î𝑛 𝑐𝑎𝑧 𝑐𝑜𝑛𝑡𝑟𝑎𝑟
Este clar că submulțimea Bi satisface condițiile problemei dacă x1+x2+...+xn=q.
37) Colorarea hârților. Pe o hartă sunt reprezentate n țări, n ≤ 30. În memoria calculatorului
1, 𝑑𝑎𝑐ă ță𝑟𝑖𝑙𝑒 𝑖, 𝑗 𝑠𝑢𝑛𝑡 𝑣𝑒𝑐𝑖𝑛𝑒
harta este redată prin matricea A=||aij||nxm unde 𝑎𝑖𝑗 = {
0, î𝑛 𝑐𝑎𝑧 𝑐𝑜𝑛𝑡𝑟𝑎𝑟

Determinați numărul minim de culori m necesare pentru a colora harta. Evident, se cere
ca oricare două țări vecine să fie colorate diferit
38) Generarea combinărilor. Să se genereze combinări din n elemente luate câte m.
n!
Numărul combinărilor a n elemente luate câte m este calculată cu formula: Cnm = m!(n−m)!

39) Generarea produsului cartezian. Se consideră n mulțimi A1, A2, ... , An de forma
{1,2..,An}. Să se genereze produsul cartezian al acestor mulțimi.
Am considerat mulțimile de forma {1,2..,An} pentru a simplifica problema, în special la
partea de citire si afișare, algoritmul de generare rămânând nemodificat.
Identificăm următoarele particularități și condiții:
a) Fiecare element Xk din vectorul soluție aparține unei mulțimi {1,2..,Ak}. Aici este o
diferență fată de algoritmii anteriori în care fiecare element din soluție era luat din
aceeași mulțime și trebuie să avem grijă la acest fapt când scriem programul.
b) Nu există condiții între elementele vectorului soluție.
c) Obținem soluția când s-au generat n valori.
40) Generarea submulțimilor unei mulțimi. Generarea submulțimilor unei mulțimi A cu n
elemente se poate face cu ajutorul algoritmului de generare a combinărilor, apelându-le
repetat cu valorile 1, 2, ..., n pentru a genera submulțimile cu un element, apoi cele cu
două elemente, apoi cu 3 elemente etc.
Această modalitate de rezolvare este și mai complicată și mai puțin eficientă decât
următoarea, care se bazează pe generarea produsului cartezian {0,1}n. Această a doua
metodă este eficientă deoarece generează 2n soluții, adică exact atâtea câte submulțimi
are o mulțime cu n elemente.
Așadar, generăm toate combinațiile de lungime n cu valorile 0 și 1. Pentru fiecare
combinație parcurgem soluția X și afișăm elementele din mulțimea A cărora le corespund
valori 1 în X. Astfel, pentru combinația 001011 vom afișa elementele de pe pozițiile 3, 5
și 6 din mulțimea inițială.

Aranjamente și combinări
1) Să se genereze și să se numere toate numerele formate din p cifre distincte având cifrele
ordonate crescător.
2) Să se genereze și să se numere toate permutările mulțimii {1,2,3,...,n} care încep cu
valoarea 1.
3) Să se genereze și să se numere toate permutările mulțimii {1,2,3,...,n} care au
proprietatea că oricare două elemente alăturate au paritate diferită.

Exemplu: pentru n=4:


1234
1432
2143
...
4321
4) Să se genereze și să se numere toate submulțimile mulțimii {1,2,3,...,n}.

5) Generarea permutărilor. Fie dat numărul natural n. Să se genereze toate permutările din
n elemente a mulțimii A={1,2,3,… .. . ,n}.
Indicație: Se numesc permutări ale unei mulțimi A cu n elemente toate mulțimile
ordonate care se pot forma cu cele n elemente ale lui A. Pentru n ∈ N*, avem Pn =
1*2*3*...*n=n!
6) Generarea aranjamentelor. Să se genereze aranjamentele din n luate câte k a mulțimii
A={1,2,… n}.
𝑛!
𝐴𝑚
𝑛 = 𝑛(𝑛 − 1) … (𝑛 − 𝑚 + 1) = ,𝑛 ≥ 𝑚
(𝑛 − 𝑚)!
7) Să se genereze și să se numere toate submulțimile de câte p elemente ale mulțimii
{1,2,3,...,n}.
8) Se citește un număr natural n și un număr natural p mai mic decât n. Să se descompună n
în toate modurile ca sumă de p numere naturale.
9) Să se genereze toate numerele formate din 5 cifre impare distincte.
10) Se citește un cuvânt format doar din litere mici distincte. Să se genereze anagramele lui.
11) Se citește un număr natural n și apoi o mulțime cu n elemente numere naturale. Folosind
interschimbări de elemente generați și afișați permutările mulțimii citite.

Tehnica Desparte și stăpânește

1) Se citește a≥1, număr real. Se cere să se scrie o funcție care calculează ln(a) cu 3
zecimale exacte. Nu este permisă utilizarea funcției logaritmice ale limbajului.
2) Se citește un număr real x∈(-10000, 10000). Să se afișeze partea fracționară.

Exemple: pentru x=1.23, se va afișa. 0.23;


pentru x=-12.7, se va afișa 0.7.
Nu se vor folosi funcții specializate ale limbajului.
3) Problema selecției. Se consideră un vector cu n componente numere naturale și 1≤t≤n. Se
cere să se determine al t-lea cel mai mic element.
4) Se consideră un vector care reține n numere naturale. Se cere să se determine dacă există
un element majoritar (adică un număr care se găsește în mai mult de [n/2]+1 elemente).
5) Se pleacă de la un pătrat a cărui suprafață se divide în 9 părți egale prin împărțirea
fiecărei laturi în 3 părți egale. Pătratul din mijloc se elimină. Cu pătratele rămase se
procedează la fel. Vizualizați figura după 1s de transformări (Covorul lui Sierpinski).
6) Utilizând metoda desparte și stăpânește:
a) Să se determine produsul a n numere întregi;
b) Să se determine maximul (minimul) a n numere întregi;
c) Să se caute o valoare într-un vector. Dacă se găsește se va afișa poziția pe care s-a
găsit, altfel se va afișa mesajul ”Nu exista așa valoare”;
d) Să se caute o valoare într-un vector ordonat crescător;
e) Să se numere câte valori sunt egale cu x dintr-un șir de numere întregi citite.
7) Considerăm un șir de n numere întregi, ordonat crescător și un număr întreg x. Scrieți un
program care împarte șirul dat în două subșiruri în așa fel încât toate elementele primului
subșir să fie mai mici sau cel mult egale cu x, iar toate elementele celui de-al doilea
subșir sa fie strict mai mari decât x.
8) Turnurile din Hanoi. Se dau trei tije, a, b și c. Pe tija a se află n discuri de dimensiuni
diferite, ordonate în ordinea diametrelor (discul cel mai mare la bază). Se dorește mutarea
tuturor discurilor de pe tija a pe tija b, utilizând tija intermediară c, cu condiția că un disc
cu diametrul mai mare să nu fie pus pe vreo tijă peste un disc cu dimensiune mai mică.
9) Într-o placă dreptunghiulară cu dimensiunile N pe L (coordonatele dreptunghiului) sunt
făcute K găuri. Coordonatele găurilor sunt numere întregi. Fișierul date.in conține în
prima linie numărul n, care reprezintă numărul de găuri, pe liniile următoare se regăsesc
coordonatele găurilor. Scrieți un program, care determină cel mai mic dreptunghi (cu o
suprafață mai mare ca 0) fără găuri din placă.
10) Cunoscându-se numărul n al elevilor unei clase, precum și mediile generale ale celor n
elevi la finele unui an școlar, realizați un program care, folosind un algoritm Divide et
Impera, testează dacă în clasa respectivă exista doi elevi cu aceeași medie generală.
Programul va tipări pe ecran mesajul “da” sau “nu”, în funcție de situație.
11) Într-o placă dreptunghiulară cu dimensiunile N pe L sunt n puncte (2≤n≤30). Fișierul
date.in conține în prima linie numărul n, care reprezintă numărul de puncte din plan pe
liniile următoare se regăsesc coordonatele punctelor. Elaborați un program care afișează
la ecran coordonatele punctelor Pa, Pb distanța dintre care este minimă. Distanța dintre
punctele Pj , Pm se calculează cu ajutorul formulei:

𝑑𝑗𝑚 = √(𝑥𝑗 − 𝑥𝑚 )2 + (𝑦𝑗 − 𝑦𝑚 )2

12) Se citește un număr real x. Să se calculeze radical de ordinul 3 din x folosind un algoritm
de tip Divide et impera.
13) Se citește un vector cu n elemente numere naturale. Să se determine elementul minim din
vector folosind divide et impera.
14) Folosind metoda divide et impera, scrieți o funcție care să determine dacă un tablou cu
elemente întregi este ordonat crescător.
15) Se citește un vector cu n elemente numere naturale. Să se calculeze suma elementelor
vectorului folosind divide et impera.
16) Se citesc două numere, n și x, n natural și x real pozitiv. Fără a folosi funcția pow,
extrageți cu 3 zecimale exacte radicalul de ordinul n din x.
17) Scrieți o funcție care să determine elementul minim și elementul maxim dintr-un tablou
cu elemente întregi folosind metoda divide et impera.
18) Să se rezolve ecuația 𝑥 3 + 𝑥 − 1 = 0 pe intervalul [0,1] folosind metoda divide et
impera.
19) Se citește un vector cu n elemente numere naturale. Să se calculeze CMMDC al
elementelor vectorului folosind divide et impera.
20) Se dă un vector sortat crescător (v[1..n]) ce conține valori reale distincte și o valoare x. Să
se găsească la ce poziție apare x în vectorul dat.
21) Se dă un șir neordonat S cu n - 1 numere distincte, selectate dintre cele n numere de
la 0 la n - 1. Toate sunt numere întregi, reprezentate pe 32 de biți. Folosind
metoda getBit(int i, int j) care întoarce al j-lea bit din reprezentarea binară a lui S[i],
determinați numărul lipsă.

Exemplu:
a) pentru șirul {0 1 9 4 5 7 6 8 2} lipsește numărul 3
b) getBit(7,3) întoarce al treilea bit din S[7]. S[7] este 8, în binar: 1000, deci bit-ul 3
este 1.
c) La un prim pas, se observă că bitul 3 este 0 pentru doar 7 numere din șir, deși între
0 și 9 sunt 8 numere care ar trebui să aibă bitul 3 egal cu 0, respectiv numerele de
la 0 la 7. Prin urmare, la primul pas ne dăm seama că numărul căutat este între 0 și
7.
22) Statistici de ordine. Se dă un vector de numere întregi neordonate. Scriind o funcție de
partiționare, folosiți Divide et Impera pentru:
a) a determina a k-lea element ca mărime din vector;
b) a sorta vectorii prin QuickSort.
Exemplu: pentru vectorul {0 1 2 4 5 7 6 8 9}, al 3-lea element ca ordine este 2, iar vectorul
sortat este {0 1 2 4 5 6 7 8 9}
23) Se dă un șir S de n numere întregi. Să se determine câte inversiuni sunt în șirul dat. Numim
inversiune o pereche de indici 1<=i<j<=n astfel încât S[i] > S[j].
Exemplu: în șirul {0 1 9 4 5 7 6 8 2} sunt 12 inversiuni.
24) Calculați subsecvența de sumă maximă pentru un vector A de n numere reale folosind o
abordare de tip desparte și stăpânește.

Subsecvență a unui vector A[1..n] se definește ca o secvență continuă de elemente din A.


De exemplu, A[i..j](pentru orice 1<=i<=j<=n) reprezintă o subsecvență a lui A.
Exemplu: Pentru A = {−2, 1, −3, 4, −1, 2, 1, −5, 4}, subsecvența de sumă maximă
este {4, −1, 2, 1} de sumă 6.
25) Se dă un număr natural n. Scrieți un algoritm de complexitate O(log n) care să calculeze
√𝑛 cu o precizie de 0.001.

Exemplu: pentru 0.25 algoritmul poate da orice valoare între 0.499 și 0.501 inclusiv.
Tehnica Programării Dinamice

1) Dintr-un element ai,j al unei matrici An,n se poate ajunge în elementele ai+1,j, ai+1,j+1, ai+1,j-
1. Știind că fiecare element al matricei reține un număr natural, se cere un drum care
îndeplinește condițiile problemei și unește un element de pe linia 1 cu unul de pe linia n
astfel încât suma numerelor reținute de elementele pe unde trece drumul să fie maximă.
3 1 3
Exemplu: pentru n=3 și matricea 𝐴 = (4 1 2), drumul este a1,1, a2,1, a3,2, iar suma
3 7 1
este 3+4+7=14.
2) Problema diligenței. Un comis-voiajor are de făcut o călătorie cu diligența între două
orașe din vestul sălbatic. Călătoria cu diligența se desfășoară în n etape. În fiecare etapă
diligența merge, fără întrerupere, între două orașe. După o etapă diligența este schimbată,
iar comis-voiajorul decide în care oraș va merge în etapa următoare. Se știe că în fiecare
etapă, cu excepția ultimei etape, se poate ajunge în unul din cele k orașe. Se cunoaște
orașul de start, S și cel final, F (în ultima etapă se ajunge în orașul F). Pentru orice etapă
se cunosc toate distanțele între orașele care sunt puncte de pornire și cele care sunt puncte
de destinație.

S F

k orașe
Etapa 1 Etapa 2 Etapa n

Se cere să se decidă care sunt orașele destinație pentru o anumită etapă, astfel încât
lungimea totală a drumului, care trebuie afișată, să fie minimă.
3) Lucrare de control. Mai multor elevi li se cere să pună într-o anumită ordine un număr de
n<200 cuvinte formate numai din litere mici – ordinea exprimă faptul că aceste cuvinte se
succed după o anumită logică.
Exemplu: platon kant marx stalin havel.
Logica succesiunii constă în faptul că fiecare cuvânt poate fi definit folosind numai
cuvintele anterioare.
Fiecare elev îi transmite profesorului succesiunea de cuvinte care i se pare logică. Sarcina
profesorului constă în a acorda fiecărui elev una dintre notele 1, 2, 3, ..., n,
corespunzătoare numărului de cuvinte așezate într-o succesiune corectă. Pentru exemplul
1 avem următoarele note:
marx stalin kant platon havel 3
havel marx stalin kant platon 2
havel stalin marx kant platon 1
4) Un patron de gogoșărie a cumpărat un calculator și dorește să învețe să lucreze pe el.
Pentru aceasta va umple un raft de cărți dintr-o anumită serie. Raftul are lungimea L cm
(L este număr natural). Seria dispune de n titluri 1, 2, ..., n cu grosimile de n1, n2, ..., nn
cm (numere naturale).
Să se selecteze titlurile pe care le va cumpăra patronul astfel încât raftul să fie umplut
complet (suma grosimilor cărților cumpărate să fie egală cu lungimea raftului) și numărul
cărților achiziționate să fie maxim.
5) Mere-Pere. Se consideră n camere distincte, situate una după alta, astfel încât din camera
i (i∈{1, 2, …, n-1}) se poate trece doar în camera i+1. În fiecare cameră se găsesc mere
și pere în cantități cunoscute (bucăți).
O persoană cu un rucsac suficient de încăpător, inițial gol, pornește din camera 1, trece
prin camerele 2, 3, ..., n și iese. La intrarea în fiecare cameră descarcă rucsacul, și
încarcă, fie toate merele, fie toate perele din camera respectivă, după care trece în camera
următoare. Se presupune că pentru fiecare fruct transportat între două camere, persoana
consumă o calorie. Ce fel de fructe trebuie să încarce persoana în rucsac astfel încât după
parcurgerea celor n camere să consume un număr minim de calorii și care este acest
număr.
6) Se citesc n, număr natural, și n numere naturale. Se cere să se afișeze cea mai mare sumă
care se poate forma cu numere dintre cele n (fiecare număr poate participa o singură dată
la calculul sumei) și care se divide cu n. Afișați, de asemenea, și numerele care alcătuiesc
suma.
7) Problema care urmează prezintă o modalitate de compactare a unui fișier oarecare (de
date, executabil, etc.). După cum se știe, fișierul este reținut pe suport ca o succesiune de
0 și 1. Noi dispunem de un set de m secvențe de 0 și 1 din care nu lipsesc secvența care îl
conține numai pe 0 și secvența care îl conține numai pe 1. Se cere să găsim o
descompunere a șirului de 0 și 1 care alcătuiește fișierul într-un număr de minim de
secvențe din cele m. Dacă rezolvăm această problemă, putem înlocui secvența cu o adresă
și în acest fel fișierul va deveni o succesiune de adrese (în cazul existenței unor secvențe
lungi se realizează economia de suport).
Exemplu: Pentru m=6, secvențele sunt:
1. 0
2. 1
3. 0 0 1
4. 1 0 0
5. 1 1 1
6. 1 0 1
Fișierul este: 100111001
Se folosesc secvențele 4 5 și 3.
8) Pentru un triunghi ABC, cu vârfurile de coordonate întregi, definim costul său ca fiind
minimul ariilor dreptunghiurilor cu laturile paralele cu axele de coordonate care au pe
laturi vârfurile unui triunghi. De exemplu, cu vârfurile de coordonate (1,0), (5,0), (0,3)
costul atașat este egal cu 15. Fie un poligon convex, cu coordonatele vârfurilor numere
întregi. Numim triangularizare a poligonului o partiționare a sa ale cărui vârfuri sunt
vârfuri ale poligonului dat. Numim costul unei triangularizări ca fiind suma costurilor
triunghiurilor componente. Problema constă în realizarea unei triangularizări de cost
minim.
9) O tablă de șah se citește ca o matrice n x n în care pozițiile libere au valoarea 0, iar
piesele sunt marcate prin valoarea 1.
Pe prima linie pe coloana j se află un pion. Să se determine drumul pe care poate ajunge
pionul pe ultima linie luând un număr maxim de piese. Poziția inițială a pionului se
consideră liberă.
Pionul aflat în poziția i, j se poate deplasa astfel:
- în poziția i+1, j dacă e liberă
- în poziția i+1, j-1 dacă e piesă în această poziție
- în poziția i+1, j+1 dacă e piesă în această poziție
Exemplu:
53
0000
01010
01111
00011
01011
Drumul optim este:
13
22
33
44
55
Pe acest drum pionul ia 4 piese.
10) În fișierul date.in se află pe prima linie un număr natural n cel mult 20 000, iar pe liniile
următoare o matrice pătratică de dimensiune n care conține doar elemente 0 și 1.
Să se determine cel mai mare pătrat care conține doar valori 1. Se vor afișa în fișierul text
date.out următoarele valori separate prin spațiu: latura pătratului, linia și coloana colțului
stânga sus al pătratului. Dacă exista mai multe astfel de pătrate se va afișa doar cel mai de
sus.
Exemplu:
5
11000
11101
11111
11100
10111
Se afișează 3 2 1
11) Se dau n(n+1)/2 numere naturale aranjate într-un triunghi format din elementele de sub și
de pe diagonala unei matrici pătratice de ordin n.
Se calculează sume pornind din elementul de pe prima linie prin deplasări în vecinii de
sub și din dreapta. Găsiți suma maximă care se poate calcula astfel și care sunt valorile
din care se obține suma maximă.
Exemplu:
n=4
2
35
634
5614
suma maximă este 17
și se obține din valorile 2 3 6 6
12) Se citește o matrice pătratică de ordin n formată din numere naturale.
Se calculează sume pornind de pe prima linie prin deplasări în vecinii de sub și din
dreapta. Găsiți suma maximă care se poate calcula astfel și care sunt valorile din care se
obține suma maximă.
Exemplu:
n=4
7158
3561
6348
5614
suma maximă este 23
și se obține din valorile 5 6 8 4
13) Se citește o matrice pătratică de ordin n formată din numere naturale.
Se calculează sume pornind de pe prima linie prin deplasări pe linia următoare în unul
dintre cei 3 vecini de pe aceeași coloană sau de pe cele 2 alăturate. Găsiți suma maximă
care se poate calcula astfel și care sunt valorile din care se obține suma maximă.
Exemplu:
n=4
8158
3561
6348
5614
suma maxima este 26
și se obține din valorile 8 6 8 4
14) Un păianjen a țesut o pânză de formă dreptunghiulară formată din n linii orizontale și m
linii verticale.
Calculați în câte moduri poate el merge din colțul stânga-sus în colțul dreapta-jos făcând
un număr minim de pași. (n+m-2)
Exemple:
pentru n=3 și m=3 există 6 moduri
pentru n=1 și m=5 există un singur mod
1 1 1

1 2 3

1 3 6

n=3 și
m=3
15) Se citește un număr natural n și apoi un vector cu n elemente numere întregi. Determinați
secvența din vector care are suma elementelor maximă.
Exemplu:
n=9
-2 1 -3 3 -1 4 -6 2 3
secvența de sumă maximă este 3 -1 4 și are suma 6
16) Subșir crescător maximal. Se citește un număr n și apoi un șir de n numere întregi. Găsiți
cel mai lung subșir al șirului citit care are proprietatea că elementele sunt în ordine
crescătoare.
Dacă există mai multe subșiruri de lungime maximă se va afișa unul dintre ele.
Exemplu:
date.in
9
423052698
date.out
23569
17) Clădirea Finanțelor publice este formată din birouri dispuse într-un dreptunghi cu n x m
elemente. Între două birouri se poate trece dacă sunt alăturate pe linie sau pe coloană.
Pentru fiecare birou se cunoaște valoarea taxei care trebuie plătită în acel birou (valoare
naturală). Un contribuabil intră în clădire prin biroul 1,1 și trebuie să o părăsească prin
biroul n, m. Calculați suma minimă a taxelor pe care le poate plăti contribuabilul de la
intrare până la ieșirea din clădire.
Exemplu:
n=4, m=3, dispunerea birourilor și taxa din fiecare:
372
643
631
622
Valoarea minimă pe care o poate plăti contribuabilul este 18 (corespunde parcurgerii
birourilor cu taxele: 3 7 2 3 1 2)
18) O livadă este împărțită în n x m zone. În fiecare zonă crește câte un pom. Din fiecare pom
cade pe jos o cantitate de fructe. În zona stânga-sus se află un arici care vrea să ajungă în
zona dreapta-jos. Ariciul se poate deplasa doar pe două direcții: în jos sau spre dreapta.
Determinați cantitatea maximă de fructe pe care le poate aduna ariciul prin deplasarea din
poziția inițială în cea dorită.
Citirea se face din fișierul date.in care conține pe prima linie dimensiunile livezii, adică n
și m, și apoi cantitatea de fructe din fiecare dintre cele n x m zone.
Afișarea cantității maxime de fructe se va face în fișierul date.out.
Exemplu:
date.in
33
041
011
101
date.out
7
19) Din fișierul date.in se citește un număr natural n (n<=300) și apoi un șir cu n elemente
numere naturale cu cel mult 9 cifre fiecare.
Calculați și afișați în fișierul date.out numărul de subșiruri strict crescătoare care se pot
forma în șirul citit.
Exemplu:
date.in
5
12342
date.out
17
Explicație: subșirurile strict crescătoare sunt:
1 13 123
2 14 124
3 12 134
4 23 234
2 24 1234
12 34

20) Se dă o matrice pătratică de ordin n care conține numere naturale și care are liniile și
coloanele numerotate de la 1 la n. Se citește apoi un număr natural m și n perechi de poziții
din matrice de forma (i1, j1) și (i2,j2) astfel încât i1 să fie mai mic decât i2 și j1 să fie mai mic
decât j2.
Calculați și afișați pentru fiecare pereche de poziții suma elementelor din matrice aflate în
submatricea care are colțul stânga-sus în (i1,j1) și coltul dreapta-jos în (i2,j2).
Exemplu:
date.in
3
121
361
136
3
2233
2133
1113
date.out
16 20 4
21) Problema Rucsacului. Un camion poate transporta T tone de mobilă. Există n piese de
mobilă, fiecare caracterizată de greutatea G[i] și de valoarea V[i] adusă de transportarea sa.
Să se decidă ce piese de mobilă vor fi transportate pentru a aduce o valoare maximă (soluție
optimă).
Exemplu:
Fie cantitatea maximă admisă T = 10, și un număr de piese de mobilă din care putem alege
egal cu 6. Piesele de mobilă sunt descrise de perechi de forma (greutate, valoare), după cum
urmează: (3, 7), (3, 4), (1, 2), (1, 9), (2, 4), (1, 5).
Profitul maxim pe care îl putem obține este 29 și acesta se realizează dacă vom transporta
obiectele de mobilier cu indecșii 1, 2, 4, 5 și 6.
22) Parantezarea unei expresii booleene. Se dă o expresie booleană exprimată prin șirurile “true”,
“false”, “and”, “or”, “xor” . Numărați modurile în care se pot așeza paranteze astfel încât
rezultatul să fie “true”.
Exemplu: pentru expresia: true and false xor true
există două modalități de parantezare, astfel încât rezultatul să fie “true”:
((true and false) xor true)
sau
true and (false xor true))
23) Suma în triunghi. Să considerăm un triunghi format din n linii (1<n≤100), fiecare linie
conținând numere întregi din domeniul [1,99], ca în exemplul următor:

3 8

8 1 0

2 7 4 4

4 5 2 6 5

Problema constă în scrierea unui program care să determine cea mai mare sumă de numere
aflate pe un drum între numărul de pe prima linie și un număr de pe ultima linie. Fiecare
număr din acest drum este situat sub precedentul, la stânga sau la dreapta acestuia.
24) Submatrice pătratică maximală. Dându-se o matrice binară cu m linii și n coloane,
determinați o submatrice pătratică de dimensiune maximă care are toate elementele egale cu
1. De exemplu, fie matricea binară următoare:

0 1 1 0 1
1 1 0 1 0
0 1 1 1 0
1 1 1 1 0
1 1 1 1 1
Submatricea pătratică de dimensiune maximă care are toate elementele egale cu 1 este:
1 1 1
1 1 1
1 1 1
25) Dreptunghiuri. În timpul orei de matematică, Bianca nu este atentă și începe să deseneze N
dreptunghiuri pe caiet. La un moment dat, își pune următoarea întrebare: Care este numărul
maxim K de dreptunghiuri, pe care poate să le aleagă, astfel încât primul să încapă în al
doilea, al doilea în al treilea,...., al k-1-lea în al k-lea? Pentru că nu știe răspunsul la această
întrebare, îl roagă pe prietenul ei Ștefan să o ajute. Ștefan se gândește puțin și găsește un
algoritm prin care să rezolve problema Biancăi și să afle numărul maxim. Găsiți și voi
algoritmul lui Ștefan.
Se dau N dreptunghiuri pentru care se știe lungimea L și lățimea l. Se cere să răspundeți la
întrebarea Biancăi. Se consideră că un dreptunghi D1 cu lungimea L1 și lățimea l1 încape în
alt dreptunghi D2 cu L2 și l2 dacă L1<L2 și l1<l2.
Date de intrare: Fișierul de intrare date.in conține pe prima linie numărul N de
dreptunghiuri. Următoarele N linii conțin 2 numere întregi ce reprezintă lungimea L și
lățimea l fiecărui dreptunghi.
Date de ieșire: În fișierul de ieșire date.out se va afișa pe primul rând numărul maxim K de
dreptunghiuri ce pot fi alese astfel încât primul să intre în al doilea, al doilea în al treilea,....,
al k-1-lea în al k-lea.
Exemplu:
date.in
7
26 12
14 17
83
18 14
52
20 17
16 2
date.out
4
26) Se consideră un arbore cu n noduri numerotate de la 1 la n. Se știe că rădăcina arborelui este
nodul 1. Fiecare nod i are asociat un număr natural nenul vi. Să se determine suma maximă
care se poate obține alegând în mod convenabil o submulțime de noduri, astfel încât dacă
este ales un nod i, în submulțime nu poate fi nici nodul tată al lui i, nici eventualii fii ai lui i.
Date de intrare: Fișierul de intrare date.in conține pe prima linie numărul n. Pe a doua linie,
separate prin câte un spațiu, se află numerele naturale t1,t2,...,tn, în care ti reprezintă nodul
tată al nodului i. Pentru că 1 este rădăcina arborelui, atunci întotdeauna t1=0. Pe a treia linie,
separate prin câte un spațiu, se află numerele naturale v1,v2,...,vn, unde vi este valoarea
asociată nodului i.
Date de ieșire: Fișierul de ieșire date.out va conține pe prima linie un singur număr natural
reprezentând suma maximă posibilă.
Restricții:
- 3 <= n <= 100 000
- 1 <= vi <= 1000
Exemplu:
date.in
5
01133
34453
date.out
12
Explicații:
Arborele are 5 noduri. Nodurile 2 și 3 au ca nod tată pe 1, iar nodurile 4 și 5 au ca tată pe 3.
Nodul 1 are asociată valoarea 3, nodurile 2 și 3 au asociată valoarea 4, nodul 4 are asociată
valoarea 5, iar nodul 5 are valoarea 3 asociată.
Obținem suma maximă 12 dacă se aleg nodurile 2, 4, 5: v2+v4+v5=4+5+3=12.
27) În timpul liber Algorel și Gigel născocesc tot felul de jocuri. Ultima lor invenție în domeniu
este foarte ciudată: Gigel desenează un arbore cu N noduri numerotate de la 1 la N pe o foaie
de hârtie, apoi tot el alege o secvență S de numere întregi, nu neapărat distincte, din
intervalul [1, N] și îl lasă pe prietenul său Algorel să aleagă poziția de start în această secvență.
Cei doi mută alternativ, fiecare mutare constând în alegerea unei poziții din S. Numărul de
puncte obținute în urma fiecărei mutări este egal cu valoarea secvenței în poziția aleasă.
Punctajul final al fiecărui jucător este suma punctelor obținute în urma mutărilor efectuate de
el.
Din poziția i se poate muta în poziția j dacă și numai dacă:
- i<j
- Si este strămoș al nodului Sj sau Sj este strămoș al nodului Si. Spunem că un
nod x este strămoș pentru un nod y dacă x este situat pe drumul între rădăcina arborelui
și y în arborele desenat de Gigel.
De când au inventat jocul Algorel vrea să știe care este diferența maximă dintre punctajul său
și cel al lui Gigel pe care o poate obține pentru fiecare poziție de start.
Fiind date structura arborelui și secvența aleasă de Gigel scrieți un program care determină
informațiile dorite de Algorel știind că Gigel joacă perfect.
Date de intrare: Prima linie a fișierului date.in conține două numere întregi, N și M,
reprezentând numărul de noduri din arbore și respectiv lungimea secvenței S. Următoarea linie
conține N–1 numere ce descriu structura arborelui: numărul de pe poziția i (cu i între 1 și N–
1) este “tatăl” nodului i+1. Nodul 1 este întotdeauna rădăcina arborelui. Următoarea linie
conține M numere întregi din intervalul [1, N] reprezentând secvența S. Valorile scrise pe
aceeași linie sunt separate prin spații.
Date de ieșire: Fișierul date.out va conține M linii, pe linia i aflându-se un întreg reprezentând
diferența maximă de punctaj pe care o poate obține Algorel dacă începe jocul din poziția i a
secvenței S.
Restricții:
- 1 <= N <= 50 000
- 1 <= M <= 50 000
- Rădăcina arborelui este întotdeauna nodul 1
- Un nod este strămoș și pentru el însuși
- Dacă un jucător poate muta este obligat să o facă.
Exemplu:
date.in
45
411
41231
date.out
3
-1
1
2
1
28) Se consideră o arborescentă (arbore cu rădăcină) formată din N noduri, numerotate de
la 1 la N. Nodul 1 este considerat rădăcină. Scrieți un program care să determine numărul
minim de arce care trebuie eliminate pentru a obține un subarbore cu P noduri. Subarborele
obținut nu trebuie să conțină neapărat nodul 1.
Date de intrare: Fișierul de intrare date.in conține pe prima linie numerele naturale N și P,
separate printr-un spațiu.
Următoarele N - 1 linii conțin fiecare câte două numere I și J, cuprinse între 1 și N, separate
printr-un spațiu, cu semnificația că nodul J este descendent direct al nodului I (există arc de
la I la J).
Date de ieșire: În fișierul de ieșire date.out va conține o singură linie pe care se va scrie
numărul natural X reprezentând numărul de arce eliminate (minim posibil).
Restricții:
- 1<=P<=N<=150
- 0<=X<=N-1
Exemplu:
date.in
11 6
12
26
27
28
13
14
49
4 10
4 11
15
date.out
2
Explicație:
De exemplu, se elimină arcele 1 5 și 1 4.
Aceasta nu este singura soluție (de exemplu, s-ar putea elimina și arcele 1 5 și 1 2).

Modulul 3„Elemente de programare orientată pe obiecte în baza limbajului C++”

1) Cerați obiectul paralelipiped_dreptunghic.


Date: lungimile bazelor și înălțimea;
Metode: citire, afișare, inițializare, determinare a suprafeței laterale, suprafeței totale, și a
volumului.
Se vor introduce datele despre două paralelipipede dreptunghice și se vor afișa datele despre
paralelipipedul cu volumul maxim și paralelipipedul cu suprafața totală minimă.
2) Creați obiectul triunghi.
Date: lungimile laturilor;
Metode: citire, afișare, inițializare, determinare a perimetrului, a suprafeței și afișare a
tipului triunghiului (ascuțit, dreptunghic sau obtuzunghi).
Se vor introduce datele despre două triunghiuri și se vor afișa datele despre triunghiul cu
suprafața maximă și triunghiul cu perimetrul minim. Se va implementa o metodă pentru
verificarea corectitudinii introducerii datelor de intrare. În caz că lungimile introduse nu pot
forma un triunghi, atunci lungimile laturilor vor fi egale cu 0, iar metoda tip va afișa
mesajul: ”Nu există așa triunghi”.
3) Cerați obiectul persoana.
Date: nume, anul nașterii, genul, înălțimea;
Metode: citire, afișare, vârsta, greutate (se va determina conform formulelor:
Gmasculin=50+0.75*(înălţime-150) + (vîrsta-20)/4 – pentru genul masculin;
Gfeminin=Gmasculin–10 – pentru genul feminin.
De la tastatură se citesc datele despre n persoane. Să se afișeze:
a) Lista tuturor persoanelor;
b) Lista persoanelor cu o vârstă mai mare decât 25 ani;
c) Lista persoanelor cu o greutate cuprinsă între 55 și 80 kg.
4) Creați obiectul student.
Date: nume, anul nașterii, notele la trei discipline;
Metode: citire, afișare, vârsta, media, restanță (va returna 1 doar dacă studentul are cel puțin
o notă mai mică decât 5), bursa (va fi egală cu 500 lei dacă studentul nu are restanțe și media
este mai mare decât 7.5).
De la tastatură se citesc datele despre n studenți. Să se afișeze:
a) Lista tuturor studenților;
b) Lista studenților restanțieri;
c) Lista studenților care au bursă;
d) Lista studenților cu o vârstă mai mică decât 18 ani.
5) Se consideră un program care descrie organizarea personalului unei instituții folosind clase
derivate. O clasă numită Angajat deține date și funcții referitoare la un angajat al instituției:
class Angajat{
char * nume;
float salariu;
public:
Angajat();
Angajat(char *n, int s, float sal);
Angajat(Angajat& r);
void display();
float getSalariu();
void setSalariu(float s);
};
Diferite categorii de angajați necesită date suplimentare față de cele definite în clasa
Angajat, corespunzătoare postului pe care îl dețin. De exemplu, un șef de secție
(administrator) este un angajat (deci sunt necesare toate datele care descriu această calitate)
dar mai sunt necesare și alte informații, de exemplu precizarea secției pe care o conduce. Un
administrator este un angajat, de aceea clasa Administrator se poate construi prin derivare
din clasa Angajat astfel:
class Administrator: public Angajat {
int sectie;
public:
Administrator(const char *n, float sal, int sec);
Administrator(Administrator& r);
~Administrator();
};
Să se implementeze aceasta ierarhie de clase. Introduceți și afișați la ecran datele a 5
angajați.
6) Să se implementeze un vector (tablou) în care se pot păstra obiecte de tipuri diferite definite
de utilizator. Pentru aceasta se definește clasa Object ca o clasă de bază pentru toate tipurile
derivate:
class Object{
public:
Object() {};
virtual ~Object() {};
virtual void display() = 0;
};
Clasa ObArray, definește un vector de pointeri de tip Object*. Nu este necesar să fie limitată
dimensiunea vectorului deoarece se asigură creșterea dimensiunii acestuia atunci când este
necesar.
class ObArray : public Object {
Object **p; // Vector de pointeri
int size; // Numar de elemente la un moment dat
int grows; // Increment de creştere a dimensiunii
int dimens; // Dimensiune vector
public:
ObArray(int size=0,int grows, int dimens); // Constructor
~ObArray(); // Destructor
void RemoveAll(); // Elimina toate obiectele din vector
int getSize(); // Intoarce numarul de elemente din vector.
int add(Object* x); // Adauga un element la vector.
int insertAt(int i, Object *x); // Insereaza un element pe o pozitie data
int removeAt(int i); // Elimina elementul de pe pozitia i
Object* getAt(int i); // Intoarce elementul de la pozitia i
void display(); // Afisare elementelor din tablou.
};
Sa se utilizeze aceste clase pentru a memora un tablou de Puncte si un tablou de numere
Complexe.
7) Să se implementeze o ierarhie de clase pentru a realiza operații cu mulțimi ale căror
elemente vor fi de tipuri diferite.
class Element:
public:
virtual ~Element();
virtual void display() = 0;
virtual void read() = 0;
int equals(Element&) = 0;
virtual char *getClassName()=0;
};
class Set{
private:
int size;
Element *elements;
public:
Set(int size);
Set(int size,Element *pe);
Set(Set&);
~Set();
void insert(Element*);
void remove(Element*);
int lookup(Element*); // Cautarea unui element
Set operator +(Set &); // Reuniunea
Set operator –(Set &); // Diferenta
Set operator *(Set &); // Intersectia
int operator ==(Set &); // Testarea egalitatii
int operator <(Set &); // Testarea incluziunii
void read(); // Citirea elementelor multimii
void display(); // Afisarea elementelor multimii.
};
Să se realizeze utilizând aceste clase intersecția a 2 mulțimi ale căror elemente sunt
caractere.
8) Să se implementeze o clasă care sa rețină revistele si cărțile dintr-o bibliotecă. Pentru
aceasta se va folosi o listă simplu înlănțuită ale cărei elemente sunt revistele și/sau cărțile
din bibliotecă.
// Clasa de baza pentru clasa Revista si Carte
class Articol{
protected:
int cota; // Cota cartii sau revistei
char *titlul;
public:
Articol(int cota, char *titlul);
Articol(Articol&);
virtual ~Articol();
int getCota();
void setCota(int);
char *getTitlul();
void setTitlul();
virtual void display();
virtual void read();
}
class Revista: public Articol{
int nr; // Numarul revistei
int tiraj;
int frecv; // Numarul de aparitii pe luna
public:
Revista(int cota,int titlul,int nr,int tiraj,int frecv);
Revista(Revista&);
~Revista();
void display();
void read();
};
class Carte: public Articol{
char *autor;
char *editura;
int an; // Anul aparitiei
public:
Carte(int cota,int titlul,char * autor,
char *editura, int an);
Carte(Carte&);
~Carte();
void display();
void read();
};
class Nod {
Articol *info;
Nod *next;
public:
Nod(Articol *,Nod *next=0);
Articol* getInfo();
void setInfo(Articol *);
Nod *getNext();
Void setNext(Nod*);
};
class Biblioteca{
Nod *prim;
public:
Bibioteca();
void addArticol(Articol *);
int removeArticol(Articol *);
Articol * find(int cota);
Articol * find (char *titlul);
void display();
}

9) Să se implementeze clasa Telefon (nr_tel, nume_operator). Să se deriveze din aceasta clasa


TelefonMobil (autonomie, tip_acumulator).
10) Să se implementeze clasa abstractă FiguraGeometrica, din care sa se derive Cerc și
Poligon. Să se deriveze din Poligon clasa Patrulater și Triunghi. Din Patrulater să se
deriveze clasa Dreptunghi. Funcții virtuale: getAria, getPerimetru
11) Implementați următoarea ierarhie de clase:
class Localitate{
protected:
char *denumire;
int cod;
long nr_locuitori;
public:
……
virtual void display();
};
class Oras :public Localitate{
protected :
int nrBlocuri;
public:
……..
};
class Capitala :public Oras{
protected:
char *numePrefect;
public:
……
};
class Judet {
Localitate *p;
int nrLoc;
public:
……….
};

12) Realizați un program care citește dintr-un fișier text n numere complexe si calculează
produsul lor.
13) Să se implementeze o clasă Grupa ce reține studenții dintr-o grupă. Clasa va avea metode
pentru salvarea respectiv încărcarea grupei într-un/dintr-un fișier.
14) Să se realizeze un program C++ ce realizează concatenarea mai multor fișiere text al căror
nume se preiau în linia de comandă. Se vor utiliza stream-uri.
15) Sa se implementeze clasa Matrice utilizând template-uri reprezentată sub formă liniară ale
cărei elemente pot fi numere întregi, reale. Să se supraîncarce operatorii: +,-,*,citire
(>>),afișare (<<).
16) Sa se implementeze clasa Multime ale cărei elemente pot fi de orice tip. Supraîncărcați
operatorii: +(reuniune), -(diferența), *(intersecție).
17) Implementați clasa ArboreBinar ce implementează noțiunea de arbore binar ale cărui noduri
pot fi de orice tip: numere întregi, reale, obiecte. Clasa va conține metodele:
- creare arbore
- parcurgere în inordine
- parcurgere în postordine
- parcurgere în preordine
18) Implementați clasa ArboreOarecare ce implementează noțiunea de arbore oarecare ale cărui
noduri pot fi de orice tip: numere întregi, reale, obiecte. Clasa va conține metodele:
- creare arbore
- parcurgere în preordine
- parcurgere în postordine
- parcurgere în inordine
19) Sa se implementeze clasa Coada ale cărei elemente pot fi de orice tip. Clasa va conține
metodele:
- Creare coada
- Afișare coada
- Inserare în coadă
- Eliminare din coadă
20) Să se creeze clasa NumarRațional, care permite lucrul cu numere raționale de forma x=p/q,
ce cuprinde:
a) Două date membru p și q de tip întreg
b) Constructori ce permit declarații ca: NumarRational a, a(2,5)
c) Destructor
d) Metode de adunare, înmulțire, împărțire a două numere raționale
e) Metodă de simplificare a unui număr rațional cu cel mai mare divizor comun dintre p
și q
f) Metodă de amplificare a unui număr rațional cu un număr natural transmis prin
parametru
Scrieți un program care citește două numere raționale și tipărește suma, produsul, câtul
acestora, precum și verificarea unui număr rațional dacă este ireductibil, în caz contrar să se
simplifice numărul ca să devină ireductibil. Să se implementeze algoritmul care aduce două
fracții la același numitor comun.
21) Să se creeze clasa NumarComplex, care permite lucrul cu numere complexe de forma
z=a+bi, ce cuprinde:
a) Două date membru a, b de tip float
b) Constructori ce permit declarații ca: NumarComplex z, z(2) (ce reține numărul
z=2+0i, z1.2, -7.5)
c) Destructor
d) Metode de adunare, scădere, înmulțire, împărțire a două numere complexe
Scrieți un program care citește două numere complexe și tipărește suma, diferența, produsul,
câtul lor.
22) Să se creeze clasa NumarNatural, ce cuprinde:
a) Dată membru x, întreg
b) Următoarele metode:
a. Numărul de cifre zecimale ale lui x
b. Reprezentarea în baza 2 a lui x
c. Inversul (oglinditul) său
d. Proprietatea de primalitate a lui x
c) Constructori ce permit declarații ca: NumarNatural n, n(213)…
d) Destructor
Scrieți un program care citește un număr natural și care afișează numărul de cifre ale
numărului reprezentat în baza 2, verifică dacă este palindrom și afișează mesajul ”E PRIM”
dacă numărul nu are divizori în afară de 1 și el însuși, sau mesajul ”NU E PRIM”, în caz
contrar.
23) Câmpul n1 - un număr întreg. Câmpul n2 – număr real nenul. Creați metoda power() – va
returna numărul n2 la puterea n1.
24) Câmpul n1 - un număr întreg, Câmpul n2 – număr real. Creați metoda întreg() - care va
returna partea întreagă a fracției n1/n2. Metoda trebuie să verifice inegalitatea numitorului cu
zero.
25) Câmpul n1 - un număr real pozitiv (prețul bunurilor). Câmpul n2 – număr întreg pozitiv
(numărul de bunuri). Creați metoda cost() – va returna numărul ce reprezintă valoarea totală
a bunurilor.
26) Câmpul n1 - un număr real (suma depozitul în lei). Câmpul n2 – număr real (procentul
anual). Creați metoda valoare(int) – va returna suma de bani împreună cu calcularea
dobânzii timp de 1, 2, 3, 4 ani.
27) Câmpul n1 - un număr întreg pozitiv (numărul de ore). Câmpul n2 – un număr întreg pozitiv
(numărul de minute). Creați metoda secunde() – va returna numărul total al secundelor
scrise în cele două câmpuri.
28) Câmpul n1 - un număr real (coordonata x). Câmpul n2 – număr real (coordonata y). Creați
metoda distanta() – va returna distanța de la punctul (0,0) la punctul cu coordonatele (n1,
n2).
29) Câmpul n1 - un număr întreg pozitiv (calorii la 100g). Câmpul n2 – număr real (greutatea
produsului în kilograme). Creați metoda calorii() – va returna numărul de calorii ale
produsului.
A. În calitate de clasă de bază se va crea clasa triad.
Date: trei numere reale;
Metode: constructorul cu/fără parametri, citire și afișare.
30) Creați clasa triunghi, derivata clasei triad. Pentru clasa triunghi vor fi implementate metode
pentru determinare a suprafeței, a perimetrului și o metodă prin intermediul căreia se va
verifica dacă datele introduse pot fi lungimile laturilor unui triunghi. De la tastatură se citesc
datele despre n triunghiuri. Elaborați un program prin intermediul căruia, la ecran se vor
afișa datele despre toate triunghiurile, triunghiul cu suprafață maximă și triunghiul cu
perimetru maxim.
31) Creați clasa paralelogram, derivata clasei triad. Pentru clasa paralelogram vor fi
implementate metodele de determinare a suprafeței și a perimetrului. De la tastatură se citesc
datele despre n paralelograme. Elaborați un program prin intermediul căruia la ecran se vor
afișa datele despre toate figurile, paralelogramul cu suprafață maximă, paralelogramul cu
perimetru maxim.
B. În calitate de clasă de bază se va crea clasa persoana.
Date: nume, prenume, anul, cnp (codul personal de 13 cifre);
Metode: citire, afișare, vârsta.
32) Creați clasa Salariat, derivata clasei persoana. Pentru clasa salariat vor fi adăugate:
Date: numărul de ore lucrate, plata pentru o oră, anul angajării;
Metode: vor fi redefinite metodele de citire și afișare, salariu. Salariul va fi determinat
conform formulei: nr_ore*plata.
De la tastatură se citesc datele despre n salariați. Elaborați un program prin intermediul
căruia la ecran se vor afișa datele despre toți salariații, salariatul cel mai tânăr și salariatul cu
salariu maxim.
33) Creați clasa Student, derivata clasei persoana. Pentru clasa student vor fi adăugate:
Date: media notelor curente, grupa;
Metode: vor fi redefinite metodele de citire și afișare, bursa. Bursa va fi determinată
conform formulei: media*75 lei, dacă media este mai mare decât 7.5, în caz contrar va fi 0.
De la tastatură se citesc datele despre n studenți. Elaborați un program prin intermediul
căruia la ecran se vor afișa datele despre toți studenții, studentul cel mai tânăr, studentul cu
bursa maximă.
34) Să se definească o clasă punct cu 2 câmpuri x și y pentru coordonatele unui punct în plan.
- Să se scrie constructori de inițializare si de copiere pentru clasa punct.
- Să se scrie metode pentru citirea și afișarea variabilelor de tip punct.
- Să se creeze o clasă triunghi formată din 3 puncte în plan.
- Să se scrie constructori pentru clasa triunghi.
- Să se scrie metode pentru citirea și afișarea obiectelor de tipul triunghi.
- Să se scrie metode pentru calculul perimetrului și a ariei unui triunghi.
35) Creați obiectul cerc.
Date: lungimea razei;
Metode: citire, afișare, inițializare, determinarea lungimii discului, a suprafeței și a
diametrului.
Se vor introduce datele despre două cercuri și se vor afișa datele despre cercul cu suprafața
maximă și cercul cu lungimea discului minimală.
36) Creați obiectul trapez_isoscel.
Date: baza mare, baza mică, înălțimea;
Metode: citire, afișare, inițializare, determinare a perimetrului și ariei.
Se vor introduce datele despre două trapeze și se va afișa trapezul cu suprafața maximă și
trapezul cu perimetrul minim.
37) Creați obiectul paralelogram.
Date: lungimile laturilor și înălțimea;
Metode: citire, afișare, inițializare, determinare a perimetrului și ariei.
Se vor introduce datele despre două paralelograme și se vor afișa datele despre
paralelogramul cu suprafața maximă și paralelogramul cu perimetrul minim.
A. În calitate de clasă de bază se va crea clasa triad.
Date: trei numere reale;
Metode: constructorul cu/fără parametri, citire și afișare.
38) Creați clasa trapez_isoscel, derivata clasei triad. Pentru clasa trapez_isoscel vor fi
implementate metodele de determinare a suprafeței și a perimetrului. De la tastatură se citesc
datele despre n trapeze isoscele. Elaborați un program prin intermediul căruia la ecran se vor
afișa datele despre toate figurile, trapezul cu suprafață maximă, trapezul cu perimetru
maxim.
39) Creați clasa prismă (baza este dreptunghi), derivata clasei triad. Pentru clasa prismă vor fi
implementate metodele de determinare a suprafeței totale, laterale și de determinare a
volumului. De la tastatură se citesc datele despre n prisme. Elaborați un program prin
intermediul căruia, la ecran se vor afișa datele despre toate prismele, prisma cu suprafață
maximă, prisma cu volumul maxim.
40) Creați clasa piramidă (baza este dreptunghi), derivata clasei triad. Pentru clasa piramidă vor
fi implementate metodele de determinare a suprafeței totale, laterale și de determinare a
volumului. De la tastatură se citesc datele despre n piramide. Elaborați un program prin
intermediul căruia, la ecran se vor afișa datele despre toate piramidele, piramida cu suprafață
maximă, piramida cu volumul maxim.
41) Se consideră drept bază clasa dreptunghi. În baza acestei clase să se derive clasele piramidă
și prismă. Să se implementeze polimorfismul pentru metodele: citire, afișare, suprafața și
volum. De la tastatură se citește numărul de figuri. Elaborați un program care va permite :
a) citirea figurilor de la tastatură;
b) afișarea acestora;
c) afișarea figurilor sub formă de piramidă;
d) afișarea figurilor sub formă de prismă;
e) afișarea figurii cu suprafață maximă;
f) afișarea figurii cu volum maxim;
g) afișarea volumului total al figurilor;
h) afișarea suprafeței totale a figurilor;
i) sortarea figurilor în ordine descrescătoare suprafeței.
42) Se consideră drept bază clasa paralelogram. În baza acestei clase se derive clasele piramidă
și prismă. Să se implementeze polimorfismul pentru metodele: citire, afișare, suprafața și
volum. De la tastatură se citește numărul de figuri. Elaborați un program care va permite:
a) citirea figurilor de la tastatură;
b) afișarea acestora;
c) afișarea figurilor sub formă de piramidă;
d) afișarea figurilor sub formă de prismă;
e) afișarea figurii cu suprafață maximă;
f) afișarea figurii cu volum maxim;
g) afișarea volumului total al figurilor;
h) afișarea suprafeței totale a figurilor;
i) sortarea figurilor în ordine descrescătoare suprafeței.
43) Se consideră drept bază clasa cerc. În baza acestei clase se derivă clasele con și cilindru. Să
se implementeze polimorfismul pentru metodele: citire, afișare, suprafața și volum. De la
tastatură se citește numărul de figuri. Elaborați un program care va permite:
a) citirea figurilor de la tastatură;
b) afișarea acestora;
c) afișarea figurilor sub formă de con;
d) afișarea figurilor sub formă de cilindru;
e) afișarea figurii cu suprafață maximă;
f) afișarea figurii cu volum maxim;
g) afișarea volumului total al figurilor;
h) afișarea suprafeței totale a figurilor;
i) sortarea figurilor în ordine descrescătoare suprafeței.
44) Implementați o clasă numită vector utilă pentru operațiile cu tablourile de numere întregi,
având ca date membru un tablou de numere întregi (int elem[20]) și numărul efectiv de
elemente ale acestuia (int n). Includeți în clasă metode corespunzătoare pentru citirea unui
vector de la tastatură, înmulțirea tuturor elementelor cu un scalar, adăugarea unui nou
element în vector, eliminarea unui element din vector și afișarea respectivului vector. În
exteriorul clasei definiți o funcție pentru adunarea a 2 elemente de tip vector.
45) Implementați o clasă numită vector utilă pentru operațiile cu tablourile de numere întregi,
având ca date membru un tablou de numere întregi (int elem[20]) și numărul efectiv de
elemente ale acestuia (int n). Includeți în clasă metode corespunzătoare pentru citirea unui
vector de la tastatură, adăugarea unui nou element în vector, eliminarea unui element din
vector și afișarea respectivului vector.
46) Să se implementeze clasa mulțime care permite manipularea mulțimilor de numere. Clasa
conține un constructor cu parametri și metode pentru realizarea operațiilor de reuniune și
intersecție a 2 mulțimi
47) Să se definească clasa matrice și să se implementeze o funcție friend care realizează
adunarea a 2 matrici;
48) Să se implementeze clasa carte cu atributele autor si ISBN derivată din clasa publicație care
are atributele nume și număr de pagini.
49) Să se implementeze o clasă dreptunghi definită prin colțurile stânga-sus și dreapta-jos,
derivată din clasa Point care conține coordonatele unui punct.
50) Să se implementeze clasa număr_rațional care sa conțină ca atribute numitorul și
numărătorul. Clasa conține un constructor cu parametri și metode pentru adunare, scădere,
înmulțire
51) Implementați o clasă care calculează suma elementelor de pe fiecare coloană și le introduce
într-un vector.
52) Să se implementeze clasa automobil cu atributele culoare, nr. uși, marca, derivată din clasa
mașina cu atributele nr. roți și greutate.
53) Să se implementeze într-o clasă matrice o metodă care calculează suma elementelor de sub
diagonala principală și o introduce într-un atribut membru.
54) Să se implementeze clasa student având ca atribute nume, prenume, nota1, nota2, și ca
metode un constructor cu parametri, funcții de acces pentru toate atributele și o metodă care
determină nota maximă.
55) Pornind de la clasa de baza persoana (nume, vârsta, constructor cu parametri), să se
implementeze clasa derivata medic (specializare, constructor, funcția de acces și funcția de
afișare atribute).
56) Să se implementeze clasa dreptunghi (lungime, lățime, constructor implicit, constructor cu
parametri). Definiți funcția friend pentru calculul ariei și perimetrului.
57) Pornind de la clasa punct (x, y, constructor, funcția acces, metoda pentru distanță) rezultă
clasa dreptunghi. Construiți o funcție friend pentru clasa dreptunghi care verifică dacă
dreptunghiul e pătratic.

Modulul 4 „Formarea deprinderilor de lucru în echipe”

*Pentru fiecare aplicație se va elabora logo

1) Realizați o aplicație Magazin*, prin intermediul căruia vor fi gestionate telefoanele mobile
ale unui magazin. Despre un telefon se cunosc următoarele date: marca, anul ediției,
culoarea, prețul, termenul de garanței, tipul camerei video etc.
2) Realizați o aplicație Hoteluri*, prin intermediul căruia vor fi administrate hotelurile dintr-o
țară. Despre un hotel se cunosc următoarele date: nume hotel, adresa, numărul de stele,
numărul de odăi (camere), costurile minim și maxim pentru o cameră etc.
3) Realizați o aplicație Salon Auto* prin intermediul căruia vor fi gestionate automobilele
dintr-un salon auto. Despre un automobil se cunosc următoarele date: marca, anul ediției,
culoarea, prețul, capacitatea motorului, consumul la 100 km etc.
4) Realizați o aplicație de lucru cu Teste Grilă*,

Un test grilă este format dintr-un număr variabil de itemi. Un item constă într-o întrebare pentru
care se oferă exact patru variante de răspuns, dintre care doar un singur răspuns este corect.
Când se generează un test grilă, se aleg în mod aleatoriu itemi distincți din lista itemilor
disponibili, numărul acestora fiind prestabilit (dar fără a depăși 100). La rezolvarea unui test
grilă, pentru evaluare vom considera că toți itemii din test au aceeași pondere pentru calculul
punctajului la test. La evaluare trebuie să se afișeze punctajul total obținut la test, dar și
feedback punctual pentru fiecare item. Feedbackul poate fi doar Corect/ Incorect sau puteți afișa
un feedback mai elaborat, specific itemului respectiv (pentru itemii care au asociat un feedback
constructiv).
5) Realizați o aplicație pentru jocul de Blackjack*

Blackjack, cunoscut și sub numele de 21, este unul dintre cele mai populare jocuri. de cărți de
cazino din lume. Regulile jocului pot fi consultate pe Internet .

6) Realizați o aplicație Catalogul electronic *

Construiți clasele necesare și proiectați o aplicație care să funcționeze ca un catalog școlar


electronic. Catalogul electronic conține catalogul corespunzător fiecărei clase din școală.
Catalogul unei clase conține toți elevii clasei, cu notele (inclusiv nota la teză, dacă este un obiect
cu teză) și absențele (motivate și nemotivate) la fiecare obiect. Catalogul trebuie să permită
toate operațiile permise în catalogul „oficial".

7) Realizați o aplicație Biblioteca *


Realizați o aplicație care să permită gestiunea unei biblioteci școlare. La bibliotecă trebuie să
reținem :
o evidența cărților (pentru fiecare carte reținem cota cărții, titlul, autorul, editura, anul
apariției) ; aplicația trebuie să permită adăugarea unei cărți, ștergerea unei cărți,
căutarea cărților după titlu (căutare cu potrivire totală sau parțială), căutarea tuturor
cărților unui autor etc. , pentru cărțile de specialitate, rețineți domeniul cărții
(informatică, drept, medicină etc.) ; aplicația trebuie să realizeze căutări după domeniu
; evidența cititorilor (pentru fiecare cititor reținem codul de identificare a cititorului,
numele, adresa, telefonul, e-mail-ul); aplicația trebuie să permită adăugarea unui
cititor, ștergerea unui cititor, căutarea cititorilor după nume (căutare cu potrivire totală
sau parțială), căutarea unui cititor după codul de identificare etc. ,

o evidenta împrumuturilor (un împrumut este identificat prin cota cărții împrumutate,
codul cititorului care a împrumutat cartea, data la care a avut loc împrumutul și data
la care a fost restituită cartea împrumutată) ; aplicația trebuie să permită realizarea
unui împrumut, restituirea unei cărți, vizualizarea tuturor împrumuturilor restante
(cărțile pentru care termenul de predare a fost depășit, împreună cu datele cititorilor
care au împrumutat aceste cărți), vizualizarea tuturor împrumuturilor unui cititor,
vizualizarea tuturor cititorilor care au împrumutat o anumită carte etc.
Într-o dată membră statică veți reține numărul de zile pentru care poate fi împrumutată o
carte (același pentru toate cărțile și pentru toți cititorii).
8) Realizați o aplicație Programare la Dentist*

La un cabinet stomatologic, secretara realizează programarea pacienților. Pentru fiecare


pacient programat, reține numele, timpul la care pacientul dorește să fie programat (ora și
minutul), respectiv durata maximală estimativă a tratamentului (determinată pe baza vastei
experiențe a secretarei și exprimată de asemenea în ore și minute). Doctorul lucrează după
următorul algoritm :
o sosește la cabinet la ora la care este programat primul pacient ;
o nu lucrează mai mult de 8 ore ;
o când termină de tratat un pacient, iar durata efectivă a tratamentului este mai mică decât
durata maximală estimată, doctorul se odihnește în timpul rămas până la durata
maximală estimată ;
o secretara are suficientă experiență și estimează corect durata maximală a unui tratament,
astfel că doctorul nu depășește niciodată durata maximală a tratamentului unui pacient ;
o după terminarea tratamentului unui pacient (și a eventualei perioade de odihnă), doctorul
invită în cabinet următorul pacient programat ;
o doctorul nu suportă să existe pacienți în sala de așteptare ; fiecare pacient vine exact la ora
la care este programat și intră imediat în cabinetul doctorului.
În fiecare zi, secretara analizează lista programărilor pentru a doua zi și anulează o serie de
programări (telefonând pacienților pentru confirmare sau pentru reprogramare în altă zi), astfel încât:
o toate restricțiile din algoritmul de lucru al doctorului să fie respectate ;
o doctorul să trateze un număr maxim de pacienți.
Scrieți un program care afișează lista programărilor confirmate pentru a doua zi.
Anexa Structura portofoliului

1 Foaia de titlu a practici de specialitate I

MINISTERUL EDUCAŢIEI AL REPUBLICII MOLDOVA


CENTRUL DE EXCELENȚĂ ÎN ECONOMIE ȘI FINANȚE

CATEDRA INFORMATICĂ

(Times New Roman, 14pt, bold, interval 1.0, centrat)

Practica de specialitate I
(Times New Roman, 18pt, bold, interval 1.0, centrat)

la specialitatea 1851 ,,Informatică”


(Times New Roman, 14pt, bold, centrat)

Autor:
Elevul(a) gr. INF 11512 G,
învățământ cu frecvență la zi,
Ion POPESCU
____________________
(semnătura)
(Times New Roman, 12pt)

Conducător de practică:
profesor, gr. didactic I,
Galina LUNCAȘU
____________________
(semnătura)
(Times New Roman, 14pt)

Chişinău, 2017
(Times New Roman, 14pt, bold, centrat)
2. Cuprinsul
CUPRINSUL
I. AGENDA ..............................................................................................................................3
II. PROBLEMELE REZOLVATE
2.1. Modulul 1 (denumirea din conținuturi)..............................................................................4
Problema 1......................................................................................................................5
Problema 2......................................................................................................................7
......................
2.2. Modulul 2 (denumirea din conținuturi)..............................................................................24
Problema 1.....................................................................................................................25
Problema 2.....................................................................................................................27
......................
III. CONCLUZII ....................................................................................................................40
IV. BIBLIOGRAFIE...............................................................................................................42
V. ANEXE.................................................................................................................................43

3. Agenda practicii cu evidența activităților desfășurate;

Nr Data zz.ll.aaaa Compartimentul temelor Reușita

4. Descrierea problemelor rezolvate:

Modulul 1 „Elemente de programarea modulară în limbajele: Pascal și C/C++” va fi structurat după


cum urmează:
A. Condiția problemei
B. Codul programului scris în limbajele Pascal și C++, divizat în mai multe module (unit-uri) cu
comentarea succintă a fiecărui fișier.
C. Rezultatul execuției programelor
Modulul 2„Aplicații ale tehnicilor de programare utilizate în procesul de studiu în baza limbajelor:
Pascal și C/C++” structurat după modelul indicat pentru modulul doi.
Modulul 3„Elemente de programare orientată pe obiecte în baza limbajului C++” structurat după
modelul indicat pentru modulul doi.
Modulul 4 „Formarea deprinderilor de lucru în echipe” structurat după cum urmează:
A. Prezentarea problemei și echipei de lucru.
B. Precizarea problemei rezolvate de către membru grupului
C. Prezentarea rezultatului final al întregului accentul fiind pus pe problema soluționate de
către membru echipei.

5. Concluzii
- Analiza succintă, rezumativă a rezultatelor obținute, atât în cadrul studierii problemelor
teoretice, cât și a materialului experimental realizat și aprecierea acestor rezultate. Se vor
menționa modalitățile și nivelul de realizare a obiectivelor formulate;
- Reflectarea opiniilor și a contribuției personale în studierea și soluționarea problemei
(problemelor) abordate, a elementelor noi de investigare și tratare a problemei respective,
se va efectua generalizarea experiențelor, se vor formula recomandări și propuneri de
utilizare practică etc.

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