Documente Academic
Documente Profesional
Documente Cultură
Laborator I
Informaii
Date
dispun
de
caracteristici
semantice,
orientate
spre
coninutul i sensul atribuit
reprezentrii realitii.
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 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
cod 2-4-2-1
0000
0001
0010
0011
0100
1011
1100
1101
1110
1111
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
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
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
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
12
Programarea Calculatoarelor
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:
Programarea Calculatoarelor
-30(10)
10011110(2)
inversare
11100001(2) +
00000001(2) se adaug valoarea 1
-------------11100010(2)
10011100(2) +
11100010(2)
-------------101111110(2) depire: rezultat pozitiv,
Incorect
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
c)011110000101 d)111100001010
b) 4312441
c) 3442112
d) 2314322
b) 8Fa64
c) C86DA
d) F64D9
b)141
c) 98
d) 216
b) 127
c) 255
d) 256
b) 4D5
c)2B6
d) 5C4
d)11011011
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
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
21
Programarea Calculatoarelor
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.).
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.
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
Programarea Calculatoarelor
Laborator 4
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)
b) !p && !q
c) !p && q
d) p || q
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
c) ntotdeauna
d) niciodat
Programarea Calculatoarelor
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
b) 30 c) 30.00
d) 30.0
b) infinit
c) 10 d) 1
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
b)800
c)750
d) 500
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
b)8
c)3
d) 5
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
Programarea Calculatoarelor
b) trei
c) doi
d) patru
b) 67
c) 4567
d) 456
b) 2 1 0 -1
c) 2 1
d) 2 1 0 -1 -2
b) 4 4 4. c) 20
d) 1
d) nu se afieaz nimic
37
Programarea Calculatoarelor
d) 20
15 10
10
5
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)
b) 30 c) 100 d) 20
Programarea Calculatoarelor
Laborator 6
CITETE n
NU
DA
n#0
DA
s=s+n
N
U
SCRIE s
CITETE n
STOP
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
Programarea Calculatoarelor
1
2
(x y
i 1
i 1
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
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
46
Programarea Calculatoarelor
a
k 1
i ,k
bk , j
Soluie:
47
Programarea Calculatoarelor
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
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
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
Programarea Calculatoarelor
54
Programarea Calculatoarelor
Laborator 7
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;
Programarea Calculatoarelor
Laborator 8
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
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
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
Programarea Calculatoarelor
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
Programarea Calculatoarelor
d-d1=v2*t
d1* t d v2 * t t
d
, iar
v1 v2
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
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
Programarea Calculatoarelor
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
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
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
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
Programarea Calculatoarelor
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
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
113
Programarea Calculatoarelor
Laborator 13
b) 5
c) 15
d) 20
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
114
b) 1
c) 5
Programarea Calculatoarelor
b) 19 19
c) 19 20
d) 10 10
b) 20 20
a) 10.0
10.0
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
Programarea Calculatoarelor
118
Programarea Calculatoarelor
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
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
125
Programarea Calculatoarelor
126
Tiparul executat la
TIPOGRAFIA
UNIVERSITII MARITIME
Constana
127