Sunteți pe pagina 1din 15

Bibliografie selectiv recomandat

Burileanu, D., Dan, C., Pdure, M., Programare n C. Culegere de probleme, Editura Printech,
Bucureti, 2004.

Costea, D., Iniiere n limbajul C, Editura Teora, Bucureti, 1995.

Cristea, V., Ciumale, C., Kalisz, E., Panoiu, A., Limbajul C standard, Editura Teora, Bucureti,
1992.

Dan, C., Burileanu, D., Introducere n programarea calculatoarelor. Limbajul C, Editura


Printech, Bucureti, 2001.

Kernigham, B.W., Ritchie, D.M., The C Programming Language, Pretice Hall.

Knuth, D.E., Tratat de programarea calculatoarelor Algoritmi fundamentali, vol. I, Editura


Tehnic, Bucureti, 1973.

Nstac, D.I. Programarea calculatoarelor n limbajul C Elemente fundamentale, Editura


Printech, Bucureti, 2006.

Negrescu, L., Limbajele C i C++ pentru nceptori, Vol. I, Editura Microinformatica, ClujNapoca, 1996.

Negrescu, L., Limbajul C Culegere de probleme, Fascicolele 1-2, Cluj-Napoca, 1991.

Rusu, I., Gavrilescu, D., Grosu, V., ndrumar de laborator pentru programarea calculatoarelor,
Editura MATRIX ROM, Bucureti, 2004.

Rusu, I., Gavrilescu, D., Grosu, V., Programarea calculatoarelor n limbaj C, Editura MATRIX
ROM, Bucureti, 2002.

1. Noiuni de baz n programarea calculatoarelor


Programarea este o component a informaticii care are ca principal obiectiv realizarea de
programe care s constituie soluiile oferite cu ajutorul calculatorului unor probleme date. Programatorii
sunt acele persoane apte s implementeze ntr-un limbaj de programare algoritmul propus ca soluie la
respectiva problem, ce se preteaz a fi rezolvat cu ajutorul unui sistem de calcul. Dup nivelul de
implicare n efortul de rezolvare a problemelor specialitii n programare pot fi mprii n mai multe
categorii: analiti, analiti-programatori, ingineri-programatori, programatori amatori, etc. Cu toii au
ns n comun faptul c fiecare trebuie s cunoasc sintaxa i semantica unui limbal de programare i s
fie capabil, nu doar s citeasc, ci chiar s scrie codul surs, adic programul propriu-zis. Din acest
punct de vedere cunotinele de programare sunt considerate ABC-ul informaticii i sunt indispensabile
oricrui profesionist n domeniu i nu numai.
Pentru a putea fi rezolvat cu ajutorul unui sistem de calcul, fiecare problem va trebui s treac
prin trei etape obligatorii: analiza problemei, proiectarea algoritmului de soluionare i implementarea
algoritmului ntr-un program pe calculator. n ultima etap, sub acelai nume, au fost incluse n plus
dou subetape cunoscute sub numele de testarea i ntreinerea programului. Aceste subetape nu lipsesc
din ciclul de via a oricrui produs-program.
Dac etapa implementrii algoritmului ntr-un program executabil este o etap exclusiv practic,
realizat n faa calculatorului, celelalte dou etape au un pronunat caracter teoretic. n consecin,
primele dou etape sunt caracterizate de un anumit grad de abstractizare. Din punct de vedere practic
ns, i n ultim instan, criteriul decisiv ce confer succesul rezolvrii problemei este dat de calitatea
implementrii propriu-zise. Mai exact, succesul soluionrii este dat de performanele programului:
utilitate, vitez de execuie, fiabilitate, posibiliti de dezvoltare ulterioare, lizibilitate, etc. Cu toate
acestea este imatur i neprofesional strategia programatorilor nceptori care, neglijnd primele dou
etape, sar direct la a treia, evitnd etapa de analiz i componenta abstract a efortului de soluionare. Ei
se justific cu toii prin expresii puerile de genul: Eu nu vreau s mai pierd vremea cu teoria, am s
fac programul cum tiu eu. Ct vreme nu va face altcineva altul mai bun dect al meu, nu am de ce smi mai bat capul!.

Stabilirea corectitudinii i eficienei soluionrii problemei de rezolvat


