71
UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica CAIET DE PRACTICA 1

Caiet Practica - Limbajul c Si Mathlab

  • Upload
    roman

  • View
    1.182

  • Download
    2

Embed Size (px)

DESCRIPTION

Caiet Practica - Limbajul c Si Mathlab - notiuni de baza si cateva mici exemple

Citation preview

Page 1: Caiet Practica - Limbajul c Si Mathlab

UNIVERSITATEA DIN CRAIOVAFacultatea de Automatica Calculatoare si Electronica

CAIET DE PRACTICA

Student Roman Aurel

1

Craiova 2008

CUPRINS

CAPITOLUL IELEMENTE DE BAZĂ ALE LIMBAJULUI Chelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag3

CAPITOLUL IIOPERATORI SI EXPRESIIhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag17

CAPITOLUL IIISTRUCTURA PROGRAMELOR IN Chelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag35

CAPITOLUL IVPREPROCESAREhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag36

CAPITOLUL VINTRARIIESIRI STANDARDhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag38

CAPITOLUL VILIMBAJUL MATLABhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag45

2

CAPITOLUL I ELEMENTE DE BAZĂ ALE LIMBAJULUI

Vocabularul

Icircn scrierea programelor icircn limbajul CC++ pot fi folosite doar anumite simboluri care alcătuiesc alfabetul limbajului Acesta cuprinde Literele mari sau mici de la A la Z (a-z) Caracterul subliniere ( _ underscore) folosit de obicei ca element de legătura icircntre cuvintele

compuse Cifrele zecimale (0-9) Simboluri speciale

Caractere operatori (Exemple + =) delimitatori (Exemple blank (spaţiu) tab t newline n cu rolul de a separa

cuvintele) Grupuri (perechi de caractere)

Grupurile de caractere numire adesea separatori pot fi ( ) - Icircncadrează lista de argumente ale unei funcţii sau sunt folosite icircn expresii pentru

schimbarea ordinii de efectuare a operaţiilor (icircn ultimul caz fiind operator) - Icircncadrează instrucţiunile compuse - Indică icircnceputul unui comentariu care se poate icircntinde pacircnă la sfacircrşitul liniei - Indică icircnceputul şi sfacircrşitul unui comentariu care poate cuprinde mai multe linii - Icircncadrează o constantă şir (un şir de caractere) - Icircncadrează o constantă caracter (un caracter imprimabil sau o secvenţă escape)

Unitatile lexicale

Unităţile lexicale (cuvintele) limbajului CC++ reprezintă grupuri de caractere cu o semnificaţie de sine stătătoare Acestea sunt Identificatori Cuvinte cheie ale limbajului

Identificatorii reprezintă numele unor date (constante sau variabile) sau ale unor funcţii Identificatorul este format dintr-un şir de litere cifre sau caracterul de subliniere

(underscore) trebuie să icircnceapă cu o literă sau cu caracterul de subliniere şi să fie sugestivi

Exemple viteză greutate_netă Viteza Viteza1 GreutateNetă

3

Identificatorii pot conţine litere mici sau mari dar limbajul C++ este senzitiv la majuscule şi minuscule (case-sensitive) Astfel identificatorii viteza şi Viteza sunt diferiţi

Nu pot fi folosiţi ca identificatori cuvintele cheie Identificatorii pot fi standard (ca de exemplu numele unor funcţii predefinite scanf clear etc) sau aleşi de utilizatorMultimea caracterelor

Icircn programele C pot fi utilizate doua multimi de caractere Multimea caracterelor C si multimea caracterelor C reprezentabileMultimea caracterelor C se compune din litere cifre semne depunctuatie care au o

semnificatie specifica pentru compilatorul CProgramele C sunt formate din combinatii ale caracterelor din multimea de caractere C constituite icircn instructiuni semnificative Multimea caracterelor C este o submultime a multimii caracterelor Creprezentabile Multimea caracterelor reprezentabile este formata din totalitatea literelor cifrelor si simbolurilor grafice Dimensiunea multimii de caractere reprezentabile depinde de tipul de terminalconsola etc Fiecare caracter din multimea caracter din multimea caracterelor C are un icircnteles explicit pentru compilatorul C Compilatorul da mesaje de eroare cacircnd icircntacirclneste caractere icircntrebuintate gresit sau caractere care nu apartin multimii caracterelor Icircn continuare sunt descrise caracterele si simbolurile din multimeacaracterelor C si utilizarea acestora

Litere si numere

Multimea caracterelor C include literele mari si mici ale alfabetului englez si cifrele zecimale din sistemul de numere arabe Literele mari si mici ale alfabetului englez sunt urmatoareleA B C D E F G H I J K L M N O P R S T U V W X Y Za b c d e f g h i j k l m n o p r s t u v w x y ziar cifrele zecimale0 1 2 3 4 5 6 7 8 9

Aceste litere si cifre pot fi folosite pentru a forma constanteidentificatori si cuvinte cheie Compilatorul C prelucreaza litere marisi mici icircn mod distinct

Caractere whitespace

Spatiul tab-ul linefeed (linie noua) carriage return (revenire la capatul racircndului) form feed tab-ul vertical si newline sunt numite caractere whitespace deoarece servesc pentru spatiere icircntre cuvinte aliniere la o noua coloana salt la linie noua Aceste caractere separa instructiuni definite de utilizator constante si identificatori de celelalte instructiuni dintr-un program Compilatorul C ignora caracterele whitespace daca nu sunt folosite ca separatori sau 54 drept componente de constante sau ca siruri de caractere Caracterele whitespace sunt utilizate pentru a face programele mai lizibile Comentariile sunt de asemenea tratate ca whitespace

Caractere speciale si de punctuatie

4

Caracterele speciale si de punctuatie din multimea caracterelor C sunt folosite pentru mai multe scopuri Tabelul urmatorprezinta aceste caractere Aceste caractere au o semnificatie speciala pentru compilatorul de C Caracterele de punctuatie din setul de caractere reprezentabile C care nu apar icircn acest tabel pot fi utilizate numai icircn siruri constant caracter si comentarii

Caracter Nume Caracter Nume

Virgula Semnulexclamarii Punct | Bara verticala Punct si virgula Slash Doua puncte Backslash Semnulicircntrebarii~ Tildarsquo Apostrof _ Underscorerdquo Ghilimele Diez( Parantezastacircnga Procent) Parantezadreaptaamp Ampersand[ Parantezadreapta stacircnga^ Sageata sus] Parantezadreapta dreapta Asterisc Acolada stacircnga - Minus Acolada dreapta = Egalgt Mai mare + Pluslt Mai mic

Secvente escape

Secventele escape sunt combinatii speciale de caractere formate din whitespace si caractere negrafice constituite icircn siruri si constante caracter Ele sunt icircn mod tipic utilizate pentru a specifica 55 actiuni precum carriage return si tab pe terminale si imprimante si pentru a furniza reprezentarea caracterelor care normal au icircnteles special cum ar fi ghilimelele (rdquo) O secventa escape consta dintr-un backslash urmat de o litera sau combinatii de cifre Setul complet de secvente escape cuprindea caracterul BEL - activare sunet

5

b caracterul BS (backspace) - revenire cu un spatiuf caracterul FF (form feed) - salt de pagina la imprimantan caracterul LF (line feed) - racircnd nour caracterul CR (carriage return) - revenire la coloana 1t caracterul HT (horizontal tab) - tab orizontalv caracterul VT (vertical tab) - tab vertical caracterul (backslash) caracterul (double qoute) - ghilimele caracterul (single qoute) - apostrof0 caracterul NULLooo - constanta octalaxhh - constanta hexazecimala

Backslash-ul care precede un caracter neinclus icircn lista de mai sus este ignorat si acest caracter este reprezentat ca un literal De exemplu forma bdquocrdquo reprezinta caracterul c icircntr-un literal sau icircntr-o constanta caracter Secventele ooo si xdd permit scrierea oricarui caracter din setul ASCII ca un numar octal format din trei cifre sau ca un numar hexagesimal format din doua cifre

Exemplu

6 x6 6 ASCII60 x30 48 ASCII137 x5f 95 ASCII

Numai cifrele octale (de la 0 la 7) pot apare icircntr-o secventa escape octala si trebuie sa apara cel putin o cifra De exemplu caracterul backspace poate fi scris ca bdquo10rdquo icircn loc de bdquo010rdquoSimilar o secventa hexagesimala poate sa contina cel putin o cifra iar a doua cifra poate fi omisa Totusi cacircnd se utilizeaza secvente escape icircn siruri este indicat sa se scrie toate cele trei cifre ale secventei Altfel caracterul care urmeaza dupa secventa escape ar putea fi interpretat ca o parte a secventei daca se icircntacircmpla sa fie o cifra octala sau hexagesiala De exemplu secventa 0331 este interpretata drept ESC si 1 Daca am scrie 331 omitacircnd primul zero atunci am avea o interpretare gresita56

Secventele escape permit caractere de control negrafice pentru a fi transmise catre display Caracterele negrafice trebuie totdeaunareprezentate ca secvente escape Plasacircnd necorespunzator un character negrafic icircn programe C el are rezultat imprevizibil

Identificatori

Identificatorii sunt nume ce sunt date variabilelor functiilor si etichetelor utilizate icircn program Un nume este o succesiune de litere si eventual cifre primul caracter fiind litera Icircn calitate de litere se pot utiliza literele mici si mari ale alfabetului englez precum si caracterul subliniere (_) Numarul de caractere care intra icircn componenta unui nume nu este limitat Numele sunt utilizate pentru a defini diferite variabile sau functii icircntr-un program C

6

Icircn mod implicit numai primele 32 de caractere dintr-un nume sunt luate icircn considerare adica doua nume sunt diferite daca ele difera icircn primele 32 de caractere ale lorExemple de nume a b1 a1b2c3 Fs _hG Nume nUME hellip

Se recomanda ca numele sa fie sugestive adica ele sa sugereze pe cacirct posibil scopul alegerii lor sau a datei pe care o reprezinta

Constante

O constantă este un literal (o formă externă de reprezentare) numeric caracter sau şir de caractere Numele şi valoarea unei constante sunt identice Valoarea unei constante nu poate fi schimbată icircn timpul execuţiei programului icircn care a fost utilizată Tipul şi valoarea ei sunt determinate icircn mod automat de către compilator pe baza caracterelor care compun literalul

Constante icircntregi

Constantele icircntregi sunt literali numerici (compuşi din cifre) fără punct zecimal Constante icircntregi icircn baza 10 8 sau 16

Constante icircntregi icircn baza 10Exemple 45

-78 constante icircntregi decimale (icircn baza 10) tip int Constante icircntregi octale

Dacă icircn faţa numărului apare cifra zero (0) acest lucru indică faptul că acea constantă este de tipul int in baza opt (constantă octală)Exemple

056077 constante icircntregi octale tip int

Constante icircntregi hexagesimaleDacă icircn faţa numărului apar caracterele zero (0) şi x (sau X) acest lucru indică faptul că acea constantă este de tipul int icircn baza 16 (constantă hexagesimală) Amintim că icircn baza 16 cifrele sunt 0-9 A (sau a) cu valoare 10 B (sau b) cu valoare 11 C (sau c) cu valoare 12 D (sau d) cu valoare 13 E (sau e) cu valoare 14 F (sau f) cu valoare 15Exemple

0x450x3A0Xbc constante icircntregi hexagesimale tip int

Constante icircntregi de tipuri derivate Dacă secvenţa de cifre este urmată de L sau l tipul constantei este long int

Exemple145677L897655l tip decimal long int

7

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 2: Caiet Practica - Limbajul c Si Mathlab

Craiova 2008

CUPRINS

CAPITOLUL IELEMENTE DE BAZĂ ALE LIMBAJULUI Chelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag3

CAPITOLUL IIOPERATORI SI EXPRESIIhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag17

CAPITOLUL IIISTRUCTURA PROGRAMELOR IN Chelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag35

CAPITOLUL IVPREPROCESAREhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag36

CAPITOLUL VINTRARIIESIRI STANDARDhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag38

CAPITOLUL VILIMBAJUL MATLABhelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphelliphellippag45

2

CAPITOLUL I ELEMENTE DE BAZĂ ALE LIMBAJULUI

Vocabularul

Icircn scrierea programelor icircn limbajul CC++ pot fi folosite doar anumite simboluri care alcătuiesc alfabetul limbajului Acesta cuprinde Literele mari sau mici de la A la Z (a-z) Caracterul subliniere ( _ underscore) folosit de obicei ca element de legătura icircntre cuvintele

compuse Cifrele zecimale (0-9) Simboluri speciale

Caractere operatori (Exemple + =) delimitatori (Exemple blank (spaţiu) tab t newline n cu rolul de a separa

cuvintele) Grupuri (perechi de caractere)

Grupurile de caractere numire adesea separatori pot fi ( ) - Icircncadrează lista de argumente ale unei funcţii sau sunt folosite icircn expresii pentru

schimbarea ordinii de efectuare a operaţiilor (icircn ultimul caz fiind operator) - Icircncadrează instrucţiunile compuse - Indică icircnceputul unui comentariu care se poate icircntinde pacircnă la sfacircrşitul liniei - Indică icircnceputul şi sfacircrşitul unui comentariu care poate cuprinde mai multe linii - Icircncadrează o constantă şir (un şir de caractere) - Icircncadrează o constantă caracter (un caracter imprimabil sau o secvenţă escape)

Unitatile lexicale

Unităţile lexicale (cuvintele) limbajului CC++ reprezintă grupuri de caractere cu o semnificaţie de sine stătătoare Acestea sunt Identificatori Cuvinte cheie ale limbajului

Identificatorii reprezintă numele unor date (constante sau variabile) sau ale unor funcţii Identificatorul este format dintr-un şir de litere cifre sau caracterul de subliniere

(underscore) trebuie să icircnceapă cu o literă sau cu caracterul de subliniere şi să fie sugestivi

Exemple viteză greutate_netă Viteza Viteza1 GreutateNetă

3

Identificatorii pot conţine litere mici sau mari dar limbajul C++ este senzitiv la majuscule şi minuscule (case-sensitive) Astfel identificatorii viteza şi Viteza sunt diferiţi

Nu pot fi folosiţi ca identificatori cuvintele cheie Identificatorii pot fi standard (ca de exemplu numele unor funcţii predefinite scanf clear etc) sau aleşi de utilizatorMultimea caracterelor

Icircn programele C pot fi utilizate doua multimi de caractere Multimea caracterelor C si multimea caracterelor C reprezentabileMultimea caracterelor C se compune din litere cifre semne depunctuatie care au o

semnificatie specifica pentru compilatorul CProgramele C sunt formate din combinatii ale caracterelor din multimea de caractere C constituite icircn instructiuni semnificative Multimea caracterelor C este o submultime a multimii caracterelor Creprezentabile Multimea caracterelor reprezentabile este formata din totalitatea literelor cifrelor si simbolurilor grafice Dimensiunea multimii de caractere reprezentabile depinde de tipul de terminalconsola etc Fiecare caracter din multimea caracter din multimea caracterelor C are un icircnteles explicit pentru compilatorul C Compilatorul da mesaje de eroare cacircnd icircntacirclneste caractere icircntrebuintate gresit sau caractere care nu apartin multimii caracterelor Icircn continuare sunt descrise caracterele si simbolurile din multimeacaracterelor C si utilizarea acestora

