Sunteți pe pagina 1din 127

Programarea Calculatoarelor

Laborator I

1. REPREZENTAREA INFORMAIEI N CALCULATOR.


CODIFICRI
Pentru a putea fi prelucrate cu ajutorul calculatorului, informaiile utilizate n viaa
cotidian (imagini, numere, litere, desene, sunete) i instruciunile pe care trebuie s le execute
procesorul calculatorului trebuie s fie reprezentate (codificate) ntr-un anumit format, acceptat
de calculator. Transformarea informaiei, din forma de reprezentare extern, uor de neles, n
forma de reprezentare intern pe care o nelege calculatorul, sub form de cifre binare, se
numete codificare intern a informaiei. Codificarea informaiei presupune ca fiecrei entiti
informaionale s i se atribuie o secven unic de cifre binare.
Unitatea elementar de reprezentare a informaiei n calculator este bit-ul (binary digit cifr binar), rezultnd din faptul c unitile de stocare elementare ntr-un calculator sunt
comutatoarele electronice, fiecare comutator avnd una dintre cele dou stri: on (reprezentat de
obicei de 1), sau off (0). Data este deci termenul utilizat pentru a descrie informaia reprezentat
de grupurile de comutatoare on/off.
Chiar dac datele i informaiile sunt cuvinte adesea folosite alternativ, exist o distincie
important ntre ele. Datele reprezint materia prim pe care o prelucreaz calculatorul i
organizeaz pentru a produce informaii.
Datele
- materia prim pentru informaii.
- atunci cnd sunt prelucrate, organizate, structurate sau prezentate ntr-un anumit context,
pentru a le face utile, acestea devin informaii.

Informaii
Date
dispun
de
caracteristici
semantice,
orientate
spre
coninutul i sensul atribuit
reprezentrii realitii.

caracter pur sintactic

Informaii
culegere
Date
Prelucrare: Informaii comunicare
Date
(transmitere) pertinente
elaborate
codificare
de baz -nregistrare
elementare
transmitere
-filtrare
-sortare
-combinare
-calculare

Un grup de 8 bii formeaz un octet sau byte. Deoarece cifrele binare pot fi combinate n
diverse moduri, cu un octet calculatorul poate reprezenta 256 de simboluri sau caractere diferite.
Byte-ul este extrem de important, deoarece exist combinaii suficiente de 8-bii pentru a
reprezenta toate caracterele de pe o tastatur. Aceast reprezentare prin care fiecrei entiti
informaionale i se asociaz o secven de cifre binare se numete codificare.
1

Programarea Calculatoarelor

n funcie de natura caracterelor pe care le pot reprezenta, sistemele de codificare se pot


grupa n:
- sisteme de codificare numerice;
- sisteme de codificare alfanumerice.
a. Coduri numerice prin intermediul crora se pot reprezenta n memoria calculatorului
datele numerice.
b. Coduri alfanumerice prin intermediul crora se pot reprezenta n memoria calculatorului
datele alfanumerice. n practic se utilizeaz trei sisteme de codificarea a caracterelor alfanumerice: ASCII ( American Standard Code for Information Interchange), EBCDIC (Extended
Binary Coded Decimal Interchange Code) i Unicode.
a) Coduri numerice
Pentru a reprezenta datele n calculator i pentru a le putea transmite convenabil ntre
sistemele de calcul au fost dezvoltate diferite scheme de codificare. Codurile numerice reprezint
cele 10 cifre zecimale, cu sau fr semn algebric. Acestea pot fi:
coduri ponderate: fiecare cifr a numrului zecimal este reprezentat printr-un cod binar cu
patru bii, fiecare rang al secvenei avnd asociat o pondere.
Pentru fiecare grup de patru bii, suma ponderilor acelor poziii unde cifra binar este 1
este egal cu cifra zecimal pe care o reprezint grupul. Deci o cifr zecimal se exprim
conform formulei:
3

N ai w i ,
i 1

unde ai {0.1} iar reprezint ponderea asociat poziiei, conform codului respectiv.
Cele mai cunoscute coduri ponderate sunt:
Codul BCD sau codul 8-4-2-1
Este utilizat pentru reprezentarea numerelor ntregi zecimale codificate binar i are ca
pondere puterile lui 2: 23, 22, 21, 20. Marele su avantaj este uurina conversiei ctre zecimal.
Reprezentarea unui ntreg zecimal se face cu fiecare cifr reprezentat individual,
conform tabelului de mai jos:
cifr zecimal
0
1
2
3
4
5
6
7
8
9

cod BCD
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001

Programarea Calculatoarelor

Reprezentarea cifrelor zecimale se realizeaz cte 2 cifre pe un octet - forma mpachetat


(cifra zecimal mai puin semnificativ pe biii 0 - 3 i cifra zecimal mai semnificativ pe biii 4
- 7) sau individual pe cte un octet - forma despachetat (n acest caz, cifra zecimal va fi
reprezentat n biii 0-3, iar primii 4-7 vor fi 0).
De exemplu, se cere reprezentarea n cod BCD a numrului zecimal 5463:
- n format mpachetat: 0101 0100 0110 0011
5
4
6
3
16 bii
- n format despachetat: 00000101 00000100 00000110 00000011
5
4
6
3
32 bii
Acest cod este mai puin eficient dect reprezentarea pur binar, n sensul c necesit mai
muli bii n reprezentare. De exemplu, numrul zecimal 21 poate fi reprezentat ca 10101 n binar,
dar n codul 8-4-2-1 se reprezint ca 00100001.
Obs: pentru reprezentarea n BCD a numerelor cu semn se utilizeaz un bit suplimentar pentru
semn (primul bit din stnga).
Codul 2-4-2-1
Utilizeaz ponderile 2, 4, 2 i 1 n codificare. Codurile pentru cifrele de la 0 la 4 ncep cu 0, iar
codurile pentru ultimele cinci cifre, 5 9 ncep cu 1, conform tabelului de mai jos:
cifr zecimal
0
1
2
3
4
5
6
7
8
9

cod 2-4-2-1
0000
0001
0010
0011
0100
1011
1100
1101
1110
1111

coduri neponderate: biilor nu li se mai asociaz ponderi, trecerea de la o cifr zecimal la


urmtoarea se face prin modificarea unui singur rang binar.
Cele mai cunoscute coduri neponderate sunt:
Codul EXCESS 3 (XS-3): reprezentarea n acest cod se obine din reprezentarea n codul 8-4-21 prin adunarea la fiecare grup de patru cifre binare a cifrei 3 reprezentat n binar: 0011,
conform tabelului de mai jos:
3

Programarea Calculatoarelor

cifr zecimal
0
1
2
3
4
5
6
7
8
9

cod XS-3
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100

Codul Gray: reprezentarea n acest cod se caracterizeaz prin faptul c dou cifre alturate au
reprezentri binare ce difer printr-un singur bit. Secvena este circular:
00 01 11 10 00
i aceast proprietate face ca acest cod s fie utilizat n aplicaii pentru detectarea erorilor. De
asemenea, aceast reprezentare este util pentru mrimile care cresc sau descresc succesiv.
Tabelul de mai jos cuprinde reprezentarea cifrelor zecimale n cod Gray:
cifr zecimal
0
1
2
3
4
5
6
7
8
9

cod Gray
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101

Mai jos sunt prezentai algoritmii pentru conversia cod binarcod Gray:
(b1,...,bm)(g1,...,gm), i respectiv pentru decodificarea cod Gray - cod binar: (g1,...,gm)
(b1,...,bm):
begin
g1= b1;
for i=2,..,m
gi = bi-1 XOR bi
repeat
end

begin
b1=valoare=g1;
for i=2,, m
if gi=1 then
valoare=NOTvaloare
endif
bi=valoare
repeat
end

Programarea Calculatoarelor

Coduri pentru detecia i corecia erorilor


n cazul transmisiei pe canalele de comunicaie a mesajelor prezentate sub form binar,
detectarea i corectarea erorilor aprute reprezint etape importante. n esen presupun
detectarea poziiei simbolurilor alterate i corectarea acestora, adic schimbarea n valoarea
binar opus.
n acest sens, alturi de cei n bii de date ai mesajului de transmis se introduc k bii
suplimentari de informaie neesenial, informaie de control. Vectorul format din cei k+n bii
formeaz un cuvnt de cod.
Cele mai utilizate coduri detectoare i corectoare sunt:
Coduri de control a paritii
Pentru fiecare succesiune de cifre binare a1,,an se adaug un bit de paritate an+1 care
face ca numrul de bii cu valoarea 1 din mesajul transmis s fie par sau impar, n funcie de
convenia de paritate stabilit. n momentul n care un bit se modific, acesta va schimba
paritatea: de la par la impar sau invers. Acest cod are o eficien sczut deoarece nu poate
detecta dect un numr impar de bii eronai.
Coduri bazate pe distana Hamming
Distana Hamming ntre dou cuvinte de cod cu acelai numr de bii n reprezentare este
egal cu numrul poziiilor n care cele dou cuvinte difer, adic numrul de erori care
transform un vector de informaie n alt vector.
De exemplu, distana Hamming ntre cuvintele de cod:
10001001
10110001 este egal cu 3.
Distana Hamming minim Dmin pentru un cod este cea mai mic distan Hamming
dintre toate perechile de cuvinte din cod. Codurile Hamming pot detecta Dmin-1 erori i pot
corecta (Dmin-1)/2 erori.
De exemplu, pentru cuvintele de cod:
11101
10110
00000
01011
Dmin este 3 i atunci codul Hamming poate detecta maxim 2 erori i poate corecta o singur
eroare (un singur bit alterat).
Coduri polinomiale cu redundan ciclic CRC (Cyclic Redundancy Code)
Aceste coduri se bazeaz pe un polinom generator de grad k-1, k fiind lungimea irului
de bii transmii: ultimul bit din ir este coeficientul lui x0 din polinom, iar bitul cel mai
semnificativ este coeficientul lui xk-1.
De exemplu, irul de bii 101011 are polinomul asociat:
p(x)=x5x3x1
Aritmetica polinomial este de tip modulo 2, folosind operatorul logic XOR.
Se calculeaz restul mpririi polinomului recepionat la polinomul generator. Dac
restul este zero, atunci transmisia secvenei a fost corect, fr erori.
5

Programarea Calculatoarelor

b) Coduri alfanumerice
n afar de valori numerice, ntr-un calculator trebuie reprezentate, de asemenea, date de
tip text care conin caractere. Setul de caractere conine litere ale alfabetului ("A" ... "Z", "o" ...
"Z"), cifre ('0 '... '9'), simboluri speciale ('+', '$', '. ",", "," @ "," * ", etc.), i caractere nonimprimabile (ex. CR, etc.).
Reprezentarea caracterelor alfanumerice n bii 0 i 1 se face prin coduri de caractere.
Exist trei coduri de caractere utilizate pe scar larg:
- American standard Code for Information Interchange (ASCII): este un cod de 7
bii care permite reprezentarea a 27 = 128 caractere distincte. Versiunea ASCII-8 sau ASCII
extins este un cod de 8 bii care permite reprezentarea a 28 = 256 caractere distincte. Primele 128
de caractere sunt la fel n ambele coduri. Cele 128 de combinaii suplimentare ale ASCII extins
sunt utilizate pentru simboluri cum ar fi: , , , etc.
- Extended Binary Coded Decimal Interchange Code(EBCDIC): a fost unul dintre
primele coduri informatice utilizat pe scara larg care au permis reprezentarea caracterelor
alfabetice litere mari i mici, n plus fa de caracterele speciale, cum ar fi semne de punctuaie i
caractere de control. Este un cod de 8 bii care permite reprezentarea a 28 = 256 caractere.
Reprezentarea se face n dou grupuri de 4 cifre, fiecare grup reprezentnd un numr
hexazecimal.
- UNICODE: este un cod alfanumeric pe 16 bii care permite 65536 de combinaii
diferite. Este sistemul de codificare standard universal, conceput pentru a reprezenta date bazate
pe text scrise n orice limb.

Programarea Calculatoarelor

Laborator 2

2. SISTEME DE NUMERAIE
Toate naiunile diferitelor civilizaii au stabilit propriul sistem de numerotare pe care s-l
foloseasc n viaa de zi cu zi i n alte activiti, cum ar fi comerul i toate celelalte aspecte ale
vieii care necesit numrarea.
Un sistem de numeraie este format din totalitatea regulilor i a notaiilor matematice
utilizate pentru reprezentarea numerelor cu ajutorul cifrelor sau a altor simboluri.
Sistemul de numeraie roman este cunoscut ca un sistem non-poziional deoarece fiecare
simbol reprezint o valoare specific independent de poziia sa.
De exemplu: I semnific ntotdeauna 1
V semnific ntotdeauna 5
X semnific ntotdeauna 10
Dar combinaiile de simboluri au semnificaii diferite.
De exemplu: IV semnific 4
VI semnific 6
Sistemul zecimal este un sistem poziional deoarece valoarea fiecrui simbol depinde de
poziia sa.
Un sistem de numeraie se numete deci poziional, dac valoarea unei cifre este dat de
poziia pe care aceasta o ocup n cadrul numrului. Fiecare sistem de numeraie poziional
const dintr-o baz, simboluri i o relaie care asociaz caracterele cu baza.
Ideea general n sistemele de numerotare poziionale este aceea c o valoare numeric
este reprezentata prin puterile cresctoare ale unei baze. Fiecare cifr este nmulit cu puterea
bazei:
cifra * baza(poziie -1)
Sistem
Baza
Cifre
de numeraie
corespunztoare
--------------------------------------------------------------------Decimal
10
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Binary
2
0, 1
Octal
8
0, 1, 2, 3, 4, 5, 6, 7
Hexadecimal 16
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
n general, un numr r este reprezentat ntr-o baz b printr-o secven de simboluri an, an1,,a0, f1, f2,,fm:
(an bn) + (an-1 bn-1) ++ (a0 b0) + (f1 b-1) + (f2 b-2) ++ (fm b-m)
care verific urmtoarele condiii:
0ai<b , i=0,,n i 0fi<b , i=0,,m
an0
7

Programarea Calculatoarelor

Punctul care separ partea ntreag de partea fracionar se numete punct fracionar.
Aceast scriere formeaz baza pentru conversia unui numr din baza b n zecimal.
Pentru conversia unui ntreg din baza b n zecimal se poate utiliza i regula lui Horner:
(an bn) + (an-1 bn-1) ++ (a0 b0) se poate scrie ca:
(((an b) + an-1) b + ) b + a0.
De exemplu: (1234)5 = (((1 5) + 2) 5 + 3) x 5 + 4 = 194.
Tehnologia digital utilizeaz diverse sisteme de numeraie. Cele mai frecvente sunt
sistemul zecimal, binar, octal i hexazecimal. Sistemul zecimal este n mod clar cel mai familiar
pentru noi, pentru c este un instrument pe care l folosim n fiecare zi.
n calculator, datele sunt reprezentate numai n sistem binar, octal i hexazecimal.
Conversii ntre sisteme de numeraie
Exist dou grupuri importante de conversii ntre baze de numeraie:
1. Conversia numerelor zecimale n numere reprezentate n baz r
2. Conversia numerelor din baz r n numere zecimale
Conversia zecimal-binar n cazul numerelor ntregi
Aceast conversie implic mprirea succesiv la 2 (baza conversiei) pn cnd ctul
devine 0. La fiecare mprire, restul obinut ofer o nou cifr a numrului convertit, ncepnd
cu cifra cea mai puin semnificativ.
De exemplu, s se converteasc n binar numrul zecimal 37(10):
37/2 =18
restul 1 (cifra cea mai puin semnificativ)
18/2 =9
restul 0
9/2 =4
restul 1
4/2 =2
restul 0
2/2 =1
restul 0
1/2 =0
restul 1 (cifra cea mai semnificativ)
Numrul obinut prin conversia n binar este 100101(2).
Conversia zecimal-binar n cazul numerelor subunitare
Aceast conversie implic nmulirea succesiv cu 2 (baza conversiei). La fiecare
nmulire, partea ntreag a rezultatului obinut ofer o nou cifr a numrului convertit, ncepnd
cu cifra cea mai semnificativ. Cifrele sunt plasate deci dup punctul zecimal, n ordinea
obinerii. Procedeul se poate opri oricnd, dup atingerea preciziei dorite.
De exemplu, s se converteasc n binar cu gradul de precizie 8 numrul fracionar 0.37(10):
0.37*2 = 0.74
se reine 0
0.74*2 = 1.48
se reine 1
0.48*2 = 0.96
se reine 0
0.96*2 = 1.92
se reine 1
0.92*2 = 1.84
se reine 1
0.84*2 = 1.68
se reine 1
0.68*2 = 1.36
se reine 1
0.36*2 = 0.72
se reine 0
Numrul obinut prin conversia n binar este 0.01011110(2).
8

Programarea Calculatoarelor

Conversia zecimal-binar n cazul numerelor reale


Deoarece un numr real x se poate scrie sub forma: x = [x] + {x}, parte ntreag plus
parte fracionar, se realizeaz conversia separat pentru numrul ntreg i separat pentru numrul
subunitar (ca n exemplele anterioare), iar apoi se concateneaz cele dou rezultate, plasnd
virgula ntre ele.
De exemplu, s se converteasc n binar cu gradul de precizie 8 numrul real 147.37(10):
147(10)
10010011(2)
0.37(10)
0.01011110(2)
-----------------------------------------147.37(10)
10010011. 01011110(2)

Conversia binar zecimal


Se adun termenii obinui din produsul dintre fiecare cifr binar care intr n
componena numrului i puterea bazei 2 care corespunde ponderii cifrei. Bitul situat pe poziia
cea mai din dreapta va avea ponderea 20, iar celelalte cifre binare, spre stnga vor avea ponderile
21, 22, etc.
Pentru numerele fracionare, ponderile alocate cifrelor aflate la dreapta virgulei de
separaie vor fi 2-1, 2-2, etc.
De exemplu, s se converteasc n zecimal numrul binar
10100101.101(2):
7
5
2
0
-1
-3
2 +2 +2 +2 +2 +2 = 165.75
Conversia binar octal
n acest caz conversia se face prin mprirea numrul binar n grupuri de cte 3 cifre
binare, ncepnd de la ultima, cea mai din dreapta cifr binar. Dac numrul de cifre binare nu
este un multiplu de 3, atunci se prefixeaz numrul cu zerouri, astfel nct fiecare grup s conin
3 cifre binare. Pentru fiecare grup de cifre binare se convertete numrul binar de 3 cifre ntr-o
cifr hexazecimal echivalent, conform tabelului de coresponden urmtor:
cifre octale
echivalent binar
--------------------------------------------------------------------0..............0
000
1..............1
001
2..............2
010
3..............3
011
4..............4
100
5..............5
101
6..............6
110
7..............7
111
De exemplu, s se converteasc numrul 1100010101(2) n octal:
- se divide numrul n grupuri de cte 3 cifre: 011 100 010 101
- se convertete fiecare grup ntr-o cifr octal: 3
4 2 5
Numrul convertit rezultat va fi deci 3425(8).
9

Programarea Calculatoarelor

Obs: n cazul numerelor fracionare, cifrele de la partea fracionar se mpart n grupe de cte 3
de la stnga la dreapta (ultima grup se completeaz n spate, cu unul sau dou zerouri) i apoi
fiecare grup se nlocuiete cu cifra octal corespunztoare ei.
Operaii aritmetice n binar
Tabela adunrii n binar:
+
0
1

0
0
1

1
1
10

Tabela scderii n binar:


0
1

0
0
1

1
1 mprumut 1
0

Obs:
1) Rezultatul adunrii de pe ultima linie: 1+1 = 2 (10(2)).
2) La scderea 0-1 se trece 1 i se mprumut o unitate din stnga.
3) Operaiile de nmulire i mprire n binar se efectueaz identic cu cele din baza 10, innd
cont de regulile:
0x0=0
0x1=0
1x0=0
1x1=1
0:0=0
0:1=0
1:0=imposibil 1:1=1
De exemplu:

1101101 x
101
1101101
1101101
1000100001
Verificare: 1101101(2) = 109 ; 101(2) = 5 ; 1000100001(2)= 545
109 x 5 = 545
Alt exemplu: 11010111 101
101
101011
00110
101
00111
101
101
101
===
Verificare: 11010111(2) = 215 ; 101(2) = 5 ; 101011(2) = 43
215 : 5 = 43 rest 0.
Conversia binar-hexazecimal
Se mparte numrul binar n grupuri de cte 4 cifre binare, ncepnd de la ultima, cea mai
din dreapta cifr binar. Dac numrul de cifre binare nu este un multiplu de 4, atunci se
prefixeaz numrul cu zerouri, astfel nct fiecare grup s conin 4 cifre binare. Pentru fiecare

10

Programarea Calculatoarelor

