Documente Academic
Documente Profesional
Documente Cultură
Limbaje de Programare 2
Limbaje de Programare 2
LIMBAJE DE PROGRAMARE
CAPITOLUL 1.
ELEMENTE DE LOGIC MATEMATIC I ALGEBR BOOLEAN
1.1. Calculul propoziiilor
1.1.1. Noiunea de propoziie
DEFINIIA 1.1. Se numete propoziie un enun (un ansamblu de cuvinte
crora li s-a dat un sens) despre care se tie c este sau adevrat sau fals,
ns nu simultan i una i alta.
Exemple de propoziii:
1) n orice triunghi suma unghiurilor sale este egal cu 180o;
2) 3+2=5;
3) 2>5;
4) Balena este un mamifer.
5) Planeta Saturn este satelit al Pamntului.
Propoziiile 1), 2) i 4) sunt adevrate dar 3) i 5) sunt false.
O clas foarte larg de propoziii adevrate o constituie teoremele din
matematic.
Contraexemple (enunuri care nu sunt considerate propoziii):
1) x+2=5; (enunurile cu variabile sunt predicate)
2) Deschide ua !; (enun imperativ)
3) Numrul x divide numrul y; (predicat)
4) Atomul de aur este galben. (enun absurd)
1.1.2. Valoare de adevr
Notm cu P2 mulimea propoziiilor definite dup definiia 1.1.
DEFINIIA 1.2. Funcia v : P2 {0,1} se numete funcia valoare de adevr.
Fiecrei propoziii din mulimea propoziiilor P2 i se ataeaz valoarea 1 dac
propoziia este adevrat, i valoarea 0 dac este fals.
De obicei se vor nota propoziiile prin litere mici: p,q,r ... i cu v(p), v(q),
1
v(!p)
0
1
0
1
0
1
0
0
0
1
0
1
1
propoziia
compus (p)Vq a crei
1
0
1
0
1
1
1
0
0
1
1
0
1
v(p)
0
0
1
1
v(q) v(pq)
0
1
0
1
v(qp) v(pq)
1
1
0
1
1
0
1
1
1
0
0
1
Proprieti:
1) pV(qr) (pVq) (pVq)
2) p (qVr) (pq)V(pr)
3) p !(!p)
4) ! (pVq) !p !q
5) ! (pq) !p V !q
6) p q !p !q
7) pVq
qVp
8) pq
qp
distributivitai
negarea negaiei
legile lui De Morgan
principiul reducerii la absurd
comutativiti
0
1
0
1
1
1
0
1
0
0
0
1
!x
0
1
1
0
1. a (b c) = (a b) c
2. a (bc) = a ba c
3. a a = a
4. a b = b a
5. a (ab) = a
6. ! ! a = a
7. ! (a b) = !a !b
8. a 0 = 0
9. a 1 = a
10. a !a = 0
a(bc) = (ab)c
abc = (ab)(ac)
aa = a
ab = ba
aa b = a
! (ab) = !a !b
a0 = a
a1 = 1
a!a = 1
(Asociativiti)
(Distributiviti)
(Idempotene)
(Comutativiti)
(Absorbii)
(Dubla negaie)
(Legile lui De Morgan)
0
1
0
1
1
0
x2
...
xn-1
xn
f(x)
...
y0
...
y1
...
y2
...
y3
...
...
...
...
...
...
...
y2n-2
...
y2n-1
f(a,b,c)
0
0
0
1
1
0
0
1
0
1
1
0
1
0
1
0
1
1
0
1
1
0
0
1
7
f(a,b,c) = !a b !c !a b c a b !c
Cei trei termeni conjunctivi corespund liniilor y2, y3 i y6. Valorile celor trei
variabile n aceste linii sunt respectiv 010, 011 i 110. Aplicnd cele trei reguli,
se obine formula de mai sus.
Dup cum este cunoscut din calculul propoziiilor, o funcie boolean
8
poate avea mai multe reprezentri prin expresii. Acelai calcul al propoziiilor
definete diverse forme normale i descrie metode de simplificare a expresiilor
care reprezint funcii booleene. Obinerea unei expresii prin regulile R1-R3 de
mai sus conduce la forma normal disjunctiv perfect.
CAPITOLUL 2.
SISTEME I BAZE DE NUMERAIE
Numim sistem de numeraie totalitatea regulilor folosite pentru scrierea
numerelor, cu ajutorul unor simboluri numite cifre. n decursul istoriei s-au
impus mai multe sisteme de numeraie.
2.1. Tipuri de sisteme de numeraie
Cel mai primitiv mod de reprezentare a numerelor este rbojul. Pe un
b numit rboj, omul primitiv cresta cte o linie pentru fiecare obiect sau
animal care-i aparinea (blnuri, oi etc.). Tot pe un astfel de rboj se marcau
datoriile unui gospodar fa de altul (de unde i cunoscuta expresie "am scris
pe rboj").
S-a constatat c acest mod de scriere a numerelor este deosebit de
incomod. Pentru numere mari trebuie folosite multe semne, eventual trebuie
folosite semne diferite pentru numere mai deosebite (10, 50, 100 etc.). Aceste
semne se combin n diferite moduri. Dup felul de grupare i ordonare a
semnelor se deosebesc dou sisteme de numeraie: sistemul aditiv i sistemul
poziional.
2.1.1. Sistemul de numeraie aditiv (roman)
Sistemul de numeraie roman folosete pentru scrierea numerelor cifrele:
I, V, X, L, C, D, M
care corespund valorilor: unu, cinci, zece, cincizeci, o sut, cinci sute, respectiv
o mie.
Trei reguli importante guverneaz acest sistem de numeraie:
Regula 1. Mai multe cifre de aceeai valoare, scrise consecutiv,
reprezint suma acestor cifre.
De exemplu: XXX = 30; II = 2; MM = 2000.
IC = 100-1 = 99.
10
x = cnbn+cn-1bn-1+...+c1b+c0+c-1b-1+c-2b-2+c-3b-3...
ci {0,1,...,b-1} , i {n,...,1,0,-1,-2,-3,...}
cn 0
k 0 j < k astfel, nct cj < b-1
(cncn-1...c1c0)b
reprezint, n baza b, partea iintreag a numrului x, iar numrul
(0,c-1c-2c-3...)b
reprezint, n baza b, partea fracionar a numrului x.
DEFINITIA 2.2 Reprezentarea unui numr real x n baza b (extinderea
definiiei 4.1 la toate numerele reale).
a) Dac x > 0, atunci numrul se reprezint conform def. 2.1.
b) Dac x = 0, atunci x se reprezint 0.
c) Dac x < 0, atunci se pune mai nti semnul -, dup care urmeaz
reprezentarea numrului -x, conform definiiei 2.1.
reine de fiecare dat restul, iar ctul va deveni noul demprit. Resturile,
luate n ordinea invers a apariiei, vor fi cifrele n noua baz q.
Demprit
(baza 10)
Impritor
(q)
(baza 10)
Ct
(baza 10)
Rest
(cn)
(baza 10)
Simbol
cifr (Cn)
(baza 6)
0
1
2
3
4
5
6
7
985437
164239
27373
4562
760
126
21
3
6
6
6
6
6
6
6
6
164239
27373
4562
760
126
21
3
0
3
1
1
2
4
0
3
3
3
1
1
2
4
0
3
3
n
0
1
2
3
4
Demprit
(baza 10)
985437
61589
3849
240
15
Impritor
(q)
(baza 10)
16
16
16
16
16
Ct
(baza 10)
Rest
(cn)
(baza 10)
Simbol
cifr (Cn)
(baza 16)
61589
3849
240
15
0
13
5
9
0
15
D
5
9
0
F
n
0
1
2
3
4
Demprit Impritor
(baza 6)
(q)
(baza 6)
33042113
1153045
25453
1040
23
24
24
24
24
24
Ct
(baza 6)
Rest
(cn)
(baza 6)
Simbol
cifr (Cn)
(baza 16)
1153045
25453
1040
23
0
21
5
13
0
23
D
5
9
0
F
51437
8
17
4
0
7
-
11496
91968
35744
----
60
8
4
2
1
4
6
3
1
-
6
8
4
2
6
--
8 5
6 0
6
6
---
16
7772
7704
6650
422
(12)8
; (11)8 = (9)10
; (10)8 = (8)10
5 264
3 410
-- ----Rezult c (0,4631)8 = (0,599853...)10. Aceasta nseamn c n loc de (0,6)10,
n urma dublei conversii, se obine (0,599853...)10.
2.3. Relaii ntre bazele 2, 8 i 16
2.3.1. Cifre binare, octale, zecimale, hexazecimale
n informatic, bazele 2, 8 i 16 au o deosebit importan. Dup cum se
va vedea imediat, conversiile ntre aceste baze se pot realiza deosebit de
simplu. Ca terminologie, vom spune c lucrm n sistemul binar dac baza
este 2, sistemul octal dac baza este 8 i sistemul hexazecimal dac baza
este 16. n acest context, este firesc s folosim termenul de sistem zecimal
dac baza este 10.
Tabelul 2.4. conine corespondena ntre cele patru reprezentri ale
numerelor de la 0 la 15. Pentru o manevrare uoar ntre aceste patru baze de
numeraie, recomandm memorarea acestui tabel.
19
Zecim
al
Binar
Octal
Hexa
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
0
1
2
3
4
5
6
7
10
11
12
13
14
15
16
17
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
(D2A,3D)16
(0000,0010
0000
0111
0110
1100)2
(5DD8EF,77E)16.
Gruprile
( 2735 4357, 3576 )8 = (010 111 011 101 100 011 101 111 , 011
101 111 110)2 =
(0101 1101 1101 1000 1110 1111 , 0111 0111 1110 )2 = ( 5DD
8EF , 77E )16
23
CAPITOLUL 3.
CODIFICAREA INFORMAIEI
3.1. Noiunea de cod; exemple
Codificarea a aprut din necesitatea de a se face schimb de mesaje care
s poat fi nelese numai de ctre persoanele care cunosc cheia codificrii.
Aceste schimburi de mesaje sunt necesare atunci cnd se manipuleaz
informaii secrete. n astfel de comunicaii este esenial mecanismul de
codificare, care trebuie s fie suficient de complex nct s mpiedice
descifrarea lui de ctre persoane neautorizate sau ru intenionate.
Ca parte integrant a prelucrrii informaiilor cu ajutorul calculatorului,
codificarea urmrete transpunerea informaiei din forma ei primar ntr-o
form accesibil calculatorului. Mecanismul codificrii trebuie s fie simplu,
astfel nct s poat fi automatizat n mod eficient.
3.1.1. Definirea codului
Trecnd peste particulariti i diferene de exprimare, se poate crea un
model matematic cuprinztor i general al procesului de codificare. S notm
prin:
S = { s1, s2, ..., sp }
mulimea simbolurilor primare de informaie. Dup caz, S poate fi mulimea
caracterelor ce se pot tipri, o mulime de cuvinte dintr-un anumit limbaj sau
limb, o submulime finit de numere etc. S notm prin:
A = { a1, a2, ..., aq }
un alfabet al codificrii, n care elementele ai le vom numi litere. Cu ajutorul
literelor alfabetului A, elementele mulimii S vor fi reprezentate ntr-o nou
form, forma codificat. Vom nota prin An mulimea tuturor cuvintelor de
lungime n formate cu litere din A. Deci
An = { w w = ai1ai2...ain / aijA, j = 1,n }
Prin A+ vom nota mulimea tuturor cuvintelor ce se pot forma cu litere din A.
Deci
24
A+ = A A2 ... An ...
DEFINIIA 3.1. O aplicaie injectiv C : S A+ se numete codificare a
simbolurilor din S, sau mai simplu, cod.
DEFINIIA 3.2. Un cod pentru care toate cuvintele de cod au aceeai lungime
n se numete uniform, iar n se numete lungimea codului. n acest caz avem
c
C : S An
Codurile care nu sunt uniforme se numesc coduri neuniforme.
3.1.2. Exemple simple de coduri
S stabilim o coresponden ntre cifrele zecimale i reprezentarea
lor binar. n acest caz avem de-a face cu un cod uniform, n care:
S = { 0, 1, ..., 9 }, A = B2 = { 0 , 1 }, n = 4
Codificarea prin funcia de codificare C este cea cunoscut, adic:
C(0) = 0000, C(1) = 0001, C(2) = 0010, ..., C(9) = 1001
Este binecunoscut alfabetul Morse. El este un cod pentru care S este
mulimea literelor mici, a cifrelor zecimale i a unor semne speciale. Mulimea
A este format din "." (punct); "-" (linie), care are ca lungime echivalentul a trei
puncte; "pauza" care poate avea trei lungimi: lungime de un punct ntre dou
semne din A, de trei puncte ntre dou semne din S, de cinci puncte ntre dou
cuvinte din S. Tabelul 3.1 definete funcia C pentru alfabetul Morse.
Mesajele n cod Morse sunt afiate de regul pe o band ngust i
continu de hrtie. Pn la apariia mijloacelor moderne de comunicaie, acest
cod s-a folosit pe scar larg n telegrafie i n transportul feroviar. Codul
Morse a fost astfel conceput nct caracterele mai frecvente s aib
codificarea mai scurt. Din punctul de vedere al modelului matematic, codul
Morse este cod neuniform, deoarece cuvintele de codificat au lungimi
cuprinse ntre 1 i 6 litere din A.
a
.-
-.
.----
.-.-
---
..---
25
-...
---.
...--
-.-.
.--.
....-
-..
--.-
.....
.-.
-....
..-.
...
--...
--.
----
---..
....
----.
..
..-
-----
.---
..--
......
-.-
...-
.-.-.-
.-..
.--
-.-....
--
-..-
---...
-.--
..--..
--..
--..--
11
12
212
222
31
321
322
211
3321
3312
l = { a, b, ..., z }, L = { A, B, ..., Z },
c = { 0, 1, ..., 9 }, s = { _, +, ;, :, $, ... },
f = {CR, LF, TAB, FF, BEL, BS, . . . }
n continuare, vom nota S = l L c s f. nainte de a descrie
condiiile codificrii, s prezentm rolul ctorva dintre caracterele funionale,
simbolizate mai sus prin grupuri de litere mari. CR provoac deplasarea
dispozitivului de afiare (tiprire) la nceput de rnd (Carriage Return). LF
provoac deplasarea dispozitivului cu un rnd mai jos (Line Feed), pstrnduse poziia n cadrul rndului. De obicei, se folosete succesiunea de caractere
CR LF pentru a separa dou linii de afiat, efectul lor cumulat fiind trecerea la
nceputul rndului urmtor. TAB este caracterul de tabulare, deci avansul
dispozitivului la poziia urmtorului stop de tabulare (de obicei peste 5-8
caractere). FF (Form Feed) provoac trecerea la pagina (ecranul) urmtoare
(urmtor). BEL provoac emiterea unui semnal sonor, iar BS provoac
deplasarea dispozitivului de afiare (tiprire) cu o poziie spre stnga, n
vederea tergerii (supraimprimrii) ultimului caracter.
Funcia de codificare se definete astfel:
C: S [0,m] ,
unde m este 127 sau 255. Dac considerm reprezentarea binar, avem de-a
face cu un cod uniform pe 7 bii, respectiv pe 8 bii. Avnd n vedere faptul c
octetul este unitatea de adresare a memoriei, codul pe 7 bii se extinde la 8 bii
punnd 0 la bitul cel mai semnificativ. Deci codificarea unui caracter este un
numr care ncape pe un octet.
0
1
2
3
4
5
6
7
8
9
10
11
00
01
02
03
04
05
06
07
08
09
0A
0B
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
TAB
LF
VT
32 20
33 21
34 22
35 23
36 24
37 25
38 26
39 27
40 28
41 29
42 2A
43 2B
64 40 @
65 41 A
66 42 B
67 43 C
68 44 D
69 45 E
70 46 F
71 47 G
72 48 H
73 49 I
74 4A J
75 4B K
!
"
#
$
%
&
'
(
)
*
+
28
96 60 `
97 61 a
98 62 b
99 63 c
100 64 d
101 65 e
102 66 f
103 67 g
104 68 h
105 69 I
106 6A j
107 6B k
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0C
0D
0E
0F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
44 2C
45 2D
46 2E
47 2F
48 30
49 31
50 32
51 33
52 34
53 35
54 36
55 37
56 38
57 39
58 3A
59 3B
60 3C
61 3D
62 3E
63 3F
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
76 4C L
77 4D M
78 4E N
79 4F O
80 50 P
81 51 Q
82 52 R
83 53 S
84 54 T
85 55 U
86 56 V
87 57 W
88 58 X
89 59 Y
90 5A Z
91 5B [
92 5C \
93 5D ]
94 5E ^
95 5F _
108 6C l
109 6D m
110 6E n
111 6F o
112 70 p
113 71 q
114 72 r
115 73 s
116 74 t
117 75 u
118 76 v
119 77 w
120 78 x
121 79 y
122 7A z
123 7B {
124 7C |
125 7D }
126 7E ~
127 7F _
160 A0
161 A1
192 C0
193 C1
29
224 E0
225 E1
130 82
131 83
132 84
133 85
134 86
135 87
136 88
137 89
138 8A
139 8B
140 8C
141 8D
142 8E
143 8F
144 90
145 91
146 92
147 93
148 94
149 95
150 96
151 97
152 98 _
153 99
154 9A
155 9B
156 9C
157 9D
158 9E _
159 9F
162 A2
163 A3
164 A4
165 A5
166 A6
167 A7
168 A8
169 A9 _
170 AA
171 AB
172 AC
173 AD
174 AE
175 AF
176 B0
177 B1
178 B2
179 B3
180 B4
181 B5
182 B6
183 B7
184 B8
185 B9
186 BA
187 BB
188 BC
189 BD
190 BE
191 BF
194 C2
195 C3
196 C4
197 C5
198 C6
199 C7
200 C8
201 C9
202 CA
203 CB
204 CC
205 CD
206 CE
207 CF
208 D0
209 D1
210 D2
211 D3
212 D4
213 D5
214 D6
215 D7
216 D8
217 D9
218 DA
219 DB
220 DC
221 DD
222 DE
223 DF
226 E2
227 E3
228 E4
229 E5
230 E6
231 E7
232 E8
233 E9
234 EA
235 EB
236 EC
237 ED
238 EE
239 EF
240 F0
241 F1
242 F2
243 F3
244 F4
245 F5
246 F6
247 F7
248 F8
249 F9
250 FA
251 FB
252 FC _
253 FD
254 FE
255 FF
Tabelul 3.4 Extinderea codului ASCII
31
CAPITOLUL
4.
Algoritmic i programare
4.1. Algoritm
Noiunea de algoritm nu se poate defini foarte uor. O definiie matematic, riguroas
este greu de dat chiar i cu ajutorul altor noiuni. Vom ncerca n continuare s descriem ce se
nelege prin algoritm.
Prin algoritm vom nelege un set finit de reguli
propoziii scrise ntr-un limbaj de descriere a algoritmilor
- care proceseaz, calculeaz, rezolv o problem.
Mai n detaliu, pentru fiecare problem P exist date
presupuse
cunoscute
(date
iniiale
pentru
algoritmul
corespunztor, A) i rezultate care se cer a fi gsite (date
finale). Evident, s-ar putea ca problema s nu aib sens
pentru orice date iniiale. Vom spune c datele pentru care
problema P are sens fac parte din domeniul D al algoritmului
A. Rezultatele obinute fac parte dintr-un domeniu R, astfel
c executnd algoritmul A cu datele de intrare xD vom obine
rezultatele rR.
Vom spune c A(x)=r i astfel algoritmul A
definete o funcie:
A : D R
Algoritmii au urmtoarele caracteristici: generalitate,
finitudine i generalitate.
Prin generalitate se nelege faptul c un algoritm este
aplicabil pentru orice date iniiale x. Deci un algoritm A nu
rezolv problema
P numai cu anumite date de intrare
particulare, ci o rezolv n general, oricare ar fi aceste
date din D. Astfel algoritmul lui Euclid de determinarea a
32
Pentru marcarea
nceputului
folosete propoziia standard:
ALGORITMUL
Sfritul
standard:
unui
descrierii
numele_algoritmului
algoritm
se
marcheaz
unui
algoritm
se
ESTE:
prin
propoziia
SFRIT ALGORITM.
Cele dou propoziii standard nu au dect semnificaia
delimitrii descrierii unui algoritm de restul contextului n
care apare.
Pentru citirea datelor iniiale, care se presupun c sunt
cunoscute n problem se folosesc propoziiile standard:
DATE
list;
sau
CITETE
list;
unde list conine toate numele variabilelor a cror valoare
iniial este cunoscut.
Afiarea (tiprirea) sau precizarea rezultatelor obinute se
face cu ajutorul propoziiilor standard:
TIPRETE list;
sau
REZULTATE list;
unde list conine toate variabilele ce doresc s fie afiate
sau care s-au obinut n urma procesului de calcul descris de
algoritm.
Calculele se descriu
propoziiei standard:
[FIE]
prin
atribuiri
cu
ajutorul
variabil := expresie;
condiie
ATUNCI
34
SFRITDAC;
complet
DAC
condiie
ATUNCI
ALTFEL
S1
S2
SFRITDAC
Execuie:
1) Se evalueaz condiia;
2) Dac condiia este adevrat atunci se execut S1 i se
trece la propoziia urmtoare; dac condiia nu este
adevrat (fals) atunci se execut S2 i se trece la
propoziia urmtoare.
Alternativa generalizat se descrie prin propoziia standard:
SELECTEAZ i DINTRE
V1 : S1;
V2 : S2;
. . .
Vn : Sn
SFRITSELECTEAZ
Execuie:
1) Dac valoarea lui i este
egal cu Vi atunci se execut
secvena Si.
2) Se d controlul propoziiei de dup SFRITSELECTEAZ.
Structura de control repetitiv are trei forme:
- repetiia anterior testat (pretestat);
- repetiia posterior testat (posttestat);
- repetiia cu un numr determinat (i aprioric cunoscut)
de execuii.
Repetiia pretestat se descrie prin propoziia standard:
CTTIMP condiie EXECUT
S;
SFRITCTTIMP;
Execuie:
1) Se evalueaz condiia;
2) Dac condiia este adevrat atunci se execut S i se reia
35
S;
PNCND condiie;
SFRITREPET;
Execuie:
1) Se execut S;
2) Dac condiia este fals se reia execuia S; dac condiia
este adevrat atunci se trece la propoziia imediat
urmtoare.
n S trebuie modificat ntr-un fel oarecare condiia, altfel
ciclul ar deveni infinit dac la prima evaluare condiia ar
fi fals.
Structura posttestat REPET de mai sus este echivalent
cu urmtoarea secven:
S;
CTTIMP not condiie EXECUT
S;
SFRITCTTIMP;
EXECUT
limfinal
contor:=liminiial;
REPET
S;
contor:=contor+pas;
PNCND (contor > limfinal i pas > 0) sau (contor <
i pas < 0)
SFRITREPET;
36
Execuie:
1) Se iniializeaz contorul cu liminiial;
2) Se execut S; i se incrementeaz contorul cu pas (dac
pasul este 1 nu este obligatoriu s fie pus n eviden, e
implicit);
3) Se testeaz dac contorul nu depete limita final i se
reia punctul 2); dac contorul depete limita final
atunci se trece controlul la propoziia urmtoare.
Exemple:
1) S se determine dac un numr natural, n este palindrom sau
nu. Precizm c un numr este palindrom dac valoarea sa
este egal cu valoarea oglinditului su (citit de la dreapta
spre stnga).
Algoritmul Palindrom Este:
{ Problema palindromului }
Date n;
x := n;
{ x variabil intern de lucru
egal la nceput cu n}
m := 0;
{ n m se va construi oglinditul
lui n}
CatTimp x > 0 Executa
c := x modulo 10;
{ n c se izoleaz ultima cifr a
lui x, pas cu pas}
m := m*10 + c; { se adaug c la m}
x := x div 10;
{ se imparte x la 10 i se reine
ctul }
Sfarsit CatTimp ;
Daca m = n atunci Tiprete numarul este palindrom
altfel
Tiprete numarul este
palindrom
SfarsitDaca;
Sfarsit Algoritm
2) S se
determine cel mai lung platou dintr-un vector de
numere ntregi, ordonat cresctor.
Specificaia problemei este:
Intrare: n, a[i], i{0,1,...,n-1}
Un platou este caracterizat de o pereche de indici
(j,k) cu:
37
prima abordare
Algoritmul platou Este:
i:=1;
scanare a tabloului a }
lp:=1;
platoului maxim }
CatTimp in-1 Executa
# determin lp
Sfarsit CatTimp
Sfarsit Algoritm
{ Problema platoului }
{
i este indicele de
{
lp conine lungimea
{ propoziie nestandard }
a doua rafinare
Algoritmul platou Este:
i:=1;
scanare a tabloului a }
lp:=1;
platoului maxim }
CatTimp in-1 Executa
Daca a[i-lp] a[i]
Sfarsit Daca;
i:=i+1;
Sfarsit CatTimp
Sfarsit Algoritm.
4.3.
STRUCTURA
4.3.1.
GENERAL
ISTORIC,
{ Problema platoului }
{
i este indicele de
{
Atunci
lp conine lungimea
lp:=lp+1;
UNUI
CONCEPIE ,
38
PROGRAM
EVOLUIE
conversii implicite);
b) programare structurat: limbajul are principalele structuri
ale programrii structurate:
structura
secvenial, structuraiterativ structura de selecie;
d) compactizare:
unele instruciuni sunt scrise foarte
compact; de exemplu i:=i+1
se poate scrie mai scurt ca i++;
e) lucrul pe bii i calcule cu adrese.
4.3.2.
CONCEPTUL
DE
FUNCIE
directive de preprocesare
directive de preprocesare
declaraii
declaraii de date globale
implementare funcia f1
. . .
implementare funcia fn
2)
de
date
declaraie
prototip
funcia
.
declaraie
prototip
void
void main(void)
{
globale
declaraii
funcia
f1
.
fn
main(void)
declaraii
instruciuni
instruciuni
}
implementare funcia f1
. . .
implementare funcia fn
Funcia principal main este
40
...
4.3.2.1.
Definiia
unei
funcii
4.3.2.2. Antet
prototip
nume_funcie (lista_parametrilor_formali)
4.3.2.3.
asemntor
Corpul
unei
antetului
dar
la
funcii
4.4. EXPRESII,
OPERANZI,
4.4.1.
OPERATORI
EXPRESII
4.4.2. OPERANZI
42
9876
- constant ntreag;
x
- variabil simpl;
t[i][3]
-
variabil cu indici;
constant hexazecimal;
nume de tablou;
0xabcd
(expresie)
expresie inclus n paranteze rotunde.
f1
numele unei funcii
4.4.3.
OPERATORI
*(unar)
&(unar)
43
++ --
= =
!=
&
^
|
&&
| |
? : (ternar)
= op=
op poate fi: *(binar)
(binar) << >> & ^ |
,
4.4.3.1.
Operatori
+(binar)
aritmetici
4.4.3.2.
Operatori
relaionali
dou
caractere
ce
compun
compun
Exemple:
atunci
a= 4 i b= -5
a>0
a<=0
are
a+b>0
a>=b
are
a<0
are
a+b>=b-a
are
a+b>=(b-a)*(b-a)
4.4.3.3.
are valoarea 1;
valoarea 0;
are valoarea 0;
valoarea 1;
valoarea 0;
valoarea 1;
are valoarea 0;
Operatori
de
egalitate
4.4.3.4.
!
&&
||
Operatori
logici
||
45
sau exclusiv
0
0
0
4.4.3.5.
Operatori
logici
pe
bii
&
|,
^ dm n continuare tabelele
|
0
1
Observaii:
1o. Operanzii care nu ocup un cuvnt (16 bii) se extind la un
46
4.4.3.6.
Operatori
de
atribuire
se
v1=(v=expresie);
realiza
atribuiri
multiple
printr-o
vn =. . . =v1=v=expresie
Dac expresia din dreapta semnului egal are un tip diferit de
cel al variabilei v, atunci nti valoarea ei se convertete
spre tipul variabilei v i pe urm se realizeaz atribuirea,
Pentru operaia de atribuire, n afara semnului egal se
mai poate folosi i succesiunea :
op=
unde prin op se nelege unul din operatorii binari aritmetici sau logici pe bii, adic unul din
urmtorii:
% / * - + & ^ | << >>
Acest mod de construcie se folosete pentru a compacta un anumit tip de atribuire. Astfel
expresia:
v op = expresie;
este identic cu expresia de atribuire:
v = op expresie;
Exemple:
int i, j;
double x, y;
int v[10];
48
i=5;
j=10;
x=y=10.01;
i +=1;
x*=3;
j<<=10;
v[i]*=i
x /= x-y
4.4.3.7.
//
//
//
//
//
echivalenta
echivalenta
echivalenta
echivalenta
echivalenta
Operatori
cu i=i+1 si cu i++
cu x=x*3
cu j=j<<10
cu v[i]=v[i]*i
cu x = x/(x-y)
de
incrementare
decrementare
Dac vom converti operanzii i i j spre tipul double se va obine rezultatul corect adic 1.6.
49
Deci:
int i,j;
double y;
i=8; j=5;
y=(double) i / (double) j;
Construcia (tip) este un operator unar prin care se expliciteaz conversia dorit. Are aceeai
prioritate ca restul operatorilor unari.
//
//
//
//
//
//
//
//
//
are valoarea 2;
are valoarea 4;
are valoarea 4;
are valoarea 8;
are valoarea 1;
are valoarea 2;
are valoarea 8;
are valoarea 10;
are valoarea 40;
50
expresii
conversii
i-j/k
a/b
nu
int
a spre double
b spre double
double
nu
double
a spre double
i spre double
double
i spre double
double
nu
int
i spre double
double
c spre int
int
10 spre double
double
10 spre unsigned
unsigned
5 spre long
long
se realizeaz mprirea ntreag ntre
i i j i rezultatul se convertete spre double
x+y
i+a
i-3.14
i+3
i+x
i-c
x+10
p-10
r*5
(double)(i/j)
tipul expresiei
atunci max=a
altfel max=b
sfdac
n limbajul C se poate realiza acest proces cu ajutorul operatorilor condiionali astfel:
max= a>b ? a : b
Dac a>b atunci expresia condiional are valoarea i tipul lui a altfel expresia condiional
are valoarea i tipul lui b.
4.5. INSTRUCIUNI
4.5.1.
SCURT
ISTORIC
AL
METODELOR
DE
PROGRAMARE
f) programarea
4.5.1.1.
Programare
artizanal
Programare
procedural
4.5.1.3.
Programarea
modular
4.5.1.4.
Programarea
structurat
a) secvena;
b) iteraia (pretestat, posttestat, cu numr prestabilit de
ciclri);
c) alternativa (simpl, complet, generalizat).
Instruciunea
de
baz
(primitiv)
n
cadrul
acestor
structuri de control este instruciunea de atribuire.
Aceast abordare a programrii s-a nscut din necesitatea
eliminrii instruciunii de control GO TO care face saltul
necondiionat
la
o instruciune precizat, alta dect
instruciunea
urmtoare
ei.
Profesorul
Dijsktra
de
la
Universitatea din Eindhoven spunea, prin anul 1965, calitatea
unui programator este invers proporional cu numrul de
instruciuni GO TO folosite i a impus D-structurile de
control:
a) secvena;
b) iteraia pretestat;
c) alternativa simpl.
D-structurile se regsesc n toate limbajele procedurale.
Corespondena ar fi:
a) secvena este echivalent
cu execuia
instruciunilor
n ordinea scrierii lor n
programul surs;
b) iteraia pretestat echivalent cu WHILE ... DO;
c) alternativa simpl echivalent cu IF ... THEN.
O ilustrare grafic a celor trei D-structuri se d n
continuare.
S1
da
C
S
da
nu
S2
nu
Sn
4.5.1.5.
52
Programarea
prin
abstractizarea
datelor
4.5.1.6.
Programarea
orientat
spre
obiecte
Romb
Dreptunghi
P
53
trat
4.5.2.
INSTRUCIUNEA VID
Instruciunea vid se reduce la caracterul ;. Ea nu are nici un efect. Adesea este nevoie
de ea la construcii n care se cere prezena unei instruciuni, dar nu este necesar s se execute
nimic n punctul respectiv.
4.5.3.
INSTRUCIUNEA
EXPRESIE
expresie;
Exist cazuri particulare ale instruciunii expresie:
1) expresia de atribuire, care de altfel este cel mai important
caz particular al instruciunii expresie:
expresie;
2) apelul unei funcii:
nume_funcie (par1, par2, . . . parn);
3) incrementrile i decrementrile pre i post fixate:
variabil++; ++variabil;
variabil- -; - - variabil;
Exemplu:
void main (void)
{ int i;
float f;
double d;
i=10;
// instructiune de atribuire
i++;
// i se mareste cu 1
f=i;
// instructiune de atribuire (valoarea lui i se converteste in float)
d=++f;
// incrementare lui f si atribuirea valorii lui d
putchar(a);
// instructiune de apel
}
4.5.4.
INSTRUCIUNEA
COMPUS
antetul funciei
instruciune compus
4.5.5.
INSTRUCIUNEA
if
if (expresie)
else
instructiune_1;
instructiune_2;
Efectul:
1) se evalueaz expresia din paranteze;
2) dac valoarea expresiei este diferit de zero (deci conform
conveniei are valoarea adevrat), atunci se execut
instructiune_1, altfel se execut instructiune_2; apoi n
ambele cazuri se trece la instruciunea urmtoare.
Observaii:
1o. Se pot folosi instruciuni if imbricate, nivelul de
imbricare fiind
oarecare (deci nu exist o limitare a
numrului de imbricri).
2o. Pentru mai multe imbricri se folosete regula asocierii
if-lui cu else astfel:
un else se pune n coresponden cu primul if care se afl
naintea lui n textul surs i nu este inclus n
instruciunea care l precede pe el i nici nu i corespunde
deja un else.
Exemple
void main (void)
{ float x,y,a;
x=-5;
y=10;
if (x<0)
if (y<0)
else
else a=0;
56
}
void main (void)
{ float x,y,a;
x=-5;
y=10;
if (x<0)
{ if (y<0) a=1; }
compusa care
else a=0;
}
4.5.6.
Instruciunea while
INSTRUCIUNEA
while
f=f*i;
i=i+1
SfritCtTimp
Scrie n,f
Programul n C este:
#include<stdio.h>
void main (void)
{ int n,i;
double f;
f=1.0;
i=2;
printf(\n dati n= );
scanf(%d,&n);
while (i<=n)
{ f=f*i;
i++;
}
printf(\nn=%d, iar n!=%g\n,n,f);
}
2o. Expresiile din antetul instruciunii for pot fi i vide; totui caracterele ; vor fi ntotdeauna
prezente.
3o. Comparnd instruciunile for i while observm c instruciunea for cu formatul anterior se
poate realiza cu secvena urmtoare folosind while:
exp1;
while (exp2)
{ instructiune;
exp3;
}
Invers, o instruciune while de forma: while (exp) instructiune este echivalent cu
urmtoarea instruciune for:
for(; exp; ) instructiune.
Autorii limbajului C propun ca instruciunea for s se foloseasc cu prioritate pentru ciclurile
care au pas.
Exemple:
Vom da o secven de instruciuni care nsumeaz elementele unui tablou:
s=0;
for(i=0; i<n; i++) s=s+tab[i];
sau scris mai compact:
for (s=0, i=0; i<n; i++) s+=tab[i];
n continuare vom da un mic program care afieaz numrul caracterelor citite de la
intrarea standard stdin.
#include <stdio.h>
void main(void)
{ long n;
for (n=0; getchar()!=EOF; n++);
printf (\nnumarul caracterelor citite =%ld\n,n);
}
sau scris cu instruciunea while
#include <stdio.h>
void main(void)
{ long n=0;
while (getchar()!=EOF) n++;
printf (\nnumarul caracterelor citite =%ld\n,n);
}
while (exp);
Efectul:
1) se execut instruciunea instructiune;
2) se evalueaz expresia exp din paranteze;
3) dac valoarea expresiei este zero se trece la instruciunea urmtoare instruciunii do-while;
altfel se revine i se execut din nou instructiune.
Observaii:
1o. Structura realizat de instruciunea do-while poate fi realizat printr-o secven n care se
folosete instruciunea while astfel:
instructiune;
while (exp) instructiune;
o
2 . Se observ c n cazul instruciunii do-while, corpul ciclului se execut cel puin odat, spre
deosebire de ciclurile while i for unde corpul ciclului poate s nu se execute niciodat.
Exemplu:
Vom da un program care calculeaz rdcina ptrat dintr-un numr real a>=0.
#include<stdio.h>
#define EPS 1e-10
void main (void)
{ double x1,x2,y,a;
clrscr();
printf(\ndati un numar real pozitiv a=);
if (scanf(%lf,&a) !=1 || a<0)
printf (numarul citit nu este pozitiv\n);
else {
x2 = 1.0;
do { x1 = x2;
x2 = 0.5 *(x1+a/x1);
if ((y=x2-x1) < 0) y = -y;
}
while (y >= EPS);
printf (radacina patrata din:%g este: %.2lf\n,a,x2);
} //sfirsit else
}
// sterge ecranul
// formula de iteratie
// 2 zecimale
sir1
break;
sir2
break;
sirn
break;
default:
sir
}
unde:
Efectul:
1) se evalueaz expresia din parantez;
2) se compar pe rnd valoarea expresiei cu valorile constantelor c1, . . . , cn;
3) dac valoarea expresiei coincide cu valoarea lui ck, se execut secvena de instruciuni
definit prin sirk; n cazul n care valoarea expresiei nu coincide cu nici una din constantele
c1, . . . , cn, se execut secvena de instruciuni definit prin sir;
4) dup execuia secvenei sirk sau sir se trece la instruciunea urmtoare instruciunii switch,
adic la prima instruciune aflat dup acolada nchis care termin instruciunea switch
respectiv; evident, acest lucru are loc dac irul care se execut nu impune, el insui, un alt
mod de continuare a execuiei, de exemplu o revenire din funcia respectiv, un salt la o
anumit instruciune, etc.
Observaii:
1o. Ramura default nu este obligatorie. n lipsa ei, dac valoarea expresiei nu coincide cu nici
una din constantele c1,. . . , cn, instruciunea switch respectiv nu are nici un efect.
2o.Construcia break reprezint o instruciune. Ea termin fiecare ramur de instruciuni
sir1, . . . , sirn, provocnd saltul la instruciunea urmtoare instruciunii switch sau, cum se mai
spune, realizeaz ieirea din instruciunea switch.
3o. Instruciunea break nu este obligatorie. n cazul n care este absent, se execut secvenial
urmtoarea ramur. De exemplu dac avem secvena:
switch (exp)
{ case c1: sir1
case c2: sir2
}
ea se execut n felul urmtor:
- dac valoarea expresiei este egal cu c1 se execut sir1 i apoi sir2;
- dac valoarea expresiei este egal cu c2 se execut sir2;
- daca valoarea expresiei difera de valorile c1 i c2 instruciunea switch de mai sus nu
este efectiv, se trece la instruciunea urmtoare care urmeaz dup switch.
- secvena de mai sus se putea realiza i astfel:
if (exp = = c1)
{ sir1
sir2
}else if (exp = = c2) sir2
Exemplu:
Vom citi din fiierul de intrare construcii de forma: op1 operator op2, unde op1 i op2 sunt numere
ntregi (operanzi ntregi) iar operator este un operator aritmetic {+, -, *, /}. La ieire se
va scrie valoarea expresiei citite. De exemplu dac se citete secvena 100/3 se va afia
rezultatul 33. Programul permite citirea i evaluarea mai multor astfel de expresii, pn la
ntlnirea sfritului de fiier.
#include <stdio.h>
61
Observaie:
1o. Instruciunea continue se utilizeaz numai n corpul unui ciclu, permind, dup caz, s se
treac la pasul urmtor al ciclului sau s se ias din ciclu.
instruciune de apel.
2o. Dac dorim s utilizm valoarea returnat de funcie, vom folosi apelul funciei drept operand
ntr-o expresie, operandul avnd formatul (*).
Exemple de apeluri de funcii folosite pn acum sunt apelurile funciilor standard printf,
scanf, getchar i putchar. Funciile printf i putchar au fost apelate prin instruciuni de apel,
valorile returnate de ele nefiind utilizate. n schimb funciile scanf i getchar au fost apelate n
ambele moduri, att prin instruciuni de apel, ct i ca operanzi n diferite expresii.
prin valoare funcia apelat nu poate modifica parametrii efectivi din funcia apelant, neavnd
acces la ei. n cazul apelului prin referin, funcia apelat, dispunnd de adresele parametrilor
efectivi, i poate modifica.
n limbajul C apelul se realizeaz implicit prin valoare. n cazul c un parametru este
numele unui tablou atunci transferul se realizeaz prin referin deoarece numele unui tablou este
un pointer i conine adresa primului element al tabloului. Transferul prin referin se realizeaz
cu ajutorul variabilelor de tip pointer i cu ajutorul operatorului de adres (&).
return expresie;
// prototipul functiei
// functia principala care citeste d
// si afiseaza radacina patrata din d
// sterge ecranul
65
return x2;
}
Observaie:
1o. Limbajul C dispune de o bibliotec matematic n care sunt incluse o serie de funcii pentru
calculul valorilor funciilor elementare. Exist o funcie numit sqrt (cu prototipul double sqrt
(double);). Fiierul care conine biblioteca matematic se numete math.h i trebuie inclus n
fiierul surs de lucru dac se dorete utilizarea funciilor definite n el.
Pentru algoritmul palindromului, scris n pseudocod, dm i varianta n limbajul C:
#include<stdio.h>
#include<conio.h>
void main(void)
{ long n,m,x;
int c;
printf ("\ndati un numar natural:");
scanf ("%ld",&n);
x=n;
m=0;
while (x > 0)
{ c = x % 10;
m = m*10+c;
x = x / 10;
}
if (n == m) printf ("numarul %ld este palindrom",n);
else
printf ("numarul %ld nu este palindrom",n);
getch();
}
66