Documente Academic
Documente Profesional
Documente Cultură
---------------------------------------------------------------------
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ă
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.
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.
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ă.
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
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.
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.
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.
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.
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ă.
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
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.
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.
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
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
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.
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.
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=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ă.
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.
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.
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.
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.
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 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 mixte
105. Se consideră tabloul P[1..n] de numere reale diferite de zero, n100. 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, n100. Să se scrie un program care
calculează media aritmetică a elementelor pare.
107. Se consideră tabloul A[1..n] de numere reale, n100. Ş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, n100. 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, n100. 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, n100. 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, n100. 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, n100. 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, n100. Să se scrie un program care afişează
poziţiile numerelor perfecte.
120. Se consideră tabloul A[1..n] de numere întregi pozitive, n100. 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, n100. 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, m20. 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.
Exemplul 2:
Se consideră tabloul A[1..n, 1..n] de numere întregi, unde n20. 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.
Exemplul 4:
Se consideră tabloul A[1..n, 1..n] de numere întregi, n20. 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, n20. 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.
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.
Exemplul 7:
Se conideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. 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, n20. 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, m20. 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, m20. Să se scrie un
program care exclude din tabloul A linia, numărul căreia este egal cu numărul L (Ln) 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, m20). 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, m20. 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, m20. 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, m20. Să se scrie un program
care de determină elementul maxim.
4. Se consideră tabloul A[1..n, 1..m] de numere întregi, unde n, m20. 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 n20. 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 n20. 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 n20. 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 n20. 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 n20. 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 n20. 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, m20. 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, m20. 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, m20. 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 n20. 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 n20. 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 n20. 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 n20. 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 n20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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 n20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. Să se scrie un program
care efectuează interschimbarea linilor n1 şi n2. Numerele n1(n1n) şi n2(n2n) 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20.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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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, m20. 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 n20. 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 n20. 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,
m20. 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 n20. 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ă, n10:
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, m20. 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, m20. 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, m20. 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, m20. 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, n20. 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, m20. 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, m20. 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, m20. 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
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.
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.
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.
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.
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.
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.
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, m100.
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.
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
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.
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.
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
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.
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.
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;
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.
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.
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.
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.
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).
Î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.
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;
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).