grup de cifre binare se convertete numrul binar de 4 cifre ntr-o cifr hexazecimal echivalent,
conform tabelului de coresponden urmtor:
cifre hexazecimale
echivalent binar
--------------------------------------------------------------------0..............0
0000
1..............1
0001
2..............2
0010
3..............3
0011
4..............4
0100
cifre hexazecimale
echivalent binar
--------------------------------------------------------------------5..............5
0101
6..............6
0110
7..............7
0111
8..............8
1000
9..............9
1001
10............A
1010
11............B
1011
12............C
1100
13............D
1101
14............E
1110
15............F
1111
De exemplu, s se converteasc numrul binar 11000110(2) ntr-un numr hexazecimal:
- se divide numrul n grupuri de cte 4 cifre:
1100 0110
- se convertete fiecare grup ntr-o cifr hexazecimal: C
6
Numrul convertit rezultat va fi deci C6(16).
Conversia hexazecimal-binar
Se convertete fiecare cifr hexazecimal ntr-un grup de 4 cifre binare, conform
tabelului anterior.
De exemplu, s se converteasc numrul 264E n binar:
Se convertete fiecare cifr n binar: 2
6
4
E
0010 0110
0100 1110
Numrul convertit rezultat va fi deci: 0010011001001110(2)
Reprezentarea n simpl precizie. Depiri
n mod obinuit, numerele sunt reprezentate n calculator utiliznd un numr fix de bii:
8, 16, 32, 64 i 80. Aceste dimensiuni sunt multiplii de 8, dup cum organizarea calculatoarelor
are la baz dimensiunea de un octet.
Reprezentarea n care sunt utilizai un anumit numr de bii pentru o valoare numeric se
numete reprezentare n precizie simpl. Atunci cnd se utilizeaz un anumit numr de bii
pentru a reprezenta un numr, exist un anumit interval de valori posibile care pot fi
11

Programarea Calculatoarelor

reprezentate. De exemplu, sunt 28=256 de combinaii posibile de 8 bii, domeniul de valori


posibile pentru a fi reprezentate fiind 0 255. Un numr mai mare dect 255 nu poate fi
reprezentat utiliznd 8 bii. n mod asemntor, 16 bii permit ca domeniu de reprezentare 0
65535.
Atunci cnd rezultatul unui calcul nu poate fi reprezentat cu numrul de bii disponibili,
apare o depire.
De exemplu, la adunarea pe 8 bii a numerelor 150 i 140, rezultatul este 290, care este n
afara intervalului 0 255 i nu poate fi reprezentat pe 8 bii.
n situaia n care apare o depire, biii cei mai puini semnificativi se pstreaz, dar biii
cei mai semnificativi se vor pierde, ceea ce va conduce la o valoare semnificativ mai mic dect
rezultatul corect.
De exemplu, 64(10) + 250(10):
64(10)
01000000(2)
250(10)
11111010(2)
--------------------------------------------------------------------314(10)
(1)00111010(2) - depire
se vor reine cei mai puin semnificativi 8
bii pentru a limita rezultatul la valoarea
maxim a domeniului
58(10)
00111010(2)

Reprezentarea numerelor cu semn


Am vzut c n cazul reprezentrii numerelor fr semn (valori pozitive), intervalul de
valori pozitive care poate fi reprezentat este [0 , 2n-1], unde n este numrul de bii utilizai n
reprezentare:
n
domeniu de valori
---------------------------------------------8 bii
0 255
16 bii
0 65535
32 bii
0 - 2147483647
n binar exist posibilitatea reprezentrii numerelor cu semn, pozitive i negative. Cea
mai uzual modalitate de a reprezenta astfel de numere este reprezentarea n cod complementar
fa de 2 (sau cod complementar). Aceast reprezentare este utilizat deoarece reduce
complexitatea hardware din unitatea aritmetico-logic a procesorului unui calculator: toate
operaiile aritmetice pot fi efectuate de ctre aceleai circuite, indiferent dac numerele sunt
considerate a fi cu semn sau fr semn. Operaiile efectuate pe bii sunt identice, diferena
provenind din interpretarea biilor.
Pentru a obine complementul fa de 2 a unui numr binar, se inverseaz valoarea biilor
numrului i apoi se adun valoarea 1.

12

Programarea Calculatoarelor

De exemplu, complementul fa de 2 a numrului binar 00101001(2) se obine astfel:


00101001(2)
se inverseaz valoarea biilor
11010110(2) +
00000001(2) se adaug valoarea 1
----------------11010111(2)
Prin aceast metod se pot reprezenta numere ntregi din intervalul de valori [-2n-1 , 2n-11], unde n este numrul de bii utilizai n reprezentare.
Primul bit din stnga, bitul cel mai semnificativ, este bitul de semn i are valoarea 0
pentru numere pozitive i valoarea 1 pentru numere negative.
De exemplu, considerm n=8. Intervalul de valori reprezentabile este [-128 , 127] i
reprezentm numrul -72 n cod complementar:
-72(10)

11001000(2)
inversare
10110111(2) +
00000001(2) se adaug valoarea 1
-------------10111000(2)

Obs:
1) n cazul numerelor cu semn reprezentate n cod complementar semnul se pstreaz,
adic primul bit din stnga nu intr n complementaritate.
2) Valoarea numeric a unui numr negativ x reprezentat pe n bii n cod complementar
se calculeaz cu formula:
C2(x) = 2n-|x|
De exemplu, valoarea numeric a numrului -72 pe 8 bii n cod complementar este:
C2(x) = 2n-72 = 256-72 = 184
Verificare: 10111000(2) = 0*20+0*21+0*22+1*23+1*24+1*25+0*26+1*27 = 8 + 16 + 32 + 128 =
184
3) Prin adunarea numrului cu complementul su fa de 2 se obine rezultatul 0.
De exemplu, 72(10) + (-72)10 = 0
Verificare:

01001000(2) + 10111000(2) = 000000000(2)

4) i n cazul reprezentrii numerelor cu semn poate s apar depirea. De exemplu,


dac se efectueaz -100 30:
-100(10)
11100100(2)
inversare
10011011(2) +
00000001(2) se adaug valoarea 1
-------------10011100(2)
13

Programarea Calculatoarelor

-30(10)

10011110(2)
inversare
11100001(2) +
00000001(2) se adaug valoarea 1
-------------11100010(2)

-100 (10) -30(10)

10011100(2) +
11100010(2)
-------------101111110(2) depire: rezultat pozitiv,
Incorect

Reprezentarea n virgul mobil


Se bazeaz pe notaia exponenial (sau tiinific), conform creia un numr real
nenegativ a se exprim sub forma:
a = m x 10E, unde: 1 m < 10
E Z - exponent
m mantis
De exemplu, notaia exponenial a numrului 264.39 = 2.6439 x 102, iar reprezentarea
numrului 0.00026439 este 2.6439 x 10-4.
Obs: condiia ca 1 m < 10 poate fi ndeplinit prin nmuliri sau mpriri repetate ale numrului
x la 10, micornd sau mrind corespunztor exponentul E.
Pentru reprezentarea n calculator se prefer baza 2, astfel nct numrul se va scrie:
a = m x 2E,

unde: 1 m < 2
m = (b0.b1b2b3)(2) cu b0 = 1

Aceast form a numrului se numete form normalizat. De exemplu, numrul 9/2 poate fi
scris ca:
9/2 = 100.1 = (1.001)(2) x 22
Biii care urmeaz dup punct formeaz partea fracionar a mantisei.
Obs: reprezentarea n virgul mobil a unui numr nenul este unic atta timp ct este respectat
condiia ca 1 m < 2.
De exemplu, nerespectnd aceast cerin, numrul 9/2 poate fi scris de asemenea:
9/2 = (0.01001)(2) x 24
Conform standardului de reprezentare IEEE754, reprezentarea numerelor reale n virgul
mobil pe lungime (precizie) simpl (32 bii) se realizeaz astfel:
14

Programarea Calculatoarelor

31 30
23 22
0
s E1.EE8 b1m...b23
Reprezentarea numerelor reale n virgul mobil pe lungime (precizie) dubl (64 bii) se
realizeaz astfel:
63 62
52 51
0
s E1.EE11 b1m...b52
Pentru reprezentarea n precizie simpl exponentul este reprezentat pe 8 bii, ceea ce
implic un domeniu de valori [-127 , 127]. Pentru a nu folosi exponeni negativi s-a introdus
noiunea de caracteristic:
caracteristica = exponent + 2nr. bii exponent -1 -1
Se adaug astfel la exponent o valoare de exces egal cu 127. Pentru reprezentarea
exponentului n dubl precizie, pe 11 bii, se va aduga valoarea 1023.
De exemplu, s se reprezinte numrul 135.74356 n virgul mobil, simpl precizie:
- se convertete numrul n binar:
135 = 10000111(2)
.74356 = .1011(2)
deci 135.74356 = 10000111.1011(2)
- se scrie numrul n form normalizat:
135.74356 = 1,00001111011 x 27
- se calculeaz i se reprezint caracteristica:
7 + 127 = 134 = 10000110(2)
- se finalizeaz reprezentarea:
31 30
23 22
0
0 10000110 00001111011000000000000
Exemplul urmtor realizeaz conversia din formatul de reprezentare virgul mobil
simpl precizie n zecimal a numrului:
31 30
23 22
0
0 10000110 11010110000000000000000
- se transform exponentul n zecimal:
10000110(2) = 134
- se scrie numrul n forma 1.m x 2E-127:
1.1101011 x 2134-127
- se normalizeaz i se convertete n zecimal:
1.1101011 x 27 = 11101011(2) = 1 +2 +8+ 32 +64 + 128 = 235

15

Programarea Calculatoarelor

Teste gril rezolvate


1. Cte numere cu o singur cifr sau simboluri, excluznd zero, sunt necesare
reprezentrii ntr-un sistem de numeraie n baz 60?
a) 60
b) 59
c) 61
2. Care este reprezentarea n cod BCD (format mpachetat) a numrului zecimal 746 ?
a) 010010111 b)011101000110

c)011110000101 d)111100001010

3. Care este valoarea binar (8-bii) a numrul zecimal 175?


a) 10101010 b) 10010010 c) 10011111 d) 11100111
4. Care este valoarea octal a numrului binar 100101001001100100011(2) ?
a) 4511443

b) 4312441

c) 3442112

d) 2314322

5. Care este valoarea hexazecimal a numrului binar 11110110010011011001(2) ?


a) A46F9

b) 8Fa64

c) C86DA

d) F64D9

6. Care este valoarea zecimal a numrului octal 215?


a) 267

b)141

c) 98

d) 216

7. Care este valoarea zecimal a numrului hexazecimal FF?


a) 156

b) 127

c) 255

d) 256

8. Care este valoarea hexazecimal a numrului zecimal FF?


a) 1C7

b) 4D5

c)2B6

d) 5C4

9. care este rezultatul adunrii n binar a numerelor: 10001011(2) i 01010101(2) ?


a) 10110010 b) 11100000 c)10001000

d)11011011

10. Care este Reprezentarea n cod complementar a numrului 11010000 ?


a) 00111000 b) 00110000 c) 10010000 d) 00101000

16

Programarea Calculatoarelor

Probleme rezolvate
1. Ci bii sunt necesari pentru a reprezenta numere ntregi din intervalul [0 , 14000]?
Rspuns:
Cu 13 bii se pot reprezenta numere ntregi pozitive din intervalul de valori [0 , 213-1] = [0 , 8191].
Cu 14 bii se pot reprezenta numere ntregi pozitive din intervalul de valori [0 , 214-1] = [0 ,
16383].
Deci 13 bii nu sunt suficieni, dar cu 14 bii se pot reprezenta valori mai mari dect 14000, deci
numrul de bii necesari este 14.
2. Ce domeniu de numere ntregi i pozitive zecimale se poate reprezenta cu un numr
octal de 4 cifre?
Rspuns:
Un numr octal de 4 cifre poate fi ntre 0000 i 7777, dac se iau n considerare numai numere
pozitive.
0000(8) este echivalentul n zecimal pentru 0
7777(8) este echivalentul n zecimal pentru 4095
Deci, domeniul de valori reprezentabile astfel este [0 , 4095].
3. Dac se adun numerele nousprezece i nou n form binar, va fi rspunsul diferit
dect n cazul n care se adun aceleai numere n form zecimal? Explicaie.
Rspuns:
Forma binar, zecimal, etc. utilizat pentru reprezentarea numerelor nu are nici o influen
asupra rezultatului operaiilor matematice.
4. Numrul 10111010(2) este reprezentarea n cod complementar pe 8 bii a unui numr k.
Care este reprezentarea zecimal a lui k?
Rspuns:
Pentru fiecare numr x reprezentat pe n bii, complement su, y, este calculat ca: y = 2n x x
= 2n y x este reprezentarea n cod complementar a lui y. Prin urmare, putem obine numrul
binar original k prin inversarea tuturor biilor complementului su dup care se adun 1.
Obinem:
10111010(2)
01000101(2) +
00000001(2)
--------------01000110(2)

k= 2 +4 +64 = 70

5. ntr-un sistem digital de 8 bii, n care toate numerele sunt reprezentate n cod
complementar, care este cel mai mare numr pozitiv care poate fi reprezentat cu acei 8 bii?
17

Programarea Calculatoarelor

Care este cel mai mic numr negativ care poate fi astfel reprezentat? Exprimai
rspunsurile n ambele formate: binar (cod complementar) i zecimal.
Rspuns:
Cel mai mare numr pozitiv este 127(10) = 01111111(2)
Cel mai mic numr negativ este -128(10) = 10000000(2)
6. Cum este posibil s fie identificat o depire n momentul efecturii sumei a dou
numere binare, fr a face verificarea prin conversia rezultatului n form zecimal?
Rspuns:
Se va verifica bitul de semn al rezultatului, prin comparare cu biii de semn ai celor dou numere.
7. Asemntor conceptului de cod complementar (fa de 2) pentru numere binare
reprezentate pe n bii, definii conceptul corespunztor pentru baza 10: cod complementar
fa de 10 pentru numere zecimale reprezentate pe n bii. Prezentai i modul de calcul n
acest caz.
Rspuns:
n cazul codului complementar fa de 2 pentru numere binare, domeniul de reprezentare este: [2n-1 , 2n-1-1], unde n este numrul de bii utilizai n reprezentare.
Asemntor, putem defini domeniul de reprezentare pentru cod complementar fa de 10 pentru
numere zecimale reprezentate pe n bii ca fiind [-5 x 10n-1 , 5 x 10n-1-1]. Dac lum de exemplu n
= 2, vom avea dou cifre zecimale, iar domeniul de reprezentare va fi [-50 , 49].
Fiecare numr negativ a va fi reprezentat ca 102 a = 100 a.
De exemplu, dac se calculeaz 20 15 = 20 + (-15) = 20 +(102 15) = 20+ 85 = 105 = 5
deoarece sunt permise doar dou zecimale n reprezentare, iar cifra sutelor este ignorat.
Dac se calculeaz 15 20 = 15 + (-20) = 15 + (102 -20) = 15 + 80 = 95. 95 este de fapt un
numr negativ deoarece este mai mare dect 49, iar dou cifre permit ca domeniu de reprezentare
[-50 , 49]. Valoarea sa efectiv este (102 - 95) = -5.
8. Calculai, n cod complementar fa de 10, cu o reprezentare pe 7 bii, suma: -a b, unde
a = 114(10), iar b = 231(10).
Rspuns:
-a = 107 114 = 9999886
-b = 107 231 = 9999769
-a b = 9999886 + 9999769 = 19999655 = 9999655 deoarece sunt permise doar apte zecimale
n reprezentare, iar prima cifr este ignorat.
Pentru verificarea calculelor, se poate calcula valoarea n zecimal:
107 - a - b = 107 - 9999655 = 345, care este ceea ce reprezint valoarea absolut pentru -114-231
n zecimal.

18

Programarea Calculatoarelor

Probleme propuse
1. Care este numrul de bii necesari pentru a reprezenta numere ntregi din intervalele:
[100 , 200] i [0 , 1000]?
2. ntr-un sistem de 6 bii, reprezentare n cod complementar, care este valoarea zecimal
reprezentat de 100100(2)?
3. Realizai scderile urmtoare folosind reprezentarea n cod complementar pentru
numere negative:
a) 10101(2) 10001(2) b) 11011(2) -1110(2)
c) 100100(2) -100011(2)
4. Completai tabelul de mai jos, realiznd toate conversiile necesare:
Binar
10001

Octal

Zecimal

Hexazecimal

87
2B
72
1010101
201
989
246
1000010101
5. Realizai conversia n cod Gray a urmtoarelor numere binare:
101110(2) 111010(2)
101011(2) 1010100100(2)
6. Realizai conversia urmtoarelor numere din cod BCD n form zecimal:
1000 0111
0011 0111 0011
0111 1000 0110 1001
7. S se reprezinte urmtoarele numere n virgul mobil, simpl precizie:
123.45678
63.2458
546.5479
8. Numrul 10010010(2) este reprezentarea n cod complementar pe 8 bii a unui numr k.
Care este reprezentarea zecimal a lui k?

19

Programarea Calculatoarelor

Laborator 3

3. ALGORITMI: DEFINIIE, PROPRIETI, REPREZENTRI,


VERIFICAREA CORECTITUDINII I
NOIUNI DE PROGRAMARE STRUCTURAT
Un algoritm este un concept folosit pentru a desemna o procedur de calcul bine
definit, constnd dintr-un set finit de instruciuni complet ordonat n timp; procedura pornete
de la o anumit valoare sau un set de valori de intrare i produce ntr-un timp finit o anumit
valoare sau un set de valori, ca ieire. Algoritmul exprim logica complet a soluiei de rezolvare
a unei probleme date.
Date de intrare
Input

Algoritm

Date de ieire
Output

Termenul de "Algoritm" provine din numele matematicianului persan din secolul al IXlea Mohammed al-Khowarizmi: Al-Khowarizmi Algorismus (n latin) algoritm. Dar,
aceeai prezentare a regulilor precise pentru descrierea proceselor de calcul din aritmetic se
ntlnete i n celebra lucrare a lui Euclid, Elementele - un tratat de geometrie, alctuit din 13
cri. ntr-o anecdot scris la 800 de ani de la moartea lui Euclid se relateaz c regele Ptolemeu
I, n ncercarea de a studia aceast lucrare, l-a ntrebat pe Euclid dac nu ar exista o cale mai
uoar ca s neleag geometria, la care Euclid sever ar fi rspuns: " n geometrie nu exist calea
regal !".
n cartea a VII-a din Elemente se regsete de altfel primul i cel mai celebru algoritm
din istorie, Algoritmul lui Euclid pentru determinarea celui mai mare divizor comun a dou
numere.
Proprietile algoritmilor:
1. Exactitate = un algoritm trebuie s fie descris n mod clar i precis; la fiecare
pas, operaia care urmeaz a fi executat este unic determinat, definit i
realizabil, astfel nct s nu existe incertitudine.
2. Generalitate = algoritmul trebuie s rezolve fiecare instan a problemei
respective; algoritmul obine date de ieire pentru orice date de intrare
corespunztoare problemei.
3. Finitudine = un algoritm trebuie s conin un numr finit de pai n execuia sa.
4. Eficien = un algoritm trebuie s conin operaiuni calculabile n mod eficient
i trebuie s ofere rspunsul corect la problema respectiv. Se poate remarca
faptul c proprietatea de "finitudine" este un caz special de "eficien". Dac o
succesiune de etape nu este finit, atunci ea nu poate fi nici eficient.
20

Programarea Calculatoarelor

Etapele rezolvrii unei probleme:


Vom ncerca s detaliem procesul de rezolvare a unei probleme pornind de la aseriunea
matematicianului George Polya: O mare descoperire rezolv o mare problem, dar exist un
grunte de descoperire n soluia oricrei probleme. n cartea sa de referin: How to Solve It,
Polya a conceptualizat acest proces ca o construcie ce cuprinde patru etape principale:
Etapa 1) nelegerea problemei: odat formulat enunul problemei, clar i precis, trebuie
stabilite:
- datele de intrare i informaiile care trebuie obinute prin rezolvarea problemei;
- care sunt condiiile concrete de rezolvare: sunt acestea suficiente sau insuficiente? sunt
redundante? sunt contradictorii?
- exist informaii care lipsesc, sau, dimpotriv, nu sunt necesare?
Etapa 2) Elaborarea unui plan (model) de rezolvare a problemei, stabilirea unei
conexiuni ntre datele i necunoscutele problemei pentru a dezvolta algoritmul corespunztor de
rezolvare, algoritm descris ntr-una dintre modalitile de reprezentare algoritmic.
n acest scop se recomand:
- identificarea unei probleme conexe, asemntoare (atunci cnd este posibil) pentru a putea
vedea dac se poate aplica aceeai tehnic de rezolvare;
- mprirea problemei n subprobleme mai mici i mai uor de rezolvat;
- ncercarea de a rezolva un caz special al problemei sau o problem mai general sau o parte a
problemei.
Etapa 3) Implementarea planului de rezolvare prin codificarea algoritmului rezultat n
etapa anterioar ntr-un limbaj de programare. Se recomand n plus i:
- efectuarea oricror aciuni sau calcule necesare n acest sens;
- verificarea fiecrui pas al algoritmului, intuitiv sau formal.
Etapa 4) Testarea programului i corectarea erorilor:
- testarea programului se realizeaz pe baza mai multor seturi diferite de date de test pentru a
descoperi eventualele erori i greeli de concepie n program; dac n timpul testrii programului
se constat funcionarea defectuoas a acestuia, este necesar reluarea ultimelor dou sau trei
etape n funcie de natura erorilor;
- analiza corectitudinii soluiei n termenii problemei originale: soluia are sens? este plauzibil?
- identificarea unei alte metode de gsire a soluiei; n cazul n care exist mai muli algoritmi de
rezolvare, trebuie ales algoritmul cel mai eficient din punct de vedere al complexitii calculului:
algoritmul cu cel mai redus timp de execuie i cel mai economic spaiu de memorie necesar.
Reprezentarea algoritmilor
Reprezentarea algoritmilor i limbajele de programare s-au influenat reciproc. Exist
astfel diverse modaliti de reprezentare a algoritmilor, care pot fi utilizate n orice combinaie:
- n limbaj natural descriere amnunit prin cuvinte;
- printr-o schem logic reprezentare grafic simpl;
- n pseudocod descriere formal simplificat intermediar ntre limbajul natural i de limbajul
de programare;
- prin convenii grafice de tip diagrame arborescente;
- prin tabele de decizie de tip condiii aciuni.

