Sunteți pe pagina 1din 98

CAPITOLUL I

---------------------------------------------------------------------
Programe Liniare
Exemplul 1.
Se consideră două numere întregi. Să se scrie un program care măreşte aceste numere cu 100.
Program P1;
Uses Crt;
Var x,y: integer;
Begin
Clrscr;
Writeln(‘Introdu doua numere intregi:’);
Writeln(‘x=’); Readln(x);
Writeln(‘y=’); Readln(y);
x:=x+100;
y:=y+100;
Write(‘Numerele marite cu 100 : ‘);
Writeln(‘x=’,x, ‘ y=’,y);
Readln;
End.
Introdu două numere întregi:
x=4
y=15
Numerele mărite cu 100: x=104 y:=115

Exemplul 2.
Se consideră trei numere întregi. Să se scrie un program care calculează media lor aritmetică.

Program P2;
Uses Crt;
Var a,b,c,S: integer;
Med: real;
Begin
Clrscr;
Writeln(‘Introdu trei numere intregi:’);
Readln(a,b,c);
S:=a+b+c;
Writeln(‘Suma numerelor ‘,a, ‘,’ ,b, ‘ si’ ,c, ‘ este:
‘, S);
Med:=S/3;
Writeln(‘Media aritmetica este:’);
Writeln(Med:5:2);
Readln;
End.
Introdu trei numere întregi: 5 10 15
Suma numerelor 5,10 şi 15 este: 30
Media aritmetică este: 10.00

Exemplul 3.
Să se scrie un program care calculează valoarea unui produs (Valoarea = Cantitatea*Cost).
Datele de intrare pot fi generate şi prin intermediul instrucţiunii de atribuire Cantitate:=25;
Cost:=18,20.
Program P3;
Uses Crt;
Var Cantitatea, valoarea, cost: real;
Begin
Clrscr;
Cantitatea:=25;
Cost:=18..20;
Valoarea:=Cantitatea*Cost;
Writeln(‘Valoarea=’ ,Valoarea:7:2);
Readln:
End.

Valoarea =455.00

Exemplu 4.
Se consideră două variabile de tip întreg. Să se scrie un program care efectuiază interschimbarea lor.
Program P4;
Uses Crt;
Var x,y,aux:integer;
Begin
Clrscr;
Wreteln(’Introduceti valorile variabilelor’);
Writeln(’x=’); Readln(x);
Writeln(’y=’); Readln(y);
Aux:=x; x:=y; y:=aux;
Writeln(’Dupa schimbarea: x=’ ,x, ’ y=’ ,y);
Readln;
End.
Introduceti valorile variabilelor
X=5
Y=10
Dupa schimbare: x=10 y:=5

Exemplul 5.
Se consideră coordonatele a două puncte A(x1,x1) şi B(x2,x2). Să se scrie un program carecalculează
distanţa dintre aceste puncte.

Programul va utiliza formula pentru calcularea distanţei dintre două puncte cu coordonatele date:
D=√(x2-x1)2+(y2-y1)2. La scrierea expresiei respective vor fi folosite: funcţia Sqr, care calculează
pătratul unui număr şi funcţia Sqrt, care calculează pătratul unui număr.
Program P5;
Uses Crt;
Var x1,x2,y1,y2,distanta:real
Begin
Clrscr;
Writeln(’Introdu coordonatele punctului A:’);
Readln(x1,y1);
Writeln(’Introdu coordonatele punctului B:’);
Readln(x2,y2);
Distanta:=Sqrt(sqrt(x1-x2)+sqrt(y1-y2));
Writeln(’Distanta=’,Distanta:6:2);
Readln;
End.
Introdu coordonatele punctului A: 3 8
Introdu coordonatele punctului B: -2 4
Distanţa=6.40

Exemplul 6.
Marin a cumpărat x caiete, preţul unuia fiind de p1 lei şi creioane y cu p2 lei bucata. Să se scrie un
program care calculează suma cheltuită de Marin.
Program P6;
Uses Crt;
Var x,y..1..100;
Suma,p1,p2:real;
Begin
Clrscr;
Write(’Introdu numarul de caiete cumparete:’); Readln(x);
Write(’Introdu pretul unui caiet:’); Readln(p1);
Write(’Introdu numarul de creioane cumparate:’); Readln(y);
Write(’Introdupretul unui creion:’); Readln(p2);
Suma:=x*p1+y*p2;
Writeln(’Marin a cheltuit suma de ’ ,suma:5:2,’ lei’);
Readln;
End.
Introdu numarul de caiete cumparate: 15
Introdu preţul unui caiet: 3
Introdu numărul de creioane cumpărate: 12
Introdu preţul unui creion: 1.5
Marin a cheltuit suma de 63.00 lei

Exemplul 7.
Se consideră un număr natural n, ce indică poziţia unei litere în alfabetul latin. Să se scrie un program
care afişează litera de pe poziţia n.
Program P7;
Uses Crt;
Var n:Byte;
Begin
Clrscr;
Write(’Introdu un numar din intervalul 1..27:’); Readln(n);
Write(‘Litera de popzitia ‘ ,n,’ ese “’);
Writeln(Chr((Ord(‘A’)-1)+n),’”’);
Readln
End.
Introdu un număr din intervalul 1..26: 5
Litera de pe poziţia 5 este ”E”

Exemplul 8.
Se consideră două numere întregi a şi b diferite. Să se scrie un program care atribuie variabilei t valoarea
true, dacă numărul a este mai mare decît numărul b, iar în caz contrar valoarea false.
Program P8;
Uses Crt;
Var a,b:integer;
T:boolean;
Begin
Clrscr;
Write(’Introdu dou[ numere intregi:’); Readln(a,b);
T:=a>b;
Writeln(’Rezultatul: ’,T); Readln;
End.
Introdu două numere întregi: -3 6
Rezultatul: FALSE

Exemplul 9.
Să se scrie un program care atribuie variabilei T valoarea true, dacă caracterul introdus de la tastieră este
literă mică, în caz contrar valoarea false. Se admit litere numai din alfabetul latin.
Program P9;
Uses Crt;
Var ch:char;
T:Boolean;
Begin
Clrscr;
Write(‘Introdu un character: ‘); Readln(ch);
T:=(ch>=’a’) And (‘ch<=’z’);
Writeln(‘Rezultatul: ‘ ,T);
Readln;
End.

Introdu un caracter: r
Rezultatul: TRUE

Exemplul 10.
Citiţi programul şi determinaţi ce se v-a afişa pe ecran în rezultatul execuţiei acestui program.

Program P10;
Uses Crt;
Type Gre=(Alfa,Beta,Gama,Delta);
Var x:Gre;
Begin
Clrscr;
x:=Gama;
Writeln(Ord(x));
Writeln(Ord(Succ(x)));
x:=Pred(x);
Writeln(Ord(x));
Readln;
End.

Programe Propuse
1. Să se scrie un program care citeşte de la tastieră un număr natural N şi afişează pătratul lui.
2. Se consideră trei numere întregi. Să se scrie un program care calculează suma şi produsul lor.
3. Se consideră cunoscute laturile unui dreptunghi. Să se scrie un program care calculează aria şi
perimetrul dreptunghiului.
4. Se consideră că numerele a, b, c, reprezintă lungimile laturilor unui triunghi. Să se scrie un
program care calculează aria acestui triunghi, folosind formula lui Heron:
S:= √p*(p-a)*(p-b)*(p-c) , unde a, b, c, sunt laturile triunghiului, iar p este semiperimetrul lui
(p=(a=b=c)/2).
5. Se consideră trei puncte cu coordonatele: A(x1,y1), B(x2,y2), C(x3,y3). Să se calculeze perimetrul
şi aria triunghiului cu vîrfurile în punctele A,B,C.
6. Se consideră un număr real x. Să se scrie un program care calculează 1-2x+3x2-4x3 şi
1+2x+3x2+4x3. De folosit cît mai puţine înmulţiri.
7. Să se scrie un program care calculează diagonala unui pătrat cu latura a.
8. Să se scrie un program care calculează aria unui cerc cu raza R.
9. Să se scrie un program care calculează valoarea funcţiei: Y=x2+(x3/2)2+3, pentru numărul real
x.
10. De la tastieră se introduce anul curent şi anul naşterii unui elev. Să se scrie un program care
afişează vîrsta elevului în ani.
11. Se consideră un număr întreg x. Să se scrie un program care ridică numărul x la puterea a
zecea, folosind cel mult patru semne de înmulţire.
12. Se consideră numărul întreg a. Să se scrie un program care afişează următorul triunghi:
a
a3 a6
a6 a3 a
13. Să se scrie un program care pentru orice literă din alfabetul latin introdusă de la tastieră să ne
afişeze numărul ei de ordine din alfabet.
14. De pe un lot de X1 hectare s-a recoltat Y1 tone de grîu, care a fost vîndut cu K1 lei kilogramul.
De pe al doilea lot de X2 hectare s-au recoltat Y2 tone de grîu, care a fost vîndut cu K2 lei
kilogramul.
a. Preţul mediu a unui kilogram de grîu. b. Recolta la hectar de pe fiecare lot. c. Recolta
medie la hectar.
15. Trei prieteni x, y, z, au procurat împreună o minge al cărei cost constituie 250 lei. Să se scrie un
program care calculează suma achitată de fiecare, dacă se ştie că y a achitat 35% din suma
totală, iar z a achitat cu15% mai mult decît y.
16. Se consideră un număr întreg N. Să se scrie un program care atribuie variabile logice T
valoarea true, dacă numărul N aparţine intervalului de la [ -2;5], în caz contrar-valoarea false.
logice
17. Se consideră un număr întreg N. Să se scrie un program care atribuie valori variabilei logice T
valoarea true, dacă, numărul N este mai mare decît 10, în caz contrar-valoarea false.
18. Se consideră două numere întregi. Să se scrie un program care atribuie valori variabilei logice
T valoarea true, dacă numerele introduse de la tastieră sunt egale în caz contrar-valoarea false.
19. Se consideră un număr natural x. Să se scrie un program care afişează true sau false în
dependenţă de faptul dacă numărul este par sau impar.
20. Se consideră un număr natural x. Să se scrie un program care determină ultima cifră a
numărului x.
21. Se consideră un număr natural x. Să se scrie un program care determină restul împărţirii
numărului x la 5.
22. Se consideră ecuaţia pătrată ax2+bx+c=0, unde a, b, c, sunt numere reale. Să se scrie un
program care calculează discriminantul ecuaţiei pătrate, D=Sqrt(b2-4ac2).
23. Să se scrie un program care calculează rădăcina ecuaţiei ax+b=0, unde a≠0, iar a şi b sunt
numere reale.
CAPITOLUL II
---------------------------------------------------------------------
Programe cu ramificatori
Instrucţiunea IF
Exemplul 1.
Se consideră două numere întregi distincte. Să se scrie un program care determină numărul mai mare.

Program P11;
Uses Crt;
Var a,b:integer;
Begin
Clrscr;
Write(‘a=’); Readln(a);
Write(‘b=’); Readln(b);
Write(‘Raspuns:’);
If a>bThen Writeln(‘Numarul’,a,’ este mai mare ca ‘,b)
Else Writeln(‘ Numarul’,b,’ este mai mare ca ‘,a);
Readln
End.

a=7
b=12
Răspuns: numărul 12 este mai mare ca 7

Exemplul 2.
Se consideră două numere întregi distincte. Să se scrie un program care înlocuieşte numărul mai mare cu
suma numerelor date, iar numărul mai mic cu valoarea absolută a diferenţei lor.
Program P12;
Uses Crt;
Var a,b,S,D:integer;
Begin
Clrscr;
Writeln(‘Dati a si b:’);
Write(‘a=’); Readln(a);
Write(‘b=’); Readln(b);
Writeln(‘Raspuns:’);
S:=a+b; D:=Abs(a-b);
If a>b Then
Begin
Writeln(‘Primul numar este mai mare’);
a:=S; b:=D;
End Else
Begin
Writeln(‘Al doilea numar este mai mare’);
a:=D; b:=S;
End;
Writeln(‘a=’,a:3,’b=’,b:3);
Readln;
End.

Dati a şi b
a=7
b=4
Răspuns: Primul număr este mai mare
a=11 b=3
Exemplul 3.
Se consideră două numere întregi. Dacă primul număr este pozitiv, atunci de ridicat acest număr la
pătrat, în caz contrar numerele să rămînă neschimbate.
Program P13;
Uses Crt;
Var x,y:integer;
Begin
Write(‘x=’); Readln(x);
Write(‘y=’); Readln(y);
IF x>0 Then x:=x*x;
Write(‘Raspuns:’);
Writeln(‘x=’,x,’ y=’,y);
Readln;
End.

x=-5
y=14
Răspuns: x=-5 y=14

Exemplul 4.
Să se calculeze valoarea funcţiei f definită pe mulţimea numerelor reale, pentru un număr x citit de la
tastatură

-2, dacă x≤-2


f= x, dacă -2<x<2
2, dacă x≥2

La scrierea programului vom utiliza instrucţiuni If imbricate

Program P14;
Uses Crt;
Var x,f:real;
Begin
Clrscr;
Write(‘Dati argumentul functieix=’); Readln(x);
If x<=-2 Then f:=-2
Else if f>=2 Then f:=2
Else f:=x;
Writeln(‘Raspuns:’);
Writeln(‘Argumentul functiei x=’,x:5:1);
Writeln(‘Valoarea functiei f=’,f:5:1);
Readln;
End.
Daţi argumentul funcţiei x=5
Răspuns:
Argumentul funcţiei x=5.0
Valoarea funcţiei f=2.0
Exemplul 5.
Se consideră trei numere întregi. Să se scrie un program care aranjează aceste numere în ordine
crescătoare.

Program P15;
Uses Crt;
Var x,y,z,aux:integer;
Begin
Clrscr;
Write(’Introduceti trei numere intregi x,y si z:);
Readln(x,y,z);
If x>y Then
Begin
Aux:=x; x:=y; y:=aux;
End;
If y>z Then
Begin
Aux:=y; y:=z; z:=aux;
End;
If x>y Then
Begin
Aux:=x; x:=y; y:=aux;
End;
Write(’Numerele aranjate crescator:’);
Writeln(x,’ ‚ ,y,’ ‚,z);
Readln;
End.

Daţi 3 numere întregi x,z şi z: 7 5 2


Numerele aranjate crescător: 2 5 7

Exemplul 6.
Se consideră trei numere întregi. Dacă primele două sunt nenule să se afişeze media aritmetică a tuturor
numerelor, în caz contrar să se afişeze numărul mai mare dintre toate numerele.

Program P16;
Uses Crt;
Var a,b,c,max: Integer;
Begin
ClrScr;
Write(‘Daţi 3 numere întregi a,b,c; ‘); Readln(a,b,c);
If a*b < > 0 Then
Writeln(‘Media arithmetică: ‘, (a+b+c)/3:5:1)
Else
Begin
Max:=a;
If b >max Then max:=b;
If c >max Then max:=c;
Writeln(‘Numărul mai mare :’, max);
End ;
Readln
End.

Dati trei numere întregi a, b şi c: 6 12 2


Media aritmetică: 6.7
Exemplul 7.
Se consideră un cerc cu raza R şi un pătrat cu latura a. Să se scrie un program care determină dacă cercul
încape în pătrat.
Program P17;
Uses Crt;
Var a,R:real;
Begin
Clrscr;
Write(‘Introdu raza cercului:’); Readln(R);
Write(‘Introdu latura patratului:’); Readln(a);
Write(‘Raspuns:’);
If R<=a/2 Then writeln(‘Cercul incape in patrat’)
Else Writeln(‘Cercul nu incape in patrat’);
Readln;
End.
Introdu raza cercului: 4
Introdu latura pătratului: 9
Răspuns: cercul încape în pătrat

Programe Propuse
1.Se consideră trei numere întregi. Să se scrie un program care determină numărul mai mare.
2.Se consideră patru numere întregi. Să se scrie un program care determină numărul mai mic.
3.Se consideră numărul natural N. Să se scrie un program care determină dacă numărul N este par.
4.Se consideră două numere întregi. Dacă primul număr este negativ atunci suma lor se micşorează de 5
ori, în caz contrar-se măreşte de 5 ori.
5.Se consideră două numere întregi. Dacă primul număr este pozitiv atunci el se măreşte cu 100 în caz
contrar numerele rămîn neschimbate.
6.Se consideră două numere întregi. Dacă primul număr este mai mare decît modulul celui de-al doilea
număr, atunci primul număr se micşorează de trei ori, în caz contrar numerele rămîn neschimbate.
7.Se consideră două numere întregi diferite. Să se alcătuiască un program care afişează numerele în
ordine descrescătoare.
8.Se consideră două numere întregi. Să se afişeze primul număr, dacă el este mai mare decît al doilea, în
caz contrar să se afişeze ambele numere.
9.Se consideră trei numere întregi. Să se scrie un program care ridică la pătrat numerele negative,
celelalte la rămîn neschimbate.
10.Se consideră trei numere întregi. Dacă toate sunt pozitive, să se afişeze numărul mai mare dintre al
doilea şi al treilea număr.
11.Se consideră trei numere întregi. Dacă suma primelor două este pozitivă, atunci să se scrie numerele
în ordine crescătoare, în caz contrar să se afişeze numărul maxim dintre ultimele două numere.
12.Se consideră trei numere întregi, două dintre care sunt egale. Să se scrie un program care afişează
numărul diferit de celelalte două.
13.Să se scrie un program care citeşte două numere x, y şi afişează 0, dacă numerele citite sunt egale,
afişează 1 dacă primul este mai mic decît al doilea şi afişează 2 dacă al doilea este mai mare decît
primul.
14.De la tastieră se introduce un caracter. Să se determine ce fel de caracter este: literă mare, literă mică,
cifră sau semn special. Se admit litere din alfabetul latin.
15.De la tastieră se introduce o literă din alfabetul latin. Să se determine dacă litera este vocală sau
consoană.
16.De la tastieră se introduce o cifră. Să se determine dacă cifra este pară.
17.Se consideră trei numere reale. Să se scrie un program care determină dacă aceste numere reprezintă
lungimile laturilor unui triunghi şi în caz afirmativ, să se calculeze perimetrul triunghiului.
18.Se consideră trei puncte cu coordonatele date: A(x1,y1), B(x2,y2), C(x3,y3). Să se determine care din
puncte se află mai aproape de originea de coordonate. Programul v-a utiliza formula pentru calcularea
distanţei dintre două puncte cu coordonatele date:D=Sqrt((xi-xj)2+(yi-yj)2)
19.Trei vînzători x, z, y, au vîndut portacale. X a vîndut 170 kilograme la preţul de 8.5 lei kilogramul, Y-
a vîndut 350 kilograme la preţul 8.8 lei kilogramul, Z-a vîndut 150 kilograme la preţul de 9 lei
kilogramul. Să se scrie un program care calculează preţul mediu de comercializare. Cine dintre
vînzători a obţinut cel mai mare venit.
20.Se consideră numerele reale x, z, y. Să se calculeze max(x+y+z,xyz).
21. Să se calculeze valoarea funcţiei f definită pe mulţimea numerelor reale, pentru un x citit de la
tastieră.

X2, dacă x≤0


F=
0, dacă x>0

22.Să se calculeze valoarea funcţiei f definită pe mulţimea numerelor reale, pentru un x citit de la
tastatură.

X, dacă x<0
Y= 0, dacă 0≤x≤3
0, dacă x>3

23.Să se scrie un program pentru rezolvarea ecuaţiilor liniare de forma: ax+b=0.


24.Să se scrie un program pentru rezolvarea ecuaţiei pătrate ax2+bx+c=0 cu coeficienţi reali.
25.Să se scrie un program pentru rezolvarea ecuaţiei bipătrate ax4+bx2+c=0 cu coeficienţi reali.

Instrucţiunea Case
Exemplul 1.
De la tastieră se citeşte numărul de ordine al zilei săptămînii. Să se afişeze denumirea zilei. Luni-1,
Marţi-2, Mercuri-3, Joi-4, Vineri-5, Sîmbătă-6, Duminică-7.
Programul citeşte un număr între 1 şi 7 şi afişează denumirea zilei corespunzătoare numărului.
Program P18;
Uses Crt;
Var n:1..7;
Begin
Clrscr;
Write(‘Introdu un numar de la 1..7 :’) ; Readln(n) ;
Write(‘Raspuns :’) ;
Case n of
1: Write(‘Luni’);
2: Write(‘Marti’);
3: Write(‘Mercuri’);
4: Write(‘Joi’);
5: Write(‘Vineri’);
6: Write(‘Simbata’);
7: Write(‘Duminica’)
Else Write(‘Nu exista asa zi a saptaminii cu asanumar’);
End;
Readln
End.

Introdu un număr între 1..7: 3


Răspuns: Miercuri

Exemplu 2.
De la tastatură se introduce o dată din luna aprilie anul 2000. Să se determine zilei ce a fost la această
dată, dacă se ştie că 1 aprilie a fost sîmbătă.
Se grupează datele din luna apriliepentru fiecare zi a săptămînii. Prin intermediul unui selector se
selecteză varianta respectivă.
Program 19;
Uses Crt;
Var data:1..30;
Begin
Clrscr;
Write(‘Introdu un numar intre 1..30:’); Readln(data);
Write(‘Raspuns:’);
Case data of
3,10,17,24 : Writeln(‘Luni’);
4,11,18,25 : Writeln(‘Marti’);
5,12,19,26 : Writeln(‘Mercuri’);
6,13,20,27 : Writeln(‘Joi’);
7,14,21,28 : Writeln(‘Vineri’);
1,8,15,22,29 : Writeln(‘Simbata’);
2,9,16,23,30 : Writeln(‘Duminica’)
Else Write(‘Nu exista zi a saptaminii cu asa numar’);
End;
Readln;
End.

Introdu un număr între 1..30: 14


Răspuns: Vineri

Exemplul 3.
De la tastatură se citeşte unul dintre următoarele numere: 1, 5, 10, 50, 100, 500, 1000. Să se scrie un
program care afişează cifra romană corespunzătoare numărului citit.

Program P20;
Uses Crt;
Var x:1..1000;
Begin
Clrscr;
Write(‘Introdu 1,5,10,50,100,500,1000: ‘); Readln(x);
Write(‘Raspuns:’);
Case x of
1 : Writeln(‘I’);
5 : Writeln(‘V’);
10 : Writeln(‘X’);
50 : Writeln(‘L’);
100 :Writeln(‘C’);
500 :Writeln(‘D’);
1000 : Writeln(‘M’);
End;
Readln;
End.

Introdu 1,5,10,50,100,500 sau 1000. 100


Răspuns: C

Exemplul 4.
Să se scrie un program care determină acţiunea pietonului în faţa semaforului.
În program se utilizează tiupul enumerare. O variabilă de tip enumerare nu poate fi citită cu procedura
Read (nici afişată cu procedura write).
Variabila respectivă poate primi valoare numai prin intermediul instrucţiunii de atribuire.

Program P21;
Uses Crt;
Type Semafor=(Rosu, Galben,Verde);
Var x: Semafor;
Begin
Clrscr;
x:=Galben; x:=Succ(x);
Write(‘Raspuns: ‘);
Case car Of
Rosu: Writeln(‘Opritiva’);
Galben: writeln(‘Atentie’);
Verde: writeln(‘Porniti-va’);
End;
Readln;
End.

Răspuns: Porniti-va

Exemplul 5.
De la tastatură se citeşte un caracter din tabelul de cod ASCII. Să se determine ce fel de caracter este,
adică literă mare, literă mică, cifră sau semn special. Se admit litere numai din alfabetul latin.

În program se utilizează tipul interval.


Se citeşte caracterul şi se verifică dacă el aparţine intervalului de litere mari, intervalul de litre mici
sau intervalul de cifre. Dacă este adevărată una din condiţiile enumerate mai sus, atunci se afişează
mesajul corespunzător, în caz contrar se afişează mesajul ce confirmă că caracterul introdus este semn
special.
Program P22.
Uses crt;
Var car:char;
Begin
Clrscr;
Write(‘Introdu un caracter’);
Readln(car);
Write(‘Raspuns: ‘);
Case car of
‘A’..’Z’:Writeln(‘caracterul introdus este litera mare’);
‘a’..’z’: Writeln(‘caracterul introdus este litera mica’);
‘0’..’9’:Writeln(‘caracterul introdus este cifra’)
Else Writeln(‘caracterul introdus este semn special’);
End;
Readln;
End.
Introdu un caracter: +
Răspuns:Caracterul introdus este semn special
Programe Propuse
1. Se citeşte numărul de ordine al lunii. Să se scrie un program care afişează anotimpul
corespunzător lunii.
2. Se citeşte de la tastieră numărul de ordine al zilei săptămînii. Să se scrie un program care
afişează numărul
3. de lecţii pe care le aveţi in această zi.
4. Se citeşte numărul de ordine al lunii. Să se scrie un program care afişează numărul zilei
corespunzătoare lunii.
5. De la tastieră se citeşte o cifră. Să se scrie un program care afişează denumirea acesteia.
6. De la tastieră se citeşte o literă din alfabetul latin. Să se scrie un program care determină dacă
litera introdusă reprezintă o vocală sau o consoană.
7. De la tastieră se citeşte două numere întregi diferite de zero şi una din operaţiile aritmetice
+,-,*,/. Dacă a fost introdus semnul +, să se calculeze suma numerelor, dacă a fost introdus
semnul – să se calculeze diferenţa numerelor, dacă a fost introdus semnul * să se calculeze
produsul lor, dacă a fost introdus semnul / să se calculeze cîtul lor.
8. Se consideră un număr natural N. Să se scrie un program care determină dacă ultima cifră a
numărului N este divizibilă cu 3.
9. De la tastatură se citeşte una din următoarele cifre romane: I,V,X,L,C,D,M. Să se scrie un
program care afişează numărul zecimal corespunzătoare cifrei.
10. De la tastatură se citeşte un număr natural n, n≤n≤99. să se scrie un program care scrie acest
număr cu litere. De exemplu, dacă s-a introdus n=12 se v-a obţine doisprezece.
CAPITOLUL III
---------------------------------------------------------------------
Programe cu cicluri

Exemplul 1.
Să se scrie un program care afişează pe ecran cuvîntul „Informatică” de n ori n≤20, mărimea n fiind
introdusă de la tastieră.

Instrucţiunea Write(’Informatica’) afişează pe ecarn cuvîntul Informatica. Întrucît se cere ca acest


cuvînt să fie afişat de n ori se organizează repetarea de n ori a instrucţiunii respective prin intermediul
instrucţiunii de ciclare For.
Program P23;
Uses Crt;
Var i,n:1..20;
Begin
Clrscr;
Write(‘N=’); Readln(n);
For i:=1 to n do Write(‘Informatica’);
Readln
End.

N=4
Informatica Informatica Informatica Informatica

Varianta a doua a programului rezolvă problema prin utilizarea instrucţiunii de ciclare cu condiţie
anterioară While, în care incrementarea variabilei i se face explicit.

Program P23_2;
Uses Crt;
Var i,n:1..20;
Begin
Clrscr;
Write(‘Introducetil pe n=’); Readln(n);
i:=1;
Repeat
Write(‘Informatica’);
i:=i+1;
Until i>n;
Readln
End.

N=3
Informatica Informatica Informatica

Exemplul 2.
Să se scrie un program care calculează suma numerelor naturale mai mici sau egale ca N.

Pentru a calcula suma respectivă se foloseşte variabila S, care se iniţializează cu 0. Se parcurg toate
valorile I din ciclu, adunîndu-le pe rind la suma S. După terminarea execuţiei ciclului în S se va obţine
valoarea sumei cerute.
În cele trei variante ale programului care sunt propuse pentru rezolvarea acestei probleme,
variabilele N,S,I sunt declarate de tip interval 1..MaxInt, deoarece ele reprezintă numere întregi
pozitive

Program P24_1;
Uses Crt;
Var i,n,s:1..MaxInt;
Begin
Clrscr;
Write(‘N=’); Readln(n);
S:=0;
For i:=1 to n do s:=s+i;
Writeln(‘Suma este:’,S);
Readln
N=7
End.
Suma este 28

Varianta de calcul a sumei primelor N numere naturale consecutive cu utilizarea instrucţiunii


While.
Program P24_2;
Uses Crt;
Var I,N,S:1..MaxInt;
Begin
Clrscr;
Write(‘Introdu N=’); Readln(N);
S:=0; i:=1;
While i<=N do
begin
S:=S+i; i:=i+1;
End;
Writeln(’Suma este:’,S);
Readln
End.
N=7
Suma este 28

Calcularea sumei primelor N numere naturale cu utilizarea instrucţiunii Repeat.


Program P24_3;
Uses Crt;
Var I,N,S:1..MaxInt;
Begin
Clrscr;
Write(‘Introdu N=’); Readln(N);
S:=0; i:=1;
Repeat
S:=S+i;
i:=i+1;
Until i>n;
Writeln(’Suma este:’,S);
Readln
End.
N=7
Suma este 28

Exemplul 3.
Se consideră o secvenţă de numere reale 1≤n≤100. Să se scrie un program care determină numărul
mai mare.
Se citeşte primul număr şi se presupune că el etse maxim (maxim temporar). Se citeşte celelalte
numere pe rînd şi se compară cu max. Cînd se găseşte o valoare mai mare decît cea considerată pînă
atunci, această valoare se stabileşte ca maximă.
Program P25;
Uses Crt;
Var i,n:integer;
x,max:real;
Begin
Clrscr;
Write(’N=’); Readln(n);
Write(’Introdu primul numar:’); Readln(x);
max:=x;
For i:=2 to n do
Begin
Write(’Introdu numarul al ’,i,’-lea:’); Readln(x);
If x>max Then max:=x; End;
Writeln(’Raspuns: cel mai mare numar este’, max:7:2);
Readln;
End.

N=6
Introdu primul număr: 3
Introdu numărul al 2-lea: -8
Introdu numărul al 3-lea: 0.5
Introdu numărul al 4-lea: 86
Introdu numărul al 5-lea: 78.2
Introdu numărul al 6-lea: 11
Raspuns: cel mai mare numar este 86.00

Exemplul 4.
De la tastieră se introduce o secvenţă de n numere întregi 1≤n≤100. să se scrie un program care
calculează media aritmetică a numerelor introduse.

Se organizează un ciclu care citeşte şi adună cele n numere. După execuţia ciclului se calculează
media lor aritmetică.
Program P26;
Uses Crt;
Var Suma,x,n,i:1..MaxInt;
Med:real;
Begin
Clrscr;
Write(‘Cite numere are sirul ? n=’); Readln(n);
Suma:=0
For i:=1 to n do
Begin
Readln(x); Suma:=Suma+x;
End;
Writeln(‘Suma numerelor este:’,Suma);
Med:=Suma/n;
Writeln(‘Media=’,Med:6:1);
Readln
End.
Cite numere are sirul ? n=10
4 0 2 1 -3 7 15 4 20 -1
Suma numerelor este: 49
Madia= 4.9
Exemplul 5.
De la tastieră se introduce o secvenţă de numere (cel puţin unul) întregi nenule, care se termină cu
zero. Să se scrie un program care calculează media aritmetică a numerelor introduse.

Întrucît nu se cunoaşte numărul de lemente din secvenţa de intrare, problema nu poate fi rezolvată
utilizînd instrucţiunea for. Pot fi utilizate doar instrucţiunile while şi Repeat. În continuare este propus
programul de rezolvare cu utilizarea instrucţiunii While.

Program P27;
Uses Crt;
Var Suma,k,x:integer;
Med:real;
Begin
Clrscr;
Suma:=0; k:=0; Readln(x);
While x<>0 do begin
Suma:=Suma+x; Inc(k); Readln(x);
End;
Writeln(‘Suma=’,Suma,’ k=’,k); Med:=Suma/k;
Writeln(‘Media=’,Med:6:2);
Readln
End.
7
-5
12
9
0
Suma=23 k=4
Madia= 5.75

Exemplul 6.
Se consideră numărul natural N. Să se scrie un program care determină dacă numărul N este prim.

Prima variantă a programului calculează numărul divizorilor proprii ai numărului N prin intermediul
unui ciclu parametrul căruia variază de la 2 la N div 2. După terminarea execuţiei ciclului se face
verificarea: dacă numărul N este prim, în caz contrar se afişează mesajul ce neagă acest lucru.
Program P28_1;
Uses Crt;
Var N,k,i:1..MaxInt;
Begin
Clrscr;
Writeln(‘Introdu numarul N=’); Readln(N);
k:=0;
For i:=2 to N div 2 do
If N mod i=0 Then Inc(k);
Write(‘Raspuns’);
If k=0 Then Writeln(‘Numarul’,N,’este prim’)
Else Writeln(‘Numarul’,N,’nu este prim’);
Readln
End.
Introdu numarul N=38
Raspuns: numarul 38 nu este prim
O altă variantă de program cu o durată mai scurtă de execuţie este cea cu utilizarea instrucţiunii
while, care întrerupe ciclul atunci cînd va fi găsit primul divisor propriu al numărului N din
intervalul 2 şi √N

Program P28_2;
Uses Crt;
Var N,r,i:1..MaxInt;
T:Boolean; r:Real;
Begin
Clrscr;
Writeln(‘Introdu numarul N=’); Readln(N);
T:=true;
R:=sqrt(N);
i:=2;
While (i<=r) and t do
begin
If N mod i=0 Then T:False;
i:=i+1
End;
Write(‘Raspuns’);
If T Then Writeln(‘Numarul’,N,’este prim’)
Else Writeln(‘Numarul’,N,’nu este prim’);
Readln
End.

Introdu numarul N=103


Raspuns: numarul 103 este prim

Exemplul 7.
Se consideră secvenţa de numere naturale: 2,6,10,14,18... . Să se scrie un program care calculează
suma primilor n termeni, n≤100, mărimea n fiind introdusă de la tastieră.
Program P29;
Uses Crt;
Var n,I,T,Suma:1..MaxInt;
Begin
Clrscr;
Write(‘Introdu n=’); Readln(n);
Suma:=2; T:=2;
For i:=1 to n-1 do
begin
T:=T+4; Suma:=Suma+T;
End ;
Writeln(‘Suma este:’,Suma);
Readln;
End.
Introdu N=4
Suma este: 32

Exemplul 8.
Se consideră numărul natural N. Să se scrie un program care determină numărul de apariţii ale
cifrelor 1,2,3 în scrierea numărului N.

Se detaşează fiecare cifră de la sfărşitul numărului, calculînd restul împărţirii numărului la 10. Se
verifică dacă această cifră este una din cele căutate. În continuare numărul se modifică înlocuindu-l cu
numărul rămas după desprinderea cifrei, care este cîtul împărţirii lui la 10.
Program P30;
Uses Crt;
Var N:longint;
j1,j2,j3,c:1..255;
Begin
Clrscr;
Write(‘Introdu un numar(cel mult noua cifre) N=’); Readln(n);
j1:=0; j2:=0; j3 :=0;
While N<>0 do
begin
C:=N mod 10;
Case C of
1: Inc(j1);
2: Inc(j2);
3: Inc(j3);
End;
N:=N div 10;
End;
Writeln(‘Cifra 1 se repeat de ‘,j1,’ori’);
Writeln(‘Cifra 2 se repeat de ‘,j2,’ori’);
Writeln(‘Cifra 3 se repeat de ‘,j3,’ori’);
Readln
End.
Introdu un numar (cel mult 9 cifre) N=42151133
Cifra 1 se repeta de 3 ori
Cifra 2 se repeta de 1 ori
Cifra 3 se repeta de 2 ori

Exemplul 9.
De la tastieră se introduce o secvenţă formată din cel puţin două numere întregi nenule care se
termină cu zero. Să se scrie un program care determină de cîte ori în acest şir se schimbă semnul. De
exemplu, în şirul 2,-5, -7, 4, 1, 9, -5, 0 semnul alternează de 3 ori.
Program P31;
Uses Crt;
Var a,b,k:integer;
Begin
Clrscr;
Readln(a); Readln(b); k:=0;
Repeat
If a*b<0 Then Inc(k);
a:=b; Readln(b);
Until b=0;
Writeln(‘Semnul numerelor se schimba de ‘,k,’ori’);
Readln;
End.

5 7 -34 -9 18 -1 78 6 0
Emnul numerelor se schimba de 4 ori
Exemplul 10.
Să se scrie un program de calcul al sumei primelor N numere Fibonacci. Şirul Fibonacci este
următorul: 1,1,2,3,5,8,13,21,34,55,89,... Fn=Fn-1, unde N≥3.

Se organizează calcularea numerelor din şir unul cîte unul pînă la termenul N. În procesul calculării
termenilor din şir sunt păstrate numai ultimile două numere calculate care sunt necesare pentru a
continua calculul următoareloor numere Fibonacci. Pentru aceasta sunt utilizate variabilele A şi B.
Numărul următor va fi calculat prin intermediul instrucţiunii C:=A+B. La rîndul lui termenul C este
adunat la suma S.

Program P32;
Uses Crt ;
Var A,B,C,i,N,S :1..MaxInt;
Begin
Clrscr;
Write(‘N=’); Readln(N);
A:=1; B:=1; S:=2; i:=2;
While i<N do
Begin
C:=A+B;
S:=S+C:
A:=B; B:=C;
i:=i+1;
End;
Write(‘Suma primilor’,N,’termeni si sirului Fibonacci este’);
Readln(S);
Readln
End.

N=7
Suma primilor 7 termeni ai şirului Fibonacci este 33

Exemplul 11.
Se consideră două numere întregi pozitive. Să se scrie un program care stabileşte dacă acestea sunt
termeni în şirul Fibonacci.

Pentru rezolvarea acestei probleme sunt propuse două variante: prima ne conduce la constituirea
elementelor şirului pînă la termenul care este mai mare sau egal cu cel mai mic dintre numerele date;
în cazul egalităţii se calculează şi termenul următor al şirului şi dacă acesta este egal cu cel mai mae
dintre numerele date, răspunsul este ’’Da”, în toate celelalte cazurile răspunsul va fi ’’Nu”.
În a doua variantă se începe cu numerele date, clculînd elementele şirului ”Înapo” după formula
termen=diferenţa termenilor imediat următori. Se opreşte atunci cînd ajunge la doi termeni succesivi
egali cu 1 (răspunsul ”Da”) sau un termen mai mic deît 1 (Raspusul ”Nu”).
În continuare este propus programul pentru varianta a doua
Program P33;
Uses Crt;
Var x,y,z,aux:Longlnt;
Begin
Clrscr;
Writeln(‘Introduceti doua numere naturale :’);
Write(‘x=’); Readln(x);
Write(‘y=’); Readln(y);
If x>y Then
Begin
aux:=x; x:=y; y:=aux;
End;
While y>1 do
Begin
z:=y-x; y:=x; x:=z;
End;
If (x=1) and (y=1) Then Writeln(‘Raspuns : Da’)
Else Writeln(‘Raspuns: Nu’);
Readln
End.

Dati doua numere naturale:


x=13
y=21
Raspuns: Da

Realizarea primei variante rămîne pentru lucrul independent.

Exemplul 12.
Să se scrie un program care afişează pe ecran următorul şir: abbcccddddeeeee...zzzzzzz...z.
Program 34;
Uses Crt;
Var i,j:Char;
Begin
Clrscr;
For i:=’a’ to ‘z’ do
For j:=’a’ to i do
Writeln(i);
Readln
End.
abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjj
jkkkkkkkkkkklllllllllllllmmmmmmmmmmmmmnnnn
nnnnnnnnnnooooooooooooooopppppppppppppppqqq
qqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrssssssssssssssssssss
stttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuuwwwwww
wwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxx
xxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzz
zzzzzzzzzzzzzz
Exemplul 13.
Să se scrie un program care afişează pe ecran următorul triunghi: 1
12
123
1234
12345

Programul utilizează acelaşi principiu ca şi programmul precedent. Deosebirea este că afişarea


numerelor se face în rînduri separate, fapt ce implică prezenţa unei proceduri Writeln după ciclul ce
afişează conţinutul unui rind.

Program P35;
Uses Crt;
Var i,j:Byte;
Begin
Clrscr;
For i:=1 to 5 do
Begin
For j:=1 to i do Write(j:2);
Writeln;
End;
Readln
End.

1
12
123
1234
12345

Programe Propuse
1. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care afişează pe ecran numere
naturale mai mici sau egale cu N.
2. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care afişează pe ecran numere
naturale impare mai mici sau egale cu N.
3. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care afişează pe ecran numere
naturale mai mici sau egale cu N, care-s divizibile cu 5.
4. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care afişează pe ecran numere
naturale mai mici sau egale cu N şi divizibile cu T. Unde N şi T sunt numere naturale, T≤N,
ele se citesc de la tastieră.
5. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care calculează suma
numerelor naturale pare mai mici sau egale cu N.
6. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care calculează suma
numerelor naturale pare mai mici sau egale cu N care sunt divizibile cu 3.
7. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care calculează cîte numerelor
naturale pare mai mici sau egale cu N sunt divizibile cu A. Numerele N şi A se citesc de la
tastieră.
8. Să se scrie trei programe (cu instrucţiunile: for, while, repeat) care calculează produsul
numerelor naturale pare mai mici sau egale cu N, unde N≤10.
9. Se consideră două numere naturale x şi y. Să se scrie un program care calculează Xy.
10. Se consideră o secvenţă de n(n≤100) numere întregi. Să se scrie un program care calculează
suma numerelor pozitive.
11. Se consideră o secvenţă de n(n≤100) numere reale. Să se scrie un program care calculează
cîte numere sunt pozitive, cîte numere sunt negative şi cîte numere sunt nenule.
12. Se consideră o secvenţă de n(n≤100) numere întregi. Să se scrie un program care calculează
media aritmetică a numerelor pozitive şi media aritmetică a numerelor negative.
13. Se consideră numărul natural N. Să se scrie un program care calculează suma şi produsul
divizorilor acestui număr.
14. Se consideră o secvenţă de n(n≤100) numere reale. Să se scrie un program care determină
numărul minim şi poziţia lui. Dacă sunt mai multe numere de acest fel ca rezultat se v-a lua
primul număr.
15. Într-o seară, în fiecare zi înfloresc cu 15 flori mai multe decît în ziua precedentă. În prima zi
au înflorit 10 flori. Să se scrie un program care calculează cîte flori au înflorit timp de-o
săptămînă.
16. Să se scrie un program care citeşte de la tastieră o secvenţă de caractere şi afişează pe ecran
numărul cifrelor pare, numărul cifrelor impare şi cîte numere au fost citite.
17. Se consideră o secvenţă de n(n≤100) numere întregi. Să se scrie un program care atribuie
variabile logice t valoarea true, dacă an acest şir există cel puţin un număr care se împarte
exact la 7, în caz contrar valoarea false.
18. Să se scrie un program care afişează costul unei porţii de caşcaval de: 50, 100, 500, 1000 gr.
Dacă se ştie că costul unui kilogram de caşcaval costă 46 lei 20 bani.
19. Să se scrie un program care calculează valoarea funcţiei y=2x2+7x pe segmentul [-2,8] cu
pasul 1.
20. Un cetăţean a depus la o bancă comercială o sumă egală cu 10000 lei. Să se scrie un program
ce calculează suma pe care o v-a avea cetăţeanul peste 10 ani, dacă dobînda anuală este de
7%.
21. Un cetăţean a depus la o bancă comercială o sumă egală cu S lei cu o dobîndă anuală P%. Să
se scrie un program care calculează peste cîţi ani suma se v-a mări cu 100%.
22. Se consideră un număr natural n(n≤100). Să se scrie un program care calculează suma a N
termeni: 2/1+2/3+4/3+4/5+6/5+6/7+... .
23. Se consideră un număr natural n(n≤10). Să se scrie un program care calculează:
a) 1+1/2+1/4+...+1/(2n)
b) 12+22+32+...n2
c) 1+1/2+1/3+...+1/n
d) 1+1/2+2/3+3/4+...+n/(n+1)
e) 1+1*2+1*2*3+...+1*2*3*...*n
24. Să se scrie un program care calculează sumă 1+1/2+2/3+3/4+...+N/(N+1), pînă cînd valoarea
N/(N+1) v-a depăşi valoarea 0.999. N este un număr natural.
25. De la tastieră se citesc numere întregi pozitive pînă cînd suma lor nu v-a depăşi valoarea
1000. să se scrie un program care calculează media aritmetică a numerelor citite.
26. Se consideră secvenţa de numere: 2, 7, 12, 17, ... cu n termeni(n≥2). Să se scrie un program
care calculează suma termenilor pari.
27. Se citesc trei numere naturale a, b, c şi o secvenţă de n numere naturale. Să se scrie un
program care calculează cîte din acestea împărţite la b dau rest c.
28. În prima zi a antrenamentului un sportiv aleargă 10 km. Iar în fiecare zi începînd cu a doua el
măreşte sarcina zilnică cu 10% din distanţa zilei precedente. Să se scrie un program care va
calcula peste cîte zile:
a) sportivul va alerga 20 km (într-o zi);
b) va alerga un drum de 100 km (numărul zilelor de antrenament).
29. Se consideră un număr natural n, n≤100 şi o secvenţă de n caractere arbitrare. Să se scrie un
program care determină numărul total de litere latine(mici şi mari), care intră în componenţa
secvenţei.
30. Se consideră o secvenţă de N litere mici. Memorînd numai câte o literă să se determine
numărul de apariţii pentru fiecare dintre vocalele: a, e, i, o, u.
31. De la tastieră se citeşte o secvenţă de numere întrgi care se termină cu zero. Să se scrie un
program care determină numărul mai mare.
32. De la tastieră se introduce o secvenţă de cel puţin două numere pozitive, ce se termină cu
zero. Să se scrie un program care determină numărul mai mare.
33. Să se scrie un program care citeşte o succesiune de cel puţin două numere întrgi nenule care
se termină cu zero şi calculează media aritmetică a numerelor pozitive şi media aritmetică a
numerelor negative.
34. Să se scrie un program care afişează primele zece numere naturale, care fiind împărţite la 5 şi
împărţite la 7 dau restul 2.
35. Să se scrie un program care afişează următorul şir:
a) abcdef...xyz
b) zyyzzz...aaaaaaaaaaaaa...a
c) abcdef...xyzbcdefg...xyz cdefg...xyzdefg...xyz
36. Să se scrie un program care afişează următoarele triunghiuri:
a) a b) 5 c) 12345 d) 55555 e) 12345 f) 1 g) 54321 h) 11111 i)54321
ab 44 1234 4444 1234 22 5432 2222 5432
abc 333 123 333 123 333 543 333 543
.... 2222 12 22 12 4444 54 44 54
abcde...z 11111 1 1 1 55555 5 5 5