Este adevrat c etapa care vizeaz implementarea unei probleme este fundamental, dar primele
dou etape au o importan capital. Ele sunt singurele ce pot oferi rspunsuri corecte la urmtoarele
ntrebri dificile: Exist certitudinea c soluia gsit este i cea corect? Exist certitudinea c
problema este rezolvat complet? Ct de eficient este soluia gsit? Ct de aproape este soluia aleas
de cea optim?
S menionm n plus c literatura de specialitate conine un numr impresionant de probleme
capcan pentru nceptori, i nu numai pentru ei. Ele provin majoritatea din realitatea imediat dar
pentru fiecare dintre ele nu se cunosc soluii eficiente. De exemplu, este dovedit teoretic c problema,
aparent banal pentru un calculator, a proiectrii Orarului optim ntr-o instituie de nvmnt
(facultate sau liceu) este o problem intratabil la ora actual (toate programele care s-au realizat pn
acum nu ofer dect soluii aproximative fr a putea spune ct de aproape sau de departe este soluia
optim de orar).
Ci dintre programatorii nceptori n-ar fi surprini s afle c problema att de simpl (ca
enun), a crei soluionare tocmai au abandonat-o, este de fapt o problem dovedit teoretic ca fiind
intratabil sau chiar insolvabil algoritmic? Partea proast a lucrurilor este c problemele netratabile pot
fi cu uurin confundate cu unele uoare la o privire rapid i lipsit de experien.
Etapa de analiz este singura care permite dovedirea cu argumente riguroase a corectitudinii
soluiei, iar etapa de proiectare este singura care poate oferi argumente precise n favoarea eficienei
soluiei propuse.
n general problemele concrete din informatic au n forma lor iniial sau n enun o caracteristic
pragmatic, fiind foarte ancorate n realitatea imediat. Totui ele conin n formularea lor iniial un grad
mare de eterogenitate, diversitate i lips de rigoare. Fiecare dintre aceste defecte este un obstacol
major pentru demonstrarea corectitudinii soluiei. Rolul esenial al etapei de analiz este acela de a
transfera problema ntr-un plan abstract, adic de a o modela. Acest univers paralel abstract este dotat
cu mai mult rigoare i disciplin intern, avnd legi precise, i poate oferi instrumentele logice i formale
necesare pentru demonstrarea riguroas a corectitudinii soluiei problemei. Planul abstract n care sunt
transportate toate problemele de informatic este planul sau universul obiectelor matematice iar
corespondentul problemei n acest plan va fi modelul matematic abstract asociat problemei.
Demonstrarea corectitudinii proprietilor ce leag obiectele universului matematic a fost i este sarcina
matematicienilor. Celui ce analizeaz problema din punct de vedere informatic i revine sarcina (nu
tocmai uoar) de a dovedi printr-o demonstraie constructiv c exist o coresponden precis ntre

prile componente ale problemei reale, dezasamblat n timpul analizei, i prile componente ale
modelului abstract asociat. Odat descoperit, formulat precis i dovedit, aceast perfect oglindire
a problemei reale n planul obiectelor matematice ofer certitudinea c toate proprietile i legturile ce
exist ntre subansamblele modelului abstract se vor regsii precis (prin reflectare) ntre prile interne
ale problemei reale, i invers. Atunci, soluiei abstracte descoperite cu ajutorul modelului matematic
abstract i va corespunde o soluie real concretizat printr-un algoritm ce poate fi implementat ntr-un
program executabil.
Ideea central a etapei a doua proiectarea unui algoritm de soluionare eficient poate fi formulat
astfel: din studiul proprietilor i limitelor modelului matematic abstract asociat problemei se deduc
limitele inferioare ale complexitii minimale (efortului minimal obligatoriu) inerente oricrui
algoritm ce va soluiona problema n cauz. Complexitatea intern a modelului abstract i complexitatea
soluiei abstracte se va reflecta imediat asupra complexitii reale a algoritmului, adic asupra eficienei
de soluionare a problemei. Acest fapt permite prognosticarea nc din aceast faz faza de proiectare
a algoritmului de soluionare a eficienei practice, msurabil ca durat de execuie, a programului.

Algoritmul
Se tie c la baza oricrui program st un algoritm (care, uneori, este numit metod de rezolvare).
Noiunea de algoritm este o noiune fundamental n informatic i nelegerea ei, alturi de nelegerea
modului de funcionare a unui calculator, permite nelegerea noiunii de program executabil. Vom oferi
n continuare o definiie unanim acceptat pentru noiunea de algoritm:
Definiie. Prin algoritm se nelege o mulime finit de operaii (instruciuni) elementare care executate ntr-o
ordine bine stabilit (determinat), pornind de la un set de date de intrare dintr-un domeniu de valori posibile
(valide), produce n timp finit un set de date de ieire (rezultate).

