Capitolul 2 Ed 2

8
16 Capitolul 2 NOŢIUNI DE BAZĂ PENTRU SCRIEREA PROGRAMELOR ÎN LIMBAJUL C Scrierea programelor cu ajutorului limbajului C necesită cunoaşterea sintaxei şi semanticii limbajului, a notaţiilor şi vocabularului cu care acesta operează, a modului de structurare a instrucţiunilor dar şi a principalelor etape ce trebuie parcurse până la obţinerea 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 puţin 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 facilităţi de copiere, inserare, ştergere a unor caractere sau grupuri de linii de text, salvare a textului scris pe suport magnetic sub formă de fişier etc. Numele fişierului poate fi stabilit de către programator, extensia folosită fiind de cele mai multe ori .C, pentru a sugera natura informaţiilor conţinute; 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ă fişierul sursă nu conţine erori de sintaxă, compilatorul „traduce” conţinutul pe înţelesul hardware-ului, creând un nou fişier, numit program obiect . Numele de obiecteste preluat din limba engleză (object) şi se asociază cu extensia .OBJ a fişierului (în sisteme de tip Windows); editare de legături (link-editare) se realizează tot cu ajutorul unui program de sistem (utilitar), numit editor de legături 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 aplicaţii software formate din mai multe fişiere (detalii în Partea a II-a). Erorile depistate în această etapă pot impune reveni rea la etapa de compilare sau chiar la etapa de editare. Rezultatul etapei de editare de legături este fişierul executabil, cu extensie .EXE (în sisteme de tip Windows, de exemplu);

description

PC

Transcript of Capitolul 2 Ed 2

  • 16

    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);

  • 17

    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.

    Erori de logic: REZULTATE INCORECTE

    Erori de folosire a

    limbajului sau de scriere:

    MESAJE (numr, text)

    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

    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

    4. LANSARE N EXECUIE - se citesc datele - se efectueaz calculele - se afieaz rezultatele

    Erori de definire funcii, specificare module de bibliotec etc: MESAJE

  • 18

    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.

  • 19

    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

  • 20

    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

    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 ; }

  • 21

    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 . 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

  • 22

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

    /* program pentru calcularea sumei a dou valori numerice ntregi */ #include

    void main(void) { int nr1, nr2, rezultat;

    printf("Introducei cele 2 numere ce trebuie adunate:\n"); printf("Primul numr=");

    scanf("%d", &nr1); printf("Al doilea numr="); scanf("%d", &nr2);

    rezultat = nr1 + nr2;

    printf("Suma este: %d \n", rezultat); }

    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;

    declaraie de variabile

    citete o valoare de la tastatur

    instruciune de atribuire

    specificator de format

  • 23

    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

    void main (void) {int n, i, suma; do

    { printf("Introducei valoarea lui n>0: "); scanf("%d", &n);

    }while (n