37.Să se scrie un program care afişează următoarele ornamente:


a) * b) ***** c) * d) >>>>>>>>>> e) ***** f) * g) ..... h) .
** **** * <<<<<<<<<< **** ** .... ..
*** *** * >>>>>>>>>> *** *** ... ...
**** ** * <<<<<<<<<< ** **** .. ....
***** * * * ***** . .....
38. Să se scrie un program care calculează suma numerelor din următoarele triunghiuri:
a) 12345 b) 11111 c) 55555 d) 54321
1234 2222 4444 5432
123 333 333 543
12 44 22 54
1 5 1 5
39. Să se scrie un program care afişează pe ecran tabla înmulţirii.
40. Să se scrie un program care afişează numerele prime din intervalul [1,100].
41. Se consideră numărul natural N. Să se scrie un program care calculează suma numerelor
prime pînă la N.
42. Se consideră un număr natural N. Să se scrie un program care determină dacă el este perfect
sau nu, adică dacă el este egal cu suma divizorilor săi fără el însuţi.
43. Să se scrie un program care afişează toate numerele perfecte pînă la 1000.
44. Se consideră un număr natural N. Să se scrie un program care:
a. numără cifrele acestui număr.
b. calculează suma cifrelor lui.
c. formează răsturnatul numărului N. Exemplu: 123 răsturnatul lui este 321.
d. determină dacă numărul N conţine cifra 8.
45. Se consideră un număr natural N. Să se scrie un program care determină primul număr prim
care este mai mare decît numărul N.
46. Se consideră două numere naturale. Să se scrie un program care determină cel mai mare
divizor comun al acestor numere.
47. Să se scrie un program care calculează suma primelor 10 numere Fibonacci.
48. Se consideră un număr natural N. Să se scrie un program care determină termenul de pe locul
N(FN) din şirul Fibonacci.
49. Se consideră un număr natural N. Să se scrie un program care determină cel mai mare număr
Fibonacci ce nu depăşeşte N.
CAPITOLUL IV
---------------------------------------------------------------------
Programe cu tablouri unidiminsionale
Exemplul 1.
Se consideră tabloul unidimensional Note[1..40], în care au fost introduse notele de la 1..10 obţinute
de către elevii unei clase la o lucrare de control la matematică. Să se scrie un program care calculează
numărul sumar de note de 9 şi 10.

Programul numără elementele din tablou egale cu 9 sau cu 10. Numărarea se face în cadrul ciclurilor
care asigură parcurgrea întregului tablou şi selectarea elementelor care se numără. În programele de
numărare se folosesc elemente contoare-mărimi variabile la care se adună cîte o unitate de fiecare dată
cînd în tablou se întîlneşte elementul respectiv. De regulă se iniţializează cu 0.
Program P36;
Uses Crt;
Var Note:Array[1..nmax] of integer;
contor,i,n:1..nmax;
Begin
Clrscr;
Write(‘Introduceti numarul de elevi:’); Readln(n);
Write(‘Introduceti notele elevilor:’);
For i:=1 to n do Read(Note[i]);
Writeln(‘Au fost introduce notele:’);
For i:=1 to n do Write(note[i]:3);
Writeln;
Contor:=0;
For i:=1 to n do
If (note[i]=9) or (Note[i]=10) Then contor:=contor+1;
Write(‘In tablou sunt’,contor,’notede”9” si”10”’);
Readln
End.
Dati numarul de elevei: 9
Dati notele elevilor:
7 10 5 9 8 6 10 9 4
Au fost introduse notele:
7 10 5 9 8 6 10 9 4
In tablou sunt 4 note de ”9” şi ”10”

Elementele unui tablou unidiminsional pot fi introduse prin spaţiu (în cazul nostru) sau prin
acţionarea tastei Enter.
În program a fost folosit nmax=40, care indică numărul maximal de elemente ale tabloului. Dacă
doriţi să lucraţi cu un număr mai mare de elemente, atunci trebuie să modificaţi în program valoarea
acestei constante.

Exemplul 2.
Se consideră tabloul unidimensional A[1..n] de numere întregi, n≤100. să se scrie un program care
calculează suma elementelor pozitive.

Programele de calculare a sumei elementelor cu anumite proprietăţi sunt asemănătoare cu


programele de numărare. Principala deosebire constă în înlocuirea instrucţiunii care numără cu
instrucţiunea care adună elementele respective.
Program P37;
Uses Crt;
Const nmax=100;
Var A:Array[1..nmax] of integer;
i,S:integer;
n:1..nmax;
Begin
Clrscr;
Write(’Introdu numărul componentelor n=’); Readln(n);
Write(’Introdu’,n,’numere intregi:’);
For i:=1 to n do Read(a[i]);
Write(’Tabloul dat:’);
For i:=1 to n do Write(A[i]:5);
Writeln; S:=0;
For i:=1 to n do
If A[i]>0 Then S:=S+A[i];
Writeln(’Suma elementelor pozitive este:’,S);
Readln
End.

Introdu numarul componentelor n=10


Introdu 10 numere intregi: 12 0-9 6 2 6 -23 0 1 -15
Tabloul dat: 12 0-9 6 2 6 -23 0 1 -15
Suama elementelor pozitive: 27

Exemplul 3.
Se consideră tabloul unidimensional A[1..n] de numere întregi, n≤100 şi un număr întreg y. Să se
scrie un program care determină locul ultimului element din tabloul egal cu y. Dacă nu există astfel de
elemente să se afişeze mesajul corespunzător.

Procesul căutării ultimului element egal cu y constă în compararea fiecărui element din tablou cu
numărul y. Rezultatul problemei se obţine prin intermediul variabilei Loc care se iniţializează cu zero.
Cînd se găseşte un element egal cu z variabilei Loc i se atribuie valoarea egală cu locul elementului y,
însă parcurgerea tabloului continuă pînă la sfîrşit. În timpul parcurgerii variabila Loc capătă şi alte
valor, ultima fiind locul ultimului element egal cu y. La sfîrşitul programului se face testarea variabilei
Loc şi în dependenţă de valoarea acesteia se afişează rezultatul respectiv.
Program 38;
Uses Crt;
Var A:Array[1..100] of integer;
I,n,y,Loc:integer;
Begin
Clrscr;
Write(‘N=’); Readln(n);
Writeln(‘Introdu ‘,n,’elemente’);
For i:=1 to n do Read(A[i]);
Write(‘Tabloul dat:’);
For i:=1 to n do Write(A[i]:5); Writeln;
Write(‘Introdu numarul care trebuie cautat:’); Readln(y);
Loc:=0;
For i:=1 to n do
If A[i]=y Then Loc:=I;
If Loc=0 Then Write(‘In tablou nu sunt elemente egale cu’,y)
Else Write(‘Ultimul element egal cu ‘,y,’se afla pe locul’,Loc);
Readln
End.
N=10
Introdu 10 elemente: 9 17 23 17 2 -1 0 17 3 -2
Tabloul dat: 9 17 23 17 2 -1 0 17 3 -2
Introdu numarul care trebuie cauta: 17
Ultimul element egal cu 17 se afla pe locul 8

Exemplul 4.
Se consideră tabloul unidimensional A[1..n] de numere întregi, n≤100 şi un număr întreg y. Să se
scrie un program care determină locul primului element din tabloul egal cu y. Dacă nu există astfel de
elemente să se afişeze mesajul corespunzător.

În acest program se utilizează acelaşi principiu ca şi în programul precedent, cu deosebire că


parcurgerea tabloului se face de la dreapta la stânga.

Program P39;
Uses Crt;
Var A:Array[1..100] of integer;
I,Loc,n,y:integer;
Begin
Clrscr;
Write(‘n=’); Readln(n);
Writeln(‘Introdu’,n,’componente:’);
For i:=1 to n do Read(A[i]:5);
Writeln;
Write(‘Introdu elemental care trebuie cautat:’); Readln(y);
Loc:=0; i:=1;
While (i<=n) And (Loc=0) do begin
If A[i]=y Then Loc:=I;
I:=i=1; End;
Write(‘Raspuns:’);
If Loc=0 Then Write(‘Elementul’,y,’nu se afla in tablou’)
Else Write(‘Primul element este egal cu ‘,y,’se afla pe locul’,Loc);
Readln
End.

N=10
Introdu 10 elemente: 9 17 23 17 2 -1 0 17 3 -2
Tabloul dat: 9 17 23 17 2 -1 0 17 3 -2
Introdu numarul care trebuie cauta: 17
Primul element egal cu 17 se afla pe locul 2

Exemplul 5.
Se consideră tabloul unidimensional A[1..n] de numere întregi, n≤100. Să se scrie un program care
modifică elementele tabloului în felul următor: elementele negative se ridică la pătrat, cele pozitive se
măresc de zece ori, iar cele nule se înlocuiesc cu o sută.

În programele de modificare tablourile sunt supuse unor schimbări-valorile elementelor se modifică.


Acest lucru se realizează prin intermediul instrucţiunii de atribuire.
Program P40;
Uses Crt;
Var A:Array[1..100] of real;
I,n:integer;
Begin
clrscr;
Write(‘Cite componente are tabloul? n=’); Readln(n);
Writeln(‘Introdu ‘,n,’ numere reale:’);
For i:=1 to n do Read(A[i]);
Writeln(‘Tabloul dat:’);
For i:=1 to n do Write(A[i]:6:1); Writeln;
For i:=1 to n do
If A[i]<0 Then A[i]:=Sqr(A[i])
Else If A[i]>0 Then A[i]:=10*A[i]
Else A[i]:=100;
Writeln(‘Tabloul dupa modificare:’);
For i:=1 to n do Write(A[i]6:1);
Readln
End.

N=10
Introdu 10 elemente: 9 17 23 17 2 -1 0 17 3 -2
Tabloul dat: 9 17 23 17 2 -1 0 17 3 -2
Introdu numarul care trebuie cauta: 17
Primul element egal cu 17 se afla pe locul 2

Exemplul 6.
Se consideră tabloul unidimensional X[1..n] de numere întregi, n≤100. Să se scrie un program care
modifică tabloul scriind elementele în ordine inversă.

Pentru a realiza acest lucru se interschimbă:


- primul element X[1], cu ultimul element X[n];
- al doilea element X[2], cu penultimul element X[n-1];
- elementul X[i], cu X[n+1-i];
- elemental din mijlocul tabloului, X[n div 2] cu X[n+1-n div 2];
Prin urmare, interschimbările se fac între elementele de forma X[i] şi X[n+1-i], mărimea I variind de
la 1 la n div 2, deoarece sunt n div 2 perechi de elemente şi la o execuţie a secvenţei din ciclu îşi
schimbă reciproc locurile valorile a două elemente, egal depărtate de extremităţile tabloului. Pentru n
impar elemental de mijloc rămîne neschimbat.
Program P41;
Uses Crt;
Var X:Array[1..100] of integer;
I,n,aux:integer;
Begin
Clrscr;
Write(‘n=’); Redln(n);
For i:=1 to n do Read(X[i]);
Write(‘Tabloul dat:’);
For i:=1 to n do Write(X[i]:5); Writeln;
For i:=1 to n div 2 do begin
Aux:=X[i]; X[i]:=X[n+1-i]; X[n+1-i}:=aux;
End;
Write(‘Tabloul inversat:’);
For i:=1 to n do Write(X[i]:4);
Readln;
End.
N=8
11 0 34 4 -5 6 7 86
Tabloul dat: 11 0 34 4 -5 6 7 86
Tabloul inversat: 86 7 6 -5 4 34 0 11
Exemplul 7.
Se consideră tabloul unidimensional X[1..n] de numere întregi, n≤100. Să se scrie un program care
deplasează spre dreapta cu o poziţie elementele X[1], X[2],…, X[n-1], iar ultimul element îl scrie pe
primul loc.