Cele trei caracteristici eseniale ale unui algoritm sunt:


Determinismul dat de faptul c ordinea de execuie a instruciunilor algoritmului este bine precizat
(strict determinat). Acest fapt d una din calitile de baz a calculatorului: el va face ntotdeauna
ceea ce i s-a cerut (prin program) s fac, el nu va avea iniiative sau opiuni proprii, el nu-i
permite s greeasc nici mcar odat, el nu se va plictisi ci va duce programul la acelai sfrit
indiferent de cte ori i se va cere s repete acest lucru. Nu aceeai situaie se ntmpl cu fiinele umane
(Errare humanum est). Oamenii pot avea n situaii determinate un comportament non-deterministic
(surprinztor). Acesta este motivul pentru care numeroi utilizatori de calculatoare (de exemplu
contabilii), datorit fenomenului de personificare a calculatorului (confundarea aciunilor i dialogului

simulat de programul ce ruleaz pe calculator cu reaciile unei personaliti vii), nu recunosc


perfectul determinism ce st la baza executrii oricrui program pe calculator.
Universalitatea dat de faptul c, privind algoritmul ca pe o metod automat (mecanic) de
rezolvare, aceast metod are un caracter general-universal. Algoritmul nu ofer o soluie punctual,
pentru un singur set de date de intrare, ci ofer soluie pentru o mulime foarte larg (de cele mai multe
ori infinit) de date de intrare valide. Aceasta este trstura de baz care explic deosebita utilitate a
calculatoarelor i datorit acestei trsturi suntem siguri c investiia financiar fcut prin cumprarea
unui calculator i a produsului software necesar va putea fi cu siguran amortizat. Cheltuiala se face
o singur dat n timp ce programul pe calculator va putea fi executat rapid i economicos de un numr
orict de mare de ori, pe date diferite!
De exemplu, algoritmul de rezolvare nvat la liceu a ecuaiilor de gradul doi: ax2+bx+c=0, se aplic
cu succes pentru o mulime infinit de date de intrare: (a,b,c)\{0}xx.
Finitudinea pentru fiecare intrare valid orice algoritm trebuie s conduc n timp finit (dup un
numr finit de pai) la un rezultat. Aceast caracteristic este analog proprietii de convergen a
unor metode din matematic: trebuie s avem garania, dinainte de a aplica metoda (algoritmul), c
metoda se termin cu succes (ea converge ctre soluie).
S observm i diferena: n timp ce metoda matematic este corect chiar dac ea converge ctre
soluie doar la infinit (!), un algoritm trebuie s ntoarc rezultatul dup un numr finit de pai. S
observm de asemenea c, acolo unde matematica nu ofer dovada, algoritmul nu va fi capabil s o
ofere nici el. De exemplu, nu este greu de scris un algoritm care s verifice corectitudinea afirmaiei
Conjecturii lui Goldbach: Orice numr par se scrie ca sum de dou numere prime, dar, dei
programul rezultat poate fi lsat s ruleze pn la valori extrem de mari, fr s apar nici un contraexemplu, totui conjectura nu poate fi astfel infirmat (dar nici afirmat!).