21

Programarea Calculatoarelor

(I) Schema logic


Reprezentarea prin schem logic a unui algoritm utilizeaz blocuri (operaii) de baz
i/sau structuri de control (formate prin gruparea blocurilor de baz).
Blocuri de baz
Blocul de nceput/sfrit orice schem logic ncepe cu un bloc de nceput i se termin cu un
bloc de sfrit.

Blocul de intrare desemneaz preluarea datelor (valorilor variabilelor) de la dispozitivul de


intrare (de exemplu de la tastatur).

Blocul de ieire desemneaz scrierea rezultatelor (valorilor variabilelor) la dispozitivul de


ieire (de exemplu pe ecranul monitorului).

Blocul de atribuire este utilizat pentru reprezentarea prelucrrilor asupra datelor.

Blocul decizional desemneaz evaluarea unei condiii. n funcie de rezultatul evalurii,


continuarea prelucrrilor poate urmri ramura desemnat cu DA (condiia din blocul de decizie
este adevrat) sau cea desemnat cu NU (condiia din blocul de decizie este fals).

Conectorul logic este utilizat pentru reunirea ramurilor de execuie ale algoritmului.

22

Programarea Calculatoarelor

Conectorul de pagin este utilizat atunci cnd schema logic trebuie continuat pe o alt
pagin. Conectorul conine o liter sau un numr care trebuie s fie identic cu cel de pe pagina
unde se continu prelucrarea.

Structuri de control
Structurile de control sunt grupri de blocuri de baz ce apar frecvent n schemele logice
i pentru care sunt definite instruciuni specifice n limbajele de programare (n situaia noastr n
C++).
Structura secvenial (secvena) grupeaz de obicei mai multe operaii (instruciuni)
elementare (iniializri de variabile, prelucrri asupra datelor, tiprire a rezultatelor, etc.).

Structura alternativ (decizia) permite ramificarea simpl a execuiei n funcie de valoarea de


adevr a condiiei. Cele dou ramuri se exclud mutual.
Este posibil ca una dintre ramuri s fie vid (s nu conin alte blocuri).

Structura repetitiv condiionat anterior (bucla/ciclul cu test iniial) secvena se execut


repetitiv ct timp condiia este adevrat. Secvena se mai numete n aceast situaie i corpul
buclei (corpul ciclului). Dac rezultatul testrii iniiale a condiiei este fals, secvena nu este
executat nici mcar o singur dat.
23

Programarea Calculatoarelor

Obs: Pentru structura repetitiv condiionat anterior, condiia testat pentru repetarea
secvenei se scrie identic n pseudocod i n C++.
Pentru ca secvena s nu se repete la infinit, n cadrul acesteia trebuie modificate
variabilele ce sunt folosite n condiia testat pentru repetarea buclei astfel nct la un moment
dat s se poat realiza ieirea din bucl.
n afar de structurile de control menionate anterior i care permit descrierea oricrui
algoritm, mai exist cteva structuri de control derivate din acestea ce sunt folosite uzual i
anume:
Structura repetitiv condiionat posterior (bucla/ciclul cu test final) secvena (corpul buclei)
se execut repetitiv pn cnd condiia devine adevrat. Spre deosebire de bucla cu test iniial,
n cazul buclei cu test final secvena se execut cel puin o dat.

Obs: Pentru structura repetitiv condiionat posterior condiia testat pentru ieirea din
bucl trebuie scris negat n C++ fa de pseudocod. n pseudocod secvena se repet pn cnd
condiia devine adevrat, iar n C++ secvena se repet atta timp ct condiia este adevrat.
Pentru ca secvena s nu se repete la infinit, n cadrul acesteia trebuie modificate
variabilele ce sunt folosite n condiia testat pentru repetarea buclei astfel nct la un moment
dat s se poat realiza ieirea din bucl.
Structura repetitiv (bucla/ciclul) cu contor este derivat din structura repetitiv condiionat
anterior. Secvena se execut repetitiv de un numr prestabilit de ori controlat de valoarea
variabilei contor. Pentru ca repetarea s nu se fac la infinit, este necesar incrementarea
(decrementarea) variabilei contor cu valoarea pas (care trebuie s fie diferit de zero).
24

Programarea Calculatoarelor

Structura decizional multipl este o structur de control derivat din structura alternativ
permite ramificarea multipl a execuiei. Dac nici una dintre condiiile testate nu a fost
ndeplinit, execuia este continuat n <secvena alternativ> dac aceasta a fost specificat.

Observaie: n C++ structura switch este puin diferit fa de celelalte structuri de


control.
Valorile val_1 ... val_n sunt de fapt constante, secvenele de instruciuni nu sunt ncadrate
de acolade i de asemenea pentru fiecare secven n parte de obicei apare n final instruciunea
break;
Instruciunea switch evalueaz variabila/expresia a i verific daca aceasta este
echivalent cu val_1, situaie n care se execut secvena de instruciuni imediat urmtoare pn
la instruciunea break. Cnd este ntlnit instruciunea break programul sare la sfritul
structurii switch. Dac a nu este egal cu val_1, se trece la evaluarea cu val_2, i aa mai departe.
n final, dac nici una dintre evaluri nu a fost adevrat, se execut instruciunile specificate
25

Programarea Calculatoarelor

dup default: i apoi se iese din structura switch. Eticheta default: i instruciunile scrise dup
aceasta sunt opionale.
Dac instruciunea break lipsete, se trece la execuia secvenei pentru val_2 (fr a se
mai verifica egalitatea), apoi la secvena pentru val_3 i aa mai departe (inclusiv secvena
pentru default) pn la terminarea structurii sau pn la prima instruciune break.
Instruciunea break poate fi folosit de asemenea n orice alt structur repetitiv pentru a
iei din bucl fr a mai fi necesar respectarea condiiei de ieire din aceasta.
(II) Limbajul pseudocod
Apariia limbajelor Pascal i C au impus limbajul pseudocod n domeniul reprezentrii i
elaborrii algoritmilor.
Limbajul pseudocod folosete o scriere similar limbajelor de programare moderne. El
permite att descrierea instruciunilor algoritmului, ct i descrierea exact a tipului datelor cu
care lucreaz algoritmul.
Date

Tipul datelor:

ntreg
real
numerice
logic
ir de caractere

Natura datelor:

constante
variabile

Organizarea datelor:

tablouri

liste

unidimensionale-vectori
bidimensionale-matrici
n-dimensionale
stive
cozi
ansamble

Operaii cu date
- date ntregi: +, -, *, /, ^ cu rezultatul ntreg sau real
< , >, , =, , , , cu rezultatul de tip logic
- date reale: aceleai operaii ca n cazul datelor ntregi, cu rezultatul real n cazul operatorilor
aritmetici i logic n cazul operatorilor relaionali.
- date logice: disjuncia ( ) , conjuncia ( ) , negaia (- )
- iruri de caractere: concatenarea rezultat de tip ir de caractere, comparaiile (bazate pe
ordinea lexicografic) rezultat de tip logic.
- stive, cozi, ansamble: extragerea i respectiv introducerea unui element ntr-o stiv, coad sau
ansamblu (x
A, x
A) precum i verificarea dac o stiv, coad sau ansamblu este vid
(A=)
Cuvinte cheie: cuvinte din limba englez care identific un tip de date sau descriu o instruciune.
26

Programarea Calculatoarelor

Instruciuni: Din punct de vedere al scrierii instruciunilor, o instruciune poate ocupa mai
multe rnduri, sau pe un rnd pot fi scrise mai multe instruciuni. Instruciunile vor fi separate,
ntre ele, folosind caracterul ';'.
Instruciuni declarative: integer, real, bool, char, array, stack, queue, heap urmat de un ir
de variabile separate ntre ele prin virgul, variabile pentru care indicm c au tipul respectiv.
Exemple: integer a, b, c; array V(n), A(m,n) ; stack S
Instruciuni efective, executabile
1) Instruciunea de atribuire
v
e
unde v este o variabil, iar e este o expresie de acelai tip (integer, real, bool, char)
sau (v1, v2, ., vn)
(e1, e2, ., en)
care realizeaz simultan cele n atribuiri.
2) Instruciunile de citire/scriere
read a1, a2, , an
write a1, a2, , an
3) Instruciunea de selecie simpl if-then-else
if p then S1
[else] S2
endif
unde p este un predicat, iar S1 i S2 sunt secvene de instruciuni.
Se evalueaz predicatul p i n cazul n care valoarea este true, se trece la executarea secvenei
de instruciuni S1. Dac valoarea este false se trece la execuia secvenei S2, iar dac aceasta nu
apare, se trece la execuia instruciunii urmtoare instruciunii if.
4) Selecia multipl
case p1: S1
p2 : S2
...........
pn : Sn
[else] Sn+1
endcase
unde S1, ., Sn sunt secvene de instruciuni, iar p1, ., pn sunt predicate satisfcnd
condiiile:
pi pj = 0 () i j p1 p2 .. pn = 1 dac nu exist ramura else.
Dac p1 este TRUE, se trece la execuia secvenei S1dup care se trece la instruciunea
urmtoare dup endcase. Analog pentru p2, ..., pn. Dac nici un predicat nu a fost adevrat i
exist ramura else, se trece la execuia secvenei corespunztoare, iar dac nu exist ramura else,
se trece direct la instruciunea urmtoare dup endcase.
27

Programarea Calculatoarelor

5) Instruciunea repetitiv while (cu test iniial)


while p
S
repeat
Secvena de instruciuni S se execut repetat atta timp ct predicatul p este TRUE.
6) Instruciunea repetitiv do (cu test final)
do
S
until p
Spre deosebire de instruciunea while, instruciunea do ncepe cu executarea secvenei S i nu cu
verificarea predicatului p.
7) Instruciunea repetitiv for (cu numr cunoscut de pai)
for v = e1, e2 [e3]
S
repeat
unde v este o variabil numeric (contor), iar e1, e2, e3 sunt expresii aritmetice cu e3 0. Dac
e3 lipsete, se consider egal cu 1. Efectul este executarea secvenei S de n ori.
8) Instruciunea exit
exit
determin trecerea la execuia primei instruciuni care urmeaz celui mai interior ciclu do, while,
for, ieindu-se deci din acel ciclu.
Proceduri
Un program n limbajul algoritmic este o succesiune de una sau mai multe proceduri.
Declararea unei proceduri const n :
procedure nume [ (list de parametrii)]
[ declaraii
[ secven de instruciuni
end
Lista de parametrii este un ir de variabile desprite prin virgul ce permit transmiterea datelor
ntre proceduri.
O procedur poate apela o alt procedur:
Fie procedura procedure nume [ (p1, , pn)]
Adresarea ei se face prin call nume [ (a1, , an)], unde a1, , an sunt argumente care pstreaz
ordinea, tipul i dimensiunile listei parametrilor p1, , pn.
n cazul unei proceduri, lista de parametri conine att parametri de intrare, ct i
parametri de ieire (n urma apelrii procedurii, vor stoca rezultatele calculate de instruciunile
procedurii).
28

Programarea Calculatoarelor

Laborator 4

4. ELEMENTE DE BAZ ALE LIMBAJULUI C++


VOCABULAR, EXPRESII, OPERATORI
1. Precizai care dintre declaraiile de mai jos reprezint definiii valide de variabile:
int x = -20; // valid
unsigned int = 10; // invalid: lipsete numele variabilei
unsigned long a = 5, b = 3; // valid
int 3x; // invalid: 3x nu poate fi un identificator
unsigned double a = 10.0; // invalid: tipul double nu poate fi unsigned
float a = 10.54F; // valid
2. Expresia: x%10 > 9
a) poate fi fals sau adevrat, n funcie de valoarea lui x
b) este adevrat ntotdeauna
c) este fals ntotdeauna
d) este incorect din punct de vedere sintactic
3. Care dintre expresiile de mai jos produc la evaluare valoarea 15:
a) 10/9 + 14
b) 5 * 2+6
c) 30 % 2
d) 3(5)
4. Folosind operatorul condiional, scriei o secven de cod care s testeze dac trei
numere naturale introduse de la tastatur: a, b, c sunt n ordine cresctoare sau nu.
int a, b, c;
cin>>a>>b>>c;
cout<<(a<=b && b<<c ? ordine cresctoare: ordine oarecare)<<endl;
5. Dac a este o variabil de tipul int, care dintre urmtoarele expresii este ntotdeauna
adevrat?
a) (a > 0) && (a == 0)
b) (a >= 0) || (a == 0)
c) (a > 0) && ( a <= 0)
d) (a > 0) || ( a <= 0)
6. Care dintre expresiile de mai jos exprim formula:

29

Programarea Calculatoarelor

a)
b)
c)
d)

ab
c*d
ln( x * y )
sqrt(pow(a,b)/(c*d))/log(x*y)
pow(pow(a,b)/(c*d), 1/2)/ln(x*y)
sqrt(pow(a,b)/(c*d))/ln(x*y)
pow(pow(a,b)/(c*d), 1/2)/log(x*y)

7. Instructiunea corect de definire pentru o variabil ntreag numit suma este:


a) suma : integer;
b) integer suma;
c) int suma;
d) suma int;
8. Care este valoarea expresiei urmtoare?
(20 - 10) / (30 + 40) + (60 - 50.0) / 70
a) -0.142857 b) 0.142857 c) 0 d) 0.000000
9. Care va fi valoarea variabilelor urmtoare dup iniializare?
double a = 3 * int(3.14); // a va avea valoarea 9
long b = 2*3.14 - 6; // b va avea valoarea 0
char c = 'a' + 3; // c va avea valoarea d
10. Care dintre expresiile de mai jos nu este echivalent cu expresia:
if (num != 10):
a) if (num > 10 || num < 10)
b) if ( !(num == 10))
c) if (num 10)
d) if ( !(num 10))
11. Expresia:
!(p && q) este echivalent cu:
a) !p || !q

b) !p && !q

c) !p && q

d) p || q

12. Care dintre expresiile de mai jos exprim formula:


ab
* e , a, b, c, d, e fiind variabile de tip double.
cd
a) a-b / c+d * e;
b) (a-b) / (c+d) * e;
c) (a-b)/c+d * e;
d) a-b / (c+d) * e;
13. Care dintre expresiile de mai jos exprim o ptrime (numr real):
30

Programarea Calculatoarelor

a) 1/4
b) 1%4
c) 1./4
d) 1.%4
14. Adugai paranteze suplimentare urmtoarelor expresii pentru a indica n mod explicit
ordinea de evaluare a operatorilor ce compun respectivele expresii:
i) (a > b - c && a <= b + c || a = = 0)
(((a > (b c)) && (a <= (b + c))) || (a == 0))
ii) (++a * b-- / ++a b--)
(((++a) * (b--)) / ((++a) b--))
iii) (a < b ? c < b ? b * c + 5 : b / c - 5 : b + c)
((a < b) ? ((c < b) ? ((b * c) + 5) : ((b / c) - 5)) : (b + c))
15. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:
const int x=10; // linia #1
- -x; // linia #2
cout<<x<<endl; // linia #3
a) 10 b) -10 c) Eroare la linia #2 d) Eroare la linia #3
16. Care este valoarea expresiei:
10 / 20 - 10 % 3 * 3 + 3
a) 2

b) 0

c) 3

d) 1

17. n ce condiii secvena de mai jos va afia da?


if (valoare == 10 || 1) cout<<"da";
a) cnd valoare este 10

b) cnd valoare este 10

c) ntotdeauna

d) niciodat

18. Scriei cte o expresie pentru :


i) A testa dac un numr natural a este impar.
n%2 != 0
ii) A testa dac un caracter c reprezint o cifr.
c >= '0' && c <= '9'
iii) A testa dac un caracter c reprezint o liter.
(c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
iv) A testa dac un numr a este par i pozitiv sau dac este impar i negativ.
31

Programarea Calculatoarelor

(n%2 == 0 && n >= 0) || (n%2 != 0 && n < 0)


19. Ce va aprea afiat n urma execuiei instruciunii:
cout<<(8 / 2 * 5 % 3 - 10+ (9/5));
a) 1
b) 2
c) -7
d) -9
20. Ce se va afia n urma execuiei urmtoarei instruciuni:
cout << ((1+2*(3/2+(40%3*3)*2)-1)+10);
a) 20 b) 24 c) 30 d) 20
21. Care dintre expresiile de mai jos exprim formula:
1
, x i y fiind variabile de tip double.
x * y 1
a) 1/(xy+1)
b) 1/x*y+1
c) 1/(x*y+1)
d) 1/xy+1
22. Care dintre urmtoarele expresii este adevrat dac i numai dac valorile
variabilelor x i y sunt numere naturale consecutive?
a. x-y==1
b. (x==1) && (y==2)
c. (x-y==1) && (y-x==1)
d. y=x1
e. (x-y==1) || (y-x==1)

32

Programarea Calculatoarelor

Laborator 5
5. INSTRUCIUNI
1. Dac se introduce de la tastatur pentru variabila a valoarea 100, ce se va afia la
terminarea execuiei secvenelor de cod urmtoare:
i)
if (a >= 0)
if (a < 50)
cout << "valoarea lui a este mica"<<endl;
else
cout << "valoarea lui a este negativa"<<endl;
Rspuns: mesajul afiat va fi: "valoarea lui a este negativa" deoarece compilatorul asociaz
cuvntul cheie else cu cel mai apropiat if care l precede. Practic, aranjarea corect a liniilor
de cod n acest caz este:
if (a >= 0)
if (a < 50)
cout << "valoarea lui a este mica"<<endl;
else
cout << "valoarea lui a este negativa"<<endl;
ii)
if (a >= 0)
{
if (a < 50)
cout << "valoarea lui a este mica"<<endl;
}
else
cout << "valoarea lui a este negativa"<<endl;
Rspuns: n acest caz nu va fi afiat nici un mesaj.
2. Ce se va afia la terminarea execuiei programului urmtor:
void main()
{
int a;
// double b;
a= 10;
b=20;
cout<<a+b<<endl;
}
33

Programarea Calculatoarelor

a) Eroare: identificator nedeclarat

b) 30 c) 30.00

d) 30.0

3. Care este valoarea variabilei i la terminarea execuiei urmtoarei secvene de cod:


i = 0;
while(i <=50)
i += 5;
a) 50 b) 55 c) 45 d) 5
4. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:
int a=50, b=10;
while (a > b)
{
a -= 5;
b += 5;
}
cout << a << endl;
a) 20 b) 30 c) 40 d) 50
5. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:
int a = 10;
if(a = 5)
a ++;
cout << a;
a) 10 b) 6 c) 5 d) 0
6. n secvena de mai jos, de cte ori are loc ciclarea?
int a=10, b=10, c=20, contor=0, suma=0;
do
{
if (a>=b) suma++;
cout<<suma;
contor++;
} while (a<c);
a) 0

b) infinit

c) 10 d) 1

7. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int a=10, b=20;
a *= (20+b)*a;
cout << valoarea: <<(20+b)*a;
Rspuns: valoarea: 160000
8. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:
34

Programarea Calculatoarelor

num = 0;
while (num < 10)
{
cout<<num<< ;
num = num + 1;
}
a)
b)
c)
d)

0123456789
0 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1234567890

9. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int a = 15, b = 10, c = 5;
if (c >= b && a) b--;
else if (b <= c)
{
a--;
if (a<b)
c--;
}
cout << a*b*c << endl;
a) 700

b)800

c)750

d) 500

10. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int a = 0, b = 20, c;
if(a) c = 15;
else c = 20;
if(b) c = 5;
else c = 10;
cout << c;
a) 15 b) 5

c) 20 d) 10

11. Care dintre urmtoarele instruciuni C++ este corect scris din punct de vedere
sintactic?
a) if a==1 cout << corect
b) if(a==1) cout << corect;
c) if(a==1) cin << corect
d) if(a==1) cout >> corect;
12. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:
int a = 20, b=85;
while((b - a) % 3)
{
cout<<b<<" ";
35

Programarea Calculatoarelor

b -= 10;
}
a) 85 75

b) 85 75 65 55

c) 80 70 60

d) 80 70 60 50

13. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


float x = 50/8;
int y;
y = x;
cout << y/6 + y/6.0 + ceil(x/6);
a) 7

b)8

c)3

d) 5

14. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int x = 10;
if(x = 5)
if (x == 10) cout << x;
else
cout << ;
cout << 55;
a) 10 55