Valoare ultimului element din tablou se păstrează într-o variabilă auxiliară. Deplasarea elementelo
spre dreapta se organizează prin intermediul unui ciclu parametrul căruia variază în descreştere de la n
la 2. După terminarea execuţiei ciclului primului element i se atribuie valoarea iniţială a ultimului
element.
Program 42;
Uses Crt;
Var X:Array[1..100] of integer;
I,n,aux:integer;
Begin
Write(‘Introdu numarul de elemente n=’); Readln(n);
Write(‘Introdu ‘,n,’elemente:’);
For i:=1 to n do Read(X[i]);
Write(‘Tabloul dat:’);
For i:=1 to n do Write(X[i]:5);
Writeln; aux:=X[n];
For i:=n downto 2 do
X[i]:=X[i-1]; X[1]:=aux;
Write(‘Tabloul modificat:’);
For i:=1 to n do Write(x[i]:5);
Readln;
End.

N=8
11 0 34 4 -5 6 7 86
Tabloul dat: 11 0 34 4 -5 6 7 86
Tabloul inversat: 86 11 0 34 4 -5 6 7

Exemplul 8.
Se consideră tabloul unidiminsional A[1..n] de numere întregi, n≤100. Să se scrie un program care
citeşte componentele tabloului şi le afişează în ordine inversă.
Se citesc elementele tabloului, apoi se organizează parcurgerea lor de la dreapta la stînga afişîndu-le.

Program P43;
Uses Crt;
Var A:Array[1..100] of integer;
I,n:integer;
Begin
Clrscr;
Write(’Introdu numarul componentelor n=’); Readln(n);
Writeln(’Introdu’,n,’numere:’);
For i:=1 to n do Read(A[i]);
Write(’Tabloul in ordine inversa:’);
For i:=n downto 1 do Write(a[i]:5);
Redln
End.

N=10
Introdu 10 numere: 12 0 -6 7 34 8 -67 0 0 3
Tabloul in ordine inversa: 3 0 0 -67 8 34 7 -6 0 12
Exemplul 9.
Se consideră tabloul unidiminsional A[1..n] de numere întregi, n≤100. Să se scrie un program care
afişează elementele pare de pe poziţii impare.
Pentru a verifica paritatea unui număr se folosşte condiţia că restul împărţirii unui număr par la 2
este 0.
Se citeşte elementele tablolui. Apoi se organizează parcurgerea elementelor de pe locuri impare prin
intermediul instrucţiunii While. Elementele ce satisfac condiţia respectivă se afişează.
Program P44;
Uses Crt;
Var A:Array[1..100] of integer;
I,n:integer; T:boolean;
Begin
Clrscr;
Write(’n=’); Readln(n);
For i:=1 to n do Read(a[i]);
Write(’Raspuns:’); i:=1; T:=FALSE;
While i<=n do begin
If A[i] mod 2=0 Then begin
Write(A[i]:4); T:=TRUE;
End; i:=i+2;
End;
If not T then Write(’In tablou nu exista el. Pare pe pozitii impare’);
Readln
End.

N=10
23 15 18 7 19 2 34 11 66 50
Raspuns: 18 34 66

Exemplul 10.
Se consideră tabloul unidimensional X[1..n] de numere întregi, n≤100. Să se scrie un program care
determină elementele pozitive din tabloul X şi le scrie în tabloul unidimensional Y.
Pentru a crea tabloul Y este nevoie de o variabilă de tip ordinal (în cazul nostru-k) care indică locul
elementelor în acest tablou. De fiecare dată, cînd se găseşte un element pozitiv, variabila k se
incrementează cu o unitate (în acelaşi timp variabila k numără elementele pozitive) şi elementul
respectiv se înscrie în tabloul Z pe locul k.
Tabloul Y se declară de aceeaşi dimensiune ca tabloul dat X, ţinîndu-se cont de cazul cînd toate
elementele din X vor fi pozitive şi toate vor fi înscrise în tabloul Y. La sfîrşitul programului se afişează
elementele tabloului creat.
Program P45;
Var X,Y:Array[1..100] of integer;
I,n,k:integer;
Begin
Write(’n=’); Readln(n);
For i:=1 to n do Read(X[i]); k:=0;
For i:=1 to n do
If X[i]>0 Then
Begin Inc(k); Y[k]:=X[i]; End;
Write(‘Tabloul obtinut:’);
For i:=1 to k do Write(Y[i],’ ’);
Readln
End.

N=10
1 0 4 8 0 23 1 5 0 13
Tabloul obţinut: 4 8 23 1 5 13
Exemplul 11.
Să se scrie un program care completează un tablou unidimensional A[1..2n] de numere întregi unde
n≤50. să se scrie un program care aşează în felul următor: pe locurile impar înscrie indicele
elementului, iar pe locurile pare – numărul 10.
Tabloul se completează cu elemente prin intermediul instrucţiunii while. La fiecare execuţie a
ciclului se formează cîte două elemente: un element pe loc par şi un element pe loc impar.

Program P46_1;
Uses crt;
Var A:Array[1..100] of integer;
I:integer; n:1..50;
Begin
Clrscr;
Write(‘Cite elemente va avea tabloul ? n=’) ; Readln(n); i:=1;
While i<=2*n do
Begin A[i]:=i; A[i+1]:=10; i:=i+2 end;
Write(‘Tabloul format:’);
For i:=1 to 2*n do Write(A[i]:4);
Readln;
End.

Cite elemente va avea tabloul ? n=4


Tabloul format: 1 10 3 10 5 10 7 10

Dacă problema se rezolvă cu instrucţiunea for, atunci este necesară şi utilizarea instrucţiunii If. În
acest caz la fiecare execuţie a ciclului se formează cîte un singur element.

Program P46_2;
Uses crt;
Var A:Array[1..100] of integer;
I:integer; n:1..50;
Begin
Clrscr;
Write(‘Cite elemente va avea tabloul ? n=’) ; Readln(n);
For i:=1 to 2*n do
If ODD(i) Then A[i]:=i
Else A[i]:=10;
Write(‘Tabloul format:’);
For i:=1 to 2*n do Write(A[i]:4);
Readln
End.
Cite elemente va avea tabloul ? n=4
Tabloul format: 1 10 3 10 5 10 7 10

Exemplul 12.
Se consideră tabloul unidimensional X[1..n] de numere întregi, n≤100. Să se scrie un program care
exclude elementele nule din tablou.

Algoritmul este următorul: se parcurg elementele tabloului şi cînd se găseşte un element X[i] nul,
se deplasează toate elementele de după el (de la i+1 la n) la stînga cu o poziţie, decrementînd, în
acelaşi timp, numărul de elemente (n) cu o unitate.
Program P47;
Uses Crt;
Var X:Array[1..100] of integer;
I,j,n:integer;
Begin
Clrscr;
Write(‘n=’); Readln(n);
For i:=1 to n do Read(X[i]);Writeln; i:=1;
While i<=n do
If X[i]=0 Then
Begin
For j:=i to n-1 do X[j]:= X[j+1];
Dec(n); end
Else inc(i);
Write(‘Tabloul obtinut: ‘);
For i:=1 to n do Write(X[i],’ ‘);
Readln;
End.

N=10
2 0 4 8 0 23 1 0 0 13
Tabloul obtinut: 2 4 8 23 1 13

Exemplul 13.
Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină printr-
o singură parcurgere numărul de apariţii al elementului maxim.
Se iniţializează variabila max cu valoarea primului element din tablou (care are rolul de maxim
temporar) şi controlul se iniţializează cu 0. Se parcurge tabloul în continuare, actualizînd valoarea
variabilei max şi iniţializînd contorul de cîte ori un element din tablou va fi mai mare decît maximul
considerat pînă atunci. De asemenea, se numără apariţiile elementului maxim.
Program P48;
Uses Crt;
Var A:Array[1..100] of integer;
I,n,k,max:integer;
Begin
Clrscr;
Write(‘Introdu numarul de elemente:’); Readln(n);
Writeln(‘Dati’,n,’ elemente:’);
For i:=1 to n do Read(A[i]);Writeln; k:=0; max:=A[1];
For i:=1 to n do
Begin
If A[i]>max Then
Begin Max:=A[i]; k:=0; End;
If A[i]=max Then k:=k+1 ;
End;
Writeln(‘Elementul maxim este ‘,max);
Writeln(‘Se repeat de ‘,k,’ ori’) ;
Readln
End.

Introdu numarul de elemente : 15


Dati 15 elemente:
23 0 9 23 -5 45 45 9 -3 45 19 45 0 0 2
Elementul maxim este 45
Se repetă de 4 ori
Exemplul 14.
Se consideră două tablouri A[1..n] şi B[1..n] de numere întregi, n≤100.Să se scrie un program care
creează tabloul C[1..2n] în felul următor: pe locuri impare înscrise elemente din A, iar pe locuri pare –
elemente din B(elementele din A şi B se iau în ordinea în care sînt introduse).
Pentru rezolvare sunt propuse cîteva variante.
Prima variantă utilizează două variabile auxiliare.
Program P49_1;
Uses Crt;
Const n=10;
Var A,B: Array [1..n] of Integer;
C: Array[1..2*n] of Integer;
i,k,r: Integer;
Begin
ClrScr;
Writeln(‘Dati’, n,’numere intregi pentru tabloul A: ‘);
For i:=1 to n do Read(A[i]);
Writeln(‘Dati’, n ,’numere intregi pentru tabloul B:’);
For i:=1 to n do Read(B[i]); k;=0; r:=0;
For i:=1 to 2*n do
If i Mod 2=1 Then Begin k: =k+1; C[i]:=A[k]; End Else
Begin r:=r+1; C[i]=A[k]; End;
Write(‘Tabloul C: ‘);
For i:=1 to 2*n do Write(c[i],’ ‘);
Readln
End.
Dati 10 numere intregi pentru tabloul A:
5 12 -3 0 9 26 4 1 5 9
Dati 10 numere intregi pentru tabloul B:
8 0 3 52 7 -1 -5 19 12 63
Tabloul C: 5 8 12 0 -3 3 0 52 7 26 -1 4 -5 1 19 5 12 9 63

Varianta a doua utilizează o singură variabilă auxiliară:


Program P49_2;
Uses Crt;
Const n=10;
Var A,B: Array [1..n] of Integer;
C: Array[1..2*n] of Integer;
i,k: Integer;
Begin
ClrScr;
Writeln(‘Dati’, n,’numere intregi pentru tabloul A: ‘);
For i:=1 to n do Read(A[i]);
Writeln(‘Dati’, n ,’numere intregi pentru tabloul B:’);
For i:=1 to n do Read(B[i]); k;=0;
For i:=1 to n do
Begin k:=k+1; c[k]:=a[i]; k:=k+1; c[k]:=b[i] End;
Writeln(‘Tabloul C: ‘);
For i:=1 to 2*n do Write(c[i],’ ‘);
Readln
End.
Dati 10 numere intregi pentru tabloul A:
5 12 -3 0 9 26 4 1 5 9
Dati 10 numere intregi pentru tabloul B:
8 0 3 52 7 -1 -5 19 12 63
Tabloul C: 5 8 12 0 -3 3 0 52 7 26 -1 4 -5 1 19 5 12 9 63
Varianta a treia nu utilizează nici o variabilă auxiliară.
Program P49_3;
Uses Crt;
Const n=10;
Var A,B: Array [1..n] of Integer;
C: Array[1..2*n] of Integer;
i: Integer;
Begin
ClrScr;
Writeln(‘Dati’, n,’numere intregi pentru tabloul A: ‘);
For i:=1 to n do Read(A[i]);
Writeln(‘Dati’, n ,’numere intregi pentru tabloul B:’);
For i:=1 to n do Read(B[i]);
For i:=1 to 2*n do
If i mod 2=1 then c[i]:=a[I div 2+1] else c[i]:=b[I div 2];
Writeln(‘Tabloul C: ‘);
For i:=1 to 2*n do Write(c[i],’ ‘);
Readln
End.

Dati 10 numere intregi pentru tabloul A:


5 12 -3 0 9 26 4 1 5 9
Dati 10 numere intregi pentru tabloul B:
8 0 3 52 7 -1 -5 19 12 63
Tabloul C: 5 8 12 0 -3 3 0 52 7 26 -1 4 -5 1 19 5 12 9 63

Exemplul 15.
Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care determină cea mai
lungă secvenţă de elemente egale.

Se organizează numărarea elementelor egal situate pe poziţii consecutive. Cînd se întîlneşte un


element diferit de precedentul său, se compară contorul care numără elementele egale din ultima
secvenţă cu contorul valoarea căruia a fost considerată cea mai mare pînă atunci. În rezultatul
comparării se stabileşte cea mai lungă secvenţă de elemente egale dintre elementele parcuse. De
asemenea se face reiniţializarea contorului care va număra elementele egale din următoarea secvenţă.
Se întîmplă ca secvenţa de elemente egale să fie la sfîrşitul tabloului. Această situaţie implică prezenţa
încă a unei instrucţiuni If la finele programului.

Program P50;
Uses Crt;
Var A: Array [1..100] Of Integer;
i, k, Nmax: Integer;
Begin
ClrScr;
Write(‘Cite elemente va avea tabloul ? n=’) ; Readln(n) ;
Writeln(‘Dati ‘, n ,’ numere intregi :’) ;
For i:=1 to n do Read(A[i]); k:=1; Nmax:=0;
For i:=1 to n-1 do
If A[i]=A[i+1] Then k:=k+1 Else
Begin
If k>Nmax Then Nmax:=k; K:=1; End;
If k>Nmax Then Nmax :=k;
Write(‘Cea mai lunga segventa de elemente egale are ‘);
Writeln(Nmax,’termeni’);
Readln;
End.
Cite elemente va avea tabloul ? n=10
Dati 10 numere intregi:
3 2 2 5 2 -1 3 3 3 3
Cea mai lungă secvenţă de elemente egale are 4 termeni

Exemplul 16.
Se consideră tablourile A[1..n] şi B[1..n] de numere întregi, n≤100. Să se scrie un program care
determină dacă tablourile sunt identice.

Se organizează parcurgerea tablourilor Cînd se găsesc două valori (de pe locuri corespunzătoare)
diferite, se întrerupe parcurgerea şi se afişează mesajul ce confirmă că tblourile nu sunt identice. Dacă
tablourile au fost parcurse pînă la sfîrşit, înseamnă că n-au fost găsite valori diferite şi se afişează
mesajul ce confirmă că tablourile sunt identice.

Program P51;
Uses Crt;
Const n=5;
Var A,B:Array[1..n] of integer;
I:integer;
Begin
Clrscr;
Write(‘Dati tabloul A:’);
For i:=1 to n do Read(A[i]);
Writeln(‘Dati tabloul B:’);
For i:=1 to n do Read(B[i]); i:=0;
Repeat
i:=i+1;
Until (i=n) Or (A[i]<>B[i]);
Write(‘Rezultatul:’);
If A[i]=B[i] Then Writeln(‘Tablourile sunt identice’)
Else Writeln(‘Tablourile nu sunt identice’);
Readln
End.

Dati tabloul A: 5 34 78 83 -5
Dati tabloul B: 5 23 18 -4 3
Rezultatul: tablourile nu sunt identice

Exemplul 17.
Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care ordonează
crescător elementele acestui tablou.

Ordonarea elementelor unui tablou este una din cele mai importante operaţii pentru o secvenţă de
elemente. Există mai multe metode de sortare. În continuare sunt prezentate trei dintre ele: sortarea
prin metoda bulelor, sortarea prin selecţie şi sortarea prin selecţie şi sortarea prin interclasare.
Metoda bulelor poartă acest nume datorită asemănării dintre deplasare elementelor din tmlou cu
deplasare bulelor de aer dintr-un pahar cu apă. Algoritmul de bază al sortării prin metoda bulelor
constă în următoarele: tabloul este parcurs de la stînga spre dreapta, comparînd cîte două elemente
vecine: A[i] şi A[i+1]. Dacă vor fi găsite două elemente neordonate, valorile lor vor fi interschimbate.
Parcurgerea tabloului va continua, fiind effectuate şi alte interschimbări. În urma primei parcurgeri
elemental maxim va ocupa ultimul loc. Pentru ordonarea tuturor elementelor tabloul trebuie de parcurs
de cel mul n-1 ori.
Sortarea prin metoda bulelor se consideră drept cea mai neefectivă, din motivul că timpul necesar
sortării este prea mare. Avantajul metodei constă în simplitatea ei.
Program P52_1;
Uses Crt;
Const n=10;
Var A:Array[1..n] of integer;
I,j,aux:integer;
Begin
Clrscr;
Write(’Tabloul A:’);
For i:=1 to n do Read(A[i]);
Writeln;
For i:=1 to n-1 do
For j:=1 to n-1 do
If A[j]>A[j+1] Then
Begin Aux:=A[j]; A[j]:=A[j+1]; A[j+1]:=aux; End;
Write(’Tabloul ordonat:’);
For i:=1 to n do Write(A[i],’ ’);
Readln
End.
Tabloul A: 2 34 78 83 -5 0 89 504 67 4
Tabloul ordonat: -5 0 2 4 34 67 78 83 89 504

Se observă că la un anumit moment schimbările nu se mai fac, însă tabloul n-a fost parcurs de n-1
ori. Cu aceste consideraţii algoritmul poate fi perfecţionat, ceea ce vi se pentru lucru independent.
Algoritmul metodei de sortare prin selecţie este următorul: se selectează elemental minim din tablou
şi se schimbă cu locul cu primul element; apoi se caută elemental minim începînd cu elementul al
doilea al tabloului şi se schimbă cu locul cu al doilea element etc.
Spre deosebire de metoda precedentă, cînd la fiecare pas era examinat un singur element din cele
neordonate şi toate elementele din porţiunea ordonată, aici este o situaţie inversă- la fiecare pas vor fi
examinate toate elementele neordonate ale tabloului şi numai unul din cele ordonate. Elementul minim
selectat va fi alăturat la cele ordonate.

Program P52_2;
Const n=10;
Var A:Array[1..n] of integer;
i,j,min,l:integer;
Begin
Write(’Tabloul A:’);
For i:=1 to n do Read(A[i]); Writeln;
For i:=1 to n-1 do
begin
min:=a[i]; l:=i;
for j:=i+1 to n do
if a[j]<min then begin min:=a[j]; l:=j End;
a[l]:=a[i]; a[i]:=min
end;
Write(’Tabloul ordonat:’);
For i:=1 to n do Write(A[i],’ ’);
Readln
End.

Tabloul A: 2 34 78 83 -5 0 89 504 67 4
Tabloul ordonat: -5 0 2 4 34 67 78 83 89 504
Exemplul 18.
Se consideră două tablouri unidimensionale A[1..5] şi B[1..4] de numere întregi, ordonate crescător.
Să se scrie un program care construieşte un alt tablou unidimensional ordonat C[1..9] prin contopirea
tablourilor date.

Algoritmul de rezolvare foloseşte metoda de sortare prin interclasare. Se consideră tabloul A: 8 34


60 78 90 şi tabloul B:5 7 50 77. Aceste numere se înscriu în tabloul C în următoarea ordine: 5 7 8 34
50 60 77 78 90.
Algoritmul este următorul: se parcurg tablourile de la stînga spre dreapta, comparînd cîte două
elemente (un element din tabloul A şi un element din tabloul B) şi cel mai mic element se înscrie în
tabloul C. La un moment dat, se vor termina elementele în unul din tablourile iniţiale (în cazul dat
tabloul B) şi atunci în C se introduc elementele rămase în celălalt tablou (din tabloul A). Această
situaţie implică prezenţa încă a două cicluri la finele programului.

Program P53;
Uses Crt;
Var A:Array[1..5] of integer;
B:Array[1..4] of integer;
C:Array[1..9] of integer;
I,j,k:integer;
Begin
Clrscr;
Write(‘Tabloul A:’);
For i:=1 to 5 do Read(A[i]);
Write(‘Tabloul B:’);
For i:=1 to 4 do Read(B[i]);
i:=1; j:=1; k:=0;
While (i<=5) And (j<=4) do
If A[i]<B[j] Then Begin k:=k+1; C[k]:=A[i]; i:=i+1; End
Else Begin k:=k+1; C[k]:=B[j]; j:=j+1; End;
While i<=5 do Begin k:=k+1; C[k]:=A[i]; i:=i+1; End;
While j<=4 do
Begin
K:=k+1; C[k]:=B[j]; j:=j+1;
End;
Write(‘Tabloul C ordonat:’);
For i:=1 to 9 do Write(C[i],’ ‘);
Readln
End.
Tabloul A: 8 34 60 78 90
Tabloul B: 5 7 50 77
Tabloul C ordonat: 5 7 8 34 50 60 77 78 90
Programe Propuse
Probleme de numărare a elementelor cu anumite proprietăţi
1. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care numără cîte
elemente pozitive conţine acest tablou.
2. Se consideră tabloul A[1..n] cu elemente egale numai cu 1 sau 0 unde n≤100. Să se scrie un
program care numără cîte zerouri şi cîte unităţi conţine acest tablou.
3. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care numără cîte
elemente pozitive sunt pe locuri pare.
4. Se consideră tablou A[1..n] de numere întregi, n≤100. Să se scrie un program care numără cîte
elemente pozitive, cîte negative şi cîte nule conţine acest tablou.
5. Se consideră numărul natural M şi tabloul A[1..n] de numere naturale, n≤100. Să se scrie un
program care cîte elemente din tablou sunt divizibile cu M.
6. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care numără cîte
elemente sunt diferite de primul element şi ultimul.
7. Se consideră tabloul A[1..n] de numere reale, n≤100. Să se scrie un program care numără de
cîte ori figurează în acest tablou elementul minim.
8. Informaţia despre temperatura zilnică a lunii februarie a fost înscrisă într-un tablou
unidimensional. Să se scrie un program care numără de cîte ori temperatura s-a ridicat de zero
grade.
9. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care numără cîte
elemente sunt mai mari decît media aritmetică a tuturor elementelor.
10. Se consideră tabloul unidimensional B[1..n] unde n≤24, în care au fost introduse rezultatele
muncii zilnice a unui lăcătuş în decursul unei perioade de n zile lucrătoare. Să se scrie un
program care stabileşte în cîte zile lăcătuşul a îndeplinit norma zilnică k.
11. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
numărul elementelor mai mici ca elementul maxim.
12. Se consideră tabloul A[1..15] în care au fost introduse rezultatele meciurilor cu participarea
echipei de fotbal PRUT. Elementele tabloului sunt egale cu zero, dacă echipa PRUT a suferit
înfrîngere, elementele tabloului sunt egale cu unu dacă meciul s-a terminat la egalitate,
elementele tabloului sunt egale cu doi dacă echipa PRUT a învins. Să se scrie un program care
stabileşte în cîte meciuri echipa PRUT a : suferit înfrîngere, a fost învingătoare şi meciurile s-
au terminat cu egalitate.
13. Se consideră tabloul Note[1..26] în care au fost introduse notele obţinute de către elevii unei
clase obţinute la lecţia de informatică. Să se scrie un program care numără separat notele de:
8,9,10.
14. Se consideră două tablouri A[1..n] şi B[1..n] de numere reale, n≤100. Să se scrie un program
care numără propoziţii cu următoarele proprietăţi : A[i]<B[i], A[i]=B[i], A[i]>B[i].
15. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care numără
poziţiile pentru care A[i] nu este mai mic decît toate elementele premărgătoare ale tabloului
considerat: (A[1],A[2],...,A[n-1]).
16. Se consideră tabloul A[1..n] de numere întregi pozitive, n≤100. Să se scrie un program care
calculează cîte : numere prime conţine tabloul şi cîte numere perfecte.
17. Se consideră tabloul A[1..10] de numere reale. Să se scrie un program de numărare a
elementelor negative, nule şi pozitive fără a utiliza în cadrul lui ramificatorul.
18. Se consideră tabloul X[1..n] de numere întregi nenule, n≤100. Să se scrie un program care
numără de cîte ori se schimbă semnul numerelor din acest tablou.
19. Se consideră tabloul T[1..n] de numere întregi, n≤100. Să se scrie un program care numără
perechile de numere de pe poziţii consecutive modulul diferenţei cărora este egal cu unu.
20. Se consideră tabloul A[1..n] de numere pozitive şi negative, n≤100. Să se scrie un program
care numără cîte elemente îl preced pe primul element negativ.

Probleme de calculare a sumei şi produsului


21. Se consideră tabloul A[1..n] de numere reale, n≤100. Să se scrie un program care calculează
suma şi produsul tuturor elementelor.
22. Se consideră tabloul A[1..n] de numere reale n≤100. Să se scrie un program care calculează
produsul elementelor pozitive.
23. Se consideră tabloul X[1..n] de numere întregi, n≤100. Să se scrie un program care calculează
suma elementelor de pe locuri pare şi produsul elementelor de pe locuri impare.
24. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care calculează
media aritmetică a numerelor de pe locuri pare şi impare.
25. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care calculează
suma elementelor pozitive de pe locurile pare.
26. Se consideră tabloul A[1..n] de numere naturale, n≤100. Să se scrie un program care calculează
suma elementelor divizibile cu 5.
27. Se consideră tabloul A[1..n] de numere naturale, n≤100. Să se scrie un program care calculează
suma elementelor divizibile cu 3 şi cu 7.
28. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care calculează
suma elementelor mai mici ca elementul maxim.
29. Se consideră tabloul A[1..n] de numere întregi, unde n≤100 şi un număr natural M. Să se scrie
un program care calculează suma elementelor pozitive mai mici ca M. Dacă nu există astfel de
elemente de elemente să se afişeze mesajul respectiv.
30. Se consideră tabloul A[1..n] de numere întregi diferite, n≤100. Să se scrie un program care
calculează suma elementelor care se află între elementul maxim şi elementul minim. Dacă
elementul maxim şi elementul minim sunt situaţi pe poziţii consecutive, atunci suma v-a fi
zero.
31. Se consideră tabloul A[1..n] de numere întregi, n≤100, unde conţine cel puţin un număr
negativ. Să se scrie un program care calculează suma elementelor care se află după primul
element negativ.
32. Se consideră tablourile A[1..15] şi B[1..15] de numere reale. Să se scrie un program care
calculează produsul (A[1]+B[15])*(A[2]+B[14])*…*(A[15]+B[1]).
33. Într-o regiune sunt 12 judeţe. Se consideră cunoscută suprafaţa însemînţată cu grîu şi roada
medie le hectar a fiecărui judeţ. Să se scrie un program care calculează cantitatea de grîu
strînsă în regiune şi roada medie pe regiune.

Probleme de căutare a elementelor cu anumite proprietăţi


34. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
elementul maxim dintre elementele de pe locuri pare.
35. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
numărul mai mare şi poziţia lui.
36. Se consideră tabloul A[1..n] de numere întregi cel puţin un număr este negativ, n≤100. Să se
scrie un program care determină locul primului element negativ.
37. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
cel mai mic element pozitiv şi dacă el este unic.
38. Se consideră tabloul A[1898..1998] care conţine date despre temperatura lunii februarie din
perioada anilor 1898-1998. Fie x temperatura medie a lunii februarie, anul 1899. Să se scrie un
program care stabileşte anul cînd această temperatură x a fost înregistrată ultima dată.
39. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
dacă există în tabloul dat cel puţin două elemente produsul cărora să fie negativ.
40. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
indicii a două elemente suma cărora este maximă.
41. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
cel mai apropiat element, ca valoare, de elementul maxim.
42. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care determină
cea mai lungă secvenţă de zerouri.
43. Se consideră tabloul A[1..n] de numere întregi şi un număr natural k, n≤100, k≤n. Să se scrie
un program care determină dacă există o secvenţă de k elemente de pe poziţii consecutive ale
căror valoare să fie egală cu zero.
44. Se consideră tabloul X[1..n] de numere întregi, n≤100. Să se scrie un program care determină
lungimea celei mai lungi secvenţe de elemente ordonate crescător.
45. Într-un grup de persoane fiecare îşi declară vîrsta spunînd cîţi ani are. Să se scrie un program
care afişează vîrsta pe care o au cele mai multe persoane în grup. Se cere o singură soluţie.
46. Se consideră tabloul A[1..10] de numere întregi,în care unele valori se pot repeta. Să se scrie un
program care determină elementul care se repetă cel mai des. Dacă sunt mai multe elemente
care se repetă atunci să-l afişeze pe cel mai mare.
47. Se consideră tabloul X[1..n] de numere întregi, n≤100. Să se scrie un program care afişează cel
mai mare divizor al acestor numere.

Probleme de afişare
48. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care afişează
mai întîi elementele nenule apoi cele nule.
49. Se consideră tabloul X[1..n] de numere întregi, n≤100. Să se scrie un program care afişează
numerele în ordine descrescătoare.
50. Se consideră tabloul X[1..n] format din numere din 0,1,2, unde n≤100. Să se scrie un program
care afişează numerele egale cu 1, apoi egale cu 2, apoi egale cu 0.
51. Se consideră tabloul A[1..2n] de numere întregi, n≤50. Să se scrie un program care afişează
într-o linie primele n elemente iar în altă linie următoarele n elemente.
52. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care afişează în
prima linie numerele pozitive, în a doua linie numerele negative.
53. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care afişează
poziţiile elementelor minime.
54. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care afişează
elementele care fiind împărţite la 7 dau rest 1 sau 2.
55. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care afişează
divizorii fiecărui element din tablou.
56. Se consideră tabloul T[1..n] format din numere naturale din două cifre, n≤100. Să se scrie un
program care extrage în ordine crescătoare numerele care apar o singură dată şi de mai multe
ori în tabloul T.
57. Se consideră tabloul X[1..n] de numere întregi pozitive formate cel mult din patru cifre, n≤100.
Să se scrie un program care afişează pe ecran numerele inversate din tablou.