Descrierea algoritmilor
Dou dintre metodele clasice de descriere a algoritmilor sunt Schemele logice i Pseudo-Codul.
Ambele metode de descriere conin doar patru operaii (instruciuni) elementare care au fiecare un
corespondent att schem logic ct i n pseudo-cod.
n cele ce urmeaz vom descrie doar varianta oferit de pseudo-cod deoarece folosirea schemelor
logice s-a redus drastic n ultimii ani. Schemele logice mai pot fi ntlnite sub numele de diagrame de
proces n anumite cri de specialitate inginereti. Avantajul descrierii algoritmilor prin scheme logice
este dat de libertatea total de nlnuire a operaiilor (practic, sgeata care descrie ordinea de execuie,

pleac de la o operaie i poate fi trasat nspre orice alt operaie). Este demonstrat matematic riguros
c descrierea prin pseudo-cod, dei pare mult mai restrictiv (operaiile nu pot fi nlnuite oricum, ci
trebuie executate n ordinea citirii: de sus n jos i de la stnga la dreapta), este totui perfect echivalent.
Deci, este dovedit c plusul de ordine, rigoare i simplitate pe care l ofer descrierea prin pseudo-cod nu
ngrdete prin nimic libertatea programrii. Totui, programele scrise n limbajele de asamblare, care
sunt mult mai compacte i au dimensiunile mult reduse, nu ar putea fi descrise altfel dect prin scheme
logice.
1. Atribuirea
var:=expresie;
2. Intrare/Ieire
Citete var1, var2, var3, ;
Scrie var1, var2, var3, ; sau Scrie expresia1, expresia2, expresia3,;
3. Condiionala
Dac <condiie_logic> atunci instruciune1 [altfel instruciune2];
4. Ciclurile Exist (din motive de uurin a descrierii algoritmilor) trei tipuri de instruciuni de
ciclare. Ele sunt echivalente ntre ele, oricare variant de descriere putnd fi folosit n locul celorlalte
dou, cu modificri sau adugiri minimale:
repet instruciune1, instruciune2, pn cnd <condiie_logic>;
ct timp <condiie_logic> execut instruciune;
pentru var_contor:=val_iniial pn la val_final execut instruciune;
n cazul ciclurilor, grupul instruciunilor ce se repet se numete corpul ciclului iar condiia logic
care permite sau nu reluarea execuiei ciclului este denumit condiia de ciclare. Observm c ciclul de
tipul Repet are condiia de repetare la sfrit ceea ce are ca i consecin faptul c, corpul ciclului se
execut cel puin odat, n mod obligatoriu, nainte de verificarea condiiei logice. Nu acelai lucru se
ntmpl n cazul ciclului de tipul ct timp, cnd este posibil ca instruciunea compus din corpul ciclului
s nu poat fi executat nici mcar odat. n plus, s mai observm c ciclul de tipul Pentru pn la
conine (n mod ascuns) o instruciune de incrementare a variabilei contor.
Limbajele de programare care sunt relativ apropiate de limbajele naturale sunt denumite limbaje
de nivel nalt (high-level), de exemplu limbajul Pascal, spre deosebire de limbajele de programare mai
apropiate de codurile numerice ale instruciunilor microprocesorului. Acestea din urm se numesc
limbaje de nivel sczut (low-level), de exemplu limbajul de asamblare. Limbajul de programare C are un
statut mai special el putnd fi privit, datorit structurii sale, ca fcnd parte din ambele categorii.

Peste tot unde n pseudo-cod apare cuvntul instruciune el poate fi nlocuit cu oricare din cele
patru instruciuni elementare. Aceast substituire poart numele de imbricare. Prin instruciune se va
nelege atunci, fie o singur instruciune simpl (una din cele patru), fie o instruciune compus.
Instruciunea compus este format dintr-un grup de instruciuni delimitate i grupate n mod precis (ntre
acolade { } n C).
Spre deosebire de pseudo-cod care permite doar structurile noi formate prin imbricarea repetat
a celor patru instruciuni n modul precizat, schemele logice permit structurarea n orice succesiune a
celor patru instruciuni elementare, ordinea lor de execuie fiind dat de sensul sgeilor. Repetm c
dei, aparent, pseudo-codul limiteaz libertatea de descriere doar la structurile prezentate, o teorem
fundamental pentru programare afirm c puterea de descriere a pseudo-limbajului este aceeai cu cea
a schemelor logice.
Forma de programare care se bazeaz doar pe cele patru structuri se numete programare
structurat (spre deosebire de programarea nestructurat bazat pe descrierea prin scheme logice).
Teorema de echivalen a puterii de descriere prin pseudo-cod cu puterea de descriere prin schem
logic afirm c programarea structurat (aparent limitat de cele patru structuri) este echivalent cu
programarea nestructurat (liber de structuri impuse). Evident, prin ordinea, lizibilitatea i fiabilitatea
oferit de cele patru structuri elementare (i asta fr a ngrdi libertatea de exprimare) programarea
structurat este net avantajoas. n fapt, limbajele de programare nestructurat (Fortran, Basic) au fost
de mult scoase din uz, ele (limbajele de asamblare) sunt necesare a fi folosite n continuare doar n
programarea de sistem i n programarea industrial (n automatizri).

Programul
Prin program se nelege un ir de instruciuni-main care sunt rezultatul compilrii algoritmului
proiectat spre rezolvarea problemei dorite ce a fost descris ntr-un limbaj de programare (ca i cod surs).
Etapele realizrii unui program sunt:
editarea codului surs, etap ce se realizeaz cu ajutorul unui program editor de texte rezultatul fiind
un fiier C, cu extensia .c (.cpp);
compilarea, etapa de traducere din limbajul de programare C n limbajul intern al micro-procesorului,
i este realizat cu ajutorul programului compilator C i are ca rezultat un fiier obiect, cu extensia
.obj (n limbajul C) sau .exe (n limbajul Pascal);
link-editarea, etap la care se adaug modului obiect rezultat la compilare diferite module coninnd
subprograme i rutine de bibliotec, rezultnd un fiier executabil (aceast etap este comasat n
Turbo Pascal sau Borland Pascal cu etapa de compilare), cu extensia .exe

