Sunteți pe pagina 1din 8

Capitolul 2

NOIUNI DE BAZ PENTRU SCRIEREA


PROGRAMELOR N LIMBAJUL C
Scrierea programelor cu ajutorului limbajului C necesit cunoaterea sintaxei i
semanticii limbajului, a notaiilor i vocabularului cu care acesta opereaz, a
modului de structurare a instruciunilor dar i a principalelor etape ce trebuie
parcurse pn la obinerea produsului program final.

2.1

Etape de creare a programelor n limbajul C

Crearea unui program cu ajutorul limbajului C se realizeaz prin parcurgerea a


cel puin patru etape principale:
scrierea programului surs (editarea) se realizeaz, de obicei, cu ajutorul
unor programe de sistem (utilitare) specializate, numite generic editoare.
Acestea ajut programatorul, oferind faciliti de copiere, inserare,
tergere a unor caractere sau grupuri de linii de text, salvare a textului
scris pe suport magnetic sub form de fiier etc. Numele fiierului poate fi
stabilit de ctre programator, extensia folosit fiind de cele mai multe ori
.C, pentru a sugera natura informaiilor coninute;
compilare se realizeaz cu ajutorul altui program de sistem (utilitar),
numit compilator. Acesta verific programul surs pentru a depista
eventualele erori legate de folosirea sintaxei limbajului. Erorile sunt
semnalate utilizatorului prin mesaje adecvate i trebuie corectate prin
revenire la etapa de editare. Dac fiierul surs nu conine erori de sintax,
compilatorul traduce coninutul pe nelesul hardware-ului, crend un
nou fiier, numit program obiect. Numele de obiect este preluat din
limba englez (object) i se asociaz cu extensia .OBJ a fiierului (n
sisteme de tip Windows);
editare de legturi (link-editare) se realizeaz tot cu ajutorul unui
program de sistem (utilitar), numit editor de legturi sau link-editor care
adaug programului obiect module din biblioteca asociat limbajului
(detalii n Partea a II-a) sau alte module obiect, n cazul unei aplicaii
software formate din mai multe fiiere (detalii n Partea a II-a). Erorile
depistate n aceast etap pot impune revenirea la etapa de compilare sau
chiar la etapa de editare. Rezultatul etapei de editare de legturi este
fiierul executabil, cu extensie .EXE (n sisteme de tip Windows, de
exemplu);
16

lansare n execuie programul executabil este adus n memorie i lansat


n execuie. Se realizeaz citirea datelor de intrare, prelucrarea
informaiilor i afiarea sau transmiterea rezultatelor (datelor de ieire)
exact n forma precizat iniial n programul surs. Se verific, pe baza
unor seturi de date prestabilite, corectitudinea rezultatelor. Dac apar
erori, acestea in de logica programului: fie nu a fost gndit corect, fie a
fost scris eronat. n acest caz, se revine la etapa de editare. Etapa de
execuie poate fi repetat de cte ori este necesar.

1. EDITARE
- se folosete un program utilitar: EDITOR
- se creeaz programul surs: Exemplu.C

2. COMPILARE
- se folosete un program utilitar: COMPILATOR
(traduce sursa pe nelesul hardware-ului)
- se creeaz programul obiect: Exemplu.OBJ
Erori de folosire a
limbajului sau de scriere:
MESAJE (numr, text)

3. EDITARE DE LEGTURI
- se folosete un program utilitar: EDITOR DE
LEGTURI (LINK EDITOR engl.), care adaug
programului obiect module din biblioteca asociat
limbajului sau alte module obiect
- se creeaz programul executabil: Exemplu. EXE
Erori de definire funcii, specificare
module de bibliotec etc: MESAJE

4. LANSARE N EXECUIE
- se citesc datele
- se efectueaz calculele
- se afieaz rezultatele
Erori de logic: REZULTATE INCORECTE

17

Observaii: Revenirea la etapa de editare pentru corectarea unor erori presupune


ca, dup salvarea modificrilor n noua versiune a fiierului surs, s se parcurg
secvenial toate celelalte etape schiate n figura anterioar pentru a fi creat astfel
un nou fiier executabil, care s conin schimbrile efectuate.
n cazul programelor scrise cu ajutorul limbajului C, etapa de compilare conine
i o sub-etap preliminar, numit preprocesare. Aceasta se realizeaz automat,
naintea compilrii propriu-zise, i va fi explicat, pe scurt, n cadrul seciunii
2.3 i detaliat, n cadrul celei de-a II-a pri a acestei serii de volume.

2.2

Notaii i vocabular n limbajul C

Vocabularul limbajului C este format din simboluri de baz, clasificate n trei


mari categorii:
- literele alfabetului englez;
- cifrele arabe: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
- simboluri speciale (operatori i delimitatori): . ; , : ? ' ( ) [ ] { } < > ! |
\/~_#%&^+-*=