Probleme de modificare a tablourilor


58. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care măreşte
fiecare element cu 5.
59. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care înlocuieşte
elementele mai mari ca 10 cu pătratul lor.
60. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care înlocuieşte
elementele de pe locuri impare cu 100.
61. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care efectuează
interschimbarea elementului maxim cu elementul minim.
62. Se consideră tabloul A[1..n] de numere întregi, n≤100 şi un număr întreg X. Să se scrie un
program care modifică elementele acestui tablou, adăugînd la elementele de pe locurile pare
numărul X.
63. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care modifică
tabloul în felul următor: elementele minime le înlocuieşte cu media aritmetică a tuturor
elementelor, iar elementele maxime le înlocuieşte cu suma elementelor pozitive.
64. Se consideră tabloul A[1..n] de numere întregi, n≤100. Să se scrie un program care modifică
tabloul în felul următor: elementele negative le înlocuieşte cu elementul maxim, elementele
pozitive – cu media aritmetică a tuturor elementelor, iar elementele nule – cu 100.
65. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care modifică
tabloul în felul următor: elementele pozitive le înlocuieşte cu 1, cele negative – cu pătratul lor,
iar cele nule – cu 7.
66. Se consideră două tablouri A[1..n] şi B[1..n] de numere reale, n≤100. Să se scrie un program
care modifică aceste tablouri în felul următor: fiecare element de pe poziţia i al tabloului A se
va înlocui cu suma elementelor de pe poziţia i ale tablourilor iniţiale A şi B, iar fiecare element
de pe poziţia i al tabloului B se va înlocui cu produsul elementelor de pe poziţia i ale
tablourilor iniţiale A şi B.
67. Se consideră tabloul A[1..10] de numere întregi, n≤100.Să se scrie un program care modifică
tabloul, scriind în ordine inversă elementele din prima jumătate a tabloului, apoi în ordine
inversă elementele din jumătatea a doua a tabloului, adică trebuie să se obţină: A[5], A[4],
A[3], A[2], A[1], A[10], A[9], A[8], A[7], A[6].
68. Se consideră tabloul A[1..n], n – număr par de numere întregi, unde n≤100.Să se modifice acest
tablou, schimbând primul element cu al doilea, al treilea element cu al patrulea, etc.
69. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care efectuează
deplasarea spre stânga cu o poziţie a elementelor A[2], A[3], ..., A[n].Primul element va fi
înscris pe ultima poziţie.
70. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care efectuează
deplasarea elementelor spre stânga cu m poziţii. Primele m elemente vor fi înscrise pe ultimele
m poziţii.
71. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care efectuiază
deplasarea elementelor spre dreapta cu m poziţii. Ultemele m elemente vor fi înscrise pe
primele m poziţii.
72. Se consideră tabloul T[1..n], în care pe primele 8 locuri sunt scrise în ordine crescătoare
numere de telefon ale unei firme, celelalte locuri sunt copletate cu zero. S-a instalat un nou
post telefonic cu numărul X. Să se scrie un program care introduce numărul X în tabloul T,
păstrînd ordinea celorlalte elemente.
73. Se consideră tabloul X[1..n] de numere întregi şi un număr natural par k, k<n, n≤100.Să se
scrie un program care înlocuieşte primele k elemente din tablou cu şirul: 5,10,5,10... .
74. Se consideră tabloul X[1..n] şi Y [1..n] de numere reale, n≤100.Să se scrie un program care
modifică aceste tablouri în dependenţă de X[i] şi Y[i] şi anume dacă ambii sunt negativi atunci
de mărit fiecare element cu 5, dacă este negativ numai unul se înlocuieşte cu pătratul lui, dacă
ambii sunt pozitivi tunci de micşorat fiecare element cu 5, dacă este pozitiv numai unul se
înlocuieşte cu media aritmetică a valorii iniţiale.
75. Se consideră tabloul X[1..10] de numere întregi egale numai cu 0;1;2.Să se scrie un program
care aranjează pe primele locuri elementele egale cu 1 apoi cu 2 apoi cele egale cu 0.
76. Se consideră tabloul A[1..n] de numere pozitive, n≤100.Să se scrie un program care modifică
tabloul în felul următor: elementele egale cu 2 le înlocuieşte cu 4, iar elementele egale cu 4 le
înlocuieşte cu 8, iar elementele egale cu 8 le înlocuieşte cu 2.
77. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care transformă
elementele tabloului A astfel încît fiecare element transformat să fie egal cu suma celorlalte
elemente.
78. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care transformă
elementele tabloului A astfel încît fiecare element transformat să fie egal cu suma elementelor
care se află după acest element, iar pe ultimul loc cu suma tuturor elementelor.
79. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care transformă
elementele tabloului A astfel încît fiecare element transformat să fie egal cu suma elmentelor
care se află înaintea acestui element, iar pe primul loc cu suma tuturor elmentelor.
80. Se consideră tabloul A[1..n] de numere întregi cel puţin un element este pozitiv, n≤100.Să se
scrie un program care dublează toate elementele tabloului, începănd cu primul elment pozitiv.
81. Se consideră tabloul A[1..2n] de numere reale, n≤100 şi un număr întreg X.Să se scrie un
program care adună la elementele din partea stîngă a primului element maxim din tablou
valoare X, iar în cealaltă parte valoarea Y. Toate elmentele maxime rămîn fără modificări.
82. Se consideră tabloul A[1..2n] de numere natrale, unde n elemente sunt pare, iar n elemente sunt
impare, n≤50.Să se scrie un program care aranjează elementele asfel: pe locuri pare elementele
pare, pe locuri impare elentele impare.
83. Se consideră tabloul T[1..n] de numere întregi, n≤100.Să se scrie un program de transcriere a
utturor elementelor nenule la începutul tabloului, păstrînd ordinea lor, iar elemetele nenule la
sfîrşitul taloului.
84. Se consideră tabloul A[1..n] de numere întregi, n≤100.Să se scrie un program care ordonează
descescător elementele acestui tablou.
Probleme de creare a tablourilor
85. Să secrie un program care crează un tablou A[1..n], n≤100 din:
a) numerele naturale în ordine crescătoare (1, 2, …, 2n);
b) numerele naturale în ordine descrescătoare (n, n-1, …, 1);
c) numerele naturale pare în ordine crescătoare (2n, 4, …, 2);
d) numerele naturale pare în ordine descrescătoare (2n, 2n-2, …,2);
e) numerele naturale impare în ordine crescătoare (1, 3, …, 2n-1);
f) numerele naturale impare în ordine descrescătoare (2n-1, 2n-3, …,1);
g) numerele negative în ordine crescătoare (-n, -(n+1), …, -1);
h) numerele negative în ordine descrescătoare (-1, -2, …, -n).
86. Să scrie un program care creează un tablou unidimensionar A[1..10] în felul următor
elementele de pe locurile pare să fie egal cu suma dintre indicele său şi numărul 5, iar cele de
pe locurile impare cu 10.
87. Se consideră tabloul A[1..n ] de numere întregi, n<=100. Să se scrie un program care
inversează tabloul A, folosind un alt tablou.
88. Se consideră tabloul A[1..n ] de numere întregi, n<=100. Să se scrie un program care creează
tabloul de numere reale B[1..n] în felul următor: elementul de pe poziţia i să fie egal cu media
aritmetică a primelor i elemente ale tabloului A: B[I ] : = (A [1]+…+ A [i])/i.
89. Se consideră două tablouri unideminsionale A[1..n] şi B[1..n] de numere reale, n<=. Să se scrie
un program care creează tabloul C[1..2] din elementele tablourilor A şi B (se înscriu la început
elementele din A, apoi cele din B).
90. Se consideră două tablouri unidimensionale A[1..n] şi B[1..n] de numere întregi n<=100. Să se
scrie un program care creează tabloul C[1..n ], unde pe locuri impare să fie plasate elementele
tabloului A, iar pe locurile pare – elementele tabloului B (elementele din tablourile A şi B se
iau în ordine în care sunt introduse).
91. Se consideră tabloul A[1..n ] de numere naturale, n<=100. Să se scrie un program care
transcrie în modul unidimensional B elementele pare din tabloul A, păstrînd ordinea lor
(elementele pare se iau în ordinea în care urmează în tablou.
92. Se consideră tabloul A[1..n ] de numere naturale, n<=100. Să se scrie un program care
creează tabloul unidimensional B din elementele tabloului A în următoare ordine: mai întîi cele
pozitive, apoi cele negative şi la sfîrşit cele nule.
93. Se consideră tabloul A[1..100] de numere întregi, n<=100. Să se scrie un program care
completează tabloul B[1..50] în felul următor: primul elment din B să fie egal cu suma
primului şi ultimului element din A, elemntul al doilea din B să fie egal cu suma dintre al
doilea ţi penultimul element din A, ş.a.m.d.
94. Se consideră tabloul A[1..100] de numere întregi, n<=100. Să se scrie un program care
completeză tabloul B[1..50] în felul următor: primul element din B să fie egal cu suma dintre
primul şi al doilea element din A, elementul al doilea din B să fie egal cu suma dintre al treilea
şi al patrulea element din A, ş.a.m.d. 11.Se consideră numărul natural N format din cel mult9
cifre. Să se scrie un program care înscrie în tablou unidimensional B, divizorii numărului N.
95. Se consideră numărul natural N format din cel mult 9 cifre. Să se scrie acest număr într-un
tablou. De exemplu, pentru N= 51728 să se obţină: A[1] = 5, A[2] = 1, A[3] = 7, A[4] = 2, A[5]
= 8.
96. Se consideră tabloul A[1..n] de numere întregi, n100. Să se scrie un program care creează
tabloul B[1..n ] în felul următor:
B[1]:=A[1];
B[2]:=A[n];
B[3]:=A[2];
B[4]:=A[n-1];
97. Se consideră tabloul A[1..8] format din caractere arbitrare. Să se scrie un program care creează
un alt tablou B[1..8] din elementele tabloului A în următoarea ordine:
a) A[8], A[1], A[2], A[3], A[4], A[5], A[6], A[7].
b) A[2], A[3], A[4], A[5], A[6], A[7], A[8], A[1].
98. Se consideră tabloul A[1..20] format din caractere arbitrare. Să se scrie un program care
creează un alt tablou B[1..20 ] din elementele tabloului A în următoarea ordine:
a) A[11], A[12], …,A[20], A[1], A[2], …, A[10].
b) A[10], A[9], …, A[1], A[11], A[12], …,A[20].
99. Se consideră tabloul A[1..10] format din caractere arbitrare. Să se scrie un program care
creează tabloul B[1..20] din elementele tabloului A în următoare ordine:
a) A[1], A[2], …, A[10], A[1], A[2], …, A[10].
b) A[10], A[9], …, A[1], A[10], A[9], …, A[1].
c) A[1], A[2], …, A[10], A[10], A[9], …, A[1].
d) A[10], A[9], …, A[1], A[1], A[2], …, A[10].
100. Se consideră tabloul A[1..n] de numere întregi, n100. Să se scrie un program care transcrie
în tabloul B elementele tabloului A diferite de cel maxim.
101. Se consideră tabloul X[1..n] de numere reale, n100. Să se scrie un program care creează
tabloul Y din elementele tabloului X, interclasînd între fiecare două elemente media lor
aritmetică. De exemplu, avînd tabloul: 7 4.2 11 –1 20 se va obţine tabloul: 7 5.6 4.2 7.6 11 5
–1 9.5 20
102. Se consideră tabloul X[1..n] de numere reale, n100. Să se scrie un program care creează
tabloul Y din elementele tabloului X, interclasînd între fiecare două elemente valoarea
elementului maxim. De exemplu, pentru tabloul: 7 42 –2 11 42 se va obţine tabloul: 7 42 42
42 –2 42 11 42 42
103. Se consideră tabloul X[1..n] de numere întregi pozitive, n100. Să se scrie un program care
transcrie în tabloul unidimensional Y elementele pare din X aranjate în ordine descrescătoare.
104. Se consideră tabloul A[1..n] de numere naturale, n100. Să se scrie un program care transcrie
în tabloul unidimensional B numerele prime din A.

Probleme mixte
105. Se consideră tabloul P[1..n] de numere reale diferite de zero, n100. Să se scrie un program
care calculează numărul de elemente negative şi suma celor pozitive.
106. Se consideră tabloul A[1..n] de numere întregi pozitive, n100. Să se scrie un program care
calculează media aritmetică a elementelor pare.
107. Se consideră tabloul A[1..n] de numere reale, n100. Şi un muăr arbitrar x. Să se afişeze
“DA” dacă x se află printre elementele tabloului A, în caz contrar – “NU”.
108. Se consideră tabloul A[1..20], în care a fost introdusă cantitatea de pracipitaţii (în mm) pentru
fiecare an din 1980 pînă în 1999 care au căzut în Moldova. Să se calculeze cantitatea medie a
precipitaţiilor în această perioadă şi abaterea de la media pentru fiecare an.
109. Se consideră tabloul T[1..n] de numere egale numai cu 0, 1, 2 sau 3, n100. Să se scrie un
program care înlocuieşte 1cu 0, 2 cu 1, 3 cu 2 şi 0 cu 3.
110. Se consideră tabloul T[1..9], în care fiecare componenţă conţine o cifră. Să se scrie un care
formează din aceste cifre numărul N. De exemplu, dacă tabloul T are 5 componente T[1] = 6,
T[2] = 2, T[3] = 1, T[4] = 2, T[5] = 8, atunci numărul căutat este N=62128.
111. Se consideră numărul natural N. Să se scrie un program care determină cel mai mic număr
care poate fi obţinut di cifrele numărului considerat N (numărul N este format din cel mult 9
cifre). De exemplu, dacă N=325821, rezultatul va fi 122358.
112. Se consideră tabloul X[1..n] de numere întregi, n100. Dacă media aritmetică a numerelor
pozitive este mai mare decît 10, atunci să se afişeze numărul maxim din tabloul inversat.
113. Se consideră tabloul A[1..n] de numere întregi, n100. Dacă în tablou sunt mai multe numere
pozitive decît negative, atunci să se afişeze într-un rînd elementele pozitive, iar în alt rînd
cele negative, în caz contrar să se afişeze tabloul, unde elementele de pe locurile pare sunt
înlocuite cu 0.
114. Se consideră tabloul S[1..n] de numere întregi, n100. Dacă în tablou există un singur
element maxim, atunci să se afişeze cel mai mic element pozitiv, în caz contrar să se
ordoneze crescător elemente tabloului.
115. Se consideră tabloul S[1..80] format din caracere arbitrare. Să se determine cîte din egalităţile
următoare sînt adevărate:
a) S[1] = S[41], S[2] = S[42], …, S[40] = S[80];
b) S[1] = S[80], S[2] = S[79], …, S[40] = S[41].

116. Se consideră tabloul A[1..16] de numere întregi. Să se crie un program care calculează:
a) max(A[1]+A[16], A[2]+A[15], …,A[8]+A[9]);
b) min(A[1]*A[9], A[2]*A[10], …, A[8]*A[16]).
117. Se consideră tabloul A[1..2n ] de numere întregi nenule, n100. Dacă în tablou există numere
pozitive, atunci să se calculeze:
Max (A[1]+A[2n], A[2]+A[2n-1], …, A[n]+A[n+1]), în caz contrar să se calculeze:
Min (A[1]+A[n+1], A[2]+A[n+2], …, A[n]+A[2n]).
118. Se consideră tabloul T[1..18], în care sunt întroduşi anii din perioada de la 1605 – 1987, în
care pe teritoriul Moldovei au avut loc cutremure de pămînt: 1605, 1620, 1679, 1681, 1701,
1738, 1740, 1746, 1790, 1802, 1829, 1893, 1898, 1908, 1394, 1940, 1977, 1986. Să se scrie
un program de calcul a celei mai lungi perioade dintre două seismuri, în care nu au fost
înregistrate cutremurele de pămînt.
119. Se consideră tabloul A[1..n] de numere naturale, n100. Să se scrie un program care afişează
poziţiile numerelor perfecte.
120. Se consideră tabloul A[1..n] de numere întregi pozitive, n100. Să se determine elementul
maxim şi să se calculeze suma cifrelor lui.
121. Se consideră bancnote în valoare de 1, 5, 10, 20, 50, 100, 200 şi 500 lei. Să se scrie un
program care reprezintă oricare suma de N lei printr-un număr minim de bancnote.
122. Se consideră tabloul A[1..n] de numere întregi, n100. Să se scrie un program după execuţia
căruia se va cunoaşte dacă tabloul A sunt cel puţin două elemente vecine egale.
123. Se consideră declaraţiile:
Type nume = (Ion, Vasile, Ana, Mihai, Ala, Maria, Sandu);
Inaltime: Array [nume] of 140..200;
I: nume;
Ma: real;
Să se determine numele celui mai înalt băiat şi înălţimea medie a fetelor.
124. Se consideră declaraţiile:
Type luna = (ianuarie, februarie, martie, aprilie, mai, iunie, iulie, august,
septembtrie, octombrie, noiembrie, decembrie);
Var L: Array [luna] of 28..31;
125. Să se scrie un program care atribuie fiecărui element al tabloului o valoare egală cu numărul
de zile în luna corespunzătoare.

CAPITOLUL IV
---------------------------------------------------------------------
Tablouri cu tablouri bidimensionale
Exemplul 1:
Se consideră tabloul bidimensional A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un
program care calclează suma tuturor elementelor acestui tablou.
De menţionat că pentru a introduce elementele unui tabou bidimensional, se citesc mai întîi
dimensiunile lui (numărul de linii şi coloane), apoi se citesc pe rînd elementele tabloului. Pentru
parcurgerea elmentelor unui tablou bidimensional sunt necesare două cicluri imbricate.
Calculul sumei elementelor într-un tabloubidimensional se face în mod asemănător cu calculul
sumei elementelor unui tabou unidimensional, cu deosebirea care se impune în cadrul parcurgerii
bidimensional.
Program P54;
Uses Crt;
Const nmax=20;
mmax=20;
Var A: Array [ 1..nmax, 1..mmax] of Integer;
i, n: 1..nmax;
j, m: 1..mmax;
S: Integer; {i – linia, j – coloana}
Begin
ClrScr;
Writeln(‘Introdu dimensiunea tabloului:’);
Write(‘Dati numarul de linii n=’);Readln(n); {Se citeste numarul linilor}
Write(‘Dati numarul de coloane m=’);Readln(m); {Se citeste numarul coloanelor}
Writeln(‘Introdu un tablou cu’,n,’linii si’,m,’coloane:’);
S:=0;
For i:=1 To n Do
For j:=1 To n Do
Begin
Read(A[i, j]);
S:=S+A[i, j]
End;
Writeln(‘Suma elementelor este:’,S);
Readln
End.

Introdu dimensiunea tabloului:


Daţi numărul de linii n=3
Daţi numărul de coloane m=4
Introdu un tablou cu 3 linii şi 4 coloane:
6101
7 0 0 –1
0234
Suma elementelor este: 19

Întrucît tabloul A a fost declarat cu dimensiunea de 20 linii şi 20 coloane, nu se permite de a introduce


valori mai mari pentru variabilele n şi m. Dacă, însă se va face acest lucru, calculatorul va afişa un
maeaj de eroare.
Dacă doriţi să lucraţi cu mai multe linii sau coloane, atunci trebuie să schimbaţi valorile constantelor
nmax şi mmax di secţiunea declarativă a programului.
Se observă că elementele tabloului bidimensional au fost introduse pe linii separate prin spaţii. Acest
lucru nu este obligatoriul, se face pentru claritate.

Exemplul 2:
Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care
zerografiază diagonala principală.
Pentru un tablou A cu n linii şi n coloane sunt definite:
- diagonala principală, care conţine elementele de forma:
A[1, 1], A[2, 2], …, A[i, i ] . . . A[n, n];
- diagonala secundară care conţine elementele de forma:
A[1, n], A[2, n-1], …, A[i, n+1-i] . . . A[n, 1].

Pentru a zerografia diagonala principală, se repetă de n ori atribuirea A[i, i]:=0, unde i variază de la I
la n .
Program P55;
Uses Crt;
Const nmax=20;
Var A:Array [ 1..nmax, 1..nmax] of Integer;
i, j, n: 1..nmax;
Begin
ClrScr;
Write(‘Introdu dimensiunea tabloului n=0’); Readln(n);
For i:=1 To n Do
For j:=1 To n Do Read(A[i, j]);
For i:=1 To n Do A[i, i]:=0; {Zerografierea elementelor de pe diagonala principala}
Writeln(‘Tabloul cu diagonala principala zerografiata:’);
For i:=1 To n Do
Begin
For j:=1 To n Do Write(A[i, j]:4);
Writeln
End;
Readln
End.

Introdu dimensiunea tabloului n=4


2105
-1 42 6 10
21 2 5 1
14 3 0 8
Tabloul cu diagonala principală zerografiată:
0Program
105 P56;
-1 0 6 10
Uses Crt;
21 2 0A:
Var 1 Array [1..20, 1..20] of Integer;
14 3 0 0
n, m, aux, i, j: Integer;
Begin
Se observă că afişarea elementelor unui tablou bidimensional, de asemenea, se organizează prin
ClrScr;
intermediul a două cicluri imbricate.
Write(‘Introdu numarul de linii si coloane n, m=’); Readln(n, m);
For i:=1 To n Do
For j:=1 To m Do Read(A[i, j]);
Exemplul 3:
For j:=1 To m Do
Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program care
Begin
schimbă cu locul prima şi ultima linie.
aux:=A[1, j];
Se parcurg pe rînd elementele liniilor respective, interschimbînd fiecare două elemente A[1, j] şi A[n,
A[1, j]:=A[n, j];
j] de pe locurile corespunzătoare.
A[n, j]:=aux
End;
Writeln(‘Tabloul dupa schimbarea liniilor 1 si’,n);
For i:=1 To n Do
Begin
For j:=1 To m Do Write(A[i, j]:4);
Writeln;
End;
Readln
End.
Introdu numărul de linii şi coloane n, m=4 3
111
222
333
444
Tabloul după schimbarea liniilor 1şi 4
444
222
333
111