execuia (Run), etapa de lansare n execuie propriu-zis a programului obinut, lansare realizat de
interpretorul de comenzi al sistemului de operare (command.com pentru sistemele DOS+Windows)
Observm c aceste etape sunt complet independente n timp unele de altele i necesit pentru
limbajul C utilizarea a patru programe ajuttoare: editor de texte, compilator C, link-editor i
interpretorul de comenzi al sistemului de operare. n cazul mediilor de programare integrate (Borland)
comandarea acestor patru programe ajuttoare precum i depanarea erorilor de execuie este mult
facilitat.
OBSERVAIE: Link-editarea reprezint asamblarea unor module precompilate pentru a rezulta un fiier
executabil. De exemplu, dac avem mai multe module de program (s zicem diverse funcii) le putem
compila pe fiecare n mod separat i n felul acesta putem observa i erorile mai uor iar la sfrit le
linkeditm i va rezulta programul. Fiierele precompilate (pe care le vom link-edita) au avantajul c se
pot folosi la diferite proiecte pstrnd de exemplu o oarecare paternitate asupra lor, va fi foarte dificil
ca cineva s obin codul surs i s-l poat modifica fr s depun un efort considerabil. Deci va putea
utiliza funciile dar e destul de dificil s modifici sau s copiezi ntr-un program personal doar cteva din
aceste funcii. E mai uoar i depanarea programului pe module.
De asemenea, merit subliniat faptul c n timp ce fiierul text C, ce conine codul surs, poate fi
transportat pe orice main (calculator) indiferent de micro-procesorul acesteia urmnd a fi compilat la
faa locului, n cazul fiierului obiect acesta nu mai poate fi folosit dect pe maina (calculatorul) pentru
care a fost creat (datorit instruciunilor specifice micro-procesorului din care este compus). Deci, pe
calculatoare diferite (avnd micro-procesoare diferite) vom avea nevoie de compilatoare C diferite.
n plus, s remarcm faptul c fiierele obiect rezultate n urma compilrii pot fi link-editate
mpreun, chiar dac provin din limbaje de programare diferite. Astfel, un program rezultat (un fiier
.exe sau .com) poate fi compus din module obiect care provin din surse diferite (fiiere Pascal, C,
asamblare, etc.).

2. Introducere n limbajul C noiuni de baz


Toate elementele care compun un limbaj de programare, aa cum este i limbajul C nu sunt de
sine stttoare, ci n conjuncie unul cu cellalt. Din acest motiv este important s fie nelese aspectele
fundamentale ale limbajului, nainte ca ele s fie detaliate.
Toate aplicaiile realizate prin intermediul limbajului C au anumite trsturi comune. Programele
conin cel puin o funcie, fiecare incluznd una sau mai multe instruciuni. O funcie poate fi definit ca
fiind o subrutin care poate fi apelat de diferite pri ale unei aplicaii. O instruciune se refer la o
aciune care trebuie s fie executat de un program. Toate instruciunile scrise ntr-un program trebuie s
aparin unei funcii i se termin obligatoriu cu caracterul ;.
Cea mai simpl form a unei funcii este urmtoarea:
nume_funcie()
{
instruciuni;
}

unde nume_funcie reprezint numele unei funcii, iar instruciuni reprezint secvena de instruciuni (una
sau mai multe) care aparine funciei declarate.
n ceea ce privete numele funciei (i nu numai) trebuie spus c limbajul C este de tip CASESENSITIVE, ceea ce presupune ca programatorul s aib n vedere faptul c, compilatorul C face
deosebire ntre litere mari i litere mici.
Orice program n limbajul C conine cel puin o funcie: funcia main(). Execuia fiecrui program
ncepe cu funcia main(), ceea ce nseamn c dac programatorul omite scrierea acestei funcii,
compilatorul va fi n imposibilitatea compilrii programului editat. Astfel, atunci cnd se execut un
program, primele instruciuni executate sunt cele care fac parte din funcia main. Dac programul conine
mai multe funcii, numele acestora va fi definit de utilizator.
Toate programele scrise n limbajul C sunt memorate ntr-un fiier sau mai multe, acestea avnd
extensia .c. Un fiier care conine un program scris n C sau care conine numai o parte a acestuia
se numete fiier surs.
Prin compilarea fiierului surs rezult un fiier obiect, care are extensia .obj. Fiierele surs
care intr n compunerea unui program pot fi compilate mpreun sau separat. n urma unei compilrii
rezult un fiier obiect; fiierele obiect aferente aplicaiei pot fi reunite ntr-un program executabil prin
link-editare. n urma link-editrii rezult un fiier executabil, cu extensia .exe.