Litere si numere

Multimea caracterelor C include literele mari si mici ale alfabetului englez si cifrele zecimale din sistemul de numere arabe Literele mari si mici ale alfabetului englez sunt urmatoareleA B C D E F G H I J K L M N O P R S T U V W X Y Za b c d e f g h i j k l m n o p r s t u v w x y ziar cifrele zecimale0 1 2 3 4 5 6 7 8 9

Aceste litere si cifre pot fi folosite pentru a forma constanteidentificatori si cuvinte cheie Compilatorul C prelucreaza litere marisi mici icircn mod distinct

Caractere whitespace

Spatiul tab-ul linefeed (linie noua) carriage return (revenire la capatul racircndului) form feed tab-ul vertical si newline sunt numite caractere whitespace deoarece servesc pentru spatiere icircntre cuvinte aliniere la o noua coloana salt la linie noua Aceste caractere separa instructiuni definite de utilizator constante si identificatori de celelalte instructiuni dintr-un program Compilatorul C ignora caracterele whitespace daca nu sunt folosite ca separatori sau 54 drept componente de constante sau ca siruri de caractere Caracterele whitespace sunt utilizate pentru a face programele mai lizibile Comentariile sunt de asemenea tratate ca whitespace

Caractere speciale si de punctuatie

4

Caracterele speciale si de punctuatie din multimea caracterelor C sunt folosite pentru mai multe scopuri Tabelul urmatorprezinta aceste caractere Aceste caractere au o semnificatie speciala pentru compilatorul de C Caracterele de punctuatie din setul de caractere reprezentabile C care nu apar icircn acest tabel pot fi utilizate numai icircn siruri constant caracter si comentarii

Caracter Nume Caracter Nume

Virgula Semnulexclamarii Punct | Bara verticala Punct si virgula Slash Doua puncte Backslash Semnulicircntrebarii~ Tildarsquo Apostrof _ Underscorerdquo Ghilimele Diez( Parantezastacircnga Procent) Parantezadreaptaamp Ampersand[ Parantezadreapta stacircnga^ Sageata sus] Parantezadreapta dreapta Asterisc Acolada stacircnga - Minus Acolada dreapta = Egalgt Mai mare + Pluslt Mai mic

Secvente escape

Secventele escape sunt combinatii speciale de caractere formate din whitespace si caractere negrafice constituite icircn siruri si constante caracter Ele sunt icircn mod tipic utilizate pentru a specifica 55 actiuni precum carriage return si tab pe terminale si imprimante si pentru a furniza reprezentarea caracterelor care normal au icircnteles special cum ar fi ghilimelele (rdquo) O secventa escape consta dintr-un backslash urmat de o litera sau combinatii de cifre Setul complet de secvente escape cuprindea caracterul BEL - activare sunet

5

b caracterul BS (backspace) - revenire cu un spatiuf caracterul FF (form feed) - salt de pagina la imprimantan caracterul LF (line feed) - racircnd nour caracterul CR (carriage return) - revenire la coloana 1t caracterul HT (horizontal tab) - tab orizontalv caracterul VT (vertical tab) - tab vertical caracterul (backslash) caracterul (double qoute) - ghilimele caracterul (single qoute) - apostrof0 caracterul NULLooo - constanta octalaxhh - constanta hexazecimala

Backslash-ul care precede un caracter neinclus icircn lista de mai sus este ignorat si acest caracter este reprezentat ca un literal De exemplu forma bdquocrdquo reprezinta caracterul c icircntr-un literal sau icircntr-o constanta caracter Secventele ooo si xdd permit scrierea oricarui caracter din setul ASCII ca un numar octal format din trei cifre sau ca un numar hexagesimal format din doua cifre

Exemplu

6 x6 6 ASCII60 x30 48 ASCII137 x5f 95 ASCII

Numai cifrele octale (de la 0 la 7) pot apare icircntr-o secventa escape octala si trebuie sa apara cel putin o cifra De exemplu caracterul backspace poate fi scris ca bdquo10rdquo icircn loc de bdquo010rdquoSimilar o secventa hexagesimala poate sa contina cel putin o cifra iar a doua cifra poate fi omisa Totusi cacircnd se utilizeaza secvente escape icircn siruri este indicat sa se scrie toate cele trei cifre ale secventei Altfel caracterul care urmeaza dupa secventa escape ar putea fi interpretat ca o parte a secventei daca se icircntacircmpla sa fie o cifra octala sau hexagesiala De exemplu secventa 0331 este interpretata drept ESC si 1 Daca am scrie 331 omitacircnd primul zero atunci am avea o interpretare gresita56

Secventele escape permit caractere de control negrafice pentru a fi transmise catre display Caracterele negrafice trebuie totdeaunareprezentate ca secvente escape Plasacircnd necorespunzator un character negrafic icircn programe C el are rezultat imprevizibil

Identificatori

Identificatorii sunt nume ce sunt date variabilelor functiilor si etichetelor utilizate icircn program Un nume este o succesiune de litere si eventual cifre primul caracter fiind litera Icircn calitate de litere se pot utiliza literele mici si mari ale alfabetului englez precum si caracterul subliniere (_) Numarul de caractere care intra icircn componenta unui nume nu este limitat Numele sunt utilizate pentru a defini diferite variabile sau functii icircntr-un program C

6

Icircn mod implicit numai primele 32 de caractere dintr-un nume sunt luate icircn considerare adica doua nume sunt diferite daca ele difera icircn primele 32 de caractere ale lorExemple de nume a b1 a1b2c3 Fs _hG Nume nUME hellip

Se recomanda ca numele sa fie sugestive adica ele sa sugereze pe cacirct posibil scopul alegerii lor sau a datei pe care o reprezinta

Constante

O constantă este un literal (o formă externă de reprezentare) numeric caracter sau şir de caractere Numele şi valoarea unei constante sunt identice Valoarea unei constante nu poate fi schimbată icircn timpul execuţiei programului icircn care a fost utilizată Tipul şi valoarea ei sunt determinate icircn mod automat de către compilator pe baza caracterelor care compun literalul

Constante icircntregi

Constantele icircntregi sunt literali numerici (compuşi din cifre) fără punct zecimal Constante icircntregi icircn baza 10 8 sau 16

Constante icircntregi icircn baza 10Exemple 45

-78 constante icircntregi decimale (icircn baza 10) tip int Constante icircntregi octale

Dacă icircn faţa numărului apare cifra zero (0) acest lucru indică faptul că acea constantă este de tipul int in baza opt (constantă octală)Exemple

056077 constante icircntregi octale tip int

Constante icircntregi hexagesimaleDacă icircn faţa numărului apar caracterele zero (0) şi x (sau X) acest lucru indică faptul că acea constantă este de tipul int icircn baza 16 (constantă hexagesimală) Amintim că icircn baza 16 cifrele sunt 0-9 A (sau a) cu valoare 10 B (sau b) cu valoare 11 C (sau c) cu valoare 12 D (sau d) cu valoare 13 E (sau e) cu valoare 14 F (sau f) cu valoare 15Exemple

0x450x3A0Xbc constante icircntregi hexagesimale tip int

Constante icircntregi de tipuri derivate Dacă secvenţa de cifre este urmată de L sau l tipul constantei este long int

Exemple145677L897655l tip decimal long int

7

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 3: Caiet Practica - Limbajul c Si Mathlab

CAPITOLUL I ELEMENTE DE BAZĂ ALE LIMBAJULUI

Vocabularul

Icircn scrierea programelor icircn limbajul CC++ pot fi folosite doar anumite simboluri care alcătuiesc alfabetul limbajului Acesta cuprinde Literele mari sau mici de la A la Z (a-z) Caracterul subliniere ( _ underscore) folosit de obicei ca element de legătura icircntre cuvintele

compuse Cifrele zecimale (0-9) Simboluri speciale

Caractere operatori (Exemple + =) delimitatori (Exemple blank (spaţiu) tab t newline n cu rolul de a separa

cuvintele) Grupuri (perechi de caractere)

Grupurile de caractere numire adesea separatori pot fi ( ) - Icircncadrează lista de argumente ale unei funcţii sau sunt folosite icircn expresii pentru

schimbarea ordinii de efectuare a operaţiilor (icircn ultimul caz fiind operator) - Icircncadrează instrucţiunile compuse - Indică icircnceputul unui comentariu care se poate icircntinde pacircnă la sfacircrşitul liniei - Indică icircnceputul şi sfacircrşitul unui comentariu care poate cuprinde mai multe linii - Icircncadrează o constantă şir (un şir de caractere) - Icircncadrează o constantă caracter (un caracter imprimabil sau o secvenţă escape)

Unitatile lexicale

Unităţile lexicale (cuvintele) limbajului CC++ reprezintă grupuri de caractere cu o semnificaţie de sine stătătoare Acestea sunt Identificatori Cuvinte cheie ale limbajului

Identificatorii reprezintă numele unor date (constante sau variabile) sau ale unor funcţii Identificatorul este format dintr-un şir de litere cifre sau caracterul de subliniere

(underscore) trebuie să icircnceapă cu o literă sau cu caracterul de subliniere şi să fie sugestivi

Exemple viteză greutate_netă Viteza Viteza1 GreutateNetă

3

Identificatorii pot conţine litere mici sau mari dar limbajul C++ este senzitiv la majuscule şi minuscule (case-sensitive) Astfel identificatorii viteza şi Viteza sunt diferiţi

Nu pot fi folosiţi ca identificatori cuvintele cheie Identificatorii pot fi standard (ca de exemplu numele unor funcţii predefinite scanf clear etc) sau aleşi de utilizatorMultimea caracterelor

Icircn programele C pot fi utilizate doua multimi de caractere Multimea caracterelor C si multimea caracterelor C reprezentabileMultimea caracterelor C se compune din litere cifre semne depunctuatie care au o

semnificatie specifica pentru compilatorul CProgramele C sunt formate din combinatii ale caracterelor din multimea de caractere C constituite icircn instructiuni semnificative Multimea caracterelor C este o submultime a multimii caracterelor Creprezentabile Multimea caracterelor reprezentabile este formata din totalitatea literelor cifrelor si simbolurilor grafice Dimensiunea multimii de caractere reprezentabile depinde de tipul de terminalconsola etc Fiecare caracter din multimea caracter din multimea caracterelor C are un icircnteles explicit pentru compilatorul C Compilatorul da mesaje de eroare cacircnd icircntacirclneste caractere icircntrebuintate gresit sau caractere care nu apartin multimii caracterelor Icircn continuare sunt descrise caracterele si simbolurile din multimeacaracterelor C si utilizarea acestora

Litere si numere

Multimea caracterelor C include literele mari si mici ale alfabetului englez si cifrele zecimale din sistemul de numere arabe Literele mari si mici ale alfabetului englez sunt urmatoareleA B C D E F G H I J K L M N O P R S T U V W X Y Za b c d e f g h i j k l m n o p r s t u v w x y ziar cifrele zecimale0 1 2 3 4 5 6 7 8 9

Aceste litere si cifre pot fi folosite pentru a forma constanteidentificatori si cuvinte cheie Compilatorul C prelucreaza litere marisi mici icircn mod distinct

Caractere whitespace

Spatiul tab-ul linefeed (linie noua) carriage return (revenire la capatul racircndului) form feed tab-ul vertical si newline sunt numite caractere whitespace deoarece servesc pentru spatiere icircntre cuvinte aliniere la o noua coloana salt la linie noua Aceste caractere separa instructiuni definite de utilizator constante si identificatori de celelalte instructiuni dintr-un program Compilatorul C ignora caracterele whitespace daca nu sunt folosite ca separatori sau 54 drept componente de constante sau ca siruri de caractere Caracterele whitespace sunt utilizate pentru a face programele mai lizibile Comentariile sunt de asemenea tratate ca whitespace

Caractere speciale si de punctuatie

4

Caracterele speciale si de punctuatie din multimea caracterelor C sunt folosite pentru mai multe scopuri Tabelul urmatorprezinta aceste caractere Aceste caractere au o semnificatie speciala pentru compilatorul de C Caracterele de punctuatie din setul de caractere reprezentabile C care nu apar icircn acest tabel pot fi utilizate numai icircn siruri constant caracter si comentarii

Caracter Nume Caracter Nume

Virgula Semnulexclamarii Punct | Bara verticala Punct si virgula Slash Doua puncte Backslash Semnulicircntrebarii~ Tildarsquo Apostrof _ Underscorerdquo Ghilimele Diez( Parantezastacircnga Procent) Parantezadreaptaamp Ampersand[ Parantezadreapta stacircnga^ Sageata sus] Parantezadreapta dreapta Asterisc Acolada stacircnga - Minus Acolada dreapta = Egalgt Mai mare + Pluslt Mai mic

Secvente escape

Secventele escape sunt combinatii speciale de caractere formate din whitespace si caractere negrafice constituite icircn siruri si constante caracter Ele sunt icircn mod tipic utilizate pentru a specifica 55 actiuni precum carriage return si tab pe terminale si imprimante si pentru a furniza reprezentarea caracterelor care normal au icircnteles special cum ar fi ghilimelele (rdquo) O secventa escape consta dintr-un backslash urmat de o litera sau combinatii de cifre Setul complet de secvente escape cuprindea caracterul BEL - activare sunet

5

b caracterul BS (backspace) - revenire cu un spatiuf caracterul FF (form feed) - salt de pagina la imprimantan caracterul LF (line feed) - racircnd nour caracterul CR (carriage return) - revenire la coloana 1t caracterul HT (horizontal tab) - tab orizontalv caracterul VT (vertical tab) - tab vertical caracterul (backslash) caracterul (double qoute) - ghilimele caracterul (single qoute) - apostrof0 caracterul NULLooo - constanta octalaxhh - constanta hexazecimala

Backslash-ul care precede un caracter neinclus icircn lista de mai sus este ignorat si acest caracter este reprezentat ca un literal De exemplu forma bdquocrdquo reprezinta caracterul c icircntr-un literal sau icircntr-o constanta caracter Secventele ooo si xdd permit scrierea oricarui caracter din setul ASCII ca un numar octal format din trei cifre sau ca un numar hexagesimal format din doua cifre

Exemplu

6 x6 6 ASCII60 x30 48 ASCII137 x5f 95 ASCII

Numai cifrele octale (de la 0 la 7) pot apare icircntr-o secventa escape octala si trebuie sa apara cel putin o cifra De exemplu caracterul backspace poate fi scris ca bdquo10rdquo icircn loc de bdquo010rdquoSimilar o secventa hexagesimala poate sa contina cel putin o cifra iar a doua cifra poate fi omisa Totusi cacircnd se utilizeaza secvente escape icircn siruri este indicat sa se scrie toate cele trei cifre ale secventei Altfel caracterul care urmeaza dupa secventa escape ar putea fi interpretat ca o parte a secventei daca se icircntacircmpla sa fie o cifra octala sau hexagesiala De exemplu secventa 0331 este interpretata drept ESC si 1 Daca am scrie 331 omitacircnd primul zero atunci am avea o interpretare gresita56