Tot n categoria simbolurilor speciale se ncadreaz i cuvintele rezervate,


numite i cuvinte-cheie (keywords engl.), care au un neles bine stabilit i nu
pot fi folosite de ctre programator dect n contextul permis explicit de sintaxa
limbajului C. Lista cuvintelor-cheie conforme standardului ANSI C este:
asm
auto
break
case
char
const

continue
default
do
double
else
enum

extern
float
for
goto
if
int

long
register
return
short
signed
sizeof

static
struct
switch
typedef
union
unsigned

void
volatile
while

Scrierea unui program cu ajutorul limbajului C este similar scrierii de fraze n


limbaj natural: se folosesc combinaii de cuvinte i separatori.
Cuvintele limbajului C pot fi:
-

simboluri speciale;

identificatori obinuii sau predefinii;

constante (numr, caracter sau ir de caractere).

Separatorii se ncadreaz, n general, n una dintre urmtoarele categorii:


- spaiu;
- comentariu;
- sfrit de linie.
Toate aceste elemente vor fi prezentate n cele ce urmeaz n contextul utilizrii
lor pentru scrierea de programe. Dintre ele, vor fi definite deocamdat doar cele
strict necesare pentru nelegerea primelor noiuni de sintax a limbajului.
18

Identificatorii reprezint modalitatea de denumire a constantelor, tipurilor de


date, variabilelor i funciilor. Constantele reprezint date a cror valoare nu se
modific pe tot parcursul execuiei programului. Prin contrast, variabilele
reprezint date a cror valoare trebuie i poate fi modificat n program.
Noiunile de tip de date i funcie vor fi explicate n cadrul capitolelor 3 i,
respectiv, 6.
Un identificator este un nume simbolic care ncepe cu o liter sau cu caracterul
de subliniere ( _ ), ce poate fi urmat/urmat de niciuna sau mai multe litere, cifre
zecimale i/sau caracterul de subliniere. Limbajul C este un limbaj de
programare case-sensitive (engl.), sesiznd diferena existent ntre litere mari i
litere mici n cazul identificatorilor. De aceea, suma i Suma vor fi considerai
identificatori distinci, la fel ca i b13, respectiv B13 sau _azi i _AZI.
Identificatorii obinuii sunt nume scrise de ctre programator, alese astfel
nct s sugereze ct mai bine rolul entitii pe care o reprezint n cadrul
programului. Identificatorii predefinii sunt nume cunoscute de ctre
compilator (de exemplu, numele unor funcii de bibliotec), cu semnificaie bine
stabilit i care, de obicei, sunt folosii de ctre programator i nu definii sau
redefinii de ctre acesta. Lungimea maxim a unui identificator (numrul
maxim de caractere) depinde de compilator, dar poate fi, n general, de cel puin
31 de caractere.
Constantele folosite n scrierea programelor C pot fi clasificate astfel:
constant numeric scris ca o secven de cifre, cu sau fr semn (n
cazul valorilor de tip ntreg), la care se adaug punctul zecimal n rol de
virgul (n cazul valorilor de tip real). De exemplu: -328 sau +14372 sau
-27.135. Alte detalii vor fi prezentate n seciunile 3.3.3 i 3.3.4;
constant caracter scris ca un caracter ncadrat ntre caractere apostrof.
De exemplu: 'g' sau '5' sau 'p'. Alte detalii vor fi prezentate n seciunea
3.3.5;
constant ir de caractere scis ca o secven de caractere ncadrat ntre
caractere ghilimele. De exemplu: mesaj sau Bun ziua! . Alte detalii
vor fi prezentate n Partea a II-a.
Observaie: deoarece caracterele , ', \ i ? au un rol special n sintaxa limbajului
C, atunci cnd se dorete includerea lor n cadrul unei constante ir de caractere,
scrierea trebuie fcut astfel: \, \', \\ , \?. De exemplu:
Anii \'90 au favorizat dezvoltarea unor noi tehnologii
Citez: \Munca l nnobileaz pe om\.

n cadrul limbajului C, spaiul (blank engl.), sfritul de linie si comentariul


sunt considerate separatori. ntre oricare dou simboluri C consecutive este
permis apariia unui numr arbitrar de separatori, cu urmtoarea excepie: este
19

interzis apariia separatorilor n cadrul identificatorilor, constantelor numerice


sau simbolurilor speciale. Deoarece numrul separatorilor consecutivi este
arbitrar, limbajul C are un format liber, care permite alinierea frazelor din
program (indent-are) astfel nct s rezulte un text clar, uor de urmrit.
Un comentariu este o poriune de text cuprins ntre simbolurile speciale /* i */
care, dei face parte din programul surs, este ignorat complet de ctre
compilator, rolul su fiind doar de a uura nelegerea programului de ctre cel
care l citete. Un comentariu poate cuprinde informaii despre autorul
programului, despre coninutul unui grup de instruciuni, despre data la care a
fost creat sau modificat programul etc. Toate acestea constituie documentaia
programului surs, un element extrem de util pentru faza de ntreinere
(maintenance engl.) a produsului final.