Un nume este o succesiune de litere i eventual cifre, primul caracter fiind liter. Pot fi utilizate
litere mici i litere mari precum i caracterul subliniere (_).
Exist un numr de cuvinte mprumutate din limba englez care au o semnificaie predefinit.
Utilizatorul nu poate da o alt utilizare acestora i de aceea se mai numesc cuvinte cheie. Acestea se scriu
mereu cu litere mici i reprezint nume cu destinaii speciale (for, if, while, break, exit, etc.).
Atomi lexicali
Ca i alte limbaje, C are un alfabet i reguli pentru scrierea programelor corecte folosind semne
de punctuaie. Aceste reguli formeaz sintaxa limbajului C. Compilatorul C are rolul de a testa dac un
program editat este corect. Dac sunt erori, atunci va afia o list de mesaje de eroare i se va opri. Iniial,
compilatorul mparte mulimea caracterelor (programul surs) n atomi lexicali, care reprezint
vocabularul de baz al limbajului. n ANSI C (ANSI = American National Standards Institute) sunt ase
tipuri de atomi lexicali (care se mai numesc i elemente lexicale sau uniti lexicale):
cuvinte rezervate;
identificatori;
constante;
iruri constante;
operatori;
semne de punctuaie.
Caractere i atomi lexicali
Un program C este o secven de caractere; caracterele permise n programele C sunt:
literele mici i literele mari ale alfabetului: a b ... z, A, B, , Z
cifre : 0 1 ... 9
alte caractere: * / = ( ) { } [ ] < > ' " ! @ # $ % & _ | ^ ~ \ . , ; : ?
spaii: blank, newline i tab
Identificatori
Un identificator este un atom lexical compus dintr-o secven de litere, cifre sau caracterul
underscore ("_") cu restricia c primul caracter este o liter sau underscore. n multe implementri C, se
face distincie ntre litere mici i mari. n general, se obinuiete ca identificatorii s fie scrii cu nume
sugestive care s uureze citirea i documentarea programului.

Exemple:
1. k, _id, contor, un_identificator sunt identificatori;
2. gresit#unu, 100_gresit_doi, -plus nu sunt identificatori.

Comentarii n C
Comentariile sunt iruri de caractere cuprinse ntre /* i */. Comentariile nu reprezint atomi
lexicali. Practic, compilatorul va traduce comentariile ntr-un singur caracter spatiu, de aceea
comentariile nu fac parte din codul executabil.
Avantajele folosirii comentariilor:
uurarea documentrii ulterioare; scopul documentrii este explicarea clar a folosirii
programelor;
un comentariu poate conine informaii care argumenteaz demonstraia corectitudinii unui
algoritm;

comentariile sunt foarte bine venite a fi scrise odat cu textul programului.


Tipuri de date de baz
Mulimea tipurilor de date predefinite constituie o caracteristic important i un argument n

alegerea unui limbaj sau altul pentru rezolvarea unei probleme. n limbajul C exist o serie de tipuri
simple de date predefinite (tabelul 2.1), a cror lungime poate s difere de la un calculator la altul i de
la o implementare la alta.
Un tip de date descrie un set de date (care se mai numesc i obiecte) care au aceeai reprezentare.
De asemenea, exist un numr de operaii asociat unui tip de date (spre exemplu, cu tipul ntreg se
asociaz cele patru operaii aritmetice i eventual i altele).
Pentru fiecare tip predefinit din limbajul C exist cuvinte rezervate, care reprezint modificatori
de tip: unsigned, signed, long i short pentru tipul int; signed i unsigned pentru tipul char; long pentru
tipul double. Cuvintele rezervate dintre parantezele ptrate sunt opionale i diferitele combinaii
definesc acelai tip de dat.
Tipurile de date specifice limbajului C sunt prezentate n tabelul 2.1.
De asemenea, o component important a unui program C o reprezint biblioteca funciilor C (a
funciilor executate de un program) care pot realiza:
operaii de intrare/ieire,
operaii matematice,
operaii cu iruri, etc.
Printre cele mai des folosite funcii din C se numr funcia printf, care este principala funcie de
ieire aferent limbajului C, i este redat sub urmtoarea form:
printf(sir de caractere);