Secventele escape permit caractere de control negrafice pentru a fi transmise catre display Caracterele negrafice trebuie totdeaunareprezentate ca secvente escape Plasacircnd necorespunzator un character negrafic icircn programe C el are rezultat imprevizibil

Identificatori

Identificatorii sunt nume ce sunt date variabilelor functiilor si etichetelor utilizate icircn program Un nume este o succesiune de litere si eventual cifre primul caracter fiind litera Icircn calitate de litere se pot utiliza literele mici si mari ale alfabetului englez precum si caracterul subliniere (_) Numarul de caractere care intra icircn componenta unui nume nu este limitat Numele sunt utilizate pentru a defini diferite variabile sau functii icircntr-un program C

6

Icircn mod implicit numai primele 32 de caractere dintr-un nume sunt luate icircn considerare adica doua nume sunt diferite daca ele difera icircn primele 32 de caractere ale lorExemple de nume a b1 a1b2c3 Fs _hG Nume nUME hellip

Se recomanda ca numele sa fie sugestive adica ele sa sugereze pe cacirct posibil scopul alegerii lor sau a datei pe care o reprezinta

Constante

O constantă este un literal (o formă externă de reprezentare) numeric caracter sau şir de caractere Numele şi valoarea unei constante sunt identice Valoarea unei constante nu poate fi schimbată icircn timpul execuţiei programului icircn care a fost utilizată Tipul şi valoarea ei sunt determinate icircn mod automat de către compilator pe baza caracterelor care compun literalul

Constante icircntregi

Constantele icircntregi sunt literali numerici (compuşi din cifre) fără punct zecimal Constante icircntregi icircn baza 10 8 sau 16

Constante icircntregi icircn baza 10Exemple 45

-78 constante icircntregi decimale (icircn baza 10) tip int Constante icircntregi octale

Dacă icircn faţa numărului apare cifra zero (0) acest lucru indică faptul că acea constantă este de tipul int in baza opt (constantă octală)Exemple

056077 constante icircntregi octale tip int

Constante icircntregi hexagesimaleDacă icircn faţa numărului apar caracterele zero (0) şi x (sau X) acest lucru indică faptul că acea constantă este de tipul int icircn baza 16 (constantă hexagesimală) Amintim că icircn baza 16 cifrele sunt 0-9 A (sau a) cu valoare 10 B (sau b) cu valoare 11 C (sau c) cu valoare 12 D (sau d) cu valoare 13 E (sau e) cu valoare 14 F (sau f) cu valoare 15Exemple

0x450x3A0Xbc constante icircntregi hexagesimale tip int

Constante icircntregi de tipuri derivate Dacă secvenţa de cifre este urmată de L sau l tipul constantei este long int

Exemple145677L897655l tip decimal long int

7

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 4: Caiet Practica - Limbajul c Si Mathlab

Identificatorii pot conţine litere mici sau mari dar limbajul C++ este senzitiv la majuscule şi minuscule (case-sensitive) Astfel identificatorii viteza şi Viteza sunt diferiţi

Nu pot fi folosiţi ca identificatori cuvintele cheie Identificatorii pot fi standard (ca de exemplu numele unor funcţii predefinite scanf clear etc) sau aleşi de utilizatorMultimea caracterelor

Icircn programele C pot fi utilizate doua multimi de caractere Multimea caracterelor C si multimea caracterelor C reprezentabileMultimea caracterelor C se compune din litere cifre semne depunctuatie care au o

semnificatie specifica pentru compilatorul CProgramele C sunt formate din combinatii ale caracterelor din multimea de caractere C constituite icircn instructiuni semnificative Multimea caracterelor C este o submultime a multimii caracterelor Creprezentabile Multimea caracterelor reprezentabile este formata din totalitatea literelor cifrelor si simbolurilor grafice Dimensiunea multimii de caractere reprezentabile depinde de tipul de terminalconsola etc Fiecare caracter din multimea caracter din multimea caracterelor C are un icircnteles explicit pentru compilatorul C Compilatorul da mesaje de eroare cacircnd icircntacirclneste caractere icircntrebuintate gresit sau caractere care nu apartin multimii caracterelor Icircn continuare sunt descrise caracterele si simbolurile din multimeacaracterelor C si utilizarea acestora

Litere si numere

Multimea caracterelor C include literele mari si mici ale alfabetului englez si cifrele zecimale din sistemul de numere arabe Literele mari si mici ale alfabetului englez sunt urmatoareleA B C D E F G H I J K L M N O P R S T U V W X Y Za b c d e f g h i j k l m n o p r s t u v w x y ziar cifrele zecimale0 1 2 3 4 5 6 7 8 9

Aceste litere si cifre pot fi folosite pentru a forma constanteidentificatori si cuvinte cheie Compilatorul C prelucreaza litere marisi mici icircn mod distinct

Caractere whitespace

Spatiul tab-ul linefeed (linie noua) carriage return (revenire la capatul racircndului) form feed tab-ul vertical si newline sunt numite caractere whitespace deoarece servesc pentru spatiere icircntre cuvinte aliniere la o noua coloana salt la linie noua Aceste caractere separa instructiuni definite de utilizator constante si identificatori de celelalte instructiuni dintr-un program Compilatorul C ignora caracterele whitespace daca nu sunt folosite ca separatori sau 54 drept componente de constante sau ca siruri de caractere Caracterele whitespace sunt utilizate pentru a face programele mai lizibile Comentariile sunt de asemenea tratate ca whitespace

Caractere speciale si de punctuatie

4

Caracterele speciale si de punctuatie din multimea caracterelor C sunt folosite pentru mai multe scopuri Tabelul urmatorprezinta aceste caractere Aceste caractere au o semnificatie speciala pentru compilatorul de C Caracterele de punctuatie din setul de caractere reprezentabile C care nu apar icircn acest tabel pot fi utilizate numai icircn siruri constant caracter si comentarii

Caracter Nume Caracter Nume

Virgula Semnulexclamarii Punct | Bara verticala Punct si virgula Slash Doua puncte Backslash Semnulicircntrebarii~ Tildarsquo Apostrof _ Underscorerdquo Ghilimele Diez( Parantezastacircnga Procent) Parantezadreaptaamp Ampersand[ Parantezadreapta stacircnga^ Sageata sus] Parantezadreapta dreapta Asterisc Acolada stacircnga - Minus Acolada dreapta = Egalgt Mai mare + Pluslt Mai mic

Secvente escape

Secventele escape sunt combinatii speciale de caractere formate din whitespace si caractere negrafice constituite icircn siruri si constante caracter Ele sunt icircn mod tipic utilizate pentru a specifica 55 actiuni precum carriage return si tab pe terminale si imprimante si pentru a furniza reprezentarea caracterelor care normal au icircnteles special cum ar fi ghilimelele (rdquo) O secventa escape consta dintr-un backslash urmat de o litera sau combinatii de cifre Setul complet de secvente escape cuprindea caracterul BEL - activare sunet

5

b caracterul BS (backspace) - revenire cu un spatiuf caracterul FF (form feed) - salt de pagina la imprimantan caracterul LF (line feed) - racircnd nour caracterul CR (carriage return) - revenire la coloana 1t caracterul HT (horizontal tab) - tab orizontalv caracterul VT (vertical tab) - tab vertical caracterul (backslash) caracterul (double qoute) - ghilimele caracterul (single qoute) - apostrof0 caracterul NULLooo - constanta octalaxhh - constanta hexazecimala

Backslash-ul care precede un caracter neinclus icircn lista de mai sus este ignorat si acest caracter este reprezentat ca un literal De exemplu forma bdquocrdquo reprezinta caracterul c icircntr-un literal sau icircntr-o constanta caracter Secventele ooo si xdd permit scrierea oricarui caracter din setul ASCII ca un numar octal format din trei cifre sau ca un numar hexagesimal format din doua cifre

Exemplu

6 x6 6 ASCII60 x30 48 ASCII137 x5f 95 ASCII

Numai cifrele octale (de la 0 la 7) pot apare icircntr-o secventa escape octala si trebuie sa apara cel putin o cifra De exemplu caracterul backspace poate fi scris ca bdquo10rdquo icircn loc de bdquo010rdquoSimilar o secventa hexagesimala poate sa contina cel putin o cifra iar a doua cifra poate fi omisa Totusi cacircnd se utilizeaza secvente escape icircn siruri este indicat sa se scrie toate cele trei cifre ale secventei Altfel caracterul care urmeaza dupa secventa escape ar putea fi interpretat ca o parte a secventei daca se icircntacircmpla sa fie o cifra octala sau hexagesiala De exemplu secventa 0331 este interpretata drept ESC si 1 Daca am scrie 331 omitacircnd primul zero atunci am avea o interpretare gresita56

Secventele escape permit caractere de control negrafice pentru a fi transmise catre display Caracterele negrafice trebuie totdeaunareprezentate ca secvente escape Plasacircnd necorespunzator un character negrafic icircn programe C el are rezultat imprevizibil

Identificatori

Identificatorii sunt nume ce sunt date variabilelor functiilor si etichetelor utilizate icircn program Un nume este o succesiune de litere si eventual cifre primul caracter fiind litera Icircn calitate de litere se pot utiliza literele mici si mari ale alfabetului englez precum si caracterul subliniere (_) Numarul de caractere care intra icircn componenta unui nume nu este limitat Numele sunt utilizate pentru a defini diferite variabile sau functii icircntr-un program C

6

Icircn mod implicit numai primele 32 de caractere dintr-un nume sunt luate icircn considerare adica doua nume sunt diferite daca ele difera icircn primele 32 de caractere ale lorExemple de nume a b1 a1b2c3 Fs _hG Nume nUME hellip

Se recomanda ca numele sa fie sugestive adica ele sa sugereze pe cacirct posibil scopul alegerii lor sau a datei pe care o reprezinta

Constante

O constantă este un literal (o formă externă de reprezentare) numeric caracter sau şir de caractere Numele şi valoarea unei constante sunt identice Valoarea unei constante nu poate fi schimbată icircn timpul execuţiei programului icircn care a fost utilizată Tipul şi valoarea ei sunt determinate icircn mod automat de către compilator pe baza caracterelor care compun literalul

Constante icircntregi

Constantele icircntregi sunt literali numerici (compuşi din cifre) fără punct zecimal Constante icircntregi icircn baza 10 8 sau 16

Constante icircntregi icircn baza 10Exemple 45

-78 constante icircntregi decimale (icircn baza 10) tip int Constante icircntregi octale

Dacă icircn faţa numărului apare cifra zero (0) acest lucru indică faptul că acea constantă este de tipul int in baza opt (constantă octală)Exemple

056077 constante icircntregi octale tip int

Constante icircntregi hexagesimaleDacă icircn faţa numărului apar caracterele zero (0) şi x (sau X) acest lucru indică faptul că acea constantă este de tipul int icircn baza 16 (constantă hexagesimală) Amintim că icircn baza 16 cifrele sunt 0-9 A (sau a) cu valoare 10 B (sau b) cu valoare 11 C (sau c) cu valoare 12 D (sau d) cu valoare 13 E (sau e) cu valoare 14 F (sau f) cu valoare 15Exemple

0x450x3A0Xbc constante icircntregi hexagesimale tip int

Constante icircntregi de tipuri derivate Dacă secvenţa de cifre este urmată de L sau l tipul constantei este long int

Exemple145677L897655l tip decimal long int

7

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 5: Caiet Practica - Limbajul c Si Mathlab

Caracterele speciale si de punctuatie din multimea caracterelor C sunt folosite pentru mai multe scopuri Tabelul urmatorprezinta aceste caractere Aceste caractere au o semnificatie speciala pentru compilatorul de C Caracterele de punctuatie din setul de caractere reprezentabile C care nu apar icircn acest tabel pot fi utilizate numai icircn siruri constant caracter si comentarii

Caracter Nume Caracter Nume

Virgula Semnulexclamarii Punct | Bara verticala Punct si virgula Slash Doua puncte Backslash Semnulicircntrebarii~ Tildarsquo Apostrof _ Underscorerdquo Ghilimele Diez( Parantezastacircnga Procent) Parantezadreaptaamp Ampersand[ Parantezadreapta stacircnga^ Sageata sus] Parantezadreapta dreapta Asterisc Acolada stacircnga - Minus Acolada dreapta = Egalgt Mai mare + Pluslt Mai mic

Secvente escape

Secventele escape sunt combinatii speciale de caractere formate din whitespace si caractere negrafice constituite icircn siruri si constante caracter Ele sunt icircn mod tipic utilizate pentru a specifica 55 actiuni precum carriage return si tab pe terminale si imprimante si pentru a furniza reprezentarea caracterelor care normal au icircnteles special cum ar fi ghilimelele (rdquo) O secventa escape consta dintr-un backslash urmat de o litera sau combinatii de cifre Setul complet de secvente escape cuprindea caracterul BEL - activare sunet

5

b caracterul BS (backspace) - revenire cu un spatiuf caracterul FF (form feed) - salt de pagina la imprimantan caracterul LF (line feed) - racircnd nour caracterul CR (carriage return) - revenire la coloana 1t caracterul HT (horizontal tab) - tab orizontalv caracterul VT (vertical tab) - tab vertical caracterul (backslash) caracterul (double qoute) - ghilimele caracterul (single qoute) - apostrof0 caracterul NULLooo - constanta octalaxhh - constanta hexazecimala

Backslash-ul care precede un caracter neinclus icircn lista de mai sus este ignorat si acest caracter este reprezentat ca un literal De exemplu forma bdquocrdquo reprezinta caracterul c icircntr-un literal sau icircntr-o constanta caracter Secventele ooo si xdd permit scrierea oricarui caracter din setul ASCII ca un numar octal format din trei cifre sau ca un numar hexagesimal format din doua cifre

Exemplu

6 x6 6 ASCII60 x30 48 ASCII137 x5f 95 ASCII

Numai cifrele octale (de la 0 la 7) pot apare icircntr-o secventa escape octala si trebuie sa apara cel putin o cifra De exemplu caracterul backspace poate fi scris ca bdquo10rdquo icircn loc de bdquo010rdquoSimilar o secventa hexagesimala poate sa contina cel putin o cifra iar a doua cifra poate fi omisa Totusi cacircnd se utilizeaza secvente escape icircn siruri este indicat sa se scrie toate cele trei cifre ale secventei Altfel caracterul care urmeaza dupa secventa escape ar putea fi interpretat ca o parte a secventei daca se icircntacircmpla sa fie o cifra octala sau hexagesiala De exemplu secventa 0331 este interpretata drept ESC si 1 Daca am scrie 331 omitacircnd primul zero atunci am avea o interpretare gresita56

Secventele escape permit caractere de control negrafice pentru a fi transmise catre display Caracterele negrafice trebuie totdeaunareprezentate ca secvente escape Plasacircnd necorespunzator un character negrafic icircn programe C el are rezultat imprevizibil