2.3

Exemple simple de programe scrise n limbajul C

Pentru a nelege cteva dintre regulile generale ce trebuie respectate n scrierea


programelor cu ajutorul limbajului C, vom folosi mai nti exemplul clasic al
afirii unui mesaj pe ecranul sistemului de calcul:
#include <stdio.h>
int main ()
{ printf("Bun ziua!\n");
return 0;
}

Dac vor fi parcurse corect etapele de compilare i editare de legturi, lansarea


n execuie a programului va produce afiarea pe ecran a textului Bun ziua! i
trecerea pe urmtoarea linie (datorit utilizrii constantei caracter speciale '\n'
despre care vor fi prezentate detalii n seciunea 3.3.5).
Este important de reinut faptul c orice program C este compus din una sau mai
multe entiti numite funcii.
O funcie poate grupa mai multe instruciuni dedicate rezolvrii unei probleme
sau sub-probleme, ntr-o form specific, bazat pe reguli clar stabilite n sintaxa
limbajului. Aceste reguli vor fi prezentate n detaliu n cadrul capitolului 6.
Deocamdat este suficient s se precizeze c la scrierea unei funcii trebuie s se
stabileasc numele su, tipul rezultatului, informaiile cu care lucreaz (numite
parametri i cuprinse ntre paranteze rotunde) i instruciunile din care este
format (corpul funciei), cuprinse ntre simbolurile { i } (nceput i sfrit de
funcie) i ncheiate cu simbolul punct i virgul:
Tip_rezultat Nume_funcie (List_parametri)
{ Declaraii ;
Instruciuni ;
}

20

Funcia numit main() este o funcie special, care trebuie scris n orice
program C. n momentul lansrii n execuie a programului, sistemul de operare
transfer controlul acestei funcii, prima instruciune a funciei main() fiind
prima instruciune ce va fi executat. n funcie de compilatorul utilizat i de
modul de funcionare dorit pentru program, tipul rezultatului funciei main()
poate fi int, void sau poate lipsi, caz n care este considerat implicit ca fiind int.
Tipul void este interpretat ca orice tip sau nimic i poate fi folosit att pentru
specificarea tipului rezultatului unei funcii ct i pentru specificarea listei de
parametri, n cazul n care se dorete ca aceasta s fie vid (funcia nu are
parametri). Detalii suplimentare legate de acest subiect vor fi prezentate n
capitolele dedicate tipurilor de date, funciilor i pointerilor.
Dac tipul precizat pentru rezultatul unei funcii este altul dect void, funcia
trebuie s conin instruciunea return ce va fi explicat n cadrul capitolului 6.
n cele ce urmeaz, exemplele de program vor fi scrise n varianta:
void main (void) { ...... }

n exemplul de program prezentat anterior, pentru afiarea textului pe ecran se


folosete o funcie de bibliotec (nu creat de ctre programator!), numit
printf(). Pentru ca aceast funcie s fie recunoscut de ctre compilator, n
program a fost introdus nainte de main() linia de program: #include <stdio.h>.
Aceasta reprezint o directiv preprocesor, noiune ce va fi discutat n detaliu
n cadrul capitolului dedicat, din Partea a II-a. Pe scurt, se poate spune c
preprocesorul este un program utilitar ce examineaz programul surs nainte
de compilarea propriu-zis i, n cazul considerat, introduce n locul liniei unde
apare directiva coninutul unui fiier sau, n general, al entitii specificate dup
#include. Ulterior, compilatorul prelucreaz programul surs astfel modificat
(completat). n cazul exemplului ales, fiierul stdio.h este un fiier antet
(header engl.) care conine descrierea funciilor standard de citire/scriere (I/O),
numele su reprezentnd abrevierea denumirii STanDard Input Output (engl.).
Parantezele unghiulare folosite n directiv indic preprocesorului locul n care
se afl fiierul stdio.h pe discul magnetic: directorul standard, implementat ca
atare n compilator. Dup cum s-a menionat deja, mai multe detalii referitoare
la aceste aspecte vor fi prezentate n cadrul unui capitol din Partea a II-a. Rolul
includerii unor informaii succinte n aceast seciune este doar crearea unei
imagini de ansamblu, care s permit programatorului s scrie, n cunotin de
cauz, cu ajutorul limbajului C, primele programe simple.
Urmtorul exemplu de program ilustreaz stilul de lucru interactiv, concretizat
n preluarea informaiilor, respectiv producerea i transmiterea rezultatelor, pe
baza unei conversaii om-calculator. Programul permite introducerea de la
tastatur a dou valori numerice ntregi, calculnd i afind ulterior suma
acestora. Programul satisface cerina de generalitate (poate calcula suma oricror
21

dou numere ntregi) i include un comentariu care precizeaz scopul scrierii