Pentru exemplul prezentat, pe ecran se va afia irul de caractere inclus ntre ghilimele.

Tabelul 2.1 Principalele tipuri de date n limbajul C


Tip

Nr.octei

Interval de valori
[-2147483648 2147483647]
(-231 231-1)
[-32768 32767]
(-215 215-1)

int

short int

long int

(-231 231-1) / (-215 215-1)

unsigned int

[0 2147483647] (0-231 1)

[signed]
char

[-128 127] (-27 27-1)

unsigned
char

[0 255] (28-1)

Float

[3,4*10-38 3,4*1038]

double

[1,7*10-308 1,7*10308]

long double

12

[3,4*10-4932 1,1*104932]

Semnificaie
conine numere ntregi cu semn,
reprezentate binar pe 4 octei
conine numere ntregi cu semn,
reprezentate binar pe 2octei
conine numere ntregi cu semn,
reprezentate binar pe 8 octei
se folosete pentru a crea ntregi fr
semn. Diferena dintre ntreg cu semn i
fr semn const n modul n care
compilatorul interpreteaz bitul de semn.
Dac bitul de semn este 0, numrul este
pozitiv, i dac bitul de semn este 1,
numrul este negativ. De cele mai multe
ori, numerele negative se reprezint n
complement fa de doi. Dac un ntreg
este declarat cu unsigned, cnd bitul de
semn este 1, numrul devine 231-1
sunt
caractere,
adic
simboluri
tipografice elementare: litere, cifre,
semne
de
punctuaie,
simboluri
matematice, etc;
caracter fr semn
zecimal n virgul flotant simpl
precizie conin numere reprezentate n
virgul flotant (pot avea partea
fracionar)
zecimal n virgul flotant dubl precizie
conin numere reprezentate n virgul
flotant (pot avea partea fracionar)
Reprezentare flotant n dubl precizie

Fiecare program scris n limbajul C poate fi prelucrat naintea procesului de compilare prin
intermediul preprocesrii, care este un proces automat realizat de compilator naintea compilrii
programului surs. Rolul preprocesrii este de a include diferite fiiere cu texte surs, definiii i apeluri
de macrouri sau de a realiza compilarea condiionat.
Astfel, o alt component important care caracterizeaz majoritatea programelor C sunt fiierele
header. Toate informaiile aferente funciilor din biblioteca standard se afl n fiiere care sunt transmise
mpreun cu compilatorul, aceste fiiere recunoscndu-se prin intermediul extensiei: .h. Informaiile din
aceste fiiere sunt folosite de compilator pentru lucrul cu funciile din bibliotec. Toate fiierele necesare
se adaug prin intermediul directivei preprocesor #include, care are rolul de a determina compilatorul
s citeasc un alt fiier i s-l includ n program.