b) 55 c) 5

d) 10

15. Care dintre secvenele de atribuiri de mai jos sunt echivalente cu atribuirea:
v *= suma++; ?
a) suma = suma + 1; v = v * suma;
b) v= v * suma;
c) v = v * ++suma;
d) v = v * suma; suma = suma + 1;
16. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:
int i;
for(i = 1; i<= 1; i++)
cout<<i<< ;
cout<<i<<endl;
a) 1 0

b) 1 1

c) 1 2

d) 0 0

17. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int a = 10, b = 20, c = 30;
if (a < 5)
if (b < 10) cout << "unu";
else cout << "doi";
else if (c > 20)
36

Programarea Calculatoarelor

cout << "trei";


else
cout << "patru";
a) unu

b) trei

c) doi

d) patru

18. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int x = 10, y = 0;
if (x)
cout<< 4;
cout<< 5;
if (y)
{
cout<< 6;
cout<< 7;
}
a) 45

b) 67

c) 4567

d) 456

19. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int x = 2;
do
{
cout<<x<<" ";
x--;
cout<<endl;
} while(x<0);
a) 2

b) 2 1 0 -1

c) 2 1

d) 2 1 0 -1 -2

20. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int a = 10;
while ( a = 5 )
{
a--;
cout << a << " ";
}
a) 10

b) 4 4 4. c) 20

d) 1

21. Ce se va afia la terminarea execuiei urmtoarei instruciuni:


if(10) cout<<"da";
else cout<<nu;
a) da b) nu c) da nu

d) nu se afieaz nimic
37

Programarea Calculatoarelor

22. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int i=0, j=0;
for (i =20 ; i>= 5; i -= 5)
{
cout << i << endl;
for (j=0; j < 1;j++)
{
cout << (i + j) <<" ";
}
}
a) 20
b) 20
c) 20
20 15
15 10
20 10
15 10
10 5
10 5
10 5
5
5

d) 20
15 10
10
5

23. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


for (int i = 1; i < 10; i++)
{
if( i > 5 ) break;
else continue;
cout << i;
}
a) 1 2 3 4 5 6 7 8 9

b) 5

c) nimic

d) 1 2 3 4

24. Care dintre instruciunile for de mai jos produc acelai rezultat ca urmtoarea
secven de instruciuni?
int a = 1;
do
cout << a++;
while ( a <= 10 );
a)
b)
c)
d)

for(int a=1; a<10; a++) cout<<a;


for(int a=0; a<10; ) cout<<++a;
for(int a=0; a<11; a++) cout<<a;
for(int a=0; a<11; a++)cout<<++a;

25. Ce se va afia la terminarea execuiei urmtoarei secvene de cod:


int i = 1, suma = 0;
for ( ; i <= 10; i *= 2, suma += i);
cout << suma;
a) 0
38

b) 30 c) 100 d) 20

Programarea Calculatoarelor

Laborator 6

6. ALGORITMI CORESPUNZTORI UNOR PRELUCRRI


ELEMENTARE REPREZENTAI NSCHEM LOGIC /PSEUDOCOD
Partea nti
Algoritmi reprezentai n schem logic
1. Se citesc numere pn la introducerea valorii 0. Aflai suma lor.
START
s=0

CITETE n
NU
DA
n#0

DA
s=s+n

N
U

SCRIE s

CITETE n
STOP

2. Aflai suma numerelor de trei cifre.


START

s=0
i=100

STOP
NU

SCRIE s

DA

i#1000

s=s+i
i=i+1

3. Se citesc valorile pentru dou variabile ntregi (a i b) i se afieaz care variabil este
mai mare precum i valoarea acesteia.

39

Programarea Calculatoarelor

Programul scris n C++


#include<iostream.h> // pentru functiile cin si cout
#include<conio.h> // pentru functiile clrscr si getch
void main()
{
clrscr(); // sterge ecranul
int a, b;
cout << "a="; cin >> a;
cout << "b="; cin >> b;
if(a>b)
{
cout << "a este mai mare" << endl;
cout << "a=" << a << endl;
}
else
if(a==b)
{
cout << "a identic cu b" << endl;
cout << a << endl;
}
else
{
cout << "b este mai mare" << endl;
cout << "b=" << b << endl;
};
// intrerupe executia pana cand este apasata o tasta
40

Programarea Calculatoarelor

cout << endl << "Apasati o tasta...";


getch(); // citeste un caracter de la consola fara sa il afiseze
};

Probleme rezolvate n pseudocod


1. S se determine aria unei suprafee determinate de o linie poligonal nchis P = P1 P2
....Pn, unde Pi (Xi, Yi), i = 1...n sunt determinate de coordonatele carteziene (Xi, Yi), i = 1,
n.
Obs:

1
2

(x y
i 1

i 1

xi 1 yi ) , unde xn+1 = x1, yn+1 = y1


P9

P7

P10

P6
P12
P11

P8

P5

P13

P4

P14
P2

P3

P1

Soluie:
read n;
array x[n+1], y[n+1];
for i = 1, n
read xi , yi
repeat;
xn+1 x1 ; yn+1 y1 ;
s 0;
for i = 1, n
s s + xi * yi+1 - yi * xi+1
repeat;
s abs (s/2);
write s;

41

Programarea Calculatoarelor

2. S se determine valoarea numrului Pi din dezvoltarea n serie:


Pi/4 = 1 1/3 + 1/5 1/7 + lundu-se n considerare n termeni
Soluie:
read n;
s 0 ; termen 1;
for i = 1, n
s s + termen / (2 * i 1);
termen - termen
repeat;
pi 4 * s
write pi;
3. Se citete de la tastatur un numr natural n . S se afieze suma cifrelor acestui numr.
Obs:
a mod b = restul mpririi ntregi a lui a la b
a div b = ctul mpririi ntregi a lui a la b
Soluie:
read n;
s 0;
while n 0
s s + n mod 10;
n n div 10
repeat
write s;
4. Se citete de la tastatur un numr natural n . S se afieze numrul rsturnat (citit de la
sfrit spre nceput).
Soluie:
read n;
ninv 0;
while n 0
ninv ninv*10 + n mod 10;
n n div 10;
repeat
write ninv;
5. S se verifice dac un numr natural n este prim.
Soluie:
read n; prim 1;
42

Programarea Calculatoarelor

if n = 1 n = 0

then prim 0
else for i = 2, n div 2
if n mod i = 0 then prim 0
endif
repeat;

endif;
if prim = 1 then
write Nr. prim
else
write Nr. neprim
endif;
6. S se afieze primele nr numere prime.
Soluie:
read nr; n 2; j 0;
/* j contorizeaz numrul de numere prime*/
while j < nr
prim 1;
for i = 2, int(sqrt(n))
if n mod i = 0 then
prim 0
endif;
repeat;
if prim = 1 then
write n; j j+1;
endif;
n n+1;
repeat;
7. Se citete de la tastatur un numr natural n . S se afieze descompunerea sa n factori
primi n formatul factor ^ exponent.
Soluie:
read n;
i 2;
/* ncepnd cu i = 2 verificm dac i este divizor al lui n*/
while n 1
fm 0;
/* n fm contorizm de cte ori s-a mprit n la i */
while n mod i = 0
fm fm + 1; n n div i
repeat;
if fm 0 then write i, ^, fm
endif;
i i +1;
repeat;
43

Programarea Calculatoarelor

8. S se afieze primele nr numere perfecte. Un numr se numete perfect, dac este egal cu
suma divizorilor lui (mai puin el).
Soluie:
read nr;
n 6;
// cel mai mic numr perfect este 6
j 0;
// n j contorizm numrul de numere perfecte
while j < nr
perfect 0;
s 0;
for i = 1, n div 2
if n mod i = 0 then
s s +i
endif;
repeat;
if s = n then
perfect 1
endif;
if perfect = 1 then
write n;
jj+1
endif
n n + 1;
repeat;
9. Se citesc de la tastatur dou numere reale a i b. Scriei un algoritm care s realizeze
interschimbarea valorilor numerelor:
a) folosind o variabil auxiliar
b) fr variabile auxiliare
Soluie:
a) metoda de interschimbare se bazeaz pe principiul celor trei pahare:
pas 1: Se golete primul pahar n paharul auxiliar;
pas 2: Se golete al doilea pahar n primul pahar (rmas gol);
pas 3. Se golete paharul auxiliar n al doile pahar (rmas gol).
read a, b
aux a; a b; b aux;
write a, b
b) metoda de interschimbare se bazeaz pe operaiile de adunare i de scdere a celor dou
numere:
read a, b
a a-b; b a+b; a b-a;
44

Programarea Calculatoarelor

write a, b
10. Conversii dintr-o baz de numeraie n alt baz de numeraie
a) Algoritm de conversie a unui numr scris n baza 10 ntr-o alt baz b cu b 9
Soluie:
read n10, b; // n10 este numrul scris n baza 10
nb 0; // nb este numrul convertit n baza b
p 1;
while (n10 0)
nb nb +p*(n10 mod b);
p p*10;
n10 n10 div b
repeat
write nb
b) Algoritm de conversie a unui numr din baza b n baza 10
Soluie:
read nb, b; // nb este numrul scris n baza b
n10 0; // n10 este numrul convertit n baza 10
p 1;
do
n10 n10 +p*(nb mod b);
p p*b;
nb nb div 10
until (nb=0)
write n10
11. Se citete de la tastatur un numr natural n. S se verifice dac este palindrom, adic
citindu-l de la sfrit spre nceput se obine acelai numr.
Obs: Algoritmul calculeaz inversul numrului n prin extragerea pe rnd a ultimei cifre din
numrul n i compune unui nou numr cu aceste cifre.
Soluie:
read n;
nrn; // n nr salvm numrul iniial n
n_inv0; //se iniializeaz inversul numrului cu valoarea 0
while nr 0
n_inv n_inv *10 +nr mod 10;
nrnr div 10
repeat
45

Programarea Calculatoarelor

if n_inv = n then write este palindrom


else write nu este palindrom
endif
12. Fiind dat un interval [a,b] cu a i b numere naturale citite de la tastatur, a < b, s se
afieze toate palindroamele din acest interval.
Soluie:
read a,b;
for n=a, b
nrn;
n_inv0;
while nr 0
n_inv n_inv *10 +nr mod 10;
nrnr div 10
repeat
if n_inv = n then
write n este palindrom
endif
repeat
13. Se citete de la tastatur un vector cu n componente reale.
S se calculeze triunghiul de perimetru maxim ce se poate forma din aceste numere, iar n
caz c nu se poate forma nici un triunghi, s se afieze un mesaj corespunztor.
Soluie:
read n;
array v[n];
for i = 1, n
read vi
repeat;
for i = 1, n 1
for j = i+1, n
if vi < vj then
aux vi;
vi vj;
vj aux;
endif
repeat
repeat;
gasit 0;
i 1;

46

Programarea Calculatoarelor

while (i< n-2) (gasit = 0)


if vi < vi+1 + vi+2 then
p vi + vi+1 + vi+2;
write p;
gasit 1;
endif
repeat
if gasit = 0 then write nu s-a putut forma nici un triunghi
endif;
14. Se citete de la tastatur un vector cu n componente ntregi v 1, v2, ., vn. S se rein
ntr-un vector U toate numerele, fiecare valoare o singur dat (deci U are numai
componente distincte).
Soluie:
array v[n], u[n]; read n;
for i = 1, n
read vi
repeat;
u1 v1 ; k 1 ;
/* k contorizeaz poziiile din vectorul U */
for i = 2, n
/* cu indicele j parcurg vectorul U*/
r 0 ; j 1 ; /* dac vi aparine mulimii U format din k
elemente, r va lua valoarea 1 */
while (j k) (r = 0)
if vi = uj then r 1
else j j + 1
endif
repeat
if r = 0 then /* dac vi nu aparine mulimii U, atunci l adaug
pe poziia k+1 */
k k + 1;
uk vi
endif
repeat;
for j = 1, k
write uk
repeat;
15. Fiind dat matricea A(nxm) i matricea B (mxp), s se calculeze n matricea C(nxp)
produsul celor dou matrici.
m

Obs: ci,j = ai,1 * b1,j + ai,2 * b2,j + + ai,m * bm,j =

a
k 1

i ,k

bk , j

Soluie:
47

Programarea Calculatoarelor

read n, m, p; array a[n,m], b[m,p], c[n,p];


for i = 1, n
for j = 1, m
read ai,j
repeat
repeat;
for i = 1, m
for j = 1, p
read bi,j
repeat
repeat;
for i = 1, m
for j = 1, p
ci,j 0;
for k = 1, m
ci,j ci,j + ai,k * bk,j ;
repeat
repeat
repeat;
for i = 1, n
for j = 1, p
write ci,j ;
repeat
newline
repeat
16. Fie ecuaia de gradul al doilea cu coeficieni reali ax2+bx+c=0 cu a0, a, b i c fiind citite
de la tastatur. Scriei un algoritm care, fr a calcula rdcinile ecuaiei, s determine
natura i semnul acestora.
Obs: se utilizeaz relaiile lui Viete: x1+x2 = S = -b/a, x1*x2 = P = c/a
Soluie:
read a,bc;
deltab*b 4*a*c;
if delta 0 then
S -b/a ; P c/a;
if S 0 then
if P > 0 then write x1 >0 i x2>0
else if P=0 then write x1=0 i x2>0
else write x1>0 i x2>0,
cu |x1|>|x2|
endif
endif
48

Programarea Calculatoarelor

else
if P > 0 then write x1<0 i x2<0
else if P=0 then write x1=0 i x2<0
else write x1>0 i x2<0,
cu |x1|<|x2|
endif
endif
endif
else write ecuaia nu are soluii numere reale
endif
17. Inmulirea a la russe: Se consider urmtoarea metod de nmulire (numit
nmulirea a la russe) a dou numere naturale nenule x i y:
Se scriu denmulitul i nmulitorul pe aceeai linie, n dou coloane alturate. Se mparte
denmulitul la 2, succesiv, ignornd restul, pn cnd numrul din prima coloan devine egal cu
1. n acelai timp, se nmuleste nmulitorul cu 2 attea etape cte au fost necesare mpririi
denmulitului pentru a ajunge la valoarea 1. n coloana a treia se adun toate valorile de pe
coloana a doua care corespund unor valori impare aflate pe prima coloan.
Exemplu: fie x=25 i y=16
Prin applicare algoritmului de mai sus, se va obine configuraia urmtoare:
x
25
12
6
3
1

y
16
32
64
128
256

rest
1
0
0
1
1

suma
16

128
256
---------400

Obs: n matematic, aceast metod de nmulire (de asemenea, cunoscut sub numele de
nmulire egiptean sau nmulire etiopian), este una dintre cele dou metode de nmulire
utilizate de scribi.
Este o metod sistematic pentru nmulirea dou numere care nu are nevoie de tabla nmulirii,
are nevoie numai de nmulire i mprire la 2, i de adunare.
Prin aceast metod se realizeaz de fapt conversia n baza 2 a primului numr: resturile obinute
prin mpririle succesive la 2 formeaz cifrele reprezentrii n baza doi.
Produsul celor dou numere se obine prin nmulirea succesiv a celui de al doilea numr cu
puteri ale lui 2 i prin nsumarea acelor produse care corespund unor cifre nenule n
reprezentarea binar a primului numr.

49

Programarea Calculatoarelor

Soluie:
read a,b; array x[100], y[100];
i1; xia; yib;
sum0;
while xi>1
xi+1xi div 2;
yi+12*yi;
ii+1;
repeat
while i>0
if xi mod 2 =1 then
sumsum+yi;
endif
ii-1;
repeat
write sum
18. Calculul valorii unui polinom ntr-un punct dat.
Se consider polinomul P cu coeficieni reali, definit prin:
p(x) = anXn + an-1Xn-1 ... + a1X + a0
unde ai (i = 0, 1, ..., n) sunt numere reale si reprezint coeficienii polinomului P.
Se cere s se calculeze valoarea polinomului n punctul dat x0.
Obs: Pentru calculul valorii polinomului P pentru o valoare dat x = x 0 se poate aplica schema
lui Horner, care const ntr-o aranjare convenabil a polinomului P astfel nct calculele s poat
fi executate cu un numr ct mai mic de operaii.
Pentru reprezentarea polinomului se va utiliza un tablou de coeficieni al crui numr de
elemente este determinat de gradul polinomului i nu depinde de numrul de termeni nenuli din
polinom.
Soluie:
array a[n];
read n, x0, a0,,an;
pan;
in-1;
do
pp*x0+ai;
ii-1;
until i=0
write p

50

Programarea Calculatoarelor

19. Adunarea a dou polinoame.


Se consider polinoamele P i Q cu coeficieni reali, definite prin:
p(x) = anXn + an-1Xn-1 ... + a1X + a0
unde ai (i = 0, 1, ..., n) sunt numere reale si reprezint coeficienii polinomului P.
q(x) = bmXm + bm-1Xm-1 ... + b1X + b0
unde bi (i = 0, 1, ..., m) sunt numere reale si reprezint coeficienii polinomului Q.
Se cere s se determine polinomul sum, S=P+Q.
Obs: gradul polinomului S va fi max {m,n}, iar coeficienii si vor fi:
ai, m+1in, atunci cnd m<n
si = bi, n+1im, atunci cnd m>n
ai +bi, 0imin {m,n}
Soluie:
array a[n], b[m]; read n, m, a0,,an, b0,,bm;
if n<m then
minn; maxm
else
minm; maxn
endif
if m<n then
for i=m+1,n
siai
repeat
endif
if m>n then
for i=n+1,m
sibi
repeat
endif
for i=0, minim(m,n)
siai + bi
repeat
write s0,,smax

51

Programarea Calculatoarelor

Probleme propuse
1. n planul xOy, se consider un dreptunghi specificat prin coordonatele colurilor stngajos (xs,ys) i dreaptasus(xd,yd ). S se determine dac un punct oarecare M(x,y) se afl sau
nu n interiorul dreptunghiului.
Obs: Un punct M(x,y) se gsete in interiorul sau pe frontiera unui poligon convex dac:
aria(A1A2...An) = aria(MA1A2) + aria(MA2A3) +...+ aria(MAnA1)
2. Se d un poligon convex P specificat prin coordonatele vrfurilor i un punct oarecare
M(x,y). Se cere s se calculeze distana de la punctul M la poligonul P.
Obs: Distana de la punctul M(x,y) la poligonul P = A1A2...An este egal cu lungimea celui mai
mic segment de la punctul M la un punct de pe poligonul P.
3. Se citesc trei valori reale, pozitive, a, b,c. Verificai dac ele pot forma laturile unui
triunghi; aflai perimetrul i aria acestuia.
Obs: Pentru arie se va folosi formula lui Heron:

p ( p a) ( p b) ( p c) , unde p=semiperimetrul.

Obs: Dac triunghiul este dat prin coordonatele vrfurilor sale: A(xA,yA), B(xB,yB), C(xC,yC),
atunci fie se calculeaz dimensiunile laturilor prin formula distanei ntre dou puncte din plan i
apoi se calculeaz aria prin formula lui Heron, fie se calculeaz aria pe baza formulei
determinantului:

4. Se d un cerc C de centru O(x0, y0) i raz r, cu x0, y0, r citite de la tastatur i o dreapt
(d) dat prin ecuaia dreptei: ax+by+c = 0, cu a, b, c citite de la tastatur. S se determine
poziia dreptei (d) fa de cercul C.
Obs: Distana de la centrul cercului la dreapta (d) se calculeaz cu formula distanei dintre un
punct i o dreapt:

dist

a x0 b y 0 c
a2 b2

5. S se determine dac un numr n introdus de la tastatur aparine sau nu irului lui


Fibonacci: 1,1,2,3,5,8,13,21, .
52

Programarea Calculatoarelor

6. Fiind dat un interval [a,b] cu a i b numere naturale citite de la tastatur, a < b i un alt
numr c citit de la tastatur, s se afieze toate numerele din intervalul dat care sunt
divizibile cu numrul c.
7. Fiind date n intervale [a,b], n i perechile a i b fiind numere naturale citite de la
tastatur, a < b, s se afieze capetele intervalului ce reprezint intersecia celor n intervale
date.
8. S se determine toate numerele prime cu maxim 5 cifre care rmn prime i dup
inversarea lor.
9. S se afieze toate numerele de dou cifre ce ndeplinesc condiia:
ab (a b) 2

10. Se citete de la tastatur un vector v cu n elemente reale, n10. S se realizeze


permutarea circular la stnga i la dreapta a elementelor vectorului.
Obs: Permutarea circular la dreapta: x1, x2, x3, xn-1, xn
x2, x3, xn-1, xn, x1
Permutarea circular la stnga: x1, x2, x3, xn-1, xn
xn, x1, x2, x3, xn-1
11. Se citete de la tastatur un vector v cu n elemente reale, n100. S se verifice dac
elementele vectorului formeaz o mulime (adic au valori distincte).
12. Se citete de la tastatur un vector v cu n elemente reale, n100. S se afieze acele
elemente ale vectorului pentru care suma cifrelor este divizibil cu 5.
13. S se determine ultima cifr a numrului 3x, x fiind un numr natural citit de la
tastatur.
Obs: Se va folosi restul mpririi ntregi a lui x la 3: x mod 3.
14. Se citete de la tastatur un vector v cu n elemente numere ntregi, n100. S se afieze
elementele vectorului care sunt prime cu un numr dat k, k citit de la tastatur.
15. S se determine acel k numr natural cu proprietatea: 2 k+1n, n fiind un numr natural
citit de la tastatur.
16. S se determine dac un numr n citit de la tastatur are cifrele in ordine strict
cresctoare.
53