Exemplul 4:
Se consideră tabloul A[1..n, 1..n] de numere întregi, n20. Să se scrie un program care schimbă
ordinea elementelor de pe diagonala principală, scriindu-le în ordine inversă.
Scrierea în ordine inversă a elementelor de pe diagonala principală se face în mod asemănător cu
scrierea în ordine inveră a elementelor unui tablou unidimensional cu n componente, cu deosebirea că
elementele tabloului bidimensional sunt determinate de doi indici.
Program P57;
Var A: Array [1..20, 1..20] of Integer;
n, aux, i, j: Integer;
Begin
Write(‘Introdu dimensiunea tabloului n=’); Readln(n);
Writeln(‘Introdu un tablou cu’,n,’linii si’,n,’coloane’);
For i:=1 To n Do
For j:=1 To n Do Read(A[i, j]);
For i:=1 To n Div 2 Do
Begin aux:=A[i, i]; A[i, i]:=A[n+1-i, n+1-i]; A[n+1-i, n+1-i]:=aux End;
Writeln(‘Tabloul dupa inversarea diagonalei principale:’);
For i:=1dimensiunea
Introdu To n Do Begin
tabloului n=4
Introdu un tablou cu 4 linii şi 4 coloane
For j:=1 To n Do Write(A[i, j]:4); Writeln
1 2 30 4
End;
0 55 2 7
Readln
906 1
End.
27 3 4 15
Tabloul după inversare digonalei principale:
15 2 30 3
06 2 7
9 0 55 1
27 3 4 1
Exemplul 5:
Se consideră tabloul A[1..n, 1..n] de numere întregi, n20. Să se scrie un program care determină
elementul maxim dintre elementele care se află mai jos de diagonala principală.
La început se consideră maxim perimul număr dintre elementel care se află sub diagonala principală
(max:=A[2, 1]. Apoi se parcurg elementele care se află sub diagoanala principală (prin intermediul
unui ciclu parametrul căruia variază de la 1 la i-1 ) şi se compară cu variabila max (maximul curent).
Cînd se gădeşte un element A[i, j] mai mare decît max, se actualizează maximul.

Program P58;
Use Crt;
Var A: Array [1..20, 1..20] of Integer;
n, i, j, max: Integer;
Begin
ClrScr;
Write(‘Introdu dimensiunea tabloului n=’); Readln(n);
For i:=1 To n Do
For j:=1 To n Do Read(A[i, j]);
max:=A[2, 1]; {Se considera maxim elementul A[2, 1]}
For i:=3 To n Do
For j:=1 To i-1 Do
If A[i, j]>max Then max:=A[i, j];
Write(‘Elementul max de mai jos de diagonala principala:’);
Writeln(max);
Readln
End.

Introdu dimensiunea tabloului n=4


12 3 4 15
0 1 7 -3
5 13 9 4
0 –5 8 6
Elementul max de mai jos de diagonala principală: 13
Program P59_1;
ExemplulUses6:Crt;
Se considerăA:tabloul
Var ArrayA[1..n,
[1..20,1..n]
1..20]
deof Integer;
numere întregi, unde n20. Să se scrie un program care calculează
suma elementelori, j, n,
de S:
peInteger;
fiecare linie.
Prima Begin
variantă a programului calculează suma elementelor de pe linii, utilizînd o variabilă de tip
întreg S.ClrScr;
Şi anume: se iniţializează suma cu zero; se calculează suma elementelor de pe linie; se
Writeln(‘Introdu dimensiunea
afişează valoarea obţinut.Acest tabloului:’);
procedeu se repetă Readln(n, m); linie.
pentru fiecare
For i:=1
Un moment To n Doîn algoritmul propus este locul în care se face iniţializarea sumei.
important
For j:=1 To n Do Read(A[i, j]);
For i:=1 To n Do
Begin S:=0; {Seiniţializează suma la început de fiecare linie}
For j:=1 To m Do S:=S+A[i, j];
Writeln(‘Suma elementelor de pe linia’,i,’este:’,S)
End;
Readln
End.
Introdu dimensiunea tabloului
33
7 14 –1
038
2 –1 5
Suma elementelor de pe linia1 este:20
Suma elementelor de pe linia 2 este:11
Suma elementelor de pe linia 3 este: 6

A doua variantă a programului rezolvă problema, construind un tablou unidimensional S(un


tablou”de sume”) în felul următor: primul element este egal cu suma elementelor din prima linie,
elementul al doilea – cu suma elementelor din linia a doua ş.a.m.d. Se menţionează, că această variantă
poate fi utilizată atunci cînd va fi nevoie de a folosi sumele calculate pentru un alt scop.

Program P59_2;
Uses Crt;
Var A: Array [1..20, 1..20] of Integer;
S: Array [1..20] of Integer;
i, j, n: Integer;
Begin
ClrScr;
Writeln(‘Introdu dimensiunile tabloului:’); Readln(n, m);
For i:=1 To n Do
For j:=1 To m Do Read(A[i, j]);
For i:=1 To n Do
Begin S[i]:=0; {Se initializeaza suma la inceput de fiecare linie}
For j:=1 To m Do S[i]:=S[i]+A[i, j];
Writeln(‘Suma elementelor de pe linia’,i,’este:’,S[i])
End;
Readln
End.

Introdu dimensiunea tabloului


33
7 14 –1
038
2 –1 5
Suma elementelor de pe linia 1 este: 20
Suma elementelor de pe linia 2 este: 11
Suma elementelor de pe linia 3 este: 6

Exemplul 7:
Se conideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program care
calculează numărul elementelor pozitive de pe fiecare coloană.
Problema este similară cu cea di exemplul 6. Modificarea care apare este folosirea coloanelor în
locul liniilor.
Se parcurge pe rînd fiecare coloană, la început de care se face iniţializarea contorului cu 0.
Program P60;
Var A: Array [1..20, 1..20] of Real;
i, j, n, m, k: Integer;
Begin
Write(‘n=’);Readln(n);
Write(‘m=’);Readln(m);
For i:=1 To n Do
For j:=1 To m Do Read(a[i, j]);
For j:=1 To m Do
Begin k:=0;
For i:=1 To n Do
If A[i, j]>0 Then k:=k+1;
Writeln(‘In coloana’,j,’ sunt’,k,’elemente pozitive’);
End;
Radln
End.
n=3
m=4
3 –6 0 5
-4 –6 0 12
13 1 –5 7
În coloana 1 sunt 2 elemente pozitive
În coloana 2 sunt 1 elemente pozitive
În coloana 3 sunt 0 elemente pozitive

Exemplul 8:
Se consideră tabloul A[1..n, 1..n] de numere întregi, n20. Să se scrie un program care creează un
tablou unidimensional B din elementele diagonalei secundare ale tabloului A.
Diagonala secundară poate fi parcursă de jos în sus sau de sus în jos.
Se observă că poziţia în care va fi înscris un element în tabloul B coincide cu numărul liniei din care
vafi luat elementul corespunzător din tabloul A. Datorită acestui fapt se organizeză un ciclu de la 1 la
n, în care se formează, pe rînd, elementele tabloului B.
Program P61;
Type Tab=Array [1..20] of Integer;
Var A: Array [1..20] of Tab;
B: Tab;
i, j, n: Integer;
Begin
Write(‘n=’);Readln(n);
For i:=1 To n Do
For j=1 To n Do Read(A[i, j]);
Write(‘Tabloul cu diagonala secundara:’);
For i:=1 To n Do
Begin B[i]:=A[i,n+1-i]; {Se parcurge pe diagonala de sus in jos}
Write(B[i]:4)
End;
Readln
End.
n=3
1 5 36
24 –4 8
9 56 –3
Tabloul cu diagonala secundară: 36 –4 9

Exemplul 9: Se consideră tabloul A[1..n, 1..m] de numer întregi, unde n, m20. Să se scrie un
program care determină linia cu cele mai multe elemente nule. Dacă nu există o astfel de linie, să se
afişeze mesajul respectiv.

Program P62;
Uses Crt;
Var A: Array [1..20, 1..20] of Integer;
i, j, n, m, L, max: Integer;
Begin
ClrScr;
Write(‘n=’);Readln(n);
Write(‘m=’);Readln(m);
For i:=1 To n Do
For j:=1 To m Do
Read(A[i, j]);
max:=0;
L:=0; {L – numarul liniei care se cauta}
For i:=1 To n Do
Begin
k:=0
For j:=1 To m Do
If A[i, j]=0 Then k:=k+1;
If k>max Then Begin max:=k; L:=i End
End;
If L=0 Then Writeln(‘Tabloul nu contine elemente nule’)
Else Writeln(‘Cele mai multe elemente nule sunt in linie’,L);
Readln
End.

n=5
m=4
3 10 0 7
14 5 –1 0
0020
8341
1734
Cele mai multe elemente nule sunt în linia 3
Exemplul 10: Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un
program care exclude din tabloul A linia, numărul căreia este egal cu numărul L (Ln) introdus de la
tastatură.
Acest lucru se realizează prin deplasarea tuturor liniilor care se află sub linia L cu o linie mai sus.

Program P63;
Var A: Array [1..20, 1..20] of Integer;
i, j, n, m, L: Integer;
Begin
Write(‘n=’);Readln(n);
Write(‘m=’);Readln(m);
Writeln(‘Introdu un tablou cu’,n,’linii si’, m,’coloane:
For i:=1 To n Do
For j:=1 To m Do Read(A[i, j]);
Write(‘Introdu numarul liniei ce trebuie exclusa L=’); Readln(L);
{In continuare se verifica daca L este intre 1 si n}
If (L<1) Or (L>n) Then
Begin
Write(‘Nu exista asa linie!’);
Exit {Iesire din program}
End;
For i:=1 To n-1 Do {Liniile mai jos de L}
For j:=1 To m Do
A[i, j]:=A[i+1, j] ; {Se deplaseaza elementele cu o linie mai sus}
Dec(n); {Numarul de linii se micsoreaza cu 1}
Writeln(‘Tabloul fara linia a’,L,’este:’);
For i:=1 To n Do
Begin
For j:=1 To m Do Write(A[i, j]:4);
Writeln;
End;
Readln
End.

n=3
m=2
Introdu un tablou cu 3 linii şi 2 coloane:
40
-5 7
92
Introdu numărul liniei ce trebuie exclusă L=2
Tabloul fără linia a 2 este:
40
92
Exemplul 11: Se consideră tabloul Aă1..n,1..mî, în care sunt înscrise numere naturele din intervalul
10..50 (n, m20). Să se scrie un program care determină de cîte ori se repetă valoarea fiecărui element.
De exemplu, dacă se va introduce tabloul:
12 25 26 28
25 60 38 25
12 25 38 40
rezultatul va fi:
numărul 12 se conţine de 2 ori;
numărul 25 se conţine de 4 ori ş. a. m. d.
Rezultatul acestei probleme va fi obţinut pri crearea unui tablou unidimensional B[10..50], unde
fiecare element va fi egal cu numărul de apariţii al acestui element din tablou A, valoarea căruia
coincide cu indicele respectiv din tabloul B. Se observă că unele elmente din B vor rămîne egale cu
zero. Din acest motiv la sfîrşitul programului se aleg numai valorile nenule din tabloul B şi se afişează.

Program P64;
Uses Crt;
Var A: Array [1..20, 1..210] of 10..50;
B: Array[10..50] of Byte;
i, j, n, m, l, max: Integer;
Begin
ClrScr;
Write(‘n=’);Readln(n);
Write(‘m=’);Readln(m);
Writeln(‘Introduceti tabloul:’);
For i:=1 To n Do
For j:=1 To m Do Read(A[i, j]);
For i:=10 To 50 Do B[i]:=0; {Zerografierea tabloului B}
For i:=1 To n Do
For j:=1 To m Do
Inc(B[A[i, j]]);
{Se incrementeaza elementul din B indicele caruia este un element din
A:B[12]:=B[12]+1;}
Writeln(]Rzultatul:’);
For i:=10 To 50 Do
If B[i]<>0 Then Writeln(‘Numarul’,I,’ se contine de’,B[i],’ ori’)
Readln
End.
n=4
m=5
Introduceţi tabloul:
45 23 45 23 27
11 45 34 15 40
15 34 45 17 40
23 27 22 40 15
Rezultatul:
Numărul 11 se conţine de 1 ori
Numărul 15 se conţine de 3 ori
Numărul 17 se conţine de 1 ori
Numărul 22 se conţine de 1 ori
Numărul 23 se conţine de 3 ori
Numărul 27 se conţine de 2 ori
Numărul 34 se conţine de 2 ori
Numărul 40 se conţine de 3 ori
Numărul 45 se conţine de 4 ori
Programe Propuse
1. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care calculează suma şi produsul elementelor pozitive.
2. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină numărul elementelor mai mari decît media aritmetică a tuturor elementelor.
3. Se consideră tabloul A[1..n, 1..m] de nuumere întregi, unde n, m20. Să se scrie un program
care de determină elementul maxim.
4. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină elementul minim şi poziţia lui.
5. Se consideră tabloul Y[1..n, 1..m] de numere întregi, unde n20. Să se scrie un program care
determină elementul maxim şi elementul minim, precum şi poziţiile acestora.
6. Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care
determină elementul maxim de pe diagonal principală şi elementul maxim de pe diagonala
secundară.
7. Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care
afişează în linii separate elementele care se află pe diagonala principală şi elementele care se
află pe diagonala secundară.
8. Se consideră tabloul X[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care
afişează în linii separate elementele situate deasupra diagonalei principale şi cele de sub
aceasta; elementel situate deasupra diagonalei secundare şi dedesubtul ei.
9. Se consideră taabloul X[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care
zerografiază elementele de pe diagonala secundară şi cele mai jos de ea.
10. Se consideră tabloul A[1..n, 1..n] de numere înregi, unde n20. Să se scrie un program care
schimbă în opus semnele elementelor situate deasupra diagonalei proncipale.
11. Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n, m20. Să se scrie un program care
transcrie în tablou unidimensional B elemmentele pozitive din A.
12. Se consideră un tablou bidimensional A[1..n, 1..m] de numere întregi, unde n, m20. Să se
scrie un proram care pentru fiecare linie a tabloului A determină elementul minim şi-l înscrie în
vectorul B[1..n].
13. Se consideră tabloul A[1..n, 1..m] de numere înregi, unde n, m20. Să se scrie un program care
calculează numărul de elemente pozitive de pe diagonala principală.
14. O ţară are 50 oraşe, legate prin comunicaţii aeriene. Costul unui bilet din oraşul i în oraşul j e
indicată în tabloul bidimensional Preţul[1..50, 1..50]. Să se scrie un program care gădeşte o
rută din oaşul i în oraşul j cu cel mai mic preţ.
15. Se consideră tabloul A[1..n, 1..n] de numere înregi, unde n20. Să se scrie un program care
determină elementul minim şi elementul maxim dintre elementle care se află mai sus de
diagonala principală şi să se efectuieze interschimbarea lor.
16. Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care va
aduna la fiecare element al tabloului suma elementelor de pe diagonala principală.
17. Se considerăă tabloul A[1..n, 1..n] de nuere înregi, unde n20. Să se scrie un program care
calculează suma elementelor care nu se află pe diagonala secundară.
18. Se consederă tabloul T[1..n ,1..n] de nuere înrtegi, unde n20. Să se scrie un program care
calculează media aritmetică a elementelor de pe diagonala principală şi suma elementelor de pe
diagonala secundară.
19. Se consideră tabloul A[1..n, 1..n] de numere înregi, unde n20. Să se scrie un program care
creează un vector din elementele diagonalei principale.
20. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care creează un tablou B[1..n] din sumele elementelor de pe linii din tabloul A.
21. Se consideră tabloul A[1..n, 1..m] de numere reale, unde n, m20. Să se scrie un program care
creează un tablou B[1..m] de pe produsele elementelor de pe coloane din tablou A.
22. Se consideră tabloul X[1..n, 1..n] de numere întregi, unde n, m20. Să se scrie un program care
creează un tablou Y[1..n] din elementele maxime de pe liniile tabloului X.
23. Se consideră tabloul A[1..n, 1..n] de numere întregi , unde n, m20. Să se scrie un program
care efectuează interschimbare elementelor de pe diagonala principală şi secundară care se află
pe aceiaşi linie.
24. Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n, m20. Să se scrie un program care
modifică tabloul A, interschimbînd în fiecare linie primul element maxim cu elementul de pe
diagonala principală din linia corespunzătoare.
25. De scris programe care creează următoarele tablouri bidimensionale:
a) 1 0 0 b) 0 0 0 c) 0 0 0 d) 1 1 1
010 010 011 110
001 100 111 100

e) 1 1 1 1 f) 1 2 3 4 g) 0 0 0 0 h) 1 0 1 0 i) 0 1 0 1
2222 1234 1111 1010 1010
3333 1234 0000 1010 0101
4444 1234 1111 1010 1010

j) 1 2 3 k) 1 2 3 l) 1 2 3
894 654 456
765 789 789

26. De scris programe care creează tablouri bidimensionale A[1..10, 1..10] cu următorul aspect:
a)0 0 0…0 b)1 2 3…10 c)1 2 3…10
0 1 0…0 11 12 13…20 0 1 2…9
0 0 2…0 21 22 23…30 0 0 1…8
… … …
0 0 0…9 91 92 92…100 0 0 0…1
27. Se consideră numărul întreg x. Să se scrie un program care creează următorul tablou:
x x2 x3 x4 x5 x6 x7
x2 0 0 0 0 0 x6
x3 0 0 0 0 0 x5
x4 0 0 0 0 0 x4
x5 0 0 0 0 0 x3
x6 0 0 0 0 0 x2
x7 x6 x5 x4 x3 x2 x
28. Să se scrie un program care afişează pe ecan în formă de tablou cu 5 linii şi 7 coloane
calendarul pentru luna curentă a anului curent. De exemplu, pentru luna februarie, anul 2000 se
va afişa:
123456
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29
29. Se consideră tabloul A[1..n, 1..m] de numere întregi diferite, unde n, m20. Să se scrie un
program care efectuează interschimbare liniei pe care se află primul element maxim cu linia
numărul căreia se introduce dela tastatură.
30. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
conform căruia la fiecare element al linie I se adugă elementul A[i, i] al tabloului iniţial.
31. Se consideră tabloul A[1..n, 1..n] de numere întrgi, unde n, m20. Să se scrie un program care
determină da că tabloul A este simetric faţă de diagonala principală.
32. Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care
determină elementul maximpentru fiecare din cele patru zone formate de diagonale.
33. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care calculează suma elemenelor de pe fiecare coloană.
34. Se consideră tabloul A[1..n, 1..m]de numere întregi, unde n, m20. Să se scrie un program care
determină numărul elementelor nenule de pe fiecare linie.
35. Se consideră tabloul X[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care calclează suma şi produsul elementelor de pe fiecare linie.
36. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care calculează madia aritmetică a elementelor de pe fiecare coloană, linie.
37. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină elementul maxim şi elementul minim pentru fiecare linie.
38. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care efectuează interschimbarea linilor n1 şi n2. Numerele n1(n1n) şi n2(n2n) se introduc de la
tastatură.
39. Se consideră tabloul A[1..n, 1..m] de numere întregi şi un număr întreg X, unde n, m20. Să se
scrie un program care determină dacă în tabloul A există elemente egale cu X.
40. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină în căte rînduri există elementul minim.
41. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină numărul liniei cu cele mai multe elemente pozitive (prima linie cu această
proprietate).
42. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină numărul liniei cu cele mei multe elemnte pozitve (primalinie cu această
proprirtate).
43. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină numărul coloanei cu cel mai mic produs al elementelor.
44. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină în cîte linii există elemente nule.
45. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care creează tabloul B[1..n, 1..m], calculînd fiecare element după formula:
B[i, j]:=A[i, j]*A[i, j].
46. Se consideră tabloul[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program care
calculează suma elementelo de pe “perimetrul” tabloului şi suma celorlalte elemente.
47. Se consideră tabloul X[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care înlocuieşte elementele de pe “perimetrul” cu valoarea elementului maxim din tablou.
48. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care ănlocuieşte cu zero de pe “ perimetrul” tabloului.
49. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20.Să se scrie un program care
calculează diferanţa dintre cea mai mare medie aritmetică de pe linii şi cea ma micămedie
aritmetică de pe coloane.
50. Se consideră tanbloul A[1.n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care calculeză suma elementelor din liniile unde nu sunt elemente negative.
51. Se consideră tabloul A[1..n, 1..m] şi tabloul C[1..n*m] de numere întregi, unde n, m20. Să se
scrie un program care înlocuieşte elementele nule din tabloul A cu elementele din tabloul
C(elementele din C se iau în ordine în care sunt introduse).
52. Se consideră două tablouri A[1..n, 1..m] şi B[1..n, 1..m] de numere întregi, unde n, m20. Să se
scrieun program care verifică dacă fiecare element din A are ceeaşi valoare ca şi elementul de
pe locul corespunzător din B.
53. Se consideră două tablouri A[1..n, 1..m] şi B[1..n, 1..m] de numere întregi, unde n, m20. Să se
scrie un program care verifică dacă fiecare element din A coincide cu fiecare valoare din B.
54. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care determină elementul maxim pentru fiecare linie şi calculează suma lor, elementul maxim
pentru fiecare coloană şi suma lor.
55. Se consideră tabloul A[1..n, 1..m] de numere naturale, unde n, m20. Să se scrie un program
care înscrie în tabloul unidimensional B numere prime din tabloul A.
56. Se consideră tabloul X[1..n, 1..m] de numere întregi şi un număr întreg C, unde n20. Să se
scrie un program care afişează toate poziţiile în care apare acest element.
57. Se consideră tabloul X[1..n, 1..m] fortmat din caractere arbitrare, unde n20. Să se scrie un
program care verifică dacă elementele tabloului X sunt egale.
58. Se consideră tabloul A[1..n, 1..m] de numere întregi şi un număr înreg k(l  k m), unde n,
m20. Să se scrie un program care exclude a coloanei cu numărul k.
59. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n20. Să se scrie un program pentru
excluderea liniei şi coloanei, la intersecţia cărora se află elementul maxim de pe diagonala
principală.
60. Să se scrie un program care construieşte pătratul latin. Pătratul latin este un tablou de
dimensiune n*n, elementele căruia sunt din intervalul 1 şi n, în care fiecare număr se întîlneşte
o singură dată în fiecare linie şi fiecare coloană, n10:
12345
51234
45123
34512
23451
61. Să se scrie un program de afişare a triunghiului lui Pascal (cel puţin 10 linii):
1
11
121
1331
14641
1 5 10 10 5 1
. . . .
62. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care verifică dacă tabloul este pătrat. În caz afirmativ:
a) să se verifice dacă suma elementelor aflate mai sus de diagonala principală este egală
cu suma elementelor aflate mai jos de aceasta;
b) să se precizeze cîte elemente din tablou se găsesc în intervalul (b, c) unde b şi c sunt
introduse de la tastatură;
c) să se numere zerourile de pe poziţiile i, j cu proprietatea i divide j.
63. Se consideră tabloul X[1..n, 1..m] de numere întregi, unde n, m20. Dacă suma elementelor de
pe diagonala principală este un număr pozitiv, atunci să se afişeze tabloul format din
elementele minime de pe linii, în caz contrar să se afişeze suma şi produsul elemntelor care se
află mai jos de diagonala secundară.
64. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Dacă elementele primei
linii sunt respective egale cu elementele ultimii linii, să se ordoneze crescător elementele
acestor linii, în caz contrar să se afişeze numărul elementelor pare din tablou.
65. Se consideră tabloul A[1..n, 1..m] de numere întregi pozitive, unde n, m20. De creat tablou
B[1..n, 1..m] unde în fiecare linie să fie înscrise unul după altul elementele pare din linia
corespunzătoare a tabloului A, celelalte locuri ale liniei se complectează cu zero.
66. Se consideră tabloul A[1..n, 1..m] de numere întregi, n20. Dacă elementele diagonalei
principale sunt respectiv egale cu elementele diagonalei secundare, atunci să se ordoneze
elementele diagonalei secundare, atunci să se ordoneze crescător elementele diagonalei
principale, în caz contrar săs se afişeze elementele minime de pe fiecare coloană.
67. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program
care numără cîte elemente maxime sunt în tablou şi să se înlocuiască fiecare element maxim cu
suma elementelor liniei pe care se află.
68. Se consideră tabloul T[1..n, 1..m] de numere întregi, unde n, m20. Să se scrie un program care
ordonează crescător elementele fiecărei linii.
69. Se consideră tabloul A[1..n, 1..m] de numere întregi pozitive, unde n, m20. Să se scrie un
program:
a) de calcul a produsului elementelor divizibile prin 5 şi situate pe diagonala princippală;
b) de calcul a sumei elementelor de pe “ perimetrul” tabloului;
c) de determinare a numărului de de elemente, valoarea cărora va fi egală cu valoarea
mximă din linia curentă.
70. Se consideră tabloul X[1..3, 1..4] de numere naturale. Să se scrie un program de aranjare a
elementelor acestui tablou în ordine crescătoare. De exemplu, decă se va introduce
5297
1528
2199
tabloul final va apărea cu următorul aspect:
1122
2557
8999

71. Se consideră declaraţiile:


Type Tab=Array[1..20] of Integer;
Drept=Array[1..20] of Tab;
Var A:drept;
X:Tab;
Să se scrie un program care:
a) înlocuieşte liniile cu număr impar din tabloul A cu elemente din tabloul X;
b) schimbă cu locul prima cu a doua linie, a treia linie cu a patra ş. a. m. d.
72. Se consideră declaraţiile:
Type Insula=(Gaiti, Cuba, Jamaica, Grenada, Barabados, Martinica);
Luna=(ian, feb, mar, apr, mai, iun, iul, aug, sep, oct, noiem, decem);
Var T:Array[insula, luna] of Real;
i:insula; l: luna;
Elementul T[x, y] reprezintă temperatura medie a lunii l pe insula i. Să se detemine în care lună (l)
şi pe care insulă (i) este cea mai joasă temperatură.

73. Se consideră declaraţiile:


Type Luna=(ianuarie, februarie, martie, aprilie, mai , iunie, iulie, august, septembrie, octombrie,
noiembrie, decembrie);
Zi=(luni, marţi, miercuri, joi, vineri, sîmbătă, duminică);
Calendar=Array[luna, 1..31] of Zi;
Var X: Calendar;
Să se completeze calendarul X cu zilele corespunzătoare ale săptămînii cu condiţia că anul 2000
este an bisect şi 1 ianuarie a fost sîmbătă, adică X[ian, 1]:=s; X[ian, 2]:=d; X[ian,3]:=1 ş. a. m. d.
74. Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n20. Să se scrie un program care
determină dacă acest tablou este un pătrat magic, adică sumele elementelor de pe linii, coloane
şi diagonale sunt egale.
75. Se consideră tabloul X[1..n, 1..m], unde n, m20, elementele căruia sunt egale numai 0. Să se
scrie un program care determină toate perechile (i, j), unde elementele din linia i sunt egale cu
0, iar cele din coloana j cu 1 (ci excepţia celor de pe diagonala principală).
76. Se consideră tabloul Note[1..n, 1..m], unde m20, unde au fost introduse notele medii pentru
elevii unei clase astfel încît:
-pe linia i sunt înscrise notele medii ale elevului cu numărul de ordine i;
-pe coloana j – mediile la un anumit obiect a tuturor elevilor din clasă.
Numele elvilor sunt înscrise într-un tablou unidimensional de tip string, în aşa fel ca numele
elevului i să corespundă mediilor de pe linia i. Să se scrie un program care:
a) calculează mediile generale ale unui elev;
b) afişează numele elevului ce au medii maxime;
c) afişează numele elevilor corigenţi (elevii care au cel puţin o notă sub 5);
d) afişează numele elevilor repetenţi (elevi care au cel puţin 3 note sub5);
e) calculează media generală a clasei.
CAPITOLUL VI
---------------------------------------------------------------------
Programecu şiruiri de caractere
Exemplul 1:
Să se scrie un program care citeşte un şir de caractere.
Un şir de caractere poate fi citit şi afişat în întregime sau caracter cu caracter.
Prima variantă a programului citeşte şi afişează şirul în întregime.

Program P65_1;
Uses Crt;
Var S: String;
Begin
ClrScr;
Write(‘Introdu un sir de caractere:’); Readln(S); {Se citeste sirul in intregime}
Write(‘A fost introdus sirul:’); Writeln(S); {Se afiseaza sirul in intregime}
Readln
End.

Introdu un şir de caractere: Se lucrează la calculator


A fost introdus şirul: Se lucrează la calculator

Varianta a doua a programului citeşte şi afişează şirul caracter cu caracter:

Program P65_2;
Uses Crt;
Var S: string; {sau S: Array[1..255] of Char}
i: Byte; {i – locul caracterul in sir}
Begin
ClrScr;
Write(‘Dati lungimea sirului:’); Readln(n)
For i:=1 To n Do Read(S[i]); {Se citeste sirul character cu caracter}
Write(‘Afost introdus sirul:’);
For i:=1 To n Do Write(S[i]); {Se afiseaza sirul caracter cu caracter}
Readln
End.

Daţi ungimea şirului: 25


Se lucrează la calculator
A fost introdus şirul: Se lucrează la calculator

Exemplul 2:
Se consideră şirul S. Să se scrie un program care numără apariţiile unui caracter arbitar x în şirul dat.

Algoritmul care numără apariţiţiile unui caracter arbitrar x într-un şir de caractere este asemănător cu
algoritmul de numărare a valorior numerice ditr-un tablou.
Program P66;
Uses Crt;
Var S: String;
k, i, L: Byte;
x: Char;
Begin
ClrScr;
Write(‘Introdu un sir de caractere:’); Readln(S);
Write(‘Introdu un caracter’); Readln(x);
k:=0 {Se initializeaza contorul}
For i:=1 To Leangth(S) Do {Se organizeaza repetarea}
If s[i]=x Then Inc(k); {Se numara aparitiile caracterului x}
Writeln(‘Sirul’’ ‘,S,’ ‘’contine’,k,’caractere’’ ‘,x,’ ‘’ ‘);
Readln
End.

Introdu un şir de caractere: Lucrul la calculator


Introdu un caracter: u
Şirul ”lucrul la calculator” conţine 3 caractere ”u”

Exemplul 3:
Se consideră un şir din cel mult 50 caractere. Să se scrie un program care înlocuieşte secvenţa de
caractere “sau” cu secvenţa “ori”.
Se compară fiecare trei caractere consecutive din şirul S cu secvenţa “sau”. Cînd se găseşte secvenţa
“sau” are loc înlocuirea ei cu secvenţa “ori”.
Program 67_1;
Uses Crt;
Var S: String[50]
i: Byte;
Begin
ClrScr;
Write(‘Dati un sir de caractere:’); Readln(S);
For i:=1 To Leaghtn(S)-2 Do
If (S[i]=’s’) And (S[i+1]=’a’) And (S[i+2]=’u’) Then
Begin
S[i]:=’o’;
S[i+1]:=’r’;
S[i+2]:=’i’
End;
Write(‘Sirul obtinut este:’,S);
Readln
End.
Daţi un şir de caractere: sau azi, sau mîine
Şirul obţinut este: ori azi, ori mîine

Varianta a doua a programului va utiliza funcţii şi proceduri standart definite pentru tipul şirurui de
caractere. Şi anume:
Copy(S, poz, lung) – funcţie care retumează subşirul din S, începînd cu poziţia poz de lungime lung;
Delete(S, poz, lung) – procedură care şterge din şirul S subşirul de la poziţia poz de lungime lung;
Insert(S1, S2, poz) – procedură care inserează şirul S1 în şirul S2 începînd cu poziţi poz.
Program P67_2;
Uses Crt;
Var S: String;
i: Byte;
Begin
ClrScr;
Write(‘Dati un sir de caractere:’); Readln(S);
For i:=1 To Length(S)-2 Do
If Copy(S, i, 3)=’sau’ Then
{Se copie cite 3 caractere si se verifica daca coincide cu secventa “sau”}
Begin
Delete(S, i, 3); {Se sterge secventa “sau”}
Insert(‘ori’, S,i) {Se insereaza secvente “ori”}
End;
Write(‘Sirul obtinut este:’);
Writeln(S);
Readln
End.
Daţi un şir de caractere: sau azi, sau mîine
Şirul obţinut este: ori azi, ori mîine

Exemplul 4:
Se consideră cuvîntul X. Să se scrie un program care inversează acest cuvînt. Rezultatul se va obţine
într-o variabilă nouă Y de tip string, care se iniţializează cu valoarea textului vid.
Se ia cîte o literă din cuvîntul X şi se adaugă de fiecare dată la începutul cuvîntului Y (adică înaintea
literei adăugate interior).
Program P68;
Uses Crt;
Var X, Y: String;
i: Byte;
Begin
ClrScr;
Write(‘Introdu un cuvint:’);Readln(X);
Y:=’’; {Initializeaza cuvintul invers}
For i:=1 To Leangth(X) Do
Y:=X[i]+Y; {Se formeaza cuvintul invers}
Write(‘Cuvintul inversat:’,Y);
Readln
End.
Introdu un cuvînt: manual
Cuvîntul inversat: launam

În principiu, inversarea unui cuvînt poate fi realizată şi prin metoda realizată anterior la inversarea
unui tablou unidimensional.

Exemplul 5:
Se consideră un cuvînt. Să se scrie un program pentru suprimarea literei “a” din acest cuvînt, fără a
utiliza o altă variabilă.
Se organizează parcurgerea cuvîntului X prin intermediul instrucţiunii While. Cînd se găseşte un
caracter egal cu “a” se şterge, în caz conrtrar se trece la o nouă poziţie în cuvîntul X. Trebuie de
subliniat faptul că lungimea cuvîntului se calculează înainte de fiecare execuţie a ciclului.
Program P69;
Uses Crt;
Var X: String;
i: Byte;
Begin
ClrScr;
Write(‘Introdu un cuvint:’); Readln(X);
i:=1;
While i<=Length(X) Do
If X[i]=’a’ Then Delete(X, i, 1) {Se sterge litera”a”}
Else i:=i+1; {Se trece la urmatoarea pozitie}
Writeln(‘Cuvintul fara litera “a” este:’,X);
Readln
End.
Introdu un cuvînt: maaaaaaaaaaaaaaacaara
Cuvîntul fără litera “a” este: mcr

Exemplul 6:
Se consideră cuvîntul X. Să se scrie un program care formează cuvîntul Y din literele cuvîntului X,
diferite de “a”.
Cuvîntul Y se iniţializează cu valoarea textului vid. În continuare se organizează parcurgerea
cuvîntului X, formînd cuvîntul Y din literele diferite de “a”. Cuvîntul Z se iniţializează cu valuare
textului vid .În continuare se organizeaza parcurgera cuvîntului X,formînd cuvîntul Y din litere
diferite de “a” .

Program P70;
Var X Y:String;
I:Byte ;
Begin
Write (‘Introdu un cuvint;’);Readln (X);
Y:=’’; {Initializarea cuvintului Y}
For i :=1To length(X) Do {Se aduga litera diferita de ‘’a’’ a cuvintuluiY}
Writeln(‘Cuvintul’’ ‘,X,’ ‘’fara litera ‘’a’’este’,Y ),
Readln
End.

Introdu un cuvint abraaaaaacadaabra


Cuvintul ‘’abraaaaacaadabrafara litera’’a’’este:brcdbr