Preprocesarea presupune prelucrarea informaiilor specifice care sunt precedate de caracterul diez
(#). Astfel, un fiier cu text surs poate fi inclus n cadrul programului curent prin intermediul construciei
#include, folosind unul din formatele:
Un fiier cu text surs poate fi inclus cu ajutorul construciei #include. Aceast construcie are
formatul:
#include specificator_fiier sau

#include<specificator_fiier>

unde specificator_fiier (care depinde de sistemul de operare) definete un fiier cu text surs pstrat pe
disc. n faza de preprocesare, textul fiierului respectiv se substituie construciei #include. Astfel, textul
fiierului respectiv ia parte la compilare mpreun cu textul n care a fost inclus.
n cazul sistemului de operare DOS, specificatorul de fiier trebuie s fie un nume de fiier
mpreun cu extensia lui (.C pentru compilatorul C, .H pentru fiiere de tip header fiiere cu
prototipuri, etc.). De asemenea, n afar de numele i extensia fiierului, specificatorul de fiier poate
conine i o cale dac este necesar, pentru localizarea fiierului.
Diferena dintre cele dou formate const n modul de cutare al fiierului de inclus:
formatul cu paranteze unghiulare <> se folosete la includerea fiierelor standard, cum sunt cele
care conin prototipuri pentru funcii din bibliotec;
n cazul n care se folosete formatul cu ghilimele, fiierul este cutat n directorul curent sau conform
cii dac aceasta este prezent.
Spre exemplu, pentru a include fiierul surs stdio.h care conine prototipul funciilor de
intrare/ieire se va folosi construcia: #include <stdio.h>. Dac se folosete construcia #include
un_fisier.c, atunci compilatorul va include fiierul un_fisier din cadrul directorului curent. De
asemenea, pentru a include n program fiierul un_fisier care se gsete n folderul Aplicaii, n directorul
C, se va folosi construcia: #include c:\\Aplicatii\\un_fisier.c. n cadrul ultimului exemplu prezentat,
se oberv c pentru a descrie calea, caracterul backslash se dubleaz n concordan cu convenia de
reprezentare a caracterului backslash ntr-un ir de caractare.
Un fiier standard care se include frecvent este stdio.h; acesta conine prototipurile pentru o serie
de funcii ce realizeaz operaii de intrare/ieire.
Construciile #include se scriu de obicei la nceputul fiierelor surs, pentru ca textele inserate s
fie valabile n tot fiierul surs care se compileaz.
Pentru a putea folosi ntr-un program funcia printf(), este necesar includerea directivei
#include<stdio.h> deoarece, aa cum spuneam anterior, aceast directiv conine informaii cu privire la
aceast funcie de ieire. Directivele incluse n program nu se finalizeaz cu caracterul ;, deoarece nu
reprezint un cuvnt cheie al programului, ci o instruciune ctre compilatorul C.

Cel mai simplu program scris n limbajul C este urmtorul:


Exemplu:
#include <stdio.h>
main()
{
printf("Primul program in limbajul C !!!");
getch();
}

care va afia pe suprafaa ecranului mesajul: Primul program in limbajul C !!!.


Observaie: getch() este o funcie de ieire fr ecou (caracterul tiprit nu este afiat pe ecran) asupra
creia se va reveni n cursul aferent funciilor de intrare/ieire; este folosit de mediul Dev-C++ pentru
a pstra pe ecran (pn la apsarea unei taste) rezultatul programului compilat.
Practic, n acest program banal sunt incluse toate aspectele comune i obligatorii aferente unui
program scris n C. Prima linie permite includerea n program a fiierului stdio.h. pentru a fi citit de
compilator. nceputul funciei principale este desemnat de a doua linie, main(). Corpul tuturor funciilor
n C (deci, i a funciei main) este inclus ntre dou paranteze acolad; tot ce este scris n interiorul acestor
paranteze acolade constituie corpul funciei. n cazul programului prezentat anterior, corpul funciei
main() este format dintr-o singur instruciune, care apeleaz funcia printf() din biblioteca standard
pentru a permite afiarea pe ecran a irului dorit. Atunci cnd corpul unei funcii este format din mai
multe instruciuni, parcurgerea acestora se va face secvenial.
Constante i variabile n limbajul C
O constant n limbajul C are un tip i o valoarea. Att tipul ct i valoarea sunt determinate de
caracterele care intr n compunerea constantei. Valoarea unei constante nu poate fi schimbat n timpul
execuiei programului n care a fost utilizat. Exist mai multe tipuri de constante:
ntregi sunt constante care pot fi scrise n sistemul de numeraie n baza 8, 10 sau 16. O constant
zecimal ntreag este un ir de cifre zecimale care are prima cifr diferit de zero. Constantele octale
reprezint succesiuni de cifre octale (0-7) precedate de un zero nesemnificativ. O constant hexazecimal
este o succesiune de cifre hexazecimale precedate de 0x sau 0X.
Ex: 15150 care se reprezint binar prin: 00000000 00000000 00111011 00101110
flotante reprezint un numr raional i se compune din:
o parte ntreag care poate fi i vid este o constant zecimal;
o parte fracionar care poate fi i vid se compune din caracterul punct dup care urmeaz o
succesiune de cifre zecimale;

un exponent care poate fi i vid ncepe cu litera e sau E, dup care urmeaz un semn opional
(plus sau minus) i un ir de cifre zecimale. Exponentul definete un factor care exprim o putere
a lui 10.
Ex:

100. 100

100.48 100,48

.48 0,48

12e5 12*105

.5E-5 0,5*10-5

15.255e2 15,255*102

1500.123e-3 1500,123*10-3

caracter o constant caracter are ca valoare codul ASCII al caracterului pe care-l reprezint i are
tipul int. O constant caracter corespunztoare unui caracter imprimabil se reprezint prin caracterul
respectiv inclus ntre caractere apostrof:

A valoarea 65

a valoarea 97

* valoarea 42

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