Programarea Calculatoarelor

17. Pentru o valoare n citit de la tastatur, s se determine primele n triplete de numere


pitagorice.
Obs: x,y,z sunt numere pitagorice dac x<y<z i x2+y2 = z2.
18. Se citete de la tastatur un vector v cu n elemente reale, n100. S se construiasc un
alt vector u de n elemente, astfel nct u[k] = restul mpririi lui v[k] la suma cifrelor sale,
k=1,,n.
19. Se citete de la tastatur un vector v cu n elemente reale, n100. S se construiasc un
alt vector u de n elemente, astfel nct u[k] =
numrul divizorilor lui v[k], k=1,,n.
20. Se citete de la tastatur un numr natural n cu cel mult 9 cifre. S se afieze cel mai
mare i cel mai mic numr care se poate forma cu cifrele distincte ale numrului.
21. Se citete de la tastatur un vector v cu n elemente reale, n100. S se scrie un program
care s insereze n vector pe poziia k (k citit de la tastatur, kn) un nou element citit de la
tastatur. Celelalte elemente, ncepnd cu poziia k+1 s fie deplasate la dreapta, rezultnd
un vector cu n+1 componente.
22. Se citete de la tastatur un vector v cu n elemente reale, n100. S se scrie un program
care s mute la sfritul vectorului toate elementele sale nule, fr a utiliza un vector
auxiliar.
23. Se citete de la tastatur un vector v cu n elemente reale, n100. S se scrie un program
care s extrag din acest vector subirul de dimensiune maxim, ordonat cresctor.
24. Se citete de la tastatur un numr natural n.
a) S se scrie un program care s afieze numrul obinut prin eliminarea cifrelor care se
repet n numrul dat.
b) S se scrie un program care s afieze numrul obinut prin interschimbarea cifrelor
egal deprtate de capetele numrului.
c) S se scrie un program care s afieze cel mai mare numr care se poate forma din
cifrele numrului dat

54

Programarea Calculatoarelor

Laborator 7

7. ALGORITMI CORESPUNZTORI UNOR PRELUCRRI


ELEMENTARE REPREZENTAI
N SCHEM LOGIC / PSEUDOCOD
Partea a doua
TESTE GRIL
1. Fie secvena de pseudocod :
a 10;
b a+10;
if (ab) then b b+10;
else a a+10;
endif
a a*b;
Ce valoare vor avea variabilele a i b la sfritul acestei secvene de instruciuni?
a) 20 200 b) 30 300 c) 10 30 d) 20 300 e) 30 200
2. Fie secvena de pseudocod :
read a;
while (a0)
xa mod 10;
a a div 10
repeat
write x
Ce valoare va fi afiat la sfritul acestei secvene de instruciuni pentru a =42765 ?
a) 42764 b) 0 c) 4 d) 5 e) 56724
3. Fie secvena de pseudocod :
read temperatura;
if (temperatura > 40) then
write canicula;
else
if (temperatura > 30) then
write foarte cald;
else
if (temperatura > 25) then
write cald;
55

Programarea Calculatoarelor

else
if (temperatura < 25) then
write optim;
endif
endif
endif
endif
La implementarea n C++ a secvenei de mai sus, scris n pseudocod, s-a constatat c
pentru valoarea variabilei temperatura = 25, programul nu a afiat nimic. Acest lucru
este cauzat de:
a) o eroare logic (de programare)
b) o eroare de compilare
c) o eroare de sintax
d) o eroare de rulare (de execuie)
Pentru valoarea variabilei temperatura = 20, programul va afia:
a) cald b) foarte cald c) optim d) canicula
4. Fie secvena de pseudocod :
read a,b;
c 0;
while (a0)
c c*10+a mod 10;
a [a/100];
repeat
while ((b*c>0) & (b mod10 = cmod 10))
b [b/10];
c [c/10];
repeat
s b+c;
write s
Ce valoare va fi afiat la sfritul secvenei de instruciuni prezentat mai jos pentru
pentru a =123456 i b =642 ?
a) 6 b) 1 c) 0 d) 2
5. Fie secvena de pseudocod :
for i=1,5
for j=1,5
if((i=j)(i+j=i) then write *
else write0
endif
56

Programarea Calculatoarelor

repeat
newline
repeat
Ce configuraie va fi afiat la sfritul acestei secvene de instruciuni ?
a) 00*00
b) *0*0*
c) *000*
d) 00000
0*0*0*
0*0*0
0*0*0
*0*0*
*0*0*0
*0*0*
00*00
00000
0*0*0*
0*0*0
0*0*0
*0*0*
00*00
*0*0*
*000*
00000
6. Trei dintre urmtoarele patru secvene pseudocod verific dac numrul natural a citit
de la tastatur este un numr par.
Care este secvena care nu realizeaz acest lucru ?
a) if (a div 2 = a/2) then
write a este par;
else
write a este impar;
endif
b) if (a mod 2 = 0) then
write a este par;
else
write a este impar;
endif
c) if ((a-1) mod 2 = 0) then
write a este par;
else
write a este impar;
endif
d) if ((2*a) mod 2 = 0) then
write a este par;
else
write a este impar;
endif
7. Ce realizeaz urmtorul algoritm scris n pseudocod?
array a[n]; read n;
for k=0,n-1
read ak
repeat
57

Programarea Calculatoarelor

for i=n-2,0
v ai;
for j=i,n-2
if v>aj+1 then aj aj+1
else break
endif
repeat
aj v;
repeat
for k=0,n-1
write ak
repeat
a) Ordonarea descresctoare a elementelor vectorului a
b) Ordonarea cresctoare a elementelor vectorului a
c) Interschimbarea elementelor vectorului de pe dou poziii consecutive
d) Interschimbarea elementelor vectorului egal deprtate de capete
8. Se consider urmtoarea secven n pseudocod:
read a;
while a < 7
b a - 2;
write a + b;
a a - b + 1;
repeat;
write b;
Care este valoarea afiat n final pentru b:
a) 3
b) 5
c) -1
d) valoarea lui b nu este afiat
9. Se consider urmtoarea secven n pseudocod:
read a;
i 1;
do
read b; write b;
i i + 1;
until b<a;
write i;
Pentru care dintre urmtoarele secvene de numere introduse se afieaz n final valoarea 5:
a) 7, 1, 2, 3, 4, 9
b) 8, 5, 4, 3, 9
58

Programarea Calculatoarelor

c) 7, 7, 2, 2, 5, 9
d) 8, 9, 10, 1, 12
10. Valoarea lui i afiat n final pentru secvena de pseudocod de la exerciiul 9 reprezint:
a) numrul valorilor citite strict mai mici dect a
b) numrul valorilor citite strict mai mari dect a
c) numrul valorilor citite strict mai mari sau egale cu a
d) o alt valoare
11. Avnd algoritmii:
i 0;
s 0;
while i 5
s 2 * s + i;
i i + 1;
repeat;
write i;
write s;

i 0;
s 0;
do
s 2 * s + i;
i i + 1;
until i = 5;
write i;
write s;

care din afirmaiile urmtoare este adevrat:


a) algoritmii sunt echivaleni - valorile afiate pentru i i s sunt identice
b) algoritmii nu sunt echivaleni - valorile afiate pentru i i s sunt diferite
c) algoritmii nu sunt echivaleni - valorile afiate pentru i sunt diferite
d) algoritmii nu sunt echivaleni - valorile afiate pentru s sunt diferite
12. Pentru urmtoarea secven de pseudocod:
i 5;
while i > 0
i i - 1;
if i = 1 then
i 0;
endif;
repeat;
specificai care din urmtoarele afirmaii este adevrat:
a) structura decizional nu influeneaz valoarea variabilei i
b) structura decizional nu influeneaz numrul de execuii ale structurii repetitive
c) condiia i=1 este redundant (nu influeneaz numrul de execuii ale structurii repetitive)
d) structura decizional influeneaz numrul de execuii ale structurii repetitive
13. Pentru algoritmul de la exerciiul 12 specificai de cte ori se repet bucla:
a) de 3 ori
b) de 4 ori
c) de 5 ori
d) de 6 ori
59

Programarea Calculatoarelor

Laborator 8

8. PROBLEME REZOLVATE N C++ CU ALGORITMI


REPREZENTAI N PSEUDOCOD
1. S se scrie un program care primete de la consol temperatura exprimat n grade
Celsius i afieaz valoarea acesteia n grade Fahrenheit. n final utilizatorul poate relua
conversia.
Formula pentru conversia din grade Celsius n grade Fahrenheit este:
9 o
o
F = C +32
5
Algoritmul scris n pseudocod:
do
read tempC;
tempF 9/5 * TempC + 32; write tempF;
write Repetati conversia? (d/n); read r;
until r 'd' r 'D';
Programul scris n C++
#include<iostream.h>
#include<conio.h>
void main()
{
float tempC, tempF;
char r;
do
{
clrscr(); // sterge ecranul
cout << "Introduceti temperatura in grade Celsius: "; cin >> tempC;
tempF = tempC * 9 / 5 + 32;
cout << "Temperatura in grade Fahrenheit este: " << tempF << endl;
cout << "Repetati conversia? (d/n)"; cin >> r;
} while ( (r=='d') || (r=='D') );
};
Obs: n evaluarea expresiilor matematice trebuie inut seama de tipul operanzilor i ordinea de
evaluare a expresiilor. Dac am fi scris formula astfel:
tempF = 9 / 5 * tempC + 32;
prelucrarea acesteia ar fi produs un rezultat eronat.

60

Programarea Calculatoarelor

Expresia 9/5 din cauza faptului c 9 este reprezentat ca ntreg este evaluat ca un ntreg, iar
valoarea corect a fraciei 9/5 (1,8) este transformat prin trunchiere tot ntr-un ntreg (1) ceea ce
evident denatureaz rezultatul expresiei.
Variabila tempC este de tip float i n aceast situaie evaluarea se va face corect dac formula
este scris:
tempF = tempC * 9 / 5 + 32;
2. S se scrie un program simplu care citete de la consol un numr natural n i calculeaz
factorialul acestui numr.
Algoritmul scris n pseudocod:
read n;
factorialN 1;
for i=1,n
factorialN factorialN * i;
repeat;
write factorialN;
Programul scris n C++:
#include<iostream.h>
void main()
{
unsigned int n;
unsigned long factorialN;
/* daca pentru n se vor folosi valori mai mari decat 33, variabila
factorialN va trebui sa fie de tipul unsigned double pentru a
putea pastra valoarea factorialului */
cout << "n = "; cin >> n;
factorialN = 1;
for(int i=1;i<=n;i++)
factorialN = factorialN * i;
cout << "n! = " << factorialN << endl;
};
Obs: La stabilirea tipurilor variabilelor este necesar s inem seama de valorile maxime i
minime pe care urmeaz s le memorm n acele variabile.
n exemplul de mai sus, dac pentru variabila factorialN am fi utilizat tipul unsigned int (ce
poate memora numere n intervalul 0-65.535) cum probabil am fi fost tentai iniial s o facem,
pentru valori ale lui n mai mari de 8 ar fi fost imposibil s putem memora valoarea factorialului
(9!=362.880) n variabila factorialN.
De aceea am ales unsigned long.
Desigur, nici acest tip nu poate memora numere foarte mari (0-4.294.967.295) i de aceea cea
mai bun soluie ar fi s utilizm tipul unsigned double pentru variabila factorialN.

61

Programarea Calculatoarelor

3. S se scrie un program simplu care citete de la consol un ir X de n elemente ntregi


(n<=50). S se afieze:
a. suma elementelor pozitive
b. produsul elementelor pare
c. suma elementelor negative aflate pe poziii impare
d. media aritmetic a elementelor ce dau restul 2 la mprirea cu 5
e. numrul elementelor mai mici (strict) dect 5.
f. S se verifice dac elementul cu index m este divizibil cu 4.
Notm n pseudocod: a mod b = restul mpririi ntregi a lui a la b
Algoritmul n pseudocod este fragmentat pentru o mai uoar nelegere:
ncrcarea elementelor intregi ale vectorului X:
do
read n;
until n>1 and n50
for i=1,n
read X(i);
repeat;
a. suma elementelor pozitive:
suma 0;
for i=1,n;
if X(i) > 0 then
suma suma + X(i);
endif;
repeat;
write Suma elementelor pozitive este: ;
write suma;
b. produsul elementelor pare:
produs 1;
for i=1,n
if X(i) mod 2 = 0 then
produs produs * X(i);
endif;
repeat;
write Produsul elementelor pare este: ;
write produs;
c. suma elementelor negative aflate pe poziii impare:
suma 0;
62

Programarea Calculatoarelor

for i=1,n
if X(i) < 0 and i mod 2 = 1 then
suma suma + X(i);
endif;
repeat;
write Suma elementelor negative aflate pe pozitii impare este: ;
write suma;
d. media aritmetic a elementelor ce dau restul 2 la mprirea cu 5
suma_elem 0;
nr_elem 0;
for i=1,n
if X(i) mod 5 = 2 then
nr_elem nr_elem + 1;
suma_elem suma_elem + X(i);
endif;
repeat
if nr_elem = 0 then
write Nu exista elemente ce dau restul 2 la impartirea cu 5.;
else
write Media aritmetica a elementelor ce dau restul 2 la
impartirea cu 5 este: ;
write suma_elem / nr_elem;
endif;
e. numrul elementelor mai mici (strict) dect 5
nr_elem 0;
for i=1,n
if X(i) < 5 then
nr_elem nr_elem + 1;
endif;
repeat;
write Numarul elementelor mai mici ca 5 este: ;
write nr_elem;
f. s se verifice dac elementul cu index m este divizibil cu 4
do
read m;
until m1 and mn;
if X(m) mod 4 0 then
write Numarul X(m) NU este divizibil.;
else
write Numarul X(m) este divizibil cu 4.;
endif;
63

Programarea Calculatoarelor

Obs: La scrierea codului n C++ trebuie s inem seama de faptul c indexarea vectorului X
ncepe de la zero (indexul primului element ntreg al vectorului X este zero). Acest prim element,
dei are indexul 0 (care este numr par), este de fapt plasat pe o poziie impar n cadrul
vectorului (irului de numere).
Obs: Evaluarea logic (adevrat sau fals) a unei variabile numerice este: fals (false, 0) dac
variabila are valoarea zero sau adevrat (true, 1) dac variabila este diferit de zero (are o
valoare nenul). De exemplu, pentru secvena de instruciuni:
int a, b;
a=0; b=-7;
evaluarea logic (n instruciuni de tip decizional - if) a variabilelor a i b ntoarce rezultatul false
(0) pentru a i true (1) pentru b.
Programul complet scris n C++ pentru rezolvarea pe rnd a celor ase cerine ale
problemei 3:
#include<iostream.h>
#include<conio.h>
void main()
{
int n, X[50];
// preia de la consola elementele din sirul X
do
{
clrscr();
cout<<"Introduceti nr. de elemente ale sirului X (2-50): ";
cin>>n;
}while((n<2)||(n>50));
cout<<"Introduceti elementele sirului X"<<endl;
for(int i=0;i<n;i++)
{
cout<<"X["<<i<<"]= ";
cin>>X[i];
};
// a. calculeaza suma elementelor pozitive
int suma=0;
for(i=0;i<n;i++)
if(X[i]>0)
suma+=X[i];
cout<<"Suma elementelor pozitive este "<<suma<<endl;
// b. calculeaza produsul elementelor pare
long produs=1;
for(i=0;i<n;i++)
if(!(X[i]%2)) // conditia se poate scrie si ((X[i]%2)==0)
64

Programarea Calculatoarelor

produs*=X[i];
cout<<"Produsul elementelor pare este "<<produs<<endl;
// c. calculeaza suma el. negative aflate pe pozitii impare
suma=0;
for(i=0;i<n;i++)
if((i%2==0)&&(X[i]<0)) // i este par si X[i] este negativ
suma+=X[i];
cout<<"Suma elementelor negative aflate pe pozitii impare este
"<<suma<<endl;
// d. calculeaza media aritmetica a elementelor care dau restul 2
// la impartirea cu 5
// pentru suma_elem folossim float pt. a calcula corect media
float suma_elem=0; int nr_elem=0;
for(i=0;i<n;i++)
if((X[i]%5)==2)
{
nr_elem++;
suma_elem+=X[i];
};
if(nr_elem==0)
cout<<"Nu exista el. ce dau rest 2 la impartirea cu 5."<<endl;
else
cout<<"Media aritmetica a el. ce dau rest 2 la impartirea cu 5
este " <<suma_elem/nr_elem<<endl;
// e. numara elementele mai mici (strict) ca 5
nr_elem=0;
for(i=0;i<n;i++)
if(X[i]<5)
nr_elem++;
cout<<"Nr. elem. mai mici decat 5 este "<<nr_elem<<endl;
// f. verifica daca elementul cu indexul m este divizibil cu 4
int m;
do
{
cout<<"Indexul elementului pentru verificarea diviziunii cu 4 (0-"<<n-1<<") ";
cin>>m;
}while((m<0)||(m>n-1));
if(X[m]%4) // conditia se poate scrie si ((X[m]%4)==1)
cout<<"Numarul "<<X[m]<<" NU este divizibil."<<endl;
else
cout<<"Numarul "<<X[m]<<" este divizibil cu 4."<<endl;
// asteapta apasarea unei taste pt. a iesi din executie program
cout<<endl<<"Apasati o tasta...";
getch();
};
65

Programarea Calculatoarelor

Obs: Aceast problem cu toate subpunctele sale (mai puin f) poate fi rezolvat folosind o
singur parcurgere a vectorului X bucla for n care se face ncrcarea cu valori a vectorului.
Pentru aceasta, toate variabilele necesare rezolvrii cerinelor vor fi declarate la nceputul
funciei main i n cadrul buclei, dup citirea valorii pentru X[i] se vor face testele i prelucrrile
necesare rezolvrii.
4. S se scrie un program simplu care citete de la consol un numr natural n i afieaz
suma cifrelor acestui numr.
Notm n pseudocod:
a mod b = restul mpririi ntregi a lui a la b
a div b = ctul mpririi ntregi a lui a la b
Algoritmul scris n pseudocod:
read n;
suma 0;
while n 0
suma suma + n mod 10;n n div 10;
repeat;
write suma;
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
unsigned long n;
unsigned int suma = 0; // declarare si initializare variabila suma
clrscr(); // sterge ecranul
cout << "Introduceti numarul n: "; cin >> n;
while(n>0)
{
suma += n % 10; // se mai poate scrie si suma = suma + n % 10;
n /= 10; // se mai poate scrie si n = n / 10;
};
cout << "Suma cifrelor numarului este " << suma << endl;
cout << endl << "Apasati o tasta...";
getch();
};
Obs: Ne amintim c n prima problem (conversia din grade Celsius n grade Fahrenheit)
mprirea a dou numere ntregi conducea la un rezultat eronat ca urmare a trunchierii fraciei
9/5 din cauza faptului c pentru cei doi operanzi compilatorul folosete tipul int.
n rezolvarea problemei curente, acest lucru ne ajut s eliminm repetat ultima cifr din
numrul n.
5. S se scrie un program simplu care citete de la consol un numr natural n i l afieaz
rsturnat (citit de la sfrit la nceput).
66

Programarea Calculatoarelor

Algoritmul scris n pseudocod:


read n;
n_invers 0;
while n 0
n_invers n_invers * 10 + n mod 10;
n n div 10;
repeat;
write n_invers;
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
unsigned long n, n_invers;
cout << "Introduceti numarul n: "; cin >> n;
n_invers=0;
while(n>0)
{
n_invers = n_invers*10 + n%10;
n/=10;
};
cout << "Numarul inversat este: " << n_invers << endl;
cout << endl << "Apasati o tasta...";
getch();
};
Obs: Dac numrul ce este introdus de la tastatur are cifra 0 la sfrit, algoritmul de mai sus nu
permite rezolvarea corect a problemei i de aceea el trebuie schimbat astfel (afiare cifr cu
cifr):
read n;
while n 0
write n mod 10;
n n div 10;
repeat;
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
unsigned long n;
cout << "Introduceti numarul n: "; cin >> n;
cout << "Numarul inversat este: ";
while(n>0)
67

Programarea Calculatoarelor