sale.
/* program pentru calcularea sumei a dou valori numerice ntregi */
#include <stdio.h>
void main(void)
declaraie de variabile
{ int nr1, nr2, rezultat;
printf("Introducei cele 2 numere ce trebuie adunate:\n");
printf("Primul numr=");
citete o valoare de la tastatur
scanf("%d", &nr1);
printf("Al doilea numr=");
instruciune de atribuire
scanf("%d", &nr2);
rezultat = nr1 + nr2;
printf("Suma este: %d \n", rezultat); specificator de format
}

ir de control

Ca efect al lansrii n execuie a acestui program i ca urmare a afirii pe ecran,


n ecou, a celor dou valori numerice tastate de ctre utilizator, se vor vizualiza
urmtoarele informaii:
Introducei cele 2 numere ce trebuie adunate:
Primul numr=6
Al doilea numr=4
Suma este: 10

Elementele de sintax utilizate n cadrul exemplului precedent vor fi detaliate n


cadrul capitolelor urmtoare. Pentru moment ns, iat o scurt descriere a lor:
declaraia de variabile precizeaz entitile ce vor fi folosite n cadrul
programului, prin nume simbolic (identificator) i tip de date asociat. Pe
baza acestor informaii, compilatorul aloc spaiu de memorie pentru
fiecare variabil declarat. n exemplul prezentat, cu ajutorul cuvntului
cheie int se declar 3 variabile de tip ntreg, numite nr1, nr2 i rezultat;
instruciunea de atribuire umple spaiul de memorie alocat variabilei
rezultat cu valoarea calculat efectiv a expresiei nr1+nr2;
specificator de format specific tipul de dat citit/afiat cu ajutorul
funciilor din biblioteca standard descris prin stdio.h;
funcia de bibliotec scanf() permite citirea de la tastatur a unor valori
i memorarea lor la adresele asociate variabilelor din lista de parametri. n
exemplul prezentat, specificatorul de format "%d" arat c se dorete
citirea de la tastatur a unei valori de tip ntreg exprimate n baza de
numeraie 10 (decimal engl.) i depunerea ei la adresa de memorie
asociat variabilei nr1. Este important de reinut forma corect de scriere:
&nr1 i nu nr1;

22

Observaie: funciile de bibliotec scanf() i printf() sunt funcii cu numr


variabil de parametri (aceast noiune va fi prezentat detaliat n cadrul
altui capitol din Partea a II-a). Cele dou funcii pot fi folosite n mod
flexibil, cu condiia ca primul parametru s fie ntotdeauna un ir de
caractere (ir de control), iar urmtorii s fie adrese de memorie - pentru
scanf()), respectiv expresii - pentru printf(). n exemplul anterior, irul de
control "Suma este: %d \n" precizeaz att mesajul ce trebuie afiat pe
ecran ct i tipul de dat (%d) i poziia pe care ea o va ocupa n cadrul
mesajului. Dac, de exemplu, n program s-ar fi folosit ca form de
apelare a funciei de bibliotec printf("%d + %d = %d \n", nr1, nr2,
rezultat); informaiile afiate pe ecran ar fi fost: 6 + 4 = 10.
Cel de-al treilea i ultimul exemplu de program prezentat in cadrul acestei
seciuni este o variant de implementare n limbaj C a algoritmului de calcul
pentru suma primelor n numere ntregi pozitive. Algoritmul a fost descris n
seciunea 1.1, comparativ, prin schem logic i limbaj pseudocod. Varianta
scris n pseudocod avea forma:
Citete n
suma 0
Pentru i 1...n, cu Pas=1 Execut
suma suma + i
Afieaz suma

Chiar dac instruciunile do...while i for vor fi descrise abia n cadrul capitolului
4, este uor de neles semnificaia lor n cadrul programului, corespondena
limbaj pseudocod limbaj C fiind extrem de sugestiv. n exemplu,
instruciunea do...while este utilizat cu scopul de a impune introducerea corect
a datelor de intrare de la tastatur: atta timp ct valoarea variabilei n nu este
strict pozitiv, programul va continua s execute bucla do...while i nu va
trece la instruciunea urmtoare.
/*program de calcul, scris n limbaj C */
#include <stdio.h>
void main (void)
{int n, i, suma;
do
{ printf("Introducei valoarea lui n>0: ");
scanf("%d", &n);
}while (n<1);
suma = 0;
for (i=1; i<=n; i++)
suma=suma+i;
printf("Suma=%d\n", suma);
}

23

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