Identificatori

Identificatorii sunt nume ce sunt date variabilelor functiilor si etichetelor utilizate icircn program Un nume este o succesiune de litere si eventual cifre primul caracter fiind litera Icircn calitate de litere se pot utiliza literele mici si mari ale alfabetului englez precum si caracterul subliniere (_) Numarul de caractere care intra icircn componenta unui nume nu este limitat Numele sunt utilizate pentru a defini diferite variabile sau functii icircntr-un program C

6

Icircn mod implicit numai primele 32 de caractere dintr-un nume sunt luate icircn considerare adica doua nume sunt diferite daca ele difera icircn primele 32 de caractere ale lorExemple de nume a b1 a1b2c3 Fs _hG Nume nUME hellip

Se recomanda ca numele sa fie sugestive adica ele sa sugereze pe cacirct posibil scopul alegerii lor sau a datei pe care o reprezinta

Constante

O constantă este un literal (o formă externă de reprezentare) numeric caracter sau şir de caractere Numele şi valoarea unei constante sunt identice Valoarea unei constante nu poate fi schimbată icircn timpul execuţiei programului icircn care a fost utilizată Tipul şi valoarea ei sunt determinate icircn mod automat de către compilator pe baza caracterelor care compun literalul

Constante icircntregi

Constantele icircntregi sunt literali numerici (compuşi din cifre) fără punct zecimal Constante icircntregi icircn baza 10 8 sau 16

Constante icircntregi icircn baza 10Exemple 45

-78 constante icircntregi decimale (icircn baza 10) tip int Constante icircntregi octale

Dacă icircn faţa numărului apare cifra zero (0) acest lucru indică faptul că acea constantă este de tipul int in baza opt (constantă octală)Exemple

056077 constante icircntregi octale tip int

Constante icircntregi hexagesimaleDacă icircn faţa numărului apar caracterele zero (0) şi x (sau X) acest lucru indică faptul că acea constantă este de tipul int icircn baza 16 (constantă hexagesimală) Amintim că icircn baza 16 cifrele sunt 0-9 A (sau a) cu valoare 10 B (sau b) cu valoare 11 C (sau c) cu valoare 12 D (sau d) cu valoare 13 E (sau e) cu valoare 14 F (sau f) cu valoare 15Exemple

0x450x3A0Xbc constante icircntregi hexagesimale tip int

Constante icircntregi de tipuri derivate Dacă secvenţa de cifre este urmată de L sau l tipul constantei este long int

Exemple145677L897655l tip decimal long int

7

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 6: Caiet Practica - Limbajul c Si Mathlab

b caracterul BS (backspace) - revenire cu un spatiuf caracterul FF (form feed) - salt de pagina la imprimantan caracterul LF (line feed) - racircnd nour caracterul CR (carriage return) - revenire la coloana 1t caracterul HT (horizontal tab) - tab orizontalv caracterul VT (vertical tab) - tab vertical caracterul (backslash) caracterul (double qoute) - ghilimele caracterul (single qoute) - apostrof0 caracterul NULLooo - constanta octalaxhh - constanta hexazecimala

Backslash-ul care precede un caracter neinclus icircn lista de mai sus este ignorat si acest caracter este reprezentat ca un literal De exemplu forma bdquocrdquo reprezinta caracterul c icircntr-un literal sau icircntr-o constanta caracter Secventele ooo si xdd permit scrierea oricarui caracter din setul ASCII ca un numar octal format din trei cifre sau ca un numar hexagesimal format din doua cifre

Exemplu

6 x6 6 ASCII60 x30 48 ASCII137 x5f 95 ASCII

Numai cifrele octale (de la 0 la 7) pot apare icircntr-o secventa escape octala si trebuie sa apara cel putin o cifra De exemplu caracterul backspace poate fi scris ca bdquo10rdquo icircn loc de bdquo010rdquoSimilar o secventa hexagesimala poate sa contina cel putin o cifra iar a doua cifra poate fi omisa Totusi cacircnd se utilizeaza secvente escape icircn siruri este indicat sa se scrie toate cele trei cifre ale secventei Altfel caracterul care urmeaza dupa secventa escape ar putea fi interpretat ca o parte a secventei daca se icircntacircmpla sa fie o cifra octala sau hexagesiala De exemplu secventa 0331 este interpretata drept ESC si 1 Daca am scrie 331 omitacircnd primul zero atunci am avea o interpretare gresita56

Secventele escape permit caractere de control negrafice pentru a fi transmise catre display Caracterele negrafice trebuie totdeaunareprezentate ca secvente escape Plasacircnd necorespunzator un character negrafic icircn programe C el are rezultat imprevizibil

Identificatori

Identificatorii sunt nume ce sunt date variabilelor functiilor si etichetelor utilizate icircn program Un nume este o succesiune de litere si eventual cifre primul caracter fiind litera Icircn calitate de litere se pot utiliza literele mici si mari ale alfabetului englez precum si caracterul subliniere (_) Numarul de caractere care intra icircn componenta unui nume nu este limitat Numele sunt utilizate pentru a defini diferite variabile sau functii icircntr-un program C

6

Icircn mod implicit numai primele 32 de caractere dintr-un nume sunt luate icircn considerare adica doua nume sunt diferite daca ele difera icircn primele 32 de caractere ale lorExemple de nume a b1 a1b2c3 Fs _hG Nume nUME hellip

Se recomanda ca numele sa fie sugestive adica ele sa sugereze pe cacirct posibil scopul alegerii lor sau a datei pe care o reprezinta

Constante

O constantă este un literal (o formă externă de reprezentare) numeric caracter sau şir de caractere Numele şi valoarea unei constante sunt identice Valoarea unei constante nu poate fi schimbată icircn timpul execuţiei programului icircn care a fost utilizată Tipul şi valoarea ei sunt determinate icircn mod automat de către compilator pe baza caracterelor care compun literalul

Constante icircntregi

Constantele icircntregi sunt literali numerici (compuşi din cifre) fără punct zecimal Constante icircntregi icircn baza 10 8 sau 16

Constante icircntregi icircn baza 10Exemple 45

-78 constante icircntregi decimale (icircn baza 10) tip int Constante icircntregi octale

Dacă icircn faţa numărului apare cifra zero (0) acest lucru indică faptul că acea constantă este de tipul int in baza opt (constantă octală)Exemple

056077 constante icircntregi octale tip int

Constante icircntregi hexagesimaleDacă icircn faţa numărului apar caracterele zero (0) şi x (sau X) acest lucru indică faptul că acea constantă este de tipul int icircn baza 16 (constantă hexagesimală) Amintim că icircn baza 16 cifrele sunt 0-9 A (sau a) cu valoare 10 B (sau b) cu valoare 11 C (sau c) cu valoare 12 D (sau d) cu valoare 13 E (sau e) cu valoare 14 F (sau f) cu valoare 15Exemple

0x450x3A0Xbc constante icircntregi hexagesimale tip int

Constante icircntregi de tipuri derivate Dacă secvenţa de cifre este urmată de L sau l tipul constantei este long int

Exemple145677L897655l tip decimal long int

7

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 7: Caiet Practica - Limbajul c Si Mathlab

Icircn mod implicit numai primele 32 de caractere dintr-un nume sunt luate icircn considerare adica doua nume sunt diferite daca ele difera icircn primele 32 de caractere ale lorExemple de nume a b1 a1b2c3 Fs _hG Nume nUME hellip

Se recomanda ca numele sa fie sugestive adica ele sa sugereze pe cacirct posibil scopul alegerii lor sau a datei pe care o reprezinta

Constante

O constantă este un literal (o formă externă de reprezentare) numeric caracter sau şir de caractere Numele şi valoarea unei constante sunt identice Valoarea unei constante nu poate fi schimbată icircn timpul execuţiei programului icircn care a fost utilizată Tipul şi valoarea ei sunt determinate icircn mod automat de către compilator pe baza caracterelor care compun literalul

Constante icircntregi

Constantele icircntregi sunt literali numerici (compuşi din cifre) fără punct zecimal Constante icircntregi icircn baza 10 8 sau 16

Constante icircntregi icircn baza 10Exemple 45

-78 constante icircntregi decimale (icircn baza 10) tip int Constante icircntregi octale

Dacă icircn faţa numărului apare cifra zero (0) acest lucru indică faptul că acea constantă este de tipul int in baza opt (constantă octală)Exemple

056077 constante icircntregi octale tip int

Constante icircntregi hexagesimaleDacă icircn faţa numărului apar caracterele zero (0) şi x (sau X) acest lucru indică faptul că acea constantă este de tipul int icircn baza 16 (constantă hexagesimală) Amintim că icircn baza 16 cifrele sunt 0-9 A (sau a) cu valoare 10 B (sau b) cu valoare 11 C (sau c) cu valoare 12 D (sau d) cu valoare 13 E (sau e) cu valoare 14 F (sau f) cu valoare 15Exemple

0x450x3A0Xbc constante icircntregi hexagesimale tip int

Constante icircntregi de tipuri derivate Dacă secvenţa de cifre este urmată de L sau l tipul constantei este long int

Exemple145677L897655l tip decimal long int

7

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 8: Caiet Practica - Limbajul c Si Mathlab

Dacă secvenţa de cifre este urmată de U sau u tipul constantei este unsigned intExemple

65555u Dacă secvenţa de cifre este urmată de U (u) şi L (l) tipul constantei este unsigned long

intExemple 7899UL tip decimal unsigned long int

Constante numerice reale

Dacă o constantă numerică conţine punctul zecimal ea este de tipul doubleExemplu

31459 tip double Dacă numărul este urmat de F sau f constante este de tip float Dacă numărul este urmat de L sau l este de tip long double

Exemplu045f tip float9788L tip long double

Constante reale icircn format ştiinţificNumărul poate fi urmat de caracterul e sau E şi de un număr icircntreg cu sau fără semn Icircn acest

caz constanta este icircn notaţie ştiinţifică Icircn această formă externă de reprezentare numărul din faţa literei E reprezintă mantisa iar numărul icircntreg care urmează caracterului E reprezintă exponentul In forma externă de reprezentare baza de numeraţie este 10 deci valoarea constantei va fi dată de mantisa 10

Exemplu15e-2 tip double icircn notaţie ştiinţifică valoare 15 10

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtinclude ltvalueshgtdefine PI 314359int main()coutltltTipul int memorat pe ltltsizeof(int)ltlt octetincoutltltTipul int memorat pe ltltsizeof(23)ltlt octetin 23-const zecimala intcoutltltInt maxim=ltltMAXINTltltrsquonrsquoconst simbolice MAXINT MAXLONG etc - definite in ltvalueshgtcoutltltConst octala 077 are val decimalaltlt077ltltrsquoncoutltltConst hexagesimala d3 are val decimalaltlt0xd3ltltrsquonrsquocoutltltTipul unsigned int memorat peltltsizeof(unsigned int)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23U)ltlt octetincoutltltTipul unsigned int memorat pe ltltsizeof(23u)ltlt octetin

8

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 9: Caiet Practica - Limbajul c Si Mathlab

coutltltTipul long int memorat pe ltltsizeof(long int)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23L)ltlt octetincoutltltTipul long int memorat pe ltltsizeof(23l)ltlt octetin23L sau 23l-const decimala long intcoutltltLong int maxim=ltltMAXLONGltltrsquonrsquocoutltltTipul unsigned long memorat pecoutltltsizeof(unsigned long int)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23UL)ltlt octetincoutltltTipul unsigned long memorat pe ltltsizeof(23ul)ltlt octetin23UL sau 23ul-const decimala unsigned long intcoutltltTipul long long int memorat pe coutltltsizeof(long long int)ltlt octetincoutltltTipul long long int memorat pe ltltsizeof(d)ltlt octetincoutltltTipul short int memorat pe ltltsizeof(short int)ltlt octetincoutltltShort int maxim=ltltMAXSHORTltltrsquonrsquocoutltltTipul float memorat pe ltltsizeof(float)ltlt octetincoutltltTipul float memorat pe ltltsizeof(237f)ltlt octetin237f-const decimala float coutltltFloat maxim=ltltMAXFLOATltltrsquonrsquocoutltltFloat minim=ltltMINFLOATltltrsquonrsquocoutltltTipul double memorat pe ltltsizeof(double)ltlt octetincoutltltTipul double memorat pe ltltsizeof(237)ltlt octetin237-const decimala double coutltltConst decim doubla in notatie stiintificaltlt237e-5ltltrsquonrsquocoutltltrdquoConst PI esterdquoltltPIltltrsquonrsquocoutltltrdquoConstanta PI este memorata perdquoltltsizeof(PI)ltltrdquooctetinrdquocoutltltDouble maxim=ltltMAXDOUBLEltltrsquonrsquoltltDouble minim=ltltMINDOUBLEltltrsquonrsquocoutltltTipul long double memorat pe ltltsizeof(long double)ltlt octetincoutltltTipul long double memorat pe ltltsizeof(237L)ltlt octetin237L-const decimala long double coutltltCifra A din HEXA are valltlt0xAltltncoutltltCifra B din HEXA are valltlt0XBltltncoutltltCifra C din HEXA are valltlt0xcltltncoutltlt Cifra D din HEXA are valltlt0xDltltncoutltlt Cifra E din HEXA are valltlt0XEltltncoutltlt Cifra F din HEXA are valltlt0xfltltncoutltltVal const hexa 0x7ac1e este ltlt0x7ac1eltltncoutltltVal const octale 171 este ltlt0171ltltncoutltltO const octala se memoreaza pe ltltsizeof(011)ltlt octetincoutltltO constoctlong se mem pe coutltltsizeof(011L)ltlt octetin

9

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 10: Caiet Practica - Limbajul c Si Mathlab

Constante caracter

Constantele caracter sunt icircncadrate icircntre apostroafeExemplu

a tip charO constantă caracter are ca valoare codul ASCII al caracterului pe care icircl reprezintă

Acest set de caractere are următoarele proprietăţi Fiecărui caracter icirci corespunde o valoare icircntreagă distinctă (ordinală) Valorile ordinale ale literelor mari sunt ordonate şi consecutive (A are codul ASCII 65 B ndash codul 66 C - codul 67 etc) Valorile ordinale ale literelor mici sunt ordonate şi consecutive (a are codul ASCII 97 b ndash codul 98 c - codul 99 etc) Valorile ordinale ale cifrelor sunt ordonate şi consecutive (0 are codul ASCII 48 1 - codul 49 2 - codul 50 etc) Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus icircntre apostroafe

ExempluConstantă caracter Valoare

lsquoArsquo 65lsquoarsquo 97lsquo0rsquo 48lsquorsquo 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof () şi backslash ()

Caracterul backslash se reprezintă Caracterul apostrof se reprezintă Constante caracter corespunzătoare caracterelor neimprimabile

Pentru caracterele neimprimabile se folosesc secvenţe escape O secvenţă escape furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut Icircn tabelul 22 sunt prezentate cacircteva caractere escape utilizate frecvent

Tabelul 22Constantă caracter

Valoare(Cod

ASCII)

Denumirea

caracterului

Utilizare