{
cout << n%10;
n/=10;
};
cout << endl << "Apasati o tasta...";
getch();
};
6. S se scrie un program simplu care citete de la consol un numr natural n i afieaz
dac acesta este un numr prim sau nu.
Algoritmul scris n pseudocod:
read n;
prim 1;
case n
0: prim 0;
1: prim 0;
2: prim 1;
else:
for i = 2,nr
if n mod i = 0 then
prim 0;
exit for;
endif;
repeat;
endcase;
if prim = 1 then
write Numarul este prim;
else
write Numarul nu este prim;
endif;
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{
unsigned int n, prim=1;
clrscr();
cout<<"Introduceti numarul: "; cin>>n;
switch(n){
case 0:
prim=0; // numarul nu este prim
break;
68

Programarea Calculatoarelor

case 1:
prim=0; // numarul nu este prim
break;
case 2:
prim=1; // numarul este prim
break;
default:
for(int i=2;i<=int(sqrt(n));i++)
if(n%i==0)
{
prim=0;
// numarul nu este prim
break; // se iese din bucla for
};
};
cout<<endl<<"Numarul"<<prim?" este ":" nu este "<<"prim"<<endl;
cout<<endl<<"Apasati o tasta...";
getch();
};
Obs: Soluia acestei probleme este prezentat ca un exemplu de utilizare al instruciunii switch.
Rezolvarea se poate simplifica verificnd ca valoarea lui n s fie mai mare sau egal cu 2 i
pstrnd doar secvena de pe ramura default a instruciunii switch.
Obs: Afiarea rezultatului este fcut folosind operatorul condiional.
7. S se scrie un program care afieaz primele n numere prime.
Algoritmul scris n pseudocod:
read n;
nr 2;
while n > 0
prim 1;
for i=2,nr
if nr mod i = 0 then
prim 0;
exit for;
endif;
repeat;
if prim = 1 then
write nr;
n n - 1;
endif;
nr nr + 1;
repeat;
69

Programarea Calculatoarelor

Programul scris n C++:


#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{
unsigned int n, prim;
unsigned long nr;
cout << "Cate numere prime afisez ? "; cin >> n;
nr=2; // incepem testarea de la 2 care este prim
while(n>0)
{
prim=1; // presupunem ca numarul este prim
for(unsigned long i=2;i<=int(sqrt(nr));i++)
if(!(nr%i)
{
// (nr%i==0)
prim=0; // numarul nu este prim
break; // se intrerupe bucla
};
if(prim)
{
// (prim==1)
cout<<nr<<" ";
n--;
};
nr++;
};
cout<<endl<<"Apasati o tasta...";
getch();
};
8. S se scrie un program care citete de la tastatur zece numere ntregi i afieaz
numrul cu valoarea maxim dintre acestea.
Algoritmul scris n pseudocod:
for i=1,10
read A(i);
repeat;
maxim A(1);
for i=2,10
if maxim < A(i) then
maxim A(i);
endif;
repeat;
write maxim;
70

Programarea Calculatoarelor

Programul scris n C++:


#include<iostream.h>
#include<conio.h>
void main()
{
int A[10], maxim;
clrscr();
for(int i=0;i<10;i++)
{
cout<<"A["<<i<<"]=";
cin>>A[i];
};
maxim=A[0];
for(i=1;i<10;i++)
if(maxim<A[i])
maxim=A[i];
cout << "Numarul maxim este: " << maxim << endl;
cout << endl << "Apasati o tasta...";
getch();
};
Obs: Acest exerciiu se poate rezolva folosind o singur bucl for, cea n care se face
introducerea elementelor vectorului.
9. S se scrie un program care citete de la tastatur n numere ntregi, n<=50 i afieaz
numerele n ordine cresctoare a valorilor.
Obs: Metoda const n compararea elementelor dou cte dou. Pentru sortarea cresctoare, dac
elementul din stnga este mai mare ca cel din dreapta cu care se face comparaia, cele dou
elemente vor fi inversate. Pentru aceast inversare se folosete o variabil temporar.
Algoritmul scris n pseudocod:
repeat
read n;
until n 2 and n 50;
for i=1,n
read A(i);
repeat;
for i=1,n
for j=i+1,n
if A(i) > A(j) then
tmp A(i); A(i) A(j); A(j) tmp;
endif;
repeat;
repeat;
71

Programarea Calculatoarelor

for i=1,n
write A(i);
repeat;
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
int A[50], tmp;
// preia de la consola elementele
do
{
clrscr();
cout<<"Introduceti numarul de elemente (2-50): "; cin>>n;
}while((n<2)||(n>50));
cout<<"Introduceti valorile"<<endl;
for(int i=0;i<n;i++)
{
cout<<"A["<<i<<"]= ";
cin>>X[i];
};
// sorteaza crescator elementele
for(int i=0;i<n-1;i++) // bucla incepe de la primul element si se
// termina la penultimul
for(int j=i+1;j<n;j++) // bucla incepe de la elementul din
// dreapta celui cu index si se termina la ultimul
if(A[i]>A[j]
{
tmp=A[i];
A[i]=A[j];
A[j]=tmp;
};
// afiseaza elementele sortate
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
cout<<endl<<"Apasati o tasta...";
getch();
};
10. Se citete de la tastatur un vector v cu n elemente reale, n100. S se scrie un program
care s genereze un nou vector prin intercalarea ntre oricare dou componente
consecutive a vectorului v a mediei lor aritmetice.
Algoritmul scris n pseudocod:
72

Programarea Calculatoarelor

read n; array x[n];


for i=1,n
read xi;
repeat
i 1; j 1;
while (in-1)
yj xi;
yj+1 (xi +xi+1)/2;
j j+2;
i i+1;
repeat
yj xi;
for i=1,j
write yi;
repeat
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
int i,j;
float x[100], y[200];
cout<<se citeste dimensiune vector; cin>>n;
for(i=1;i<=n;i++)
{
cout<<x[<<i<<]=;
cin>>x[i];
}
i=1; j=1;
while (i<=n-1)
{
y[j]=x[i];
y[j+1]=(x[i]+x[i+1])/2;
j=j+2; i++;
}
for(i=1;i<=j;i++)
cout<<y[i]<< ;
cout<<endl<<"Apasati o tasta...";
getch();
};
11. Se citete de la tastatur un vector v cu n elemente reale, n100. S se scrie un program
care s elimine din vector elementul de pe poziia k, k citit de la tastatur. Celelalte
elemente, ncepnd cu poziia k+1 s fie deplasate la stnga.
73

Programarea Calculatoarelor

Algoritmul scris n pseudocod:


read n,k; array x[n];
for i=1,n
read xi;
repeat
for i=k,n-1
xi xi+1;
repeat
for i=1,n-1
write xi;
repeat
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
int i,n,k;
float x[100];
cout<<se citeste dimensiune vector; cin>>n;
cout<<se citeste pozitia elementului ce va fi eliminat; cin>>k;
for(i=1;i<=n;i++)
{
cout<<x[<<i<<]=;
cin>>x[i];
}
for(i=k;i<=n-1;i++)
x[i]=x[i+1];
cout<<noul vector obtinut:;
for(i=1;i<=n-1;i++)
cout<<x[i]<< ;
cout<<endl<<"Apasati o tasta...";
getch();
};
12. Dou vehicule se deplaseaz unul spre cellalt, cu vitezele v1 i v2, ntre dou localiti
A si B, aflate la distanta d, una fa de cealalt. Aflai dup ct timp se ntlnesc (t) i la ce
distan fa de A (d1).
d1=v1*t
Avem, deci:

d-d1=v2*t

d1* t d v2 * t t

d
, iar
v1 v2

Programul scris n C++:


74

d1

v1* d
v1 v2

Programarea Calculatoarelor

#include <iostream.h>
#include <conio.h>
void main()
{
float v1,v2,t,d,d1;
cout<<Dati vitezele v1 si v2:; cin>>v1>>v2;
cout<<Dati distanta d:; cin>>d;
t=d/(v1+v2);
d1=v1*d/(v1+v2);
cout<<Se intalnesc dupa timpul <<t<< la distanta <<d1<< fata de A <<endl;
getch();
}

75

Programarea Calculatoarelor

Laborator 9

9. FUNCII
Prima parte
1. ntr-un program C++, toate funciile (n afara funciei main) sunt executate:
a) naintea execuiei funciei main
b) Dup ncheierea execuiei funciei main
c) Niciodat
d) Atunci cnd sunt apelate de ctre alte funcii
2. Se consider prototipul funciei urmtoare:
int functie(double& a1, double& a2);
a) Funcia poate modifica argumentele transmise att pentru a1 ct i pentru a2
b) Funcia nu poate modifica argumentele transmise nici pentru a1 i nici pentru a2
c) Funcia poate modifica numai argumentul transmis pentru a1
d) Funcia poate modifica numai argumentul transmis pentru a2
3. Completai cu rspunsul corect:
Variabilelepot fi modificate n interiorul oricrei funcii
a) actuale

b) formale

c) globale

d) locale

4. Fiind date cele dou funcii: spatiu i stea definite mai jos, care dintre urmtoarele
secvene de cod va produce o afiare de forma:
*****
****
***
**
*
void spatiu(int k)
{
for (int i=1; i<=k; i++)
cout << " ";
}
void stea(int k)
{
for (int i=1; i<=k; i++)
76

Programarea Calculatoarelor

cout << "*";


cout << endl;
}
a) for (int i=1; i<=5; i++)
{
spatiu(i-1);
stea(5-i);
}
b) for (int i=1; i<=5; i++)
{
spatiu(i-2);
stea(6-i);
}
c) for (int i=1; i<=5; i++)
{
spatiu(i-1);
stea(6-i);
}
d) for (int i=1; i<=5; i++)
{
spatiu(i);
stea(5-i);
}
5. Ce valoare va fi afiat pe monitor n urma execuiei programului de mai jos?
#include <iostream.h>
#include <conio.h>
int f1(int a, int &b);
int f2(int c, int d);
void f3(int &e, int &f);
main(void)
{
int x = 10, y = 20, z = 30;
z = f1(x,y);
cout << f2(y,z) << endl;
getch();
}
int f1(int a, int &b)
{
b = 5 % a;
77

Programarea Calculatoarelor

return a * b;
}
int f2(int c, int d)
{
return c ++ + c*d;
}
void f3(int &e, int &f)
{
int aux;
aux = e;
e = f;
f = aux;
}
a) 200

b) 255

c) 100

d) 50

6. Se consider prototipul funciei: double f1(int, int, int);


Care dintre instruciunile de mai jos este corect?
a) cout<<f1(7, f1(14, 23));
b) cout<<f1(test(7, 14), 23);
c) cout<<f1(14, 23));
d) cout<<f1(7, 14, 23);
7. Care va fi valoarea returnat de funcia f1 definit mai jos:
int f1(int a, int b)
{
return (a>b) ? a : b;
}
a) Suma numerelor a + b.
b) Diferena numerelor a - b.
c) Valoarea minim dintre numerele a i b
c) Valoarea maxim dintre numerele a i b
8. Se consider prototipul funciei: int f1(int, int);
Care dintre instruciunile de mai jos este corect?
a) cin>>f1(x,y);
b) cout<<f1(f1(1, 2), 3);
c) cin>>f1(1, 2);
d) cout<<f1(f1(1), 2);
9. Pentru funcia definit mai jos, care va fi valoarea expresiei f1(6.3)?
78

Programarea Calculatoarelor

int f1( float v )


{
if (v > 5.0)
return 5 * int(v);
else
return 0;
}
a) 30

b) 30.0

c) 31.5

d) 0

10. n C++ definiiile funciilor nu pot fi imbricate, adic definiia unei funcii nu poate fi
inclus n corpul altei funcii.
a) adevrat

b) fals

11. Definii o funcie care s calculeze, pentru un numr ntreg nr suma cuburilor
numerelor ntregi dintre 1 i n.
Rspuns:
int f1(int nr)
{
int i, suma = 0;
for (i = 1; i <= nr; i++)
suma += pow(i,3);
return suma;
}
12. Se citete n i un vector v cu n numere naturale. Se cere ultima cifr a numrului
v[1]+v[2]++v[n].
Rspuns:
#include<iostream.h>
int n, v[100];
void citire ( )
{
cin>>n;
int i;
for (i=1;i<=n;i++)
cin>>v[i];
}
int suma ( )
{
int i, nr=0;
79

Programarea Calculatoarelor

for (i=1;i<=n;i++)
nr=nr+v[i];
return nr;
}
int cifra (int n)
{
int c;
c=n%10;
return c;
}
void main ( )
{
citire ( );
int x = suma ( );
cout<<cifra(x);
}
13. Programele urmtoare exemplific modul de lucru cu parametrii transmii prin
valoare i prin referin, variabile locale i globale.
a)
#include <iostream >
#include <conio.h >
using namespace std;
int alfa, beta=10;
int Calcul(int &x, int y);
int main (void)
{
int a, b, c;
a = 25;
b = 35;
alfa = 1;
c = Calcul (a, b);
// Last two output lines
cout << "a = " << a << " b = " << b << endl;
cout << " alfa = " << alfa << " beta = " << beta << endl;
getch();
return 0;
getch();
}
int Calcul (int &x, int y)
{
int beta;
beta = 5;
cout << " x = " << x <<" y = " << y << endl;
80

Programarea Calculatoarelor

cout << " beta = " << beta << endl;


cout << " alfa = " << alfa << endl;
y = 20;
alfa = beta + y;
x = alfa + y;
cout << " alfa = " << alfa <<" y = " << y << endl;
cout << " x = " << x << endl;
return y;
}
n urma rulrii, pe monitor va aprea urmtoarea secven:
x=25 y=35
beta=5
alfa=1
alfa=25 y=20
x=45
a=45 b=35
alfa=25 beta=10
b)
#include <iostream.h>
#include <conio.h>
int f(int a, int& b);
int main()
{
int x=5, y=10;
for (int i=1; i<=2; i++)
{
cout << x << " "<< y << endl << i << endl;
cout<<endl;
x = f(i,y);
}
getch();
}
int f(int a, int& b)
{
b *= a;
return a*b;
}
n urma rulrii, pe monitor va aprea urmtoarea secven:
81

Programarea Calculatoarelor

5 10
1
10 10
2
14. Exemplu de funcie care calculeaz ipotenuza unui triunghi dreptunghic, funcia avnd
ca parametri lungimile catetelor triunghiului:
double ipotenuza(double cateta1, double cateta22)
{
return sqrt(cateta 1* cateta 1 + cateta 2* cateta 2);
}
15. Exemplificai printr-un exemplu ilustrativ diferena dintre un parametru formal i
parametru actual.
Rspuns:
n programul de mai jos, x este un parametru formal, iar y este un parametru actual
#include <iostream.h>
void Functie_Calcul (int x) // x este un parametru formal
{
//.
cout<<10*x;
}
void main()
{
int y=50;
//.
Functie_Calcul (y); //y este un parametru actual
}
16. Funcia triunghi definit mai jos produce o afiare de forma :
1
12
123
1234
.
1 2 3 4 5 .n
void triunghi (int n);
{
for (int i= 0; i < n; i++)
{
82

Programarea Calculatoarelor

for (int numar = 1; numar <= i+1; numar++)


cout << numar << " ";
cout << endl;
}
}
17. Funcia suma definit mai jos are ca parametru un numr ntreg n i returneaz: 0,
dac n <= 0, iar dac n > 0 valoarea returnat va fi 1 +2 + .+ n.
int suma(int n)
{
int i, s=0;
for (i=1; i<=n; i++)
s += i;
return s;
}
18. Definii o funcie care s calculeze, pentru dou numere ntregi date, inf i sup, suma
numerelor ntregi dintre ele (inclusiv cele dou numere).
Rspuns:
int f1 (int inf, int sup)
{
int i, suma = 0;
if (inf <= sup)
for (i = inf; i <= sup; ++i)
suma+= i;
else
for (i = inf; i >= sup; --i)
suma += i;
return suma;
}
19. care va fi rezultatul rulrii urmtorului program?
#include <iostream.h>
#include <conio.h>
void afisare1(int[][3]);
void afisare2(int[][3]);
main()
{
int a[3][3], i, j;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
83

Programarea Calculatoarelor

a[i][j] = (i+1)*(j+2);
afisare1(a);
cout << endl;
afisare2(a);
getchar();
}
void afisare1(int b[][3])
{
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
cout << b[i][j] << " ";
cout << endl;
}
}
void afisare2(int b[][3])
{
for (int i=2; i>=0; i--)
{
for (int j=2; j>=0; j--)
cout << b[i][j] << " ";
cout << endl;
}
}
Rspuns:
234
468
6 9 12
12 9 6
864
432
20. Definii o funcie care s calculeze, pentru un numr ntreg nr cel mai mic numr
ntreg n pentru care este ndeplinit relaia: 1+2+3+. . . +n nr.
Rspuns:
int f1 (int nr)
{
int n = 1, suma = 1;
while (suma < nr)
suma += ++n;
return n;
84

Programarea Calculatoarelor

}
21. S se afieze toate numerele prime dintre a i b.
Varianta 1:
#include<iostream.h>
int a, b;
void nrprim (int n)
{
int b=1, d=2;
while (d<=n-1)
{
if(n%d= =0)b=0;
d++;
};
if (b= =1) cout<<n<< ;
}
void main ( )
{
int a, b, x;
cin>>a>>b;
for (x=a+1;x<b;x++)
nrprim (x);
}
Varianta 2:
#include <iostream.h>
#include <conio.h>
#include <math.h>
int a, b;
int prim (int x)
{
int bb=1, d;
for(d=2;d<=x-1;d++)
if (x%d==0)bb=0;
return bb;
}
main ( )
{
int i;
cin>>a>>b;
for (i=a+1;i<b;i++)
if (prim(i)==1) cout<<i<<" ";
getch();
}
85

Programarea Calculatoarelor

Laborator 10

FUNCII
Partea a doua
1. Definii o funcie double average(double s[], int n) care s returneze media valorilor: s[0],
s[1],. . . ,s[n-1].
Rspuns:
double average(double s[], int n)
{
double sum=0;
for (int i=0; i<n; i++)
sum += s[i];
return sum/n;
}
2. Definii o funcie care primete 3 parametrii reali ce reprezint lungimea a 3 segmente i
returneaz 1 dac segmentele formeaz triunghi i 0 dac nu.
Rspuns:
#include <iostream.h>
#include <conio.h>
#include <math.h>
int triunghi (float a, float b, float c)
{
int x;
if (((a+b)>c)&&((a+c)>b)&&((b+c)>a)) x=1;
else x=0;
cout<<x;
return x;
}
main ( )
{
int a, b, c;
cin>>a>>b>>c;
triunghi (a,b,c);
getch();
}

86

Programarea Calculatoarelor

3. S se tipreasc toate numerele dintr-un interval dat [a,b], care se divid cu suma cifrelor
lor.
Rspuns:
#include <iostream.h>
#include <conio.h>
#include <math.h>
int suma (int x)
{
int s=0;
while (x!=0)
{
s=s+x%10;
x=x/10;
}
return s;
}
main ( )
{
int a,b,i;
cin>>a>>b;
for (i=a;i<=b;i++)
if (i%suma(i)==0) cout<<i<<" ";
getch();
}
4. Definii o funcie care citete un parametru real ce reprezint lungimea laturii unui
ptrat i returneaz lungimea diagonalei i perimetrul.
Rspuns:
#include <iostream.h>
#include <conio.h>
#include <math.h>
void functie (float l, float& d, float& p)
{
d=l*sqrt(2);
p=4*l;
}
main ( )
{
float l, d, p;
cin>>l;
functie (l,d,p);
cout<<d<<" "<<p;
getch();
}
87

Programarea Calculatoarelor

5. Se d un vector cu n numere ntregi. S se afieze perechile de numere prime ntre ele ale
vectorului.
Rspuns:
#include <iostream.h>
#include <conio.h>
#include <math.h>
int n, v[100];
void citire ( )
{
cin>>n;
int i;
for (i=1;i<=n;i++)
cin>>v[i];
}
int cmmdc(int a, int b)
{
int r=a%b;
while (r!=0)
{
a=b;
b=r;
r=a%b;
}
return b;
}
main ( )
{
citire ( );
int i,j;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if (cmmdc(v[i],v[j])==1) cout<<"("<<v[i]<<" ; "<<v[j]<<")"<<" ";
getch();
}
6. Se dau doi vectori cu n numere ntregi, x i y. S se afieze suma x[1]*y[1] ++ x[n]*y[n].
Rspuns:
#include<iostream.h>
#include <conio.h>
int n, x[100], y[100];
void citire (int z[100] )
{
for (int i=1;i<=n;i++)
88

Programarea Calculatoarelor

cin>>z[i];
}
int suma( )
{
int i, e=0;
for (int i=1;i<=n;i++)
e=e+x[i]*y[i];
return e;
}
main ( )
{
cin>>n;
citire(x); citire(y);
cout<<suma( );
getch();
}
7. S se afle toate numerele naturale divizibile cu 7 mai mici sau egale cu o valoare dat n.
Rspuns:
#include<iostream.h>
#include <conio.h>
int n;
void divizibile( )
{
int i;
for(i=1;i<=n;i++)
if(i%7==0)cout<<i<< ;
}
main( )
{
cin>>n;
divizibile( );
getch();
}
8. S se afle valoarea funciei:
x3-2 , x<=0
f=

x
, x(0,5)
3
2*x+3, x>=5

Rspuns:
89

Programarea Calculatoarelor