Exemolu 7:
Se considera un şir de caractere format din litere mici şi mari al alfabetului latin .Să se scrie un
program care transformă literele mari în litere mici.
Se ştie că funcţia UpCase (C:char) transforma literele mici în litere mari,lăsind neschimbate
caracterele care nu sînt litere mici .Pentru conversia inversăvor fi folosite functiile Ord şi Chr:
If (x[i]>=’A’) and (x[i]<=’Z’) then x[i]:=chr(ord(x[i]+32), unde 32 este diferenţa de cod ASCII între
caracterul literă mică şi caracterul literă mare corespunzător
32=ord(‘a’)-ord(‘A’)=ord(‘b’)-ord(‘B’)=…
Program P71;
Uses Crt;
Var x: String;
i: Byte;
Begin
ClrScr;
Write(‘Dati un sir de caractere:’); Readln(x);
Write(‘Dupa transformare’);
For i:=1 To Leaghtn(x) Do
If (x[i]>=’A’) And (x[i]<=’Z’) Then x[i]:=chr(ord(x[i]+32;
{Transforma litera mare in litera mica}
Write(x);
Readln
End.
Daţi un şir de caractere: sau azi, sau mîine
Şirul obţinut este: ori azi, ori mîine

Exemolu 8:
Se consideră Tabloul A format din 10 cuvinte. Să se scrie un program în cadrul căruia se inversează
fiecare cuvînt.
Algoritmul este următorul: se ia câte un cuvânt din tabloul A; se inversează; apoi se depune înapoi în
tablou pe locul corespunzător.
Programul va utiliza o constantă n=10, care indică numărul de cuvinte în tabloul A. Dacă se doreşte
de a lucra cu un alt număr de cuvinte, atunci va trebui schimbată valoarea acesteia în program.
Program P72;
Uses Crt;
Const n=10;
Var a:array[1..n] of String;
i,j:integer;
x,inv:string;
Begin
ClrScr;
Write(‘Introdu cuvintele’);
For i:=1 To n Do read(a[i]); writeln;
For i:=1 To n Do
Begin
X:=a[i];
Inv:=’’;
For j:=1 To length(x) Do inv:=x[i]+inv;
A[i]:=inv;
End;
Write(‘Tabloul cu cuvintele inversate: ’);
For i:=1 to n do write(a[i],’ ‘);
Readln
End.

Introdu cuvintele: Andrei Sergiu Marin Ion Elena Mihai Sanda Leon Corneliu Tatiana
Tabloul cu cuvintele inversate: ierdnA uigerS niraM noI anelE iahiM noel uilenroC anaitaT

Exemolu 9:
Se consideră un număr natural N. Să se scrie un program care formează un alt număr K ce se
deosebeşte de n prin faptul că nu conţie cifrele 2 şi 5, păstrînd consecutivitatea celorlalte cifre. De
exemplu, dacă N=53206402 să se obţină numărul K=30640.
Problema poate fi rezolvată, transformînd numărul N într-un şir. Acest lucru se realizează prin
intermediul procedurii Str (în principiu, numărul N poate fi citit şi ca un şir). Din şir uşor pot fi omise
cifrele respective. După aceasta are loc transformarea inversă prin intermediul procedurii Val.
Program P73;
Const n=10;
Var N,K:longint;
I:byte;c:integer; s:string;
Begin
Write(‘Introdu numarul N=’); Readln(N);
For i:=1 To n Do read(a[i]); writeln;
Str(N,S); i:=1;
While i<=length(s) do
If (s[i]=’2’ or (s[i]=’5’) then delete(s,i,1)
Else i:=i+1;
Val(s,k,c); {se transforma sirul in numar}
Write(‘Numarul obtinut dupa inlaturarea cifrelor “2” si “5” ‘);
Writeln(‘este K=’, k);
Readln
End.

Introdu cuvintele: Andrei Sergiu Marin Ion Elena Mihai Sanda Leon Corneliu Tatiana
Tabloul cu cuvintele inversate: ierdnA uigerS niraM noI anelE iahiM noel uilenroC anaitaT

Se observă, că procedura Val are trei parametri: primii doi sunt cunoscuţi,al treilea parametru este de
tip întrg şi ia valoarea zero, cînd şirul s poate fi transformat în într-un număr, în caz contrar primeşte o
valoare egală cu poziţia unde se opreşte transformarea.

Exemolu 10:
Se consideră un şir de caractere care se termină cu simbolul #. Să se determine fregvenţa (numărul
de apariţii) pentru toate literele mici din text. Se admit litere din alfabetul latin.
Programul creează un tablou X de tip întreg, indecele lui fiind o literă mică, numărul de apariţii a
cărei trebuie de calculate. Acest tablou se iniţializează cu zerouri, iar în continuare locurile ce
corespund literelor din textul dat for fi completate cu valorle respective. După ce se termină
parcurgerea textului, se aleg valorile nenule din vectorul X şi se afişează pe ecran.
Program P74;
Const n=10;
Var x:array[‘a’..’z’] of integer;
i:byte; c:char; s:string;
Begin
Write(‘Introdu textul’); Readln(S);
For c:=’a’ To ‘z’ Do x[c]:=0; i:=1;
Repeat
C:=s[i]; If (c>=’a’) and (c<=’z’) then inc(x[c]);
i:=i+1;
until c=’#’;
for c:=’a’ to ‘z’ do if x[c]>0 then writeln(‘ “ ’,c,’ “ apare de ‘,x[c],’ ori’);
Readln
End.
Introdu textul> caietecartemapa#
“a” apare de 4 ori
“c” apare de 2 ori
“e” apare de 3 ori
“i” apare de 1 ori
“m” apare de 1 ori
“p” apare de 1 ori
“r” apare de 1 ori
“t” apare de 2 ori
Programe Propuse
1. Să se scrie u program care citeşte u şit de caractere şi afişează lungimea lui.
2. Se consideră u şir de caractere. Să se scrie un program care:
a) calculează numărul sumar de apariţii ale caracterelor ”a” şi ”b”;
b) înlocuieşte toate vocalele prin litera ”w”;
c) înlocuieşte caracterul ”a” cu caracterul ”b”;
d) înlocuieşte caracterul ”a” cu caracterul ”A” şi caracterul ”b” cu caracterul ”B”;
e) înlocuieşte toate literele ”a” cu ”b” şi invers;
f) suprimă cifrele;
g) suprimă vocalele;
h) numără vocalele;
i) suprimă consoanele;
j) numără consoanele;
3. Se consideră un cuvînt, care constă numai din litere mici ale alfabetului latin. Să se scrie
programe care:
a) numără apariţiile silabei ”re”.
b) înlocuieşte secvenţa ”do” cu ”re”
c) dublează fiecare literă. Exemplu: ”program” să se obţină ”ppooggrraamm”
d) înlocuieşte litera ”b” cu segvenţa ”cu”.
4. Să se scrie un program care afişează ”Da” sau ”Nu”, în dependenţă de faptul dacă o literă
arbitrară x se conţine sau nu în cuvîntul da y.
5. Se consideră cuvîntul X. Să se scrie un program care afişează caracterele acestui cuvînt în
ordine inversă.
6. Se consideră o propoziţie formată din cuvintele separate prin spaţiu. Propoziţia se termină cu
punct. Să se scrie un program cîte cuvinte are propoziţia.
7. Se citeşte un număr din cinci cifre. Să se scrie un program care afişează numărul format după
eliminarea cifrei din mijloc.
8. Se consideră un şir format din cel mult 80 de caractere. Să se scrie un program care
înlocuieşte o literă dată prin altă literă dată prin altă literă dată în tot şirul.
9. Se consideră un cuvînt. Să se scrie u program care determină dacă cuvîntul dat este
palindrom. Se numeşte palindrom cuvîntul care se citeşte la fel de la stînga la dreapta şi de la
dreapta la stînga.De exemplu: Capac, cayac, cojoc, potop, apa etc.
10. Se consideră un şir de caractere format din cel mult 80 de litere. Să se scrie un program care
codifică acest text după regula: fiecare literă se înlocuieşte cu numărul ei de ordine din
alfabet. De exemplu pentru cuvîntul ”ABBCL” se va obţine codul 0102020312.
11. Se consideră un şir de caractere. Să se scrie un program care decodifică şirul ce a fost
codificat, înlocuindu-se fiecare literă cu numărul ei de ordine din alfabet (număr din două
cifre). De exemplu, pentru codul 010102020312 se va obţine cuvîntul ”ABBCL”.
12. Se consideră cuvîntul X. Să se scrie un program care verifică dacă cuvîntul dat conţine mai
multe vocale decît consoane.
13. Şirul S conţine numele şi prenumele unei presoane. Să se scrie un program care modifică
şirul dat, lăsînd numai numele şi iniţiala prenumelui. De exmplu: Frunze Natalia Vasile-
Frunze N. V.
14. Se consideră o propoziţie formată din cuvinte separate prin spaţiu. Să se scrie un program
care determină:
a) cel mai lung cuvînt
b) cel mai scurt cuvînt
15. Se consideră un şir de caractere format din trei cuvinte. Să se scrie u program care schimbă
ordinea cuvintelor în aşa fel încît primul cuvînt să fie pe al treilea loc, cel de pe locul doi-pe
priml loc, iar al treilea cuvînt-pe locul doi. De exeplu: azi este frig-este frig azi.
16. Se consideră u şir de caractere, în care sunt comise greşeli: în loc de litera ”O” care urmează
după litera ”A” e scris litera ”U”. Să se scrie un program care corectează acest şir.
17. Se consideră cuvîntul X format din litere ale alfabetului latin. Să se scrie un program care
calculează suma numerelor de ordine a literelor din cuvînt. De exemplu, pentru cuvîntul
”Lac”, suma căutată este 12+1+3.
18. Se consideră cuvîntul X. Să se scrie un program care afişează TRUE, dacă cuvîntul dat
conţine mai multe litere ”a” decît ”b”, în caz contrar FALSE.
19. Se consideră tabloul X[1..n], în care au fost introduse numele a n persoane (n<=50). Să se
scrie un program caare afişează elementele tabloului în ordinea alfabetică în funcţie de prima
literă.
20. Se consideră un cvînt de lungimea n, n<=10. Să se scrie un program care crează tabloul
A[1..n], unde primul element să devină egal cu poziţia pe care o ocupă prima literă a
cuvîntului x în alfabetul latin, elementul al doilea-cu poziţia literei a doua etc. De exemplu,
pentru cuvîntul ”Caiet” se obţine următorul tabel A[1]=3, A[2]=1, A[3]=9, A[4]=5, A[5]=20.
21. Elementele tabloului A[1..n], n<=50 reprezintă un cuvînt codificat A[1] este egal cu poziţia
în alfabetul latin a primei litere din cuvînt, A[2]- cu poziţia literei etc. Să se scrie un program
de decodificare, adică de obţinere a cuvîntului iniţial.
22. Se consideră un tablou cu 10 nume de familii. Să se scrie un program care afişează pe ecran
numele de familie care începe cu o literă introdusă de la tastatură. Dacă nu există în tablou
aşa nume de familie, să se afişeze mesajul respectiv.
23. Se consideră o propoziţie fomată din cuvinte separate prin spaţiu. Să se scrie un program care
afişează toate cuvintele ce conţin două caractere.
24. Se consideră o propoziţie P formată din cuvinte separate prin spaţii. Să se scrie un program
care înlocuieşte în această propoziţie spaţiile consecutive prin unul.
25. se consideră o propoziţie P formată din mai multe cuvinte separate prin spaţii. Să se scire un
porgram care ar înlocui:
a) cuvîntul ”unu” prin cifra 1;
b) cifra 1 prin cuvîntul ”unu”
c) litera ”g” prin combinaţia de litere ”dor”.
26. Se consideră un şir de caractere. Să se scrie un program care determină numărul de ordine al
primei cifre din acest şir. De exemplu pentru şirul ”NUM=31” răspunsul va fi 5.
27. Să se scrie un program care în dependenţă de denumirea lunii afişează anotimpul căruia îi
aparţine.
28. Să se scrie un program care în dependenţă de denumirea lunii afişează denumirea lunilor
precedente şi următoare, dacă ele există.
29. Să se scrie un program care în dependenţă de denumirea anotimpului afişează denumirile
lunilor din care el este alcătuit.
30. Să se scrie un program care introduce data în formatul dd.ll.aa şi afişează denumirea lunii cu
literele şi anul scris cu patru cifre. De exemplu, dacă s-a introdus 27.11.99 să se obţină 27
noiembrie 1999 (se operează în limita secolului XX).
31. Se consideră o propoziţie formată din cuvinte separate prin cel puţin un spaţiu. Să se scrie un
program care afişează cuvintele propoziţiei într-o coloană.
32. Se consideră două şiruri de caractere X şi Y. Să se scrie un program care afişează ”Da” sau
”Nu” în dependenţă de faptul dacă şirul X este subşir pentru Y.
33. Elevi codifică scrisorile lor (fiecare scrisoare reprezintă un şir de caractere) scriind cuvintele
invers. Să se scrie u program care codifică şi decodifică scrisorile.
34. Se consideră un şi de caractere. Să se scrie un program care determină cel mai mare număr de
litere ”a”, care urmează una după alta în şirul dat.
35. Se consideră o propoziţie formată din cuvinte separate printr-un singur spaţiu. Să se scrie un
program care determină:
a) lungimea celui mai lung cuvînt;
b) lungimea celui mai scurt cuvînt;
36. Se consideră un şir de caractere format din cuvintele separate printr-un spaţiu. Să se scrie un
program care determină cu ce literă încep cele mai multe cuvinte în acest şir.
37. Se consideră u şir de caractere care se termină cu simbolul #. Să se afişeze, în ordinea
apariţiei, numai cifrele şi literele care apar în şir. De asemenea, să se afişeze şi numărul de
apariţii ale fiecărei cifre şi litere.
38. Se consideră şirul S format numai din litere mici ale alfabetului latin. Să se scrie un program
care afişează:
a) literele acestui şir în ordinea alfabetică. De exemplu, pentru şirul ”abracadabra” se va
afişa: aaaaabbcdrr;
b) mai întîi vocalele, apoi consoanele.
c) Mai întîi vocalele în ordinea alfabetică, apoi consoanele în ordine alfabetică.
39. Se consideră două şiruri de caractere. Să se scrie u program care compară aceste şiruri fără a
ţine cont de diferenţa dintre literele mari şi mici.
40. Se consideră o propoziţie ce se termină cu punct. Să se scrie un program care modifică
această propoziţie după cum cere stilul englez. Title: prima literă din fiecare cuvînt să fie
literă mare, iar celelalte litere mici.
41. Se consideră u şir de caractere format din cîteva propoziţii. Fiecare propoziţie se termină cu
punct. Să se scrie un program care modifică fiecare propoziţie după cum cere stilul englez.
Sentence: toate literele dintr-o propoziţie trebuie să fie mici, cu excepţia primei litere care
trebuie să fie literă mare.
42. Să se scrie un program care numără apariţiile unui cuvînt într-o propoziţie. Cuvîntul şi
propoziţia se citesc de la tastatură.
43. Se consideră un şir d caractere S, ce reprezintă o expresie aritmetică cu un singur operator
binar (operatori binari pot fi +,-,*,/). Să se scrie un program care afişează rezultatul expresiei.
De exemplu, dacă S=’1234+52’, se va afişa 176.
44. Se introduce o expresie aritmetică care conţine paranteze. Să se scrie u program care
determină dacă numărul parantezelor deschise coincid cu numărul de paranteze închise.
45. Se consideră un şir de caractere format din cîteva propoziţii. Fiecare propoziţie se termină cu
punct. Să se scrie un program care selectează cea mai lungă propoziţie din acest şir.
46. Se consideră o propoziţie formată din cuvinte separate prin spaţiu. Să se scrie un program
care afişează cuvintele:
a) care începe cu o literă introdusă de la tastatură.
b) Care începe cu o vocală.
c) Care se termină cu o vocală.
d) În ordinea alfabetică conform primei litere.
47. Se consideră cuvîntul X format din litere ale alfabetului latin. Să se scrie un program care:
a) afişează literele dinstincte ce se conţin în cuvînt.
b) Numără literele dinstincte din cuvînt.
c) Afişează literele ce nu se conţin în cuvînt.
CAPITOLUL VII
---------------------------------------------------------------------
Programe cu mulţimi
Exemplul 1:
Să se scrie un program care introduce de la tastatură două mulţimi de numere pozitive din două cifre
(numărul de elemente pentru fiecare mulţime se citeşte de la tastatură) şi afişează reuniunea acestor
mulţimi.
Se ştie că elementele unei mulţimi nu pot fi citite în mod direct de la tastatură. Pentru a
realiza acest lucru , se va folosi o variabilă auxiliară (în cazul nostru – a). După citirea
celor două mulţimi se calculează reuniunea lor (cu operatorul “+”).
Mulţimile, de asemenea, nu pot fi afişate în mod corect. Acest lucru se realizează prin
Intermediul unui ciclu se foloseşte relaţia In (ce desemnează apartenenţa).
Program P75;
Var i, n, a : 0..99;
S, R, M: Set of Byte;
Begin
Write(‘Cite numere va avea prima multime? n=’);Readln(n);
{Se citeste nr. de elem. pentru prima multime}
M:=[]; {Se initializeaza multimea M}
For i:=1 To n Do
Begin Readln(a); {Se citeste numerele}
M:=M+[a] {Se formeaza multimea M}
End;
Write(‘Cite numere va avea multimea a doua? n=’);Readln(n);
{Se citeste nr. de elem. pentru multimeae a doua}
R:=[] {Se initializeaza multimea R}
For i:=1 To n Do
Begin Readln(a); {Se citesc numerele}
R:=R+[a]; {Se formeaza multimea R}
End;
S:=M+R; {Se calculeaza reuniunea multimilor M si R}
Write(‘Reuniunea multimilor M si R este:’);
For i:=10 To 99 Do
If i ln S Then Write(i,’ ‘); {Se afiseaza elementul multimii S}
Readln
End.

Cîte numere va avea prima mulţime? n=5


13 70 55 22 13
Cîte numere va avea mulţimea a doua? n=3
70 13 22
Reuniunea mulţimilor M şi R este: 13 22 55 70

Exemplul 2:
Se consideră cuvîntul X format din litere majuscule ale alfabetului latin. Să se scrie un program care
determină literele ce apar o singură dată şi literele ce apar de mai multe ori în cuvîntul dat.
Se verifică dacă litera X[i] aparţine mulţimii Odat. Dacă litera aparţine mulţimii Odat
atunci ea se adaugă la mulţimea Mult, în caz contrar se adaugă la mulţimea Odat.
După terminarea parcurgerii în mulţimea Odat sunt litere care sunt şi în mulţimea Mult.
Se efectuează scăderea pentru a lăsa în mulţimea Odat numai literele ce se conţin o
singură dată.
Program P76;
Var X: String;
Odat, Mult : Set of Char; j: Char; i: Integer;
Begin
Write(‘Introdu cuvintul:’);Readln(X); {Se citeste cuvintul}
Odat:=[]; {Se initializeaza multimea Odat}
Mult:=[]; {Se initializeaza multimea Mult}
For i:=1 To Length(X) Do
If X[i] In Odat Then Mult: =Mult+[X[i]]
Else Odat: =Odat+[X[i]];
Odat:=Odat-Mult; Write(‘Literele ce apar o singura data:’);
For j:=’A’ To ’Z’ Do
If j ln Odat Then Write(j,’’); {Se afiseaza multimea Odat}
WriteLn; Write(‘Literele ce apar de mai multe ori:’);
For j:=’A’ To ‘Z’ Do If j ln Mult Then Write(j,’’); {Se afiseaza multimea Mult}
Readln
End.

Introdu cuvîntul: ABRACADABRA


Literele ce apar o singură dată: C D
Literele ce apar de mai multe ori: A B R

Exemplul 3:
De la tastatură se introduc numere pozitive din două cifre. Introducerea va lua sfîrşit la tastarea
numărului zero. Să se scrie un program care extrage în ordine crescînd numerele ce apar în şirul de
intrare doar o singură dată şi numărul acestora.
Program P77;
Var k, i, N : 1..99;
Odat, Mult : Set of Byte;
Begin
Odat:=[];Mult:=[]; {Initializarea multimilor}
Readln(N); {Se citeste primul numar}
While N<>0 Do {Cit timp numarul este pozitiv}
Begin If N ln Odat Then Mult:= Mult+[N]
Else Odat:=Odat+[N];
Readln(N) {Se citeste numarul pozitiv}
End;
Odat:=Odat-Milt; k:=0; {Se initializeaza contorul}
For i:=10 To 99 Do
If i ln Odat Then k:=k+1;
Write(‘O singura data in sirul de intrare apar ‘,k,’numere:[‘);
For i:=10 To 99 Do
If i ln Odat Then Write(i,’’); Write(‘]’);
Readln
End.

14 22 11 55 11 11 22 14 44 0
O singură dată în şirul de intrare apar 2 numere: [44 55]

Exemplul 3:
Se consideră tablourile A[1..n] şi B[1.m] formate din numere naturale din două cifre, unde n, m100.
Să se scrie un program care afişează în ordine crescătoare mulţimea elementelor distincte din ambele
tablouri A şi B. De exemplu, pentru
A: 12 26 55 33 55 şi
B: 44 88 33 55
Să se obţină: 12 26 33 44 55 88
După citirea celor două tablouri A şi B, mulţimea C se iniţializează cu elementele primului tablou A.
Apoi se parcurg elementele celuilalt tablou B[i] nu face parte din mulţimea C, atunci acest element se
adaugă la mulţime.
Program P78;
Const nmax=100;
Var A, B:Array[1..nmax] of Byte;
i, n, m : 1..nmax; C: Set of Byte;
Begin
Write(‘Cite elemente are primul tablou? n=’); Readln(n);
{Se citeste nr. de elem. pentru primul tablou}
Write(‘Dati’,n,’elemente pentru tabloul A:’);
For i:=1 To n Do Read(A[i]); {Se citesc elementele primului tablou}
Write(‘Cite elemente are al doilea tablou? m=’);
Readln(m); {Se citeste nr. de elem. pentru al doilea tablou}
Write(‘Dati’,m,’elemente pentru tabloul B:’);
For i:=1 To m Do Read(B[i]); {Se citesc elementele tabloului al doilea}
C:=[]; {Se initializeaza multimea C}
For i:=1 To n Do C:=C+[A[i] {Elementele din A se depun in multimea C}
For i:=1 To m Do
If Not(B[i] ln C) Then C:=C+[B[i]];
Write(‘Elementele distincte din ambele tablouri:’);
For i:=10 To 99 Do If i ln C Then Write(i,’’); {Se afiseaza elem. multimii C}
Readln
End.

Cîte elemente are primul tablou? n=5


Daţi 5 elemente pentru tabloul A: 12 26 55 33 55
Cîte elementele are al doilea tablou? m=4
Daţi 4 elemente pentru tabloul B: 44 88 33 55
Elementele distincte din ambele tablouri: 12 26 33 44 55 88

Exemplul 5:
Se consideră numărul natural N (format din cel mult 9 cifre). Să se scrie un program care formează
cel mai mic număr din cifrele distincte ale lui N.
Program P79;
Var x, N: LongInt;
Cifre:Set of 0..9;
i,k:integer;
Begin
Write (‘Introdu numarul N=’);Readln(N);
x:=N; {Se pastreaza valuarea initiala a numarului N}
Cifre:=[] {Initializarea multimii}
While x<>0 Do
Begin
k:=x Mod 10; {Se scoate cite o cifra de la inceput}
Cifre:=Cifre+[k]; {Se aduna cifra la multime}
x:=x Div 10; {se modifica numarul x}
End;
For i:=1To 9 Do
If I ln cifre Then x:=*10+I; {Se formeaza rezultatul}
Writeln(Cel m.mic nr. cu cifre disticte ale num.’,N,’este ‘,x)
End.
Indtrotu numarul n=73354282
Cel mai mic numar cu cifre distincte ale numarului 73354282 este234578

O altă soluţie ar fi citire numărului N ca un şir de caractere.


Programe Propuse
1. Să se scrie un program care introduce de la tastatură două mulţimi de numere din intervalu l0..9
(Numărul de elemente pentru fiecare mulţime se citeşte de la tastatura) şi afişează intersecţia şi diferenţa
acestor mulţimi .
2. Să se scrie un program care introduce de la tastatura doua mulţimi de numere din intervalul l0..99 (numărul
de elemente pentru fiecare mulţime se citeşte de la tastatura) verifică dacă aceste acţiuni sunt egale.
3. Să se scrie un program care introduce de la tastatură doua mulţimi A şi B cu numere din intervalul0..99
(numărul de elemente pentru fiecare mulţime se introduce de la tastatură) şi verifică dacă mulţimea A este
inclusă în mulţimea B.
4. Se consideră şirul de caractere S format de litere al alfabetului latin. Să se scrie un program care determină
literele distincte din S şi le extrage în ordine alfabetică.
5. Se consideră şirul de caractere S format din litere ale alfabetului latin.Să se scrie un program care determină
numărul total de caractere ‘*’,’-’,’+’ în S.
6. Se consideră un cuvînt format din litere mici ale alfabetului latin.Să se determine numărul de vocale din
acest cuvînt şi să se afişese vocalele în ordine alfabetică inversă.
7. Se consideră şirul de caractere S format din litere ale alfabetului latin.Să se scrie un program care calculează
numărul de vocale ,numărul de cifre, numărul de consoane, şi numărul de semne speciale din acest şir.
8. De la tastatură se introduc numere întregi pozitive pînă la intoducerea numărului 0.Să se afişeze mulţimea
numerelor formate din doua cifre. De exeplu dacă s-a introdus 5 663 90 2 11 9 104 25 26 să se afişeze
11 25 66 90.
9. De la tastatura se introduc n(n<125) numere întregi din diapozonul 1..255. Să se formeze o mulţime din
numerele pare din şirul de intrare.
10. Se consideră cuvîntul X format din litere mici ale alfabetului latin .Să se afişeze literele ce apar o singură
dată în cuvînt şi numărul acestora .
11. Se consideră mulţime de numere naturale din intervalul 1..255. Să se scrie un program care verifică dacă un
element introdus de la tastatură aparţine şirului de numere date.
12. De la tastatura se introduc două şiruri de caractere. Să se verifice dacă aceste şiruri au caractere distincte.De
exemplu sirurile “carte”si “caiet”au caractere distincte ,iar sirurile “mapa”si”paam”au aceleasi caractere .
13. Se consideră o propoziţie formată din cuvinte separate pri cel puţin un spaţiu. Să se scrie un program care
determină literele distincte din fiecare cuvînt.
14. Se considera cuvîntul X format din literele ale alfabetului latin. Să se scrie un program care:
a) afisează literele distincte ce se conţin în cuvînt;
b) numără literele distincte din cuvînt;
c) afişează literele ce nu se conţin în cuvînt.
15. Se consideră un şir de caractere care se termina cu simbolul #. Să se afişeze, în ordine apariţiei, numai
cifrele si literele care apar în şir. De asemenea, să se afişeze şi numărul de apraţii ale fiecărei cifre şi litere.
16. Se considera declaraţia: Var X, Z, Y: Set of 8..22. Să se scrie un program care atribuie variabilei X
mulţimea tuturor numerelor întregi din intervalul 8..22, variabilei Y – mulţimea numerelor prime din acest
interval, iar variabilei Z – mulţimea tuturor numerelor compuse din acelaşi interval.
17. Se consideră declaraţia: Var A, B: Set of Char; X: Char; Să se scrie un program care atribuie varibilei B
mulţimea obţinută din A prin:
a) adăugarea elementeului X;
b) exculderea elementului X.
18. Se consideră cuvîntul X format din litere mici ale alfabetului latin. Să se afişeze în ordine alfabeticaă
vocalele apoi consoanele. De exemplu, pentru cuvintul “matematica” sa se afişeze: aeicmtmtc.
19. Se consideră cuvîntul X format din litere mici ale alfabetului latin. Să se afişeze în ordine alfabetică
vocalele distincte. De exemplu, pentru cuvîntul “matematica” să se afişeze: aeicmt.
20. Se consideră cuvîntul X format din litere ale alfabetului latin. Să se scrie un program care verifică dacă
acest cuvînt conţine cifre.
21. Se consideră două şiruri de caractere. Să se scrie un program care afisează:
a) caracterele ce apar în ambele şirurui;
b) caracterele ce apar în primul şir şi nu apar în şirul al doilea;
c) caracterele ce se întîlnesc cel puţin în unul din şiruri.
24. Un ceas care sună la ore fixe poate fi potrivit să sune la oricare dintre cele 24 de ore din zi (numerotate de la
0 la 23). N persoane, fară să ştie una de cealalaltă, potrivesc ceasul să sune la cîte o ora. Dindu-se orele la
care a fost pus să sune ceasul (ore nu neaparăt diferite), să se scrie un program care afiseaza în ordine
crescătoare orele la care va suna ceasul şi să se stabilească cel mai lung interval de liniste datorat ceasului
potrivit. De exemplu, dacă se fac 7 reglaje la orele: 7, 22, 11, 2, 20, 5, 11, 7, se va afişa şirul: 2, 5, 7, 11, 20,
22 şi se va calcula intervalul maxim de liniste=9 ore.
CAPITOLUL VIII
---------------------------------------------------------------------
Programe cu articole (record)
Exemplul 1:
Se consideră următoarele date: prenumele (string), numele (string) şi nota medie (un număr real din
intervalul 1..10) a n elevi (se presupune că elevii au medii diferite). Să se scrie un program care citeşte
de latastatură datele despre elevi şi afişează datele elevului cu nota medie mai mare.
Se alcătuieşte o structură de tip Record cu cîmpurile respective; se citesc datele de intrare, se
compară mediile elevilor şi se determină elevul cu cea mai bună medie. Se afişează prenumele şi
numele celui mai bun elev.
Program P80_1;
Uses Crt;
Type ELEV = Record
Prenume: String;
Nume: String;
NotaMedie: Real;
End;
Var Lista: Array[1..30] of ELEV;
E: ELEV;
i: Integer;
n: 1..30;
Begin
ClrScr;
Write(‘Introdu numarul de elevi:’); Readln(n);
For i:=1 To n Do
Begin
Writeln(‘Introdu datele elevului’,i);
Write(‘Prenumele:’); Readln(Lista[i].Prenume);
Write(‘Numele:’); Readln(Lista[i].Nume);
Write(‘notamedie:’); Readln(Lista[i].NotaMedie)
End;
E. NotaMedie:=0;
For i:=1 To n Do
If Lista[i].NotaMedie > E.NotaMedie Then E:= Lista[i];
Write(‘Cel mai bun elev este:’);
Writeln(E.Prenume,’’, E.Nume,’’, E.NotaMedie:7:2);
Readln
End.
Introdu numărul de elevi 3
Introdu datele elevului 1
Prenumele: Ion
Numele: Fusu
Nota medie: 8.7
Introdu datele elevului 2
Prenumele: Ana
Numele: Griciuc
Nota medie: 9.6
Introdu datele elevului 3
Prenumele: Corina
Numele: Anton
Nota medie: 8.5
Cel mai bun elev este: Ana Griciuc 9.6

