programare c++

106
S e r g i u G . I s t r a t i P R O G R A M A R E Iniţializare în limbajele C şi C++ Ciclu de prelegeri la disciplina “Programare” Chişinău 2003

Upload: ecleziarhbarbosradu

Post on 23-Nov-2015

40 views

Category:

Documents


3 download

DESCRIPTION

Programare c++ tutorial

TRANSCRIPT

  • S e r g i u G . I s t r a t i

    P R O G R A M A R E

    Iniializare n limbajele C i C++

    Ciclu de prelegeri la disciplina Programare

    Chiinu 2003

  • 2

    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.

    Autor: lector superior Sergiu G.Istrati

    Redactor responsabil: conf. univ. dr. Pavel Nistiriuc

    Recenzent: academician, dr. hab. Victor I. Borevici

    U.T.M. 2003

  • 3

    Cuprins

    Limbajul de programare C/C++ ntroducere 5 1. Alfabetul limbajului 6 2. Structura unui program 8 3. Tipuri de date 12 3.1. Tipuri de date simple predefinite. Constante 12 3.1.1. Constante ntregi 12 3.1.2. Constante reale 14 3.1.2. Constante character 15 3.1.3. iruri de caractere 16 4. Variabile 16 4.1. Nume de variabile (identificatori) 16 4.2. Descrierea variabilelor 16 4.3. Iniializarea variabilelor 17 5. Operaii i expresii 18 5.1. Operaii aritmetice 18 5.2. Operaia de atribuire 18 5.3. Operaii de incrementare(decrementare) 18 5.4. Relaii i operaii logice 19 5.5. Operaiile logice poziionale 20 5.6. Operaia dimensiune 22 5.7. Operaia virgul 22 5.8. Expresii condiionate 23 5.9. Conversii de tip 23 5.10. Prioritile operaiilor 25 6. Instruciuni 26 6.1. Tipurile instruciunilor 26 6.2. Instruciuni expresie 27 6.3. Instruciuni de ramificare (condiionale) 28 6.3.1. Instruciunea de ramificare IF i IF-ELSE 28 6.3.2. Instruciunea de salt necondiionat GOTO 29 6.3.3. Instruciunea de selectare SWITCH 30 6.3.4. Instruciunea de ntrerupere BREAK 32 6.4. Instruciuni iterative(ciclice) 33 6.4.1. Instruciunea ciclic FOR 33

  • 4

    6.4.2. Instruciunea ciclic WHILE 34 6.4.3. Instruciunea de ciclare DO_WHILE 35 6.4.4. Instruciunea de continuare CONTINUE 36 7. Masive 36 7.1. Descrierea masivelor 36 7.2. Accesul la elementele masivului 37 7.3. Iniializarea masivelor 38 7.4. Exemple de prelucrare a masivelor 40 8. iruri de caractere 41 8.1. Masive de iruri 43 9. Structuri n C/C++ 44 9.1. Declararea variabilelor de tip structur 45 9.2. Iniierea variabilelor tip nregistrare 45 9.3. Folosirea structurilor 46 9.4. Structuri imbricate 47 9.5. Masive de structuri 47 10. Funcii n C/C++ 49 10.1. Transmiterea parametrilor n funcie 52 10.2. ntoarcerea valorilor din funcie 54 10.3. Prototipul funciei 56 10.4. Variabile locale i domeniul de vizibilitate 57 10.5.Variabile globale 59 10.6. Conflicte dintre variabile locale i globale 60 11. Indicatori (pointeri) 61 11.1. Indicatori i funcii 64 12. Fiiere n C/C++ 68 12.1. Deschiderea fiierelor 70 12.2. Funcii de nscriere/citire din fiier 73 12.2.1. nscriere/citire de caractere 74 12.2.2. nscriere/citire de iruri 75 12.2.3. ntrare/ieire cu format 77 12.2.4. Fiiere i structuri 78 Anexa1. Funcii de intrare-ieire n C/C++ 81 Anexa 2. Funcii matematice 89 Anexa 3. Funcii folosite la prelucrarea irurilor de caractere 97

  • 5

    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

  • 6

    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.

    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z _

    2) Literele minuscule i majuscule ale alfabetului rus (sau altui alfabet naional) i cifrele arabe.

    0 1 2 3 4 5 6 7 8 9

    3) Simboluri speciale ce se folosesc le organizarea proceselor de calcul i la transmiterea compilatorului unui set de instrunciuni.

  • 7

    Simbolul Denumirea Simbolul Denumirea , Virgul ) Parantez rotund nchis . Punct ( Parantez rotund deschis ; Punct-virgul } Parantez figurat nchis : Dou puncte { Parantez figurat deschis ? Semnul ntrebrii < Mai mic ' Apostrof > Mai mare ! Semnul exclamrii [ Parantez patrat deschis | Linie vertical ] Parantez patrat nchis / Slash # Numr (diez) \ Slash inversat % Procent ~ Tilda & Ampersand * Stelua ^ Negare logic + Plus = Egal - Minus " Ghilimele

    4) Simboluri de conducere i de desprire. n componena acestei grupe intr spaiul (blank-ul), simbolul tabulare, simbolul de trecere n rnd nou, ntoarcerea cruciorului, linie nou i pagin nou. Aceste simboluri au destinaia de a despri obiectele determinate de utilizator aa ca constante i identificatori. O consecutivitate de simboluri de desprire este precautat de ctre compilator ca un singur simbol. (Exemplu: mai multe blank-uri consecutive). 5) Pe lng grupele de simboluri precutate limbajul C pe larg folosete consecutiviti de conducere, adic combinaii de simboluri speciale folosite n funciile de intrare-ieire a informaiei. Consecutivitatea de conducere este alctuit dintr-un slash inversat (\), care se afl neaprat pe primul loc, dup care urmeaz o combinaie din litere latine i cifre.

    Consecutivitatea de

    conducere Denumirea

    Echivalentul hexazecimal

    \a Sunet (beep) 007 \b ntoarcere cu o poziie 008 \t Tabulare orizontal 009 \n Trecere n rnd nou 00A \v Tabulare vertical 00B

  • 8

    \r ntoarcerea cruciorului 00C \f Trecerea n alt format 00D \" Ghilimele 022 \' Apostrofa 027 \0 Simbolul zero 000 \\ Slash inversat 05C

    \ddd (d-cifr) Simbolul grupului de coduri PC n sistemul octal

    \xddd (d-cifr) Simbolul grupului de coduri PC n sistemul

    hexazecimal

    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

  • 9

    tip ntreg i e necesar s alctuim un program, care calculeaz i afiaz suma elementelor ntregului masiv. Aceasta este o problem tipic pentru prelucrarea masivelor unidimensionale.

    n concepiile limbajului C fiecare algoritm evideniat se realizeaz de o unitate de program numit funcie. Stilul de programare n C se caracterizeaz prin tendina de a evidenia un numr mare de funcii nu prea voluminoase, astfel, ca prelucrarea datelor n aceste funcii s nu depind de celelalte pri a programului. Acest lucru face programul destul de neles i d posibilitatea de a introduce uor corecii n unele funcii fr a tangenta celelalte. Prin funciile evideniate unica cu care ncepe ndeplinirea programului se numete principal i are denumirea fixat: main. Toate celelalte funcii au denumire arbitrare, pe care programatorul singur le numete. Ele pot fi nscrise n fiierul iniial pn la funcia main (n ordine arbitrar) sau se pot afla n fiiere diferite pe un suport magnetic. n programul de mai jos, ce realizeaz rezolvarea problemei intr funcia main() i funcia numit suma(). S analizm acest program:

    # include # include int suma (int y[10], int m) { int i, suma=0; for (i=0;i

  • 10

    (Standard Input/Output Header titlu de introducere-extragere) i conio.h (Console Input / Output Header- titlu de introducere-extragere de la consol). Existena acestor directive este condiionat de faptul c n textul programului snt folosite funciile ncorporate printf() i clrscr(), informaia despre care se conine n fiierele indicate. Urmatorul rnd int suma (int y[10], int m) conine declararea functiei suma() cu 2 parametri: un masiv y[10] i o variabila simpla m de tip ntreg. Aici e necesar de menionat faptul, c n limbajul C orice program ncepe de la funcia principal main(), independent de faptul cte funcii auxiliare se conin n program. Lund n consideraie acest fapt, funcia suma() va fi analizat la momentul cnd apelul ei va fi efectuat din corpul funciei principale main().

    Rndul din program: void main (void) definete titlul funciei principale cu numele main(). Cuvntul void din faa funciei semnific faptul, c aceast funcie nu va ntoarce valori n procesul execuiei sale. Parantezele rotunde ce urmeaza dup main() indic compilatorului c aceasta este o funcie, iar cuvntul void din paranteze faptul c funcia nu folosete parametri. Perechea acoladelor: prima ce se deschide dup main() i corespunztor acolada ce se nchide dup funcia getch(); mrginete instruciunile care formeaz corpul funciei principale main(). n limbajul C perechea de accolade {} mrginete o secven de instruciuni care se precaut ca un tot ntreg. Urmtoarul rnd conine descrierea variabilelor folosite n funcia principal main(): int w,n,i,x[10]; care transmite compilatorului c n program vor fi folosite variabilele w,n i i de tip ntreg i un masiv x cu mrimea de 10 elemente de tip ntreg. Dup descrierea datelor urmeaz instruciunea de adresare la funcia clrscr() ncorporat n biblioteca conio.h din Turbo C.

    Aceast funcie are destinaia de curire a ecranului. Dup ea urmeaz funcia printf(), care afiaz pe ecran un comentariu. n acest caz funcia printf("Culege marimea masivului n

  • 11

    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

  • 12

    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.

  • 13

    Sistemul de enumerare a constantelor este recunoscut de compilator dup forma lor de nscriere.Dac constanta este nscris prin intermediul cifrelor 0..9 i prima cifr nu e zero, atunci constanta se consider zecimal. De exemplu: 123, 45, 37. Dac constanta este nscris folosind cifrele 0..7 i prima cifr este zero, atunci constanta se consider octal. De exemplu: 045, 037. Dac constanta este nscris cu ajutorul cifrelor 0..9 i literelor a..f sau A..F i se ncepe cu 0x sau 0X, atunci constanta este hexazecimal. De exemplu: 0x45, 0x37. n aceste exemple constantele nscrise cu unele i aceleai cifre au valori diferite, ce se definesc de baza sistemului de enumerare.

    Pentru determinarea constantelor de tip ntreg sunt folosite diferite cuvinte rezervate, care determin diapazonul valorilor i volumul de memorie rezervat pentru constant.

    Tipul Volumul de memorie (octei) Diapazonul de valori int 2 -32768 32767

    Short (short int) 2 0 255

    Long (long imt) 4 -2 147 483 648

    2 147 483 647 unsigned int 2 0 65 535

    unsigned long 4 0 4 294 967 295

    n dependen de valoarea constantei, compilatorul aloc pentru reprezentarea ei n calculator doi sau patru octei de memorie. Pentru valorile -32768...32767 se aloc doi octei, unde primul bit se interpreteaz ca semnul constantei, iar 15 bii rmai definesc valoarea ei. n aa caz constanta este de tipul int (ntreg). Pentru valorile de la 0 65535 se aloc doi octei de memorie, ns toi 16 bii definesc valoarea constantei. Aa fel de constant are tipul unsigned int (ntreg fr semn). Constantele acestui diapazon, nscrise cu semnul minus se cerceteaz ca fr semn, la care se aplic operaia minus unar.

    Pentru valorile de la -2 147 483 648 pna la 2 147 483 647 se aloc 4 octei, la care primul bit se interpreteaz ca semn, iar 31 de bii rmai ca valoare a numrului. Aa constante au tipul long (lung).

    Pentru valorile de la 0 pna la 4 294 967 295 se aloc 4 octei, la care toi 32 de bii se interpreteaz ca valoare. Aa constant are tipul unsigned long (lung fr semn). Pentru acest tip la constantele negative se aplic operaia minus unar. Analogic se aloc memorie pentru constantele octale i hexazecimale, aflate n diapazonul zecimal respectiv.

  • 14

    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

  • 15

    aspectul: mantisa_e_ordinul sau mantisa_E_ordinul. n aceste notaii n calitate de mantis poate fi scris sau o constant zecimal fr modificator sau o constant real n form cu punct. n calitate de ordin se scrie o constant ntreag zecimal, posibil cu semn, ce determin puterea numrului zece. Dac semnul ordinului lipsete se subnelege semnul +. De exemplu 7.32E+14 = 7.32*1014 ; 55.000000E-3 = 0.055;

    Pentru determinarea constantelor de tip real sunt folosite diferite cuvinte rezervate, care determin diapazonul valorilor i volumul de memorie rezervat pentru constant.

    Tipul Volumul de memorie (octei) Diapazonul de valori Float 4 3.4E-38 3.4E+38

    Double 8 1.7E-308 1.7E+308 Long double 10 3.4E-4932 3.4E+4932

    Constantele reale au un nivel orecare de aproximaie, care depinde de

    compilator. n aa fel cifra 6.12345678912345 n diapazonul de aproximaie pentru tipul float va fi interpretat de compilator ca 6.123456, acest tip se mai numete tip cu aproximaie unitar i are aproximaia 6 poziii dup punct. Tipul double se mai numete tip cu aproximaie dubl i are aproximaia de pn la 15 16 poziii dup punct. Sintaxa de iniializare a constantelor de tip flotant (real) este urmtoarea:

    Dup standardul K&R-C : #define PI 3.14. Dup standardul ANSI-C const float PI = 3.14; inclusiv cel din K&R C.

    3.1.3. Constante caracter.

    O constant caracter este un oarecare caracter al alfabetului luat n apostrofe. Exemplu: caracter .

    Valoarea unei constrante de tip caracter (char) poate fi o liter, o cifr sau un alt simbol al tastaturii. Pentru fiecare constant de tip caracter n memorie se aloc cte un octet. Mulimea valorilor unei constante de tip carecter este urmtoarea: literele minuscule i majuscule ale alfabetului latin, zece cifre arabe 0..9 i simboluri speciale ! @ # $ % ^ & * ( ) _ + = | \ / }{ : ; ? > . < , ~ `

    Exist doua metode de scriere a caracterelor. Prima metod: Orice caracter al tabelului codurilor ASCII poate fi reprezentat

    n form de constanta caracter astfel: \ddd sau \xHHH , unde dddcodul octal, HHHcodul hexazecimal al caracterului. Zerourile ce stau n faa codului caracterului pot fi omise.

  • 16

    Metoda a doua: Caracterele des folosite ce nu se reflect pe ecran nu trebuie scrise sub form de cod. n acest caz se folosesc notaiile lor rezervate. Aceste caractere n C sunt repartizate n clasa caracterelor de control. Dac caractere de control se ntlnesc, spre exemplu, n rndul de extragere, atunci ele provoac o aciune corespunztoare. Sintaxa de iniializare a constantelor de tip caracter (char) este urmtoarea:

    Dup standardul K&R-C : #define Lit C. Dup standardul ANSI-C const char Lit = C; inclusiv cel din K&R C.

    3.1.4. iruri de caractere.

    Un ir este o succesiune de caractere ale alfabetului cuprinse ntre ghilimele. Spre deosebire de alte limbaje de programare, limbajul C nu conine un tip de date special ce desemneaz irurile de caractere. Limbajul C opereaz cu irurile cum ar lucra cu o succesiune de date de tip caracter amplasate ntr-o structur numit masiv. Aici fiecare simbol din ir este o component aparte a masivului de tip char. Tipul masiv este un tip structurat n C i va fi studiat n capitolul Tipuri structurate Not: Unele compilatoare C i C++ susin tipuri de date speciale pentru operare cu iruri de caractere i conin biblioteci de funcii pentru prelucrarea irurilor.

    4. Variabile. Variabila este o mrime care n procesul ndeplinirii programului poate primi

    valori diferite. Pentru variabile programatorul trebuie s determine notaii caracteristice proprii care se numesc identificatori. Deseori identificatorii sunt numii nume simbolice sau pur i simplu nume.

    4.1. Nume de variabile (identificatori). Numele variabilei (identificatorul variabilei) este o succesiune de caractere i

    cifre ale alfabetului ce se ncepe cu o liter sau cu caracterul de subliniere. n Turbo C se permit urmtoarele caractere la formarea identificatorilor : Literele mari A..Z, literele mici a..z, cifrele arabe 0..9 precum i caracterul de subliniere_. n privina lungimii numelui nu-s nici un fel de limite, dar pentru compilatorul Turbo C au valoare doar primele 32 de caractere. Ex: A, b, x, y, Suma, Gama, Text_no, beta, a1, b_1.

    4.2. Descrierea variabilelor. Toate variabilele din program trebuie s fie descrise. Descrierea variabilelor de

    obicei se efectueaz la nceputul programului cu ajutorul instruciunilor de descriere.

  • 17

    Instruciunea de descriere a variabilelor are urmtoarea form general de nscriere: tip v1,v2,,vn;

    unde : tip - determin tipul valorilor pe care le pot primi variabilele v1,v2,..,vn. n calitate de tip se folosete unul din cuvintele cheie deja cunoscute int, float, double sau char. Punctul i virgula este semnul sfritului instruciunii. ntre cuvntul cheie ce determin tipul variabilelor i lista numelor variabilelor, trebuie s fie cel puin un blanc. De exemplu:

    main() { float salary, suma, total; int timc, count; char znak, litera; }

    4.3. Iniializarea variabilelor.

    Atribuirea valorii iniiale unei variabile n timpul compilrii se numete iniializare. La descrierea variabilelor compilatorului i se poate comunica despre necesitatea iniializrii. Exemple de instruciuni de descriere cu iniializarea variabilelor:

    main() { char bara=\, litera=T; int anul=2000, luna=9; float alfa,beta,gama=1,7e-12; } n ultima instruciune de descriere e iniializat doar variabila gama, cu toate c

    la prima vedere pare c toate trei sun egale cu 1,7e-12. Din aceats cauz e mai bine de evitat amestecarea variabilelor iniializate i neiniializate n una i aceiai instruciune de descriere.

    Exist cazuri, cnd folosirea unei variabile neiniializate poate duce la erori grave din punct de vedere logic la calcularea unor valori. n timpul includerii calculatorului, celulele de memorie nefolosite de sistemul operaional conin date aleatoare. Cnd variabila este declarat i ei i se rezerveaz loc n memorie, coninutul acestor celule de memorie nu se schimb pn cnd variabila nu este iniializat sau pn cnd ei nu i se atribuie vre-o valoare. Din aceast cauz, dac variabila ce n-a fost iniializat i nu i s-a atribuit nici o valoare pe parcursul programului este folosit n calculul unei valori, rezultatul va fi incorect. Acest fapt impune necesitatea iniializrii oricrei variabile n timpul declarrii acesteia. Aceste iniializri presupun atribuirea valorii 0 (zero) pentru variabile numerice i (spaiu) pentru cele caracteriale sau de tip ir de caractere.

  • 18

    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: + - * / % >>

  • 19

    n expresia s=y*x++; incrementarea lui x se va face numai dup calcularea valorii lui s;

    Iar n expresia s=y*++x; nti se va incrementa x i numai dup aceia va fi calculat valoarea pentru s. i dac pentru m=5 vom scrie expresia m+++2, compilatorul trateaz primele dou plusuri ca forma sufix de incrementare a variabilei m. Valoarea expresiei va fi 7, i doar apoi variabila m se va mri cu unu. Expresia (i+j)++ este greit cci operaia de incrementare se aplic doar ctre numele variabilei. Operaia de incrementare are o prioritate mai nalt dect cea aritmetic.

    5.4. Relaii i operaii logice. Operaiile de relaie snt: 1) Mai mare (>). 2) Mai mare sau egal (>=). 3) Mai mic (b va avea valoarea zero sau unu i compararea oricrei din aceste valori cu 2 ne d 0.

  • 20

    Astfel observm c n limbajul de programare Turbo C putem scrie expresii ce par fr sens din punct de vedere al limbajelor de programare tradiionale.

    S cercetm operaiile logice. Ele , de obicei, se folosesc n calitate de legturi pentru reuniune a dou sau mai multe expresii . Tabelul ce urmeaz determin operaiile logice n Turbo C. Operaiile logice:

    Numele operaii logice Semnul operaii n Turbo C 1.Conjuncie (SI logic)

    2.Disjuncie (SAU logic) 3.Negare (NU logic)

    && || |

    Dac expr1 i expr2 sunt careva expresii , atunci

    expr1 && expr2 e adevrat n cazul cnd ambele sunt adevrate expr1||expr2 e adevrat n cazul cnd mcar una din expresii e adevrat. !expr1 e adevrat dac expr1 e fals i invers.

    Noi am stabilit pentru expr1 i pentru expr2 cazul cel mai general fr a mai indica ce fel de expresii ele sunt. Deci avem dreptul s scriem: 5&&2 . Valoarea acestei expresii va fi 1, din cauza c n Turbo C valoarea nenul se trateaaz ca adevr iar cea nul ca fals. Prioritile operaiilor logice se aranjeaaz n ordine descresctoare astfel: Negare (!). Conjuncie (&&). Disjuncie (||). Operaiile logice au o prioritate mai mic dect operaiile de relaie.

    Calcularea expresiilor logice, n care sunt numai operaii &&, se termin dac se descoper falsitatea aplicrii urmtoarei operaii &&. Reeind din definiia semanticii operaia &&, cum numai apare valoarea fals prelungirea calculelor nu are rost. Analog pentru expresiile logice ce conin numai operaii ||, calculele se termin odat ce apare valoarea adevr. Exemple de expresii logice:

    (5>2)&&47 adevarata; !(4>7) - adevarata; 4

  • 21

    Sau exclusiv poziional Deplasare la stnga

    Deplasare la dreapta Inversare

    ^ > ~

    Operaia poziional I se realizeaz asupra fiecrii perechi de bii a datelor, de

    exemplu dac n program avem descrierea variabilelor : int n,d; i variabila n are valoarea 5, iar variabila d are valoarea 6, atunci expresia n&d ne d valoarea 4, deoarece reprezentarea interioar a valorii variabilei n este 0000000000000101 iar a variabilei d este 0000000000000110. Rezultatul aplicrii operaiei poziionale I va fi : n 0000000000000101 d 0000000000000110 4 0000000000000100 Operaia poziional I deseori se folosete pentru evidenierea vreunui grup de bii.

    Operaia poziional SAU se aplic asupra fiecrei perechi de bii a datelor i deseori se folosete pentru instalarea unor bii, de exemplu, expresia: X=X | mask instaleaz n unu acei bii ai lui x, crora le corespunde unu n mask. Nu trebuie s confundm operaile logice poziionale cu operaiile logice && i || . De exemplu, expresia 1&2 are valoarea 0, iar expresia 1&&2 are valoarea 1.

    SAU exclusiv poziional realizeaz asupra fiecrei perechi de bii operaia de adunare dup modulul 2. Rezultatele ndeplinirii operaiei SAU exclusiv poziional se determin n tabelul urmtor :

    Bitul primului operand Bitul operandului al doilea Bitul rezultatului

    0 0 1 1

    0 1 0 1

    0 1 1 0

    Operaiile de deplasare la snga(>>) i la dreapta (

  • 22

    Deplasarea la dreapta a unei mrimi fr semn (unsigned) aduce la completarea cu zerouri a biilor eliberai. Deplasarea la dreapta a unei mrimi cu semn la unele mini aduce la multiplicarea bitului semnului, iar la altele biii se completeaz cu zerouri. Turbo C multiplic bitul semnului i de aceea pentru nemerele pozitive, deplasarea la dreapta cu n poziii e echivalent mpririi la 2 la puterea n.

    Operaia unar inversare (~) [tilda] transform fiecare poziie unar n nul i invers fiecare poziie nul n unar.

    5.6. Operaia dimensiune. Operaia unar dimensiune, notat prin cuvntul-cheie sizeof, d mrimea

    operandului su n octei. Operaia dimensiune se folosete sub forma: sizeof_expresie sau sizeof_tip

    Valoarea operaiei sizeof este o constant ntreag, care determin lungimea tipului rezultatului expresiei. Dac n calitate de operand al operaiei sizeof folosim _tip, atunci primim mrimea obiectului de tipul indicat. n calitate de _tip pot fi folosite aceleai tipuri de obiecte, ce se folosesc la descrierea variabilelor.

    Operaia sizeof poate fi folosit peste tot, unde se admite folosirea unei constante ntregi. Construciile sizeof_expresie i sizeof_tip se cerceteaz ca ceva unitar i, astfel, expresia sizeof_tip -2 nseamn (sizeof(_tip)-2). Sau, de exemplu, expresia sizeof(a+b+c)+d e echivalent expresiei constana_+d, unde constanta_ are valoarea lungimii tipului rezultatului a+b+c. Expresia a+b+c e luat n paranteze pentru a indica c avem nevoie de lungimea tipului rezultatului a+b+c, i nu a+b+c+d.

    5.7. Operaia virgul. Operaia virgul (,) permite de a uni cteva expresii n una singur i, astfel, n

    Turbo C se introduce noiunea de expresie cu virgul, ce are urmtoarea form general : expresie_,expresie_,expresie_, Perechea de expresii, desprite prin virgul, se calculeaz de la stnga spre dreapta. Tipul i valoarea rezultatului expresiei cu virgul este tipul i valoarea a celei mai din dreapta expresii. De exemplu: k=a+b,d=m+n,5.2+7 este o expresie cu virgul i se calculeaz de la stnga spre dreapta. Valoarea ei este 12.2 de tip float. n procesul calculrii acestei expresii variabilelor k i d li se atribuie valorile respective. Pentru expresia: d=(k=5+2,5+3) valoarea variabilei d va fi 8, deoarece ei i se atribuie valoarea expresiei cu virgul, care, la rndul su, este egal cu valoarea celei mai din dreapta expresii-operand.

  • 23

    Virgula n Turbo C se folosete n dou contexte: ca separator a datelor i ca operaie, ce determin calculul consecutiv al expresiilor. De aceea e admis, de exemplu, aa o expresie: int a,b,c=(1,2,5),d; unde variabila c se iniializeaz cu o expresie constant cu virgul 1,2,5 i primete valoarea 5. Contextul operaiei virgul (separator sau operaie) compilatorul l simte dup paranteze. n interiorul parantezelor avem operaia virgul, n exteriorul lor separatorul.

    n continuare vom vedea, c o situaie analogic poate aprea n lista argumentelor reale n timpul adresrii ctre funcie. Adresarea la funcie, ce conine trei argumente, unde al doilea are valoarea 5, poate arta, de exemplu, astfel:

    F(a,(t=3,t+2),c);

    5.8. Expresii condiionate. Expresiile condiionate au urmtoarea form general: expr1_?:expr2_:expr3_;

    Valoarea expresiei condiionale se calculeaz astfel: prima se calculeaz expr1_. Dac ea este diferit de zero (e adevrat), atunci se calculeaz expr2_ i valoarea ei va fi valoarea ntregii expresii, n caz contrar se calculeaz expr3_. Astfel, semnele de operaie ? i : determin operaia ternar, adic operaie cu trei operanzi. De exemplu, pentru a calcula z maximum din a i b e suficient de a scri expresia: z=(a>b)?a:b; unde (a>b)?a:b expresie condiional. Parantezele din jurul primei expresii nu sunt obligatorii, deoarece prioritatea operaiei ternare ?: este foarte joas, nc mai joas este prioritatea operaiei de atribuire. Totui, se recomand de a pune parantezele, cci n aa fel condiia se evideniaz vizual. Expresia de mai sus o putem scrie mai puin efectiv astfel: a>b?(z=a):(z=b);

    5.9. Conversii de tip. La scrierea expresiilor ar fi binevoit folosirea datelor omogene, adic a

    variabilelor i constantelor de acelai tip. ns, dac n expresie se amestec diferite tipuri de date, atunci compilatorul produce conversia automat a tipurilor n corespundere cu regulile care, n fond, se reduc la urmtoarele: dac operaia se ndeplinete asupra datelor de diferite tipuri, atunci ambele date se reduc la cel mai superior din aceste dou tipuri. O astfel de conversie se numete ridicarea tipului. O consecutivitate de tipuri ordonate de la superior la inferior e determinat n corespundere cu prezena interioar a datelor i arat astfel : double, float, long, int, short, char. Modificatorul unsigned mrete rangul tipului corespunztor cu un semn.

  • 24

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

  • 25

    Menionm, c n timpul aducerii la tipul necesar se converteaz valoarea lui n, dar nu se schimb coninutul ei, cci ea rmne de tip int.

    5.10. Prioritile operaiilor. Prioritiile operaiilor se cercetau n procesul expunerii lor. n paragraful de

    fa sunt reprezentate operaiile descrise mai sus i e indicat ordinea ndeplinirii lor. Pentru compararea prioritilor operaiilor le prezentm n tabel n ordinea descreterii prioritii. Coloana tabelului Ordinea execuiei determin consecutivitatea ndeplinirii pentru operaiile cu aceiai prioritate. De exemplu n expresia k=d+=b-=4; consecutivitatea ndeplinirii operaiilor se va determina n ordinea de la dreapta la snga i n rezultat b se va micora cu 4, d se va mri cu b-4, k=d+b-4. Ordinea de evaluare, descris de o simpl operaie de atribuire, va fi urmtoarea: b=b-4; d=d+(b-4); k=d;

    Prioritatea Semnul operaiei Tipul operaiei Ordinea execuiei

    1 ( ) Expresie De la stnga la dreapta

    2 ! ~ ++ -- - + (unar) sizeof

    (tip) Unare De la dreapta la stnga

    3 * / % Multiplicative 4 + - Aditive 5 > Deplasare 6 < > = Relaii 7 == != Relaii (egalitate) 8 & I poziional 9 ^ SAU exclusiv poziional 10 | SAU poziional 11 && I logic 12 || SAU logic 13 ?: Condiie

    De la stnga la dreapta

    14 = *= /= %= += -= &=

    |= >>=

  • 26

    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.

  • 27

    Orice instruciune poate fi marcat de un identificator, nunit etichet. Eticheta este separat de instruciune prin dou puncte i, astfel, n caz general instruciunea are forma: etichet_:corpul_instruciunii;

    Eticheta se folosete doar n cazul cnd se folosete saltul necondiionat la aceaast instruciune cu ajutorul instruciunii goto. n exemplul de mai sus pot lipsi ori eticheta_, ori corpul_instruciunii, ori ambele. n cazul lipsei corpul instruciunii, avem o instruciune vid, adic aa o instruciune ce nu ndeplinete nici o aciune. n cazul cnd avem lipsa instruciunii i prezena etichetei avem o instruciune vid etichetat. Exemplu: Empty : ;

    Dac n calitate de corpul instruciunii e folosit un bloc, atunci (;) nu se pune. n acest caz, rolul sfritului l va juc acolada dreapt, de nchidere (}). De exemplu:

    label:{k=a=b;k+=8;}

    6.2. Instruciuni expresie. Orice expresie va deveni instruciune dac se va termina cu (;). n aa fel,

    instruciunea-expresie va avea urmtoara form: expresie_; Dup cum sa menionat, orice instruciune poate fi etichetat. Instruciunea-

    expresie ader la clasa instruciunilor simple ai limbjului Turbo C. n rezultatul ndeplinirii n program a instruciunii-expresie se calculeaz valoarea expresiei n conformitate cu operaiile, care sunt definite n ea. De obicei, pot fi una sau mai multe operaii de atribuire i atunci instruciunea-expresie n limbajul Turbo C are acelai sens i n alte limbaje. S studiem secvene din program unde e folosit instruciunea-expresie: Exemplu 1:

    int x,y,z; x =-3+4*5-6; y =3+4%5-6; z =-3*4%-6/5; n rezultat vom avea x=11, y=1, iar z=0. Vom scrie ordinea ndeplinirii a acestei secvene n conformitate cu prioritatea operaiilor, folosind parantezele rotunde:

    Pentru x=-3+4*5-6 : x=(((-3)+(4*5))-6); Pentru y=3+4%5-6 : y=((3+(4%5))-6) Pentru z=-3*4%5-6/5 : z=((((-3)*4)%(-6))/5);

    Exemplu 2: int x=2,y,z; x*=3+2,x*=y=z=4;

    Aici instruciunea-expresie conine o expresie cu virgul compus din dou subexpresii. n primul rnd se calculeaz prima subexpresie, apoi- subexpresia a doua. n rezultat vom obine z=4, y=4, x=40. Menionm faptul, c la declarare x are valoarea 2: x=(x*(3+2))*(y=(z=4));

  • 28

    6.3. Instruciuni de ramificare (condiionale). 6.3.1. Instruciunea de ramificare IF i IF-ELSE.

    n structurile ramificate de calcul, unele etape nu ntotdeauna se ndeplinesc n una i aceiai ordine. n dependen de careva condiii, care sunt controlate(verificate) pe parcursul calculelor, se aleg pentru executare diferite consecutiviti de instruciuni. Pentru descrierea astfel de procese n limbajul C se folosesc instruciunile ramificate (condiionale). O instruciune condiional selecteaz o singur instruciune dintre alternativele sale, pe care apoi o execut. Astfel de instruciuni sunt if i if else. Instruciunea if e compus i sintaxa ei admite unul din urmtoarele formate:

    if_(expresie)_instruciune sau if_(expresie)_instruciune1_else_instruciune2; n instruciunile de ramificare lipsete (;), deoarece construcia instruciune_

    care a fost descris deja include n sine acest semn (;). Dac instruciunea_ este simpl, atunci ea se va sfri cu (;), iar dac instruciunea_ reprezint un bloc, atunci acest bloc va fi definit de acolade, unde acolada dreapta va juca rolul sfritului. Instruciunea if lucreaz n felul urmtor:

    1. Formatul if(expresie)_instruciune. Mai nti se calculeaz valoarea expresiei. Dac rezultatul ei este ADEVR ( adic expresia != 0), atunci se ndeplinete _instruciunea, iar n caz contrar se sare peste instruciune i nu avem nici o aciune. Schema algoritmic a formatului if(expresie)_instruciune este prezentat pe desen. Fie c d este egal cu c. Atunci vom mri d cu o unitate, iar c cu trei uniti. n celelalte cazuri d i c rmn neschimbate. Instruciunea de ramificare a acestui caz: if(d==c) ++d,c+=3;

    n calitate de instruciune_ aici se folosete instruciunea expresie cu virgul. Vom descrie aceast instruciune astfel: if(d= =c)++d;c+=3;

    Diferena const n aceea c n exemplu al doilea avem 2 instruciuni: if i instruciunea-expresie c+=3; n acest caz dac (d==c) va avea valoare ADEVR, atunci totul va rmne ca mai nainte: d se va mri cu o unitate, iar c se va mri cu trei uniti. n caz contrar, d nu se schimb, i numai c se mrete cu 3. Vom considera acest exemplu din nou:

    if(d= =c){++d;c+=3;}

  • 29

    n cazul c (d == c) va avea valoarea FALS, d i c vor rmne neschimbate, deoarece aceste instruciuni snt incluse n acolade, adic formeaz un bloc, i din punct de vedere logic sunt privite ca o singur instruciune bloc.

    2. Formatul if(expresie)_instuciune1_else_instruciune2. Ca i n cazul precedent, n primul rnd se calculeaz valoarea expresiei. Dac ea difer de zero, adic este ADEVR, atunci se ndeplinete instruciunea1, n caz contrar se ndeplinete instruciunea2. Schematic aceast instruciune e preszentat pe desen. De exemplu : fie c e necesar de a calcula z, care este egal cu maximum dintre dou numere a i b. Atunci putem scrie : if(a>b)z=a;else z=b; Prezena (;) dup z=a este necesar, deoarece aceasta este o instruciune ce intr n coponena instruciunii if.

    Prima form prescurtat a instruciunii if ne d posibilitatea ndeplinirii sau nendeplinirii oricrei operaii, pe cnd a doua form ofer posibilitatea alegerii i ndeplinirii unei operaii din dou posibile. Totui, cte odat apare necesitatea alegerii unei operaii din mai multe.Vom examina un lan de instruciuni:

    if(expresie1)_instruciune1_else_if(expresie2)_instruciune2_else_if(expresie3)_instruciune3_else _instruciunea4

    Aa un lan de instruciuni e admis, deoarece n locul instruciunii n instruciunea if poate fi orice instruciune, inclusiv i if. ns o aa nscriere e complicat. Pentru aa procese n C exist o instruciune special care va fi studiat ceva mai trziu. S precutm 2 exemple:

    a) if(n>0) if(a>b) z=a; else z=b; b) if(n>0){if(a>b) z=a;}else z=b; Deosebirea const n faptul c n cazul a) avem instruciunea if de form scurt,

    care are ca instruciune forma if_else; . n cazul b) avem instruciunea if_else n form plin, avnd n calitate de instruciune1 forma if prescurtat. Secvena b difer de a numai prin prezena acoladelor, ce definesc un bloc, ns, evident, joac un rol important la interpretarea acestor intruciuni.

    6.3.2. Instruciunea de salt necondiionat GOTO. Instruciunea goto ne d posibilitatea transmiterii controlului execuiei

    programului la o instruciune marcat cu o etichet. Instruciunea goto are formatul: goto_etichet;

  • 30

    Dup instruciunea goto, evident, se ndeplinete instruciunea, eticheta creia coincide cu eticheta din goto. Folosirea cestei instruciuni n Turbo C nicidecum nu se deosebete de folosirea ei n alte limbaje algoritmice. ns e dorita folosirea ct mai redus, a acestei instruciuni, deoarece limbajul Turbo C face parte din clasa limbajelor structurate. Totodat, avnd la dispoziie instruciunile goto i if, programatorul poate programa diferite operaii complicate. Exemplu :Folosirea instruciunilor if i goto la organizarea ciclurilor. Acest program calculeaz valoarea lui y care este egal cu n/(n+5),unde n=1,..,50

    #define lim 50 main() { int n=0; float y=0; m1:++n; if(n

  • 31

    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 case-ul 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

  • 32

    6.3.4. Instruciunea de ntrerupere BREAK. n practica programrii cteodat apare necesitatea ndeplinirii numai a unei

    variante case fr indeplinirea celor ce urmeaz dup ea, adic trbuie ntrerupt logica stabilit de lucrul a instruciunii switch. Evident c pentru aa ceva e necesar inroducerea unei instruciuni ntre instruciunile variantei, care ar servi ca sfrit al ndeplinirii lui switch. Aa o instruciune este BREAK, executarea creia rovoac terminarea instruciunii switch. n acest caz instruciunea switch va avea urmtorul format:

    switch (expresie) { case expr_const1:instruciune1; break; case expr_const2:instruciune2; break ; ................. case expr_const_n:instruciune_n; break; default:instruciune; break; } Instruciunea BREAK se nscrie n variante atunci cnd este nevoie de ea.

    ndeplinirea ei aduce la trecerea controlului la instruciunea urmtoare dup switch. La prima vedere pare c nu este necesar de a scri instruciunea BREAK dup varianta default. Default poate fi situat n orice loc al instruciunii switch, chiar i pe primul loc ntre variante, i atunci BREAK este necesar pentru a evita ndeplinirea celorlalte variante. Exemplu: Schimbm formularea problemei precedente n felul urmtor : fie c e necesar de tiprit rndul k dinte cele patru rnduri ale poeziei date:

    switch(k){ case 1 : printf(A fost o dat ca-n poveti,\n);break; case 2 : printf(A fost ca niciodat,\n); break; case 3 : printf(Din rude mari mprteti,\n); break; case 4 : printf(O preafrumoas fat.\n); break; default:printf(Poezia nu conine rnd cu aa numr\n); } Trebuie de menionat, c instruciunile din variantele case sau default pot lipsi.

    Aceasta este necesar cnd avem nevoie de a obine acelai rezultat la trecerea la diferite prefixe. Exemplu:

    switch (L) { case `C`: case `c`: printf(Calculator\n);break; } n acest caz, dac L=c va fi tiprit cuvntul calculator. n caszul cnd

    L=`C`, atunci va fi ndeplinit instruciunea ce urmeaz dup primul case, dar deoarece aici lipsete instruciunea, se vor ndeplini instruciunile situate mai jos, pn ce nu se ntlnete instruciunea break.

  • 33

    6.4. Instruciuni iterative(ciclice). Instruciunile precutate mai sus redau operaii care trebuie efectuate conform

    algoritmului i fiecare din ele se ndeplinesc numai odat. n cazul, cnd una i aceiai instruciune trebuie s fie executat de n ori cu diferite valori ale parametrilor se folosesc instruciunile ciclice. Distingem 3 instruciuni ciclice n C :

    1) Instruciunea ciclic cu parametru (FOR) 2) Instruciunea ciclic precedat de condiie (WHILE) 3) Instruciunea ciclic cu postcondiie (DO-WHILE)

    6.4.1. Instruciunea ciclic FOR.

    Ciclul FOR posed urmtoarele caracteristici: numrul de repetri ale ciclului este cunoscut de la nceputul executrii lui; conducerea ciclului este efectuat cu ajutorul unei variabile de tip int, numit parametrul ciclului, care, n acest proces ciclic primete valori consecutive de la valoarea iniial dat pn la valoarea final dat. Sintaxa instruciunii este urmtoarea: for(expresie1;expresie2;expresie3) instruciune; unde expresie1 expresie de iniializare a parametrului ciclului, expresie2- expresie de control, expresie3- expresie de incrementare/decrementare(corecie) a parametrului ciclului.

    Instruciunea ciclic for lucreaz n felul urmtor: la nceput se calculeaz expresia de iniializare. Apoi, dac expresia de control este adevrat, atunci se ndeplinete instruciunea. Dup ndeplinirea instruciunei se execut expresia de corecie i din nou se controleaz expresia de control, justeea creia duce la ndepliniea repetat a instruciunii. Dac expresia de control are valoarea fals atunci ndeplinirea ciclului for se termin, adic controlul se transmite instruciunii programului ce urmeaz dup instruciunea for. De exemplu: de calculat y=i/(i+1); unde i=1..50;

    y=0; for(i=1;i

  • 34

    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

  • 35

    ori, este necesar la fiecare ndeplinire nou a ciclului de a modifica variabila parametru , ce intr n componena expresiei. Spre deosebire de ciclul for, unde variabila parametru putea fi numai de tip ntreg, parametrul ciclului while poate fi i de tip float, adic pasul ciclului poate fi diferit de 1 i chiar un numr fracoinar. Exemplu:

    i=1; while(i

  • 36

    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

  • 37

    (identificatori), d1,d2,dn- dimensiunile masivului. Dimensiunea masivului indica numarul de elemente prezente in masiv. Dimensiunea masivului poate fi o expresie constanta cu rezultat intreg. In dependenta de cantitatea de dimensiuni, masivele se clasifica in:

    1. masive unidimensionale(cu 1 dimensiune); masivul unidimensional reprezint un ir de elemente aranjate uniform ntr-un rnd. Fiecare element al unui masiv unidimensional are 1 coordonat: numrul de ordine a elementului n ir.

    2. masive bidimensionale (cu 2 dimensiuni); masivul bidimensional reprezint o structur format din rnduri i coloane. Fiecare element al unui masiv bidimensional are 2 coordonate: numarul rndului i numrul coloanei.

    3. masive tridimensionale (cu 3 dimensiuni); masivul tridimensional reprezint o structur echivalent cu un cub n volum cu 3 dimensiuni: lungimea, limea, nlimea. Fiecare element al unui masiv tridimensional are 3 coordonate: numarul rndului(n lungime), numrul coloanei(n lime) i numrul nlimei(n adncime).

    4. masive multidimensionale. Exemple de descriere a masivelor: int vector[20]; vector - masiv unidimensional din 20 de numere ntregi; float x[10]; x masiv cu 10 elemente de tip ntreg; float matrix[7][9]; matrix - masiv bidimensional din 63 (7*9) de numere flotante; char fraza[25]; fraza - masiv(propoziie) din 25 de caractere ; int spase[15][30][18]; space - masiv tridimensional de numere ntregi (masiv unidimensional de masive bidimensionale);

    7.2. Accesul la elementele masivului. Cu toate c masivul este un tot ntreg, nu se poate vorbi despre valoarea

    masivului ntreg. Masivele conin elemente cu valorile crora se opereaz n program. Fiecare element n masiv i are indicele i valoarea sa. n calitate de indice a unui element se folosete un numr ntreg ce indic numrul de ordine al elementului n masiv. Enumerarea elementelor n masiv conform numrului de ordine se ncepe de la zero. Deci, indicele unui element poate avea valori de la 0 pna la d-1, unde d este dimensiunea masivului.

    n calitate de valoare a unui element din masiv poate servi orice numr de tipul indicat la descrierea masivului, adica tipul valori atribuit oricrui element din masiv trebuie s fie compatibil cu tipul masivului. Sintaxa de acces la orice element a unui

  • 38

    masiv este urmtoarea: nume[i1][i2]..[in]. Unde nume este numele masivului, i1indicele elementului n dimensiunea 1, i2-indicele elementului n dimensiunea 2, in - indicele elementului n dimensiunea n. n cele mai dese cazuri se opereaz cu masive unidimensionale i bidimensionale. Accesul la un element al unui masiv unidimensional se face n felul urmtor: nume[i]; unde nume - numele masivului, i-numarul de ordine a elementului n masiv. Exemplu:

    vector[5]; se acceseaz elementul cu numrul de ordine 5 din masivul vector. fraza[20]; se acceseaz elementul cu indicele 20 din masivul fraza. Accesul la un element al unui masiv bidimensional se face prin nume[i][j];

    unde i este numarul rndului pe care se afl elementul; j este numrul coloanei pe care se afl elementul. Exemplu:

    matrix[4][7]; se acceseaz elementul de pe rndul 4 i coloana 7 a masivului matrix.

    y[0][0]; se acceseaz primul element al masivului, adic rndul 0, coloana 0; n cazul cnd masivul este de tip simplu, atribuirea valorii unui element al

    masivului se face ca i n cazul atribuirii valorii unei variabile simple. Exemple: x[0]=7.125; vector[19]+=1; matrix[1][1]=5.5; fraza[3]=b; space [3][5][2]=8; n cazurile cnd masivul este de tip structurat, atribuirea valorii i accesul la un

    element al masivului se face conform regulilor de atribuire i accesare pentru variabile structurate.

    Un element al masivului poate aprea n orice expresie, unde e admisibil prezena unei variabile de tip compatibil cu tipul valorii elementului.

    7.3. Iniializarea masivelor. Deseori e necesar ca elementele masivului s posede valori chiar la momentul

    descrierii masivului. Procesul de atribuire a valorilor elementelor masivului n timpul descrierii lui

    se numete iniializarea masivului. Sintaxa de iniializare a unui masiv unidimensional este:

    tip nume[d]={v0,v1,v2,,vn-1}; unde tip este tipul masivului, nume este numele masivului, v0,v1,v2,vn-1 valorile respective ale elementelor nume[0],nume[1] etc. Exemplu:

    int x[8]={1,3,15,7,19,11,13,5};

  • 39

    n acest caz elementele masivului vor avea urmtoarele valori: x[0]=1; x[1]=3; x[2]=15; x[3]=7; x[4]=19; x[5]=11; x[6]=13; x[7]=5; E de menionat faptul, c indicii masivului se schimb ncepnd dela zero.Adic la descrierea masivului valoarea maxim a indicelui masivului coincide cu numrul de elemente n masiv minus unu.

    La iniializarea masivului nu e numaidect de indicat dimensiunile masivului.Compilatorul va determina numrul elementelor dup descrierea masivului i va forma un masiv cu mrimea respectiv. De exemplu:

    int x[]={1,3,15,7,19,11,13,5}; Elementele masivului vor primi valori ca i n cazul precedent.

    Vom examena nc cteva exemple de iniializare a masivelor: float vector[4]={1.2,34.57,81.9,100.77}; // vector masiv din 4 elemente de

    tip float; int digit[5]={1,2,3}; // digit masiv de tip ntreg din 5 numere,ultimelor dou

    elemente li se atribuie valoarea zero. char m[5]={A,B,C,D}; // m masiv din 5 caractere, ultimul element are

    valoarea nul-caracter; float const y[4]={25,26,17,18}; // iniializarea masivului y[4], elementele

    cruia sunt constante de tip float i nu pot fi schimbate n decursul ndeplinirii programului. S examenm iniializarea masivului bidimensional:

    Int a[3][3]={ {1,4,2}, {7,5,3}, {8,6,9} };

    Iniializarea masivului bidimensional se efectueaz pe rnduri. Elementele acestui masiv au urmtoarele valori: a[0][0]=1; a[0][1]=4; a[0][2]=2; a[1][0]=7; a[1][1]=5; a[1][2]=3; a[2][0]=8; a[2][1]=6; a[2][2]=9;

    La iniializarea masivului dat fiecare rnd se include n acolade . Dac n rndurile indicate de noi nu vor ajunge elemente pentru completarea rndurilor, n acest caz n locul elementelor pentru care n-au ajuns valori vor aprea zerouri. Dac n acest exemplu vom omite acoladele interioare, rezultatul va fi acelai. Dac lipsesc acoladele interioare ,elementelor masivului se vor atribui valorile n mod succesiv extrase din list .Completarea masivului se efectuiaz pe rnduri. Elementele masivului pentru care n list n-au ajuns valori, primesc valorile zero.Dac n list snt mai multe valori dect elemente, atunci o astfel de list se socoate greit. Cele menionate mai sus se refer la toate tipurile de masive.Exemple: Iniializarea masivului bidimensional:

  • 40

    int a[3][3]={ 1,4,2,7,5,3,8,6,9}; Trei metode echivalente de iniializare a masivului tridimensional:

    int p[3][2][2]={ { {1,2},{3,4} }, { {5,6},{7,8} }, { {9,10},{11,12} } }; int p[3][2][2]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; int p[3][2][2]={1,2,3,4,5,6,7,8,9,10,11,12};

    7.4. Exemple de prelucrare a masivelor.

    Prezentm 2 exemple de prelucrare a masivelor unidimensional i bidimensional: Exemplu 1. Prelucrarea unui masiv unidimensional:

    Este dat un masiv unidimensional x cu n elemente. Comparai suma primei jumti a masivului cu media aritmetic jumatii a doua a masivului. #include #include #include #include void main(void) { int x[20],n,k,i,s=0; float m,s1=0,r=0; printf("\nCulege mrimea masivului n

  • 41

    printf("\nCulege mrimea masivului n

  • 42

    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

  • 43

    ntroducere cu format scanf(), se poate aplica urmtoarea sintax: scanf("%s",name); care atept culegerea de la tastatur a unui ir de caractere, pe care apoi (dupa culegerea tastei ENTER l atribuie ca valoare variabilei name. Aici %s este formatul tipului ir de caractere.

    Pentru afiarea la monitor a unui ir de caractere este folosit funcia puts(). Funcia puts( ) poate avea n calitate de parametru numai un ir de caractere. Sintaxa funciei este urmatoarea: puts(parametru); unde n calitate de valoare poate fi folosit un ir de caractere sau numele unei variabile de tip ir de caractere. Exemplu:

    puts("Elena"); puts(name); Majoritatea compilatoarelor C trec cursorul din rnd nou dup executarea

    funciei puts(). ns exist i aa versiuni de compilatoare, care nu ndeplinesc aceast trecere din rnd nou. n acest caz e binevoit folosirea simbolului de trecere n rnd nou \n. Exemplu: puts("Elena|n");

    Folosind funciile gets( ) i puts( ) exemplul de mai sus se poate scrie n felul urmtor:

    void main (void) { char name[15]; puts (" Culege numele"); gets (name); puts ("Numele dvs este:"); puts (name); }

    8.1. Masive de iruri.

    Declarnd un masiv char S[20] putem pstra n el valoarea unui ir de caractere. n cazul, cnd este nevoie de prelucrat o totalitate din cteva iruri, e comod de folosit masive de iruri.

    Un masiv de iruri este un masiv bidimensional tip char compus din linii i coloane. Pe fiecare linie din aa masiv va fi nscris cte un ir de caractere. Numrul maximal de iruri astfel nscrise n masiv va fi egal cu cantitatea liniilor din masiv.

    De exemplu: char propoziie[10][35]este un masiv, n care pot fi scrise 10 variabile de tip ir de caractere, fiecare avnd lungimea maximal de 34 de caractere. Pentru a accesa un ir din aa masiv se va folosi sintaxa: propoziie[i], unde i este numrul rndului din masiv unde se va afla irul. Pentru a accesa un caracter al irului i din masiv se va folosi sintaxa: propoziie[i][j] unde j este poziia caracterului n irul i.

  • 44

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

  • 45

    9.1. Declararea variabilelor de tip structur. Declararea structurii nu rezerveaz spaiu de memorii pentru ea. nainte de a

    folosi orice tip de date, e necesar de declarat o variabil corespunztoare. Este imposibil de a folosi o structur n program fr a declara o variabil de tip nregistrare, fix aa cum e imposibil folosirea unei valori de tip float naintea declarrii variabilei de tip float.

    Sintaxa de declararea a unei variabile-structuri e urmtoarea: struct nume_structura nume_variabil;

    Aici cuvntul cheie struct indic compilatorului faptul c merge vorba despre o structur, iar tipul nregistrrii stud determin ablonul dup care va fi compus variabila. Dup tipul nregistrrii urmeaz numele variabilei, care va fi folosit n program. De exemplu, pentru a primi acces la datele despre reuita unui student trebuie declarat o variabil: struct stud a; Acum avem variabila a compus din 5 cmpuri, pentru care a fost rezervat memorie.

    Dac n program trebuie folosite cteva variabile de unul i acelai tip nregistrare, e posibil de folosit urmtoarea sintax: struct stud a, b, c; Aici snt declarate 3 variabile de tip nregistrare stud: a, b, c. n cazul cnd e necesar folosirea variabililor de tip nregistrare diferit, ele se vor declara aparte.

    Exist posibilitatea declarrii variabilei de tip nregistrare odat cu descrierea structurii. Pentru aceasta numele variabilei va fi amplasat ntre acolada de nchidere i simbol ; la sfritul declarrii structurii. Exemplu: struct stud { char name [20];

    char grup [10] ; int ex1, ex2; float med;}a;

    Aici stud este tipul nregistrrii i numele unui nou tip de date numit structur. Elementele, din care se compune structura se mai numesc cmpuri structurate, a este numele variabilei , care va fi folosit n program i e compus conform ablonului din 5 componente.

    9.2. Iniierea variabilelor tip nregistrare. n cazul, cnd valorile iniiale ale componentelor unei variabile-structu snt

    cunoscute, este posibil atribuirea lor n timpul declarrii variabilei. n cazul cnd se declar o simpl variabil tip nregistrare iniierea va fi o parte a declarrii structurii: struct stud { char name [20]; char grup [10]; int ex1, ex2; float med;}

  • 46

    a={Ivanov, SOE-991, 8,7,7.5}; Aici a fost descris structura stud i concomitent declarat variabila a cu iniializarea valorilor pentru componentele sale.

    O alt variant de iniializare a componentelor structurii este iniializarea lor n tipul declarrii unei variabile tip nregistrare. Exemplu:

    struct stud { char name [20]; char grup [10]; int ex1, ex2; float med;}

    main () { struct stud a={Ivanov, SOE-991, 8,7,7.5}; } O structur este global, dac e declarat nainte de funcia principal main(),

    i este local dac e declarat nuntru funciei main(), sau nuntru altei funcii. ns dac e necesar iniializarea unei structuri ce conine iruri, ea trebuie declarat nainte de funcia main() sau ca variabil static: static struct stud;

    9.3. Folosirea structurilor. O structur poate fi prelucrat n program, numai dac exist declarat o

    variabil de tip nregistrare. Aceast variabil e compus din cteva elemente fiecare avnd valoare de tip diferit. ns adresarea ctre valorile ce se conin n cmpurile structurii este imposibil folosind nemijlocit numele cmpului respectiv. De asemenea e imposibil accesarea valorilor din variabila tip nregistrare folosind numai numele ei. Conform regulilor de sintax a limbajului C++, pentru a accesa un element al structurii, este necesar de indicat numele variabilei tip nregistrare i numele cmpului respectiv folosind urmtoarea sintax: nume_var.nume_cmp , unde nume_var este numele variabilei tip nregistrare, iar nume_cmp numele cmpului respectiv din variabil. Not: La prelucrarea valorilor din cmpurile structurii se vor folosi toate funciile, instruciunile i operaiile aplicabile tipului crui i aparin cmpurile structurii. Exemplu: De alctuit o structur care ar conine informaii despre un student (nume, grupa) i ar calcula nota medie dup rezultatele la dou examene:

    struct stud {char name [20], group[10]; int ex1, ex2; float med;}; void main (void) { struct stud a; puts(Culege numele i grupa); gets(a.name); gets(a.group); puts(Culege notele la dou examene); scanf(%d%d,&a.ex1,&a.ex2); a.med=(a.ex1+a.ex2)/2; printf(media=%f,a.med);}

  • 47

    9.4. Structuri imbricate.

    Tipul structur este un tip compus, aceasta nseamn c o variabil de acest tip poate fi alctuit din cteva elemente simple sau compuse, care la rndul su pot deasemenea s conin alte elemente. Acest fapt ne d posibilitate s folosim unele structuri n calitate de cmpuri pentru altele structuri. Astfel de structuri se vor numi imbricate. Cantitatea de niveluri de structuri imbricate teoretic poate fi infinit, ns nu se recomand de a folosi foarte multe nivele de imbricare din cauza sintaxei incomode.

    n cazul cnd structura A contine n componena sa un cmp, care la rndul su este deasemenea o structur B, atunci structura A trebuie declarat numai dup ce va fi declarat structura B. Urmtorul exemplu folosete variabila a de tip structur stud imbricat, care conine informaia despre un student i rezultatele unei sesiuni. Informaia despre rezultatele sesiunii este grupat ntr-o structur aparte cu numele sesia i e folosit n calitate de cmp nota n structura stud:

    struct sesia {int ex1,ex2,ex3; float med;}; struct stud {char name [20], group[10]; struct sesia nota;}; void main (void) { struct stud a; puts(Culege numele i grupa); gets(a.name); gets(a.group); puts(Culege notele la 3 examene); scanf(%d%d%d,&a.nota.ex1, &a.nota.ex2, &a.nota.ex3); a.nota.med=( a.nota.ex1+a.nota.ex2+a.nota.ex3)/3; printf(\nmedia=%f,a.nota.med);} Aici a fost calculat nota medie reieind din rezultatele la 3 examene. Din acest

    exemplu este simplu de observat sintaxa de adresare la o valoare dintr-un cmp a unei structuri imbricate: se folosesc numele fiecrui cmp imbricat, separat prin punct i scrise n ordine descresctoare pn la cmpul destinaie. Sintaxa a.nota.med nseamn ca se face o adresare la cmpul med ce aparine unei structuri (sesia), care la rndul su este cmp (nota) n componena altei structuri (stud) apelat prin intermediul variabilei a.

    9.5. Masive de structuri. n timpul declarrii unei variabile tip nregistrare, n memorie se nregistreaz

    spaiu pentru pstrarea i prelucrarea datelor ce se vor conine n cmpurile structurii

  • 48

    conform ablonului numai pentru o nscriere: un student, o persoan .a.m.d. n cele mai dese cazuri este necesar prelucrarea informaiei despre un grup de persoane, n cazul nostru despre un grup de studeni. n acest caz este necesar declararea a mai multor variabile de tip nregistrare, fiecare reprezentnd nscrierea concret, pentru un student aparte.

    Pentru a sistematiza informaia pstrat ntr-o mulime de nscrieri este binevenit declararea unui masiv de structuri. n acest caz fiecare element al masivului unidimensional tip structur va pstra informaia despre o persoan i numrul maximal persoane nregistrate in aa fel va fi egal cu cantitatea de elemente ce se conin din masiv.

    Un masiv unidimensional de structuri se poate declara n modul urmtor: struct nume_structur nume_ masiv [N]; unde N - numrul de elemente din masiv. Exemplu: struct stud x[10]; n aa fel au fost rezervate 10 regiuni de memorie, fiecare avnd volumul necesar pentru a pstra o structur ntreag pentru prelucrarea informaiei despre reuita unui student.

    Adresarea in program la un element al masivului de structuri va fi fcut ca i n cazul unui masiv simplu: se va indica numele masivului cu numrul de ordine al elementului in paranteze ptrate. Exemplu: x[3]. ns aa o adresare ctre structur va fi ncorect. Prelucrarea structurii are loc prin intermediul prelucrrii cmpurilor aparte din ea. Accesarea unui cmp din variabila de tip nregistrare care este n acela timp cmp al masivului va fi posibil folosind sintaxa: nume_msiv[k].Nume_cmp, unde k este numrul de ordine a nregistrii necesare. Exemplu: Pentru a nscrie n cmpul name din structura stud numele studentului cu numrul de ordine 2 vom folosi urmtoarea sintax: struct stud x[10]; gets(x[2].name).

    Not: De nu uitat c numrarea elementelor n masiv se face ncepnd cu indexul zero. n cazul nostru find alctuit un masiv din 10 structuri , numrul de ordine va varia de la 0 la 9. Exemplu: Este dat o baz de date cu n nscrieri ce conin informaia despre reuita unui grup de studeni. Dup notele date la examenele unei sesiuni de calculat nota medie pentru fiecare student. Cmpuri necesare: Numele, Grupa, Notele la examene, Balul mediu calculat:

    #include #include #include #include struct stud {char name[20], grupa[10];

  • 49

    int ex1,ex2; float med;}; void main (void){ clrscr(); struct stud x[50]; int i,N; printf("Culege numarul studentilor\n"); scanf("%d",&N); printf("Culege informatia despre %d studenti:\n",N); for (i=0; i

  • 50

    respectiv asigurnd-o cu informaia necesar pentru prelucrare. Folosirea funciilor n C++ presupune respectarea urmtoarelor concepii de baz:

    a) Funciile grupeaz setul de operatori pentru ndeplinirea unei sarcini concrete. b) Programul principal apeleaz la funcie, adresndu-se la numele ei, dup care

    urmeaz paranteze rotunde. Exemplu: afiare(). c) Dup terminarea prelucrrii informaiei, majoritatea funciilor ntorc

    programului principal valori de tipuri concrete. De exemplu: int sau float, care pot fi folosite n calcule.

    d) Programul principal transmite funciilor parametrii (informaia iniial), inclus n paranteze rotunde, care urmeaz dup numele funciei.

    e) Limbajul C++ folosete prototipi de funcie pentru determinarea tipului valorii returnate de ctre funcie, deasemenea a cantitii si tipurilor parametrilor transmii funciei. Odat cu mrirea volumului i complicitii programului, folosirea funciilor va

    deveni condiia principala pentru rezolvarea eficient i corect. n acelai moment crearea i folosirea funciilor snt proceduri simple.

    n timpul crerii programului e necesar de rezervat fiecare funcie pentru rezolvarea unei sarcini. Dac apar situaii, cnd funcia rezolv cteva sarcini, ea trebuie divizat n cteva funcii mai mici. Fiecare funcie creat trebuie s primeasc un nume unical. Ca i n cazul cu variabilele, numele unei funcii este un identificator i e de dorit s corespund cu sensul logic al sarcinei pe care o ndeplinete.

    Funciile n C++ se aseamn la structur cu funcia principal main(). n faa numelui funciei se indic tipul ei, iar dup numele funciei urmeaz lista de parametri descrii nuntrul parantezelor rotunde. Corpul funciei compus din operatori este amplasat dup descrierea parametrilor i-i nconjurat cu acolade deschis i nchis. Sintaxa descrierii unei funcii este urmtoarea:

    tip_f nume_f (lista parametri) {declarare de variabile; operatori;} unde tip_f este tipul funciei sau tipul valorii returnate de funcie, nume_f este numele funciei. Dac facem analogie dintre funcie i programul principal main( ), atunci putem scrie: void main (void) {corpul programului}, unde funcia nu ntoarce rezultate (cuvntul void naintea funciei main() ) i nu primete parametri din exterior (cuvntul void ntre paranteze rotunde dup funcia main() ).

    Urmtorii operatori determin funcia cu numele afiare(), care afiaz la monitor un mesaj: void afiare (void) {printf(Hello World\n);}

    Dup cum a fost spus, cuvntul void ce precedeaz numele afiare indic funciei c nu trebuie de ntors vre-o valoare n program, iar cuvntul void dup

  • 51

    numele afiare indic (compilatorului C++ i programatorului ce citete acest cod) c funcia nu folosete parametri (informaie iniial pentru ndeplinirea sarcinei).

    Urmtorul program folosete funcia afiare() pentru afiarea mesajului pe ecran: # include # include void afisare (void) { printf(\ Hello World\n); void main (void) { puts (inaintea folosirii funciei); afisare( ); puts (dupa folosirea funciei); getch(); }

    Ca i orice program n C++ acest exemplu va fi ndeplinit ncepnd de la funcia principal main( ). nuntru programului operatorul de apel la funcie apeleaz la funcia de afiare astfel: afiare(); unde parantezele rotunde dup identificator indic compilatorului c n program se folosete funcia afiare(). Cnd programul va ntlni apelul la funcie, se va ncepe ndeplinirea tuturor operatorilor din corpul funciei, i dup aceasta executarea programului principal va fi continuat cu operatorul amplasat nemijlocit dup operatorul de apel la funcie. Urmtorul program-exemplu conine dou funcii, prima afiaz pe ecran o salutare, iar a doua tema leciei:

    # include # include void hello (void){ printf(\n Hello\n);} void tema (void){ printf(Funcii in C++\n);} void main (void){ hello(); tema(); }

    n rezultatul ndeplinirii acestui exemplu vor fi afiate pe ecran dou mesaje: Hello i Funcii n C++ , n ordinea cum apar n program.

    Funciile prezentate mai sus ndeplinesc sarcini foarte simple. n aceste cazuri programul putea fi alctuit fr folosirea funciilor, cu includerea acelorai operatori n corpul funciei main(). ns funciile au fost folosite pentru a analiza descrierea i folosirea ulterioar a funciilor. n timpul rezolvrii problemelor complicate va fi posibil, n aa fel, de simplificat rezolvarea, mprind sarcina n module aparte realizate de funcii. n acest caz va fi simplu de observat c analiza i modificarea

  • 52

    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 void numr (int a) { printf(Parametru=%d\n,a);} void main (void)