#include<iostream.h>
#include<math.h>
#include <conio.h>
int x;
float functie(int a )
{
float f;
if(a<=0) f=pow(a,3)-2;
else if (a<5) f=sqrt(a/3);
else f=2*a+3;
return f;
}
void main( )
{
cin>>x;
cout<<functie(x);
getch();
}
9. Se dau n numere. S se afle suma cifrelor pare din toate numerele.
Rspuns:
#include<iostream.h>
#include <conio.h>
int n, v[100];
void citire( )
{
int i; cin>>n;
for(i=1;i<=n;i++)
{
cout<<v[<<i<<]=;
cin>>v[i];
};
}
int suma( )
{
int i, c, s=0;
for(i=1;i<=n;i++)
{
while(v[i]!=0)
{
c=v[i]%10;
if(c%2==0)s=s+c;
v[i]=v[i]/10;
};
90

Programarea Calculatoarelor

};
return s;
}
main( )
{
citire( ); cout<<suma este<<suma( );
getch();
}
1
1
1
10. S se afle suma S= 1+ 2 + 2 + ..+ 2
2
n
3
Rspuns:
#include<iostream.h>
#include <conio.h>
#include<math.h>
int n;
void citire( )
{
cin>>n;
}
float suma(int x)
{
int i; float s=0;
for(i=1;i<=x;i++)
s=s+1/pow(i,2);
return s;
}
main( )
{
citire( );
cout<<suma este<<suma(n);
}
11. Se dau doi vectori de cte n elemente fiecare. S se afle:
x
x
x
e = 1 + 2 +.+ n , yi 0, i=1,,n
yn
y1 y 2
Rspuns:
#include<iostream.h>
#include <conio.h>
int n; float x[100], y[100];
void citire( )
{
int i;
cin>>n;
91

Programarea Calculatoarelor

for(i=1;i<=n;i++)
{
cout<<x[<<i<<]=; cin>>x[i];
cout<<y[<<i<<]=; cin>>y[i];
};
}
float suma( )
{
int i; float s=0;
for(i=1;i<=n;i++)
s=s+x[i]/y[i];
return s;
}
main( )
{
citire( );
cout<<suma este<<suma( );
getch();
}
12. Se d un vector cu n elemente. S se afle maximul dintre sumele a oricror dou
elemente vecine.
Rspuns:
#include<iostream.h>
#include <conio.h>
int n, v[100];
void citire( )
{
int i;
cin>>n;
for(i=1;i<=n;i++)
{
cout<<v[<<i<<]=;
cin>>v[i];
};
}
int maxim( )
{
int i, max=v[1]+v[2];
for(i=2;i<=n-1;i++)
if(max<(v[i]+v[i+1])) max=v[i]+v[i+1];
return max;
}
main( )
92

Programarea Calculatoarelor

{
citire( );
cout<<maximul este<<maxim( );
getch();
}
13. S se ordoneze elementele impare dintr-un vector.
Rspuns:
#include<iostream.h>
#include <conio.h>
int n, v[100], u[100];
// elem. impare din vect. v le introduc in vect. u
void citire( )
{
int i;
cin>>n;
for(i=1;i<=n;i++)
{
cout<<v[<<i<<]=;
cin>>v[i];
};
}
void impare( )
{
int aux,i,j,k=0;
// k contor pt. pozitiile vect. u
for(i=1;i<=n;i++)
if (v[i]%2==1)
{
k++;
u[k]=v[i];
};
for(i=1;i<=k-1;i++)
// sortez crescator vect. u
for(j=i+1;j<=k;j++)
if(u[i]>u[j])
{
aux=u[i];
u[i]=u[j];
u[j]=aux;
};
for(i=1;i<=k;i++)
cout<<u[i]<< ; // afisez elem. vect.u
}
main( )
{
citire( );
93

Programarea Calculatoarelor

impare( );
getch();
}
14. Se dau A(m) i B(n). S se afle C = B\A.
Rspuns:
#include <iostream.h>
#include <conio.h>
int m,n,p, a[100],b[100],c[100];
void citire( )
{
int i ;
for(i=1;i<=m;i++)
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
};
for(i=1;i<=n;i++)
{
cout<<"b["<<i<<"]= ";
cin>>b[i];
};
}
void diferenta( )
{
int i,j, s,
/* variabila semnal s ia valoarea 1
atunci cand b[i] = a[j], j=1,,n */
p=0;
for(i=1;i<=n;i++)
{
s=0;
for(j=1;j<=m;j++)
if(b[i]==a[j])s=1;
if(s==0)
{
p++;
c[p]=b[i];
};
};
for(i=1;i<=p;i++)
cout<<"c["<<i<<"]= "<<c[i];
}
main( )
{
94

Programarea Calculatoarelor

cout<<"m="; cin>>m;
cout<<"n="; cin>>n;
citire( );
diferenta( );
getch();
}

95

Programarea Calculatoarelor

Laborator 11
11. PRELUCRRI ELEMENTARE CU TABLOURI
BIDIMENSIONALE
1. S se citeasc de la tastatur elementele unei matrici de maxim 10 linii i 10 coloane. S
se afieze matricea citit.
#include <iostream.h>
void main(void)
{
int a[10][10], nr_lin, nr_col, i, j;
cout<<"Nr. linii:"; cin>>nr_lin;
cout<<"Nr. coloane:"; cin>>nr_col;
for (i=0; i<nr_lin; i++)
//citirea elementelor unei matrici
for (j=0; j<nr_col; j++)
{
cout<<"A["<<i<<","<<j<<"]=";
cin>>A[i][j];
}
for (i=0; i<nr_lin; i++)
//afiarea elementelor matricii
{
for (j=0; j<nr_col; j++) cout<<A[i][j]<< ;
cout<<'\n'; /* dup afiarea elementelor unei linii, se trece
pe linia urmtoare*/
}
}
2. S se iniializeze elementele unei matrici aleator, cu cifre o i 1:
#include <iostream.h>
#include <stdlib.h>
void main ()
{
int tablou[10][10], a, b;
for (a = 0; a < 10; a++)
for (b = 0; b < 10; b++)
tablou[a][b] = rand()%2;
for (a = 0; a < 10; a++)
{
for (b = 0; b < 10; b++)
cout <<tablou[a][b]<< ;
96

Programarea Calculatoarelor

cout<<'\n';
}
}
3. Program care citete de la tastatur o matrice de 4 linii i 6 coloane de numere reale,
calculeaz transpusa ei i afieaz transpusa:
#include <iostream.h>
void main()
{
// Matricea originala, citita de la tastatura cu patru linii si sase coloane.
float a[4][6];
// Matricea transpusa, va avea sase linii si patru coloane
float tr[6][4];
int i, j;
/* Citim matricea de la tastatura. */
for (i=0; i<4; i++)
for (j=0; j<6; j++)
{
cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j];
}
/* Afisam matricea originala. */
for (i=0; i<4; i++)
{
for (j=0; j<6; j++) cout<<a[i][j]<< ;
cout<<'\n';
}
/* Calculam transpusa. */
for (i=0; i<4; i++)
for (j=0; j<6; j++)
tr[j][i] = a[i][j];
/* Afisam transpusa. */
for (i=0; i<6; i++)
{
for (j=0; j<4; j++)cout<<tr[i][j])<< ;
cout<<'\n';
}
}
4. nmulirea a dou matrice: Fiind dat matricea A(l1 x c1) i matricea B (l2 x c2), s se
calculeze n matricea C(l1 x c2) produsul celor dou matrici.
Obs: ci,j = ai,1 * b1,j + ai,2 * b2,j + + ai,l1 * bl1,j
97

Programarea Calculatoarelor

#include <iostream.h>
#include <conio.h>
void main()
{
int a[50][50],b[50][50],c[50][50],l1,c1,l2,c2,sum,i,j,k;
cin>>l1>>c1>>l2>>c2;
if(c1!=l2)
cout<<"Inmultirea nu este posibila!"<<endl;
else
{
for (i=0; i<l1; i++)
for (j=0; j<c1; j++)
{
cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j];
}
cout<<endl;
for (i=0; i<l2; i++)
for (j=0; j<c2; j++)
{
cout<<"b["<<i<<","<<j<<"]=";
cin>>b[i][j];
}
cout<<endl;
for(i=1;i<=l1;i++)
for(j=1;j<=c2;j++)
{
sum=0;
for(k=1;k<=l2;k++)
{
sum+=(a[i][k]*b[k][j]);
c[i][j]=sum;
}
}
for(i=1;i<=l1;i++) {
for(j=1;j<=c2;j++) cout<<c[i][j]<<' ';
cout<<endl;
}
}
}
5. Se citete de la tastatur o matrice A cu m linii i n coloane ce conine doar numerele 0 i
1 (m i n cu valori ntre 2 i 10). Fiecare linie constituie reprezentarea n baza 2 a unui
numr natural.
Afiai numerele naturale n baza 10 pentru fiecare linie n parte precum i suma acestora.
98

Programarea Calculatoarelor

Algoritmul scris n pseudocod:


do
read m;
until m 2 and m 10;
do
read n;
until n 2 and n 10;
for i=1,m
for j=1,n
do
read A(i,j);
until A(i,j) = 0 or A(i,j) = 1;
repeat;
repeat;
suma 0;
for i=1,m
nr 0;
for j=1,n
nr nr * 2 + A(i,j);
write A(i,j);
repeat;
write nr;
suma suma + nr;
repeat;
write suma;
Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
int A[10][10], m, n, i, j, nr, suma=0;
clrscr();
// citeste numarul de linii pana cand m este in intervalul 2-10
do
{
cout<<"Numarul de linii (2-10): m=";
cin>>m;
} while ((m<2)||(m>10));
// citeste numarul de coloane pana cand n este in intervalul 2-10
do
{
cout<<"Numarul de coloane (2-10): n=";
99

Programarea Calculatoarelor

cin>>n;
} while ((n<2)||(n>10));
for(i=0;i<m;i++) // citeste elementele matricii A
for(j=0;j<n;j++)
// citirea unui el. se repeta pt. valori diferite de 0 sau 1
do
{
cout<<"A("<<i<<","<<j<<")=";
cin>>A[i][j];
} while((A[i][j]!=0)&&(A[i][j]!=1));
// afiseaza matricea A si calculeaza reprezentarea in zecimal a
// liniilor precum si suma acestor numere
for(i=0;i<m;i++)
{
nr=0;
for(j=0;j<n;j++)
{
// calcul numar echivalent linie
nr=nr*2+A[i][j];
// afiseaza elementul matricii
// urmat de spatiu (tab)
cout<<A[i][j]<<"\t";
};
// la sfarsitul unei linii este afisat nr. in zecimal
cout<<" = "<<nr<<endl;
// si se aduna numarul la variabila suma
suma+=nr;
};
cout<<endl<<"Suma numerelor este: "<<suma;
cout<<endl<<"Apasati o tasta..."; getch();
};
6. Se citete de la tastatur o matrice cu m linii i n coloane. S se afieze toate liniile
simetrice. O linie se numete simetric, dac elementele sale egal deprtate de capete sunt
identice.
#include<iostream.h>
void main ( )
{
int a[10][10], m, n, i, j, semnal;
cout<<numarul de linii :; cin>>m; cout<<numarul de coloane :; cin>>n;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{
cout<<a[<<i<<,<<j<<]; cin>>a[i][j];
100

Programarea Calculatoarelor

}
for (i=1;i<=m;i++)
{
semnal =1;
for (j=1;j<=n/2;j++)
if (a[i][j]!= a[i][n-j+1])
{
semnal =0; break;
}
if (semnal)
{
cout<<(;
for (j=1;j<=n;j++) cout<<a[i][j];
cout<<);
};
};
}
7. Se citete de la tastatur o matrice cu m linii i n coloane care conin numai numere 0 i 1.
S se afieze perechile de linii complementare (suma elementelor de pe aceeai coloan din
cele dou linii este egal cu 1). Se afieaz indicii liniilor respective.
#include<iostream.h>
void main ( )
{
int a[10][10], m, n, i, j, i1;
cout<<numarul de linii :; cin>>m;
cout<<numarul de coloane :; cin>>n;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
do {
cout<<a[<<i<<,<<j<<];
cin>>a[i][j];
}
while ((a[i][j]!=0)&&( a[i][j]!=1));
for (i=1;i<=m-1;i++)
for (i1=i+1;i1<=m;i1++)
{
j=1;
while((j<=n)&&( a[i][j]+ a[i1][j]= =1)) j++;
if(j= =n+1)
cout<<liniile<<i<<si<<i1<<sunt complementare<<endl;
}
}
101

Programarea Calculatoarelor

Laborator 12

12. PRELUCRRI AVANSATE CU TABLOURI BIDIMENSIONALE


1. Se citete de la tastatur o matrice ptratic A de ordin n (2<=n<=10) ce conine doar
numere naturale nenule i mai mici dect 10.
S se calculeze i s se afieze sumele i produsele elementelor matricii aflate n
triunghiurile de sub i respectiv deasupra diagonalei principale a matricei.
Obs: Condiia ca matricea s conin doar numere naturale mici a fost adugat numai pentru a
mpiedica produsul elementelor s aib o valoare mult prea mare.
De exemplu, dac matricea este de ordinul 10 i toate elementele sale sunt egale cu 10, produsul
elementelor triunghiului de sub diagonala principal este 1045. n aceast situaie, pentru a
memora aceast valoare trebuie folosit tipul double.
Prin analogie, suma acestor elemente va fi 450, i de aceea poate fi folosit tipul int pentru
memorarea acestei valori.
Algoritmul scris n pseudocod:
do
read n;
until n 2 and n 10;
for i=1,n
for j=1,n
do
read A(i,j);
until A(i,j) 1 or A(i,j) 10;
repeat;
repeat;
suma1 0; produs1 1; suma2 0; produs2 1;
for i=1,n
for j=1,n
if j<i then
suma1 suma1 + A(i,j);
produs1 produs1 * A(i,j);
endif;
if j>i then
suma2 suma2 + A(i,j);
produs2 produs2 * A(i,j);
endif;
repeat;
repeat;
102

Programarea Calculatoarelor

write suma1; write produs1; write suma2; write produs2;


Programul scris n C++:
#include<iostream.h>
#include<conio.h>
void main()
{
unsigned int A[10][10], n, i, j;
unsigned int suma1=0, suma2=0;
double produs1=1, produs2=1;
// citeste dimensiunea matricei in intervalul 1-10
do
{
cout<<"Introduceti dimensiunea matricei (2-10): ";
cin>>n;
} while((n<2)||(n>10));
/* citeste elementele matricei si face validarea ca acestea sa fie
in intervalul 0-10 */
for(i=0;i<n;i++)
for(j=0;j<n;j++)
do
{
cout<<"A("<<i<<","<<j<<")=";
cin>>A[i][j];
} while((A[i][j]<1)||(A[i][j]>10));
clrscr();
// afiseaza matricea pe ecran
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<" "<<A[i][j];
cout<<endl;
};
// calculeaza sumele si produsele elementelor de sub /deasupra
// diagonalei principale
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(j<i)
{
// elementele de deasupra
// diagonalei principale
suma1+=A[i][j];
produs1*=A[i][j];
};
103

Programarea Calculatoarelor

if(j>i)
{
// elementele de sub diagonala principala
suma2+=A[i][j];
produs2*=A[i][j];
};
};
// afiseaza sumele si produsele elementelor triunghiurilor
// se foloseste secventa escape \n pentru a trece pe o linie noua
// (echivalent cu endl)
cout<<"\nPentru elementele de deasupra diagonalei\n\nsuma="
<<suma1<<"\nprodus="<<produs1;
cout<<"\n\nPentru elementele de sub diagonala\n\nsuma="
<<suma2<<"\nprodus="<<produs2;
cout<<endl<<"Apasati o tasta...";
getch();
};
Obs: Pentru elementele de deasupra diagonalei secundare condiia este j<n-1-i, iar pentru
elementele de sub diagonala secundar condiia este j>n-1-i.
2. S se calculeze i s se afieze sumele i produsele elementelor matricii ptratice A de
ordin n>1, aflate n triunghiurile haurate ( elementele de pe diagonale nu se iau n
considerare):

S1, P1

S2, P2

S3, P3
i<j

j<n-i+1
j>n-i+1

S4, P4

i>j

#include<iostream.h>
void main ( )
{
int a[10][10], n, i, j, s1, s2, s3, s4, p1, p2, p3, p4;
cout<<ordinul matricei :; cin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
cout<<a[<<i<<,<<j<<]; cin>>a[i][j];
}
s1=s2=s3=s4=0; p1=p2=p3=p4=1;
for (i=1;i<=n;i++)
104

Programarea Calculatoarelor

for (j=1;j<=n;j++)
{
if((i>j)&&(j>n-i+1))
{
s1+= a[i][j];
p1*= a[i][j];
}
if((i<j)&&(j<n-i+1))
{
s2+= a[i][j];
p2*= a[i][j];
};
if((i>j)&&(j<n-i+1))
{
s3+= a[i][j];
p3*= a[i][j];
};
if((i<j)&&(j>n-i+1))
{
s4+= a[i][j];
p4*= a[i][j];
}
}
cout<<jos:<<s1<< <<p1<<endl;
cout<<sus:<<s2<< <<p2<<endl;
cout<<stanga:<<s3<< <<p3<<endl;
cout<<dreapta:<<s4<< <<p4<<endl;
}
3. Funcia SumaDiagonale definit mai jos calculeaz suma elementelor situate pe
diagonala principal i pe diagonala secundar a unei matrici A ptrat, de dimensiune
nxn:
void SumaDiagonale (int a[10][10],int n)
{
int SumaDiagonala1=0, SumaDiagonala2=0;
for (int i=0;i<n;i++)
{
SumaDiagonala1+=a[i][i];
SumaDiagonala2+=a[n-i-1][i];
}
cout<<"Suma elementelor diagonalei principale:"<< SumaDiagonala1<<endl;
cout<<"Suma elementelor diagonalei secundare:"<< SumaDiagonala2<<endl;
}
105

Programarea Calculatoarelor

4. Funcia SumaLinii definit mai jos calculeaz suma elementelor situate pe liniile unei
matrici A, de dimensiune mxn:
void SumaLinii (int A[10][10],int m,int n)
{
for (int i=0;i<m;i++)
{
int Suma=0;
for (int j=0;j<n;j++)
Suma+=A[i][j];
cout<<Suma<<endl;
}
5. Se citete o matrice cu m linii i n coloane. S de determine o linie din matrice care
conine cele mai multe elemente nenule.
#include <iostream.h>
#include <conio.h>
int m, n, v[100], a[100][100];
void citire ( )
{
cout<<"m="; cin>>m; cout<<"n="; cin>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
};
}
void nenule(int i)
{
int j;
v[i]=0;
for(j=1;j<=n;j++)
if(a[i][j]!=0) v[i]++;
}
void maxim( )
{
int i, l, max=0;
for(i=1;i<=m;i++)
if(v[i]>max)
{
max=v[i];
l=i;
};
106

Programarea Calculatoarelor

cout<<l;
}
main ( )
{
int i,l;
citire ( );
for(i=1;i<=m;i++)
nenule (i);
maxim( );
getch();
}
6. Se d o matrice A(n,n). S se afle cte numere negative sunt deasupra diagonalei
principale.
#include<iostream.h>
#include <conio.h>
int i,n, a[100][100];
void citire( )
{
int j ;
cout<<n=; cin>>n;
for(i=1;i<=n;i++)
for( j=1;j<=n;j++)
{
cout<<a[<<i<<,<<j<<]= ;
cin>>a[i][j];
};
}
int negative( )
{
int j, nr=0 ;
for(i=1;i<=n-1;i++)
for( j=i+1;j<=n;j++)
if(a[i][j]<0) nr++;
return nr;
}
main( )
{
citire( );
cout<<negative( )<<numere;
getch();
}

107

Programarea Calculatoarelor

7. Se consider o funcie dat prin domeniul i codomeniul su. Domeniul are m elemente,
iar codomeniul are n elemente.
Legea de compoziie este definit astfel: fie A o matrice cu m linii i n coloane a..
1, dac elementului i din domeniul de definiie i
corespunde elementul j din codomeniu
A[i,j] =
0, altfel
S se studieze bijectivitatea funciei.
Soluie:
Funcia este bine definit dac unui element din domeniu i corespunde un unic element din
codomeniu, deci suma elementelor de pe fiecare linie este egal cu 1.
Funcia este injectiv dac unui element din codomeniu i corespunde cel mult un element din
domeniul de definiie, deci suma elementelor de pe fiecare coloan este cel mult egal cu 1.
Funcia este surjectiv dac unui element din codomeniu i corespunde cel puin un element din
domeniul de definiie, deci suma elementelor de pe fiecare coloan este cel puin egal cu 1.
#include<iostream.h>
#include<process.h> // prototipul pt. funcia exit
void main ( )
{
int a[10][10], m, n, i, j, sl, sc, binedef=1, inj=1, surj=1;
cout<<numarul de linii :; cin>>m;
cout<<numarul de coloane :; cin>>n;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{
cout<<a[<<i<<,<<j<<];
cin>>a[i][j];
}
for (i=1;i<=m;i++)
{
sl=0;
for (j=1;j<=n;j++) sl += a[i][j];
if(sl !=1) binedef=0;
}
if(binedef = =0)
{
cout<<functia nu este bine definita;
exit(1);
}
o valoare diferita de 0 pt.
for (j=1;j<=n;j++)
parametrul functiei exit indica o
terminare anormala a executiei
{
programului
sc=0;
108

Programarea Calculatoarelor

for (i=1;i<=m;i++) sc += a[i][j];


if(sc >1) inj=0;
}
if(inj) cout<<functie injectiva<<endl;
else cout<<functie neinjectiva<<endl;
for (j=1;j<=n;j++)
{
sc=0;
for (i=1;i<=m;i++) sc += a[i][j];
if(sc <1) surj=0;
}
if(surj) cout<<functie surjectiva<<endl;
else cout<<functie nesurjectiva<<endl;
}
8. Se d o matrice A(m,n). S se afle pentru fiecare linie c.m.m.d.c. al elementelor liniei.
#include<iostream.h>
int i,m,n, a[100][100];
void citire( )
{
int j ;
cout<<m=; cin>>m; cout<<n=; cin>>n;
for(i=1;i<=m;i++)
for( j=1;j<=n;j++)
{
cout<<a[<<i<<,<<j<<]= ;
cin>>a[i][j];
};
}
int divizor(int i)
// calculam c.m.m.d.c. pentru linia i: d = (.((a[i][1], a[i][2]), a[i][3]),.., a[i][n])
{
int j,d;
d=a[i][1];
for( j=2;j<=n;j++)
while(d!=a[i][j])
if(d>a[i][j]) d=d-a[i][j];
else a[i][j]=a[i][j]-d;
return d;
}
void main( )
{
citire( );
for(i=1;i<=m;i++)cout<< divizor(i);
109

Programarea Calculatoarelor

}
Obs: am folosit urmtorul algoritm pt. calculul c.m.m.d.c. a dou numere a i b:
while(a!=b)
if(a>b)a=a-b;
else b=b-a;
cout<<a;