După cum se observă din programul anterior, este destul de incomodă repetare continuă a numelui
Variabilei de tip înregistrare o dată cu numele cîmpurilor (în special, în cazul înregistrărilor cu multe
cîmpuri). Pentru a simplifica accesul la cîmpurile unei înregistrări, în limbajul Pascal poate fi
utilizată instrucţiunea With.

Program P80_2;
Uses Crt;
Type ELEV = Record
Prenume: String;
Nume: String;
NotaMedie: Real;
End;
Var Lista: array[1..30] of ELEV;
E: ELEV;
i: Integer;
n: 1..30;
Begin
ClrScr;
Write(‘Introdu numarul de elevi:’); Readln(n);
For i:=1 To n Do
With Lista[i] Do
Begin
Writeln(‘Introdu datele elevului’, i);
Write(‘Prenumele:’); Readln(Prenume);
Write(‘Numele:’); Readln(Nume);
Write(‘Nota medie:’); Readln(NotaMedie)
End;
E.NotaMedie:=0
For i:=1 To n Do
If Lista[i].NotaMedie > E.NotaMedie Then E:=Lista[i];
Write(‘Cel mai bun elev este:’);
Writeln(E.Prenume,’’,E.Nume,’’,E.NotaMedie:7:2);
Readln
End.

Introdu numărul de elevi 3


Introdu datele elevului 1
Prenumele: Ion
Numele: Fusu
Nota medie: 8.7
Introdu datele elevului 2
Prenumele: Ana
Numele: Griciuc
Nota medie: 9.6
Introdu datele elevului 3
Prenumele: Corina
Numele: Anton
Nota medie: 8.5
Cel mai bun elev este: Ana Griciuc 9.6

Exemplul 2:
Se consideră numele a N persoane şi cîştigul lor pentru o lună. Să se scrie un program care calculează
salariul fiecărei persoane fără impozite. Impozitele se calculează după cum urmează.
0 – 100lei - 0%
100,1 – 399,99 lei - 13%
400 – 599,99 lei - 25%
600 – şi mai mult - 30%
Program P81;
Uses Crt;
Type Persoana = Record
Nume: String;
Cistig, Salariu: Real
End;
Var x: Array[1..30] of Persoana;
imp: Real;
i: Integer;
n: 1..100;
Begin
ClrScr;
Write(«Introdu numarul de persoane:'); Readln(n);
For i:=1 To n Do
With x[i] Do
Begin
Writeln('Introdu datele persoanei',i);
Write('Numele:');Readln(Nume);
Write('Cistigul:');Readln(Cistig)
End;
For i:=1 To n Do
Begin
If x[i].Cistig <=100
Then imp:=0
Else If (x[i].Cistig > 100) And (x[i].Cistig < 400)
Then imp:= 0.13*x[i].Cistig
Else If (x[i].Cistig >=400) And (x[i].Cistig < 600)
Then imp:= 0.25*x[i]. Cistig
Else imp:= 0.3*x[i].Cistig;
x[i].salariu :=x[i].Cistig – imp;
End;
Writeln(‘Lista persoanelor si salariile fara impozite:’);
For i:=1 To n Do
Writeln(x[i].Nume,’’,x[i].salariu:10:2);
Readln
End.

Intrdu numărul de persoane: 4


Introdu datele persoanei 1
Numele: Fusu
Cîştigul: 700
Introdu datele persoanei 2
Numele: Grosu
Cîştigul: 2800
Introdu datele persoanei 3
Numele: Arion
Cîştigul: 1800
Introdu datele persoanei 4
Numele: Tonu
Cîştigul: 300
Lista persoanelor şi salariile fără impozite:
Fusu 490.00
Grosu 1960.0
Arion 1260.00
Tonu 261.00
Exemplul 3:
Pentru o listă de cărţi se introduc de la tastaatură următoarele date:
- denumirea (string);
- autorul (string);
- numărul de pagini (1..500);
- anul ediţiei (1900.2000);
- starea (“+”, “-”).
Să se scrie un program care afişează denumirile căţilor editate după anul 1996, cu numărul de pagini
mai mare ca 100. De asemenea, să se afişeze numărul de cărţi în stare bună.
Program P82;
Type Carte = Record
Den: String;
Aut:String;
Npag: 1..500;
AnEd: 1900..2000;
Stare: Char End;
Var lista: Array[1.100] of Carte;
i, n, k: Integer;
Begin
Write(‘Introdu numarul cartilor n=’); Readaln(n);
For i:=1 To n Do
With lista[i] Do
Begin
Writeln(‘Introdu datele despre cartea Nr’,i);
Write(‘Denumirea:’); Readln(Npag);
Write(‘Autorul:’); Readln(Aut);
Write(‘Numarul de pagini:’); Readln(Npag);
Write(‘Anul de editare:’); Readln(AnEd);
Write(‘Starea(+/-):’); Readln(Stare)
End; Writeln(‘Raspuns:’);
For i:=1 to n Do
With lista[i] Do
Begin
If (AnEd > 1996) And (Npag > 100) Then
Writeln(‘Cartea”’,Den,’ “, anul ed.’, AnEd,’’,, Npag,’ pagini’);
If Stare=’+’ Then k:=k+1 End;
Writeln(‘In stare buna sunt’,k,’ carti’);
Readln
End.

Introdu numărul cărţilor n=2


Introdu datele despre cartea Nr1
Denumirea: Turbo Pascal
Autorul: Lemne E.
Numărul de pagini: 213
Anul de editare: 1994
Starea(+/-): +
Introdu datele despre cartea Nr. 2
Denumirea: Word 97
Autorul: Malâci I.
Numărul de pagini: 180
Anul de editare: 1998
Starea(+/-): +
Răspuns:
Cartea: “Word 97”, anul ed. 1998, 180 pagini
În stare bună sunt 2 cărţi
Exemplul 4:
Se consideră o listă cu oferte de vînzare a locuinţelor ce conţine urmăroarele date:
- numărul ofertei (1..100);
- sector (string);
- numărul de odăi (1..5);
- preţul (real);
- telefon (“da” sau “nu”).
Să se scrie u program care ar afişa sectoarele unde sunt de vînzare locuinţe cu 4 odăi ce au telefon şi
preţul mediu al acestora.

Program P83;
Uses Crt;
Type Oferta = Record
Nr: 1..100;
Sector: String;
No: 1..5;
Pret: Real;
Tel: String[2]
End;
Var A: Array[1..50] of Oferta;
i, n, L: Integer;
PretMediu: Real;
S: Real;
Begin
ClrScr;
Write(‘Introdu numarul de oferte:’); Readln(n);
For i:=1 To n Do
With A[i] Do
Begin
Write(‘Numarul ofertei:’); Readln(Nr);
Write(‘Sectorul:’); Readln(Sector);
Write(‘Numarul de odai:’); Readln(No);
Write(‘Pretul:’); Readln(Pret);
Write(‘Telefon(da/nu:’); Reaadln(Tel)
End;
S:=0;
Writeln(‘Raspuns la cerere:’);
L:=0;
For i:=1 To n Do
With A[i] Do
If (N=4) And (Tel=’da’) then
Begin
S:=S+Pret;
L:=L+1;
Writeln(‘Sectorul’,Sector,’,cu telefon’)
End;
PretMediu:=S/L;
Write(‘Pret mediu =’,PretMediu:10:2,’lei’);
Readln
End.
Introdu numărul de oferte: 4
Numărul ofertei: 14
Sectorul: Botanica
Numărul de odăi: 4
Preţul: 225000
Telefon(da/nu): da
Numărul ofertei: 23
Sectorul: Ciocana
Numărul de odăi: 3
Preţul: 89000
Telefon(da/nu): da
Numărul ofertei: 34
Sectorul: Ciocana
Numărul de odăi: 4
Preţul: 195000
Telefon(da/nu): da
Numărul ofertei: 53
Sectorul: Centru
Numărul de odăi: 4
Preţul 210000
Telefon(da/nu): da
Răspuns la cerere:
Sectorul Botanica, cu telefon
Sectorul Ciocana, cu telefon
Sectorul Centru, cu telefon
Preţ mediu = 210000.00 lei

Exemplul 5: Se consideră declaraţiile:


Type Data=Record
Zi: 1..31;
Luna: 1..12;
An: Integer
End;
Persoana = Record
PrenNum: String;
DataNaşterii: data
End;
Să se scrie un program care citeşte de la tastatură datele referitoare la n persoane şi afişează pe ecran
persoanele născute în ziua z a lunii.

Program P84; {Record in Record}


Uses Crt;
Type Data=Record
Zi: 1..31;
Luna: 1..12;
An: Integer
End;
Persoana = Record
PrenNum: String;
DataNasterii: Data
End;
Var n: 1..50;
i, r: Integer;
Lista: Array[1..50] of Persoana;
Z: 1..31;
Begin
ClrScr;
Write(‘Introdu numarul de persoane:’); Readln(n);
For i:=1 To n Do
With Lista[i] Do
Begin
Writeln(‘Introdu datele despre persoana Nr’,i);
Write(‘Prenumele si Numele:’); Readln(PrenNum);
Writeln(‘Data nasterii:’);
With DataNasterii Do
Begin
Write(‘Ziua:’); Readln(Zi);
Write(‘Luna:’); Readln(Luna);
Write(‘Anul:’); Readln(An)
End
End;
Write(‘Introdu ziua care se cerceteaza:’); Read(Z);
r:=0;
Writeln(‘Lista persoanelor nascute la data de’,Z);
For i:=1 To n Do
If Lista[i].DataNasterii.Zi = Z Then
Begin
r:=1;
Writeln(Lista[i].PrenNum,’ ‘)
End;
If r=0 Then Writeln(‘vida’);
Readln
End.

Introdu numărul de persoane: 4


Introdu datele despre persoana Nr1
Prenumele şi Numele: Elena Isaico
Data naşterii
Ziua: 04
Luna: 08
Anul: 1983
Introdu datele despre persoana Nr2
Prenumele şi Numele: Lilia Boiciuc
Data naşteriii
Ziua: 26
Luna: 02
Anul: 1983
Introdu datele despre persoana Nr3
Prenumele şi Numele: Cristina Avasiloaie
Data naşterii
Ziua: 27
Luna: 05
Anul: 1983
Introdu datele despre persona Nr4
Prenumele şi Numele: Ion Grosu
Data naştterii
Ziua: 26
Luna: 05
Anul: 1985
Introdu ziua care se cercetează: 26
Lista persoanelor născute la data de: 26
Lilia Boiciuc
Ion Grosu
Programe Propuse
1. Să se alcătuiască o structură de tip Record, care se permită întocmirea situaţiei şcolare a unei clase pe baza
informaţiilor din catalog, privind notele şi mediile la următoarele discipline de studiu: matemetica, fizica,
informatica. Să se scrie un program care afişează lista elevilor care au media generală cel puţin 8, şi cu media la
informatică cel puţin 9,5.
2. Se consideră informaţia despre elevii unei clase:
- Numărul de ordine (integer);
- Prenumele (string);
- Numele (string);
- Anul naşterii (1970..2000);
- Luna naşterii (1..12);
- Âziua naşterii (1.31).
3. Se consideră că într-un depozit sunt produse ce se caracterizează prin cod, cantitate şi preţ unitar. Să se scrie un
program care utilizează o structură de tip Record şi calculează:
a) valoarea totală în lei a produselor din depozit şi, totodată, determină codul a produsului, costul căruia este maxim;
b) costul sumar al produselor, codurile cărora sunt numere prime.
4. Se consideră următoarele declaraţii: Type Tara= Record
DenStat: string[15];
Limaba: string[10];
NrPop: LongInt;
End;
Europa = Array [1..43] of Tara;
Să se scrie un program care afişează denumirile ţărilor ce au populaţia mai mare de 20 mln şi una din limbile
oficiale. De aemenea, se afişează şi numărul ţărilor în care se vorbeşte franceza.
5. Se consideră următoarele declaraţii: Type Prenume=(Ana, Maria, Irina, petru, Ion, Vasile, Iurie, Dorin, Elena);
Date=Record
Sex:(masc, fem);
Inaltime:140..200
End;
Grupa = Array[nume] of date;
Să se scrie un program care:a) determină înălţimea medie a persoaneleor de sex femenin;
b) determină numele celei mai înalte persoane de sex masculin;
c) atribuie unei variabile logice valoarea TRUE dacă în grupă sunt măcar două
persoane de aceeaşi înplţime, în caz contrar valoarea – FALSE.
6. Se consideră următoarele decalraţii: Type Data=Record
Data:1…31;
Luna:1…12;
Anul:1900…2000
End;
Acheta=Record
Numele: String;
Sex: (masc, fem);
DataNasterii: Data
End;
Grupa=array[1..25] of Ancheta;
Să se scrie un program care:
a) atribuie şirului Name numele celei mai în vîrstă persoane de sex masculin (se consideră că există numai o
singură persoană);
b) afişează numele persoanelor care încep cu litera “A” şi datele de naştere.
7. Să se scrie un program care utilizează o structură de tip record cu următoarele componente: numele(string),
adresele(string) şi telefoanele(string) unor persoane. Să se afişeze datele persoanelor care locuiesc pe o anumită stradă.
8. Se consideră o listă cu 20 persoane, care conţine următoarele date:numele (string),vîrsta (1..125) şi starea civilă
(“căsătorit”sau “celibatar”).Să se scrie un program care afişează:
procentul persoanelor cu vîrsta sub 18 ani;
a) procentul persoanelor cu vîrsta între 18 şi 62 ani;
b) procentul persoanelor cu vîrsta de peste 62 ani;
c) înălţimea medie a bărbaţilor între 18 şi 30 ani;
d) procentul persoanelor căsătorite.
CAPITOLUL IX
---------------------------------------------------------------------
Programe cu fişiere
Fişiere text
Exemplul 1:
Sa se scrie un program care crează un fişier text .Conţinutul liniilor să se introduca de la tastatură.
Program P85_1;
Var f:Text;
c:String;
i:1..100;
Begin
Assing(Fisier ‘1.txt’); {Se asociaza variabila f cu fisierul extern ‘Fisier1.text’}
Rewrit (f); {Se deschide f pentru creare}
Write (‘Dati numarul de linii :’); Readln(n) {fisierul va contine n linii}
For i:=1To n Do
Begin
Readln (c) {Se citeste cite o linie de la tastatura}
Writeln(f,c) {Se scrie linia f in c}
End;
Close (f) {Se inchide fisierul f}
Readln
End.

Cînd numarul de linii e cunoscut ,programul poate fi transformat astfel.


Program P85_2_cu_Eof;
Var f: Text;
c:String;
Begin
Assing(f.’Fisier 1.text’); Rewrite(f);
While Not Eof Do {Se testeaza sfirsitul de fisier }
Begin
Readln (c); {Se citeste cite o linie de la tastatura }
Writeln(f c) {Se scrie linia in fisier}
End ;
Close(f);
Readln
End.

Se admite că momentul terminarii introducerii datelor săfie marcat prin furnizaria unei liniiformate
numai dintr-un spaţiu.
Program P85_3
Var f: Text;
c:String;
Begin
Assing(f,’Fisier 1.text’); Rewrite(f);
Readln(c) {Se citeste de la tastatura prima linie}
While c <>’ ’Do {Cit timp linia este diferita de spatiu}
Begin Writeln(f,c); {Se scrie linia in fisier}
Readln(c) {Se citeste de la tastatura urmatoaria linie }
End;
Close (f);
End.
Exemplu 2:
Să se scrie pe ecran un program care afişeazăpe ecran conţinutul fişierului creat anterior. Prima
varianta aprogramului citeste din fisierul de intrare linie cu linie şi le afişează pe ecran.

Program P86_1;
Var f: Text ;
c: String;
Begin
Assing(f,’Fisier 1.text’); Reset (f){Se deachide fisierul pentru citire}
While Not Eof(f) Do {cit timp nui sfirsit de fisier }
Begin
Readln(f,c); {Se citeste linia de fisier }
Writeln (c) ; {Se scrie linia pe ecran }
End;
Close(f);
Readln
End.

A doua variantă a programului citeste datele din fisier caractercu caracter .În acest caz se utilizează
încă un ciclu (interior )care indica sfîrşitul de linie .

Program P86_2;
Var f:Text ;
c:Char;
Begin
Assing (f,’Fisier1.txt’);
Reset(f); {Deschide fisierul pentru citire }
While Not Eof (f) Do
Begin
While Not Eoln (f)Do {Se testeaza sfirsitul de linie }
Begin
Readln(f,c);
Write (c); {Se scrie caracterul pe ecran }
End;
Readln (f); {Se trece la linia urmatoare }
Writeln
End;
Close(f);
Readln
End.

Exemplu 3:
Într-un fisier este scrisa o poezie. Să se scrie un program care creaza un alt fisier cu acelasi
continut ,in care toate literele sa fie majuscule .
Se citeste cite o linie din fisierul de intrare ,se parcurge linia,realizind conversia ceruta. Pentru
conversie se foloseste functia UpCase care transforma caracterul ,daca aceasta este litera in litera
mare. Pentru a afla numarul de caractere intro linie ,se foloseste functia Length.
Program P87;
Var f1,f2:Text;
k,s:String; i:Byte;
Begin
Write (Dati numele fisierului); Readln(s)
Assing (f1,s);
Reset(f1); {Se deschide f1 pentru citire}
Assing (f2,’LitMari.txt’);
Rewrite(f2); {Se deschide f2 pentru citire}
While Not Eof(f1) Do
Begin
Readln(f1,k); {Se citeste linia din fisierul f1}
For i:=1To Length(k) Do
k[i]:=Upcase(k[i]); {Transforma litera in majuscula}
Writeln(f2,k) {Se scrie linia in fisierul f2}
End;
Close(f1);Close(f2);
{Se aseaza pe ecran continutul fisierului f2}
Reset(f2); {Se deschide f2 pentru citire}
While Not Eof(f2) Do
Begin
Readln(f2,k); {Se citeste linia din fisierul f2}
Writeln(k); {Se aseaza linie cu linie pe ecran }
End;
Close(f2);
Readln
End.

Exemplu 4:
Să se scrie un porgram care creză un fişier text, introducînd de la tastatură numere întregi separate prin
spaţii şi afişează pe ecran numărul mai mare din fişier.
Program P88;
Var f:Text;
max,a : Integer;
Begin
Assing(f,’Fisier4.txt’); Revrite(f);
While Not Eof Do Begin
Read(a) {Se citeste un numar de la tastatura}
Write (f,a’ ‘) {Se scri numarul in fisier}
End; Close(f); Reset(f);
While Not Eof (f)Do Begin
Read(f,a); {Se citeste din fisier numarul a}
Write (a,’ ‘) {Se afiseaza pe ecran numarul a}
End; Close (f); Reset(f);
Read(f,a); {Se citeste primul numar din fisier }
max:=a; {Se considera maxim primul numar }
While Not Eof (f) Do Begin
Read(I,a) {Se citeste urmatorul numar din fisier }
If a>max Then max:=a {Se determina numarul maxim}
End;
Writeln(‘numarul cel mai mare este’,max);
Close(f);
Readln
End.
Exemplul 5:
Se consideră un fişier text în care sunt înscrise în linii separate numele de familie al elevilor unei
clase .Să se scrie un program care crează un alt fisier text din conţinutul fişierului de intrare, unde
înaitea fieacărui număr de familie să fie scris numărul de ordine corespunzător. Numărul de ordine se
genereze prin intermediul instrucţiunii de atribuire.
Program P89;
Var f1,f2 :Text;
s:String;
n:Integer;
Begin
Assing(f1,’Fisie5.in’); Reset(f1);
Assing(f2,’Fisier5. aut’); Rewrite (f2);
n:=0;
While Not Eof (f1) Do Begin
Inc(n); {n-numar de ordine}
Write(f2,n, ‘ ‘); {Se scrie un numar de ordine in f2}
Read(f1,s) {Se citeste numerele din f1}
Writeln(f2,s) {Se scrie numele in f2}
End;
Close(f1);Close(f2); Reset(f2)
{Se afiseaza pe ecran fisierul f2}
While Not Eof (f2)Do Begin
Readln(f2,n,s); {Se citeste n si s din f2}
Writeln(n,’’,s); {Se afiseasa pe ecra n si s}
End; Close(f2);
Readln
End.

Exemplu 6:
Să se scrie un program care: a) crează fişierul text cu numele “Fisier6.in”liniile cărora conţin cîte 3
numere reale (notele unui elev la teze) b)crează fişierul “Fisier 6.aut” liniile cărora vor conţine cele 3
numere reale din linia corespunzătoarea fişierului creat în punctul a, media lor aritmetică şi unul din
cuvintele ADMIS, RESPINS. Cuvîntul ADMIS va fi înscris în linia în care media aritmetică a
numerelor nu-i mai mică decît 5 şi RESPINS –în caz contrar.
Program P90;
Var f1 ,f2 :Text;
a,b,c,Med :Real;
Begin
Assing(f1,’Fisier6.in’); Rewrite (f1);
Assing(f2,’Fisier6.aut’); Rewrite(f2);
While Not Eof Do Begin
Readln (a,b,c); {Se citesc notele de la tastatura}
Writeln(f1,a:5:2,b:5:2,c:5:2) {Se scriu notele in fisier}
End;
Close(f1); Reset(f1); {Se deschide f1 pentru citire}
While Not Eof(f1)Do Begin
Readln(f1,a,b,c); {Se citesc notele din f1}
Med :=(a+b+c)/3 {Se calculeaza media aritmetica}
Write(f2,a:5:2,b:5:2 c:5:2,Med:5:2);
If Med>=5 Then Writeln(f2,’ADMIS’)
Else Writeln(f2,’RESPINS’); End;
Close(f1); Close(f2);
Readln
End.
Programe Propuse
1. Să se scrie un program care înscrie (într-o singură linie) într-un fişier text numerele naturale din
intervalul 1..20.
2. Să se scrie un program care crează un fişier text, introducînd de la tastatură pe linii separate
numele de familii ale elevilor unei clase şi afişează pe ecran conţinutul fişierului creat.
3. În fişierul text ”Fisier3.in” sunt înscrise numele de familie ale elevilor unei calase.Să se scrie
fişierul”Fisier3.aut” în care se înscriu numele de familie ce se termină cu litera ‘a’.
4. Se consideră un fişier text ce conţine în fiecare linie următoarele date :numărul de ordine şi numele
elevului de familie. De creat un alt fişier cu datele primului fişier ,adăugînd prenumele ficărei
persoane în linia corespunzătoare .Prenumele fiecărei persoane se introduce de la tastatură.
5. Să se creze fişierul text “Fisier5. in” care conţine un şir de numere întregi separate prin spaţii.Să se
afişeze pe ecran numerele pozitive ,apoi cele negative.
6. Într-un fişier text sunt înscrise numere întreigi separate prin spatii. De creat un alt fişier text în care
se înscriu numai numerele prime din fişirul de intrare.
7. Se consideră un fişier text .Fiecare linie a fişirului coţine doua numere întregi şi trei numere reale
separate prin spaţii.Să se scrie un program care afişează :
a) suma tuturror numerelor din fişier;
b) suma tuturor numerelor intregi din fişier şi suma tuturor numerelor reale din fisier .
8. Se considera un fişier text .Fiecare linie a fişierului text conţine următoarele date, separate prin
spaţii libere:
-numarul de ordine (Integer);
-numele de familie(string);
-nota la matematica(real);
-nota la informatica(real);
-nota la fizică(real);
Să secrie un program care :
a) afişează conţinutul fişierului pe ecran ;
b) crează un fişier text liniile căruia conţin următoarele date separate prin spaţii: numarul de
ordine, numele de familie şi media la cele trei discipline;
c) creză o copie de rezervă a fişierului .
9. De creat un fisier text ce contine numele de familie şi data(ziua ,luna ,anul )de naştere a prietinilor
D-voastră. Să se afişeze pe ecra numele celor ce sunt născuţi vara (iunie ,iulie,august).
10. Să se scrie un program în rezultatul executii căruia conţinutul unui fişier de text ce conţine numere
separate prin spaţii sete înscris în ordine inversă în alt fişier text.
11. În fişierul de intrare este înscris un şir de numere întregi separate prin spaţii .Să se fişeze pe ecran
numerele care se întîlnesc în fişier o singură dată.
12. În fişierul de intrare este înscris un şir de numere întregi separate prin spaţii.Să se determine dacă
în fişier sunt numere egale .
13. Se consideră un fişier text ce conţine numere pe cîteva linii. Numerele de pe aceaşi liniie sunt
separate prin spaţii. Să se calculeze cîte numere sunt pe fiecare linie .
14. Să se creeze un fişier text avînd ca sursăalte două fisiere text (fişier egzistent în dosarul curent ), al
doilea fiin continuat în continuaria primului .
15. Se considera fisier text f format din linii nevide :să se scrie funcţia Numar(f)care determină
numărul liinilor ce încep cu litera ‘d’.
16. Se considera declaraţiile :
Type Cuvint =Array[1..15]of Char ;
Sir =Array [1…100]of Cuvint;
Să se scrie o procedură Inscrie (s,f),care înscrie cuvintele şirului s pe linii aprte în fişierul text f
Fişiere text
Exemplu 1:
Să se scrie un program care crează un fişier cu tip numit ELEVI.IN, ale căror componente sunt datele
despre elevii unor clase :
-prenumele(string); -numele(string); -nota medie (real); -vîrta (7..19);
Program P92_1;
Type Elev =Record
Prenume : String;
Nume : String;
Nota Medie: Real;
Virsta :7..19;
End;
Var f :File of Elev;
nr,i:1..40;
E:Elev;
Begin
Write(‘Introdu numarul de elevi ’); Readln(nr);
Assing(f,’Elevi.in’); Rewrite (f);
For i :=1 To nr Do Begin
Writeln(‘Introdu datele elevului’,i);{Se citesc cimpurile variabilei E de la tastatura }
Write(‘Prenumele’:);Readln(E.Pronume);
Write (‘Numele:’); Readln (E .Nume);
Write (‘Nota medie:’);Readln (E .Nota medie);
Write (‘Virsta:’);Readln(E.Virsta);
Writeln (f,E) {Se scrie componenta E in f}
End;
Close(f);
Readln
End.

Programul poate fi reconceput fara a preciza numarul de elevi

Program P92_2
Type ELEV =Record
Prenume , nume:String;
Nota medie:Real;
Virsta :7…19;
End;
Var f :File of ELEV;
c: Char;
Begin
Assing(f.’elevi.in ’); Rewrite(f)
Repeat
Write(‘Pronumele:’); Readln(E. Pronume );
Write (‘Numele:’); Readln(E.nume);
Write (‘Nota medie :’); Readln(E. Nota medie);
Write(‘Virsta:’);Readln(E. Virsta);
Write(f,E)
Write (‘Mai exista elevi ?(D/N)’);
Readln (c);
Writeln (‘Numarul de elevi’,File Size(f));
Readln
End.
Exemplu 2:
Să se scrie un program care citeşte componentele fişierului creat în exemplul 1 şil afişează pe ecran.

Program P93;
Type ELEV =Record
Prenume ,nume:String[30];
Notamedie :Real;
End;
Var f: file Of ELEV;
E:ELEV;
Begin
Assing(f,’Elevi.in’); Reset(f);
While Not Eof(f) Do
Begin
Read(F,E)
Writeln(E.Pronume ,’E.Nume ,’’,E. Nota medie :5:2);
End;
Close(f);
Readln
End.

Exemplul 3: Se considera urmatuaria declaratie:


Type Sudent=Record
Prenume , Nume:String;
Data =Record;
Zi:1..31;
Luna:1..12;
An:1970..1990;
End;
Sex(‘m’’f’);
Nota:Real;
End;
fis= File of Student;
Var f : fis;
E: Student.

a) Să se creeze un fişier care păstreză datele despre studenţii unei universităţi.