lsquonrsquo 10 LF racircnd nou (Line Feed)lsquotrsquo 9 HT tabulator orizontallsquorrsquo 13 CR poziţionează cursorul icircn coloana 1 din racircndul

curent

10

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 11: Caiet Practica - Limbajul c Si Mathlab

lsquofrsquo 12 FF salt de pagină la imprimantă (Form Feed)lsquoarsquo 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare icircnsă şi sub o formă icircn care se indică codul ASCII icircn octal al caracterului dorit

rsquodddrsquo unde d este o cifră octalăExemple

rsquo11rsquo (pentru rsquotrsquo) reprezintă constanta caracter backspace cu codul 9 icircn baza 10 deci codul 11 icircn baza 8

rsquo15rsquo (pentru rsquorrsquo)reprezintă constanta caracter CR cu codul 13 icircn baza 10 deci codul 11 icircn baza 8

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main(void)coutltltUn caracter este memorat pe ltltsizeof(char)ltlt octetncoutltltCaracterul escape n este memorat pe coutltltsizeof(n)ltlt octetncoutltltCaracterul escape n este memorat pe ltltsizeof(n)coutltlt octetncoutltltCaracterul 9 este memorat pe ltltsizeof(9)ltlt octetncoutltltBcoutltlt coutltltccoutltlttcoutltlttcoutltlt9coutltltbcoutltltacoutltltLcoutltltvcoutltltLcoutltltcoutltlttcoutltltcoutltltcoutltltncoutltltacoutltlt7

Constante şir de caractere

Constanta şir este o succesiune de zero sau mai multe caractere icircncadrate de ghilimele Icircn componenţa unui şir de caractere poate intra orice caracter deci şi caracterele escape Lungimea unui şir este practic nelimitată Dacă se doreşte continuarea unui şir pe racircndul următor se foloseşte caracterul backslash

Caracterele componente ale unui şir sunt memorate icircntr-o zonă continuă de memorie (la adrese succesive) Pentru fiecare caracter se memorează codul ASCII al acestuia După ultimul caracter al şirului compilatorul plasează automat caracterul NULL (0) caracter care reprezintă marcatorul sfacircrşitului de şir Numărul de octeţi pe care este memorat un şir va fi deci mai mare cu 1 decacirct numărul de caractere din şir

11

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 12: Caiet Practica - Limbajul c Si Mathlab

ExemplerdquoAcesta este un şir de caractererdquo constantă şir memorată pe 32 octeţirdquoŞir de caractere continuatrdquo

pe racircndul următorrdquo constantă şir memorată pe 45 octeţirdquoŞir t cu secvenţe escapenrdquo constantă şir memorată pe 26 octeţirsquonrsquo constantă caracter memorată pe un octet rdquonrdquo constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de

şir)rdquoaa4rdquo Şir memorat pe 4 octeţi

Pe primul octet codul ASCII al caracterului a Pe al doilea octet codul ASCII al caracterului escape a Pe al treilea octet codul ASCII al caracterului 4 Pe al patrulea octet terminatorul de şir NULL cod ASCII 0

rdquoASCIIrdquo Şir memorat pe 8 octeţiPe primul octet codul ASCII al caracterului backslahPe al doilea octet codul ASCII al caracterului A Pe al treilea octet codul ASCII al caracterului SPe al patrulea octet codul ASCII al caracterului SPe al 6-lea octet codul ASCII al caracterului IPe al 7-lea octet codul ASCII al caracterului IPe al 8-lea octet codul ASCII al caracterului backslahPe al 9-ea octet terminatorul de şir NULL de cod ASCII 0

rdquo1175ardquo Şir memorat pe 4 octeţi

Primul octet Codul ASCII al caracterul 1Al 2-lea octet codul ASCII 125 (175 in octal) al

caracterului Al 3-lea octet codul ASCII al caracterului aAl 4-lea octet codul ASCII 0 pentru terminatorul şirului

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuiainclude ltiostreamhgtvoid main() coutltltŞirul Ab9d este memorat peltltsizeof(Ab9d)ltlt octeţincoutltltŞirul Abcdt este memorat peltltsizeof(Abcdt)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul n este memorat pe ltltsizeof(n)ltlt octeţincoutltltŞirul ABCDE se memorează pe ltltsizeof(ABCDE)ltlt octeţin

12

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la terminal un şir de caractere se poate folosi funcţia gets Ea permite citirea cu ecou a caracterelor codului ASCII Funcţia gets are ca parametru adresa de icircnceput a zonei icircn care se păstrează caracterele citite De obicei această zonă de memorie poate

43

fi zona alocată unui tablou de tip char Funcţia gets returnează adresa de icircnceput a zonei icircn care s-au păstrat caracterele sau zero icircn cazul icircn care s-a icircntacirclnit sfacircrşitul de fişier

Icircn zona receptoare sunt păstrate caracterele tastate pe un racircnd adică toate caracterele care au fost tastate icircnainte de a acţiona tasta ENTER Caracterul generat la acţionarea tastei ENTER nu este păstrat icircn zona receptoare Icircn locul lui se păstrează caracterul NUL (lsquo0rsquo) Icircn felul acesta caracterele păstrate icircn zona receptoare definesc un şir de caractere

Funcţia puts realizează operaţia inversă faţă de funcţia gets Ea afişează la terminal caracterul şirului de caractere ASCII aflate icircntr-o zonă de memorie Adresa de icircnceput a acestei zone de memorie este parametrul funcţiei puts După afişarea ultimului caracter cursorul este trecut automat la icircnceputul racircndului următor Funcţia puts returnează codul ASCII al ultimului caracter afişat sau ndash1 icircn caz de eroare

CAPITOLUL VI LIMBAJUL MATLAB

MATLABreg = Limbaj de icircnaltă performanţă pentru proiectarea asistată de calculator

44

MATLAB este icircn acelaşi timp un limbaj de programare şi un sistem de dezvoltare care integrează calculul vizualizarea şi programarea icircntr-un mediu uşor de utilizat (easy-to-use) problemele şi soluţiile acestor probleme fiind exprimate icircntr-un limbaj matematic accesibilDomenii de utilizare bull Matematică şi calcul numeric bull Dezvoltarea algoritmilor bull Modelare simulare şi testarea prototipurilor bull Analiza şi vizualizarea datelor bull Grafica inginerească şi din ştiinţele aplicate bull Dezvoltarea de aplicaţii inclusiv GUI1048766 MATLAB = sistem interactiv care are ca element de bază tabloul ceea ce permite rezolvarea problemelor de calcul numeric icircn special cele care necesită prelucrarea de vectori sau matrici1048766 Numele MATLAB provine de la Matrix laboratoryFirma producătoare este The MathWorks Inc SUA

DesktopFereastra de lucruDirectorul Workspace

Interfaţa de aplicaţii program a MATLAB-ului (API) este o bibliotecă care permite scrierea de programe icircn C sau Fortran care interacţionează cu MATLAB-ul Include facilităţi pentru apelarea rutinelor din MATLAB apelarea MATLAB-ului ca maşină de calcul scrierea şi citirea fişierelor de tip MAT

Pachetul SIMULINK

SIMULINKreg este un pachet software ataşat MATLAB-ului şi reprezintă un sistem interactiv pentru simularea dinamicii sistemelor neliniare (bineicircnţeles şi a celor liniare) Este conceput sub forma unei interfeţe grafice care permite crearea unui model prin ldquotrasareardquo schemei bloc a sistemului şi apoi simularea dinamicii sistemului SIMULINK poate lucra cu sisteme liniare neliniare continue discrete multivariabile etc SIMULINK bebeficiază de aşa-numitele Blockset-uri care sunt de fapt biblioteci suplimentare care conţin aplicaţii specializate din domenii cum ar fi comunicaţii procesarea semnalelor etc Real-time Workshopreg este un program foarte important care permite generarea unui cod C pentru schemele bloc create icircn SIMULINK şi prin urmare permite rularea de aplicaţii icircn timp real de o mare diversitate

Toolbox-urile MATLABToolbox-urile reprezintă o familie de aplicaţii care permit icircnvăţarea şi aplicarea

tehnologiilor specializate din diverse domenii Aceste toolbox-uri sunt colecţii de funcţii MATLAB (functions) (M-files) care extind mediul MATLAB pentru rezolvarea unor clase particulare de probleme Cacircteva din cele mai utilizate aplicaţii sunt prezentate icircn figura următoare

45

46

Ferestrele de lucru MATLAB

Fereastra principală MATLAB (MATLAB Desktop) După lansarea programului MATLAB icircn prim plan apare fereastra principală MATLAB ce conţine unelte de control al directoarelor fişierelor variabilelor şi al aplicaţiilor asociate MATLAB-ului

MATLAB Desktop Toolbar permite accesul uşor la uneltele clasice MATLAB Ţinacircnd cursorul deasupra unui buton o indicaţie ajutătoare descriind unealta va apare icircntr-o căsuţă galbenă Unele ferestre au propriul lor toolbar inclus icircn sistemul de afişare

47

Ferestrele Desktop-ului Următoarele ferestre sunt supervizate de MATLAB Desktop deşi nu toate apar implicit după lansare

Fereastra de comenzi (Command Window) permite lansarea comenzilor MATLAB Fereastra Command History permite memorarea vizualizarea editarea şi relansarea

funcţiilor lansate anterior icircn Command Window Fereastra Launch Pad permite lansarea uneltelor şi accesarea documentaţiei MATLAB Fereastra Current Directory Browser permite controlul asupra fişierelor MATLAB şi a celor

asociate Fereastra Help Browser permite vizualizarea şi căutarea documentaţiei MATLAB Fereastra Workspace Browser permite vizualizarea şi schimbarea conţinutului spaţiului de

lucru Fereastra Array Editor permite editarea şi vizualizarea conţinutului variabilelor icircntr-un

format tabelar Fereastra EditorDebugger permite crearea editarea şi verificarea fişierelor M-files ce conţin

funcţii MATLABAlte unelte şi ferestre MATLAB cum ar fi ferestrele grafice nu sunt supervizate de MATLAB Desktop

Spaţiul de lucru al MATLAB-ului (workspace)

Spaţiul de lucru conţine un set de variabie (numite tablouri sau matrice) care pot fi manevrate din linia de comandă Se pot folosi comenzile who şi whos (deja prezentate) pentru a

48

vedea care sunt variabilele curente din workspace Pentru ştergerea variabilelor din workspace se utilizează comanda clear

Icircncărcarea şi salvarea din workspaceComenzile save şi load descrise icircntr-un subcapitol anterior au rolul de a salva variabilele din

spaţiul de lucru şi respectiv de a le reicircncărca icircntr-o sesiune ulterioară Aceste comenzi se pot folosi şi pentru a importa şi exporta date

Pe platformele Windows operaţiile save load sunt disponibile şi prin selectarea opţiunilor Save Workspace As respectiv Load Workspace din meniul File

Citirea sau scrierea unor fişiere mat din programe externe icircn C sau Fortran se poate face cu Interfaţa de Aplicaţii Program (API) Formatul icircn care comanda save stochează datele poate fi controlat prin adăugarea unor flag-uri icircn lista de nume de fişiere sau variabile

-mat Utilizează formatul binar tip MAT (implicit)

-ascii Utilizează formatul ASCII pe 8 digiţi

-ascii -double Utilizează formatul ASCII pe 16 digiţi

-ascii -double ndashtabs Delimitează elementele tablourilor cu tab-uri

-v4 Salvează icircntr-un format pe care versiunea 4 MATLAB icircl poate deschide

-append Adaugă datele icircntr-un fişier MAT existent

Observaţie atunci cacircnd se salvează conţinutul spaţiului de lucru icircn format ASCII trebuie salvată cacircte o variabilă pentru a permite reconstituirea ulterioară a acesteia

Browser-ul WorkspaceBrowser-ul Workspace permite vizualizarea conţinutului spaţiului de lucru curent (este de

fapt varianta grafică a comenzii whos) Pentru a deschide acest instrument se selectează Show Workspace din meniul File şi apoi se face click din mouse pe tasta Workspace Browser din toolbar

49

50

  • Constante numerice reale
  • Constante şir de caractere
    • rdquoŞir de caractere continuatrdquo
      • CAPITOLUL II OPERATORI ŞI EXPRESII
        • Exemplul1
        • include ltstdiohgt
        • Exemplul 2
        • include headerul_meuh
        • Exemplul 3
        • include cbcheadheaderul_meuh
        • Litera
        • Conversia realizată
        • Litera
        • Conversia realizată
        • Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare
          • Pachetul SIMULINK
            • Toolbox-urile MATLAB
              • Ferestrele de lucru MATLAB
                • Spaţiul de lucru al MATLAB-ului (workspace)
                  • Icircncărcarea şi salvarea din workspace
                    • Browser-ul Workspace
Page 13: Caiet Practica - Limbajul c Si Mathlab

VARIABILE

Spre deosebire de constante variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica icircn timpul execuţiei programului Şi variabilele sunt caracterizate de atributele nume tip valoare şi clasă de memorare Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor Dacă la o constantă ne puteam referi folosind caracterele componente la o variabilă ne vom referi prin numele ei Numele unei variabile ne permite accesul la valoarea ei sau schimbarea valorii sale dacă este necesar acest lucru Numele unei variabile este un identificator ales de programator Ca urmare trebuie respectate regulile enumerate icircn secţiunea identificatori

Dacă o dată nu are legături cu alte date (de exemplu relaţia de ordine) vom spune că este o dată izolată O dată izolată este o variabilă simplă Dacă datele se grupează icircntr-un anumit mod (icircn tablouri - vectori matrici - sau structuri) variabilele sunt compuse (structurate)

Icircn cazul constantelor icircn funcţie de componenţa literalului compilatorul stabilea automat tipul constantei Icircn cazul variabilelor este necesară specificarea tipului fiecăreia la declararea acesteia Toate variabilele care vor fi folosite icircn program trebuie declarate icircnainte de utilizare

Declararea variabilelor

Modul general de declarare a variabilelor este tip_variabile listă_nume_variabile

Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv Icircntr-un program icircn limbajul C++ declaraţiile de variabile pot apare icircn orice loc icircn programul sursă La declararea variabilelor se rezervă icircn memorie un număr de octeţi corespunzător tipului variabilei urmacircnd ca ulterior icircn acea zonă de memorie să fie depusă (memorată icircnregistrată) o anumită valoareExemple

int i jdeclararea var simple i j de tip int Se rezervă pentru i şi j cacircte 16 biţi (2octeţi)

char c declararea variabilei simple c de tip char Se rezervă un octet float lungime declararea variabilei simple lungime se rezervă 4 octeţi

Iniţializarea variabilelor icircn declaraţii

Icircn momentul declarării unei variabile acesteia i se poate da (asigna atribui) o anumită valoare Icircn acest caz icircn memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective iar valoarea va fi depusă (memorată) icircn acele locaţii

13

Forma unei declaraţii de variabile cu atribuire estetip_variabilă nume_variabilă=expresie

Se evaluează expresia iar rezultatul acesteia este asignat variabilei specificateExemple