Probleme propuse
1. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle maximul elementelor
din matrice.
2. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle minimul elementelor
din matrice.
3. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle elementele maxime
de pe fiecare linie.
4. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle elementele minime de
pe fiecare linie.
5. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle elementele maxime
de pe fiecare coloan.
6. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle elementele minime de
pe fiecare coloan.
7. Se citete de la tastatur o matrice cu m linii i n coloane.
S se afle suma elementelor din matrice care se gsesc pe linie par i coloan impar.
8. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle cte elemente pare,
impare i nule sunt n matrice.
9. Se citete de la tastatur o matrice cu m linii i n coloane. S se afieze matricea n care
fiecare element este adunat cu k.
10. Se citete de la tastatur o matrice cu m linii i n coloane. S se afieze matricea n care
fiecare element este nmulit cu k.
11. Se citete de la tastatur o matrice cu m linii i n coloane. S se afle media aritmetic a
elementelor pozitive i pare din matrice.

110

Programarea Calculatoarelor

12. Scriei un program care s verifice dac dou matrice citite de la tastatur, cu m linii i
n coloane sunt egale.
13. Se citete de la tastatur o matrice cu m linii i n coloane. S se afieze liniile matricii
care au elementele ordonate descresctor. n caz c nu exist nici o astfel de linie, se va
afia un mesaj corespunztor.
14. Se citete de la tastatur o matrice cu m linii i n coloane. S se afieze coloanele
matricii care au elementele ordonate cresctor. n caz c nu exist nici o astfel de coloan,
se va afia un mesaj corespunztor.
15. Se citete de la tastatur o matrice cu m linii i n coloane. S se afieze indicele liniilor i
coloanelor care au numai elemente pare.
16. Se citete de la tastatur o matrice cu m linii i n coloane i un
numr k, 1km. S se afle maximul dintre elementele pare ale liniei k a matricei.
17. Se citete de la tastatur o matrice cu m linii i n coloane i un numr k, 1kn. S se
afle minimul dintre elementele impare ale coloanei k a matricei.
18. Se citesc de la tastatur dou matrice A (m,n) i B (m,p). S se genereze i s se afieze
matricea C (m, n+p) format astfel :
C = [A B].
19. Se citete de la tastatur o matrice cu n linii i n coloane. S se afle media aritmetic a
elementelor de deasupra diagonalei principale.
20. Se citete de la tastatur o matrice cu n linii i n coloane. S se afle media aritmetic a
elementelor de deasupra diagonalei secundare.
21. Se citete de la tastatur o matrice cu n linii i n coloane. S se afle produsul
elementelor de sub diagonala principal.
22. Se citete de la tastatur o matrice cu n linii i n coloane. S se afle produsul
elementelor de sub diagonala secundar.
23. Se citete de la tastatur o matrice cu n linii i n coloane. S se verifice dac este
simetric fa de diagonala principal.
24. Se citete de la tastatur o matrice cu n linii i n coloane. S se verifice dac este
simetric fa de diagonala secundar.
25. Se citete de la tastatur o matrice cu n linii i n coloane. S se verifice dac este
superior triunghiular fa de diagonala principal (elementele de sub diagonala
principal sunt nule).

111

Programarea Calculatoarelor

26. Se citete de la tastatur o matrice cu n linii i n coloane. S se verifice dac este inferior
triunghiular fa de diagonala principal (elementele de deasupra diagonalei principale
sunt nule).
27. Se citete de la tastatur o matrice cu n linii i n coloane. S se verifice dac este
superior triunghiular fa de diagonala secundar (elementele de sub diagonala
secundar sunt nule).
28. Se citete de la tastatur o matrice cu n linii i n coloane. S se verifice dac este inferior
triunghiular fa de diagonala secundar (elementele de deasupra diagonalei secundare
sunt nule).
29. Se citete de la tastatur o matrice cu m linii i n coloane i un numr p, 1pm. S se
afieze matricea cu linia p eliminat.
30. Se citete de la tastatur o matrice cu m linii i n coloane i un numr p, 1pn. S se
afieze matricea cu coloana p eliminat.
31. Se citete de la tastatur o matrice cu m linii i n coloane i un numr p, 1pm,
mpreun cu n valori (se citete o nou linie). S se afieze matricea cu noua linie, inserat
pe poziia p.
32. Se citete de la tastatur o matrice cu m linii i n coloane i un numr p, 1kn,
mpreun cu m valori (se citete o nou coloan). S se afieze matricea cu noua coloan,
inserat pe poziia k.
33. Se citete de la tastatur o matrice cu m linii i n coloane. S se genereze i s se afieze
un vector format din elementele matricii.
34. Se citete de la tastatur o matrice cu m linii i n coloane care conin numai numere 0 i
1. Fiecare linie constituie reprezentarea n baza 2 a unui numr natural. S se afle
numerele.
35. Se citete de la tastatur o matrice cu m linii i n coloane care conin numai numere 0 i
1. S se afieze perechile de linii complementare (suma elementelor de pe aceeai poziie din
cele dou linii este egal cu 1). Se afieaz indicii liniilor respective.
36. Se citete de la tastatur o matrice cu m linii i n coloane care conin numai numere 0 i
1. S se afieze perechile de coloane complementare (suma elementelor de pe aceeai
poziie din cele dou coloane este egal cu 1). Se afieaz indicii coloanelor respective.
37. Se citete de la tastatur o matrice cu n linii i n coloane. S se copieze ntr-un vector
elementele pozitive aflate deasupra diagonalei principale.
38. Se citete de la tastatur o matrice cu n linii i n coloane. S se copieze ntr-un vector
elementele pozitive aflate sub diagonala principal.
112

Programarea Calculatoarelor

39. Se citete de la tastatur o matrice cu n linii i n coloane. S se copieze ntr-un vector


elementele negative aflate deasupra diagonalei secundare.
40. Se citete de la tastatur o matrice cu n linii i n coloane. S se copieze ntr-un vector
elementele negative aflate sub diagonala secundar.
41. Se citete de la tastatur o matrice cu m linii i n coloane. S se afieze toate liniile
simetrice din matrice. O linie se numete simetric, dac elementele sale egal deprtate de
capete sunt identice.
42. Se citete de la tastatur o matrice cu m linii i n coloane i un numr x. S se afle de
cte ori apare x pe marginea matricei.
43. Se citete de la tastatur o matrice cu n linii i n coloane i un numr natural p. S se
verifice dac elementele de pe coloana p sunt n progresie aritmetic.
44. Se citete de la tastatur o matrice cu n linii i n coloane i un numr natural p. S se
verifice dac elementele de pe linia p sunt n progresie aritmetic.
45. Se citete de la tastatur o matrice cu n linii i n coloane. S se determine media
aritmetic a elementelor din matrice care se termin n 0 i se gsesc pe cele dou diagonale.

113

Programarea Calculatoarelor

Laborator 13

13. POINTERI I TABLOURI


1. Ce se afieaz n urma execuiei secvenei urmtoare?
int x[50],*a,*b;
a=x+5; b=x+10;
cout<<(b - a);
a) 10

b) 5

c) 15

d) 20

2. Ce se afieaz n urma execuiei secvenei urmtoare?


int x[100],*a,*b=x+10;
for ( a=x; a<b; a++) *a=(b - a);
cout<<x[5];
a) 5

b) 10

c) 100

d) 50

3. Pentru declaraia: int *p; Care din urmtoarele instruciuni afieaz corect coninutul
de la adresa indicat de p?
a) cin>>*p; b) cin>>&p; c) cout<<*p; d) cout<<&(*p) ;
4. Ce se afieaz n urma execuiei secvenei urmtoare?
int x=10,*adresa=&x;
(*adresa)++;
cout<<*adresa<< <<x;
a) 5 5

b) 10 10

c) 10 11

d) 11 11

5. Ce se afieaz n urma execuiei secvenei urmtoare?


int x[100],*a, i;
*a=x;
for (i=0;i<10;i++) { *a=i; a--; }
cout<<*(x+10);
a) 10

114

b) 1

c) 5

d) secvena conine erori

Programarea Calculatoarelor

6. Ce se afieaz n urma execuiei secvenei urmtoare?


int p=10,q=20,&a=p,&b=q;
a=20;
--a ;
--b ;
cout<<p<< <<q;
a) 20 20

b) 19 19

c) 19 20

d) 10 10

7. Ce se afieaz n urma execuiei secvenei urmtoare?


#include<iostream.h>
void main()
{
int *x, *y;
float a=10.0;
int b=20;
*x=a;
*y=b;
cout<<*x<<" "<<*y<<endl;
}
a) 10.0 20

b) 20 20

a) 10.0

10.0

e) Apare eroare la execuie

8. S se citeasc elementele unui vector cu maxim 10 elemente ntregi i s se nlocuiasc


elementul minim din vector cu o valoare introdus de la tastatur, folosind lucrul cu
pointeri.
#include <iostream.h>
void main()
{
int i, n, min, indice, val, v[10];
cout<<dimensiune vector:; cin>>n;
for (i=0; i<n; i++)
{
cout<<v[<<i<<]=;
cin>> (v+i);
}
min= v;
indice=0;
for (i=0; i<n; i++)
if (min>= (v+i))
{
115

Programarea Calculatoarelor

min= (v+i);
indice=i;
}
cout<<valoarea de inlocuire:; cin >> val;
(v+indice)=val;
for (i=0; i<n; i++)
cout<< (v+i)<< ;
}
9. S se citeasc elementele unei matrici cu maxim 10 rnduri i 10 coloane cu elemente
ntregi i s se afieze, folosind lucrul cu pointeri.
#include <iostream.h>
void main()
{
int i, j, n, a[10][10];
cout<<"dimensiune matrice";cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"a["<<i<<","<<j<<"]=";
cin>>*(*(a+i)+j)
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
cout<<*(*(a+i)+j)<<" ";
cout<<endl;
}
}

116

Programarea Calculatoarelor

Laborator 14

14. IRURI DE CARACTERE


1) Se d un ir de caractere. S se scrie o funcie (n program) care s numere de cte ori
apare caracterul A ntr-un ir.
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
char s[30];
int numar()
{
int i,k=0;
for (i=0;i<strlen(s);i++)
if (s[i]= =A)k++;
return k;
}
void main()
{
gets(s);
cout<<numar();
getche();
}
2) Se d o fraz (mai multe propoziii separate de .,!,?). S se afle cte propoziii sunt n
fraz.
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
char s[30]; int k;
void main()
{
gets(s); k=0;
for (i=0; i<strlen(s); i++)
if ((s[i]= =.)||(s[i]= = !)||(s[i]= =?))k++;
cout<<k;
getch();
}
117

Programarea Calculatoarelor

3) S se ncerce funciile predefinite.


#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
char s1[30],s2[30];
int n;
char c;
void main()
{
gets(s1); gets(s2); cin>>n; cin>>c;
cout<<strlen(s)=<<strlen(s)<<endl;
cout<<strcpy(s1,s2)=<<strcpy(s1,s2)<<endl;
cout<<strcat(s1,s2)=<<strcat(s1,s2)<<endl;
cout<<strncat(s1,s2,n)=<<strncat(s1,s2,n)<<endl;
cout<<strcmp(s1,s2)=<<stricmp(s1,s2)<<endl;
cout<<strncmp(s1,s2,n)=<<strcnmp(s1,s2,n)<<endl;
cout<<strchr(s1,c)=<<strchr(s1,c)<<endl
.
}
4) Se citete un text. S se scrie o funcie (n program) care s elimine spaiile.
char s1[100], s2[100];
void elimin()
{
char * p;
p=strtok(s1,_);
strcpy(s2,p);
//copiez in s2 prima entitate gasita in sirul s1
while(p)
{
p=strtok(NULL,_); /* de cate ori gasesc cate o entitate, o
alipesc la s2*/
strcat(s2,p);
}
}
void main()
{
gets(s1);
elimin();
puts(s2);
}

118

Programarea Calculatoarelor

5) Se citete un text. S se rearanjeze literele n ordine alfabetic, pastrnd locul cuvintelor.


Numai literele sunt afectate, celelalte caractere rmn neschimbate.
Ex: Ana_are_3_ani.
Aaa_aei_3_nnr.
char s1[100], s2[100]
void ordonez()
{
int i,j;
for (i=0; i<=strlen(s1)-2;i++)
for (j=i+1; j<=strlen(s1)-1;j++)
6) Se citete un text. S se afieze toate cuvintele din text formate din k caractere.
char s[100], *p;
int k;
void main()
{
gets(s); cin>>k;
p=strtok(s,_);
if (strlen(p)= =k) cout<<p;
while (p)
{
p=strtok(NULL,_);
if(strlen(p)= =k)cout<<p;
}
}
7) Se citete un text. S se afieze toate cuvintele de lungime maxim.
char s[100], a[100][100], *p; // vector de cuvinte
//( matrice: a[k] cuvant de tipul char[100] )
int max;
void main()
{
gets(s);
int k=0;
p=strtok(s,_);
k++;
strcpy(a[k],p);
//in a[k] se introduc pe rand cuvintele din text
while(p)
{
p=strtok(NULL,_)
k++;
strcpy(a[k],p);
}
119

Programarea Calculatoarelor

max=0; int i;
for (i=1,i<=k;i++)
if (max<strlen(a[i])) max=strlen(a[i]);
for (i=1; i<=k;i++)
if (strlen (a[i])= =max) cout<<a[i]<<endl;
}
8) Se dau dou numere sub form de iruri de caractere. S se afle suma i diferena.
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
char s1[20],s2[20];
int n1,n2;
void main()
{
gets(s1);gets(s2);
n1=atoi(s1);
n2=atoi(s2);
cout<<suma=<<n1+n2; cout<<diferenta=<<n1-n2;
}
9) S se verifice dac dou cuvinte se pot obine unul din cellalt prin permutarea literelor
circular la stnga.
Exemplu: s1 = arc
s2 = car
Obs:
- nr de permutari=nr de litere din s1
- la fiecare permutare se obtine un cuvant pe care-l comparam cu s2
char s1[100], s2[100], aux;
void main()
{
gets(s1); gets(s2);
int i,j,b=0;
for (i=1;i<=strlen(s1);i++)
{
aux=s1[0];
for (j=1; j<=strlen(s1)-1,j++) s1[j-1]=s1[j];
s1[strlen(s1)-1]=aux;
if (strcmp(s1,s2)= =0) b=1;
}
if (b= =1) cout<<da;
else cout<<nu;
120

Programarea Calculatoarelor

}
dac strlen(s1) = n, avem:
aux

s1[0]
s1[0]
s1[1]
.................................
s1[n-2]
s1[n-1]

s1[n-1]
aux

10) Se d un ir de caractere care conine cuvinte separate de spaiu. S se afieze


distribuia lungimii cuvintelor din ir.
Ex.: s=Toamna_acesta_ploua_foarte_tare_desi_nu_prea_imi_place_acest_lucru
1 cuvant de lungime 2
1 cuvant de lungime 3
3 cuvant de lungime 4
4 cuvant de lungime 5
2 cuvant de lungime 6
1 cuvant de lungime 7
- Se citete sirul.
- Se scot cuvintele i se posteaz ntr-un vector a
- n vectorul v se posteaz lungimea fiecrui cuvnt
-Se ordoneaz vectorul cresctor i se numr cte cuvinte din vectorul a au lungimea v[i]
Char s1[100], a[100][100] , *p;
int v[100] ;
void main ( )
{
gets (s1) ; int k=0 , i , j , aux ;
p=strtok(s, _) ;
k++
strcpy (a[k], p);
v[k]=strlen(p);
while (p)
{
p=strtok(null , _); k++;
strcpy(a[k],p);
v[k]=strlen(p);
}
for (i=1 ; i<=k-1 ; i++)
for (j=i+1 ; j<=k ; j++)
if (v[i]>v[j])
{
121

Programarea Calculatoarelor

aux=v[i];
v[i]=v[j];
v[j]=aux;
};
for (i=1 ; i<=k ; i++)
{
int nr=0;
for (j=1 ; j<=k; j++)
if (strlen(a[j]==v[i]) nr++;
coutt<<nr<<cuvinte de lungime <<v[i]<<endl;
}
}
11) Se citete un cuvnt . Sa se afieze toate prefixele cuvntului .
Ex.: animal a , an , ani , anim , anima , animal
char s[20]; int i,j
void main ( )
{
gets(s);
for ( i=0 ; i<=strlen(s)-1 ; i++)
{
for (j=0 ; j<=i ; j++) cout <<s[j]<< _;
cout <<endl;
}
}
12) Se citesc de la tastatur n linii de text. S se afieze linia de text cea mai lung.
char s[100] , ss[100];
int n , max , i ;
void main ( )
{
cin>>n ;
max=0 ;
for (i=1 ; i<=n ; i++)
{
gets(s);
if (strlen(s)>max)
{
max=strlen(s);
strcpy(ss,s);
}
}
122

Programarea Calculatoarelor

cout<<ss<<endl;
}
13) Se da un fiier input.txt care conine o fraz. S se elimine din fraz vocalele i s se
afieze ce a rmas n output.txt .
char s[100];
int i,n;
void main( )
{
ifstream f(input.txt);
ofstream g(output.txt);
f.getline(s,100);
for (i=0 ; i<=strlen(s)-1; i++)
if (strchr(BC____Zbc__z,s[i] )) g<<s[i];
f.close( ) ;
g.close( ) ;
}
14) Se d un fiier care conine un ir de caractere. S se mreasc toate numerele care
apar n ir cu 12%. Afiarea se va face n alt fiier .
char s[100] , *p ;
Void main( )
{
ifstream f(sir.txt);
ofstream g(sirnr.txt);
f.getline(s,100);
p=strtok(s,_);
if (atoi(p)) g<<112/100*atoi(p)<<_ ;
while (p)
{
p=strtok(NULL, _);
if (atoi(p)) g<<112/100*atoi(p)<<_ ;
}
f.close( );
g.close( ) ;
}
15) S se afieze cuvintele din textul s care ncep i se termin cu aceeai liter .
char s[100], *p ;
gets(s);
void cuvinte( )
{
123

Programarea Calculatoarelor

p=strtok(s,_) ;
if (p[o]==p[strlen(p)-1]) cout <<p<<_ ;
while (p)
{ p=strtok (NULL,_) ;
if(p[o]= =p[strlen(p)-1]) cout<<p<<_ ;
}
void main( )
{
cuvinte( ) ;
}
16) Se citete un text de la tastatur . nlocuii n text fiecare vocal cu p .
void (main)
{
char s[100], b[100] , voc[10]=AEIOUaeiou;
int i;
gets(s) ;
for (i=o; i<=strlen(s)-1; i++)
if (strchr(voc, s[i]))
{
strcat (b , a[i]) ;
strcat (b , p) ;
strcat (b , a[i]) ;
}
else strcat(b,a[i])
cout << b;
}
17) Se d o matrice ptrat cu n linii i n coloane. Scriei o funcie (ntr-un program) care
calculeaz de cte ori apare o valoare dat x , deasupra diagonalei principale.
#include < iostream.h >
Int n , a[100][100], x ;
void citire ( )
{
int i, j ;
for (i=1; i<=n ; i++)
for (j=1; j<=n ; j++)
cin >>a[i][j] ;
}
int cautare ( )
{
Int i ,j , k=0 ;
for (i=1 ; j<=n-1 ; i++)
124

Programarea Calculatoarelor

for (j=i+1 ; j<=n ; j++)


if ( a[i][j]= = x) k++ ;
return k;
}
void main ( )
{
cin>>n>>x ;
citire;
cout<<cautare( );
}

125

Programarea Calculatoarelor

126

Tiparul executat la
TIPOGRAFIA
UNIVERSITII MARITIME
Constana

127

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