b) Să se scrie un program care consultă fişierul creat anterior şi afişează pe ecran datele despre
toţi studenţii.
c) Consultaşi fişierul creat anterior şi afişaţi:
1)numele studenţilor cu note maxime
2)lista persoanelor de sex masculin;
d) Alcătuiţi singuri o întrebare care va consulta fişierul în studiu.
Program P94;
Type Student=Record
Prenume, Nume:String;
Data=Record
Zi:1..31;
Luna:1..12;
An:1970..1990;
End;
Sex:(‘m’,’f’);
Nota: Real;
End;
fis=File of Student;
Var f:fis;
E,Max:Student; i,k,n:Integer;
Begin
Assign(f,’Grupa’); Rewrite(f);
Write(‘Dati numarul de studenti n=’); Readln(n);
For i:=1 To n Do Begin
Writeln(‘Dati datele studentului Nr’,I);
Write(‘Pronumele:’); readln(E.Prenume);
Write(‘Numele:’); Readln(E.Nume);
Write(‘Sexul:’); readln(E.Sex);
Write(‘Nota:’); Readln(E.Nota);
Write(‘Data nasterii:’);
Write(‘Ziua:’); Readln(E.Data.Zi);
Write(‘Luna:’); Readln(E.Data.Luna);
Write(‘Anul:’); Readln(E.Data.An);
Write(f,E); End; Close(f); Writeln;
{Rezolvare punctul b}
Reset(f); Writeln(‘Rezultate:’); Writeln(‘Afiseaza datele despre studenti’); i:=0;
While Not Eof(f) Do Begin
Read(f,E); i:=i+1;
write(E.Prenume,’ ‘,E.Nume,’ ‘,E.Sex:4, E.Nota:7:2);
Writeln(‘ ‘,E.Data.Zi,’’,E.Data.Luna,’’,E.Data.An);
End; Close(f); Writeln;
{Rezolvare punct c.1}
Reset(f); Max.Nota:=0; K:=0;
While Not Eof(f) do
Begin Read(f,E);
If E.Nota>Max.Nota Then Begin Max:=E; k:=0; End;
If (E.Sex=’m’) And (E.Nota=Max.Nota) Then k:=k+1 End;
Writeln(‘Numarul pers.de sex masculin cu nota maxima:’,k); Close(f); Writeln;
{Rezolvare punct c.2}
Reset(f); Writeln(‘Lista persoanelor de sex masculin:’);
While Not Eof(f) do Begin Read(f,E);
If E.Sex=’m’ Then Writeln(E.Prenume,’ ‘,E.Nume); End; Close(f); Writeln;
{Rezolvare punct d)}
{Se afiseaza lista persoanelor de sex femenin cu nota medie maimare ca 8.5}
Reset(f); Writeln(‘Lista pers. de sex femenin cu nota mai mare de 8.5:’);
While Not Eof(f) Do Begin Read(f,E);
If (E.Sex=’f’) And (E.Nota>8.5) Then
Writeln(E,Pronume,’ ‘,E.Nume,’ ‘,E.Nota:7:2);
End;
Close(f);
Readln
End.
Exemlul 4:
Se consideră un fişier text f, în care sunt înscrise numere naturale mai mici decît 1000 separate prin
spaţii. Să se scrie u program care determină dacă numerele din fişier sunt ordonate crescător.

Program P95;
Var f: file Of 0..999;
X,y: 0..999;
Of:boolean
Begin
Assing(f,’Fisier4.in’); Reset(f); read(f,x);
oK:=true;
While Not Eof(f) and ok Do
Begin
Read(F,y)
Ok:=x<y;
X:=y;
End;
If ok then writeln(‘ Numerele sunt ordonate crescator’)
Else writeln(‘Numerele nu sunt ordonate crescator’);
Readln
End.

Programe Propuse
1. Să se creeze un fişier care conţine informaţie despre casetofoane marca (string), preţul (real) şi ţara
producătoare (string). Să se afişeze pe ecran informaţia despre casetofoanele ce costă mai scump
de 500 lei.
2. Să se creeze fişierul ”Student” cu următoarea structură: numele de familie a studentului (string),
sexul (”M”, ”F”) şi anul naşterii (1970..1985). Să se afişeze lista studenţilor de gen masculin cu
indicarea vîrstei lor. La sfîrşitul listei se afişează vîrsta medie a studenţilor de gen masculin.
3. Să se creeze fişierul ”car” care conţine informaţia despre auromobile: modelul (string),
culoarea(string) şi ţara producătoare(string). Să se afişeze pe ecran informaţia despre automobilele
”Audi” de culoare verde.
4. Să se creeze un fişier care conţine informaţia despre cărţile de programare din biblioteca personală:
numele autorului(string), editura(string) şi anul ediţiei(1900..2006). Să se afişeze pe ecran autorii
şi cărţile editate de editura Teora.
5. Se consideră două fişiere cu tip întreg f1 şi f2. Să se scrie un program, în rezultatul execuţiei căruia
componentele fişierului f1 se transcriu în fişierul f2, iar componentele fişierului f2-în fişierul f1.
Componentele fişierelor au acelaşi tip. De folosit fişierul u ca auxiliar.
6. Se consideră fişierul cu tip întreg f1. De citit din f1 un tablou unidiminsional cu 10 numere întregi.
Să se ordoneze crescător acest tablou şi să se înscrie în fişierul f2 tabloul ordonat.
7. Se consideră fişierul cu tip întreg f1. De citit din f1 o matrice A[1..5, 1..5] ;I de extras ]n tabloul
unidiminsional B elementele de pe diagonala principală. Să se ordoneze crescător elementele
tabloului B şi să se afişeze pe ecran.
8. Într-un fişier cu tip char sunt înscrise caractere arbitrare. Să se scrie un program care afişează pe
ecran numărul de apariţii pentru fiecare vocală (din alfabetul latin) din fişier.
9. Să se scrie un program care determină numărul componentelor fişierului cu tip real, mai mici ca
media aritmetică a tuturor componentelor fişierului.
10. Se consideră următoarele declaraţii:
Var s:array[1….100] of char;
F:file of char;
Să se scrie un program care înscrie în fişierul f toate cifrele dinstincte din S.
CAPITOLUL X
---------------------------------------------------------------------
Subprograme
Exemplu 1:
Se consideră un patrulater convex cu lungimele celor patru laturi şi una din diagonale .Să se
calculeze aria acestui patrulater.
C
B

A
D
Diagonala înparte patrulaterul convex în două triunghiuri, ariile cărora pot fi calculate aplicînd formila
lui Heron
_________________
S=V p*(p-a)*(p-b)*(p-c), unde a, b şi c sunt laturile unui triunghi ,iar p este semiperimetrul lui
(p=(a+b+c)/2).
Prima variantă a programului este prezentată fără utilizaria subprogramelor.
Program P97_1_fara_subprogram:
Uses Crt:
Var AB,BC,CD,AD,AC,S1,S2,S,p1,p2:Real;
Begin
ClrScr;
Write(‘dati lungimele laturilelor si diagonalei:’);
Readln(AB,BC,CD,AD,AC);
P1:=(AB+BC+AC)/2;
S1:=Sqrt(p1*(p1-AB(*p1-BC)(*p1-AC));
p2 :=(AD+CD+AC )/2;
S2:=Sqrt(p2*(-AD)*(p2 -CD)*(p2-AC));
S:=S1+S2;
Write(‘Raspuns:aria patrulaterului convex este ’,S:5:2);
Readln
End.
Se obsrrvă repetaria unor instrucţiuni .Pentru a emite repetaria , pot fi organizate subprograme.
A doua variantă de program va fi scrisă cu utilizaria unei proceduri cu parametri.Procedura va calcula
aria triunghiului .
Program P97_2;
Var AB,BC,CD,AD,AC,S1,S2:Real;
Procedure Arie(a,b,c:Real;Var S: Real);
Var p:Real;
Begin
P:=(a+b+c)/2;
S:=Sqrt(p*(p-a)*(p-b)*(p-c));
End; {Sfîrşit de procedură}
Begin {Se începe programul propriu-zis}
Write(‘Daţi lungimele laturillor şi a diagonalei;’); Readln(AB,BC,CD,AD,AC);
Arie(AB,BC,AC,S1); {Primul apel al procedurii Arie}
Arie(AD, CD,AC S2); {Al doilea apel al procedurii Arie}
Write(‘Răspuns:aria patrulaterului convex este’,S1+S2:5:2);
Readln
End.
Apelul procedurii concepute se face prin scrieria numărului sau urmat de parametrii actuali înscrişi
între paranteze rotunde .De menţionat că este obligatoriu a se respecta corespondenţa în număr ,ordine
şi tip cu parametri formali.
Se observă că declararea parametrului formal S s+a făcut prin utilizaria cuvîntului –cheieVar, ceea ce
are ca efect comunicaria prin adresă între parametrii actuali(cei ai programului apelant)şi parametrii
formari (cei a programului apelant-în cayul nostru procedura Arie).
Aceasta înseamnă că ,de exemplu,la momentul primului apel al procedurii,rolullui S este luat de S1.
Dacă se renunţă la cuvîntul Var ,rezultatul prcedurii va fi transmisprogramului principal.
În acest caz schimbul între parametrii formali şi cei actuali se va face pri valuare şi nu prin adresă ,ca
ăn cazul anterior .
Procedura mai conţine o variabilă p numită variabilă locală (pentru procedură).La ieşirea din
procedură valuaria variabilei locale se consideră nedeterminată.
În general o procedură poate returna un rezultat ,cîteva rezultate sau numai să prelucreze datelele
communicate în momentul apelului.
Varianta a treia a programului va fi scrisă utilizînd o funcţiune

Program P97_3_cu_funcţie;
Uses Crt
Var AB ,BC,CD,AD,AC,S1,S2:Real;
Function Arie (a,b,c:Real):Real;
Var p:Real;
Begin
P:=(a+b+c)/2;
Arie:=sqrt(p*(p-a)*(p-b)*(P-c)); {Rezultatul functiei}
End; {Sfirsitul functiei}
Begin {Se incepe programul propriu zis} ClrScr;

Write(‘Dati lungimile laturilor si a diagonalei: ’); Readln(AB,BC,CDAD,AC);


S1:=Arie(AB,BC,AC); {Primul apel al functiei Arie}
S2:=Arie(AD,CD,AC); {Al doialea apel al functiei Arie}
Write (‘Raspuns aria patrulaterului convexeste ’,S1+S2:5:2);
Readln
End.

Spre deosebire de proceduri funcţiile calculează şi returnează valuaria.


Apatra variantă a programului conţine o funcţie care are ca parametri de intrare trei numere reale şi
returnează,de asemenea ,o valuare reală ce reprezintă aria triunghiului .Analizînd funcţia ,se pot face
următoarele constatări :antentul unei funcţii cuprinde cuvîntul-cheie function urmat de numele ei ,în
continuare se scriu în paranteze,parametrii formali,semnul”:”şi tipul funcţiei (în cazul nostru Real).
Mecanizmul de transmitere a parametreloreste acelaţi cu cel de la proceduri.
Tipul funcţiei este şi tipul rezultatului.În exemplul nostru ,aria triunghiului este un numărşi de aici
rezultă că tipul rezultatului funcţiei este Real
De menţionatcă în interiorul funxţieitrebuie să fie o instrucţiune de atribuire,unde în partia stîngă a
acestuia este numele funcţiei În acest caz funcţia se comportă ca o variabilă,în sensul că rezultatul ei
capătă valuaria expresiei din dreapta(după ce s-acalculat aria triunghiului ,funcţia ea această valoare)
Arie:=Sqrt(p*(p-a)*(p-b)*(p-c))).Un alt caz este atunci cînd numele funcţiei este în partia dreaptăa
atribuirii:atunci se face apelul funcţiei şi numele ei de atribuire să fie urmat de parametri(de
exemplu,S1:=Arie(AB,BC,AC)).
Numele funcţiei poate apărea şi în cadrul unui apel de procedurăWrite,Writeln.Înacest caz se
apelează funcţia cu parametrii daţi şi se afişează rezultatul.
Deci ,poate fi scrisă următoarea variantă de program:
ProgramP97_4_cu_Functie;
Uses Crt ;
VarAB,BC,CD,AD,AC:Reale;
Function Arie(a,b,c:Reale):Reale;
Var p:Real
Begin
P:=(a+b+c)/2
Arie:=Sqrt(p*(p-a)*(p-b)*(p-c)); {Rezultatul functiei}
End; {Sfirsitul functiei}
Begin {Se incepe programul propriuzis}
ClrScr;
Write(‘Dati lungimele laturilorsi a diagonalei:’); Readln(AB,BC,CD,AD,AC);
Write(‘Raspuns:_aria patrulaterului convex este’);
Writeln(Arie (AB,BC,AC)+Arie(Ad,CD,AC):5:2);
Readln
End.

Ultima variantă a programului este scrisă cu utilizaria unei proceduri fără parametrii formali.

Program P97_5_cu_procedura_fara_parametri_formali;
Uses Crt;
Var AB,BC,CD,AD,AC,S1,S,a,b,c,d:Real;
Procedure Arie;
Begin
p:=(a+b+c)/2;
S:=Sqrt(p*(p-a)*(p-b)*(p-c));
End
Begin
ClrScr;
Write(‘dati lungimile laturilor si a diagonalei:’);
Readln(AB,BC,CD,ad,AC);
a:=AB; b:=AC; Arie; S1:=S;
a:=AD; b:=CD;c:=Ac;Arie; S1:=S1+s;
Write(‘Raspuns:aria patrulalaterului convex este’,S1:5:2);
Readln
End.

Daţi lungimele laturilor şi a diagonalei :2 6 3 7 8


Raspuns: aria patrulaterului convexeste10.39

Apelul unei proceduri fără parametri se face prin indicaria numelui său.Înainte de fiecare apel se află
un grup de instrucţiuni de atribuire care actualizează valorile variabilei a,bşi c;fiecare apel inplică
execuşia procedurii .După apelul procedurii ,variabila S are valuarea triunghiului respectiv.
Prin urmare ,legătura dintre procedura arie şi celelalte instrucţiuni ale programului se înfăptuieşte prin
intermediul variabilelor a,b,c,S
Varianta de program cu utilizaria procedurii fără parametri nu este efectivă din cauya unui număr
mare de instrucţiuni de atribuire,care determină valorile variabilelora,b,c pînă la apelul pro cedurii.

Exemplu 2:
Se consideră trei numere întregi x,y şi z .Să se scrie un program care aranjează aceste numere în
ordine crescătoare.
ProgramP98_1_fara_subprogram;
Uses Crt;
Var aux,x,y,z:Integer;
Begin
ClrScr;
Write(‘Introdu trei numere intregi:’);
Readln(x,y,z);
If x>y Then Begin aux:=y ;x:=y ;y:=aux; End;
If y>z Then Begin aux:=y ; y:=z; z:=aux; End;
If x>y Then Begin aux:=x; x:=y; y:=aux; End;
Write(‘Numerele aranjate crescator:’,x,’’,y,’’,z,’);
Readln
End.

În cadrul programului se observă repetaria grupului de trei atribuiri, care diferă numai prin valorile
din componenţa lor.Apare idea realizării unei proceduri care are paramatrii de intrare(datele ce I se
dau)şi parametri de ieşire(reyultate returnate).
Program P98_2_cu_procedura;
Var a,b,c:Integer;
Procedure Schimba(Var x,y:Integer);
Var aux:Integer;
Begin
aux:=x;
x:=y;
y:=aux;
End;
Begin
Write(‘Introdu 3 numere întregi:);
Readln(a,b,c);
If a > b Then Schimba(a, b);
If a > c Then Schimba(b,c);
If a > b Then Schimba(a,b);
Write(‘Numerele aranjate crescator:’,a,’ ‘,b,’ ‘,c);
Readln
End.

Program P98_3_cu_Procedura;
{Folosire procedura ComparaSchimba}
Var a,b,c:Integer;
Procedure ComparaSchimba(Var x,y:Integer);
Var aux:Integer;
Begin
If x>y Then Begin aux:=x; x:=y; y:=aux; End;
End; {Sfirsit procedura}
Begin
Write(‘Introdu trei numere intregi:’); Readln(a,b,c);
ComparaSchimba(a,b);
ComparaSchimba(b,c);
ComparaSchimba(a,b);
Write(‘Numerele aranjate crescator:’,a,’ ‘,b,’ ‘,c);
Readln
End.
Introdu trei numere întregi: 15 6 2
Numerele aranjate crescător: 2 6 15
Exemplul 3:
Se consideră tabloul A[1..n] de numere întregi, n<=100. Să se scrie un program care calculează
suma componentelor acestui tablou, utilizînd funcţia respectivă.
Program P99;
Const nmax=100;
Type Tablou=Array[1..nmax] of integer;
Var A:Tablou;
S:Integer;
N:1..nmax;
Procedure Citire;
Var i:Integer;
Begin For i:=1 To n Do Read(A[I]); End; {Sfirsit de procedura}
Function Suma(n:Integer; A:Tablou): Integer;
Var i,S:Integer;
Begin
S:=0;
For I:=1 To n Do S:=S+A[i];
Suma:=S;
End;
Begin
Write(‘Introdu numarul de elemente ale tabloului n=’);
Readln(n);
Write(‘Introdu’,n,’ elemente: ‘);
Citire;
Write(‘Suma elementelor este: ‘,Suma(n,A));
Readln
End.

Introdu numărul de elemente ale tabloului n=10


Introdu 10 elemente: 4 –9 0 31 14 –5 0 0 67 2
Suma elementelor este: 104

Exemplul 4:
Se considera tabloul A[1..n] de numere întregi pozitive formate din cel mult patru cifre, n<=100. Să
se calculeze suma numerelor inversate din tablou, utilizînd funcţia, care inversează un număr întreg.
Program P100;
Const nmax=100;
Type Tablou=Array[1..nmax] of integer;
Var A:Tablou; I,s,k: integer; M: 1..nmax;
Function Inverst(n: integer) : Integer;
Var Numlnv: Integer;
Begin Numlnv:=0;
While N<>0 do Begin
K:=N Mod 10; Numlnv:=Numlnv*100+k; N:=N Div 10;
End; Invers:=Numlnv; End;

Begin
Write(‘Introdu numarul de componente M=’); Readln(M);
Write(‘Dati ‘,M,’ numere naturale:’);
For i:=1 to M do Read(A[I]) ; S:=0;
For i:=1 to m do S:=S+Invers(A[I]);
Writeln(‘suma numerelor inversate este:’, S);
Readln
End.
Introdu numărul de componente M=8
Daţi 8 numere naturaleŞ 345 7 32 45 98 50 3 231
Suma numerelor inversate este: 856

Exemplu 5:
Se consideră două numere întregi M şi N (M<N). Să se scrie un program care afişează toate
numerele prime cuprinse între numerele M şi N. Programul v-a folosi o funcţie booleană care
returnează valoarea TRUE sau FALSE în dependenţă de faptul, dacă un număr este prim.

Program P101;
Var I,N,M,L: Integer;
Function Prim(k:Integer):Boolean;
Var I:integer;
R:Boolean;
Begin
R:=TRUE; i:=2; L:=Trunc(k/2);
While (i<=L) And R do
Begin
If k Mod I=0 Then R:=FALSE;
I:=I+1;
End;
Prim:=R;
End;
Begin
Write(‘Introdu doua numere M si N (M<N):’); Readln(M<N);
Write(‘Numerele prime din intervalul ‘,M,’..’,N,’ sunt:’);
For i:=M To N do
If Prim(I) Then Write(I,’ ‘);
Readln
End.

Introdu doua numere M si N (M<N): 5 20


Numerele prime din intervalul 5..20 sunt: 5 7 11 13 17 19

Exemplul 6 :
Se consideră următoarele declaraţii:
Type fişier=File of Char;
Var f1, f2: fişier;
Să se scrie o funcţie logică Etal(f1,f2), care verifică dacă fişierele f1 şi f2 conţin aceleaşi date.

Function Egal( Var f1,f2 Fisier): Boolean;


Var c1,c2: Char;
Ok: Boolean;
Begin
Assign(f1,’1. In’); Reset(f1);
Assign(f2’,2. In’); Reset(f20;
Ok:=TRUE;
While Not Eof(f1) And Not Eof(f2) And Ok do
Begin
Read(f1,c1);
Read(f2,c2);
Ok:=(c1=c2);
End;
Egal:=Ok And Eof(f1) And Eof(f2);
End;
Programe Propuse
1. Să se scrie o procedură care returnează suma a două numere reale.
2. Să se scrie o funcţie de tip întreg care returnează produsul a două numere întregi.
3. Se consideră patru numere reale. Să se determine numărul cel mai mare, utilizînd procedura cu parametri
formali care determină numărul mai mare din două numere.
4. Se consideră patru numere reale. Să se determine numărul cel mai mare, utilizînd procedura fără parametrii
formali care determină numărul mai mare din două numere date.
5. Se consideră patru numere reale. Să se determine numărul cel mai mare, utilizînd mare din două numere
date.
6. Se consideră cinci numere reale. Să se determine numărul mai mare, utilizînd procedura cu parametri, care
determină numărul mai mare dintre trei numere.
7. Se consideră cinci numere reale. Să se determine numărul mai mare, utilizînd procedura fără parametrii
formali, care determină numărul mai mare dintre trei numere.
8. Se consideră cinci numere reale. Să se detemrmine numărul mai mare, utilizînd funcţia, care determină
numărul mai mare din trei numere.
9. De la tastatură se introduce un număr natural x. Să se scrie o procedură care afişează 0, dacă x este par şi 1 –
îm caz contrar.
10. Se consideră un tablou unidimensional A[1..n] şi B[1..n] de numere întregi, n100. Să se scrie o procedură
care adună acest tablouri şi întoarce rezultatul într-un tablou Z[1..n] (se calculează suma elementelor de pe
locurile corespunzătoare din tablourile A şi B şi rezultatul se înscrie pe acelaşi loc în tabloul rezultant).
11. Să se scrie o funcţie care returnează maximul dintr-un tablou unidimensional de numere reale.
12. Să se transcrie elementele unui tablou unidimensional A[1..100] într-un tablou bidimensional B[1..10,
1..10], utilizînd un subprogram (elementele din A se iau în ordinea în care sunt introduse de la tastatură).
13. Să se scrie o funcţie care determină cel mai mare divizor comun a două numere naturale.
14. Se consideră tabloul A[1..n] de numere naturale, n100. Să se determine cel mai mare divizor comun a
acestor numere, utilizînd o funcţie care returnează cel mai mare divizor comun a două numere naturale.
15. Să se scrie o funcţie care ordonează crescător elementele de pe diagonala principală a unui tablou
bidimensional pătrat.
16. Se consideră tabloul A[1..n] de numere întregi ordonat crescător, n100 şi un număr întreg y. Să se scrie o
funcţie booleană care returnează TRUE sau FALSE în dependenţă de faptul dacă y se găseşte sau nu în
tabloul A.
17. Să se scrie un subprogram care transformă o literă mică din alfabetul latin în literă mare.
18. Să se scrie un subprogram care realizează introducerea de la tastatură a n numere întregi şi memorarea lor
într-un tablou unidimensional A[1..n], n100.
19. Să se scrie un subprogram care realizează introducerea de la tastatură a n*n numere întregi şi memorarea
lor într-un tablou bidimensional A[1..n, 1..n], n20.
20. Se consideră tabloul A[1..n, 1..n] de numere întregi, n, m20. Să se scrie o procedură care efectuează
interschimbarea a două linii, valorile cărora se citesc de la tastatură.
21. Să se afişeze toate numerele întregi cuprinse între două valori citite de la tastatură care se împart fără rest la
suma cifrelor lor. Programul va utiliza o funcţie care returnează suma cifrelor unui număr întreg primit ca
parametru.
22. Să se aranjeze în ordine crescătoare elementele unui tablou unidimensional, utilizînd procedură respectivă.
23. Să se scrie un program pentru reezolvarea ecuaţiei bipătrate, folosind în calitate de subprogram programul
pentru rezolvarea ecuaţiei pătrate.
24. Se consideră declaraţiile:
Type Tara=(Austria, Italia, Peru, Elvetia, SUA, Brazilia);
Continent=(America, Africa, Europa);
Var x, y: Tara;
T: Boolean;
Să se scrie o funcţie Continent(S) care determină continentul pe care se află ţara S şi de folosit această
funcţie pentru schimbarea valorii variabilei T în opus, dacă x şi y se află pe continente diferite.
25. Se consideră declaraţiile:
Const n=100;
Type Tablou=Array[1..n] of Real;
Var A, B, C, D: Tablou;
Să se scrie o procedură Suma(X, Z, Y), care atribuie tabloului Z suma tablourilor X şi Y (fiecare element din
tabloul Z să fie egal cu suma elementelor de pe locurile corespunzătoarea din tablourile X şi Y).

Subprograme recursive
Exemplul 1:
Se consideră un număr natural N. Să se scrie o funcţie pentru calcularea factorialului numărului N.
Se ştie că factorialul unui număr natural se calculează după formula iterativă:

1, dacă N=0
N!=
1*2*3*...*N, dacă N>0

Ţinînd cont de definiţia dată mai sus poate fi scrisă următoarea funcţie:
Function factorial(N:integer):Integer;
Var p,i:integer;
Begin
If n=0 then factorial:=1
Else begin
P:=1;
For i:=1 to n do p:=p*I;
End;
Factorial:=P;
End;

1, dacă N=0
N!=
N*(N-1)!, dacă N>0

Din definiţie se observă că N! Se defineşte prin (N-1)! Care, la rîndul său, se defineşte prin (N-2)!
Ş.a.m.d., pînă la 0!=1. Numai ultima valoare se calculează explicit (în principiu, orice definiţie
recursivă trebuie să conţină un calcul explicit, în caz contrar procesul recursiilor va continua la infinit).

Varianta a două reoprezintă o funcţie recursivă.


Function factorial(N:integer):Integer;
Begin
If n=0 then factorial:=1
Else Factorial:=N*factorial(n-1);
End;

În interiorul funcţiei numele funcţiei apare de două ori în partea stîngă a instrucţiunii de atribuire,
prin intermediul căreia i se atribuie valoarea funcţiei. El mai apare şi mai apare şi în apelul de funcţie
factorial(N-1), care nu se diferă cu nimic de un apel obişnuit. Momentul important este anume apelul
funcţiei la ea însăşi, care poartă denumirea de apel recursiv.

Exemplul 2:
Se consideră numărul X la puterea N, unde X şi N sunt întregi (N-pozitiv). Să se scrie o funcţie care
ridică numărul X la puterea N.
Prima variantă reprezintă
Functiono funcţie cu utilizarea unei structuri iterative.
Putere(X:integer;N:1..maxint):Integer;
Var i,p:integer;
Begin P:=1;
For i:=1 to n do p:=p*x;
Putere:=P
End;
A doua variantă reprezintă o funcţie recursivă care utilizeză următoarea definiţie:

X, dacă N=1
Putere(X,N)=
X*XN-1, dacă N>1.

Function Putere(X:integer; N:1..maxint):Integer;


Var i,p:integer;
Begin
if N=1 then putere:=X
Else putere:=X*putere(X,N-1)
End;

Exemplul 3:
Se consideră un număr natural N. Să se scrie un program care calculează numărul Fibonacci cu
numărul de ordine N.
Varianta interativă a fost prezentată în capitolul III.
Conform definiţiei şirului Fibonacci funcţia recursivă poate fi scrisă astfel:

Function Fibonacci(N:integer):Integer;
Begin
if (N=1)or (n=2) then fibonacci:=1
Else Fibonacci:=Fibonacci(N-1)+Fibonacci(N-2)
End;

Exemplul 4:
Se consideră două numere naturale M şi N. Să se scrie o funcţie pentru determinarea celui mai
mare divizor comun al numerelor M şi N.
Prima variantă a funcţiei determină cel mai mare divizor comun al numerelor M şi N prin metoda
interativă.
Function CMMDC(M,N:integer):Integer;
Begin
While M<>N do if M>N then M:=M-N
Else N:=N-M;
CMMDC:=M
End;
End;

Varianta recursivă a funcţiei este următoarea:


Function CMMDC(M,N:integer):Integer;
Begin
If M=N then CMMDC:=M
Else
Begin
if M>N then M:=M-N
Else N:=N-M;
CMMDC:=CMMDC(M,N)
End;
End;
Exemplul 5:
Se consideră numărul natural N. Să se scrie o procedură pentru scrierea inversă a numărului N.
Varianta interativă.

Function invers(M,N:integer);
Begin
Repeat
Write(n mod 10);
N:=N div 10;
Until N=0
End;

Varianta recursivă:

Function invers(M,N:integer);
Begin
If N>0 then
begin
Write(n mod 10);
Invers(n div 10)
end
End;

Programe Propuse
1. Să se scrie un subprogram recursiv care calculează suma S(N)=1+2+3+...+N.
2. Să se scrie un subprogram recursiv care calculează suma S(N)=2+4+6+..+2N.
3. Să se scrie un subprogram recursiv care calculează produsul P(N)=1*3*5*...*(2N-1).
4. Să se scrie un subprogram recursiv care inversează un şir de caractere.
5. Se consideră tabloul unidiminsional A[1..10] de numere întregi. Să se scrie un subprogram recursiv
care calculează suma elementelor acestui tablou.
6. Se consideră tabloul unidiminsional A[1..10] de numere întregi. Să se scrie un subprogram
recursiv care inversează elementele acestui tablou.
7. Se consideră tabloul unidiminsional A[1..10] de numere întregi. Să se scrie un subprogram recursiv
care calculează suma elementelor pozitive ale acestui tablou.
8. Se consideră tabloul unidiminsional A[1..10] de numere întregi. Să se scrie un subprogram recursiv
care calculează produsul elementelor negative ale acestui tablou.
9. Se consideră numărul natural N. Să se calculeze recursiv suma
S=1/2+(1*3)/(2*4)+...+(1*3*...*(2N-1))/(2*4*...*2N).

10. Alcătuiţi o problemă care poate fi soluţionată cu ajutorul recursiei.

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