char backslash=rsquorsquo declararea şi iniţializarea variabilei simple backslashint a=79+2 declararea variabilei simple a de tip int şi iniţializarea ei cu valoarea

65float radiani pi=314declararea variabilei radianideclararea şi iniţializarea var pishort int z=3 declararea şi iniţializarea variabilei simple zchar d=rsquo011rsquochar LinieNoua=rsquonrsquodouble x=98 y=0

Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare prin aşa-numiţii calificatoriAceştia sunt

const volatile

Calificatorul const asociat unei variabile nu va permite modificarea ulterioară a valorii acesteia prin program (printr-o atribuire) Calificatorul volatile (cel implicit) are efect invers calificatorului const Dacă după calificator nu este specificat tipul datei acesta este considerat tipul implicit adică intExemple

const float b=88volatile char terminatorterminator=rsquorsquoterminator=rsquorsquo permisb=45 nepermisa modificarea valorii variabilei bconst w volatile g w g de tip int implicit

Structuri

O structura este o colectie de variabile (de tipuri diferite) referite sub un singur nume Definitia unei structuri formeaza un asa numit sablon (template tag) ce poate fi folosit la crearea variabilelor tip structura Variabilele care formeaza structuri se numesc elementelestructurii De exemplu fragmentul urmator defineste un sablon pentru o structura numita addr care defineste la racircndul sau numele si adresa unei persoane necesare icircn cazul transmiterii unei scrisoristruct addr struct char name[30] char namechar street[40] char streetchar city[20] char city

14

char state[3] char stateunsigned int zip unsigned int zip addr

Pentru definirea unui sablon al unei structuri se foloseste cuvacircntul cheie struct Terminarea definitiei se face cu rdquordquo (este unul din putinele cazuri de utilizare a caracterului punct si virgula rdquordquo dupa acolada)

Precizam ca numele addr identifica structura particulara definite anterior (sablonul) si este specificatorul sau de tip Programul anterior defineste numai forma (tipul) datelor structurii dar nu defineste variabilele structura deci trebuie facuta distinctie dintre structurasablon si variabila-structura O variabila de tip structura se declara cu ajutorul sablonului structurii

Pentru a declara o variabila actuala cu aceasta structura vom scriestruct addr addr_info

Aceasta linie declara variabila addr_info ca variabila structura de tip addrLimbajul C aloca suficienta memorie pentru a pastra toate variabilele ce alcatuiesc o structura

De exemplu memoria alocata pentru structura addr_info va fi Name 30 bytesStreet 40 bytesCity 20 bytesState 3 bytesZip 4 bytes

Cacircnd se defineste o structura sablon se pot declara una sau mai multe variabile-structuri astfel struct addr char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info binfo cinfo

Secventa anterioara defineste o structura sablon numita addr si declara variabilele addr_info binfo cinfo de acelasi tip

Pentru declararea unei singure structuri numite addr_info nu mai este necesara includerea numelui addr al structurii astfelstruct char name[30]char street[40]char city[20]char state[3]unsigned int zip addr_info

Icircn cazul de mai sus se defineste variabila-structura addr_info cu sablonul definit dar fara nume Forma generala de definire a unei structuri este struc nume_tip_structura tip nume_variabiletip nume_variabiletip nume_variabile

15

variabile_structura

Unde pot fi omise fie numele tipului structurii nume_tip_struct fie variabile_structura dar nu ambele Dupa cum se observa nume_tip_structura dupa cuvacircntul cheie struct se refera la sablonul structurii (tipul sau) iar variabile_structura se refera la lista de variabile de acest tip (cu aceasta structura)

Referirea individuala a elementelor unei structuri se face cu operatorul punct De exemplu instructiunea urmatoare va atribui elementului zip al variabilei structura addr_info valoarea 12345addr_infozip = 12345

Pentru accesarea elementelor unei structuri se foloseste forma generala nume_structuranume_element

De exemplu pentru afisarea variabilei zip se va scrieprintf (d addr_infozip)

Icircn aceeasi forma se pot referi celelalte elemente ale structurii addr_info De exemplu apelulgets (addr_infoname)

are ca efect trecerea la un pointer-caracter la primul caracter al elementului nume Pentru a avea acces la fiecare caracter al elementului addr_infoname se poate indexa name De exemplu pentru afisarea continutului lui addr_infoname caracter cu caracter se foloseste programulregister int tfor (t = 0 addr_infoname[t] ++t)putchar (addr_infoname[t])

16

CAPITOLUL II OPERATORI ŞI EXPRESII

Datele (constante sau variabile) legate prin operatori formează expresii (figura 24) Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor datorită faptului că tipul unei date constă icircntr-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare icircn memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori

Operatorii pot fi

unari (necesită un singur operand) binari (necesită doi operanzi) ternari (trei operanzi)

O expresie este o combinaţie corectă din punct de vedere sintactic formată din operanzi şi operatori Expresiile ca şi operanzii au tip şi valoare

OPERATORI

Operatorul unar adresă amp aplicat identificatorului unei variabile furnizează adresa la care este memorată aceasta Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere

Exemplu

int a

coutltltAdresa la care este memorata variabila a esteltltampa

Operatorul de atribuire (de asignare) este un operator binar care se aplică tuturor tipurilor de variabile Este folosit sub formele următoare

nume_variabilă=expresie

sau expresie1=expresie2

17

Se evaluează expresia din membrul drept iar valoarea acesteia este atribuită variabilei din membrul stacircng Dacă tipurile membrilor stacircng şi drept diferă se pot realiza anumite conversii prezentate icircn paragraful 27Exemplu

float x int ab x=918

a=b=10

int s s=a+205 rezultat s=110

s=x+2 rezultat s=11 deoarece s este int

Aşa cum se observă icircn linia a 2-a din exemplul precedent operatorul de atribuire poate fi utilizat de mai multe ori icircn aceeaşi expresie Asociativitatea operatorului are loc de la dreapta la stacircnga Astfel mai icircntacirci b=10 apoi a=b

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

float xy=425char car=rsquoArsquo int abc

coutltltrdquoVal lui y esterdquoltltyltltrsquonrsquo Afişare Val lui y este425

x=y coutltltrdquoVal lui x esterdquoltltxltltrsquonrsquo Afişare Val lui x este425

a=xcoutltltrdquoVallui a esterdquoltltaltltrsquonrsquo AfişareVal lui a este4 deoarece a de tip int

c=b=a coutltltrdquob=rdquoltltbltltrdquotc=rdquoltltcltltrsquonrsquo Afişare b=4 c=4

coutltltrdquoIntroduceţi val lui crdquo cingtgtc citire val pentru c

coutltltrdquoVal lui c esterdquoltltcltltrsquonrsquo Afişare Val lui c este4

Operatorul poate fi aplicat tipurilor de date icircntregi reale caracter şi chiar şiruri de caractere aşa cum vom vedea icircn capitolele următoare (exemplu char şir [10]=rdquoa5dfgthkljrdquo)

18

Operatori aritmetici unariOperator Semnificaţie Exemple

- Minus unar -a

++ Operator de incrementare a++ sau

(adună 1 la valoarea operandului) ++a

-- Operator de decrementare a-- sau

(scade 1 din valoarea operandului) --a

Operatorul - unar schimbă semnul operandului Exemplu

int ab coutltltrdquoa=rdquoltlt-altltrsquonrsquo b=-a

coutltltrdquob=rdquoltltbltltrsquonrsquo

Operatorul - unar poate fi aplicat datelor icircntregi reale caracter

Operatorii de incrementare şi decrementare pot fi aplicaţi datelor numerice sau caracterAmbii operatori pot fi folosiţi icircn formă prefixată icircnaintea operandului (++a

respectiv --a) sau postfixată după operand (a++ respectiv a--)Operatorul de decrementare -- care poate fi folosit icircn formă prefixată (--a) sau postfixată (a--) Utilizarea acestor operatori icircn expresii icircn formă prefixată sau postfixată determină evaluarea acestora icircn moduri diferite astfel

y=++x este echivalent cu x=x+1

y=x

y=x++ este echivalent cu y=x

x=x+1

y=--x este echivalent cu x=x-1

y=x

y=x-- este echivalent cu y=x

x=x-1

19

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=9 coutltltrdquoa++=rdquoltlta++ltltrsquonrsquo Afişare a++=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 Revenire in situatia anterioara

coutltltrdquo++a=rdquoltlt++altltrsquonrsquo Afişare ++a=10

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=10

a=9 coutltltrdquoa--=rdquoltlta--ltltrsquonrsquo Afişare a--=9

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

a=9 Revenire in situaţia anterioara

coutltltrdquo--a=rdquoltlt--altltrsquonrsquo Afişare --a=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=8

int zx=3 z=x++-2

coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=1

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

x=3 z=++x-2 coutltltrdquoz=rdquoltltzltltrsquonrsquo Afişare z=2

coutltltx=rdquoltltxltltrsquonrsquo Afişare x=4

Operatori aritmetici binariOperator Semnificaţie Exemple

+ Adunarea celor doi operanzi a+b

- Scăderea celor doi operanzi a-b

Icircnmulţirea celor doi operanzi ab

Icircmpărţirea celor doi operanzi ab

20

Operatorul modulo (operatorul rest) ab

(furnizează restul icircmpărţirii operatorului stacircng la operatorul drept)

Operatorul modulo se aplică numai operanzilor icircntregi (de tip int sau char) Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor icircntregi sau reale

Dacă icircntr-o expresie cu 2 operanzi şi un operator binar aritmetic ambii operanzi sunt icircntregi rezultatul expresiei va fi tot un număr icircntreg De exemplu la evaluarea expresiei 92 ambii operanzi fiind icircntregi rezultatul furnizat este numărul icircntreg 4

Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate care determină precis modul icircn care va fi evaluată expresia icircn care aceştia apar Icircn tabelul 23 sunt prezentaţi operatorii anteriori icircn ordinea descrescătoare a priorităţii Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor

Tabelul 23

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int rezult a=20b=2c=25d=4 rezult=a-b

coutltltrdquoa-b=rdquoltltrezultltltrsquonrsquo Afişare a-b=18

rezult=a+b coutltltrdquoa+b=rdquoltltrezultltltrsquonrsquo Afişare a+b=22

rezult=abcoutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=50

21

rezult=ad coutltltrdquoad=rdquoltltrezultltltrsquonrsquo Afişare ad=5

rezult=cb coutltltrdquocb=rdquoltltrezultltltrsquonrsquo Afişare cb=1

rezult=cbd coutltltrdquocbd=rdquoltltrezultltltrsquonrsquo Afişare cbd=48

rezult= -b+a coutltltrdquo-b+a=rdquoltltrezultltltrsquonrsquo Afişare -b+a=18

rezult= -(b+a) coutltltrdquo-(b+a)=rdquoltltrezultltltrsquonrsquo Afişare -(b+a)=-22

rezult=b+cdcoutltltrdquob+cd=rdquoltltrezultltltrsquonrsquo Afişare b+cd=102

rezult=(b+c)dcoutltltrdquo(b+c)d=rdquoltltrezultltltrsquonrsquo Afişare (b+c)d=108

Operatori aritmetici binari compuşiOperator Semnificaţie Exemple

+= a=a+b a+=b

-= a=a+b a-=b

= a=ab a=b

= a=ab a=b

= a=ab a=b

Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare

expresie1 operator= expresie2

Rezultatul obţinut este acelaşi cu rezultatul obţinut prin

expresie1 = expresie1 operator expresie2

Toţi aceşti operatorii modifică valoarea operandului stacircng prin adunarea scăderea icircnmulţirea sau icircmpărţirea acestuia prin valoarea operandului drept

Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1

Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire

22

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int ab float c=93 a=3 b=8

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=3

a+=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=11

a-=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=-5

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=24

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=0

a=b coutltltrdquoa=rdquoltltaltltrsquonrsquo Afisare a=3

Operatori relaţionali binariOperator Semnificaţie Exemple

== Egal cu a==b

= Diferit de a=b

lt Mai mic decacirct altb

lt= Mai mic sau egal alt=b

gt Mai mare decacirct agtb

gt= Mai mare sau egal agt=b

Primii doi operatori mai sunt numiţi operatori de egalitate Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor Rezultatul unei expresii icircn care apare unul din operatorii relaţionali binari este icircntreg şi are valoarea zero (0) dacă relaţia este falsă sau valoarea unu (1) (sau diferită de 0 icircn cazul compilatoarelor sub UNIX) dacă relaţia este adevărată Aceşti operatorii pot fi aplicaţi datelor de tip icircntreg real sau char

Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate icircn tabelul 24

23

Tabelul 24

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

Relaţionali lt lt= gt gt= de la stacircnga la dreapta

De egalitate == = de la stacircnga la dreapta

Atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Observaţie Deosebirea dintre operatorii == (relaţional de egalitate) şi = (de atribuire) constă icircn faptul că primul nu modifică valoarea nici unuia dintre operanzii săi pe cacircnd cel de-al doilea modifică valoarea operandului stacircng (vezi exemplul următor)

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=1 b=20 lim=100 int rezult rezult=altb

coutltltrdquoaltb=rdquoltltrezultltltrsquonrsquo

Afişare altb=1 (sau o altă valoare diferită de zero pentru alte compilatoare)

rezult=alt=b

operatorul realţional lt= are prioritate mai mare decacirct cel de atribuire

coutltltrdquoalt=b=rdquoltltrezultltltrsquonrsquo

Afisare altb=1 (sau o alta valoare diferită de zero pentru alte compilatoare)

24

rezult=agtb coutltltrdquoagtb=rdquoltltrezultltltrsquonrsquo Afişare altb=0

rezult=a+10gt=lim coutltltrdquoa+10gt=lim=rdquoltltrezultltltrsquonrsquo

Operatorul + are prioritate mai mare decacirct operatorul gt= Afişare a+10gt=lim=0

rezult=a+(10gt=lim) coutltltrdquoa+(10gt=lim)=rdquoltltrezultltltrsquonrsquo

Schimbarea prioritatii operatorilor prin folosirea parantezelor Afişare a+(10gt=lim)=1

rezult=a==b

coutltltrdquoa==b=rdquoltltrezultltltrsquonrsquo Afişare a==b=0

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=1

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=a=b coutltltrdquoa=b=rdquoltltrezultltltrsquonrsquo Afişare a=b=20

coutltltrdquoa=rdquoltltaltltrsquonrsquo Afişare a=20

coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

rezult=5gtbgt10coutltltrdquob=rdquoltltbltltrsquonrsquo Afişare b=20

coutltltrdquo5gtbgt10=rdquoltltrezultltltrsquonrsquo Echivalent cu (5gtb)gt10 Afişare 5gtbgt10=0

Operatori logici pe cuvacircntOperator Semnificaţie Exemple

Not (negaţie logică) (a==b)

ampamp And (conjuncţie şi logic) (agtb) ampamp (bgtc)

|| Or (disjuncţie sau logic) (agtb) || (bgtc)

Aceşti operatori pot fi aplicaţi datelor de tip icircntreg real sau caracter Evaluarea unei expresii icircn care intervin operatorii logici se face conform tabelului 25

Tabelul 25

25

x y x xampampy x||y

