Documente Academic
Documente Profesional
Documente Cultură
Programare Limbaj C Si C++
Programare Limbaj C Si C++
Istrati
PROGRAMARE
Iniializare n limbajele C i C++
Chiinu 2003
Adnotare
Lucrarea de fa este destinat studenilor anilor I i II seciile de nvmnt de zi i
fr frecven a Universitii Tehnice a Moldovei ce studiaz disciplina Programare i
n special studenilor Facultii de Radioelectronc i Telecomunicaii catedra
Sisteme Otpoelectronice cu specializrile 1871 Inginerie i Management n
Telecomunicaii i 2105 Sisteme Optoelectronice.
U.T.M. 2003
Cuprins
Limbajul de programare C/C++
ntroducere
1. Alfabetul limbajului
2. Structura unui program
3. Tipuri de date
3.1. Tipuri de date simple predefinite. Constante
3.1.1. Constante ntregi
3.1.2. Constante reale
3.1.2. Constante character
3.1.3. iruri de caractere
4. Variabile
4.1. Nume de variabile (identificatori)
4.2. Descrierea variabilelor
4.3. Iniializarea variabilelor
5. Operaii i expresii
5.1. Operaii aritmetice
5.2. Operaia de atribuire
5.3. Operaii de incrementare(decrementare)
5.4. Relaii i operaii logice
5.5. Operaiile logice poziionale
5.6. Operaia dimensiune
5.7. Operaia virgul
5.8. Expresii condiionate
5.9. Conversii de tip
5.10. Prioritile operaiilor
6. Instruciuni
6.1. Tipurile instruciunilor
6.2. Instruciuni expresie
6.3. Instruciuni de ramificare (condiionale)
6.3.1. Instruciunea de ramificare IF i IF-ELSE
6.3.2. Instruciunea de salt necondiionat GOTO
6.3.3. Instruciunea de selectare SWITCH
6.3.4. Instruciunea de ntrerupere BREAK
6.4. Instruciuni iterative(ciclice)
6.4.1. Instruciunea ciclic FOR
5
6
8
12
12
12
14
15
16
16
16
16
17
18
18
18
18
19
20
22
22
23
23
25
26
26
27
28
28
29
30
32
33
33
34
35
36
36
36
37
38
40
41
43
44
45
45
46
47
47
49
52
54
56
57
59
60
61
64
68
70
73
74
75
77
78
81
89
97
ntroducere
Scopul prezentei lucrri este familiarizarea studenilor cu principalele
instrumente i metode de programare n limbajele C i C++.
Limbajul de programare C a fost elaborat de ctre Denis M.Ritchi n 1972 i
descris detaliat n cartea Limbajul de programare C de Ritchi i Brian B.Kernigan.
Realizarea limbajului n conformitate cu regulile descrise n carte poart denumirea
de Standard C K&R i este realizarea standard minimal. n 1983 a fost creat un
nou standard C de ctre American National Standards Institute numit Standard
ANSI-C. Mai apoi a fost elaborat limbajul C++ ca o derivat a limbajului C.
n aa fel limbajul C++ posed marea majoritate a posibilitilor limbajului
ANSI-C i n plus la acestea alte instrumente de programare cu posibiliti mai
avansate.
Lucrarea de fa conine descrierea att a instrumentelor din limbajul ANSI-C
ce snt susinute i de copmpilatoarele C++, ct i descrierea instrumentelor de
programare ale limbajului C++.
Deasemenea n lucrare este atras o deosebit atenie exemplelor practice de
rezolvare a diferitor tipuri de probleme cu lmurire detaliat.
Prezenta lucrare este o parte din suita de lucrri didactico- metodice elaborate
de ctre lectorul superior Sergiu G. Istrati ndreptate spre optimizarea procesului de
instruire a studenilor la disciplina Programare. Au fost elaborate urmtoarele lucrri:
Ciclu de prelegeri la disciplina Programare. Limbajul Pascal.
Ciclu de prelegeri la disciplina Programare. Limbajul C. (prezenta lucrare)
ndrumar metodic privind ndeplinirea lucrrilor de laborator.
ndrumar metodic privind ndeplinirea lucrrilor individuale.
ndrumar metodic privind ndeplinirea lucrrii de curs.
Toate aceste lucrri pot fi accesate n Internet pe adresa www.istrati.com
Limbajul de programare C.
1. Alfabetul limbajului.
Numim limbaj de programare un limbaj prin care putem comunica unui
calculator metoda de rezolvare a unei probleme. Iar metoda de rezolvare a problemei,
dup cum tim deja o numim algoritm. ntreaga teorie informatic se ocup de fapt cu
elaborarea unor noi calculatoare, limbaje de programare i algoritmi. Datoria oricrui
limbaj de nivel nalt este s ne pun la dispoziie o sintax ct mai comod prin care
s putem descrie datele cu care lucreaz programul nostru i instruciunile care
trebuiesc executate pentru a rezolva o anumit problem.
Limbajul de programare C ca i orice alt limbaj de programare i are alfabetul
su i specificul de utilizare a simbolurilor. Alfabet al unui limbaj de programare se
numete un set de simboluri permis pentru utilizare i recunoscut de compilator, cu
ajutorul cruia pot fi formate mrimi, expresii i operatori ai acestui limbaj de
programare. Alfabetul oricrui limbaj de programare conine cele mai simple
elemente cu semnificaie lingvistic, iar sintaxa limbajului definete modul n care se
combin elementele vocabularului pentru a obine fraze corecte (instruciuni,
secvene de instruciuni, declarri de tipuri, variabile, constante, etichete, funcii,
proceduri etc.). Elementele vocabularului sunt alctuite din caractere. Orice caracter
este reprezentat n calculator, n mod unic, printr-un numr natural cuprins ntre 0 i
127, numit cod ASCII. Mulimea elementelor alfabetului limbajului de programare C
se poate mpri n 5 grupe:
1) Simboluri folosite la formarea identificatorilor i cuvintelor cheie. n componena
aceastei grupe intr literele minuscule i majuscule ale alfabetului latin (englez) i
simbolul subliniere _. Este de menionat faptul c literele minuscule i majuscule
de acelai fel (Exemplu: a i A) sunt interpretate ca simboluri diferite din cauza c au
diferite coduri ASCII.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz _
2) Literele minuscule i majuscule ale alfabetului rus (sau altui alfabet naional) i
cifrele arabe.
0123456789
3) Simboluri speciale ce se folosesc le organizarea proceselor de calcul i la
transmiterea compilatorului unui set de instrunciuni.
Simbolul
Denumirea
Simbolul
Denumirea
Virgul
Punct
Punct-virgul
Dou puncte
Semnul ntrebrii
<
Mai mic
'
Apostrof
>
Mai mare
Semnul exclamrii
Linie vertical
Slash
Numr (diez)
Slash inversat
Procent
Tilda
&
Ampersand
Stelua
Negare logic
Plus
Egal
Minus
"
Ghilimele
Denumirea
Echivalentul
hexazecimal
\a
Sunet (beep)
007
\b
ntoarcere cu o poziie
008
\t
Tabulare orizontal
009
\n
00A
\v
Tabulare vertical
00B
\r
ntoarcerea cruciorului
00C
\f
00D
\"
Ghilimele
022
\'
Apostrofa
027
\0
Simbolul zero
000
\\
Slash inversat
05C
\ddd (d-cifr)
\xddd (d-cifr)
Consecutivitatea de tipul \ddd i \xddd (aici prin d este notat o cifr orecare)
permite a scrie un cod al calculatorului ca o consecutivitate de cifre octale sau
hexazecimale respectiv. De exemplu simbolul de ntoarcere a cruciorului poate fi
interpretat n diferite moduri: \r consecutivitatea general de conducere, \015 consecutivitatea octal de conducere, \x00D - consecutivitatea hexazecimal de
conducere.
n afar de aceasta n limbaj sunt rezervate cuvinte de serviciu, numite cuvinte
cheie care pot fi folosite ntr-un sens strict definit: int, float, double, char, long,
signed, unsigned, const, volatile, sizeof, if, else, goto, case, default, for, while, do,
break, continue, near, far, void, return, pascal, cdecl, intrrupt, auto, extern, static,
register, union, enum, typedef, asm, _cs. _ds, _es, _ss, _AH, _AX, _BX, _BL, _CH,
_CL, _CX, _DX, _DL, _BP, _DI, _SI, _SP.
Cuvintele cheie definesc sensul semantic al instruciunilor din C. Cuvintele
cheie ce ncep cu semnul _ (subliniere) se folosesc pentru acces la segmentele de date
i la registrele calculatorului.
Prin sintaxa unui limbaj de programare se nelege, n general, un ansamblu de
reguli de agregare a unitilor lexicale pentru a forma structuri mai complexe
(instruciuni, declaraii, programe etc.) Structura unui program n limbajul de
programare C deasemenea i are regulile ei de sintax dup cum urmeaz: un antet,
urmat de funciile secundare dup care urmeaz corpul funciei principale (care
conine n componena sa i o parte declarativ). i pentru descrierea n detaliu a
acestor componente sunt necesare, desigur i alte reguli.
2. Structura unui program.
Pentru a primi o reprezentare general a programului n C s urmrim un
exemplu concret. Presupunem, c exist un masiv unidimensional x cu n elemente de
10
aici cuvntul for este cuvnt rezervat, i-parametrul ciclului, care-i schimb valoarea
de la 0 la n cu pasul 1 datorit instruciunii de incrementare i++. Corpul ciclului, care
va fi repetat de n ori este mrginit de perechea de accolade deschis i nchis, i este
compus din 2 funcii: prima printf(), care afiaz un comentariu pentru culegerea
valorii elementului current al masivului i a doua scanf(), care face posibil nscrierea
valorii elementului current al masivului de la tastatur n memorie. n aa fel, la
sfritul ndeplinirii ciclului toate elementele masivului x[n] vor avea valori, fapt ce
face posibil calcularea sumei totale a elementelor din masiv. Dup executarea
instruciunii ciclice for urmeaz instruciunea de atribuire w=suma(x,n);. n partea
dreapt a acestei atribuiri este amplasat funcia suma(). Anume valoarea acestei
funcii, dup executarea cu folosirea parametrilor locali x i n, va fi atribuit
variabilei w. S analizm funcia suma():
int suma (int y[10], int m) {
int i, suma=0;
for (i=0;i<m;i++) { suma +=y[i]; } return (suma); }
Ca i la declararea oricrei funcii n limbajul C nti de toate urmeaz antetul
funciei: int suma (int y[10], int m) , unde cuvntul int din faa numelui funciei suma
este tipul valorii ntors de funcie n programul principal main(). Parantezele rotunde
dup numele funciei mrginesc lista de parametri formali folosii de funcie. Aceti
parametri snt un masiv de tip ntreg y cu lungimea 10 elemente i o variabil de tip
ntreg m. Este de menionat faptul c la momentul chemrii funciei suma() din cadrul
programului principal main(), valorile parametrilor actuali (n cazul nostru x-masivul
prelucrat i n-mrimea lui) snt atribuite parametrilor formali din funcie (n cazul
nostru masivul y i marimea lui m) i este necesar ndeplinirea urmtoarei condiii:
parametrii actuali trebuie s corespund ca cantitate, poziie i tip cu parametrii
formali. Acoladele deschis dup antetul funciei i corespunztor nchis dup
operatorul return(); delimiteaz corpul funciei suma(), care i are i ea seciunea de
declarare a datelor. Aici int i, suma=0; declar variabila local i de tip ntreg i
iniializeaz funcia suma() cu valoarea 0. Urmtoarea este instruciunea ciclic for
care conine n corpul su delimitat de accolade o singur instruciune: instruciunea
compus de atribuire suma+=y[i]; echivalent cu instruciunea suma=suma+y[i];
care calculeaz suma elementelor din masiv. Ciclul va fi repetat de m ori cu diferite
valori a parametrului i, unde m este mrimea masivului, adic cantitatea elementelor
din masiv, iar i-numrul de ordine a elementului current din masiv. Dup executarea
ciclului variabila suma va conine valoarea final a sumei tuturor elementelor din
masiv. Transmiterea acestei valori funciei principale main() este efectuat de ctre
operatorul retun(suma); . Dup executarea acestui operator valoarea sumei va fi
11
inclus n locul de unde a fost chemat funcia suma(), n cazul nostru aceasta este
instruciunea de atribuire w=suma(x,n);
Deci, valoarea sumei elementelor masivului va fi atribuit variabile w. Dup
aceasta urmeaz afiarea pe ecran a rezultatului final: printf("suma=%d\n",w); .
Ultima instruciune din program este apelul la funcia getch(), care oprete executarea
programului cu scopul vizualizrii rezultatului pn cnd nu va fi culeas tasta Enter.
n aa fel poate fi descris structura general a unui program n C dup cum
urmeaz: orice program ncepe cu includerea bibliotecilor de funcii care vor fi
folosite n program, dup aceasta urmeaz declararea tuturor funciilor auxiliare
folosite n program, care au urmtoarea componen: antetul funciei, secia de
declarare a variabilelor, constantelor locale, dup care urmeaz corpul funcei; dup
declararea tuturor funciilor auxiliare urmeaz corpul funciei principale main()
delimitat de o pereche de accolade, care conine descrierea variabilelor, constantelor
i nsi instruciunile programului principal.
3. Tipuri de date.
Un program n limbajul C conine o descriere a aciunilor ce trebuie s fie
executate de calculator i o descriere a datelor ce sunt prelucrate de aceste aciuni.
Aciunile snt descrise prin instruciuni, iar datele prin declaraii (sau definiii).Prin
tip de date se nelege o mulime de valori care pot fi atribuite unei variabile sau
constante. Tipurile de date n C pot fi mprite n dou categorii: simple
(elementare) i compuse (structurate). n general, tipurile de date sunt definite explicit
de ctre programator i sunt specifice programului n care apar. Exist ns tipuri de
date elementare de interes mai general, numite tipuri predefinite a cror definiie se
consider cunoscut i nu cade n sarcina programatorului.
3.1. Tipuri de date simple predefinite. Constante.
Un program n C conine n mod explicit diferite valori textuale i numerice.
Aa valori, ce apar n program, snt numite constante. Constanta este o valoare
numeric sau textual, care ntotdeauna este definit i n mersul ndeplinirii
programului rmne neschimbat. Tipul constantei se definete de forma ei de
nscriere, iar valoarea ei este ncheiat n ea nsei.
3.1.1. Constante ntregi.
Constanta ntreag este un numr nscris n program fr punct zecimal i fr
indicatorul de putere. Constantele ntregi n C pot fi:
Zecimale, Octale,
Hexazecimale.
12
Diapazonul de valori
int
-32768 32767
0 255
unsigned int
0 65 535
unsigned long
Constantele, ce snt nscrise n program sub forma unui numr mai mare ca
4 294 967 295 aduc la suprancrcare, ns compilatorul nu face prentmpinare, iar n
memorie se nscriu biii inferiori ai constantei trunchiate. Programatorul are
posibilitate de a indica explicit compilatorului, c pentru o oarecare constant este
necesar de alocat 4 octei i de a indica interpretarea lor ca fr semn (unsigned).
Pentru aceasta se folosesc modificatori speciali, nscrii dup cifra mai mic a
constantei. Pentru a indica, c constanta are tipul long, trebuie de nscris
modificatorul L sau I ( se permite de asemenea i l sau i).
n standardul K&R C iniializarea constantelor de tipul ntreg are urmtoarea
sintax:
#define name value care este plasat pn la funcia main(). Unde #define este
directiva compilatorului, name numele constantei, value valoarea constantei. De
exemplu: #define K 35 sau #define salariu 700. ntre directiv, nume i valoarea
constantei este necesar prezena la minim un spaiu. n exemplele de mai sus
compilatorul implicit va atribui variabilelor K i salariu valori de tipul ntreg, ntruct
numerele 35 i 700 au sintaxa i formatul constantelor de tip ntreg.
Unele compilatoare C, ce susin standardul ANSI-C permit iniializarea
constantelor n 2 moduri. Primul mod cu folosirea directivei #define a fost descris
mai sus. Al doilea mod folosete cuvntul rezervat const pentru iniializarea
constantei, descrierea tipului ei i atribuirea valorii i are urmtoarea sintax:
const int name = value; care este plasat dup funcia main(), unde const este
cuvnt rezervat pentru iniializarea constantelor, int cuvntul rezervat pentru
desemnarea constantelor de tip ntreg i value valoarea constantei. De exemplu:
main() {
const int K = 35;
;
const int salariu = 700;
;}
3.1.2. Constante reale.
Constantele reale (flotante) reprezint numere zecimale fracionare ce pot fi
scrise sub dou forme: form cu punct i form cu ordin. Constanta real n form cu
punct se scrie ca fracie zecimal cu semn sau fr semn, la care partea ntreag i
partea fracionar se despart prin punct. Dac semnul constantei este omis ea se
socoate pozitiv. Constanta real n form cu ordin este comod pentru scrierea
numerelor foarte mari sau foarte mici. n C, ca i n majoritatea limbajelor de
programare, pentru aa nscrieri se folosesc constante reale n form cu ordin, ce au
14
Diapazonul de valori
3.4E-38 3.4E+38
1.7E-308 1.7E+308
3.4E-4932 3.4E+4932
15
16
17
5. Operaii i expresii.
5.1. Operaii aritmetice.
n calitate de operaii aritmetice limbajul C folosete urmtoarele:
1) Adunare
(+).
2) Scderea
(-).
3) nmulirea
(*).
4) mprirea
(/).
5) Luarea modulului
(%).
6) Plusul unar
(+).
7) Minusul unar
(-).
5.2. Operaia de atribuire.
Operaia de atribuire poate fi simpl sau compus, n dependen de semnul operaiei
de atribuire. Operaia de atribuire simpl se noteaz cu semnul = i e folosit pentru a
atribui variabilei valoarea vreunei expresii. Ex: x=7; n limbajul de programare C n
expresii se permite folosirea unui numr arbitrar de operaii de atribuire. Operaiile de
atribuire au o prioritate mai joas dect cele descrise anterior i se ndeplinesc de la
dreapta spre stnga. Operaia de atribuire leag variabila cu expresia, atribuind
variabilei valoarea expresiei, ce st n dreptul semnului de atribuire.
Operaiilor binare: + - * / % >> << & | le corespunde operaia de atribuire
compus, care se noteaz ca op=, unde op este una din operaiile enumerate mai sus,
de exemplu, += i *= etc.
Operaia de atribuire compus sub forma: _variabila_op=_expresie_ se definete
prin operaia de atribuire simpl astfel: _variabila_=_variabila_op_expresie_
De exemplu, d+=2 este echivalent cu d=d+2. De regul pentru operaiile de atribuire
compuse calculatorul construiete un program mai efectiv.
5.3. Operaii de incrementare(decrementare).
Operaia de incrementare notat prin dou semne plus consecutive, se aplic
asupra unei singure variabile i mrete valoarea cu o unitate. Operaia de
decrementare se noteaz prin dou semne minus micornd valoarea ei cu o unitate.
Operaia de incrementare poate fi folosit att ca prefix ct i ca sufix. Diferena dintre
acestea const n momentul schimbrii valorii variabilei. Forma prefix asigur
schimbarea variabilei pn la folosirea ei. Iar forma sufix - dup folosirea ei.
Operaiile de incremenatare decrementare se aplic asupra unor variabile de tip
ordonat(aa ca int). Exemple:
Operaia x++; asigur incrementarea variabilei x cu o unitate.
18
19
^
<<
>>
~
Bitul rezultatului
0
1
1
0
21
22
23
Pentru operaia de atribuire (simpl sau compus) rezultatul calculrii expresiei din
partea dreapt se aduce la tipul variabilei creia i se atribuie aceast valoare. n acest
timp poate avea loc ridicarea tipului sau coborrea tipului.
Ridicarea tipului de atribuire, de obicei, se produce fr pierderi, pe cnd
coborrea lui poate denatura esenial rezultatul din cauza c acel element de tip
superior poate s nu ncap n zona de memorie a elementului de tip inferior.
Pentru pstrarea preciziei calculului la efectuarea operaiilor aritmetice, toate datele
de tip float se transform n double, ceea ce micoreaz greeala de rotungire.
Rezultatul final se transform n tip float, dac acesta e condiionat de instruciunea
de descriere respectiv. De exemplu, datele snt descrise astfel:
float a,b,c; i avem expresia: a*b+c
La calcularea valorii expresiei variabilele a, b i c vor fi convertate n double, iar
rezultatul va avea tip float. ns dac datele sunt descrise astfel : float a,b; double c;
atunci rezultatul a*b+c va fi de tip double din cauza ridicrii tipului.
n afar de conversia automat a tipurilor, ndeplinit de compilator, Turbo C
pune la dispoziia programatorului posibilitatea indicrii explicite a tipului, la care e
necesar de adus o careva mrime sau expresie. Obinem acest lucru folosind operaia
de conversie a tipului, ce are urmtoarea form general de scriere:
(_tip_)_expresie
Folosirea unei astfel de construcii garanteaz, c valoarea expresiei va fi
convertat la tipul indicat n paranezele din faa expresiei. n aceast operaie n
calitate de _tip_ pot fi folosite aceleai cuvinte cheie, ca i n instruciunile de
descriere a tipului, mpreun cu modificatorii admisibili.
S cercetm dou expresii n Turbo C.
d=1.6+1.7 i d=(int)1.6+(int)1.7 cu condiia c variabila d este de tip ntreg.
n rezultatul ndeplinirii primei expresii valoarea variabilei d va fi 3, deoarece 1.6+1.7
nu necesit conversia tipurilor i d rezultatul 3.3 de tip float, iar coborrea tipului
pn la int, realizat n timpul ndeplinirii operaiei de atribuire, d variabilei d
valoarea 3 din cauza truchierii prii fracionare. n rezultaul ndeplinirii expresiei a
doua valoarea variabilei d va fi 2, deoarece indic conversia explicit a constantelor
float n tip int pn la adunarea lor. n timpul ndeplinirii operaiei de atribuire nu va
avea loc conversia tipului, deoarece tipul variabilei coincide cu tipul expresiei.
Operaia de reducere a tipului cel mai des se folosete n cazurile, cnd dup
context nu se presupune conversia automat a tipurilor. De exemplu, pentru
asigurarea lucrului corect a funciei sqrt ea are nevoie de un argument de tip double.
De aceea, dac avem descrierea: int n; atunci pentru calcularea rdcinii patrate din n
trebuie s scriem sqrt((double)n);
24
Semnul operaiei
Tipul operaiei
Ordinea execuiei
()
Expresie
De la stnga la dreapta
! ~ ++ -- - + (unar) sizeof
(tip)
Unare
De la dreapta la stnga
* / %
Multiplicative
+-
Aditive
<< >>
Deplasare
Relaii
== !=
Relaii (egalitate)
&
I poziional
10
SAU poziional
11
&&
I logic
12
||
SAU logic
13
?:
Condiie
14
= *= /= %= += -= &=
|= >>= <<= ^=
Atribuire simpl
compus
De la dreapta la stnga
15
Virgul
De la stnga la dreapta
25
De la stnga la dreapta
6. Instruciuni.
Prin instruciune n C se subnelege o oarecare nscriere, ce se termin cu
caracterul; (punct i virgul), sensul creiea determin aciunile compilatorului n
timpul prelucrarii textului iniial al programului sau actiunile procesorului n timpul
ndeplinirii programului. Instruciunile pot fi mprite n dou grupe:
1) Instruciunile perioadei de compilare
2) Instruciunile perioadei de ndeplinire a programului.
La instruciuni de compilare se refer instruciuni, ce caracterizeaz datele din
program, iar la instruciuni de ndeplinire se refer instruciuni, ce determin aciuni
de prelucrare a datelor n conformitate cu algorilmul dat. Instruciunile de compilare
au fost precautate n compartimentele de descriere i declarare a datelor. n
continuare vor fi studiate instruciunile de ndeplinire.
Fiecare instruciune are sintaxa i semantica sa. Sintaxa reflect metoda
nscrierii corecte a construciilor instruciunii, iar semantica este descrierea aciunilor
efectuate de instruciune.
6.1. Tipurile instruciunilor.
Instruciunea reprezint o unitate de ndeplinire a programului. Instruciuni pot
fi simple, compuse i blocuri.
Simpl se numete instruciunea, care nu conine n componena sa o alt
instruciune. La instruciunile simple se refer instruciunea expresie, instruciunea
continurii continue, instruciunea de terminare break, instruciunea de ntoarcere
return, instruciunea de salt necondiionat goto, pe care le vom cerceta mai departe.
Compus se numete instruciunea, ce conine n componena sa alte
instruciuni. La instruciunile compuse se refer instruciunea condiional if else
instruciunile ciclului for, while, do while i instruciunea de selecie switch.
Bloc se numete un ir de instruciuni luate n acolade({}). Instruciunile
blocului se ndeplinesc consecutiv n ordinea nscrierii lor n interiorul blocului. La
nceputul blocului pot fi descrise variabilele interioare. n aa caz se spune, c aceste
variabile sunt localizate n interiorul blocului, exist i lucreaz numai n interiorul
blocului i se pierd n afara lui.
n Turbo C instruciunea compus i blocul pot fi folosite oriunde, unde este
admis folosirea instruciunii simple. Prin urmare, instruciunea compus poate
conine alte instruciuni compuse, iar blocul poate conine instruciuni compuse i alte
blocuri.
26
27
28
29
case expr_const_n:instruciune_n;
default:instruciune; }
Dup cuvntul cheie switch n paranteze este scris o expresie, valoarea creia
trebuie s fie de tip int sau char. Mai departe n acolade se nscriu instruciunile
varantele marcate cu prefixele: case expresia_constant: unde expresia constant
deasemenea trebuie s fie de tip ntreg, iar toate prefixele trebuie s fie diferite. O
variant poate avea prefixul default, prezena careia nu este obligatorie, dar n
majoritatea cazurilor acest prefix este prezent n construcia switch.
Instruciunea de selectare lucreaz n felul urmtor. La nceput se afl valoarea
expresiei din paranteze, apoi aceast valoare se compar cu expresiile constante ale
case prefixelor i se ndeplinete variantaa i, pentru care aceste valori coincid. Dup
ce sau ndeplinit instruciunile ce se conin n caseul respectiv, se ndeplinesc instruciunile variantei
urmtoare i aa pn ce se termin toate
instruciunile variantei. Dac valoarea expresiei n
switch nu coincide cu nici o valoare a case
prefixelor, atunci ori se ndeplinete instruciunea
variantei cu prefixul default (dac default este
prezent), ori nu se ndeplinete nici o variant
(dac default este absent). Schema algoritmic de
ndeplinire a instruciunii switch este prezent pe
desen.
S examinm exemplul de ntrebuinare a instruciunei switch : se scrie un
fragment de program, ce tiprete patru rnduri din poezie, ncepnd de la rndul k:
switch(k) {
case 1: printf(A fost o dat ca-n poveti,\n);
case 2: printf(A fost ca niciodat,\n);
case 3: printf(Din rude mari mprteti,\n);
case 4: printf(O preafrumoas fat.\n);
default printf(Poezia nu conine rnd cu aa numr); }
n acest exemplu e folosit funcia printf(), ce asigur tiparul rndului cu format. Dac
k ar fi egal cu 3, atunci vom avea ca rezultat :
Din rude mari mprteti
O preafrumoas fat.
Poezia nu conine rnd cu aa numr
31
32
33
Cteodat apare necesitatea ieirii din ciclu nainte de termen. Pentru aceasta
n corpul ciclului, n locul unde se dorete ieirea din ciclu se folosete instruciunea
BREAK, dup ndeplinirea reia are loc transmiterea controlului la instruciunea
urmtoare dup ciclu.
Limbajul C nu pune restrucii la tipul instruciunilor din cadrul corpului
ciclului. n aa mod, corpul ciclului poate fi alctuit din instruciuni i simple i
compuse, n particular- corpul unui ciclu poate fi alt ciclu. n unele algoritme apar
situaii, cnd e necesar imbricarea unui ciclu n altul. De exemplu la prelucrarea unei
matrice un ciclu exterior rspunde de prelucrarea rndurilor, iar altul interior a
coloanelor. n acest caz sintaxa va fi urmtoarea:
For(i=1;i<=n;i++){
For(j=1;j<=m;j++){
corpul ciclului } };
unde n-numrul de rnduri n matrice, m- numrul de coloane, acoladele interioare
mrginesc corpul ciclului cu parametrul j, iar acoladele exterioare mrginesc corpul
ciclului exterior cu parametru i.
6.4.2. Instruciunea ciclic WHILE.
Ciclul while este folosit n cazul, cnd nu este cunoscut numrul de repetri ale
ciclului i nu exist necesitatea ca ciclul s fie executat mcar o singur dat.
Instruciunea de ciclare while are urmtoarul format:
while (expresie) instruciune;
Instruciunea de ciclu while lucreaz n felul urmtor: dac expresia este
adevrat (sau diferit de zero, ce din punct de vedere al limbajului Turbo C este una
i aceiai), atunci instruciunea se ndeplinete o dat i apoi expresia din nou se
testeaz.
Aceast succesiune de aciuni, ce const n testarea expresiei i ndeplinirea
instruciunei, se repet periodic pn ce expresia nu devine fals(din punct de vedere
al limbajului Turbo C devine egal cu zero). Instruciunea se numete corpul ciclului
i n majoritatea cazurilor reprezint un bloc, n componena cruia intr cteva
instrciuni. Schema algoritmic a executrii instruciuniii while
e prezentat pe desen.
Se observ, c instruciunea while este un ciclu cu
precondiie. Testul de control este executat naintea intrrii n
corpul instruciunii. De aceea este posibil ca corpul ciclului nu
va fi ndeplinit niciodat. n afar de aceasta, pentru a nu
admite ndeplinirea la infinit a ciclului, ci numai de anumite
34
35
dar corpul ciclului trebuie s fie executat mcar o singur dat folosim instruciunea
ciclic DO_WHILE. i n cazul cnd nu este cunoscut numrul de repetri al ciclului,
iar corpul ciclului e necesar s fie executat de 0 sau mai multe ori, n dependen de o
condiie folosim instruciunea ciclic WHILE.Mai mult ca att, n cazul ciclurilor
imbricate sunt posibile combinaii de instruciuni ciclice: for-while; do_while-while;
s.a.
6.4.4. Instruciunea de continuare CONTINUE.
Instruciunea CONTINUE este folosit n corpul ciclului cu scopul de a preda
controlul la nceputul ciclului. Exist cazuri, cnd la ndeplinirea a careva condiii
trebuie de ntrerupt executarea iteraii curente i de trecut la ndeplinirea iteraiei
urmtoare a ciclului. n aa cazuri este folosit instruciunea CONTINUE.
Instruciunea de continuare are urmtoarea form: continue;
Instruciunea continue poate fi realizat n toate cele trei tipuri de cicluri, dar
nu i n instruciunea switch. Ea servete la depirea prii rmase a iteraiei curente
a ciclului, ce o conine nemijlocit. Dac condiiile ciclului admit o nou iteraie, ea se
ndeplinete, n caz contrar el se termin. S precutm urmtorul exemplu:
int a,b; b=0;
for(a=1;a<100;a++) {b+=a; if (b%2) continue;
... prelucrarea sumelor pare ... }
n cazul, cnd suma b va fi impar, operatorul continue transmite controlul
iteraiei urmtoare a ciclului for fr a executa partea urmtoare a corpului ciclului,
unde are loc prelucrarea sumelor pare.
7. Masive.
7.1. Descrierea masivelor.
Masivul reprezint un ir ordonat de elemente de acelai tip. Faptul, ca masivul
este un tot intreg, compus din cteva elemente ne permite s numim variabila de tip
masiv variabila de tip compus.
Masivul se poate caracteriza prin nume, tip, dimensiune. Formatul comun de
descriere a masivelor este:
tip nume[d1][d1][dn]; unde :
tip este tipul comun pentru toate elementele masivului, adica tipul masivului. Tip al
unui masiv poate fi orice tip de date deja definit: ntreg, real, caracterial .a.
nume este numele masivului. In calitate de nume al masivului este folosit orice
identificator. Mai mult ca att, deoarece numele masivului este identificator, asupra
lui se rspndete totul ce-i indicat n compartimentul Nume de variabile
36
37
38
39
sau nume din k caractere cu 20-k spaii dup ele. Iar afiarea numelui este fcut cu
ajutorul funciei printf( ) inclus n ciclu, care afiaz la monitor cte un caracter din
numele cules.
Not: La declararea masivului de tip char pentru descrierea unui ir se indic
mrimea masivului cu o celul mai mult de ct lungimea maxim presupus a irului
din cauz c ultima celul din masiv este rezervat pentru simbolul nul "/0".
Evident c imposibil de programat ntr-un limbaj de nivel nalt folosind
astfel de mecanisme. Din cauza c programele pentru prelucrarea informaiei textuale
au o popularitate foarte mare, limbajul C conine mecanisme care uureaz lucru cu
irurile de caractere. Aici irurile snt precutate ca un tip special de masive, fapt ce
permite ntroducerea si afiarea irurilor ca un tot ntreg. Pentru ntroducerea irului
n memoria calculatorului este folosit funcia gets( ). Aceast funcie are urmtoarea
sintax:
gets (nume);
unde nume este parametrul funciei i reprezint numele
variabilei tip ir, adic a masivului de tip char. Exemplu:
void main(void) {
int i; char name [15];
printf ("Culege numele:");
gets(name);
printf ("Numele dumnevoastra este:");
for (i=0; i<15; i++)
printf ("%C", name[i]); }
Aici funcia gets( ) va precuta primele 14 caractere culese de la tastatur ca
valoare a irului cu nume name, iar ultima celul din masiv va conine simbolul nul
\0. n timpul lucrului functiei gets( ) executarea programului se stopeaz. Funcia
gets( ) ateapt pn utilizatorul va culege un ir de la tastatur. Pentru ca textul cules
s fie atribuit ca valoare unei variabile de tip ir, utilizatorul trebuie s culeag tasta
ENTER. Dup aceasta propoziia culeas va deveni valoare a variabilei de tip ir, iar
cursorul va trece n rnd nou pe monitor. Anume in timpul culegerii tastei ENTER
compilatorul C adaog la sfritul irului simbolul nul. n exemplu de mai sus
culegerea irului se precaut ca culegerea unei variabile de tip ir aparte i nu ca
culegerea a mai multor variabile de tip caracter. ns afiarea numelui rmne
incomod. Aici, dac vor fi culese mai puin de 15 simboluri de la tastatur, atunci
elementele masivului name[15] ce urmeaz dup simbolul nul vor conine mrimi
aleatoare.
n afar de funcia gets() limbajul C mai conine o modalitate de a ntroduce o
propoziie n memorie ca valoare a unei variabile de tip ir. Folosind funcia de
42
43
9. Structuri n C/C++.
Pn n momentul de fa au fost studiate tipurile de date compuse, elementele
crora aparin aceluiai tip de date(simplu sau compus). n cazul unui masiv,
elementele acestuia erau de acelai tip: ntreg, real, caracterial etc; fr a fi posibil
atribuirea diferitor elemente ale masivului valori de tipuri diferite. ns deseori apar
situaii cnd este necesar prelucrarea i pstrarea unei informaii mai complexe, aa
c orarul leciilor, reuita unui student etc. Dac precutm cazul cu reuita
studentului, atunci este simplu de presupus c va fi necesar urmtoarea informaie:
numele studentului, grupa, notele la examen, balul mediu calculat. Aceste date snt
legate ntre ele prin faptul c aparin aceleiai persoane. Ca urmare ar fi justificat
tratarea lor ca o singur valoare compus. ns tipurile datelor defer ntre ele:
numele i grupa vor fi de tip ir, notele la examen - de tip ntreg, iar balul mediu
calculat - de tip real(float). Gruprea acestor componente ntro variabil compus este
posibil folosind un tip nou de date numit n limbajul C structur.
Primul pas n gruparea componentelor de diferite tipuri ntr-o variabil
compus este declararea i descrierea structurii. Declarnd o structur, se creeaz un
tip nou de date a utilizatorului, care pn n momentul dat n-a fost cunoscut de
compilator. Declararea structurilor se face n partea declarrii tipurilor, nainte de
nceputul funciei principale main().
Declararea unei structuri ncepe cu cuvntul chee struct, dup care urmeaz
numele structurii, care se mai numete tip nregistrare. Elementele unei variabile de
tip nregistrare snt nscrise dup numele structurii ntre acolade. Sintaxa de descriere
a elementelor structurii e analogic cu sintaxa declarrii variabilelor: se indic
numele i tipul elementelor din structur desprite prin simbolul ;. Descrierea
structurii de asemenea se termin cu simbolul ;. Sintaxa descrierii unei structuri n
caz general este urmtoarea: struct nume {tip_1 nume_1; tip_2 nume_2;; tip_n
nume_n;};
Lista elementelor din structur poart numele de ablon. O structur, ca atare
nu declar nici o variabil. Elementele unei structuri nu snt variabile aparte, ele snt
componente ale unei sau a mai multor variabile. Astfel de variabile se numesc
structurale i trebuie declarate ca fiind de tipul structurii respective. ablonul
respectiv va descrie aceste componente, astfel va fi determinat volumul de memorie
necesar de rezervat pentru fiecare variabil structurat de tip nregistrare.
Dac precutm exemplu cu reuita unui student, declararea unei structuri va fi
urmtoarea : struct stud {char name [20] ; int ex1, ex2; float med; char grup [10];};
44
45
46
47
48
49
50
51
funciilor este cu mult mai simpl dect prelucrarea unui program voluminos i
complicat. Mai mult ca att, funcia creat pentru un program poate fi folosit i n alt
program fr schimbri. n aa mod pot fi alctuite biblioteci de funcii, folosirea
crora cu mult va micora timpul folosit pentru alctuirea programelor.
10.1. Transmiterea parametrilor n funcie.
Pentru a mri posibilitile funciilor din program, limbajul C++ permite de a
transmite informaie n ele. Informaia iniial transmis din program n funcie la
momentul apelului acesteia se numete parametru. Dac funcia folosete parametri,
ei trebuie descrii n timpul descrierii funciei. n timpul descrierii parametrelor
funciei se indic numele i tipul fiecrui parametru n urmtorul mod:
tip_parametru nume_parametru;
Dac funcia conine civa parametri, ei vor fi descrii mpreun ntre
parantezele rotunde dup numele funciei desprii prin virgul dup cum urmeaz:
tip_funcie nume_funcie (tip_parametru1 nume_parametru1,
tip_parametru2 nume_parametru2
.........................................................
tip_parametruN nume_parametruN );
Funcia din exemplu urmtor folosete un parametru de tip ntreg, care
n rezultatul ndeplinirii sale, l afieaz la monitor.
# include<stdio.h>
void numr (int a) {
printf(Parametru=%d\n,a);}
void main (void) {
numr (1);
numr (17);
numr (-145); }
n rezultatul ndeplinirii acestui exemplu vor fi primite 3 fraze ca
rspuns:
Parametru=1
Parametru=17
Parametru=-145
n timpul executrii acestui program, funcia numr() este apelat de 3
ori cu diferite valori a parametrului. De fiecare dat cnd n program este ntlnit
funcia numr() valoarea parametrului este nlocuit n funcie i rezultatul est diferit.
Parametrii funciei pot fi de tipuri diferite. n cazul exemplului precedent
parametrul a este de tip ntreg. Dac n program va fi fcut ncercarea de a
52
53
54
55
Mai mult ca att funcia poate folosi valoarea returnat n condiii, dup
cum urmeaz:
if (media(5,7,-14)<0) printf(media este negativa\n);
10.3. Prototipul funciei.
nainte de a face apelul unei funcii compilatorul C++ trebuie s cunoasc tipul
valorii returnate, cantitatea i tipul parametrilor folosii de funcie. n fiecare
exemplu precutat pn n prezent descrieria funciei era fcut naintea apelului ei
din programul principal. ns snt situaii, cnd unele funcii n program snt apelate
reciproc. n aa cazuri este posibil situaia cnd o funcie va fi apelat nainte
descrierii sale.
Pentru a garanta faptul, c compilatorul C++ cunoate particularitile fiecrei
funcii folosite n program, se folosesc prototipi ai funciilor. Prototipul unei
funcii este amplasat la nceputul programului i conine informaia despre tipul
valorii returnate, cantitatea i tipul parametrilor folosii de funcie.
Exemplul urmtor demonstreaz cum s-ar putea alctui prototipi pentru funciile
folosite anterior.
void afiare (void);
void hello (void);
void tema (void);
void numr (int);
void muncitor (char, float);
void max (int, int);
int suma (int, int);
float media (int, int, int);
Dup cum se vede din exemplu fiecare funcie i are prototipul su care
descrie tipul valorii returnate, cantitatea i tipul parametrilor. Este important de nu
uitat de simbolul ; la sfritul fiecrui prototip. Lispa lui duce la eroare n
compilare, la fel cum duce la eroare lipsa prototipului unei funcii dac aceasta
apare n program naintea descrierii sale. Fiind declarat prototipul unei funcii
nainte de a fi nceput corpul programului, descrierea ei poate fi fcut dup
acolada de nchidere a programului principal. Exemplu:
# include<stdio.h>
# include<conio.h>
float media (int,int,int);
void main (void) {float r;
clrscr(); r=media (5,17,10);
56
printf (media=%f/n,r);
getch ( ); }
float media (int a, int b, int c) {
return (float(a+b+c)/3.0);}
10.4. Variabile locale i domeniul de vizibilitate.
Funciile folosite n exemplele precedente ndeplinesc nite sarcini relativ
simple. La momentul, cnd funciile vor trebui s ndeplineasc nite sarcini mai
complicate, va aprea necesitatea folosirii n funcii a variabilelor proprii.
Variabilele declarate n cadrul funciei se numesc locale. Numele i valoarea
unei variabile locale snt cunoscute numai funciei n care ea a fost declarat. Chiar
faptul c variabila local exist este cunoscut numai funciei n care ea a fost
declarat. Declararea variabilelor are loc la nceputul funciei, ndat dup acolada ce
deschide corpul acesteia. Numele variabilei locale trebuie s fie unical numai n
funcia n care a fost declarat. O variabil se numete local, din cauz c este vzut
numai din funcia n care a fost descris. Sintaxa de declarare a unei variabile locale
este:
tip_f numele_f (lista parametrilor) {tip_vl numele_vl;}
unde: tip_f - tipul funciei; nume_f - numele funciei; tip_vl - tipul variabilei;
numele_vl - numele variabilei;
Principiile de declarare i folosire a unei variabile locale oricrei funcii snt
identice cu principiile de declarare i utilizare a unei variabile declarate n corpul
funciei principale main(); O variabil declarat n corpul funciei main()este local
acestei funcii.
n general, tot ceia ce a fost spus despre variabilele declarabile n funcia
main(): tipurile, numele, principiile de utilizare .a. este aplicabil pentru o variabil
local din orice alt funcie.
Urmtorul exemplu folosete funcia fact() pentru calcularea factorialului unui
numr.
#include<stdio.h>
#include<conio.h>
int fact (int R) {
int i, k=1;
for (i=1;i<=R;i++){k*=i;}
return (k);}
void main (void) {
int n; clrscr();
57
58
int x,y;
printf(Culege 2 cifre\n);
scanf(%d%d,&x,&y);
printf(%d+%d=%d,x,y,suma(x,y));
getch(); }
Exemplul urmtor folosete funcia suma() pentru a calcula suma elementelor
unui masiv unidimensional de tip ntreg. n calitate de parametri se folosesc masivul
i mrimea sa.
# include<stdio.h>
# include<conio.h>
int suma (int y[10], int m) {
int i, sum=0;
for (i=0;i<m;i++){
sum+=y[i];}
return(sum); }
void main (void) {
int w,n,i,x[10]; clrscr();
printf(Culege marimea masivului n<10\n);
scanf(%d, &n);
for (i=0;i<n;i++){
printf(Culege elementul x[%d]\n,i);
scanf(%d,&x[i]); }
w=suma(x,n);
printf(suma masivului = %d\n,w);
getch( ); }
10.5. Variabile globale.
Numim variabil global o variabil, numele i valoarea creia snt cunoscute
pe parcursul ntregului program. Despre existena unei variabile globale ntr-un
program C++ tie orice funcie din acest program. Pentru a crea o variabil global se
folosete declararea ei la nceputul programului n afara oricrei funcii. Orice
funcie, care va urma dup aa o declarare poate folosi aceast variabil global.
Declararea unei variabile globale are urmtoarea sintax:
# include<stdio.h>
tip_vg nume_vg;
void main (void)
{}
59
unde tip_vg este tipul variabilei globale, iar nume_vg numele variabilei globale.
Fiind declarat o variabil global, valoarea ei nu numai e cunoscut oricrei
funcii din program, dar i poate fi schimbat din oricare din funciile prezente n
program.
Exemplu urmtor folosete variabila cu numele cifra. Fiind accesibil din
oricare din 2 funcii prezente n program, valoarea variabilei globale cifra este
schimbat pe rnd din ambele funcii:
# include<stdio.h>
int cifra=100;
void f1 (void) {
printf(cifra=%d\n, cifra);
cifra*=2; }
void f2 (void) {
printf(cifra=%d\n,cifra);
cifra+=2;}
void main (void) {
printf(cifra= %d\n, cifra); //100
cifra ++;
f1();
//101, 202
f2 ( );
//202, 204
printf(cifra=%d\n,cifra);
//204
getch( ); }
Cu toate c prezena variabilelor globale n program adaog noi posibiliti, e
de dorit de a evita folosirea lor frecvent. Din cauza, c orice funcie din program
poate schimba valoarea variabilei globale este foarte greu de urmrit toate funciile,
care ar putea schimba aceast valoare, ceia ce duce la control dificil asupra execuiei
programului. Pentru a rezolva aceast problem se poate declara variabila n corpul
funciei main() i apoi de a o transmite altor funcii, n calitate de parametru. n acest
caz n stiv va fi amplasat copia temporar a acestei variabile, iar valoarea iniial
(originalul) va rmne neschimbat.
10.6. Conflicte dintre variabile locale i globale.
n cazul cnd un program trebuie s foloseasc o variabil global, poate aprea
situaie de conflict, dintre numele variabilei globale i numele variabilei locale. n aa
cazuri limbajul C++ ofer prioritate variabilei locale. Adic, dac exist variabil
global cu acelai nume ca i variabila local, compilatorul consider, c orice apel a
variabilei cu aa nume este un apel al variabilei locale. ns apar situaii, cnd exist
60
61
int *x;
// indicator la date de tip ntreg.
float *p;
// indicator la date de tip flotant.
char *z;
// indicator la date de tip caracterial.
int *y[3];
// masiv de indicatiori la date de tip ntreg.
void *k;
//indicator la obiectul datelor tipul crora nu-i necesar de definit
char *S[5];
// masiv de indicatori la date de tip caracter.
char (*S)[5];
// indicator la date de tip caracter din 5 elemente.
Odat ce indicatorul a fost declarat ca referin la date de tip ntreg, el nu se va
putea referi la o variabil tip float, cauza fiind volumul diferit rezervat n memorie
pentru variabile ntregi i flotante. Exist indicatori i ctre elemente fr tip - void.
Putem atribui unui pointer void valoarea altui pointer non-void, fr a fi necesar
operaia de conversie de tip. Exemplu:
int *a; void *b;
b=a; //corect
a=b; //incorect, lipsete conversia de tip.
Fie c a avut loc o atribuire de forma: int x=5;. n acest caz pentru variabila x a
fost rezervat o zon de memorie cu volumul de 2 octei, care i are adresa sa.
Adresa zonei de memorie, unde se pstreaz valoarea variabilei x se poate obine cu
operatorul obinerii adresei &. Rezultatul operaiei obinerii adresei este adresa
locaiei de memorie ce a fost alocat pentru variabila respectiv. De exemplu:
presupunnd c x e nscris n memorie pe adresa 21650, atunci &x va fi egal cu
21650. Este important, c &x este constant de tip indicator i valoarea sa nu se
schimb n timpul execuiei procramului. Exemplu:
# include <stdio.h>
void main (void)
int x=5; float r=1.7;
int *q; float *w;
q=&x; w=&r;
printf (%f se afl pe adresa % d \n,r,w);
printf (% d se afl pe adresa %d \n,x,q);}
Din exemplu uor se observ c adresa celulei de memorie se reprezint printro valoare de tip ntreg. n acelai timp aceast valoare nu poate fi schimbat n
program i expresia &x=55; este incorect.
Analiznd toate aceste noiuni, apare ntrebarea: Cu ce scop se folosesc
indicatori, dac valoarea variabilei i valoarea adresei sale se poate pstra n variabile
simple?.
62
63
64
parametrului formal din funcie prin indicator, deasemenea este schimbat i valoarea
parametrului actual. Exemplu:
# include <stdio.h>
int schimb (int w, int *z)
(*z)*=2; w=w*2;
return(w);}
void main (void)
int x=5, y=8,a;
printf (x=%d, y=%d,x,y);
a=schimb(x, &y);
printf (x=%d,y=%d\na,y);}
n acest exemplu snt date 2 variabile x=5 i y=8. Funcia schimb() schimb
valorile lor nmulindu-le la 2. ns, dac valoarea lui x este schimbat n funcie i
ntoars n program prin intermediul operatorului return, atunci valoarea lui y este
schimbat prin intermediul indicatorului. Apelnd funcia schimb(), noi transmitem n
calitate de parametru nu valoarea variabilei y, ci adresa celulei de memorie, unde ea
i pstreaz valoarea. n aa fel, orice schimbare a valorii indicatorului *z din funcie
va duce la schimbarea valorii variabilei y din program.
Un caz aparte n lucrul cu indicatorii este folosirea indicatorului la un ir de
caractere. irul de caractere prezint un masiv tip caracterial. Cnd programul
transmite un masiv n funcie, compilatorul transmite adresa primului element al
masivului. n rezultat este admisibil ca funcia s foloseasc indicator la ir de
caractere. Exemplul urmtor calculeaz de cte ori ntr-o fraz dat se ntlnete
caracterul a:
# include <stdio.h>
int litera (char *s){
int k=0;
wutile (*s!=\0) {
prinf (caracterul % c pe adresa %d,*s,s);
if (*s ==a) k++;
s++;}
return (k);}
void main (void)
int p; char x [25];
puts (culege o fraz);
gets (x);
p=litera(x);
65
66
67
68
att, valorile atribuite variabilelor din program snt pstrate numai pe parcursul
ndeplinirii programului. Odat cu terminarea execuiei programului, toat informaia
ntrodus se pierde.
Pentru a pstra informaia odat ntrodus, cu scopul folosirii ulterioare este
necesar nscrierea ei pe disc n structuri de date speciale, ce poart denumirea de
fiiere. Folosirea fiierelor permite pstrarea informaiei de orice natur pentru un
timp ndelungat, transferarea datelor de pe un purttor informaional pe altul, citirea
i afiarea datelor n caz de necesitate. Tat informaia, n ceea ce privete lucrul cu
fiierele n limbajul C/C++ este pstrat n biblioteca stdio.h. Deaceea nainte de a
ncepe prelucrarea unui fiier n C/C++, este necesar de inclus aceast bibliotec n
program cu ajutorul directivei #include<stdio.h>, care va face posibil nscrierea
informaiei n fiier i citirea ei. n timpul intrrii datelor n program dintr-un fiier de
pe disc, are loc copierea lor n memoria operativ a calculatorului, iar informaia din
fiier ce se afl pe discul rigid rmne neschimbat pe parcursul executrii
programului.
La ieirea datelor din program pe disc, n fiier snt nscrise datele
ce se pstrau pn n acel moment n memoria operativ.
nscrierea sau citirea informaiei din fiier este efectuat cu ajutorul
indicatorului la fiier. n timpul nscrierii sau citirii informaiei din fiier compilatorul
folosete un nivel intermediar de legtur ntre program i discul rigid, unde este
pstrat fiierul. Acest nivel reprezint o zon de memorie numit zona tampon care
are destinaia de pstrare temporar a informaiei cu scopul de a o nscrie sau citi apoi
din fiier.
Pentru a trimite sau a citi informaia din zona tampon compilatorul folosete o
structur special numit structur-fiier. n aceast structur este pstrat informaia
necesar calculatorului pentru a efectua nscrierea/citirea datelor din fiier, inclusiv
adresa zonei de memorie, unde este amplasat fiierul.
Sintaxa de declarare a unui indicator de fiier este urmtoarea:
FILE *file_pointer;
unde cuvntul cheie FILE indic compilatorului c variabila declarat este un
indicator la fiier, iar file_pointer este numele indicatorului. n caz cnd programul
presupune lucrul cu cteva fiiere, este necesar declararea a mai multor indicatori la
fiiere dup cum urmeaz:
FILE *f1, *f2, *f3;
unde f1, f2, f3 snt numele indicatorilor la fiiere diferite.
Prelucrarea fiierelor n limbajul C/C++ presupune ndeplinirea urmtorilor
pai:
69
70
71
72
73
74
75
fputs(fam,k); fputs(\n,k);
printf(culegei urmtoarea familie\n);
gets (fam);}
fclose (k);}
Aici ciclul while va fi repetat pn cnd va fi ntrodus un ir de lungime 0.
Funcia fputs() va nscrie n fiier irurile fiecare din rnd nou datorit inserrii
fputs(\n,k); La sfritul prelucrrii sale, fiierul familia.txt este neaprat nchis
fclose(k); Este de menionat faptul, c pentru a imprima pe hrtie familiile culese
folosind imprimanta, este necesar de indicat numele fiierului prn n felul urmtor:
k=fopen (prn,w);. Pentru imprimarea corect la imprimant este necesar
folosirea irurilor cu lungime de 81 caractere, cu scopul ca irul s ncap n
ntregime n limea monitorului, nainte de a fi culeas tasta ENTER.
Ciritea irurilor de caractere din fiier este realizat de funcia fgets() ce are
urmtoarea sintax:
fgets(s_var, l, fp); unde s_var este o variabil tip ir de caractere, l este o
variabil sau constant de tip ntreg, ce indic cantitatea maxim posibil de caractere
n ir, fp este un indicator la fiier.
Urmtorul exemplu face posibil citirea familiilor din fiierul familia.txt
creat n exemplul precedent:
# include <stdio.h>
# include <conio.h>
void main (void) {
FILE *r; char name[15];
clrscr();
r=fopen(familia.txt,r);
printf(Informaia cititdin fiier:/n);
while ( fgets(name, 15, r)!=NULL )
printf (%sname);
fclose(r); getch(); }
Aici ciclul while va fi repetat pn cnd nu va fi defectat codul sfrit de
fiier. n cazul citirii informaiei din fiier la nivel de iruri de caractere, pentru a
indica sfritul fiierului se folosete codul NULL, iar codul EOF este folosit la citire
caracterial. Funcia fgets() va citi irul n ntregime pn la codul linie nou, dac
lungimea lui nu depete valoarea l-1 indicat n parametrii funciei.
Atragei atenia la faptul, c funcia printf(%s,name); nu folosete codul
/n pentru deplasarea n rnd nou, fiindc fiecare ir citit din fiier deacum conine
76
77
monitor 2000 1
Atragei atenia la simbolul \n- sfrit la linie la sfritul irului de control a
formatului din funcia fprintf(), anume datorit lui, informaia despre fiecare produs
este nscris din rnd nou n fiier.
Citirea informaiei cu format din fiier se realizeaz cu funcia fscanf(), care are
aceleai restricii ca i funcia scanf(), i folosete urmtoarea sintax:
fscanf (fp, format, data); care este identic cu sintaxa funciei fprintf() n
ciea ce privete descrieria parametrilor.
n exemplu urmtor se realizeaz citirea informaiei din fiierul produs.txt
despre produsele din depozit nscrise n fiier n exemplu precedent:
# include<stdio.h>
# include<conio.h>
void main (void) {
clrscr();
FILE *a; char name[20];
float pret; int unit;
a=fopen(produs.txt,r);
while( fscanf( a, %s%f%d, name, &pret, &unit)!=EOF) {
printf(Denumire: %s\n,name);
printf(pret:
%f\n,pret);
printf(cantitatea:%d\n,unit); }
fclose(a); getch(); }
Aici citirea datelor din fiier are loc chiar odat cu controlul condiiei de
continuare a ciclului while. Ciclu while va fi ndeplinit pn cnd nu va fi detectat
codul de sfrit de fiier care n acest caz este EOF.
Datele din fiier snt citite n variabilele name, pre i unit i apoi afiate la
monitor.
12.2.4. Fiiere i structuri.
Pentru a nscrie o variabil tip structur (nscriere) n fiier este folosit funcia
fwrite(), care are urmtoarea sintax:
fwrite (&struct_var, struct_size, n, fp); unde:
- &struct_var este numele variabilei tip structur cu operatorul de adres, care
comunic compilatorului adresa celulei de start din memoria unde este
amplasat structura.
- struct_size este mrimea structurii. Pentru determinarea mrimii structurii se
folosete funcia sizeof(s); unde s este numele variabilei de tip structur.
78
79
Funcii de ieire
Funcii de intrare
caractere
iruri de caractere
date cu format
structuri
putc(); fputc();
fputs();
fprintf();
fwrite();
getc(); fgetc();
fgets();
fscanf();
fread();
EOF
NULL
EOF
0
80
81
acest caz, pentru trecerea cursorului n alt rind trebuie folosit consecutivitatea de
simboluri \n destinat afirii pe ecran a simbolului de conducere trecere n alt
rind, n acest caz funcia puts() va avea urmtoarea sintax: puts(Hello world!\n);
Prototipul funciei puts() este descris n biblioteca stdio.h din aceast cauz este
necesar includerea acestei biblioteci n cadrul programului cu ajutorul directivei
#include<stdio.h>.
Funcia putchar()
Are destinaia afirii unui singur simbol la ecran . Ca i n cazul funciei puts()
n calitate de parametru al funciei poate fi folosit un literal, o constant sau o
variabil de tip caracter. De exemplu:
literal n calitate de parametru:
putchar(C);
constant tip caracter n calitate de parametru:
#define lit C void main(void) {putchar(lit);}
variabil tip caracter n calitate de parametru:
void main(void) {char lit; lit=C; putchar(lit);}
Menionm faptul, c cu ajutorul funciei putchar() este posibil afiarea numai
a unui singur caracter i instrucia de tipul putchar(Da); va duce la eroare de
compilare.
Diferena principal la folosirea caracterelor i irurilor de caractere const n
faptul, c irurile de caractere snt delimitate de ghilimele, pe cnd caracterele se
delimitate de apostrofe.
Majoritatea compilatoarelor nu efectuiaz deplasarea cursorului n rind nou
dup executarea funciei putchar() i el rmne nemijlocit dup simbolul afiat.
Pentru trecerea n alt rind dup afiare se recomand folosirea simbolului \n. Unele
compilatoare folosesc pentru afiarea caracterelor i funcia putch(), care are sintaxa
de folosire identic cu cea a funciei putchar(). Prototipul funciei putchar() este
descris n biblioteca standard stdio.h, ceea ce face necesar includerea acestei
biblioteci n textul programului cu ajutorul directivei #include<stdio.h>. Iar
prototipul funciei putchar() este descries n biblioteca standard stdio.h, ceea ce face
necesar includerea acestei biblioteci n textul programului cu ajutorul directivei
#include<stdio.h>. Iar prototipul funciei putc() este descries n biblioteca conio.h i
folosirea ei va fi nsoit de directiva #include<conio.h>.
82
Funcia printf()
Funciile putch() i puts() snt folosite destul de des, n s posibilitile lor , cu
prere de ru snt limitate. Aceste funcii nu asigur afiarea unei valori numerice la
ecran i pot prelucra numai un singur argument (parametru). n limbajul C exist o
funcie mult mai universal numit printf(). Ea permite afiarea pe ecran a datelor de
orice tip i poate prelucra o list din civa parametri. n afar de aceasta cu ajutorul
funciei printf() se poate determina formatarea datelor afiate pe display. n cel mai
simplu caz funcia printf() poate fi folosit n locul funciei puts() pentru afiarea unui
ir de caractere:
#define MESAJ Hello world!;
void main(void) { printf(MESAJ); printf(Bine ati venit); }
Ca i n cazul funciei puts(), funcia printf() poate avea n calitate de
parametru un literal, o constant, o variabil de tip ir de caractere.
Pentru a afia pe display mrimi numerice i a avea posibilitate de a formata datele de
diferite tipuri, lista de parametri a funciei printf() se mparte n dou pri:
printf(irul cu format, lista datelor);
Primul parametru se numete ir de conducere sau ir cu format. Acest parametru se
delimiteaz cu ghilimele indic compilatorului n ce poziie din ir trebuie s apar
datele. irul cu format poate conine orice text mpreun cu nite etichete numite
indicatori de format care determin tipul datelor i amplasarea lor. Orice indicator de
format ncepe cu simbolul procent (%), dup care urmeaz un caracter ce indic tipul
datelor. Aa indicatori snt: %d numr ntreg; %u numr ntreg fr semn; %f
numr real de tipul float sau double;%e numr real n form exponenial; %g
numr real afiat n format %f sau %e n dependen de faptul care form de scriere
este cea mai scurt; %c caracter; %s ir de caractere.
n aa fel prima parte a funciei printf se poate scrie n felul urmtor
printf(%d,); simbolul procent (%) spune compilatorului c dup el va urma un
indicator de format, iar pantru a afia pe ecran nsi simbolul procent (%) este
necesar de-l scris de 2 ori n felul urmtor: printf(%%); Litera d indic
compilatorului faptul c va trebui afiat o valoare de tip ntreg, adic un numr scris
n sistemul zecimal.
Partea a doua din lista parametrilor este lista datelor, care poate conine literale,
nume de variabile sau constante, valorile crora este necesar de afiat pe ecran. Lista
datelor se desparte de irul cu forma prin virgul. Toate elementele din lista datelor
deasemenea se despart ntre ele prin virgul. Cnd compilatorul prelucreaz aceast
funcie, el nlocuiete indicatorii de format cu valorile din lista datelor. De exemplu:
printf(%d,5); n timpul ndeplinirii acestei funcii valoarea 5 va fi amplasat n
83
locul indicatorului de format (%d). irul cu format poate conine nu numai indicatori
de format, ci i text obinuit care conine i indicatori de format. De exemplu:
printf(Este ora %d,5); n rezultatul executrii acestui exempplu pe ecran va fi
afiat mesajul Este ora 5. Acelai effect poate fi primit i la folosirea funciei
puts(Este ora 5); ns pentru combinarea textului cu valori, constante i variabile
numerice e necesar folosirea funciei printf(). Exemplu:
void main(void) {
int ora; ora=5; printf(Este ora %d,ora); }
Acest exemplu folosete n calitate de parametru o variabil de tip ntreg ora, care
este amplasat n lista datelor. Bineneles lista datelor poate conine civa parametri.
De exemplu:
void main(void) {
int ora,min; ora=5; min=25;
printf(Este ora %d i %d minute,ora,min);}
n rezultat vom avea afiat la ecran mesajul: Este ora 5 i 25 minute. n
cazul folosirii ctorva parametri n lista datelor i respectiv n irul cu
format,parametri din lista datelor trebuie s corespund ca cantitate, poziie i tip cu
indicatorii din irul cu format. n cazul nostru primul simbol %d corespunde
variabilei ora, iar al doilea variabilei min.
n cadrul unei funcii printf() pot fi folosii nu numai civa parametri de acelai
tip, ci i parametri de tipuri diferite. De exemplu:
void main(void) {
int cant; float pret; pret=5.21; cant=3;
printf(Preul este de %f lei pentru %d kg.,pret,cant);
n rezultat va fi afiat mesajul: Preul este de 5.210000 lei pentru 3 kg. Aici
ntradevr parametrii din lista datelor corespund ca cantitate, poziie i tip cu
indicatorii de format din irul cu format.
Funcia printf() nu trece automat cursorul n alt rind dup afiarea datelor.
Adic dip afiare cursorul rmne n acelai rind nemijlocit dup ultimul caracter
afiat. Pentru trecerea cursorului alt rind aici va fi folosit consecutivitatea de
conducere \n, care trece cursorul pe prima poziie a rndului urmtor ca i n cazul
funciei puts(). De exemplu: printf(Preul este de %f lei \npentru %d kg.,5.21,3);
Aici dup afiare mesajul va vi amplasat n 2 rnduri:
Preul este de 5.210000 lei
pentru 3 kg.
La fel ca i simbolul \n aici pot fi folosite i simbolurile: \a , \b , \t , \v , \r
.a.
84
85
Pentru folosirea fluxului cout este necesar de inclus n textul programului C++
fiierul <iostream.h> cu ajutorul directivei #include<iostresm.h>, din cauza c el
conine descrierea fluxurilor de intrare i ieire n C++. Structura instruciunei ce
folosete fluxul cout este urmtoarea: cout<<lista_de _date; unde simbolul <<
este operatorul inserrii i indic compilatorului necesitatea afirii listei de date ce
urmeaz dup el. n calitate de informaia afiat cu ajutorul fluxului cout pot servi
literali, nume de constante i variabile de orice tip. Mai mult ca att, folosind unul i
acelai flux de ieire se poate afia pe ecran civa argumeni, cu condiia c ei vor fi
delimitai ntre ei prin operatorul inserrii. De exemplu:
#include<conio.h>
#include<iostream.h>
void main(void) { clrscr();
const cant=3;
int ora, min; float suma;
suma=5.21; ora=9; min=20;
cout<<"Hello world\n";
cout<<"Este ora "<<9;
cout<<"\nEste ora "<<ora<<" si "<<min<<" minute\n";
cout<<"Pretul este de "<<suma<<" lei pentru "<<cant<<" kg";
getch();}
Deasemenea ca i funcia printf() fluxul cout nu trece cursorul n rind nou
automat dup afiarea datelor. Pentru prezentarea comod a datelor aici este necesar
folosirea consecutivitii de conducere \n dup cum este artat n exemplul
precedent.
Funcii de intrare n C.
Procesul de intrare a datelor presupune ntroducerea informaiei necesare
pentru lucrul normal al programului. Informaia ntrodus se amplaseaz n variabile,
aceasta nseamn c valorile venite de la utilizator n urma afirii comentariului
corespunztor pentru ntroducere snt atribuite ca valori variabilelor ce se pstreaz n
memorie. n general intrarea datelor poate fi efectuat de la diferite surse aa ca
tastatura, memoria, unitatea de disc rigid sau flexibil, scanner, CD-ROM .a.
Intrarea datelor este un process ce determin lucrul de mai departe al programului.
Corectitudinea datelor de intrare influieneaz direct asupra corectitudinii rezultatelor
obinute cu folosirea acestor date de intrare. Datele de intrare pot fi atribuite ca valori
numai variabilelor i nici ntr-un caz constantelor, valorile crora nu se schimb pe
ntreg parcursul de ndeplinire a programului. Dac variabila n care va fi amplasat o
86
valoare de la un dispozitiv de intrare deja are o valoare oarecare, atunci valoarea nou
venit va nlocui valoarea veche. n continuare vor fi studiate i analizate numai
posibilitile de intrare de la tastatur, lsnd pentru temele viitoare studierea
mecanismelor intrrii datelor din alte surse.
Funcia getchar()
Funcia getchar() face posibil introducerea de la tastatur a unui singur
simbol. Majoritatea compilatoarelor nu fac diferen ntre valori de tipul int i char la
folosirea funciei getchar(), fapt condiionat de standardul K&R C. Daca variabila va
fi declarat de tip int, funcia getchar() va primi-o n calitate de valoare de intrare i
compilatorul nu va semnala eroare, ns valoarea caracterului culeas de la tastatur
va fi conversat ntr-un numr ntreg egal cu codul corespunztor acestui caracter din
tabelul cu caractere ASCII.
Sintaxa de folosire a acestei funcii este urmtoarea: var=getchar(); , unde var
este numale variabilei crei i va fi atribuit caracterul cules de la tastatur.
Aici funcia getchar() este chemat folosind alt sintax n comparaie cu funciile
puts(), putch(), printf(). Inscripia folosit nseamn: de a atribui variabilei cu numele
var valoarea primit n rezultatul executrii funciei getchar(). Funcia getchar() nu
folosete argument, din aceast cauz parantezele rotunde de dup numele funciei
rmn goale. Dup ce utilizatorul culege o tast de la tastatur, getchar() afiaz
simbolul ntrodus pe ecran. n acest caz nu e necesar culegerea tastei Enter dup
ndeplinirea funciei, din cauza c getchar() face posibil ntroducerea numai unui
singur simbol, dup ce programul trece la ndeplinirea de mai departe. Valoarea
ntrodus este atribuit variabilei ndat dup ce a fost cules un caracter. n timpul
folosirii funciei getchar(), n textul programului trebuie inclus fiierul <stdio.h>,
care conine descrierea prototipului acestei funcii.
Unele compilatoare C i C++ folosesc funcia getch() analogic cu funcia
getchar(). ns descrierea prototipului funciei getch() se afl n fisierul <conio.h>,
care trebuie inclus n textul programului: #include<conio.h>. Exemplu:
#include<stdio.h>
#include<conio.h>
void main(void) {char lit, lit1; lit=getchar(); lit1=getch(); putchar(lit);
putchar(\n); putchar(lit1);}
n timpul ndeplinirii programului compilatorul nu are indicaii implicite de a
opri ndeplinirea acestuia dup executarea ntregului program. Acest fapt este necesar
pentru a fi posibil vizualizarea i analiza rezultatelor nemijlocit dup sfritul
87
88
89
90
3. Funcia sin(x).
Prototip: double sin(double x); long double sinl(long double x);
Efect: ntoarce valoarea sinus a numrului x [sin(x)];
Exemplu: vezi funcia cos(x).
4. Funcia tan(x).
Prototip: double tan(double x); long double tanl(long double x);
Efect: ntoarce valoarea tangentei a numrului x [tg(x)];
Exemplu: vezi funcia cos(x).
5. Funcia acos(x).
Prototip: double acos(double x); long double acosl(long double x);
Efect: ntoarce valoarea arccosinus a numrului x [arccos(x)];
Exemplu:
#include<math.h>
#include<iostream.h>
#include<conio.h>
void main(void) {clrscr();
double x,y;
cout<<"Culegeti valoarea x\n";
cin>>x; y=acos(x);
cout<<"arccosinusul lui "<<x<<" este = "<<y;
getch(); }
6. Funcia asin(x).
Prototip: double asin(double x); long double asinl(long double x);
Efect: ntoarce valoarea arcsinus a numrului x [arcsin(x)];
Exemplu: vezi funcia acos(x).
7. Funcia atan(x).
Prototip: double atan(double x); long double atanl(long double x);
Efect: ntoarce valoarea arctangentei a numrului x [arctg(x)];
Exemplu: vezi funcia acos(x).
8. Funcia log(x).
Prototip: double log(double x); long double logl(long double x);
Efect: ntoarce logaritmul natural al numrului x;
Exemplu:
#include<iostream.h>
#include<conio.h>
void main(void) {clrscr();
double x,y;
91
92
93
94
18.Funcia fmod(x,y).
Prototip: double fmod(double x, double y); long double fmodl(long doublex, long
double y);
Efect: ntoarce valoarea restului de la mprirea lui x la y.
Exemplu:
#include<iostream.h>
#include<conio.h>
void main(void) {clrscr();
double y,x,k;
cout<<"Culegeti valoarea x\n";
cin>>x;
cout<<"Culegeti valoarea y\n";
cin>>y;
k=fmod(x,y);
cout<<"restul de la mprirea <<x<<" la "<<y<< etse = <<k;
getch(); }
19.Funcia modf(x,y).
Prototip: double modf(double x, double *y); long double modfl(long double x,
long double *y);
Efect: ntoarce partea fracionar a numrului real x, pstrndu-se n y i valoarea
prii ntregi a numrului real x.
Exemplu:
#include<iostream.h>
#include<conio.h>
void main(void) {clrscr();
double y,x,k;
cout<<"Culegeti valoarea x\n";
cin>>x;
k=modf(x,&y);
cout<<"Cifra <<x<<" are partea ntreag = "<<y<<
i partea fracionar = <<k; getch(); }
20.Funcia div(x,y).
Prototip: div_t div(int x, int y); ldiv_t ldiv(long int x, long int y);
unde tipul div_t este declarat n felul urmtor:
typedef struct { long int quot; /* partea ntreag
long int rem; /* restul
}div_t;
95
96
#include <stdlib.h>
#include <stdio.h>
#include<conio.h>
void main(void)
{int i; clrscr();
for(i=0;i<15;i++)
printf("cifra aleatoare: %d\n",rand());
getch(); }
Anexa 3. Funcii folosite la prelucrarea irurilor de caractere.
Majoritatea compilatoarelor C/C++ au incorporate funcii speciale pentru
lucrul cu irurile. Evident, c pentru aa scopuri se poate crea funcii proprii, dar este
mai efectiv de folosit funciile din bibliotecile standarde. Prototipurile acestor funcii
snt descrise n biblioteca string.h i deci pentru folosirea lor, n program trebuie
inclus aceast bibliotec folosind sintaxa: #include<string.h>. Unele din aceste
funcii snt:
1. Funcia strcat();
Prototip: char *strcat (char *dest, const char *sursa);
Efect: Adaog irul surs la sfritul irului destinaie
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void) {
char dest [50]; char sursa [5];
dess=Turbo ; sursa =C++;
strcat (dest,sursa); puts(dest); getch(); }
Aici rezultatul va fi: dest=Turbo C++.
2. Funcia strcmp();
Prototip: int strcmp (const char * S1, const char* S2);
Efect: Compar dou iruri.
Limbajul C nu permite compararea a dou iruri n forma: if (S1==S2) ;
Aici compararea este fcut cu ajutorul funciei strcmp() care ntoarce valoare
nul, n caz c irurile snt identice, sau o valoare diferit de zero, n caz c
irurile nu coincid. Dup executarea funciei strcmp(), va fi ntoars o valoare
ntreag care va fi: mai mic ca 0 dac S1<S2;
mai mare ca 0 dac S1>S2;
97
98
6. Funcia strlen();
Prototip: size_t strlen(const char *S);
Efect: Determin lungimea irului de caractere S.
n majoritatea cazurilor lungimea irului nu coincide cu lungimea masivului n
care se afl irul. Adic lungimea masivului este mai mare. Funcia strlen()
determin lungimea real a irului i ntoarce o valoare de tip ntreg egal cu
cantitatea de caractere ce se afl n ir.
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void) {
char name[20]; int k;
puts (culege numele); gets (name);
k=strlen(name); printf (Numele dvs are % d caractere,K); getch(); }
7. Funcia strcpy();
Prototip: char *strcpy(char *S1, const char *S2);
Efect: Copie irul S2 n irul S1. Dup ndeplinirea funciei strcpy (S1,S2);
irul S1 i va pierde valoarea iniial i va avea valoarea nou din S2. Iar S2
va rmne neschimbat.
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void) {
char name [30]; char fam [30];
puts (Culege numele); gets (nume);
puts (culege familia); gets (fam);
strcpy (nume, fam);
puts(nume); puts(fam); getch(); }
n rezultatul ndeplinirii acestui exemplu numele va fi identic cu familia.
8. Funcia strcspn();
Prototip: size_t strcspn (const char *S1, const char *S2);
Efect: Determin poziia caracterului din irul S1, care primul a fost ntlnit n
irul S2. ntoarce o valoare de tip ntreg egal cu numrul de ordine a acestui
caracter.
99
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char name[20],fam[20]; int k;
puts ("culege numele"); gets (name);
puts ("culege familia"); gets (fam);
k=strcspn(name,fam);
printf ("Simbolul %c din %s primul a fost gasit in %s",
name[k],name,fam);
getch(); }
Dac n cazul nostru name=Stepan i fam=Ivanov, atunci rezultatul
funciei k=strcspn(name,fam); va fi k=4, din cauz c pe locul patru n numele
Stepan se afl caracterul a care primul a fost depistat n Ivanov .
9. Funcia strspn();
Prototip: size_t strspn(const char *S1, const char *S2);
Efect: Determin poziia caracterului din irul S1 ncepnd cu care S1 difer de
S2. ntoarce o valoare tip ntreg egal cu poziia acestui caracter.
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char name[20],fam[20]; int k;
puts ("culege numele"); gets (name);
puts ("culege familia"); gets (fam);
k=strspn(name,fam);
printf ("ncepnd cu simbolul %c irul %s difer de %s",
name[k],name,fam);
getch(); }
n caz c name=Stepan, iar fam=Stoianov lui k va fi atribuit valoarea 2
din cauz c anume ncepnd cu caracterul cu numrul de ordine 2 variabila
nume difer de variabila fam.
10.Funcia strdup();
Prototip: char *strdup (const char *S);
100
101
13.Funcia strncat()
Prototip: char *strncat (char *dest, const char *sursa, size_t k);
Efect: funcia strncat() adaog un numr egal cu k caratere de la nceputul
irului sursa la sfritul irului dest.
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char a[20]=Turbo; b[10]=Pascal;
strncat (a, b, 3); puts (a); }
n rezultatul executrii acestui exemplu primele 3 caractere din irul b[10],
(adica subirul Pas) vor fi adaogate la sfritul irului a[20]. Rezultatul
executrii funciei strncat() va fi de tip ir de caractere i se va conine n
vaiabila a. Dup executarea exemplului variabila a va conine valoarea
TurboPas.
14.Funcia strncpy();
Prototip: char *strncpy (char *dest, const char *sursa, size_t n);
Efect: Copie un numar dat de caractere dintr-un ir n altul;
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char a[40]=turbo; b [40]=basic ;
strncpy (a,b,2); puts (a); }
Funcia strncpy() nscrie un numr N dat de caractere din irul surs la
nceputul irului destinaie. Dac irul destinaie va avea lungime mai mare ca
N, atunci rezultatul va avea nceputul egal cu caracterele copiate, iar sfritul
iniial. Valoarea rezultatului se va conine n irul destinaie. n exemplu de mai
sus variabila a va avea valoare egal cu barbo.
15.Funcia strnset();
Prototip: char *strnset (char* s, int ch, size_t n) ;
Efect: Funcia strnset() copie caracterul ch pe primele n locuri din irul *S. n
caz c n>strlen (s), atunci n va deveni egal cu strlen(s)
102
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char a[15] = student , b=W ;
strnset (a,b,3); puts (a) ;}
n urma executrii funciei strnset() va fi ntoars o valoare de tip ir care va fi
nscris n irul destinaie . Din exemplu de mai sus a =WWWdent.
16.Funcia strrev();
Prototip char *strrev( char *s);
Efect: Funcia strrev() inverseaz irul de caractere S. Dup execuia funciei
strrev() primul caracter din ir va fi schimbat cu locul cu ultimul caracter,
caracterul 2 cu penultimul, etc. fr a lua n consideraie caracterul nul.
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char s1[10]=student;
printf(irul iniial - %s\n,s1);
strrev(s1);
printf(irul final - %s\n,s1);}
Dup executarea programului va fi primit mesajul: irul final tneduts.
17.Funcia strstr ();
Prototip: char *strstr(const char *s1, const char *s2);
Efect: Funcia strstr() determin dac irul S2 se conine n irul S1. Funcia
ntoarce un indicator la caracterul din S1 ncepnd cu care a fost depistat irul
S2.
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char S1[20], S2[20], rez;
S1 = international; S2 = nation;
rez = strstr (S1,S2); printf (subsirul este : %s,rez); }
103
Rezultatul: subirul este: national ;. Dac irul S2 n-a fost depistat n S1,
funcia strstr() ntoarce valoarea null.
18.Funcia strchr();
Prototip: char *strchr(const char *S, int c);
Efect: Scaneaz irul S n cutarea caracterului c. n caz de succes funcia
ntoarce un indicator la caracterul din S care primul a fost gsit identic cu
caracterul c. n caz de eroare (dac aa caracter nu exist n irul S) funcia
ntoarce valoare nul.
Exemplu:
#include <string.h>
#include <conio.h>
#include <stdio.h>
void main(void)
{ clrscr();
char S[15];
char *ptr, c = 'r';
strcpy(S, "TurboC++");
ptr = strchr(S, c);
if (ptr) {printf("Caracterul %c are pozitia %d in sirul %s\n", c, ptr-S, S);
puts(ptr);}
elseprintf("Caracterul n-a fost gasit\n");
getch(); }
n rezultatul ndeplinirii acestui exemplu la monitor va fi afiat mesajul:
Caracterul r are poziia 2 n irul TurboC++ i apoi datorit funciei
puts(ptr); va fi afiat irul S trunchiat de la caracterul r la care indic ptr:
rboC++.
19.Funcia strerror();
Prototip: char *strerror(int errnum);
Efect: Determin eroarea dup numrul erorii i returneaz un indicator la irul
de caractere ce conine descrierea erorii.
Exemplu:
#include <stdio.h>
#include <conio.h>
#include <errno.h>
void main(void)
{ clrscr();
char *numerr;
104
numerr = strerror(11);
printf("Eroarea este: %s\n", numerr);
getch(); }
n rezultaul executrii acestui exemplu funcia strerror(11); va determina
eroarea dup numrul ei, iar funcia printf va afia: Eroarea este: Invalid
format.
20.Funcia strpbrk();
Prototip: char *strpbrk(const char *s1, const char *s2);
Efect: Funcia caut n irul S1 primul caracter ce exist i n irul S2;
n caz de succes funcia ntoarce un indicator la primul caracter din S1 aprut
n S2.
Exemplu:
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main(void)
{ clrscr();
char *S1="Universitate";
char *S2="Moldova";
char *ptr;
ptr=strpbrk(S1,S2);
if (ptr) printf("Primul caracter din S1 gasit n S2 este: %c\n", *ptr);
else printf("Caracter nu a fost gasit\n");
getch(); }
n rezultat va fi gsit caracterul v .
21.Funcia strrchr();
Prototip: char *strrchr(const char *s, int c);
Efect: Funcia caut ultima apariie a caracterului c n irul S. n caz de succes
funcia ntoarce un indicator la ultimul caracterdin S identic cu caracterul c.
Exemplu:
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main(void)
{ clrscr();
char S[15];
char *ptr, c = 'r';
105
strcpy(S,"Programare");
ptr = strrchr(S, c);
if (ptr) {printf("Caracterul %c este pe pozitia: %d\n", c, ptr-S);
puts(ptr);}
else printf("The character was not found\n");
getch();}
n rezultatul ndeplinirii acestui exemplu la monitor va fi afiat mesajul:
Caracterul r este pe poziia 8 i apoi datorit funciei puts(ptr); va fi afiat
irul S trunchiat de la ultimul caracter r la care indic ptr: re.
22.Funcia strset();
Prototip: char *strset(char *s, int ch);
Efect: Schimb toate caracterele din irul S n valoarea caracterului c.
Rezultatul final se va pstra n acelai ir S.
Exemplu:
#include<string.h>
#include<stdio.h>
#include<conio.h>
void main(void){
char s[10]=student;
printf(irul iniial - %s\n,s);
strset(s,a);
printf(irul final - %s\n,s);
getch();}
n rezultat va fi primit: irul iniial student, irul final aaaaaaa.
106