adevărat (1) adevărat (1) fals (0) adevărat (1) adevărat (1)

adevărat (1) fals (0) fals (0) fals (0) adevărat (1)

fals (0) adevărat (1) adevărat (1) fals (0) adevărat (1)

fals (0) fals (0) adevărat (1) fals (0) fals (0)

Expresia expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero

Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1 FIE expresie2 au valori diferite de zero

Expresia expresie1 ampamp expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero

Exerciţiu Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia

include ltiostreamhgt

void main()

int a=0 b=10 c=100 d=200 int rezult rezult=aampampb

coutltltrdquoaampampb=rdquoltltrezultltltrsquonrsquo Afişare aampampb=0

rezult=a||b coutltltrdquoa||b=rdquoltltrezultltltrsquonrsquoAfişare a||b=1 (sau valoare nenula)

rezult=acoutltltrdquoa=rdquoltltrezultltltrsquonrsquo Afişare a=1 (sau valoare nenula)

rezult=b coutltltrdquob=rdquoltltrezultltltrsquonrsquo Afişare b=0

rezult=(agtb) || (bgtc)coutltltrdquo(agtb) || (bgtc)=rdquoltltrezultltltrsquonrsquo

Afişare (agtb) || (bgtc) =1(sau valoare nenula)

rezult=(cltd)coutltltrdquo(cltd)=rdquoltltrezultltltrsquonrsquoAfişare (cgtd)=0

rezult=(a-b)ampamp1coutltltrdquo(a-b)ampamp1=rdquoltltrezultltltrsquonrsquo

Afişare (a-b)ampamp1 =1(sau valoare nenula)

rezult=d||bampampacoutltltrdquod||bampampa=rdquoltltrezultltltrsquonrsquoAfişare d||bampampa =1

26

Icircn evaluarea expresiilor din exemplu s-au aplicat priorităţile operatorilor indicate icircn tabelul 26

Tabelul 26

Clasă de operatori Operatori Asociativitate

Unari - (unar) ++ -- de la dreapta la stacircnga

Multiplicativi de la stacircnga la dreapta

Aditivi + - de la stacircnga la dreapta

Atribuire = de la dreapta la stacircnga

relaţionali lt lt= gt gt= de la stacircnga la dreapta

de egalitate == = de la stacircnga la dreapta

logici ampamp de la stacircnga la dreapta

logici || de la stacircnga la dreapta

atribuire şi aritmetici binari = = = = += -= de la dreapta la stacircnga

Exerciţiu Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură sau 0 icircn caz contrar

include ltiostreamhgt

void main()

double lmin lmax nrcoutltltNumar=cingtgtnr

coutltltrdquoLimita inferioară a intervaluluirdquo cingtgtlmin

coutltltrdquoLimita superioară a intervaluluirdquo cingtgtlmax

coutltlt(nrgt=lmin ampamp nrlt=lmax)

Operatori logici pe bitOperator Semnificaţie Exemple

27

~ Negaţie (cod complementar faţă de unu) ~a

amp AND (Conjuncţie şi logic pe bit a amp 0377

| OR (Disjuncţie sau logic pe bit) a | 0377

^ XOR (Sau exclusiv logic pe bit) a^b

ltlt Deplasare stacircnga 0377 ltlt 2

gtgt Deplasare dreapta 0377 gtgt 2

Aceşti operatori nu se aplică numerelor reale ci numai datelor de tip icircntreg sau caracter Primul operator este unar ceilalţi binari Operatorii acţionează la nivel de bit la nivelul reprezentării interne (icircn binar) conform tabelelului 27

Tabelul 27

x y xampy x | y x^y ~x

1 1 1 1 0 0

1 0 0 1 1 0

0 1 0 1 1 1

0 0 0 0 0 1

Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari El furnizează complementul faţă de unu al unui icircntreg adică va schimba fiecare bit de pe 1 icircn zero şi invers Operatorii de deplasare pe bit (ltlt şi gtgt) efectuează deplasarea la stacircnga sau la dreapta a operandului stacircng cu numărul de biţi indicaţi de operandul drept Astfel xltlt2 deplasează biţii din x la stacircnga cu două poziţii introducacircnd zero pe poziţiile rămase vacante

Exemple

int a=3 Reprezentare internă a lui a (pe 2 octeţi) 0000000000000011

int b=5 Reprezentare internă a lui b (pe 2 octeţi) 0000000000000101

int rez=~a

28

coutltlt~ltltaltlt=ltltrezltltn ~3= -4

Complementul faţă de unu este 1111111111111100 (icircn octal 0177777774 (a= - 4)

rez=a amp b coutltltaltltampltltbltlt=ltltrezltltn 3amp5=1

aampb=0000000000000001 =1

rez=a^b coutltltaltlt^ltltbltlt=ltltrez 3^5= 6

a ^b = 0000000000000110

rez=a|b coutltltaltlt|ltltbltlt=ltltrez 3|5= 7

a | b = 0000000000000111

rez=altlt2 coutltltaltltltltltlt3ltlt=ltltrez 3ltlt2=16=22

altlt2= 0000000001100000

rez=5gtgt2 coutltltbltltgtgtltlt2ltlt=ltltrez 5gtgt2=1=52

bgtgt2= 0000000000000001

Operatorul binar ^ icircşi găseşte o utilizare tipică icircn expresii ca xamp^077 care maschează ultimii 6 biţi ai lui x pe zero

Operatorul amp este adesea utilizat icircn expresii ca xamp0177 unde setează toţi biţii pe zero cu excepţia celor de ordin inferior din x

Operatorul | este utilizat icircn expresii ca xampMASK unde setează pe unu biţii care icircn x şi masca MASK sunt setaţi pe unu

Operatorii logici pe bit amp şi | sunt diferiţi de operatorii logici ampamp şi || (pe cuvacircnt)

Deplasarea la stacircnga a unei date cu n poziţii este echivalentă cu icircnmulţirea valorii acesteia cu 2 Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu icircmpărţirea

valorii acesteia cu 2

Combinacircnd operatorii logici pe bit cu operatorul de atribuire se obţin operatorii

amp= ^= |= ltlt= gtgt=

Operatorul condiţional

29

Este un operator ternar (necesită 3 operanzi) utilizat icircn construcţii de forma

expresie1expresie2expresie3

Se evaluează expresia1 Dacă aceasta are o valoare diferită de zero atunci tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2 Altfel (dacă expresie1 are valoarea zero) tipul şi valoarea icircntregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3 Deci operatorul condiţional este folosit pentru a atribui icircntregii expresii tipul şi valoarea expresiei2 sau a expresiei3 icircn funcţie de o anumită condiţie Acest lucru este echivalent cu

Dacă expresie1 diferită de zero

Atunci evaluează expresie2

Altfel evaluează expresie3

Exemplu

int semn=(xlt0)-11

Dacă xlt0 atunci semn=-1 altfel semn=1

Operatorul virgulăEste utilizat icircn construcţii de forma

expresie1 expresie2

Operatorul virgulă forţează evaluarea unei expresii de la stacircnga la dreapta Tipul şi valoarea icircntregii expresii este dată de tipul şi valoarea expresiei2 Operatorul virgulă este folosit icircn instrucţiunea for Operatorul virgulă are cea mai mică prioritate

Exemplu

int x c y

coutltltrdquoAstept val ptr yrdquo cingtgty

x=(c=y clt=5) c va primi valoarea lui y (citită) se verifică dacă c este mai mic sau

egal cu 5 Daca nu x=0 daca da x=1 sau x=valoare diferită de zero)

x++ y-- icircntacirci este incrementat x apoi este decrementat y

Operatorul sizeof()Este un operator unar care are ca rezultat numărul de octeţi pe care este memorată o dată

30

de un anumit tip Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tipExemple

coutltltsizeof(int) afişează numărul de octeţi pe care este memorat un icircntreg (2)

coutltltsizeof(rdquoab6rdquo) afişează 5 nr de octeţi pe care este memorată constanta şir rdquoab6rdquo

Operatorul (tip) Este un operator unar care apare icircn construcţii numite rdquocastrdquo şi converteşte tipul

operandului său la tipul specificat icircntre parantezeExemple

int a (float) a converteşte operandul a (care era de tip icircntreg) icircn float

Icircn afara operatorilor prezentaţi există şi alţii pe care icirci vom enumera icircn continuare Despre aceşti operatori vom discuta icircn capitolele viitoare cacircnd cunoştinţele acumulate vor permite acest lucru

Operatorul unar Este operator unar numit şi operator de deferenţiere Se aplică unei expresii de tip

pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul Operatorii amp (adresă) şi sunt complementariExemplu Expresia a este icircnlocuită cu valoarea de la adresa conţinută icircn variabila pointer a

Operatorii parantezăParantezele rotunde ( ) se utilizează icircn expresii pentru schimbarea ordinii de efectuare a

operaţiilor sau la apelul funcţiilor La apelul funcţiilor parantezele rotunde icircncadrează lista parametrilor efectivi Din acest motiv parantezele rotunde sunt numite şi operatori de apel de funcţieExemplu

double sum(double a double b)

declar funcţiei sum care primeşte 2 argumente reale(double) şi returnează o valoare tip double

void main()

31

double a=sum(899 566) apelul funcţiei sum cu parametri efectivi 899 şi 566

int s0=6 double s1=(s0+9)a folosirea parantezelor icircn expresii

Operatorii de indexareOperatorii de indexare sunt parantezele pătrate [] Acestea includ expresii icircntregi care reprezintă indici ai unui tablou

Operatori de acces la membri structurilorOperatorii -gt şi -gt permit accesul la componentele unei structuri Ei vor fi studiaţi icircn capitolul 7

Icircn tabelul 28 sunt prezentaţi toţi operatorii grupaţi pe categorii cu priorităţile lor şi regulile de asociativitate Operatorii dintr-o categorie au aceeaşi prioritate

32

Tabelul 28

Nr Clasă de operatori Operatori Asociativitate

1 Primari () [] -gt de la stacircnga la dreapta

2 Unari ~ ++ -- sizeof (tip)

-(unar) (deferenţiere) amp(referenţiere)

de la stacircnga la dreapta

3 Multiplicativi de la stacircnga la dreapta

4 Aditivi + - de la stacircnga la dreapta

5 Deplasare pe bit ltlt gtgt de la stacircnga la dreapta

6 Relaţionali lt lt= gt gt= de la stacircnga la dreapta

7 De egalitate == = de la stacircnga la dreapta

8 amp (ŞI logic pe bit) de la stacircnga la dreapta

9 ^ (XOR pe bit) de la stacircnga la dreapta

10 | (SAU logic pe bit) de la stacircnga la dreapta

11 ampamp de la stacircnga la dreapta

12 || de la stacircnga la dreapta

13 Condiţional de la dreapta la stacircnga

14 De atribuire = += -= = =

amp= ^= |= ltlt= gtgt=

de la dreapta la stacircnga

15 Virgulă de la stacircnga la dreapta

Expresii

33

Prin combinarea operanzilor şi a operatorilor se obţin expresii Tipul unei expresii este dat de tipul rezultatului obţinut icircn urma evaluării acesteia La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor La alcătuirea expresiilor este indicată evitarea expresiilor icircn care un operand apare de mai multe ori

Regula conversiilor implicite si precedenta operatorilor

Regula conversiilor implicite se aplica la evaluarea expresiilor Ea actioneaza atunci cacircnd un operator binar se aplica la doi operanzi de tipuri diferite Icircn acest caz operandul de tip inferior se converteste spre tipul superior al celuilalt operand si rezultatul este de tip superior Icircnainte de toate se convertesc operanzii de tip char si enum icircn tipul int Daca operatorul curent se aplica la operanzi de acelasi tip atunci se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor Daca rezultatul aplicarii operatorului reprezinta o valoare icircn afara limitelor tipului respectiv atunci rezultatul este eronat (are loc o bdquodepasirerdquo)

Exemplu Rezultatul icircmpartiirii 73 este 2 si nu 25 deoarece cei doi operanzi sunt de tip icircntreg si prin urmare rezultatul (care este de tip real) este si el convertit la tipul icircntreg

Daca operatorul binar se aplica la operanzi de tipuri diferite atunci se face o conversie icircnainte de executia operatorului conform algoritmului umator

1 Daca unul din operanzi este de tip long double atunci celalalt operand se converteste spre tipul long double iar tipul rezultatului aplicarii operatorului este de asemenea de tip long double

2 Altfel daca unul din operanzi este de tip double atunci celalalt operand se converteste spre tipul double iar tipul rezultatului aplicarii operatorului este de asemenea de tip double

3 Altfel daca unul din operanzi este de tip float atunci celalalt operand se converteste spre tipul float iar tipul rezultatului aplicarii operatorului este de asemenea de tip float

4 Altfel daca unul din operanzi este de tip unsigned long atunci celalalt operand se converteste spre tipul unsigned long iar tipul rezultatului aplicarii operatorului este de asemenea de tip unsigned long

5 Altfel daca unul din operanzi este de tip long atunci celalaltoperand se converteste spre tipul long iar tipul rezultatului aplicarii operatorului este de asemenea de tip long

6 Altfel unul din operanzi trebuie sa fie de tip unsigned celalalt de tip int si acesta se converteste spre tipul unsigned iar tipul rezultatului aplicarii operatorului este de tip unsigned

CAPITOLUL III STRUCTURA PROGRAMELOR IN C

34

Conceptul de baza folosit icircn structurarea programelor scrise icircn limbajul C este functia Astfel un program icircn C este compus din cel putin o functie si anume functia main() sau functia principala La racircndul ei functia main() poate apela alte functii definite de utilizator sau existente icircn bibliotecile ce icircnsotesc orice mediu de dezvoltare de programare icircn C Structura generala a unei functii C este de formatip nume_functie (param_1 param_2 param_n)- nume_functie reprezinta numele sub care functia este cunoscuta icircn program- param_1param_n - parametrii cu care functia este apelata si al caror tip poate fi declarat direct icircn aceasta lista sau prin instructiuni separate plasate imediat dupa lista parametrilor

Corpul functiei este definit ca o secventa de instructiuni sisau apeluri de functii si este delimitat de restul functiei prin paranteze acolade Icircn limbajul C exista doua categorii de functii O prima categorie este formata de functiile ce returneaza o valoare la revenirea din ele icircn punctul de apel tipul acestei valori fiind definit de de tipul functiei Cealalta categorie contine functiile ce nu returneaza nici o valoare la revenirea din ele pentru aceste functii fiind utilizat cuvacircntul cheie void icircn calitate de tip El semnifica lipsa unei valori returnate la revenirea din functie

Exemple1) void f(void)helliphelliphelliphellip

Functia f nu are parametri si nu returneaza nici o valoare2) double g(int x)helliphelliphelliphellip

Functia g are un parametru x de tipul int si returneaza la revenirea icircn programul principal o valoare flotanta icircn dubla precizie Functiile C sunt icircn general unitati independente compilabile separat Instructiunile la racircndul lor pot defini tipul unor date folosite icircn program sau operatii ce trebuie executate prin program Din punct de vedere sintactic orice instructiune trebuie terminata cu caracterul iar grupurile de instructiuni pot fi delimitate prin caracterele si pentru a forma unitati sintactice noi de tip bloc Functiile apelate vor primi valori pentru argumentele (parametrii) lor si pot returna catre functia apelanta valori de un anumit tip Programul icircncepe cu executia functiei main() Aceasta functie este folosita icircn general fara parametri La racircndul lor functiile apelate pot fi scrise icircn limbaj C sau realizate icircn alte limbaje de programare asamblare Fortran Pascal etc

CAPITOLUL IV PREPROCESARE

35

Aşa cum am menţionat icircn capitolul 13 icircn faza de compilare a fişierului sursă este invocat icircntacirci preprocesorul Acesta tratează directivele speciale - numite directive preprocesor - pe care le găseşte icircn fişierul sursă Directivele preprocesor sunt identificate prin simbolul care trebuie să fie primul caracter diferit de spaţiu dintr-o linie Directivele preprocesor sunt utilizate la includerea fişierelor header la definirea numelor constantelor simbolice la definirea macro-urilor sau la realizarea altor funcţii (de exemplu compilarea condiţionată) aşa cum ilustrează exemplele următoare

Includerea fişierelor header icircn codul sursă

Exemplul1

include ltstdiohgtCacircnd procesorul icircntacirclneşte această linie datorită simbolului o recunoaşte ca fiind o

directivă preprocesor localizează fişierul header indicat (parantezele unghiulare lt gt indică faptul că este vorba de un fişier header sistem)

Exemplul 2

include headerul_meuhNumele fişierului header inclus icircntre ghilimele indică faptul că headerul_meuh este un

fişier header creat de utilizator Preprocesorul va căuta să localizeze acest fişier icircn directorul curent de lucru al utilizatorului Icircn cazul icircn care fişierul header nu se află icircn directorul curent se va indica şi calea către acesta

Exemplul 3

include cbcheadheaderul_meuhIcircn acest exemplu pentru interpretarea corectă a caracterului backslash a fost necesară dublarea acestuia din motive pe care le vom prezenta icircn paragraful 2524

Asignarea de nume simbolice constantelorExemplu

define TRUE 1

define FALSE 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii icircntregi 1

36

numelui (constantei simbolice) TRUE şi a valorii 0 numelui simbolic FALSE Ca urmare icircnaintea compilării propriu-zise icircn programul sursă apariţiile numelor TRUE şi FALSE vor fi icircnlocuite cu valorile 1 respectiv 0

MacrodefiniţiiDirectiva define este folosită şi icircn macrodefiniţii Macrodefiniţiile permit folosirea unor

nume simbolice pentru expresiile indicate icircn directivăExemplu

define NEGATIV(x) -(x)Icircntre numele macrodefiniţiei şi paranteza stacircngă ( NEGATIV(hellip) ) nu sunt permise spaţii

albe La icircntalnirea icircn programul sursă a macrodefiniţiei NEGATIV preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului) Macrodefiniţia din exemplu poate fi folosită icircn programul sursă astfel NEGATIV(a+b) Cacircnd preprocesorul icircntacirclneşte numele expresiei subtituie literalii din paranteză a+b cu argumentul din macrodefiniţie x obţinacircndu-se -(a+b)

Dacă macrodefiniţia ar fi fost de formadefine NEGATIV(x) -x

NEGATIV(a+b) ar fi fost tratată ca -a+b

CAPITOLUL V INTRARIIESIRI STANDARD

37

Operaţiile de intrareieşire se realizează prin apeluri de funcţii Biblioteca standard a limbajului C conţine mai multe astfel de funcţii Un prim set de astfel de funcţii asigură interfaţa cu terminalul de la care s-a lansat programul Icircntrarea de la acest terminal o vom numi intrare standard Icircn mod analog prin ieşiri standard vom icircnţelege ieşirile la acelaşi terminal

Streamurile (fluxurile de date) implicite sunt stdin (fişierul dispozitivul standard de intrare) stdout (fişierul dispozitivul standard de ieşire) stderr (fişierul standard pentru erori) stdprn (fişierul standard pentru imprimantă) şi stdaux (dispozitivul auxiliar standard) De cacircte ori este executat un program streamurile implicite sunt deschise automat de către sistem Icircn headerul ltstdiohgt sunt definite şi constantele NULL (definită ca 0) şi EOF (sfacircrşit de fişier definită ca ndash1 CTRLZ)

Funcţia standard printf

Realizează ieşiri cu format la ieşirea standard Poate fi apelată printr-o instrucţiune de

apel de forma

printf(control par1 par2hellip parn)

unde control este un şir de caractere numit parametru de control care conţine texte de scris specificatori de format pentru datele care se scriu

par1 par2hellipparn sunt expresii ale căror valori se scriu conform specificatorilor de format prezenţi icircn parametrul de control

Parametrul de control este inclus icircntre ghilimele Numărul specificatorilor de format coincide cu numărul parametrilor par1 par2hellip parn

Icircn cazul icircn care dorim să scriem numai un text parametrul de control nu conţine nici un specificator de format iar par1hellipparn sunt absenţi

Un specificator de format icircncepe cu un caracter procent () Determină modul icircn care va fi afişat argumentul care icirci corespunde Specificatorii de format şi argumentele lor sunt puse icircn corespondenţă de la stacircnga la dreapta deci numărul argumentelor trebuie să fie acelaşi cu numărul specificatorilor de format Următorul tabel conţine specificatorii de format

38

Litera Conversia realizată

DData se converteşte din tipul int icircn zecimal şi se scriu la ieşire caracterele zecimale ale ei eventual precedate de semnul bdquo-rdquo dacă data este negativă

O Data se converteşte din tipul int icircn octal şi se scriu la ieşire caracterele ei octale

XData se converteşte din tipul int icircn hexazecimal şi se scriu la ieşire caracterele ei hexazecimale cifrele peste 9 se scriu cu litere mici (a-f)

X Ca şi icircn cazul literei x dar se vor folosi literele mari (A-F)

U Data se converteşte din tipul unsigned icircn zecimal icircntreg fără semn

CValoarea parametrului care icirci corespunde se consideră că reprezintă codul ASCII al unui caracter şi se scrie caracterul respectiv

SParametrul care-i corespunde se scrie ca un şir de caractere se consideră că şirul se termină la icircntacirclnirea caracterului NUL (lsquo0rsquo)

F

Valoarea parametrului care-i corespunde se converteşte din tipul float sau double icircn formatul ddhellipdddhellipd (d reprezintă o cifră zecimală) unde numărul de cifre după punctul zecimal este fi cel indicat de precizia specificatorului de format fie este egal cu 6 partea icircntreagă este precedată de semnul minus dacă numărul este negativ

E

Conversia se realizează din tipul float sau duble icircn formatul dddhellipdeplusmnddd unde numărul cifrelor de după punctul zecimal este dat de precizia specificatorului de format sau este egal cu 6 dacă aceasta este absentă partea icircntreagă este precedată de minus dacă numărul este negativ

ECa şi icircn cazul literei e cu deosebirea că litera e se schimbă cu litera E dddhellipdEplusmnddd icircn ambele cazuri la exponent se va scrie una două sau trei cifre icircn funcţie de valoarea numărului

GSe aplică una din conversiile definite de literele f sau e alegacircndu-se aceea care se reprezintă pe un număr minim de caractere de asemenea zerourile de la sfacircrşitul părţii fracţionare se omit

G Ca şi g cu singura deosebire că se utilizează E icircn loc de e

I Icircntreg cu semn (la fel ca la d)

P Afişează un pointer

Funcţia standard scanf

39

Realizează intrări cu format de la intrarea standard Poate fi apelată printr-o instrucţiune de forma

scanf(control par1 par2hellipparn)

Ca şi icircn cazul funcţiei printf parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format Un specificator de format icircncepe şi icircn acest caz prin caracterul procent () Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf Icircn acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf

Litera Conversia realizată

DData din cacircmpul de intrare este un şir de cifre zecimale precedat eventual de un semn şi se converteşte din zecimal icircn binar de tip int

OCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr octal

XCa şi icircn cazul literei d cu deosebirea că şirul de cifre este considerat că formează un număr hexazecimal se utilizează literele (a-f) sau (A-F) pentru a scrie cifrelegt9

X Ca şi icircn cazul literei x

UData de intrare este un şir de cifre zecimale care formează un număr icircntreg fără semn şi se converteşte icircn binar tipul unsigned

cData se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter icircn acest caz nu se face avans peste caracterele albe ca şi icircn cazul celorlalţi specificatori

S

Data se consideră că este un şir de caractere şirul icircncepe conform regulii generale cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau cacircnd s-au citit atacirctea caractere cacircte indică dimensiunea maximă din specificatorul de format

FData de intrare reprezintă un număr flotant eventual precedat de un semn se converteşte icircn virgulă flotantă simplă precizie data care se citeşte conţine un punct sau un exponent sau atacirct punct cacirct şi exponent

E Citeşte un număr float

N Argumentul asociat primeşte o valoare icircntreagă egală cu numărul de caractere deja

40

citite

G Citeşte un număr float

[] Scanare pentru un set de caractere

I Citeşte un icircntreg zecimal

P Citeşte un pointer

Parametri par1 par2hellipparn definesc zonele receptoare ale datelor citite prin intermediul funcţiei scanf Fiecare dintre ei reprezintă adresa unei zone receptoare Acest lucru se indică icircn limbajul C printr-o construcţie de forma ampnume care determină adresa yonei de memorie rezervată variabilei nume Caracterul amp din construcţia de mai sus reprezintă un operator unar numit operatorul adresă

Icircn cazul icircn care un specificator de format conţine caracterul bdquordquo data din cacircmpul respectiv va fi prezentă la intrare dar ea nu se atribuie la nici o variabilă şi nu-i va corespunde nici un parametru

Dacă nu dorim să atribuim o valoare pentru variabila n putem folosi aceleaşi date de intrare pentru instrucţiunea de apel scanf(ldquod d frdquoampi ampx) Prin acest apel lui i şi x li se vor atribui aceleaşi valori ca mai sus

Funcţia scanf citeşte toate cacircmpurile care corespund specificatorilor de format şi eventual textelor scrise icircn parametrul de control Icircn cazul unei erori citirea se icircntrerupe icircn locul icircn care s-a icircntacirclnit eroarea Eroarea poate proveni

din neconcordanţa textului din parametrul de control cu cel din fişierul de intrare

din neconcordanţa dintre data din cacircmp şi specificatorul de format sub controlul căruia se face citirea

Apariţia unei erori poate fi pusă icircn evidenţă uşor deoarece scanf returnează la revenirea din ea numărul cacircmpurilor citite corect Acest număr poate fi atribuit unei variabile care apoi poate fi testată pentru a stabili dacă s-au citit sau nu toate cacircmpurile prevăzute De aceea se recomandă să apelăm funcţia scanf ca un operand al unei expresii Astfel o construcţie de forma

nr=scanf(hellip) atribuie lui nr numărul cacircmpurilor citite corect de către scanf

Prin construcţia de mai sus se poate pune icircn evidenţă sfacircrşitul de fişier deoarece icircn acest caz scanf returnează valoarea EOF Această constantă simbolică este definită icircn fişierul stdioh şi

41

ea are valoarea ndash1 Amintim că sfacircrşitul de fişier se poate genera de la tastatură acţionacircnd tasta Z icircn timp ce tasta CTRL este acţionată (^Z)

Funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone speciale pe care o numim zonă tampon (buffer) Ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER De aceea la tastarea datelor se poate face corecturi icircnainte de a acţiona tasta ENTER

La generarea sfacircrşitului de fişier se recomandă ca icircnainte de a acţiona tasta CTRL să se acţioneze ENTER Apoi se generează sfacircrşitul de fişier (^Z) şi din nou se acţionează tasta ENTER Fără această ultimă acţionare a tastei ENTER funcţia scanf nu are acces la sfacircrşitul de fişier

Funcţiile standard sscanf şi sprintf

Am văzut că funcţia scanf citeşte date de la tastatură şi realizează conversii sub controlul formatelor

Biblioteca standard a limbajului conţine o funcţie similară cu aceasta numită sscanf Deosebirea dintre aceste funcţii este faptul că funcţia sscanf presupune că datele de convertit nu se citesc de la intrarea standard ci se află icircntr-o zonă de memorie sub forma unui şir de caractere

Funcţia sscanf are ca prim parametru adresa de icircnceput a acestei zone de memorie Ceilalţi parametri ai funcţiei sscanf au aceeaşi semnificaţii cu parametri lui scanf Icircn rest funcţia sscanf realizează acelaşi lucru ca şi funcţia scanf

Funcţia sprintf realizează operaţia inversă faţă de sscanf Ea are un parametru icircn plus faţă de funcţia printf Spre deosebire de funcţia printf funcţia sprintf icircn loc să afişeze caracterele la terminal le păstrează icircntr-o zonă de memorie Adresa de icircnceput a acestei zone este definită de primul parametru al funcţiei sprintf Acest parametru poate fi numele unui tablou de tip char Ceilalţi parametri ai funcţiei sprintf au aceeaşi semnificaţie ca parametrii funcţiei printf

Funcţia sprintf returnează numărul octeţilor şirului păstrat icircn zona de memorie definită de primul parametru sau ndash1 la eroare

Pentru utilizarea acestor funcţii se include fişierul stdioh

Funcţiile standard putchar şi getchar

42

Funcţia standard putchar se poate utiliza pentru a scrie un caracter icircn fişierul standard de ieşire icircn poziţia curentă a cursorului Ea se apelează folosind o instrucţiune de apel de forma putchar(expesie)

Valoarea expresiei se consideră că este codul ASCII al unui caracter care se scrie la ieşirea standard La revenirea din putchar se returnează codul ASCII al caracterului scris la ieşirea standard sau EOF icircn caz de eroare

Funcţia getchar citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Tipul valorii returnate este int La icircntacirclnirea sfacircrşitului de fişier se returnează valoarea EOF

Funcţia getchar poate fi apelată printr-o instrucţiune de forma getchar() sau utilizacircnd-o ca operand icircntro-o expresie

c=getchar()

se citeşte caracterul curent de la intrare iar la revenirea din getchar se atribuie variabilei c codul ASCII al caracterului citit sau EOF la icircntacirclnirea sfacircrşitului de fişier

Ca şi icircn cazul funcţiei scanf caracterele de la intrarea standard sunt luate icircn considerare numai după acţionarea tastei ENTER

Funcţiile standard getch şi getche

Funcţia getche citeşte de la intrarea standard caracterul curent şi returnează codul ASCII al caracterului citit Spre deosebire de getchar această funcţie are acces direct la caracter de icircndată ce acesta a fost tastat Se apelează la fel ca şi getchar adică fie printr-o instrucţiune de apel de forma getche() fie printr-un operand al unei expresii

Funcţia getch este similară cu funcţia getche cu singura deosebire că citirea se face fără ecou (caracterul tastat nu se afişează la terminal şi nici cursorul nu se lansează) Ea se apelează icircn acelaşi mod ca şi funcţia getche

Funcţiile standard gets şi puts

Pentru a introduce de la