You are on page 1of 253

Conf. dr. ing.

ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Prefata -7

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Aceast| carte se adreseaz| celor interesai n a p|trunde "spiritul" limbajului C. Muli Sudenii participani latorice form| de nv||mnt superior bugetar c|rimultiplica acest dintre cei care au nva-at acest limbaj au ajuns sa-l cunoasca din pot care prezentau 7 7 7 document pentru numeric sau grafic, ns| Brian W. Kernighan i De nn is M . Ritchie , exemple de tipul uzul personal. atunci cnd au inventat limbajul C, aveau n minte un singur lucru: punerea la punct a unui limbaj care s| permit| scrierea unui sistem de operare cu alte minim. Toat| istoria Sudenii participani la orice form| de nv||mnt cu plat| sauefortpersoane doritoare limbajului C multe dintre ciud contra lui i cu acordul scris de sistemul n acest pot multiplica idocumentul numai |eniilecost sunt strns legate al autorului. de operare UNIX. Portarea lui subla: scop m| putei contact| sistemul de operare DOS, dup| umila mea p|rere, unul dintre cele mai slabe sisteme de operare scrise pe aceast| planet|, a ncurcat lucrurile i mai mult. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 C standard. Majoritatea firmelor produc|toare de compilatoare Cartea prezint| numai e-mail: antaltiberiu@pcnet.ro ader| la acest standard dar asigur|, n plus, o mulime de facilit|i care pot fi cunoscute numai prin citirea documentaiei de firm| a compilatorului. Lucrarea s-a n|scut ca un protest mpotriva celor care au folosit C f|r| a citi "THE C PROGRAMMING LANGUAGE, SECOND EDITION" a lui Brian W. Kernighan i Dennis M. Ritchie respectiv standardul ANSI ajungnd s|-l aplice n domenii n care alte limbaje de programare i sunt net superioare. Pentru cei interesai n calculul numeric ANEXA 1 prezint| avantajele actuale ale Alexandru FORTRAN fa| de C. Sintaxa limbajului C nu Conf. dr. ing. ANTAL Tiberiu b|trnului este una academic|, iardinnu este nici m|car un limbaj de programare de nivel nalt. Celor Universitatea Tenhic| C Cluj-Napoca care doresc s| nvee un limbaj n care reguli stricte duc la formarea unei gndiri ordonate Facultatea Construcii Pascal i Ada. le recomand limbajele de Maini Catedra de Mecanic| i Programare Curs de limbaj C | carte? Numai din experiena trecerii prin "labirintul" acestui limbaj De ce, totui, aceast putem nelege capcanele program|rii i "imperfeciunile mainii" pe care ruleaz| Copyright 2001. Toate drepturile sunt toate limbajele actuale de nivel nalt, produse de programele noastre. Pe de alt| parte, rezervate autorului. proiectare asistat| sau sisteme de gestionare a bazelor de date au interfee cu C pentru a oferi posibilitatea scrierii unor mici rutine la nivel de "asamblare" necesare optimiz|rii Multiplicarea acestui document n scop comercial este interzis|. unor aplicaii mai delicate. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Publicarea acestei carti se datoreaza prietenilor si cunoscutilor care n fazele de conceptie, 7 7 document pentru uzul personal. corectura si publicare a manuscrisului m-au sprijinit financiar si sufleteste. Printre cei 7care au avut contributii esentiale i amintesc pe: Horea Calin HOREA, Tony WILLOWS, 7 Sudenii participani la orice form| TARU, Mihai cu plat| sau alte persoane doritoare Ioana Carmen ICO, Ovidiu T{ de nv||mnt DAMIAN. Copertile sunt lucrarile 7 pot multiplica documentul numai contra cost"POARTA" si "CRISALIDA" prezinta ntr-o artistului plastic clujean Marin LESCHIAN. i cu acordul scris al autorului. n acest 7 scop m| puteiprogresul, constientizarea prezentului, trecerea de la concret la abstract, forma grafica contact| la: 7 7 trasformarea celui care ndrazneste sa caute eternitatea, dincolo de frumusetea trecatoare 7 - 7 7 a clipei. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Cluj, 21. I. 2001

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului.

ANTAL Tiberiu Alexandru

Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Parintilor mei. 7 Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Cuprins Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Cuprins Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Cuprins

Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. 1 Introducere n functionarea calculatoarelor . . . . . . . . . . . . . . . . . . . 10 1.1 Ciclul "fetch Sudenii participani la si execute" .de . . . . . . . . . . . . . plat| .sau. alte .persoane.doritoare10 orice form| . . nv||mnt cu . . . . . . . . . . . . . . . . . . . . . . . 1.2 Evenimente asincrone contra cost . . . . . . . . . . . . . . . . . . . . . . . . . . pot multiplica documentul numai . . . . . . . . . . i. cu .acordul .scris. al. autorului.. .n. acest 12 1.3 Algoritm, date s scop m| putei contact| la: i program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.4 Despre limbajele de programare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.4.1 Gramatica 7 ANTAL Tiberiu Alexandru formala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.4.2 Scheme sintactice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro a elementelor limbajului C . . . . . . . . . . . . . 19 2 Scurta istorie si descriere 7 2.1 Caracteristicile limbajului C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2 Standarde C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.3 Ce a rezolvat standardizarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4 Elemente de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.5 Primul program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.6 main() . . . . . . . . . . . . . . . . . Conf. dr. ing. ANTAL .Tiberiu .Alexandru. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.7 printf() . . . . . . . . . . . . . . . Universitatea Tenhic| .din.Cluj-Napoca. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.8 return() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Facultatea Construcii de Maini Catedra de Mecanic|de Programare 3 Variabile, tipuri i date si constante . . . . . . . . . . . . . . . . . . . . . . . 27 Curs de limbaj C 3.1 Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 Tipuri de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Copyright 2001. Toate drepturile sunt . . . . . . . . .autorului.. . . . . . . . . . . . . . . . . . . . . . . 28 3.2.1 Tipuri simple . . . . rezervate . . . . . . . . 3.2.1.1 Tipul void . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Multiplicarea acestui3.2.1.2 Tipuri scop comercial. este.interzis|.. . . . . . . . . . . . . . . . . . . 29 document n ntregi . . . . . . . . . . . . . . . 3.2.1.3 Tipuri reale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.3 Constante . . . . . . . . . . . nv||mnt . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Sudenii participani la .orice. form|.de . . . . . . . . . . .superior. bugetar pot .multiplica.acest 3.3.1 Constante numerice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 document pentru uzul personal. 3.3.1.1 Constante ntregi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.3.1.2 Constante reale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Sudenii participani 3.3.1.3 Constante nv||mnt .cu. plat| .sau. alte .persoane. doritoare35 la orice form| de caracter . . . . . . . . . . . . . . . . . . . . . . . . . . pot multiplica documentul numai contrair de caractere . . .scris. al. autorului.. .n. acest 36 3.3.1.4 Constanta s cost i cu acordul . . . . . . . . . . . . . . . . . scop m| putei3.3.2 Constante cu nume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 contact| la: 3.3.3 Constante ale preprocesorului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.3.4 Constante ANTAL Tiberiu Alexandru enumerate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 tel.: 0040-264-530918 4 Operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 e-mail: antaltiberiu@pcnet.ro 4.1 Operatorul de atribuire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.2 Operatori aritmetici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.2.1 Conversii la utilizarea operatorilor aritmetici . . . . . . . . . . . . . . . . . 42 4.3 Operatorii de incrementare si decrementare . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.4 Valori de adevar n C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 7
7

Cuprins Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca 4.5 Construcii de-Maini FacultateaOperatori relationali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6 Operatori i Programare Catedra de Mecanic|logici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7 Operatori pe biti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Curs de limbaj C 4.8 Atribuirea compusa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

46 47 48 53 4.9 Operatorul sizeof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Copyright 2001. Toate drepturile sunt rezervate.autorului.. . . . . . . . . . . . . . . . . . . . . . . 54 4.10 Operatorul de evaluare secventiala . . . . . . . . - 7 4.11 Operatorul expresie conditionala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 7 Multiplicarea acestui -document n scop comercial. este .interzis|.. . . . . . . . . . . . . . . . . . . 55 4.12 Precedenta operatorilor . . . . . . . . . . . . . . . . . . . . 4.13 Asociativitatea operatorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.14 Tabel cu la orice form| de nv||mnt superior bugetar pot . . . . . . . . . . 56 - Sudenii participani precedenta si asociativitatea operatorilor C . . . . . .multiplica.acest 4.15 Expresia .personal.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 ....... document pentru uzul 5 Instructiunile limbajului C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Sudenii participani la orice form|ide nv||mnt .cu. plat| .sau. alte .persoane.doritoare61 5.1 Instructiunea expresie s blocul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . pot multiplica documentul numai . . . . . . . . . . i. cu .acordul .scris. al. autorului.. .n. acest 62 5.2 Instructiunea if-else . contra cost . . . . . . . . . . . . . . . . . . . . . . . . . . scop m| putei contact| la: 5.3 Instructiunea switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 5.4 Instructiuni de ciclare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 ANTAL Tiberiu Alexandruiunea de ciclare while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 5.4.1 Instruct 5.4.2 Instructiunea de ciclare do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 tel.: 0040-264-530918 5.4.3 Instructiunea de ciclare for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 e-mail: antaltiberiu@pcnet.ro 5.5 Instructiunea break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.6 Instructiunea continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.7 Instructiunea goto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 6 Functia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6.1 Apelul functiilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Conf. dr. ing. ANTAL Tiberiu-ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.2 Definirea unei functAlexandru Universitatea Tenhic| din Cluj-Napoca-ii - exemplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 6.2.1 Definirea unei funct 6.3 Construcii de-ie . . . FacultateaApelul de functMaini. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 6.3.1 Conversii aritmetice standard la apelul de functii . . . . . . . . . . . . . 79 Catedra de Mecanic| i Programare 6.3.2 Apelul unei functii - exemplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Curs de limbaj C 6.4 Prototipuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 6.5 Parametrii functiilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Copyright 2001. Toate drepturile sunt rezervate autorului. 6.6 Ordinea evaluarii argumentelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 7 6.7 Transferul prin valoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Multiplicarea acestui document n scop comercial este.interzis|.. . . . . . . . . . . . . . . . . . . 84 6.8 Variabile externe sau variabile globale . . . . . . . . . . 6.8.1 Vizibilitatea (scope) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Sudenii participani la orice form| de -ia . . . . . . . .superior. bugetar . . . .multiplica.acest nv||mnt . . . . . . . . . . . . . pot . . . . . . . . . . 87 6.8.2 Declaratia si definit - 6.9 Stiva . . . . . . . . . . . document pentru .uzul .personal.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 6.9.1 Stiva si limbajul C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 6.9.2 Exemplu de lucru cu stiva . . . .cu. plat| .sau. alte .persoane.doritoare89 Sudenii participani la orice form| de nv||mnt . . . . . . . . . . . . . . . . . . . . . . . . 6.10 Organizarea memoriei pentru programele n execut al . . . . . . . . . . . . . pot multiplica documentul numai contra cost i cu acordul scris-ie autorului.. .n. acest 90 6.11 Durata de existent 7 scop m| putei contact| la: -a sau persistenta variabilelor . . . . . . . . . . . . . . . . . . . . . 91 6.11.1 Durata de existenta auto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 -7 6.11.2 Durata de existenta static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 -7 ANTAL Tiberiu Alexandru de existenta register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 6.11.3 Durata -7 tel.: 0040-264-530918 legare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 6.12 Tipuri de e-mail: antaltiberiu@pcnet.rosi modulele de program - un exemplu comentat . . . . . . 94 6.12.1 Legarea 6.12.2 Legarea si duratele de existenta ale variabilelor . . . . . . . . . . . . . 96 -7 6.13 Recursivitatea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 7 Preprocesarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
8

Cuprins Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini 8 PoantoriMecanic|. i Programare . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Catedra de . . . . . . . . . . . . 8.1 Declararea poantorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Curs de limbaj C 8.2 Operatorul adresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 7

8.3 Operatorul de indirectare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Copyright Ce este NULL ? . . . . . sunt . . . . . . . . .autorului.. . . . . . . . . . . . . . . . . . . . . . 112 8.4 2001. Toate drepturile . . . . rezervate . . . . . . . . 8.5 Poantorii si argumentele functiilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Multiplicarea acestui numar variabil de comercial este.interzis|.. . . . . . . . . . . . . . . . . . 114 8.6 Functii cu document n scop parametri . . . . . . . . . 7 8.7 Poantori la poantori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 8.8 Poantori la functii . . . . . . . nv||mnt . . . . . . . . . . . . . . . . . . . . . . . . . 117 Sudenii participani la orice form|.de . . . . . . . . . . .superior. bugetar pot .multiplica.acest document pentru uzul personal. 9 Tablouri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 9.1 Declararea tablourilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Sudenii participani la orice form| de nv||mnt .cu. plat| .sau. alte .persoane.doritoare 9.2 Accesul la elementele de tablou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 pot multiplica documentul numai contra cost i cu .acordul .scris. al. autorului.. .n. acest 9.3 Operatorul de indexare al tablourilor . . . . . . . . . . . . . . . . . . . . . . . 122 scop m| putei contact| la: 9.4 Conversia numelor de tablouri n poantori . . . . . . . . . . . . . . . . . . . . . . . . . . 122 9.5 Calculul pozitiei si a valorii celui de al i-elea element de tablou . . . . . . . . . 123 - ANTAL Tiberiu Alexandru 9.6 Aritmetica poantorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 9.7 Tablouri multidimensionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 tel.: 0040-264-530918 e-mail:9.8 Transferul tablourilor si functiilor ca parametri de functie . . . . . . . . . . . . 129 antaltiberiu@pcnet.ro 9.8.1 Transferul unui tablou unidimensional . . . . . . . . . . . . . . . . . . . . . 129 9.8.2 Transferul unui tablou unidimensional prin poantor . . . . . . . . . . 130 9.8.3 Operatorii * si ++ la poantori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 9.8.4 Transferul unui tablou bidimensional . . . . . . . . . . . . . . . . . . . . . . . 132 9.8.5 Care notatie o folosim? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 9.9 iruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Conf. dr. ing. ANTAL Tiberiu n cazul de siruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 9.9.1 Atribuirea Alexandru Universitatea Tenhic| din Cluj-Napocaa sirurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 9.9.2 Sortarea alfabetica 7 9.9.3 Concatenarea Facultatea Construcii de Maini sirurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 9.10 Mecanic| i- iruri . . . . . Catedra de Poantori la sProgramare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 9.10.1 Curs de limbaj C Consideratii despre cresterea vitezei programelor . . . . . . . . . . 139 9.10.2 Tablouri de poantori la siruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Copyright 2001. Toate drepturile sunt rezervate autorului. 10 Structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 10.1 Operatorul de selectie a unui membru de structura . . . . . . . . . . . . . . . . . 144 7 Multiplicarea acestui-document n scopstructura . este.interzis|.. . . . . . . . . . . . . . . . . . 146 10.2 Comparatie ntre tablou si comercial . . . . . . . . . . 7 10.3 Atribuirea structurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Sudenii participani lavariabilelor de tipul structura ca parametri de functii . . . . .acest 10.4 Transferul orice form| de nv||mnt superior bugetar pot multiplica . 147 7 10.5 Poantori la structuri document pentru uzul personal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 10.5.1 De ce (*p).membru? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 10.5.2 la orice form| de nv||mnt . . . . . . . . . . . . . . . . . . . . . . . 149 Sudenii participaniUtilizarea lui p->membru . . .cu. plat| .sau. alte .persoane. doritoare pot multiplica10.5.3 Problema transferului princu acordul .scris. al. autorului.. .n. acest documentul numai contra cost i poantor . . . . . . . . . . . . . . . . . 150 10.6 ntoarcerea la: valori structura de catre o functie . . . . . . . . . . . . . . . . . 151 7 7 scop m| putei contact| unei 10.7 Crearea unei liste nlantuite prin folosirea structurilor . . . . . . . . . . . . . . 153 7 10.7.1 Parcurgerea listei simplu nlantuite . . . . . . . . . . . . . . . . . . . . . . . 155 7 ANTAL Tiberiu Alexandru 10.8 Instructiunea typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 tel.: 0040-264-530918 7 union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 10.9 Tipul de data e-mail:10.10 Cmpuri de biti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 antaltiberiu@pcnet.ro -

11 Consideratii privind stilul de programare n limbajul C - generalizarea sortarii 7


9

Cuprins Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca prin inserare de Maini 7 Facultatea Construciidirecta cu ajutorul poantorilor la functii . . . . . . . . . 160 11.1 Terminologie si notatii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Catedra de Mecanic| i Programare 11.2 Sortarea prin inserare directa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 7 Curs de limbaj C 11.3 Implementarea algoritmului de sortare . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

11.4 Sa revenim la problema initiala ... poantorii la functii . . . . . . . . . . . . . . . . 163 7 - 7 Copyright 2001. Toate drepturile sunt rezervate autorului. 12 Operatii de intrare/iesire n C . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Multiplicarea acestui document stdout . . . . . . . . . este .interzis|.. . . . . . . . . . . . . . . . . . 173 12.1 Functii de iesire pe n scop comercial . . . . . . . . . . 12.2 Functii de intrare de pe stdin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 12.3 Functii pentru operatii cu fisiere . . . . .superior. bugetar pot .multiplica.acest Sudenii participani la orice form| de nv||mnt . . . . . . . . . . . . . . . . . . . . . . . . . 180 12.3.1 Deschiderea fisierelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 document pentru uzul personal. 12.3.2 Scrierea datelor ntr-un fisier . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 12.3.3 Citirea si afisarea datelor dintr-un fisier . . . . . . . . . . . . . . . . . . . 183 Sudenii participani la orice fisiere de nv||mnt .cu. plat| .sau. alte .persoane. doritoare 12.4 Fisiere ASCII si form| binare n C . . . . . . . . . . . . . . . . . . . . . . . . . 185 - pot multiplica12.4.1 Pozitionarea n fisierele binare . . . . . .scris. al. autorului.. .n. acest documentul numai contra cost i cu acordul . . . . . . . . . . . . . . . . 186 scop m| putei contact| la: 12.5 Lucrul cu nregistrari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 7 12.6 Citirea parametrilor din linia de comanda . . . . . . . . . . . . . . . . . . . . . . . . . 192 7 ANTAL Tiberiu Alexandru 13 0040-264-530918 7 tel.: Alocarea dinamica a memoriei . . . . . . . . . . . . . . . . . . . . . . . . . 197 7 e-mail:13.1 Functii pentru alocarea dinamica a memoriei . . . . . . . . . . . . . . . . . . . . . . 198 antaltiberiu@pcnet.ro 13.2 Alocarea dinamica a memoriei pentru vectori . . . . . . . . . . . . . . . . . . . . . . 199 7 13.3 Alocarea dinamica a memoriei pentru matrice . . . . . . . . . . . . . . . . . . . . . . 203 7 13.4 Structuri dinamice de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 14 Biblioteca C Standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 14.1 <assert.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Conf. dr. ing. ANTAL Tiberiu .Alexandru. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 14.2 <ctype.h> . . . . . . . . . . . . . Universitatea Tenhic| din.Cluj-Napoca. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 14.3 <float.h> . . . . . . . . . . . . 14.4 <limits.h> . Maini Facultatea Construcii de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 14.5 Mecanic| i . . . . . . . . . . Catedra de <math.h> .Programare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 14.5.1 Curs de limbaj C Functii trigonometrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 14.5.2 Functii exponentiale si logaritmice . . . . . . . . . . . . . . . . . . . . . . . . 216 14.5.3 Cel mai apropiat ntreg, valoare absoluta, resturi . . . . . . . . . . . 216 7 Copyright 2001. Toate drepturile sunt rezervate autorului. 14.5.4 Tratarea conditiilor de eroare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 14.6 <setjmp.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 Multiplicarea acestui document.n. scop comercial. este.interzis|.. . . . . . . . . . . . . . . . . . 218 14.7 <signal.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14.8 <stdarg.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Sudenii participani la .orice. form|.de . . . . . . . . . . .superior. bugetar pot .multiplica.acest 14.9 <stdio.h> . . . . . . . . . . nv||mnt . . . . . . . . . . . . . . . . . . . . . . . . . 219 14.9.1 Constante document pentru uzul personal.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 14.9.2 Functii pentru operatii cu fisiere . . . . . . . . . . . . . . . . . . . . . . . . . 221 14.9.3 Functii pentru de- ire cu format . plat| .sau. alte .persoane.doritoare - form| ies nv||mnt cu . . . . . . . . . . . . . . . . . . . . . . 222 Sudenii participani la orice pot multiplica14.9.4 Functii pentru intrare cui cu acordul .scris. al. autorului.. .n. acest documentul numai contra cost format . . . . . . . . . . . . . . . . . . . . 224 14.9.5 Functii de intrare/iesire la nivel de caracter . . . . . . . . . . . . . . . . 225 scop m| putei contact| la: 14.9.6 Functii de intrare/iesire directe . . . . . . . . . . . . . . . . . . . . . . . . . . 226 14.9.7 Functii de pozitionare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 ANTAL Tiberiu Alexandru pentru tratarea erorilor . . . . . . . . . . . . . . . . . . . . . . . . . . 227 14.9.8 Functii tel.: 0040-264-530918 14.10 <stdlib.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 e-mail:14.11 <string.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 antaltiberiu@pcnet.ro 14.12 <time.h> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
10

Cuprins Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Bibliografie . . . . . . . Maini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 Facultatea Construcii de . . . . Catedra de Mecanic| i Programare ANEXAlimbaj C 7 comparatie C - FORTRAN . . . . . . . . . . . . . . . . . . 243 Curs de 1 - Scurta

ANEXA 22001. Toatedeclaratiilor C rezervate autorului. . . . . . . . . . . . . . . 246 Copyright - Citirea drepturile sunt . . . . . . . . . . . Glosar . . . . . . . . . . . . scop . . . . . . . . . . . . . Multiplicarea .acestui.document. n . . . comercial este.interzis|. . . . . . . . . . . . 252 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

11

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca "C este un limbaj ambiguu si usor subcultural." - Facultatea Construcii de Maini Horea Calin HOREA 7 Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

1 Introducere n functionarea calculatoarelor

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare nd ve i ncepe a citi aceste rnduri trebuie acordul scris vorba despre o c acest pot multiplica documentul numai contra cost i cu s| tii c| este al autorului. n |l|torie scop m|n lumea mentalului, iar dispoziia voastr| trebuie s| fie corespunz|toare. Pentru putei contact| la: a nv|a un limbaj de programare sau a scrie programe ntr-un limbaj de programare trebuie s| avei m|car habar de cum funcioneaz| calculatorul pe care-l vei utiliza. Ceea ANTAL TiberiuoAlexandru ce urmeaz| este sumar| introducere n lumea funcion|rii sistemelor de calcul. Ar fi bine tel.: 0040-264-530918 detalii i s| v| concentrai asupra ideilor mari. Foarte probabil c| s| nu v| cramponati n e-mail: nelege tot, dar asta nu e important; trecei mai departe, iar dac| vei simi nevoia nu vei antaltiberiu@pcnet.ro s| v| delectai mai pe larg cu acest subiect, exist| c|ri suficiente despre hardware i sisteme de operare.

1.1 Ciclul "fetch si execute" Conf. dr. ing. ANTALsistem complex format din multe componente. Inima, sau mai bine Un calculator este un Tiberiu Alexandru zis, creierul calculatorului este Unitatea Central| de Prelucrare sau UCP (Central Universitatea Tenhic| din Cluj-Napoca Processing Facultatea Construcii de Maini Unit sau CPU), singura care poate executa calcule Catedra de Mecanic| mpreun| cu instruciuni i care controleaz| celelalte componente i Programare ale sistemului de calcul. Unitatea Aritmetic| i Logic| (Arithmetic Curs de limbaj C and Logic Unit sau ALU) este o parte a UCP care poate realiza operaii de tipul aritmetic cu ntregi (adunare, sc|dere, nmulire Copyright 2001. Toate drepturileii pe bii sau booleene. Operaiile n virgul| flotant| sunt etc.), opera sunt rezervate autorului. n general realizate de o componenta separat|, care poate face parte 7 Multiplicarea acestui din UCP sau scop comercial este interzis|. document n nu, numit| "unitate pentru calcule n virgul| flotant|" UCP sub forma unui (Floating Point Unit sau FPU). O alt| parte a UCP este unitatea de circuit integrat gestionare a de nv||mnt superior bugetar pot multiplica acest Sudenii participani la orice form| memoriei (Memory Management Unit sau MMU) folosit| pentru calcularea adreselor. Evoluia tehnologiei i a conceptelor de proiectare document pentru uzul personal. a permis ca n calculatoarele moderne UCP s| fie ngr|m|dit, mpreun| cu FPU i MMU, pe un singur circuit integrat. Acesta are sarcina de a executa programele si se Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare numeste microprocesor. numai contra cost i cu acordul scris al autorului. n acest pot multiplica documentul scop program contact| list| de instruciuni care sunt executate mecanic de UCP. Un m| putei este o la: Instruciunile nelese de UCP sunt foarte simple, iar limbajul n care se scriu poart| ANTAL Tiberiu Alexandru 7 . Fiecare calculator are propriul limbaj main| i poate denumirea de lim b aj m as ina tel.: 0040-264-530918 executa programe numai dac| acestea au fost scrise n propriul lui limbaj main|. Un program scris ntr-un limbaj e-mail: antaltiberiu@pcnet.romain| diferit se poate executa numai dup| traducerea lui n cel cunoscut de UCP pe care se va executa. Cnd UCP execut| un program, programul trebuie s| fie stocat n m em oria principala 7 a sistemului de calcul, adesea numit| i RAM (Random Access Memory). Pe lng|
12

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca instruciuni, programul va conine i date care vor fi prelucrate de programul n sine. Facultatea Construcii de Maini Memoria principal| i Programare dintr-o secven| de locat ii . Aceste locaii sunt Catedra de Mecanic| este format| numerotate, iar num|rul de ordine al fiec|rei locaii este unic i se numete adresa . 7 Curs de este o C Adresa limbaj modalitate de a stoca sau a extrage o informaie particular| dintre

miliardele de informaii stocate n memorie. Cnd trebuie s| acceseze o informaie Copyright|2001. Toateodrepturile sunt rezervateUCP va transmite memoriei principlale particular , cum ar fi instruciune sau o dat|, autorului. adresa la care se afl| informaia dorit| sub forma unor semnale electrice. Memoria va Multiplicarea acestui document n datei comercial este interzis|. r|spunde prin trimiterea napoi a scop stocate spre UCP la adresa primit| anterior de la acesta. UCP poate stoca i date n memoria principal| prin specificarea simultan| a adresei la care se va face stocarea i a datei de stocat. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Dei la nivelul limbajului main| operaiile care pot fi executate de UCP sunt elementare i simple (adunare, sc|dere, comparaie, etc.), intern UCP va funciona dup| o schem| Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare foarte complex| pentru cazul execuiei anumitor operaii. Instruciunile sunt stocate n pot multiplica documentul numai contra cost i cu acordul scrislimbajul mainii de unde memoria principal| sub forma unei secvene de instruciuni n al autorului. n acest scop m| mod ciclic extrase i executate. Acest proces repetat de citire i execuie a sunt n putei contact| la: instruciunilor se numete fetch-and-execute cycle adic| ciclu de extragere i execuie ANTAL iunilor. Alexandru | excepie care va fi l|murit| mai trziu, aceasta este tot ceea a instruc Tiberiu Cu o singur ce face UCP. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Detaliile ciclului de extracie i execuie sunt de asemenea caracteristice fiecarui UCP n 7 parte, dar exist| i caracteristici comune. Orice UCP conine regis tri interni care sunt zone de memorie de dimensiune mic|, ce pot stoca un singur num|r sau o instruciune main|. O parte din regitrii UCP au utiliz|ri speciale. De exemplu, registrul num|r|tor de program (Program Counter sau PC) va stoca locul din memorie la care se afl| UCP n timpul execuiei unui program. PC-ul va stoca adresa urm|toarei instruciuni din program Conf.urmeaza ANTAL Tiberiu Alexandru fiec|rui ciclu de extragere-execuie UCP va care dr. ing. a fi executata. La nceputul 7 7 Universitatea Tenhic| din Cluj-Napoca afla care este urm|toarea instruciune de extras. folosi coninutul registrului PC pentru a n timplu Construcii de Maini Facultateaciclului de extracie i execuie, num|rul stocat n PC este actualizat pentru a stoca adresa instruciunii care va fi executat| n urm|torul ciclu. (n mare parte din cazuri Catedra de Mecanic| i Programare aceasta se afl| chiar la adresa urm|toare). Curs de limbaj C UCP este formatToate drepturile tranzistori care sunt interconectai pe o singur| achie Copyright 2001. din milioane de sunt rezervate autorului. de siliciu (numit| "chip" n englez|). Tranzistorii sunt pui n circuite care au dou| st|ri electrice distincte i stabile de pornit i oprit, ntre care pot comuta, motiv pentru care Multiplicarea acestui document n scop | cu valorile binare de 1 i 0. Pe m|sur| ce UCP aceste st|ri se pot pune n coresponden comercial este interzis|. calculeaz|, st|rile tranzistorilor se modific|, rezultnd un spaiu de st|ri determinat de Sudenii participaniala orice form| de de instruciunea din program pot multiplica acest modul de conectare tranzistorilor i nv||mnt superior bugetar care se execut|. document pentru uzul personal. Instruciunile limbajului main| se prezint| sub forma unor numere binare (secvene de 1 i 0). Fiecare instruciune are o secven| particularplat| 0 i 1. Datele pe care UCP le Sudenii participani la orice form| de nv||mnt cu | de sau alte persoane doritoare manipuleaz| sunt i ele codificate contra cost binar|. UCP poateal autorului. cu numere pot multiplica documentul numai sub form| i cu acordul scris lucra numai n acest binare. Astfel, un tranzistor deschis corespunde lui 1, iar unul nchis lui 0. Instruciunile scop m| putei contact| la: limbajului main| reprezint| secvene de 0 i 1 stocate la adrese consecutive n memorie. Cnd o instruciune se ncarc| n UCP secvena binar| din memorie se aduce n UCP, iar ANTAL Tiberiu Alexandru mecanic la instruciune. Reacia UCP este determinat| de acesta reacioneaz| n mod tel.: 0040-264-530918 este microprogramat, adic| de modul n care sunt interconectai modul n care acesta e-mail: antaltiberiu@pcnet.ro n concluzie, memoria principal| stocheaz| datele i tranzistorii din interiorul lui. instruciunile sau, ntr-un cuvnt, programul codificat n binar. UCP aduce din memorie i apoi execut| fiecare instruciune a programului n mod ciclic. UCP poate executa numai un program perfect n toate detaliile i neambiguu.
13

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al si autorului. n acest Figura 1 - Schema necesar| ntelegerii ciclului de extragere scop m| putei-contact| la:iunilor executie a instruct ANTAL Tiberiu Alexandru n Figura 1 se prezint tel.: 0040-264-530918 | o schem| foarte simpl| pentru nelegerea funcion|rii unui calculator. Memoria nu stocheaz| la o adres| un singur bit, ci grupuri de cte 8 bii care e-mail: antaltiberiu@pcnet.ro poart| numele de octet (byte). Din acest motiv, unei linii de date sau de adrese i corespunde n realitate un grup de linii de date sau adrese. n figura de mai sus se observa 7 o singura linie pentru adrese si doua pentru date. Aceste linii sunt nsa intersectate de 7 7 7 cte una oblica, ea simboliznd prezenta n realitate a unui grup de linii care au aceeasi 7 semnificatie. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Un sistem de calcul este format din mult mai multe componente dect UCP i memoria Catedra decteva din i Programare principal|, Mecanic| acestea sunt prezentate n continuare. UCP este fixat pe un circuit Curs de limbaj C | de baz|, care n plus conine magistrale, memorii RAM, ROM i alte imprimat numit plac circuite integrate: Copyright 2001. Toate drepturile sunt rezervate autorului. C h a rd d is c- u l pentru stocarea programelor i a fiierelor. Memoria principal| stocheaz| o cantitate mic n scop comercial este interzis|. Multiplicarea acestui document| de date i numai att timp ct sistemul de calcul este pus sub tensiune. Hard disc-ul este o memorie magnetic| pentru stocarea permanent| (al c|rei coninut nu se pierde la scoaterea superior bugetar pot multiplica acest Sudenii participani la orice form| de nv||mntde sub tensiune a sistemului de calcul) a unor cantit|i personal. document pentru uzul mari de informaii, dar programele trebuie nc|rcate de pe disc n memoria principal| nainte de a putea fi executate;

1.2 Evenimente asincrone

Sudenii tastatura i la orice form| de nv||mnt cu plat| sauintroduce date; C participani mou se-ul pentru ca utilizatorul s| poat| alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteito r- u l i im prim an ta care se folosesc pentru afiarea ieirilor produse de C m o n i contact| la: sistemul de calcul; ANTAL Tiberiu Alexandru C placa de ret tel.: 0040-264-530918ea care permite ca sistemul de calcul s| comunice cu alte sisteme de calcul conectate i ele la reea; e-mail: antaltiberiu@pcnet.ro

C scanner-ul care convertete imagini n numere binare care vor putea fi stocate i manipulate prin sistemul de calcul.

14

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. monitor tastatur| hard disc mouse Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro imprimant|

scanner

plac| de reea

Lista acestor componente i dispozitive r|mne deschis|, sistemele de calcul fiind astfel construite nct sa poata fi extinse prin ad|ugarea de noi dispozitive sub forma unor pla ci 7 7 7 de exten sie (expansion cards) care vin introduse n locas urile de ex tensie (expansion slots) ale pl|cii de baz|. UCP ns| trebuie s| comunice cu aceste dispozitive pentru a Conf. dr. ing. ANTAL Tiberiu Alexandru schimba informaii cu ele, iar pentru c| singurul limbaj Universitatea Tenhic| din Cluj-Napocade acesta este cel main|, fiecare dispozitiv are cunoscut nevoie de un driv er de disp ozitiv . Acesta este un program Facultatea Construcii de Maini care dac 7 Catedra de Mecanic| i Programare | este executat de UCP tie sa deruleze transferul de informaii ntre UCP i dispozitivul n cauz|. Din acest Curs de limbaj C motiv instalarea unui dispozitiv nou n sistemul de calcul se deruleaz rezervate autorului. Copyright 2001. Toate drepturile sunt| n dou| etape: se conecteaz| fizic noul dispozitiv la sistemul de calcul, apoi se instaleaz| programul driver corespunz|tor acestuia. Exist| dispozitive att de necesare Multiplicarea acestui document nion|rii sistemului interzis|. func scop comercial este de calcul nct drivere-ele corespuz|toare lor sunt stocate n memorii R O M (R ead un sistem de calcul Sudenii participani la orice form|M emory) care sunt furnizate implicit cu orice sistem O nly de nv||mnt superior bugetar pot multiplica acest de calcul. Acesta este cazul fericit n care nu avem nevoie de driver pentru a face ca document pentru uzul personal. dispozitivul s| conlucreze cu sistemul de calcul. Pentru c| aceste dispozitive vor schimba informaii cu UCP i la orice form| de nv||mnt cu plat||sau alte persoane doritoarecu Sudenii participani cu memoria principal|, ele trebuie s fie interconectate cumva acestea. Se numete magistrala (bcontra cost i)cu acordul scris electrice care transport| 7 pot multiplica documentul numai u s n englez| un grup de linii al autorului. n acest informaputei contact| la: interconectate ale sistemului de calcul. n funcie de tipul de ii ntre dispozitivele scop m| informaii transportate avem bus de da te , bus de ad rese i bu s de sem na le de control. Pe busul de adrese se vehiculeaz| informaia de selecie. O adres| va direciona o dat| ANTAL Tiberiu Alexandru particular| de pe busul de date c|tre un anumit dispozitiv sau registru de dispozitiv. Pe tel.: 0040-264-530918 busul de control se vehiculeaz| semnalele necesare comunicaiei ntre dispozitive. Un e-mail: antaltiberiu@pcnet.ro dispozitiv va folosi acest bus pentru a semnaliza altuia c| datele ateptate sunt disponibile i valide pe busul de date. Cea mai simpl| schem| de calculator este prezentat| n Figura 2. Dispozitive cum sunt tastatura, mouse-ul i placa de reea pot produce date care trebuie prelucrate de UCP. De unde va ti UCP c| datele sunt acolo? Cel mai simplu ar fi ca UCP s| verifice n mod continuu prezenta datelor, dupa care s| le prelucreze. Aceast| metod| 7
15

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca de lucru se numete n limba englez| "polling ". Este simpl| dar ineficient| pentru c| UCP Facultatea Construcii de Maini pierde preaMecanic| i Programare datelor, motiv pentru care n practic| este rar Catedra de mult timp n ateptarea utilizata. Pentru evitarea acestei situaii ineficiente de multe ori se vor utiliza ntreruperi . 7 Curs de limbajeste un semnal trimis c|tre UCP de un dispozitiv diferit de UCP. UCP O ntrerupere C

reacioneaz| la un semnal de ntrerupere suspendndu-i activitatea curent| i Copyright 2001. Toate drepturile sunt rezervate autorului. r|spunznd ntreruperii. Dup | ce a terminat tratarea ntreruperii, UCP va reveni la activitatea anterioar|, continund-o din punctul n care a ntrerupt-o. De exemplu, la Multiplicarea acestui document n o ntrerupere, UCPinterzis|. ap|sarea unei taste se genereaz| scop comercial este i ntrerupe activitatea curent|, citete tasta ap|sat|, o prelucreaz|, apoi revine la operaia pe care o executa nainte de ap|sareaparticipani la orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii tastei. document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL 2 - Cea mai simpl| schem| de calculator Figura Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Procesulde Mecanic| sus este mecanic. Semnalul de ntrerupere apare pe un pin al UCP Catedra descris mai i Programare care este construit aa nct dac| apare acest semnal i salveaz| starea curent| pentru Curs de limbaj C ca ulterior s| poat| reveni la ea i s| o continue. Salvarea const| n stocarea coninutului unor regitri maiToate drepturile sunt PC-ul. Apoi UCP sare la o adres| de memorie fix| Copyright 2001. importani, cum ar fi rezervate autorului. i ncepe s| execute instruciunile de acolo. Aceste instruciuni alc|tuiesc o rutin| de tratare a ntreruperii care face toate prelucr|rile necesare pentru a r|spunde la MultiplicareaDe obicei, rutina n scop comercial esteo parte a unui program driver a ntrerupere. acestui document de ntrerupere este interzis|. dispozitivului care a transmis ntreruperea. La terminarea rutinei de tratare a Sudenii participaniinstruciune care foreaz| UCP s| revin| la operaia pe care o efectua ntreruperii exist| o la orice form| de nv||mnt superior bugetar pot multiplica acest la momentul n care a personal. document pentru uzul sosit ntreruperea prin refacerea st|rii lui. ntreruperile permitlaUCP form| de nv||mnt cu plat| sau alte persoane obinuit de Sudenii participani orice s| trateze evenimente asincrone. n ciclul doritoare extracie-execuie totul se petrececontra ordine cu acordul scris al autorului. n acest se pot multiplica documentul numai ntr-o cost i strict | i predeterminat|. Tot ceea ce petrece face parte dintr-un ablon al unui grup de evenimente sincronizate. Din cauza scop m| putei contact| la: ntreruperilor UCP lucreaza eficient cu evenimente asincrone, adic| evenimente care apar 7 la momente imprevizibile. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 valabile numai dac| UCP are mai multe sarcini de executat. Toate acestea sunt e-mail: antaltiberiu@pcnet.ro Calculatoarele moderne folosesc multitasking pentru a executa mai multe task -uri (sarcini) n acelai timp. Unele sisteme de calcul sunt att de rapide nct pot fi folosite de mai muli utilizatori n acelai timp. Din moment ce UCP este att de rapid, el poate s|-i comute atenia de la un utilizator la altul, alocnd pentru fiecare o fraciune din timpul lui de lucru. Acest mod de aplicare al multitasking-ului se numete cu timesharing (partajare
16

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n timp). Chiar i banalele calculatoare personale folosite de un singur utilizator sunt Facultatea Construcii de Maini capabile de Mecanic| i Programare Catedra de multitasking. De exemplu, poi scrie un document ntr-un editor de text n timp ce pe ecran, undeva ntr-un col, i apare ceasul care afieaz| ora exact| n mod Curs de limbaj C din aceste sarcini individuale executate de UCP se numesc procese (sau continuu. Fiecare

thread-uri; exist| diferene tehnice ntre proces i thread dar pentru explicaiile care Copyright 2001. Toate drepturile sunt rezervate autorului. urmeaz| nu sunt importante). Un singur proces poate fi executat la un moment dat de UCP (exist| sisteme de calcul care au mai multe UCP, iar atunci se poate executa cte un Multiplicarea acestui document n scop comercial esteun proces pn| cnd: proces pe fiecare UCP). UCP va continua s| execute interzis|. ! procesul, n mod voluntar, va preda controlul UCP altor procese pentru ca i acestea s| poate fi executate; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest ! procesul poate atepta apariia unui eveniment asincron. De exemplu, procesul document pentru uzul personal. poate cere date de la hard disc sau poate atepta ca utilizatorul s| apese o tast|. n timpul atept|rii procesul este blocat si alte procese au ansa s| fie executate. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Cnd evenimentul ateptat apare, o ntrerupere va trezi procesul i acesta i va pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest continua execuia; scop m| putei contact| la: durata de timp alocat| execuiei i va fi suspendat pentru ca i ! procesul i-a folosit alte procese s| poate fi rulate. Nu toate calculatoarele pot s| suspende astfel un ANTAL Tiberiu Alexandru se spune c| utilizeaz| "preemtive multitasking". Pentru a proces; acelea care pot realiza preemtive multitasking un sistem de calcul trebuie s| aib| un circuit de tel.: 0040-264-530918 e-mail:ceas special care s| genereze ntreruperi la intervale regulate de timp. La apariia antaltiberiu@pcnet.ro unei ntreruperi de timp, UCP are ansa s| comute pe un alt proces indiferent dac| procesului actual "i convine" aceasta sau nu. Programul care realizeaz| tratarea ntreruperilor i toat| comunicaia cu utilizatorul i dispozitivele din sistemul de calcul se numete sistem de operare . Sistemul de operare este un program de baz| f|r| de care un calculator nu poate funciona. Toate celelalte Conf. dr. ing. ANTAL Tiberiu Alexandrucalcul sunt dependente de sistemul de operare. programe care se execut| pe sistemul de Universitatea Tenhic|de operare mai cunoscute sunt OS/2 Warp, UNIX, DOS, Windows Cteva din sistemele din Cluj-Napoca 98, Windows NT, Windows 2000 Facultatea Construcii de Maini i Macintosh OS. Catedra de Mecanic| i Programare Curs de limbaj C

1.3 Algoritm, date si program -

Copyright 2001. Toate o secventa detaliata de actautorului. Algoritmul reprezinta drepturile sunt rezervate -iuni executate pentru ndeplinirea unor 7 -7 7 sarcini. Teoretic, un algoritm trebuie sa ajunga la rezultat dupa un numar finit de pasi. 7 7 7 7 Denumirea de algoritm a fost data n onoarea matematicianului 7 Multiplicarea acestui document n scop comercial este interzis|. iranian Al-Khawarizmi. Pentru un calculator, da tele se prezinta sub forma unor numere, caractere, imagini etc. 7 obtinute participani la orice form|de nregistrare, superior bugetarintroduse n sistemul printr-o metoda oarecare de nv||mnt cu scopul de a fi pot multiplica acest 7 Sudenii de calcul, pentru uzul prelucrate sau transmise la distanta. Datele n sine nu au o -7 document stocate si personal. semnificatie. Numai n urma interpretarii lor cu ajutorul unui sistem de prelucrare a 7 datelor, acestea primesc o semnificatie, devenind informatie. Activitatea de programare Sudenii participani lala universul problemei realecu cel al sistemului de calcul, mult mai presupune trecerea de orice form| de nv||mnt la plat| sau alte persoane doritoare pot multiplica documentul numai contrafiind decucomplexitate prea mare este necesara ngust. Universul real al unei probleme cost i o acordul scris al autorului. n acest 7 scop m| puteilimitare sila: trecerea prin contact| abstractizare la cel specific sistemului de prelucrare a datelor. Asa a aparut notiunea de model, o descriere a realita-ii, simplificata prin ignorarea 7 7t 7 anumitor detalii. Prin folosirea unui model n locul problemei reale si prin abstractizare ANTAL Tiberiu Alexandru se ajunge la simplificarea prelucrarii realita-ii. Rolul abstractizarii este formularea unui 7 7t 7 tel.: 0040-264-530918 algoritm de transformare a unor date. Algoritmul specifica actiunile de prelucrare, iar 7 e-mail: antaltiberiu@pcnet.ro datele descriu universul abstractizat. Pentru a putea fi prelucrate pe un sistem de calcul, algoritmul trebuie scris ntr-un limbaj de programare, rezultatul acestei activita-i 7t numindu-se program . n cadrul limbajului de programare, da tele sunt specificate prin intermediul declarat iilor , iar algoritmul prin instruct iuni. 17

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Limbajul de programare este un mijloc de comunicare ntre programator i calculator. Un Curs de limbaj C limbaj se numete limbaj natural dac| are capacitatea de a evolua, fiind rezultat n urma dezvolt|rii 2001. Toate drepturile sunt rezervate autorului. limbajele de programare, nu Copyright lui n timp. Un limbaj artificial, cum sunt i evolueaz| n timp de la sine. Evident i limbajele de programare evolueaz|, ele fiind un mijloc de comunicaie documentn scop |, dar aceasta numai din cauza oamenilor care le Multiplicarea acestui ntre om i main comercial este interzis|. extind sau mbun|t|esc pentru a fi ct mai utile domeniului n care se aplic|. Descrierea unui limbaj se face prin sem an tica i gra m atica . La rndul ei, gramatica se mparte n 7 7 Sudenii participani la orice form| studiaz| leg|turile dintre cuvintelemultiplica acest m orfolog ie i sintaxa . Semantica de nv||mnt superior bugetar pot din dicionarul 7 document pentru uzul descrise de acestea, adic| nelesul cuvintelor. Morfologia studiaz| limbajului i obiectele personal. modific|rile suferite de cuvinte pentru a realiza nuanarea nelesurilor. n limbajele de Sudenii participani la orice form| ri morfologice.cu plat| sau alte persoane doritoare programare nu se folosesc modific|de nv||mnt pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Un program este o secven| de instruciuni pe care un sistem de calcul le execut| pentru scop m| putei contact| la: a ndeplini o sarcin|. Pentru ca programul s| poat| fi executat, el trebuie s| fie scris ntr-un limbaj de programa re . Limbajele de programare difer| de cele umane fiind ANTAL Tiberiu Alexandru complet neambigue i foarte stricte cu privire la ce este i ce nu este permis n program. tel.: 0040-264-530918 | ce este permis construiesc sintaxa limbajului. Regulile sintactice Regulile care determin e-mail: | vocabularul de baz| al limbajului i modul n care se pot construi programe specificantaltiberiu@pcnet.ro utiliznd cicluri, ramificaii sau subprograme. Un program corect sintactic este unul care nu are erori n urma compil|rii (compilarea este operaia de traducere a unui program scris ntr-un limbaj de nivel nalt n limbajul main|). Dac| apar erori programul trebuie corectat si apoi, din nou, compilat. Deci, pentru a avea succes n programare trebuie s| nv|ai sintaxa limbajului de programare utilizat. Totui, sintaxa este numai o parte din poveste. Nu este suficient s| scrii programe care se compileaz| f|r| erori. Dorim ca Conf. dr. ing. ANTAL Tiberiu Alexandru programul n Tenhic| din iei s| produc| rezultate corecte. Asta nseamn| c| nelesul Universitatea urma execu Cluj-Napoca programului trebuie s| fie corect. nelesul programului se numete sem an tica , iar un 7 Facultatea Construcii de Maini program corect semantic face ceea ce dorete programatorul. Catedra de Mecanic| i Programare Curs de limbaj C Sintaxa unui limbaj de programare se memoreaz|, dupa care treceti la semantic| i 7 ncercati s| nelegei cum lucreaz| anumite instruciuni ale limbajului. Copyright 2001. Toate drepturile sunt rezervate autorului.

1.4 Despre limbajele de programare

1.4.1 Gramatica formala este interzis|. 7 Multiplicarea acestui document n scop comercial

Pentru c| maina de calcul este numai un suport f|r| cel mai mic gram de inteligen| s-a dezvoltatparticipani la orice form| de nv||mnt superior descrie noiuni de gramatic| Sudenii o teorie a limbajelor formale care, printre altele, bugetar pot multiplica acest necesare nelegerii aspectelor sintactice ale limbajelor de programare. n viziunea lui N. document pentru uzul personal. Chomsky, creatorul teoriei limbajelor formale, gramatica G = G(T, N, P, S) unui limbaj L(G) este specificata prin: 7 Sudenii participani laT de simboluri terminale, numite i sau alte ;persoane doritoare a) un vocabular orice form| de nv||mnt cu plat| cuvin te pot multiplica documentul numai contra cost i cu acorduli scrisgorautorului. n acest b) o mulime N de simboluri neterminale, numite cate al ii gra m aticale ; scop m| putei ime P de producii numite i reguli sintactice ; c) o mulcontact| la: d) un simbol S din N , numit simbol de start . ANTAL Tiberiu Alexandru Limbajul L(G) este mulimea cuvintelor (adic| a irurilor de simboluri terminale) care se tel.: 0040-264-530918 pot obine din simbolul S prin intermediul regulilor de producie. Fie limbajul L definit e-mail: antaltiberiu@pcnet.ro prin urm|toarea gramatic|:
T={a, b, c}; N={S, A, B}; P={S

AB, A

a, A

ac, B

b, B

cb}

Semnul ! are semnificaia trece prin substituie n. n limbajul de mai sus se pot genera
18

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca urm|toarele producii de cuvinte: Facultatea Construcii de Maini Catedra de Mecanic| i Programare S ! AB ! aB ! ab Curs AB limbaj C acb de ! aB ! S ! S ! AB ! acB Copyright 2001. S ! AB ! acB

! acb Toate drepturile sunt rezervate autorului. ! accb

Multiplicarea acestui limbajul de mai sus nu existeste interzis|.cuvinte i c| schimbarea Se poate ar|ta c| n document n scop comercial | mai multe ordinii substituiilor conduce la aceleai cuvinte, adic| S ! AB ! Ab ! ab . Se observ| c| abc este un cuvntla orice poate obine n dou| moduri, din acest motiv el va aveaacest Sudenii participani care se form| de nv||mnt superior bugetar pot multiplica dou| semnificaii dup| cum litera c se obine din substituia A ! ac sau B ! cb . Expresii cu document pentru uzul personal. mai multe semnificaii exist| i n limbile vorbite. Fie propoziia: Aceasta este masa. Ea poate s| semnifice c| n faa noastr| st| obiectul pe care ne lu|m masa sau c| avem n faa Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare noastr| un cablu care este mas| electric| a unui dispozitiv electronic. Dac| nu se cunoate pot multiplica documentul numai contra costceacu acordul scris al ia este neprecizat|. contextul, adic| propoziiile din care rezult| i actual|, semnificaautorului. n acest scop m| putei contact| la: Exist| i alte metode pentru a descrie gramatica limbajelor formale, cea mai frecvent ANTAL Tiberiu Alexandru utilizat| fiind cea a lor I. Backus i P. Naur. Aici se folosesc metasimbolurile de tip paranteze: < > i metasimbolul: |, pentru conjuncia fie. Simbolul ! este nlocuit prin ::= . tel.: 0040-264-530918 Parantezele se folosesc pentru a descrie modul de nlocuire a simbolurilor prin cuvinte sau e-mail: antaltiberiu@pcnet.ro fraze care descriu semnificaiile simbolurilor. Rezultatul este obinerea unei mulimi de definiii. Regula S ! A B se poate obine din definiia:
<propozit ie>::= <su bie ct><p red icat> <sub iect>::= oam enii | cin ii <p re dicat>::= dor m | ma nnca 7 7

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatealiniilor dedin Cluj-Napoca Semnificaia Tenhic| mai sus este: 1. O <propozi ie> se definete ca fiind format| dintr-un <subiect> urmat de un <predicat> . Facultatea Construcii de Maini 2. Un <subiect> se definete ca fiind fie cuvntul "oam enii " fie cuvntul "cin ii ". Catedra de Mecanic| i Programare 3. Unde limbaj C se definete ca fiind fie cuvntul "dorm " fie cuvntul "m a nnca ". 7 7 Curs <predicat> Ideea de baz| este c| drepturile sunt rezervate autorului. Copyright 2001. Toate o <propozit ie> poate fi derivat| dintr-un simbol de start prin aplicarea unor reguli de nlocuire. Multiplicarea acestui document n scop comercial este interzis|.

1.4.2 Scheme sintactice

Sudenii participani la orice form| de nv||mnt superiori bugetar pot multiplica acest Regulile de producie ale unei gramatici pot fi transcrise sub forma unor desene care se numesc schem e personal. document pentru uzulsintactice. Fiind date regulile de producie, prin eliminarea simbolurilor neterminale, dup| mai multe faze, se obin numai simboluri terminale. Convenind c| simbolurile neterminalenv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice form| de se scriu cu majuscule - documentul B - iar cele terminale cu acordul scris al autorului. n acest pot multiplica mai jos A i numai contra cost i cu litereputei contact| la: , y , z i w , pentru scop m| mici - mai jos x regulile urm|toare scrise folosind formalismul Backus-Naur: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 S::= A B e-mail: y A::= x | antaltiberiu@pcnet.ro
B::= z | w

Gramatica transcris| folosind scheme sintactice se prezint| n Figura 3. n funcie de limbajul de Figura 3 - Modul de specificare a programare abordat, unii autori prefer| s| gramaticii prin diagrame de sintax|
19

Capitolul 1 - Introducere n funct ionarea calculatoarelor Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca foloseasc| Construcii de Maini Facultatea n specificaiile tehnice ale limbajului, diagrame de sintax|, iar alii, Formalismul Backus-Naur (FBN). Diagramele de sintax| sunt lizibile, ns| necesit| mult Catedra de Mecanic| i Programare spaiu. Din acest motiv produc|torii de limbaje de programare prefer| s| foloseasc| FBN, Curs dedescrierea este mai scurt|, dar i mai greu de neles. n care limbaj C

Copyright 2001. Toatemai multor sunt rezervate autorului.definiia limbajului, comitetul Dup| explorarea drepturile metode formale pentru pentru standardizarea limbajului C a decis s| foloseasc| FBN pentru sintaxa Multiplicarea acestui document n scop comercial esteOrice ncercare mai ambiioas| s-a limbajului i proza pentru constrngeri i semantic|. interzis|. considerat c|: ! va duce la ntrzierea apari de nv||mnt superior bugetar pot multiplica acest Sudenii participani la orice form| iei standardului; ! va pentru uzul mai puin document face limbajulpersonal. accesibil utilizatorilor. n standardul C termenii "comportament nespecificat", "nedefinit" i "definit prin Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare implementare" sunt folosii pentru a categoriza rezultatele produse de programe ale pot multiplica documentul descrise sau nu pot fi descrise scris al autorului. n acest c|ror propriet|i nu sunt numai contra cost i cu acordul complet n standard. Scopul scop m| termeni a fost crearea unei oarecare variet|i n rndul implement|rilor de C n acestor putei contact| la: vederea categorizarii lor dup| calitate, existnd implement|ri de C mai populare care 7 ANTAL Tiberiu Alexandru deviaz| uneori de la standard. Comportamentul nespecificat las| la latitudinea implementatorului limbajului traducerea unor secvene de program, f|r| a permite ns| tel.: 0040-264-530918 ca traducerea programului s| nu reueasc| din acest motiv. Comportamentul nedefinit e-mail: antaltiberiu@pcnet.ro permite ca implementatorul s| nu prind| anumite erori de program care sunt dificil de diagnosticat. De asemenea, acoper| problematica anumitor extensii ale limbajului prin furnizarea de definiii n unele cazuri de comportamente nedefinite. Comportamentul definit prin implementare las| implementatorului libertatea alegerii unei rezolv|ri proprii, ns| aceasta trebuie s| fie explicat| utilizatorului. Pe baza acestui comportament utilizatorul trebuie s| poat| lua decizii semnificative referitoare la scrierea codului. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

20

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

2 Scurta istorie si descriere a 7 elementelor limbajului C

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare storia limbajului C ncepe la firma Bell Labs care a ini scris al autorului. n acest pot multiplica documentul numai contra cost i cu acordul iat dezvoltarea lui la nceputul scop anilor '70 contact| scrierea sistemului de operare UNIX utilizat de c|tre noile m| putei pentru la: calculatoare - pentru vremea de atunci - DEC (D igital E quipment C orporation). Pn| atunci sistemele de operare erau scrise n limbaj de asamblare. Acesta era obositor, greu ANTALinut i consumator de timp. Cei de la Bell Labs au neles c| era nevoie de un nou de ntre Tiberiu Alexandru tel.: 0040-264-530918 de nivel nalt, ct mai rapid i ct mai uor de ntreinut, care s| limbaj de programare e-mail:|antaltiberiu@pcnet.ro permit implementarea proiectelor din firm|. ntruct limbajele de programare de nivel nalt existente pe atunci (COBOL, FORTRAN, PL/I, Algol) erau prea ncete pentru codul sistemelor de operare, programatorii de la Bell Labs au decis s| scrie propriul limbaj de programare. Noul limbaj s-a bazat pe limbajul B al lui Ken Thompson care a fost inspirat de BCPL (B asic C ombined P rogramming L anguage) scris de Martin Richards, care era o versiune simplificat| a limbajului CPL (C ambridge P rogramming L anguage). Pentru c| B avea cteva restricii, n 1972, Bria n K ernig han i De nn is Ritch ie de la AT &T Be ll Conf. dr. ing. ANTAL Tiberiu Alexandru Labs , au creat limbajul C ca o extensie a limbajului B. Universitatea Tenhic| din Cluj-Napoca Facultatea | totul a pornitMaini joc cu "asteroizi" pe care l jucau n timpul serviciului Se spune c Construcii de de la un Catedra de Mecanic| central al companiei. Performanele acestuia l|sau de dorit. Cu folosind calculatorul i Programare Curs de limbaj C al unui 386 i deservind aproximativ 100 de utilizatori, au ajuns la puterea de calcul concluzia c| nu pot controla suficient de bine "navele spaiale", motiv pentru care erau distrui repede Toate drepturile sunt rezervate autorului. Copyright 2001.la trecerea printre asteroizi. Avnd n birou un DEC PDP-7 care nu era folosit, au hot|rt s| rescrie jocul. Problema era c| DEC nu avea sistem de operare, aa c| au nceput acestui document scurt timp scrierea sistemului de operare a devenit un Multiplicarea s| scrie unul. n n scop comercial este interzis|. proiect mai important dect jocul de la care a pornit totul. El fiind scris n limbaj de asamblare, un limbaj main| umanizat, n care irurile binare de 0 i 1 corespunz|toare Sudenii participani laale limbajului main| s-au nlocuit prin grupuri de litere i cifre diferitelor instruciuni orice form| de nv||mnt superior bugetar pot multiplica acest document pentru greu.personal. nainta mult prea uzul Atunci s-au hot|rt s| rescrie sistemul de operare ntr-un limbaj de nivel nalt care s| fie portabil pe diferite tipuri de sisteme de calcul. n acest caz, tot Sudeniiar fi fost necesar eraform| de nv||mnt cu plat| sau alte persoane doritoare ceea ce participani la orice reimplementarea compilatorului pentru fiecare sistem de calcul nou, dup| care sistemul de contra cost i cu compila. Limbajul care a n acest pot multiplica documentul numai operare se puteaacordul scris al autorului. fost ales n acest scop s-a numit B dar scop m| putei contact| la: el nu permitea utilizarea tuturor avantajelor oferite de instruciunile lui PDP-11. Astfel a fost inventat un nou limbaj, C. ANTAL Tiberiu Alexandru C nu0040-264-530918 imediat dup| crearea lui. Am putea spune c| numai dup| 6 ani de tel.: a devenit popular la inventarea lui, n 1978, s-a auzit de el prin memorabila carte a lui Brian Kernighan i e-mail: antaltiberiu@pcnet.ro Dennis Ritchie - THE C PROGRAMMING LANGUAGE - care a schimbat totul. Din acest moment C a fost implementat pe calculatoare pe 8 bii sub sistemul de operare CP/M. n 1981 cnd a nceput revoluia PC prin calculatoarele IBM PC, C era unicul limbaj care avea puterea s| le exploateze total. Astfel a deviat de la sistemul de operare UNIX sub care a fost scris iniial i a devenit un limbaj popular pe toate
21

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca microcalculatoarele. de Maini Facultatea Construcii Catedra de Mecanic| i Programare Programatorii adorau limbajul C pentru c|, spre deosebire de alte limbaje, el permite Curs de limbaj C un control absolut asupra calculatorului. Cu acest control vine i o programatorului responsabilitate - sunt multe posibilitai n C pentru a bloca un calculator - ns| Copyright 2001. Toate drepturile sunt limbaj care este o unealt| i nu un obstacol n programatorii au g|sit n sfrit un rezervate autorului. programarea calculatoarelor. Multiplicarea acestui document n scop comercial este interzis|.

Limbaj de sunt surprini de "nivelul de jos" al program|rii n C. Face puine lucruri asamblare Sudenii participani la orice form| de nv||mnt cu plat|n am|nut, cu mna, dac| automat, ns| permite scrierea lor sau alte persoane doritoare avansat

Sudenii participani la orice form| de nv||mnt superior bugetar potC 2.1 Caracteristicile limbajului multiplica acest document pentru uzul personal.

Programatorii care ajung s| lucreze n C venind din Basic sau Pascal

programatorul contra acest cu acordul scris al autorului. n acest pot multiplica documentul numaidorete cost i lucru. Nu are instruciuni care lucreaz| direct cu scop m| putei contact| la: iruri de caractere, mulimi, liste. Nu exist| operatori care s| manipuleze un tablou sau un ir ntreg. Nu are facilit|i de intrare/ieire i nici nu permite accesul la fiiere. Toate aceste caracteristici ale limbajelor de nivel nalt sunt explicit ANTAL Tiberiu Alexandru asigurate prin apelul unor funcii care nu sunt parte a limbajului i sunt stocate sub forma tel.: 0040-264-530918 ii standard. Autorii lui l numesc un limbaj de nivel relativ jos, n unor biblioteci de func e-mail:cantaltiberiu@pcnet.ro de limbajul main|; practic l-am putea numi un limbaj de sensul | este destul de aproape asamblare cu cteva caracteristici de limbaj de nivel nalt.

Motivul pentru care C a fost inventat este viteza. Programele scrise n C se execut| foarte rapid, dei dezvoltarea lor este de multe ori nceat|. Pentru creterea vitezei, C a renunat la majoritatea verific|rilor f|cute n general deANTAL Tiberiu Alexandru de nivel nalt cu scopul creterii siguranei limbajele de programare Conf. dr. ing. funcion|rii programului. Cluj-Napoca Universitatea Tenhic| din Facultatea Construcii de Maini Am spus c| limbajul main| este specific fiec|rui UCP. Pentru c| Portabilitate Mecanic| i Programare Catedra de limbajul de asamblare nu este dect un limbaj main| cu o form| mai Curs de limbaj C elegant|, nseamn| c| i acesta este specific fiec|rui UCP, iar programele scrise n el nu pot fi portate pe maini diferite, adic| nu este portabil. C fiind Copyrightde asamblaredrepturile sunt rezervate|autorului. un limbaj 2001. Toate n multe feluri, nseamn c| nici programele C nu sunt portabile. Totul depinde de modul n care s-a scris C. Respectnd cteva reguli de baz| este posibil ca programele C s| fie portate la fel cu cele scrise este interzis|. Multiplicarea acestui document n scop comercialn Basic sau Pascal. Am spus c| C pune la dipoziia programatorului biblioteci. Aceast| modalitate de definire ajut| la izolarea limbajului de tr|s|turile specifice ale UCP i construciei hardware pot multiplica acest Sudenii participani la orice form| de nv||mnt superior bugetar a mainii pe care se ruleaz| o implementare particular| de C, rezultnd posibilitatea scrierii unui cod portabil. document pentru uzul personal.
Vitez| mare Pentru scrierea Sudenii participani la orice form| de nv||mnt cu plat| sau sistem de operare scris n pentru scrierea sistemelor de opeare. Primul alte persoane doritoare sistemelor de pot multiplica documentul numaiicontra cost i cu acordul scris al autorului.UNIX ct i C a fost UNIX a avut aproximativ 10000 de linii. Azi att n acest operare

C s-a n|scut din ncercarea de creare a unui limbaj de programare

scop m| putei contact| la: au toate specificaiile necesare pentru programarea lor Windows descris| n limbajul C. ANTAL Tiberiu Alexandru Sintaxa C este departe de a fi sugestiv|. Din aceast| cauz| se poate tel.: 0040-264-530918 Lizibilitate grea ajunge la situa e-mail: antaltiberiu@pcnet.ro ia unor programe care nu mai pot fi ntelese, dei sunt scrise n C i funcioneaz| corect.

22

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare La fel de eficient Curs de limbaj C ca limbajul de asamblare, dar mai prietenos, cu multe instruciuni apropiate de echivalentul lor din limbajul de asamblare si mai puternic prin noile instruciuni ad|ugate n anii '80, C sunt rezervate autorului. limbaj avnd sute de variante a devenit cel mai popular Copyright 2001. Toate drepturile n implementare i o comunitate de programatori care crete rapid. Revoluia C era n pericol riscnd s| divizeze limbajul n prea multeeste interzis|. Multiplicarea acestui document n scop comercial variante incompatibile ntre ele; era vremea ca limbajul s| fie standardizat.

2.2 Standarde C

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest n America, responsabilitatea standardiz|rilor revine Institutului Naional American de document pentru uzul National Standards Institute sau, mai pe scurt, ANSI). Comitetul Standarde (American personal. de autorizare ANSI pentru C s-a numit X3J11, iar limbajul este azi definit prin standardul Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare ANSI X3.159-1989. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Aria m| putei contact| la: scop internaional| a standardiz|rilor este acoperit| de Organizaia Internaional| de Standardizare (International Standards Organization sau ISO). ISO a format comitetul JTC1/SC22/WG14 pentru revizuirea muncii lui X3J11. Azi, standardul ISO pentru C este ANTAL Tiberiu Alexandru ISO 9889:1990 i este n esen| identic cu X3.159. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Standardul ISO C este autoritatea final| prin care s-a reconstruit limbajul C. De obicei, n documetaii, el este referit sub forma "standardul", la fel cum limbajul C definit n cartea lui Kernighan i Ritchie este cunoscut sub numele de "K&R C".

2.3 Ce a rezolvat standardizarea Conf. dr. ing. ANTAL Tiberiu Alexandru

Limbajul C a beneficiat enorm de pe urma standardiz|rii, ca urmare devenind un limbaj Universitateaor de utilizat. n K&R C nu exista un mecanism pentru verificarea mult mai u Tenhic| din Cluj-Napoca Facultatea Construcii defunciilor. Nu se verificau nici num|rul, nici tipul parametrilor parametrilor transferai Maini transferai. Din acest motiv ntrega responsabilitate c|dea pe umerii programatorului care Catedra de Mecanic| i Programare trebuia limbaj C Curs de s| fie atent la asemenea erori n apelul funciilor. Problema era aa de serioas| nct s-a scris un utilitar special, lint, n acest scop. Copyright 2001. Toate drepturile sunt rezervate autorului. Calculele n virgul| flotant| erau o glum| n limbajul K&R C. Toate acestea se f|ceau folosind tipul de dat| numit doub le , dei exista un tip de dat| numit float pentru lucrul cu Multiplicarea acestui document n scop comercial este interzis|. ca toate calculele s| fie valori mai mici. Valorile de tipul float fiind mai mici era normal efectuate mai rapid, dar datorit| conversiei lor la doub le , timpul de calcul cretea. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Dei a existat o biblioteca standard sub forma unei colecii de subprograme care nsoeau 7 limbajul C, nu era nimic standardizat cu privire la elementele pe care aceast| bibliotec| le coninea. Acelai la orice form| de s| aib| denumiri diferite sau s| lucreze n mod Sudenii participanisubprogram puteanv||mnt cu plat| sau alte persoane doritoare diferit. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Odata cu rezolvarea acestor probleme, C standard a devenit mult mai robust i uor de 7 utilizat, motiv pentru care voi aborda descrierea acestui C i nu a celui descris de K&R ANTAL Tiberiu Alexandru n prima lor carte. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

2.4 Elemente de C

Acest paragraf descrie elementele limbajului C: nume, numere, caractere folosite la scrierea unui program C. Sintaxa ANSI C numete aceste componente simboluri, ele fiind
23

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca elementele Construcii de Maini de compilator. Un simbol este un text al programului Facultatea de baz| recunoscute surs| care nu poate fi descompus n alte elemente componente. Urm|toarea list| cuprinde Catedra de Mecanic| i Programare tipurile de simboluri existente n limbajul C: cuv n t cheie , identificator , constanta , s ir, 7 Curs de limbaj C de punctuat ie . operator, caracter -

Copyright 2001. Toate :drepturile sunt ie predefinit| pentru compilatorul C, motiv pentru # cuvin tele cheie au o semnifica rezervate autorului. care un identificator nu poate avea acelai nume - scriere sintactic| - cu un cuvnt MultiplicareaCuvintele cheie alen scop comercial este interzis|. cheie. acestui document limbajului C sunt: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest break else long switch document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare char extern return union pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
const float short unsigned void vola tile w hile c Tiberiu ANTAL on ti n u e Alexandru for tel.: 0040-264-530918 de fau lt goto e-mail: antaltiberiu@pcnet.ro do if signed sizeof static case enum register typedef au to do ub le int struct

NOTA: Toate cuvintele cheie ale limbajului C se scriu cu litere mici.

identificatorul : este un nume dat de utilizator unei variabile, tip de dat|, funcie Conf. dr. ing. ANTAL Tiberiu Alexandru sau unei etichete din program. Crearea unui identificator se face prin specificarea lui ntr-o declara Cluj-Napoca Universitatea Tenhic| dinie de variabil|, tip sau funcie, fiind caracterizat prin tip, vizibilitate, durata de existent a (persistent a) i legare. Dup| declarare, un 7 -7 -7 Facultatea Construcii de Maini identificator poate fi utilizat n program innd locul valorii asociate lui; Catedra de Mecanic| i Programare # constanta: Curs de limbaj C reprezint| un num|r, un caracter sau iruri de caractere care sunt folosite ca o unic| valoare n program i sunt caracterizate prin valoare i tip. C cunoate constante reale, ntregi, enumerate i caracter; Copyright 2001. Toate|drepturile sunt rezervate autorului. simbolurile , de exemplu # s irul : reprezint o secven| de caractere cuprins| ntre "un sir de caractere"; Multiplicarea acestui document n care specific| modul n care sunt manipulate valorile # operatorul : este un simbol scop comercial este interzis|. asupra c|rora acioneaz|. Poate fi format dintr-un singur caracter sau din mai multe; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest # caractere uzul personal. document pentru de punctuat ie : sunt caractere speciale care au utiliz|ri diverse, de la organizarea programului surs| pn| la definirea unor operaii pe care le execut| compilatorul la programul de nv||mnt cu plat| sau alte persoane doritoare Sudenii participanisauorice form| compilat. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

2.5 Primul program

Cel mai scurt program care se poate scrie n C este: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 m ai n() { } e-mail: antaltiberiu@pcnet.ro dei este un program funcional nu va produce un rezultat vizibil pe ecran. Lansarea n execuie a unui program sub sistemul de operare DOS are ca efect transferul controlului programului lansat n execuie. n acest scop DOS trebuie s| tie unde s| intre
24

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca n programConstrucii de Maini ia lui. m ain nseamn| principal, reprezentnd acest Facultatea pentru a ncepe execu punct de de Mecanic|care DOS ncepe s| execute instruciunile programului. Numele se Catedra nceput din i Programare scrie urmat de paranteze rotunde, adic| m ain (), iar corpul programului este nchis ntre Curs de limbaj C ntre acolade se afla un num|r oarecare de instruciuni: acolade. De obicei, 7 1 2 3 4 5 6 7 8 9 10 11

Copyright 2001. Toate /* SA LU T.C */ #include<stdio.h>

drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.


/* Afis eaza "Salu tare tin erete." pe ecra n */

Sudenii participani la orice form| de m ain () { document pentru uzul personal. prin tf("Sa luta re, tin ere te!");

nv||mnt superior bugetar pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare retu rn(0 ); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest } scop m| putei contact| la: Efectul acestui program este afiarea textului "Salutare, tinerete!" pe ecran. Se observ| c| acoladele sunt scrise una sub cealalt|, iar liniile de program printf("Salutare, ANTAL Tiberiu Alexandru tine rete!"); retu rn(0 ); sunt aliniate. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Fiecare linie de program este numerotata pentru a simplifica explicat iile. Aceste linii 7 NU FAC PARTE DIN PROGRAMUL C (din acest motiv ele NU vor fi scrise la tastarea acestui program si nici la cele care vor urma). Acest mod de scriere nu este necesar, dar muli programatori l folosesc, el f|cnd parte din stilul ing. ANTAL Tiberiu Alexandru Conf. dr. de scriere al programelor C. Universitatea Tenhic| din Cluj-Napoca Pentru a face programul executabil, prima oar| trebuie s|-l stoc|m pe disc ntr-un fiier Facultatea Construcii de Maini text, s| zicem cu numele salut.c. Apoi vom avea nevoie de un program compilator C Catedra de Mecanic| i Programare pentru a crea fiierul executabil. Compilatorul este responsabil pentru traducerea Curs de limbaj C limbajul C n limbajul main|. Programul compilator va produce din programului din salut.c un nou fiier cu numele salut.obj. Acesta este fiierul obiect, reprezentnd Copyright 2001.Toate drepturileexecutabil. Acesta este un fiier n limbaj main|, toate primul pas n ob inerea fiierului sunt rezervate autorului. datele i instruciunile lui fiind dimensionate, n lungime, la cea de octet (8 bii). Totui, acesta nu este nc| document n scop comercial este | faza de Multiplicarea acestuiun program executabil. Urmeazinterzis|. legare prin care codul predefinit al funciilor C folosite n fisierul text vor fi ad|ugate fiierului obiect. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest O funct ie pentru uzul personal. program pentru rezolvarea unei sarcini distincte din document C este o poriune de program. De exemplu, funcia printf() rezolv| sarcina scrierii textului Salutare, tinerete! pe ecran. Aceast| funcie este definit| n una din bibliotecile standard ale Sudenii participani la orice form| de nv||mntie de funcii, scrise de noi sau de firme, limbajului C. O bibliotec| se compune dintr-o colec cu plat| sau alte persoane doritoare pot multiplica documentul programele C.cost i cu acordul scris al autorului. |n acest ii, pentru a putea fi folosite n numai contra Toat| programarea din C se bazeaz pe func scop m| putei contact| la: va cuprinde corpul programului principal. m ain () fiind tot o funcie care Pentru acest caz, programul ANTAL Tiberiu Alexandru de legare va c|uta definiia funciei printf() n bibliotec|, de unde o va extrage i o va ad|uga la programul obiect, n final rezultnd programul tel.: 0040-264-530918 executabil salut.exe. e-mail: antaltiberiu@pcnet.ro este cea mai important| din program, fiind i cea mai des folosit| funcie pentru afiarea datelor pe ecranul monitorului. Surprinz|tor ns|, printf() nu face parte din limbajul C. C este de fapt divizat n dou| seciuni majore: limbajul n sine i bibliotecile
Linia 8 25

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca lui. Dup| cum am mai de Maini tf() face parte dintr-o bibliotec|. Ea preia irul (textul Facultatea Construcii spus, prin dintre ghilimele) cuprins ntre acolade i face afiarea lui pe ecranul monitorului. O funcie Catedra de Mecanic| i Programare poate citi datele transferate ei prin ceea ce se afl| ntre parantezele ei rotunde Curs de limbaj C iei), le prelucreaza, apoi va ntoarce un rezultat. Din acest motiv la (argumentele func 7

folosirea unei funcii C trebuie s| tie ce are de f|cut, ce fel de date are de preluat i ce fel Copyright 2001. Toate drepturile sunt rezervate autorului. de dat| va fi rezultatul? Multiplicarea acestui document nii estecomercial este interzis|. | s| inform|m C despre Atunci cnd definim propriile func scop responsabilitatea noastr aceste detalii. Pentru c| ntr-o bibliotec| sunt sute de funcii C disponibile ar fi dificil s| memor|m pentru fiecare dintre ele aceste detalii ca s| le putem comunica limbajului C n Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest cazul utilizpentru uzul personal.Din acest motiv exist| fiierele antet (header files) care document |rii lor n programe. au rolul stoc|rii acestor detalii corespunz|toare tuturor funciilor din biblioteci. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare n cazul nostru, linia 2 furnizeaz| compilatorului C toate detaliile necesare despre funcia pot multiplica documentul ierului contracorect pentru funcscris al autorului. nantet se numai antet cost i cu acordul ia printf() . Fiierul acest printf() prin includerea fi scop m| putei contact|ia printf() are o linie n acest fiier text care spune limbajului C ce numete std io.h . Func la: fel de date poate prelua funcia i ce fel de r|spuns poate ntoarce. Fiierul antet conine ANTAL Tiberiu Alexandru o mulime de astfel de descrieri pentru multe alte funcii. Astfel, se includ informaii despre zeci de funcii tel.: 0040-264-530918 n programul C, ns| C le va ignora pe toate dac| nu are nevoie de ele. e-mail: antaltiberiu@pcnet.ro este o instruciune special| numit| direc tiva de preprocesor i este o comand| 7 adresat| programului compilator - ea nu apare n programul final. Comenzile de acest fel instruiesc compilatorul sa realizeze o actiune oarecare. n acest caz directiva i spune 7 compilatorului sa plaseze ntregul coninut al fiierului cu numele std io.h n programul C, 7 ncepnd cu linia din care este scris| directiva, la noi, linia 2 . Numai dup| ce compilatorul Conf. dr. ing. ANTAL Tiberiu Alexandru necesare utiliz|rii funciei printf() . execut| aceast| linie va ti toate detaliile Universitatea Tenhic| din Cluj-Napoca Lin iile 1 (/* salut.c */ ) Maini Facultatea Construcii de i 3 (/* Afiseaza "Saluta re, tinerete!" pe ecran */ ) sunt comentarii. Mecanic| i Programare momentul traducerii, ele avnd rol numai pentru Catedra de Compilatorul le ignor| n programator, fiind folosite pentru descrierea efectului unor instruciuni sau poriuni de Curs de limbaj C program. n C, nceputul comentariului se marcheaz| prin secvena de caractere /* iar terminarea lui prin secvena de caractere */ . Cnd compilatorul ntlnete secvena /* se Copyright 2001. Toate drepturile sunt rezervate autorului. oprete din traducerea programului pn| cnd ntlnete caracterele */ pentru nchiderea comentariului. Folosirea comentariilor va face programul mai uor de neles. Acestea se Multiplicarea acestui document ncu condiia s| este cuprind| cumva instruciuni ale pot plasa oriunde n program scop comercial nu interzis|. programului. n aceast| idee, programul anterior se poate scrie sub forma: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest /* Progra mu l va uzul personal. isc sub n um ele de: salut.c */ document pentru fi salvat pe d
#include #in clude<std io.h> /* Fisierul an tet pentru fun ctia printf() */

1 2 3 4 5 6 7 8 9 10 11 12 13

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest /* Programul afiseaza "Saluta contact| la: scop m| putei re, tinerete!" pe ecran */
m ain () ANTAL Tiberiu Alexandru { tel.: 0040-264-530918 re, tin ere te!"); prin tf("Sa luta

e-mail: antaltiberiu@pcnet.ro
retu rn(0 ); }

26

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Linia de limbaj C | sub forma m ain () . tii deja c| m ain este punctul din care ncepe Curs 8 este scris programul i c| este o funcie. Copyright 2001. Toate drepturile sunt rezervate autorului. Instruciunile limbajului pot fi executate numai dac| sunt scrise n interiorul unei funcii. Funciile se folosesc pentru compartimentarea unor programe mari n sarcini mai mici i Multiplicarea acestui document n scop comercial este interzis|. din acest motiv, mai uor de rezolvat. Aciunile din interiorul unei funcii sunt separate de actiunile realizate n interiorul alteia, programul devenind modular. Aceasta este o alt| Sudenii participani la orice form| de nv||mnt superior bugetarmici,multiplicaacest denumire pentru specificarea spargerii programului n buc|i mai pot ct mai u or de document pentru uzul personal. gestionat.

2.6 main()

Sudeniim ain () trebuie s| fie prezent| n orice program executabil C pentru cdoritoare Funcia participani la orice form| de nv||mnt cu plat| sau alte persoane | este locul de multiplica documentul programului. Por cu acordul scris al autorului. n acest potunde se ncepe execuianumai contra cost iiunea cuprins| ntre acolade se numete corpul prog ram ulu i. la: scop m| putei contact| Pentru programul salut.c acesta este format din liniile printf("Salutare, tine rete!"); i return(0); , iar liniile 10 i 12 se numesc instruct iuni. n C, orice secventa deAlexandru cuprinsa ntre acolade - caracterele { , } din liniile 9 i 13 - 7 instructiuni 7 ANTAL Tiberiu se numete bloc. n particular, corpul unei funcii este ntotdeauna cuprins ntre acolade, tel.: 0040-264-530918 denumirea de bloc se mai folosete pentru a sublinia c| un grup de fiind un bloc. Uneori, e-mail: -iun i su nt leg ate ntre ele , adic| nu sunt tratate independent. antaltiberiu@pcnet.ro instruct

2.7 printf()
Linia 10

este un exemplu clasic al unei linii de program C. Instruciunile de acest fel se termin| prin caracterul pu nct s i virgula (; ) numit i terminator de instruct iuni. Orice 7 Conf. dr. ing.este o instruct iune i orice instruciune C se termin| cu punct i virgul|. aciune n C ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Acest caracter special anun| compilatorul c| instruciunea este complet|. Facultatea Construcii de Maini Modul tipic Mecanic| i al funciei n C este prezentat prin prin tf() . Datele care dorim s| Catedra de de utilizare Programare fie prelucrate C Curs de limbajde funcie se pun ntre parantezele rotunde. Aceste date ce vor fi apoi transferate funciei poart| denumirea de arg um en te . n acest caz, printf() are un singur argument, 2001.sub forma irului de caractere "Sa luta re, tin ere te!" . n C exist| mai multe Copyright scris Toate drepturile sunt rezervate autorului. forme de date, numite tipuri de date, care pot fi prelucrate prin instruciuni ale limbajului C. Multiplicarea acestui document n scop comercial este interzis|. printf() este foarte complex| i asigur| afiarea unei variet|i de tipuri de date pe ecran. Sudenii participani la orice|form| de nv||mntasuperior pe ecran.pot multiplica se pot Exist| posibilitatea manipul rii formei de afiare datelor bugetar De exemplu, acest document pentru \t i \n n irul caracterelor de afiat astfel: folosi caracterele uzul personal.
1 2 3 4 5 6 7 8 9 10 11 12 13 /* Progra mu l va fi salvat pe d isc sub n um ele de: salut.c sau Sudenii participani la orice form| de nv||mnt cu plat| */

alte persoane doritoare pot clude<std io.h> /* Fisierul an tet pentru funcu acordul scris al autorului. n acest multiplica documentul numai contra cost i ctia printf() */ #in scop m| putei contact| la:
/* Programul afiseaza "Saluta re, tinerete!" ANTAL Tiberiu Alexandru pe tel.: 0040-264-530918 m ain () e-mail: antaltiberiu@pcnet.ro { ecran */

prin tf("Sa luta re,\n \t tin ere te!"); retu rn(0 ); } 27

Capitolul 2 - Scurta istorie s i descr iere a eleme ntelo 7 Conf. dr. ing. ANTAL Tiberiu Alexandru r limba jului C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Utilizarea acestor caractere va duce la afiarea pe ecran a textului Salutare, Catedra de Mecanic| i Programare sub forma: Curs de limbaj C Salutare,

tinerete!

Copyright tinerete! drepturile sunt rezervate autorului. 2001. Toate afieaz document n scop comercial este i aliniat. acestui | sub Salutare , pe o linie nou| interzis|. Trecerea la linie nou|, datorit| caracterului /n se mai numete linie nou| (newline ) i const| n avansul la nceputul urm|toareila orice form| de nv||mnt superiorde caractere multiplica acest Sudenii participani linii de ecran. Exist| un astfel de set bugetar pot speciale care nu se afieaz| pe ecran, dar influeneaz| afiarea celorlalte caractere. Toate acestea ncep document pentru uzul personal. la ntlnirea lui, urm|torul caracter se traduce ntr-o prin caracterul backslash (/ ) iar aciune cu o semnificaie specific| literei puse dup| / . Cteva astfel de caractere speciale Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare sunt: pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Caracter special Semnificaie
tinerete! se Multiplicarea \a alert| ANTAL Tiberiu Alexandru (ring bell ) - emisia unui sunet de c|tre difuzorul PC-ului. tel.: 0040-264-530918 \n linie nou| (newline ) - trecere la linie nou| pe ecranul e-mail: antaltiberiu@pcnet.ro monitorului. \b \t

terge la stnga cursorului (backspa ce ).


tabulator (tab) - salt cu un num|r fixat de caractere pe orizontal|.

tabulator vertical (vertical tab ). Conf. dr.\v ANTAL Tiberiu Alexandru ing. Universitatea Tenhic| din Cluj-Napoca \r retur de car (carriage return ) - salt la nceputul liniei de pe Facultatea Construcii de Maini ecran. Catedra de Mecanic| i Programare \\ caracterul backslash . Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului.

2.8 return()

Multiplicarea acestui document return(0);. Am inclus aceast| instruciune din cauza lui Ultima linie din program este n scop comercial este interzis|. m ain () care este o funcie. C ateapt| ca funciile s| ntoarc| o valoare cu excepia cazului n care se specific| explicit lipsa valorii ntoarse. superior bugetar pot multiplica acest Sudenii participani la orice form| de nv||mnt n acest caz particular, nu s-a indicat lipsa valorii ntoarse pentru func document pentru uzul personal. ia m ain (), motiv pentru care C presupune c| va ntoarce o valoare ntreag|, acesta fiind cazul implicit pentru funcii care ntorc valoare. Valoarea numeric| 0 se va ntoarce prin instruciunea retu rn(0 ); lasau alte persoane doritoare(). Sudenii participani la orice form| de nv||mnt cu plat| terminarea funciei m ain Scrierea acestei instruciuni ntr-ocontra parial| (numai cuvntuluiautorului. n acest pot multiplica documentul numai form| cost i cu acordul scris al return ) sau omiterea ei total| va duce la transferarea unui ntreg cu valoare aleatoare sistemului de operare. scop m| valoarea aleatoare ar putea fi 0 , caz n care aleator, programul s-ar termina cu Aceast| putei contact| la:

succes, sau mai probabil diferit| de zero, caz n care va indica terminare cu eroare a ANTAL Tiberiu Alexandru programului. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

28

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

3 Variabile, tipuri de date si constante

n limbajul C, un obiect este o regiune din RAM n sau se persoane doritoare Sudenii participani la orice form| de nv||mnt cu plat|care altepoate stoca o singur| valoare la un moment dat. Obiectul cost i cu acordul prin al autorului. stocat| pot multiplica documentul numai contraprimete un nume scris care valoarea n acest va putea fi identificat| n mod unic. Constantele i variabilele sunt obiecte care se pot scop m| putei contact| la: prin operatori i instruciuni. Declaraiile prezint| variabilele manipula n programele C care se vor utiliza n program, le asociaz| un tip si eventual o valoare iniial|. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

3.1 Variabile

n C toate variabilele trebuie declarate nainte de a fi folosite n program. Programatorul realizeaz| aceasta printr-o declarat ie care asocieaz| numele variabilei unui tip de dat|. Declaraia specific| modul de intepretare a numelui de c|tre compilatorul C. Denumirea tehnic| pentru numele de variabil| este identificator de variabil| sau, mai pe Conf. dr. ing. ANTAL Tiberiu Alexandru scurt, variabil|. Numele de variabil| sugereaz| c| valorile stocate sub aceste nume pot varia sub controlul strictCluj-Napoca Universitatea Tenhic| din al programatorului prin intermediul unor obiecte numite operatori. Construcii de Maini FacultateaVariabilele sunt caracterizate prin: - de (type) Catedra tip Mecanic| i Programare - limbaj C Curs de vizibilita te (scope) - durata de existent a sau persistent a (storage class) -7 -7 - legare (linkage) Copyright 2001. Toate drepturile sunt rezervate autorului. Din motive didactice, n acest capitol voi aborda numai descrierea tipului, celelalte Multiplicareavor fi discutate pe parcurs.comercialseste i ns| c| aceste caracteristici sunt caracteristici acestui document n scop Trebuie | ti interzis|. specificate simultan prin declaraia variabilei. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru Literele, cifrele i caracterul und erscore (_) sunt caractere permise uzul personal. Nume de ntr-un nume de variabil|. Primul caracter trebuie s| fie liter| sau variabile corecte underscore. Conform standardului C caracterul und erscore este de Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare evitat la numai contra nume cu variabil scris al c| de obicei acest pot multiplica documentulnceputul unui cost i de acordul| pentruautorului. nfunciile din biblioteci ncep cu acesta. Caracterele mici i mari sunt distincte n C. Astfel, a i A scop douputei contact| la: sunt m| | nume diferite. Tradiional, literele mici se folosesc pentru nume de variabile, iar cele mari pentru constante simbolice. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 ecte sunt: x, v_intreg, x1, val_de_inceput Exemple de nu m e cor Exemple de nume inc orecte sunt: v-intreg, 1x, val de inceput, in#lire. e-mail: antaltiberiu@pcnet.ro n general, caracterul und escore se foloseste n interiorul unui nume de variabil| pentru a crete lizibilitatea lui. Num|rul maxim de caractere care formeaz| numele depinde de compilatorul folosit, ns| sunt semnificative, conform standardului, numai primele 31 de
29

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca caractere, adic| numaide Maini Facultatea Construcii acestea sunt folosite pentru a distinge numele de variabile ntre ele. Unele implement|riProgramare ii de lungime pentru numele de variabile externe Catedra de Mecanic| i impun restric care pot fi folosite de exemplu din limbajul de asamblare - de cel mult 6 caractere. Curs de limbaj C

Numele de variabile nu pot avea aceeai scriere sintactic| cu numele cuvintelor cheie. Copyright 2001. variabile ca if , else , for, case sunt incorecte. Astfel, nume de Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n| exprime scopul variabilei n program i s| nu fie Este bine ca numele variabilei s scop comercial este interzis|. exagerat de lung. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest O declaraie specific| un tip - acestea vor fi discutate n continuare - i document Declararea pentru uzul personal. o list| de una sau mai multe nume de variabile. n exemplul care variabilelor urmeaz|, int i float sunt tipuri de date. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot i, j, k; int multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop x, putei contact| la: floa t m|v ector[108 ]; Forma utilizat| mai sus condenseaz| declaraiile numelor de variabile i , j i k respectiv x ANTAL Tiberiu Alexandru i vector n cte o singur| linie de program C. Este posibil| i scrierea distribuit| a tel.: 0040-264-530918 declaraiilor sub forma: e-mail: antaltiberiu@pcnet.ro
int i; int j; int k; float x; floa t vector[10 8];

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini n limbajulMecanic||iun grup de cate gorii pre de finite de da te denumite tipuri. Catedra de C exist Programare Utilizatorul poate modela o problem| utiliznd numai aceste categorii predefinite, Curs de limbaj C eventual poate defini noi categorii n termenii celor existente. Tip urile pr ed efin ite n C sunt grupate n dou| clase: simple (uneori numite interne sau de baz|) i stru cturate . Copyright tipuluiToate nume de variabil| se face prin intermediul declaraiei de variabil| Asocierea 2001. unui drepturile sunt rezervate autorului. i face ca: Multiplicarea acestuivalori pe care scop comercial este interzis|. - domeniul de document n variabila le poate lua, adic| valorile care pot fi stocate n urma evalu|rii unor expresii sau valorile care pot fi atribuite direct variabilei, s fie cunoscute; Sudenii|participani la orice form| de nv||mnt superior bugetar pot multiplica acest - tipul unei valori specificate de variabil| s| poat| fi dedus din declaraia acesteia, document pentru uzul personal. f|r| a executa calcule aritmetice; - fiecare operator sau funcie s| foloseasc| argumente de un anumit tip i s| Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare ntoarc| rezultate de un anumit tip. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

3.2 Tipuri de date

3.2.1 Tipuri simple

ANTAL simple ale limbajului C sunt: void , char, short , int, long , float i doub le . Tipurile Tiberiu Alexandru tel.: 0040-264-530918 3.2.1.1 Tipul void e-mail: antaltiberiu@pcnet.ro Cuvntul rezervat void are 3 utiliz|ri: pentru a specifica valoarea inexistenta ntoarsa 7 7 de o funct ie , pentru a specifica un tip de argumente de funct ie car e nu are arg um en te i pentru a specifica un poantor la un tip nespecificat. Toate aceste denumiri i situaii speciale se vor l|muri numai dup| studierea funciilor i a tipului structurat de dat| numit
30

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca poantor. Construcii de Maini Facultatea Catedra de Mecanic| i Programare 3.2.1.2 Tipuri ntregi Curs de limbaj C | mai multe categorii de ntregi. Numele lor reflect| spaiul de RAM Limbajul C suport

alocat pentru stocare. Teoretic, un ntreg short , ar trebui s| ocupe spaiu mai puin n Copyright 2001. Toate drepturile sunt rezervate autorului. RAM dect tipul ntreg long .

Multiplicarea acestui document n scop comercial este interzis|. pentru tipurile de date n tabelul care urmeaz| se prezint| spaiul de memorie alocat ntregi de c|tre compilatorul Visual C++ 6.0 i domeniul de valori corespunz|tor care poate fi stocat n variabilele de tipulde nv||mnt superior bugetar pot multiplica acest Sudenii participani la orice form| respectiv. document pentru uzul personal. Tip Spatiu Domeniu de valori Minim si maxim n "limits.h" Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest char 1 octet [-128, 127] [CHAR_MIN, CHAR_MAX] scop m| putei contact| la: signed char 1 octet [-128, 127] [SCHAR_MIN, SCHAR_MAX] ANTAL Tiberiu Alexandru unsigned char 1 octet [0, 255] [0, UCHAR_MAX] tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro [-32768, 32767] short 2 octei [SHRT_MIN, SHRT_MAX]
unsigne d short int unsigned int

2 octei 4 octei 4 octei

[0, 65535] [-2147483648, 2147483647] [0, 4294967295]

[0, USHRT_MAX] [INT_MIN, INT_MAX] [0, UINT_MAX]

Conf. dr. ing. ANTAL Tiberiu Alexandru long 4 octei [-2147483648, 2147483647] [LONG_MIN, LONG_MAX] Universitatea Tenhic| din Cluj-Napoca unsigned long 4 de Maini [0, ULONG_MAX] Facultatea Construcii octei [0, 4294967295] Catedra de Mecanic| i Programare Fiecare compilator are un set de constante utile folosite la determinarea domeniului de Curs de limbaj C valori ale tipurilor de baz|. De exemplu, numele INT _M IN i INT_MAX sunt disponibile n fiierul lim its.h sub form| de constante care pot fi utilizate la scriere de programe. Copyright 2001. Toate drepturile sunt rezervate autorului. INT_MAX este cel mai mare num|r ntreg care poate fi stocat ntr-o variabil| de tipul int pentru cazul compilatorului curent. S| zicem c| trecem de la compilatorul firmei Microsoft Multiplicarea Borland. INT_MAX scop comercial este interzis|. se poate stoca cu acest la cel al firmei acestui document n va referi valoarea maxim| care nou compilator. Acest lucru va r|mne valabil chiar i la schimbarea sistemului de Sudenii participani its.h va conine toate limit|rile compilatorului, pot multiplica acest operare. Fiierul lim la orice form| de nv||mnt superior bugetar iar includerea lui n programul utilizator va permite document pentru uzul personal. accesul la toate aceste valori extreme actualizate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 /* INT EX 1.C */ Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare #include <limits.h> pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest #include <stdio.h>

scop m| putei contact| la:

int main(void) { ANTAL Tiberiu Alexandru u n sig ne d lo ng z=U L ON G _M A X ;

tel.: 0040-264-530918 e-mail:prin tf("va loar ea m ax im a antaltiberiu@pcnet.ro


prin tf("va loar ea prin tf("va loar ea prin tf("va loar ea prin tf("va loar ea

in t = %i ", IN T_ M AX ); m inim a in t = %i\ n", IN T_ M IN ); m ax im a u nsign ed = %u \n ", UIN T_ M AX ); m ax im a lon g in t = %li\n", L ON G_ M AX ); m ax im a u nsign ed log = % lu\ n",z); 31

15 16

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca return 0; Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C Rezultate: valoarea maxima int = 2147483647 valoarea minima int = -2147483648 valoarea maxima unsigned = 4294967295 Copyright 2001. Toate drepturile sunt rezervate autorului. valoarea maxima long int = 2147483647 valoarea maxima unsigned log = 4294967295

Multiplicarea acestui document n scop comercial este interzis|. Pentru nelegerea acestui exemplu trebuie s| tii c| funcia prin tf("valoa rea m ax im a Sudenii ", IN T _M A X scrie pe ecran valoarea stocat| bugetar pot multiplica acest int = % i participani la )orice form| de nv||mnt superiorn INT_MAX sub controlul document pentru uzul personal. funcia printf() , pentru fiecare tip de dat|, trebuie s| specificatorului de format %i. n folosim un specificator de format corespunz|tor tipului de dat| afiat. n acest scop se prezint| participani |tor: Sudenii tabelul urm la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m|Tip putei contact| la: Specificator de format
char ANTAL Tiberiu Alexandru tel.: 0040-264-530918 signed char e-mail: antaltiberiu@pcnet.ro unsigned char short unsigne d short int %c %c %c %hi %hu %i, %d

Conf. dr. ing. ANTAL Tiberiu Alexandru unsigned int %u Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini %li long Catedra de Mecanic| i Programare unsigned long %lu Curs de limbaj C Cnd dorii s| lucrai cu valori ntregi mici n loc de int folosii short i aveti impresia c| ai folosit mai puin| memorie. Invers, dac| valorile trebuie s| fie mari, folosii tipuleste interzis|. 7 Multiplicarea acestui document n scop comercial long . Problema pusa n termenii lui "mare" i "mic" este f|r| prea mult sens datorita impreciziei standardului C. Este suficient 7 c| tii c| SHRT_MAX este undeva pe la 32.767 , iar LONG_MAX pe la 2.147.483.647 . Sudenii participani la orice pentru de nv||mnt superior bugetar 2 , alteori pe 4 octei. Aceste valori nu sunt "clare" form| tipul int se stocheaz| uneori pe pot multiplica acest document pentru uzul personal. Astfel, pentru o implementare particular| de C, nu avem de unde s| tim dac| valoarea maxim| este de ordinul a 32 de m ii sau a 2 miliarde. Din acest motiv, programele Sudenii participani la sens al cuvntului nu folosesc plat| sau, alte persoane doritoare . portabile n adev|ratul orice form| de nv||mnt cu tipul int ci numai short sau long pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Tipul unsigned este f| | scop m| putei contact|rla:semn. Din acest motiv toi biii se pot folosi pentru stocarea valorii numerice, n loc ca cel mai semnifivativ s| fie pe post de bit de semn. Aceasta nseamn| c| valoarea cea mai mare unsigned poate fi cel mult dublul valorii maxime ale ANTAL Tiberiu Alexandru lui int. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro | char se folosete pentru stocarea i prelucrarea Tipul de dat Tipul char caracterelor. Valorile caracter se formeaz| prin plasarea lor ntre apostrofuri ('). Astfel, char b_ m ic = 'b'; stocheaz| valoarea ASCII numit| i codul ASCII - a literei b mic, valoarea numeric| 98 , n variabila cu numele b_ m ic . Copyright 2001. Toate drepturile sunt rezervate autorului. Tipul int
32

1 2 3 4 5 int main(void) 6 { Copyright 2001. Toate drepturile sunt rezervate autorului. 7 ch ar a_ m ic = 'a'; 8 ch ar b_ m ic = 'b'; 9 Multiplicarea acestui document n scop comercial este interzis|. 10 prin tf("va loar ea m inim a ch ar = % i, ", CH AR _M IN ); 11 prin tf("va loar ea m ax im a ch ar = % i\n ", CH AR _M AX ); Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 12 13 document pentru pa '%c' urm eaza '% c'\n ", b_ m ic, b_ m ic+1); prin tf("du uzul personal. 14 prin tf("litera m are '%c' este '%c'\n", b_m ic, b_ m ic + 'A'-'a'); 15 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 16 return pot multiplica 0; documentul numai contra cost i cu acordul scris al autorului. n acest 17 }

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca /* CH AR EX 1.C */ Facultatea Construcii de Maini #include<limits.h> Catedra de Mecanic| i Programare #include<stdio.h> Curs de limbaj C

scop m| putei contact| la: Rezultate: ANTAL Tiberiu Alexandru valoarea minima char = -128, dupa0040-264-530918 tel.: 'b' urmeaza 'c' litera mare 'b' este 'B' e-mail: antaltiberiu@pcnet.ro

valoarea maxima char = 127

Cele dou| constante definesc valoarea minim| i maxim| pentru un caracter. Pentru c| n acest caz spaiul pentru stocare de 1 octet este garantat de standard putem presupune valabil domeniul de [0, 255]. Totui, nu este definit dac| char este cu semn sau f|r|, astfel nct domeniul ar putea fi i [-128, 127]. Compilatorul poate efectua operaii aritmetice cu tipul char. Astfel, b_mic+1 nseamn| Conf. dr. ing. ANTAL Tiberiu Alexandru 98+1 , adic| 99.Tenhic| din Cluj-Napoca sensul codific|rii ASCII ca urm|torul caracter Universitatea Expresia se poate citi n dup| b mic.Construcii de Maini corespunz|tor lui B mare se face n expresia b_m ic Facultatea Calculul codului ASCII + 'A'-'a'. Dac| vei parcurge codificarea ASCII vei observa c| "distana" ntre codurile Catedra de Mecanic| i Programare ASCII ale aceleiai litere mari i mici este constant|, motiv pentru ea se poate calcula prin Curs de limbaj C diferena 'A'-'a'.
ntregi n baze diferite

Copyright 2001. Toate este posibil| scrierea valorilor ntregi i n baze diferite de cea n C drepturile sunt rezervate autorului. zecimal|. Este posibil| utilizarea numai a bazelor 8 i 16 , adic| numerele Multiplicarea acestui document octal sau n hexazecimal. Constantele octa le se specific| se pot scrie n n scop comercial este interzis|. prin plasarea unui 0 n faa cifrei, astfel dac| 9 este un num|r zecimal corect, 09 ar fi incorect pentru c| este o constant| octal|, iar 9 nu este multiplica acest Sudenii participani la orice form| de nv||mnt superior bugetar poto cifr| corect| n sistemul de numeraie personal. document pentru uzul cu baza 8. Specificarea unui x dup| 0 determin| compilatorul s| interpreteze num|rul ntreg ca o Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare constant| hexazecimala . Aici literele a , b , c , d , e , f sunt folosite pentru a reprezenta 7 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest numerele de la 10 la 15 care n hexazecimal sunt cifre. Este nesemnificativ dac| se scrie scop m| puteisau mici, astfel 0x1ffa , 0x1FFA i 0x1F fA reprezint| acelai num|r, adica cu litere mari contact| la: 7 0X1FFA . ANTAL Tiberiu Alexandru /* BA ZE EX 1.C */ tel.: 0040-264-530918 #include<limits.h> e-mail: antaltiberiu@pcnet.ro

1 2 3 #include<stdio.h> 4 5 int main(void) 6 { 7 int zec=22, oct=022, hex=0x22;

33

8 9 10 11 12 }

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca prin tf("zec =%d , hex Facultatea Construcii oct=% d, he x=% x\ n", ze c, oct, hex ); de Maini =%d \n ", zec, oc t, hex ); prin tf("zec =%d , oct=% o, Catedra de Mecanic| i Programare Curs de limbaj0; return C

Copyright 2001. Toate drepturile sunt rezervate autorului. Rezultate:


zec=22, oct=18, hex=34 Multiplicarea acestui document zec=22, oct=22, hex=22

n scop comercial este interzis|.

Sudenii participani la orice form| de otat ia zecimala ; aceasta estepot multiplica acest %d determina afis area ntregului n n nv||mnt superior bugetar echivalent| cu %i ; 7 7 %o determina afisuzul personal. n n otat ia octala ; 7 - area ntregului 7 document pentru %x determina afis area ntregului n notat ia hexazecimala , cu litere mici pentru "abcdef "; 7 7 %X determina afis area ntreguluide nv||mnt cu plat| sau 7alte persoane doritoare 7 Sudenii participani la orice form| n notat ia hexazecimala , cu litere mari pentru "ABCDEF ". pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: tehnic|, a dori s| descriu ce se petrece cnd declar|m o Dei discuia este un pic mai variabil|. Compilatorul este informat despre numele variabilei i tipul acesteia. De ANTAL Tiberiu o declaraie de forma int i1 , la ntlnirea lui int compilatorul aloc| 4 octei exemplu, pentru Alexandru tel.:RAM pentru a stoca o valoare ntreag|. De asemenea, genereaz| o tabel| de simboluri din 0040-264-530918 e-mail: va introduce simbolul i1 i adresa relativ| de RAM la care s-au stocat cei 4 octei. n care antaltiberiu@pcnet.ro Astfel, dac| mai trziu n program vom scrie i1=7; la momentul execuiei programului, cnd se va ajunge la aceast| instruciune, valoarea 7 va fi plasat| n memorie la adresa locaiei rezervate pentru stocarea valorii lui i1. n acest sens variabila ntreag| i1 este un obiect c|ruia i sunt asociate dou| valori. Prima este valoarea numeric| ntreag| stocat| acolo de noi i a doua valoarea adresei locaiei de memorie dat| de compilator. n unele c|ri aceste dou| valori sunt cunoscute sub numele de r-value i l-value . Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca 3.2.1.3 Tipuri reale Facultatea Construcii de Mainiine constantele legate de tipurile reale din C este float.h. Fiierul antet standard care con Catedra de Mecanic| i Programare|toare valorilor extreme i preciziei celor trei tipuri Sunt definite constantele corespunz reale. Curs de limbaj C Copyright 2001. Specificator Spatiu Toate drepturile sunt rezervate autorului. Tip Domeniu Precizie de format de valori n Multiplicarea acestui document n scop comercial este interzis|. zecimale Minim si maxim n
floa t.h

float % f %e % g 4 octei 3.4E+/-38 7 [ F L T _M I N , F L T _M A X ] Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru%lf % le %lg uzul personal. 8 octei do ub le 1.7E+/15 [DBL_MIN, DBL_MAX] 308 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare lon g d ou ble %Lf %Le %Lg 10 octei 1.2E+/19 [ L D B L _ M IN , L D B L _ M A X ] pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 4932 scop m| putei contact| la:

Tipul float Tiberiu Alexandru ANTAL

Este cel mai put in precis dintre tipurile reale. Calculele cu acest tip sunt cele mai rapide, ns| este relativ uor s| apar| erori de depa s ire 7tel.: 0040-264-530918 (overflow sau underflow ) pentru c| domeniul pentru reprezentarea e-mail: antaltiberiu@pcnet.roiul de stocar e este ce l ma i mic , motiv pentru care este acestui tip este ngust. Spat preferat pe sistemele de calcul cu RAM puin. Este tipul real cu spat iu d e stoca re m ediu n C. Calculele se efectueaz| mai ncet dect la tipul float, dar mai prec is . Spaiul de stocare fiind mai
34

Tipul do ub le

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca mare, domeniul de valori care se poate stoca este i el mai larg. Facultatea Construcii de Maini Catedra de Mecanic| i Programare Este tipul de dat| cu spaiul de stocare cel mai mare n C. Calculele ce Tipul long limbaj C Curs de folosesc tipuri long d ou ble sunt cele mai ncete dintre tipurile reale, dar do ub le 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

i cele mai precise. Copyright 2001. Toate drepturile sunt rezervate autorului.
/* FLO AT EX 1.C */ #include<float.h> Multiplicarea acestui #include<stdio.h>

document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int m ain () document pentru uzul personal. {
double x=3.1416, y=1.7e-5, z=7000000000.0;

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare prin tf("x=%lf\ ty=% lf\tz=%lf\ n",x ,y,z); pot multiplicaprin tf("x=%le\ty= %le\tz=% le\n ",x,y ,z); documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteiprin tf("x=%lg \ty= %lg \tz=% lg\n ",x,y ,z); contact| la:
prin tf("x=%7 .3lf\ty =%.3 le\tz =%.4 g\n ",x,y ,z); ANTAL Tiberiu Alexandru tel.: 0040-264-530918 0; return e-mail: antaltiberiu@pcnet.ro }

Rezultate:
x=3.141600 x=3.141600e+000 x=3.1416 x= 3.142 y=0.000017 y=1.700000e-005 y=1.7e-005 y=1.700e-005 z=7000000000.000000 z=7.000000e+009 z=7e+009 z=7e+009

Conf. dr. ing. ANTAL Tiberiu Alexandru %lf i spune funciei printf() s| afi Universitatea Tenhic| din Cluj-Napoca eze num|rul cu 6 zecimale, indiferent de mantisa num|rului;Construcii de Maini Facultatea %le Catedra dei spune funcProgramare s| afieze num|rul cu 6 zecimale, folosind notaia Mecanic| i iei printf() exponenial|, adic| n loc de 0.00012 se afieaz| 1.2e-04 (1.2 nmulit cu 10 -4); Curs de limbaj C %lg acest specificator face afiarea numai a datelor utile, zerourile n plus nefiind afiate. De asemenea, num|rul este afiat n form| ct mai scurt| posibil. De exemplu, n Copyright 2001. Toate drepturileasunt rezervate autorului. : 1.2e-04 ; loc de 0.00012 valoarea se va afi ntr-o forma mai concis| %7 .3lf num|rul total de caractere folosit pentru afiarea valorii este 7 , iar 3 num|rul de Multiplicarea acestui document 3.142 pentru c| num|rul are numai 5 caractere din 7 i 2 caractere zecimale. Se afieaz| n scop comercial este interzis|. spaii n stnga valorii pentru a completa diferena de la 5 la 7 caractere. Se mai observ| c| valoarea real| a fost automat rotunjit|; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest %.3le specific| zecimale document pentru uzul3personal. n formatul exponenial; %.4lg specific| 4 zecimale, dar acestea nu sunt afiate pentru c| sunt 0 -uri, iar formatul trebuie s| fie cel mai scurt. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contraocost i cuiniial| n scris declaraiei. Dac| acest O variabil| poate primi valoare acordul linia al autorului. n numele Declaraie cu scop m| putei contact| la: este urmat de semnul egal (= ) i o expresie valoarea expresiei variabilei iniializare este stocat| n variabil|, procedura numindu-se iniializarea variabilei. ANTAL Tiberiu Alexandru se face o singur| dat| nainte de nceperea execuiei Iniializarea programului, iar valoarea expresiei de iniializare trebuie s| fie o constant|. Acesta este tel.: 0040-264-530918 cazul iniializ|rii explicite. Unele variabile sunt ini ializate implicit de C n funcie de e-mail: antaltiberiu@pcnet.ro durata lor de existen| - aceste cazuri se vor discuta n cadrul capitolului de funcii. Exemple de iniializ|ri explicite sunt:
ch ar ln = '/n '; 35

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int a = 0; Facultatea Construcii de Maini float eps = 0.00001; Catedra de Mecanic| eroa re!"; char m esaj[ ] = "Ai o i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. 3.3 Constante

O constant| este un obiect cu unic| valoare n program caracterizat prin: Multiplicarea acestui document n scop comercial este interzis|. - tip (type) - valoare (value) Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Dupa modul sau de scriere o valoare constanta se ncadreaz| n unul din urmatoarele 7 7 7 7 document pentru uzul personal. tipuri de constante: ntregi, reale, caracter, enumerate sau ir de caractere. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

3.3.1 Constante numerice


3.3.1.1 Constante ntregi

ANTAL Tiberiu Alexandrunuma r ntreg cu sau fa ra se mn care nu-i schimb| valoarea Constanta ntreag| este un 7 7 7 tel.: 0040-264-530918 poate scrie n sistemele de numeraie zecimal (baza 10 ), octal (baza n program i care se e-mail: antaltiberiu@pcnet.ro 8 ) sau hexazecimal (baza 16 ). Dac| irul de cifre care formeaz| constanta ntreag| este prefixat cu cifra 0 num|rul este scris n octal, dac| prefixul este 0x num|rul este scris n hexazecimal. Tipul num|rului determin| spaiul pe care acesta se reprezint| n RAM-ul sistemului de calcul. Im plicit , constanta ntreag| are tipul int i se reprezint| pe 2 octei (16 bii), n cazul n care se specific| sufixele u , U (unsigned ) num|rul este f|r| semn, iar pentru sufixele l, L tipul este long i num|rul se reprezint| pe 4 octei (32 de bii). n exemplele care urmeaz| constanta ntreag| zecimal| 28 este scris| n toate formele Conf. dr. ing. ANTAL Tiberiu Alexandru posibile: Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de zecim 28 /* constan ta intreaga Mainiala */ 28L /* constan ta intreaga zecim ala de tipu l long */ Catedra de Mecanic| i Programare 034 /* constan ta intreaga octala repreze ntand 28 in zecim al */ Curs de limbaj C
034L /* constan ta intreaga octala de tipu l long */ 0x1c /*constan ta intreaga hexa zecim ala repreze ntan d 28 in zecim al */ Copyright 2001. Toate drepturile sunt rezervatetipu l long */ 0x1cL /*constan ta intreaga hexa zecim ala de autorului.

3.3.1.2 Constante reale Multiplicarea acestui document n scop comercial este interzis|.

Constanta real| numit| i flotant| este un numa r re al cu se mn ce nu-i schimb| valoarea 7 n program i care se la orice form|RAM printr-o poriune ntreag|, una multiplica|acest reprezint| n de nv||mnt superior bugetar pot fracionar i un Sudenii participani exponent. Prezena punctului zecimal este obligatorie n constanta real|, excepie f|cnd document pentru uzul personal. cazul cnd se include exponentul. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 23.123 /* numarul real scris "norm al" sub form a 23,123 */ 1.456e1 /* 14.56 */ pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 1456e-2 /* 14.56 */ scop m| putei contact| la:
1.456e-1 /* 0.1456 */ -1.23e3 /* -1230 */ ANTAL Tiberiu Alexandru .123e01 /* 1.23 */

tel.: 0040-264-530918 Din exemplele anterioare se observ| c| implicit constantele reale sunt pozitive, cu excepia e-mail: antaltiberiu@pcnet.ro cazului n care sunt precedate de semnul minus. Ele pot avea tipurile float, long i long doub le . Im plicit o constat| real| este de tipul doub le . Dac| se folosesc sufixele f sau F tipul este float, iar n cazul sufixelor l sau L tipul este long d ou ble .

36

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca 777.L /* constan ta reala de tipul long dou ble Facultatea Construcii de de tipul float */ Maini 777.F /* constan ta reala Catedra de Mecanic| i Programare ble */ 777.D /* constan ta reala de tipul dou Curs de limbaj C 777. /* constan ta reala de tipul dou ble */

*/

3.3.1.3 Constante caracter rezervate autorului. Copyright 2001. Toate drepturile sunt

Constanta caracter se formeaz| prin inclu dere a ntre apo strofu ri (') a unui singur caracter. Caracterele sunt codificate conform reprezent|rii ASCII (American Standard Multiplicarea acestui document n scop comercial este interzis|. Code for Information Interchange). Aceasta asociaz| fiec|rui caracter, grafic sau negrafic, o valoare numeric| ntreag| unic| n domeniul 0-127. Valoarea constantei caracter este Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest valoarea numeric| a caracterului respectiv asociat n reprezentarea ASCII (codul ASCII). document motiv constantele caracter pot participa n operaii numerice asemenea unor Din acest pentru uzul personal. ntregi. Codurile ASCII ale caracterelor se prezint| sub forma unei liste care specific| Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoarecu codificarea n octal, zecimal i hexazecimal pentru fiecare caracter mpreun| reprezentarea lui grafic| la tip|rire i semnificaia lui (pentru caracterele negrafice): pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
Octal Zecimal Hexazecimal Nume, Explica ie 042 34 0x22 ", ghilime le 043 35 0x23 #, hash ANTAL Tiberiu Alexandru 000 0 0x00 NUL 044 36 0x24 $, dolar tel.: 0040-264-530918 001 1 0x01 SOH 045 37 0x25 %, procent e-mail: antaltiberiu@pcnet.ro 002 2 0x02 STX 046 38 0x26 &, ampersand 003 3 0x03 ETX, Con trol-C 047 39 0x27 ', apostrof 004 4 0x04 EOT 050 40 0x28 (, parentez| deschis | 005 5 0x05 ENQ 051 41 0x29 ), parentez| nchis | 006 6 0x06 ACK 052 42 0x2a *, asterisc 007 7 0x07 BEL 053 43 0x2b +, plus 010 8 dr. ing. ANTAL Tiberiucursorului 0x0 8 BS, terge la stnga Alexandru 054 44 0x2c ,, virgul| Conf. 011 9 0x09 HT, tabulator orizontal 055 45 0x2d -, minus Universitatea Tenhic| din Cluj-Napoca 012 10 0x0a LF, trecere la linie nou| 056 46 0x2e ., punct Facultatea Construcii de Maini 013 11 0x0b VT, tabulator vertical 057 47 0x2f /, oblique stroke Catedra0x0c Mecanic| feed de i Programare 014 12 FF, form 060 48 0x30 0 Curs de limbaj C retur de car 015 13 0x0d CR, 061 49 0x31 1 016 14 0x0e SO 062 50 0x32 2 Copyright 2001. Toate drepturile sunt rezervate autorului. 3 017 15 0x0f SI 063 51 0x33 020 16 0x10 DLE 064 52 0x34 4 021 17 0x1 1 DC1, XO N, Control-Q 065 53 0x35 5 Multiplicarea acestui document n scop comercial este interzis|. 022 18 0x12 DC2 066 54 0x36 6 023 19 0x1 3 DC3, XO FF, Con trol-S 067 55 superior bugetar pot multiplica acest 0x37 7 Sudenii participani la orice form| de nv||mnt 024 20 0x14 DC4 070 56 0x38 8 document pentru uzul personal. 025 21 0x15 NAK 071 57 0x39 9 026 22 0x16 SYN 072 58 0x3a :, doua puncte 7 Sudenii 0x17 participani la orice form| de nv||mnt cu 0x3b sau punct i virgul| doritoare plat| ;, alte persoane 027 23 ETB 073 59 pot multiplica documentul numai contra cost074 cu acordul scris al mic dect i 60 0x3c 030 24 0x18 CAN <, mai autorului. n acest scop25 0x19 contact| la: m| putei EM 031 075 61 0x3d =, egal 032 26 0x1a SUB 076 62 0x3e >, mai mare dect 033 27 ESC, escape 077 63 0x3 f ?, semn de ntrebare ANTAL 0x1b Tiberiu Alexandru 034 28 0x1c FS 0100 64 0x40 @, i comercial tel.: 0040-264-530918 035 29 antaltiberiu@pcnet.ro 0x1d GS 0101 65 0x41 A e-mail: 036 30 0x1e RS 0102 66 0x42 B 037 31 0x1f US 0103 67 0x43 C 040 32 0x20 spa iu 0104 68 0x44 D 041 33 0x2 1 !, semn de e xclamare 0105 69 0x45 E

37

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca 0106 70 0x46 F Facultatea Construcii de Maini 0107 71 0x47 G Catedra de Mecanic| i Programare 0110 72 0x48 H Curs de limbaj CI 0111 73 0x49

0144 100 0x64 d 0145 101 0x65 e 0146 102 0x66 f 0147 103 0x67 g 0112 74 0x4a J 0150 104 0x68 h Copyright 2001. Toate drepturile sunt rezervate autorului. 0113 75 0x4b K 0151 105 0x69 i 0114 76 0x4c L 0152 106 0x6a j Multiplicarea acestui document n scop comercial este 0x6b interzis|. 0115 77 0x4d M 0153 107 k 0116 78 0x4e N 0154 108 0x6c l 0117 79 0x4f O 0155 109 0x6d m Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 0120 80 0x50 P 0156 110 0x6e n document pentru uzul personal. 0121 81 0x51 Q 0157 111 0x6f o 0122 82 0x52 R 0160 112 0x70 p Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 0123 83 0x53 S 0161 113 0x71 q pot multiplica documentul numai contra cost0162 114 0x72 scris al autorului. n acest i cu acordul 0124 84 0x54 T r scop85 putei contact| la: m| 0x55 0125 U 0163 115 0x73 s 0126 86 0x56 V 0164 116 0x74 t ANTAL Tiberiu W Alexandru 0127 87 0x57 0165 117 0x75 u 0130 88 0x58 X 0166 118 0x76 v tel.: 0040-264-530918 0131 89 antaltiberiu@pcnet.ro 0x59 Y 0167 119 0x77 w e-mail: 0132 90 0x5a Z 0170 120 0x78 x 0133 91 0x5b [, parantez | dreptunghiular | deschis | 0171 121 0x79 y 0134 92 0x5c \, backslash 0172 122 0x7a z 0135 93 0x5d ], parantez | dreaptunghiular | nchis | 0173 123 0x7b {, acolad| deschis | 0136 94 0x5e ^, caret 0174 124 0x7c |, bar| vertical| 0137 95 0x5f _, underscore 0175 125 0x7d }, acolad| nchis | Conf. dr.0x60 ANTALquote ing. `, back Tiberiu Alexandru 0176 126 0x7e 0140 96 ~, tilda Universitatea Tenhic| din Cluj-Napoca 0141 97 0x61 a 0177 127 0x7f, delete, terge caracterul de pe pozi ia curent| 0142 98 0x62 b Facultatea Construcii de Maini 0143 99 de Mecanic| i Programare 0x63 c Catedra

Curs de limbaj C Unele caractere ASCII sunt negrafice, utilizarea lor fiind special|. n C ele se scriu precedate de caracterul "\ ". Valorile zecimale ale acestor coduri sunt cuprinse n domeniul Copyright 2001. Toate drepturile sunt rezervate autorului. 0-31. De exemplu, caracterul cu numele BS (backspa ce ) are ca efect trecerea din poziia curent| a cursorului cu un caracter la stnga. n C el se scrie sub forma '\b'. Caracterul Multiplicarea acestui document ) are cacomercial este interzis|. cu numele BEL (audible alert n scop efect emiterea unui sunet de c|tre difuzorul calculatorului i n C se scrie sub forma '\a'. Aceste caractere speciale se mai numesc i Sudenii participani la orice form| mainv||mntfuncia printf() . pot multiplica acest secvent e escape . Ele vor fi tratate de pe larg la superior bugetar document pentru uzul personal. Un caracter se va stoca ntr-o variabil| de tipul char i se poate specifica prin codul lui octal, zecimal sau hexazecimal. Astfel,nv||mnt 'A' plat| sau scriepersoane sau 0x4 1. O Sudenii participani la orice form| de n locul lui cu se poate alte 0101, 65 doritoare eroare frecvent| este cnd n loculcontra cost i cu scriem '0'. '0' este o constantncaracter pot multiplica documentul numai valorii ntregi 0 acordul scris al autorului. | acest avnd codul ASCII 48 , care nu are nici o leg|tur| cu valoarea numeric| 0 (zero). Exist| scop m| putei contact| la: posibilitatea specific|rii unui caracter oarecare prin scrierea '\ooo', unde ooo este un num|r n octal sau prin '\xhh', unde hh este un num|r n hexazecimal corespunz|tor ANTALASCII al caracterului. Conform celor spuse, constanta caracter zero se poate codului Tiberiu Alexandru tel.: 0040-264-530918 defini prin '\0'. Aceasta are o semnificaie special| n limbajul C fiind caracterul care e-mail: antaltiberiu@pcnet.ro de caractere. marcheaz| terminarea unui ir

3.3.1.4 Constanta sir de caractere -

Din punct de vedere tehnic, un ir de caractere se scrie n C ca un tablou cu elemente de tipul caracter. ntruct tabloul este, asemenea poantorului, un tip de dat| structurat|
38

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca pentru moment este suficient s| tii cum se scrie. Facultatea Construcii de Maini Catedra de Mecanic| i Programare O constant| ir este o secven| vid| - f|r| nici un caracter - sau cu mai multe caractere Curs de limbaj ghilimele: "john ", "balada ", "te salut baietas ". Semnificaia special| a cuprinse ntre C

caracterului "\ " se p|streaz| i aici, el putnd ap|rea n interiorul unor constante ir. De Copyrightapare Toate drepturile sunt rezervate autorului. obicei, "\ " 2001. sub formele: Multiplicarea acestui , folosit i la constanta ir; este interzis|. \' caracterul apostrofdocument n scop comercial \" caracterul gh ilim ele , folosit la constanta ir; \\ caracterul backslash , adic| \ . de nv||mnt superior bugetar Sudenii participani la orice form|

pot multiplica acest

document pentru uzul personal. De exemplu, "Ghio mi-o zis \"Salutare ...\"" este o constant| ir care conine dou| ghilimele, iar de exemplu, ' \' ' este constanta caracter '. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Dac| ideea folosirii caracterelor F , L , D etc. pentru specificarea tipului unei constante pare ANTAL in riguroasa, C are cuvntul cheie const care se poate scrie n faa declaraiei unei prea put Tiberiu Alexandru 7 variabile pentru a defini 7 tel.: 0040-264-530918 un nume de constanta cu tip . Valoarea acesteia nu se va putea modifica. Cteva exemple sunt: e-mail: antaltiberiu@pcnet.ro

3.3.2 Constante cu nume

const char sapt=7; const double pi=3.141592653590; const cha r me saj[ ] = "Salutare !";

Prin folosirea lui const tipul este specificat explicit. O constant| este tratat| ca o r-value (right dr. ing. ANTAL Tiberiu Alexandru dreapta unui egal (= ). O instruciune de forma Conf. value ), adic| poate s| apar| numai n sapt=8; este incorect| i produce mesajul de eroare "invalid lvalue". Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Preproceso ru l este o caracteristic| specific| limbajului C, fiind un edi tor d e tex te nein teractiv care este "plasat" n faa compilatorului. Din acest motiv compilatorul nu Copyright 2001. Toatescrise n program, ci numai pe acelea care formeaz| ieirea "vede" instruciunile drepturile sunt rezervate autorului. preprocesorului. Asemenea oric|rui editor de texte, preprocesorul are o seam| de instruciuni de substituie de iruri de caractere i de includere de fiiere n textul Multiplicarea acestui documentn scop comercial este interzis|. documentului curent - care este programul C scris de noi. O astfel de instruciune este #include care are ca la orice form| deconinutului fiierului bugetar pot multiplica acest Sudenii participani efect includerea nv||mnt superior specificat n programul care va fi compilat. Operaiile de c|utare i substituie ale preprocesorului se definesc prin document pentru uzul personal. instruciunea #define .

3.3.3 Constante ale preprocesorului

1 2 3 4 5 6 7 8 9

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare #include <stdio.h> pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest #define putei contact| la: scop m| PI 3.141592653500L
#define ZILE_SAPT 7 #de fin e C R '\x d' /* Retu r de Ca r */ ANTAL Tiberiu Alexandru #define PIpe2 PI/2.

tel.: 0040-264-530918 int zile=ZILE_SPAT; e-mail: antaltiberiu@pcnet.ro

lon g pi_in_lo ng =P I; /* Valoa rea lui P I */

Forma generala a #define -ului este: 7

39

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de m e tex t_d e_ su bstitu ie Form a : 7 #d efin e nu Maini Catedra de Mecanic| i Programare Curs de cuvintele ntregi sunt substituite, iar irurile de caractere C - secvene de Numai limbaj C caractere cuprinse ntre ghilimele - i comentariile nu se modific|. De exemplu, irul de caractere 2001. Toate drepturile irul rezervate autorului. CopyrightPI va fi substituit prin sunt de caractere 3.141592653500L n tot programul C. Observai c| punct i virgul| (;) lipsete de la sfritul instruciunilor preprocesorului, iar ntre PI i 3.141592653500L nu apare semnul egal (= ). Din motive istorice constantele Multiplicarea acestui document n scop comercial este interzis|. preprocesorului se scriu cu litere mari. n linia 6 observati o exp resie constanta . Aceasta 7 este o expresie care la oricei form| de nv||mnt Expresiile obisnuite sunt evaluate n Sudenii participani are tot termenii constante. superior bugetar pot multiplica acest timpul executiei programului, expresia constanta este evaluata n timpul compilarii 7 7 7 document pentru uzultoti termenii ei sunt determinati deja la acel moment. programului ntruct personal. -

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Constantele enumerate se scop m| putei contact| la: prezint| sub forma unei liste de ntregi cu nume.

3.3.4 Constante enumerate


ANTAL Form a : 7

Tiberiu Alexandru enum identificator { lista } 7 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro valori erau definite folosind #define -ul astfel: n limbajul C K&R, listele de
#define duminica 0 #d efine luni 1 #d efine ma rti 2 #d efine mie rcur i 3 #d efine joi 4 Conf. dr.vine ri 5 #d efine ing. ANTAL Tiberiu Alexandru #define sambata 6 Universitatea Tenhic| din Cluj-Napoca

Facultatea Construcii de Maini n limbajul Mecanic| i Programare Catedra de C modern, exist| posibilitatea declar|rii unor tipuri enumerate de date folosind enum astfel: Curs de limbaj C
enum zi {duminica, luni, marti, miercuri, joi, vineri, sambata} zidelucru;

Copyright 2001. Toate drepturile sunt rezervate autorului. Efectul este acelai ca n cazul codului anterior, adic| dum inica = 0 , , sam bata = 6 dar Multiplicarea acestui documentde mai sus, apare ascunderea informaiilor i posibilitatea aici, fa| de lista de #define -uri n scop comercial este interzis|. declar|rii unor variabile de tipul zi. Valoarea primei constante este implicit 0 , valorile nespecificate cresc la orice form| de nv||mnt ia 1 de la ultima valoare specificat| Sudenii participanin progresie aritmetic| cu rasuperior bugetar pot multiplica acest. Enumerarea const| n personal. unei mulimi de constante ntregi. O declaraie de tip document pentru uzul specificarea enumerat d| numele opional - n exemplul de mai sus zi - unui identificator de tipul enumerat - zidelucru - i definete o mulime de identificatori ntregi - du m inica , luni, Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare m arti , ..., sam ba ta - uneori numii i mem bri . O variabil| de tipul enumerat stocheaz| una pot valorile specificate la definireacontra cost i cu acordultoarele reguli se aplic|acest din multiplica documentul numai tipului enumerat. Urm| scris al autorului. n pentru scop m| puteimulimi enumerate: membrii unei contact| la: pot exista valori constante duplicate. Astfel, de exemplu, se poate asocia valoarea ANTAL Tiberiu Alexandru 0 la doi identificatori diferii, de exemplu nu ll i zero , n aceeai mulime enumerat|; tel.: 0040-264-530918 e-mail:numele din lista enumerat| trebuie s| fie distincte de alte nume cu aceeai antaltiberiu@pcnet.ro vizibilitate, incluznd aici numele de variabile i numele din alte liste enumerate. Vizibilitatea este poriune de program n care un nume poate fi folosit. Noiunea se va l|muri la prezentarea funciilor.

40

Capitolul 3 - Variabile, tipuri de date i constante Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Variabilele Construcii de Mainifi utilizate la indexarea expresiilor i ca operanzi ai Facultatea de tipul enum pot operatorilor aritmetici Programare Un exemplu clasic de tip enumerat este cel boolean , Catedra de Mecanic| i i relaionali. de care C nu beneficiaz| implicit. n C, la declararea variabilei enumerate este obligatorie Curs de limbaj C naintea tipului enumerat (vezi exemplul care urmeaz| - Boolean este folosirea lui enum

un tip de dat|, iar sfars it si inceput sunt variabile de acest tip). Copyright 2001. Toate drepturile sunt rezervate autorului.

enum Boolean /* Declara rea u nui tip en um erat nu mit B oolean */ { Multiplicarea acestui document n scop comercial este interzis|. false, /* false = 0, true = 1 */ true Sudenii participani la orice form| de nv||mnt superior bugetar pot }; document pentruars it,personal. /* doua variab ile de tipul Boolea n */ en um Bo olea n sf uzul ince pu t;

multiplica acest

n ANSIparticipani lacare definescde nv||mnt cu plat| sau | trebuie s| fie constante Sudenii C, expresiile orice form| valorile membrilor din listalte persoane doritoare ntregi. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

41

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

4 Operatori

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest n acum uzul personal. document|pentru am vorbit despre variabile i constante. Valorile stocate n variabile se pot modifica sub controlul operatorilor. Operatorul acioneaz| asupra operanzilor, iar "numele" operatorului spune ce se va face cu valorile stocate n operanzi. Dup| Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare num|rul de operanzi asupra c|rora acioneaz| avem operatori unari, binari i ternari. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

4.1 Tiberiu Alexandru Operatorul de atribuire ANTAL

1 2 3 prin tf("%d \n ",c=10 8);

Operatorul de atribuire n C este semnul = . n operaiile de atribuire operandul din stnga tel.: 0040-264-530918 operatorului de atribuire trebuie s| fie o l-val u e modificabil| - un nume de variabil|. e-mail: antaltiberiu@pcnet.ro egalului se atribuie variabilei din stnga. Dac| n stnga Valoarea numeric| din dreapta avem o expresie aritmetic|, aceasta este evaluat| n prealabil, pentru a i se g|si valoarea. Dac| este cazul, dup| evaluare, expresia aritmetic| se convertete la tipul numelui de variabil| la care se atribuie. Dup| atribuire, expresia de atribuire ia valoarea operandului din stnga lui = dar f|r| a fi o l-value . Dac| vorbim despre adunarea "1+2", atunci "+" este operatorul, "1" i "2" sunt operanzii, efectul este adunarea valorilor numerice ale celor doi operanzi, ing. ANTAL Tiberiu Alexandru | vorbim despre atribuirea simpl| "i=1;" atunci Conf. dr. iar rezultatul adun|rii este 3. Dac "=" este operatorul, "i"din"1" sunt operanzii, efectul este stocarea valorii numerice "1" n Universitatea Tenhic| i Cluj-Napoca variabila cu numele"i", de Maini Facultatea Construcii iar rezultatul atribuirii este valoarea numeric| "1". Catedra de Mecanic| i Programare int a,b,c; Curs de limbaj C a=b=c=77; Copyright 2001. Toate drepturile sunt rezervate autorului. Cnd se face o atribuire n C, valoarea atribuit| este stocat| ntr-un registru al UCP. Aceast| valoare din registru este cea care se folosete interzis|. Multiplicarea acestui document n scop comercial este n continuare, eventual ea poate fi rescris| de urm|toarea atribuire. Sudenii2participani la oriceplaseaz| n RAM la adresa corespunz|toaremultiplica c i se n linia , valoarea de 77 , se form| de nv||mnt superior bugetar pot variabilei acest document pentru uzul personal.UCP, n acelai timp. Valoarea din registru este apoi stocheaz| ntr-un registru din atribuit| lui b i lui a . Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare n multiplica documentul numai contra cost i cu acordul scris plaseaz| i n acest potlinia 3, valoarea 108 se atribuie lui c , iar valoarea 108 se al autorului.n registru. Valoarea salvat| n registru scop m| putei contact| la: este cea afiat| de printf() sub controlul descriptorului "%d". Atribuirea din linia 2 se numete multipla , iar cea din linia 3, simpla . 7 7 ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Operatorii aritmetici ai limbajului C sunt:

4.2 Operatori aritmetici

42

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii C Maini Nume operatie Forma de scriere n de 7 Catedra de Mecanic| i Programare + adunare Curs de limbaj C sc|dere Copyright 2001. Toate drepturile sunt rezervate autorului. * nmulire Multiplicarea acestui document n scop comercial este interzis|. / mp|rire % modulo nv||mnt superior bugetar pot multiplica acest Sudenii participani la orice form| de (restul mp|ririi) document pentru uzul personal. "+ " i "- " pot s| fie att unari ct i binari , adic| sunt permise formele de scriere: Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare x=-y; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest x=z-u; scop /* putei i lucru la: x= +k; m| Acelascontact|cu x=x+k */

1 2 3 4 x=a+b;

ANTAL Tiberiu Alexandru n linia 1 operatorul "- " este unar pentru c| are un singur operand, pe y , iar rezultatul tel.: 0040-264-530918 ntors de el este valoarea lui y nmulit| cu -1 . n linia 2 operatorul "- " are doi operanzi pe e-mail: antaltiberiu@pcnet.ro z i u , valoarea ntoars| de el fiind diferena dintre z i u . n linia 3 "+ " este unar, iar ca rezultat este echivalent cu forma de scriere din comentariul al|turat. C are un operator numit "restul mp|ririi". Daca pentru mpartirea ntreaga rezultatul 7 7 7 expresiei 17/3 este 5 la folosirea operatorului modulo, n locul celui de mpartire, rezultatul 7 expresiei 17%3 este 2. Un astfel de calcul are sens numai pentru numere ntregi ntruct, numai aici exist| rest. Tiberiu rirea unor Conf. dr. ing. ANTAL La mp|Alexandru valori reale nu exist| rest, ci numai o fracie. Universitatea Tenhic| din Cluj-Napoca Unele limbaje de programare au operatori speciali pentru ridicare la putere ("^" n Basic Facultatea Construcii de Maini sau "**" n FORTRAN).Programare astfel de operator, dar are implementata functia de 7 Catedra de Mecanic| i C nu are un biblioteca pow ()C acest scop. 7 n Curs de limbaj n continuare dau un exemplu de utilizare al operatorilor aritmetici: Copyright 2001. Toate drepturile sunt rezervate autorului.
1 /* OP AR IT.C */ 2 Multiplicarea acestui document n scop comercial este interzis|. int m ain () 3 { 4 int a, b, c; /* variab ile intregi */ 5 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 6 document pentru uzul personal. a = 12; 7 b = 3; 8 Sudenii = a + b; c participani la/* adu nare de nv||mnt cu plat| sau alte persoane doritoare orice form| */ 9 c = a - b; /* scade re */ pot multiplicab; documentul numai contra cost i cu acordul scris al autorului. n acest 10 c = a * /* inm ultire */ scop m| puteib; la: 11 c = a / contact|/* imp artire */ 12 c = a % b; /* modulo */ 13 ANTAL Tiberiu b /2 - a *b*2 /(a*c + b*2 ); c = 12*a + Alexandru 14 c = c/4+13*(a + b)/3 - a*b + 2*a*a; tel.: 0040-264-530918 /* increm entarea variab ilei a */ 15 a = a + 1; antaltiberiu@pcnet.ro 16 e-mail:b = b * 5; 17 18 a = b = c = 20; /* atribuire m ultipla */ 19 a = b = c = a + b * c/3; 20 21 a = (b = (c = 20)); /* identica cu linia 18 */ 43

22 23

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca return 0; Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C Rezultatele programului sunt neinteresante pentru a fi afiate, dar ca exerciiu, pentru c| tii deja cum s| afiati valoarea unor ntregi utiliznd printf() , putei insera cteva Copyright 2001. Toate drepturile sunt rezervate autorului. instruciuni de ieire n diferite puncte ale programului pentru a verifica dac| intuii bine rezultatele calculate n program. Nu uitai s| ad|ugai #include<stdio.h> pentru cazul n care utilizai printf() . document n scop comercial este interzis|. Multiplicarea acestui

4.2.1 Conversii la utilizarea operatorilor aritmetici

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form|adunare "+ ", el trebuie ssau alte aduna numai ntregi, Dac| trat|m cazul operatorului de de nv||mnt cu plat| | poat| persoane doritoare pot multiplica documentul numai contra cost i cuar fi fost scris al autorului.operator de numai reali, ct i ntregi cu reali. Cel mai simplu acordul s| existe cte un n acest adunare pentru fiecare la: scop m| putei contact| caz, ns| att pentru ntregi (char, short , int, long ) ct i pentru reali (float, double , long d ou ble ) exist| mai multe tipuri. Se observ| c| num|rul de variante i de combinaii este mare. C-ul elimin| aceast| problem| prin operatorul "+ " care ANTAL Tiberiu Alexandru va alege singur tipul de adunare pe care o va face. Dac| "+ " are doi operanzi de tipul int tel.: 0040-264-530918 se va realiza adunare ntreag|, dac| are doi operanzi de tipul float se va realiza adunare e-mail: antaltiberiu@pcnet.ro flotant| - de numere reale. Ce se petrece n cazul n care unul din operanzi are tipul int, iar cel|lat tipul float? Fie exemplul:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 /* OP AR ITCV .C */ #include<stdio.h> int main (void) { Conf. dr. ing. ANTAL Tiberiu Alexandru int a,b,c; Universitatea Tenhic| din Cluj-Napoca doub le x,y,z;

Facultatea Construcii de Maini a=7; Catedra de Mecanic| i Programare b=3; Curs de limbaj C
x=7.0; y=3.0; Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. prin tf("%i\ n",c);

c=a /b ; /* a si b su nt intregi => se realizea za im partire intrea ga */

z=x /y ; /* x si y orice form| se realizeaza imp artire flotanta multiplica acest Sudenii participani la su nt reali =>de nv||mnt superior bugetar pot*/ prin tf("%f\ n",z); document pentru uzul personal.

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare prin tf("%f\ n",z); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest return contact| la: scop m| putei 0;
}

z=a /b ;

ANTAL Tiberiu Alexandru Rezultate: tel.: 0040-264-530918 2 2.333333 e-mail: antaltiberiu@pcnet.ro


2.000000

Conform celor spuse, compilatorul decide dac | rezultatul ntors de operand este ntreg sau real, funcie de tipul operanzilor. n acest caz pentru linia 14 (c=a/b ) mp|rirea este
44

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca ntreag| pentru c| a i desunt de tip ntreg (int). Interesant este rezultatul afiat n linia Facultatea Construcii b Maini 21 , aici mp|rirea este tot de tip ntreg, ns| din cauza c| z este real, rezultatul mp|ririi 7 Catedra de Mecanic| i Programare se convertete automat la tipul doub le . O astfel de mp|rire produce probleme din cauz| Curs de rirea a doi ntregi va da ntotdeauna un ntreg, dei poate noi am dori ca c| mp| limbaj C

mp|rirea s| se fac| la fel ca pentru cazul unor valori reale, din moment ce atribuim Copyrightmp|rToate drepturile sunt rezervate autorului. rezultatul 2001. irii unei variabile reale. Conform standardului, ntr-o astfel de mp|rire partea zecimal| se pierde f|r| s| apar| rotunjiri n sus sau n jos ca n alte limbaje de MultiplicareaO variant| de trecerescop comercialflotant| ar fi ca valorile lui a i b s| fie programare. acestui document n la mp|rirea este interzis|. atribuite la dou| variabile reale, apoi mp|rirea s| se efectueze ntre aceste variabile. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Cnd un operator arepersonal. de tipuri diferite se realizeaz| conversia automat| a document pentru uzul operanzi operazilor mai "limitai" spre operanzii mai "compleci" pentru evitarea pierderii de informaie. Dac| se dorete realizarea explicit| a unor conversii - conversie fort ata - din - 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare cauza c| nu se face automat sau dorim s| fim siguri de portabilitatea codului, se poate pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest folosi oper atoru l de con vers ie (type cast ) care are forma: scop m| putei contact| la:
Form a : 7

1 2 3 4 { 5 Copyright a,b; Toate drepturile sunt rezervate autorului. int 2001. 6 doub le z; 7 8 Multiplicarea acestui document n scop comercial este interzis|. a=7; 9 b=3; 10 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 11 z=(double)a/(double)b; document pentru uzul personal. 12 z=(d ou ble )a/ b; 13 z=a /(d ou ble )b; 14 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare prin tf("%f\ n",z); 15 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 16 z=(d ou ble )(a/ b); scop m| putei contact| la: 17 prin tf("%f\ n",z); 18 19 ANTAL Tiberiu Alexandru return 0; 20 } tel.: 0040-264-530918

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Operatorul de conversie modific| temporar tipul variabilei sau expresiei la care se aplic|. e-mail: antaltiberiu@pcnet.ro Din acest motiv n liniile 11 , 12 i 13 ale programului urm|tor (OPA RITC 1.C ) se realizeaz| mp|rire flotant|. Modalitatea de lucru a compilatorului de exemplu pentru linia 12 este: a se convertete temporar la un doub le , din acest motiv 7 devine 7.0. Acum, compilatorul are de mp|rit un doub le la un int i l va converti automat (n englez| termenul este promoted ) pe b la tipul doub le (b devine 3.0 ), realiznd mp|rirea doub le (flotanta) 7 conform regulilor aritmeticii numerelor reale, iar rezultatul va fi 2.333333. n linia 16 , parantezele rotunde nu rezolv nimic, iar Conf. dr. ing. ANTAL Tiberiu|Alexandru rezultatul mp|ririi este 2 , care va fi convertit la 2.000000. Tenhic| din Cluj-Napoca Universitatea Facultatea Construcii de Maini /* OP AR ITC1.C */ Catedra de Mecanic| i Programare #include<stdio.h> Curs de limbaj C int main (void)

(tip) expr esie

e-mail: antaltiberiu@pcnet.ro Rezultate:


2.333333 2.000000

Pentru rigoare reiau cazul operanzilor de tipuri diferite cnd C execut| conversia
45

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca automat| aConstrucii de Maini la altul, pe baza unor reguli stricte. Regulile se aplic| Facultatea unui tip de operand numai pentru operatorii binari i numai dac| cei doi operanzi nu sunt de acelai tip. Catedra de Mecanic| i Programare Pentru a determina care conversii trebuie realizate, compilatorul aplic| urm|torul Curs de limbaj C algoritm operanzilor unui operator binar:

1. Cnd unul din operanzi este de tipul long d ou ble , cel|lalt se convertete i el la Copyright 2001. Toate drepturile sunt rezervate autorului. tipul long d ou ble ; 2. n cazul n care condiia de mai sus nu este ndeplinit| i unul din operanzi este Multiplicarea acestui document n scop se convertete interzis|. doub le ; de tipul doub le , cel|lat operand comercial este i el la tipul 3. n cazul n care condiia de mai sus nu este ndeplinit| i unul din operanzi este de tipul float, cel|lalt form| de nv||mnt superior tipul float; Sudenii participani la orice operand se convertete i el la bugetar pot multiplica acest 4. n cazul uzul personal. document pentru n care nici una dintre condiiile de mai sus nu este ndeplinit| (din cauza tipului operanzilor) urmeaz| conversiile ntregi, astfel: a) Cnd unul dintre operanzi este de tipul unsigned long , cel|lalt operand Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare este convertit la tipul unsigned long; pot multiplicab) Cnd condiiile de mai sus nui cu acordul scris alunul din operanzi este documentul numai contra cost sunt ndeplinite iar autorului. n acest scop m| puteide tipul long i cel|lalt de tipul unsigned int, ambii operanzi se convertesc contact| la: la tipul unsigned long ; ANTAL TiberiuCnd condiiile de mai sus nu sunt ndeplinite i unul dintre operanzi este c) Alexandru de tipul tel.: 0040-264-530918 long , cel|lalt operand se convertete la tipul long ; d) Cnd condiiile e-mail: antaltiberiu@pcnet.ro de mai sus nu sunt ndeplinite i unul dintre operanzi este de tipul unsigned int, cel|lalt operand se convertete la tipul unsigned int; e) Cnd nici una din condiiile de mai sus nu sunt ndeplinite ambii operanzi se convertesc la tipul int.
float f; double d; int i; Conf. dr. ing. ANTAL Tiberiu Alexandru un sign ed long ul; Universitatea Tenhic| din Cluj-Napoca

Facultatea Construcii de Maini long (4.), rezu ltatu l inm ultirii con ver tit la dou ble */ d=i*u l; /* i co nv ertit la un sign ed Catedra de se conve i Programare d=ul+f; /* ulMecanic| rteste la float (3.), rezultatul adun arii se conv erteste la dou ble */ Curs de limbaj C Dac| rezultatul unei operaii de conversie dep|ete domeniul de valori ce corespunde tipului rezultat, Toate drepturile sunt rezervate autorului. Copyright 2001.valoarea va fi trunchiat| i rezultatul va fi dubios. Dup| cum vedei tipul char nu apare mai sus pentru c| el este n realitate un tip int mai "modest". n calcule, cnd este cazul, tipul char se convertete automat la cel int. Multiplicarea acestui document n scop comercial este interzis|.

4.3 Operatorii de incrementare (++) si decrementare nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice form| de (--)

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

C are doi operatori unari speciali pentru cost i cu acordul scris al autorului. n acest pot multiplica documentul numai contra incrementarea (adunarea lui 1 la valoarea unei variabile) i decrementarea scop m| putei contact| la: (sc|derea cu 1 a valorii unei variabile) variabilelor. De ce s-au implementat aceti operatori ntr-un limbaj att de mic cum este C? R|spunsul st| n corespondena direct| cu limbajul main|. Toate UCP au o form| de instruciune "inc" ANTAL Tiberiu Alexandru prin care se crete cu 1 coninutul unei locaii de memorie, la fel i pentru decrementare. tel.: 0040-264-530918 Din acest motiv C va traduce operatorii de incrementare i decrementare direct n e-mail: antaltiberiu@pcnet.roin|. Fie secvena de instruciuni: instruc iuni ale limbajului ma
1 int a,b; 2 a=7; 3 b=3; 46

4 5 6 7

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca a++; /* a dev ine 8, form a postfixa ta */ Facultatea Construcii de Mainiata */ ++b ; /* b dev ine 4, form a prefix Catedra devMecanic| i Programare b-- /* b de ine 3 */ Curs de dev ine 7 --a; /* a limbaj C */

Se observ|2001. Toate drepturile sunt rezervate autorului. prefixata . n ambele cazuri 7 7 Copyright c| operatorii ++ i -- au o form| postfixata i una se adun|, respectiv se extrage 1 din valoarea variabilei. Diferenele apar la valorile atribuite. Multiplicarea acestui document n scop comercial este interzis|.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* IN CD EC .C */ Sudenii participani la orice form| de nv||mnt int m ain () { document pentru uzul personal. int a, b ; /* intregi in [-32768 , 32767] */

superior bugetar pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare a=7; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 1) a=a+1; b=++a ; /* echiva la: */ scop m| putei contact|lent cu ->
prin tf("b=% d, a=%d \n ", a,b); 2) b=a;

ANTAL Tiberiu Alexandru a=7; tel.: 0040-264-530918 lent cu -> b=a++; /* echiva e-mail:prin tf("b=% d, a=%d \n ", a,b); antaltiberiu@pcnet.ro
return 0; }

1) b=a;

2) a=a+1;

*/

Rezultate: ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Valoarea expresiei unare este valoarea dupa incrementare sau 7 ++Facultatea Construcii de Maini , -- prefixat decrementare. La utilizarea operatorilor prefixai, incrementarea sau Catedra de Mecanic| i Programare loc prima dat|, apoi valoarea modificat| va fi decrementarea are Curs de|limbaj C 8 , valoarea curent| 7 din a devine 8 , apoi valoarea 8 se copiaz|, datorit| atribuit . n linia lui = , n b . Copyright 2001. Toate drepturile sunt rezervate autorului. Valoarea expresiei unare este valoarea operandului. Pentru operatorii postfixat ++ , -postfixa i, incrementarea sau decrementarea Multiplicarea acestui document n scop comercial este interzis|. are loc n faza a doua. Valoarea nemodificat| este atribuit|, apoi este modificat|. n linia 12 , valoarea participani la datorit| lui =de nv||mnt superiorabugetar pot multiplica acest 7 este copiat|, Sudenii orice form| , n b , apoi valoarea din este crescut| cu 1 , devenind 8. document pentru uzul personal. Pentru realizarea celor descrise, C fie folosete, fie nu folosete un registru temporar Sudeniiaparticipani la orice form|n cazul operatorilor prefixa i, persoane doritoare | pentru salva valoarea curent|. de nv||mnt cu plat| sau alte b=++a; se realizeaz pot multiplica documentul numaivaloarea. n cazulacordul scris al autorului. nvaloarea incrementarea, apoi se transfer| contra cost i cu postfixat, b=a++; C stocheaz| acest scop m| puteintr-un registru, apoi are loc incrementarea (i valoarea devine 8 ). n curent| de 7 contact| la: continuare se extrage valoarea din registru i se stocheaz| n b . Astfel, inclusiv n acest caz, incrementarea are loc ANTAL Tiberiu Alexandrunainte de atribuire. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
b=8, a=8 b=8, a=7 ing. Conf. dr.

4.4 Valori de adevar n C 7


47

C nu are un tip de dat| special pentru lucrul cu valori de adev|r. Problema este implementat| prin prisma valorilor numerice ale variabilelor.

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Orice valoare numeric| nenul| are valoarea de adev|r adeva rat (True). 7 Facultatea Construcii de Maini adeva rat (True) 7 Astfel,Programarei -7 au valoarea de adev|r adev|rat pentru c| sunt ntregii 1 Catedra de Mecanic| i nenuli. Similar este tratat| i valoarea real| 0.007. Curs de limbaj C fals (False) 2001. Copyright

Orice valoare numeric| nul| are valoarea de adev|r fals (False). Astfel, Toate drepturile sunt-0, +0, 0.00autorului.toate valoarea de adev|r fals . valorile numerice 0, rezervate 0e-01 au

Multiplicarea acestui document n scop comercial este interzis|. |. E suficient s| stoc|m Din acest motiv testarea valorilor de adev|r n C este foarte direct valoarea ntr-un registru, dup| care verific|m dac| exist| un bit nenul. Dac| da, atunci valoarea participani la oriceimediatde nv||mnt rat|. Dac| nici unpot multiplica acest Sudenii se poate identifica form| ca fiind adev| superior bugetar bit nu este setat pe 1 atunci valoarea este fals|. document pentru uzul personal.

4.5 Operatori relationali -

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Operatorii relaionali realizeaza compa rarea a 2 valori num erice , ntorcnd valoarea de 7 scop m| putei contact| la: adev|r adeva rat sau fals n funcie de validitatea relaiei specificate. Dac| relaia este 7 falsa , valoarea numeric| rezultat| este 0 ; dac| e adeva rata , valoarea numeric| este 1 . 7 7 7 ANTAL Tiberiu Alexandru Excepie fac de la aceast| regul| operatorii == i != , cnd se garanteaz| numai valoarea tel.: 0040-264-530918 fals . numeric| de 0 pentru e-mail: antaltiberiu@pcnet.ro Operator relational > >=

Relatia testata 7 primul operand este ma i primul operand este mai


mare

dect al doilea dect al doilea

mare sau egal

Conf. dr. ing. ANTAL Tiberiu Alexandru este m ai m ic dect al doilea < primul operand Universitatea Tenhic| din Cluj-Napoca <= primul Facultatea Construcii de Maini operand este mai mic sau egal dect al doilea Catedra de Mecanic| i Programare == primul operand este egal cu al doilea Curs de limbaj C != primul operand este difer it de al doilea Copyright 2001. Toate drepturile sunt rezervate autorului. Operanzii pot fi de tipul ntreg, real sau poantor. Tipurile operanzilor pot s| fie diferite, caz n care se acestui document n scop comercial este interzis|. Multiplicarea vor realiza conversiile uzuale pentru tipurile ntregi i reale n vederea comparaiei. n cazul operanzilor poantor, acetia trebuie s| fie poantori la acelai tip. Funcie de implementarea de compilator folosit|, comparaiile poantorilor ofer| posibilit|i Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest adiionale (comparaia unui poantor cu valoarea numeric| 0 sau a unui poantor de tip void ) document pentru uzul personal. care pot fi nsuite prin consultarea documentaiei compilatorului.
1 2 3 4

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int a,b,c; a=7; multiplica documentul numai contra cost i cu acordul scris al autorului. n acest pot b=a>5; putei contact| la: scop m| c=b>=144; ANTAL Tiberiu Alexandru | 1 , adic| adeva rat, se atribuie lui b . n linia 4, valoarea n linia 3 ,valoarea numeric 7 tel.: 0040-264-530918 , se atribuie lui c . numeric| 0 , adic| fals e-mail: antaltiberiu@pcnet.ro Pentru folosirea acestor operatori n exemple C clasice voi anticipa putin i voi descrie pe scurt instruciunea if , dei ea se va discuta formal numai n capitolul de instruciuni. Una dintre formele de scriere posibile ale lui if este:
48

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca if (condit ie) Facultatea Construcii de Maini instruct iune care se executa 7 7 Catedra de Mecanic| i Programare7 cnd condit ie este adeva rata ; else de limbaj C Curs instruct iune care se executa cnd condit ie es te falsa ; 7 7 Copyright 2001. Toate drepturile sunt rezervate autorului. O eroare frecvent| a ncep|torilor n C este utilizarea operatorului de Nu confundai = acestui document n scop comercial este a egalit|ii (== ). atribuire (= ) n locul celui de testare interzis|. Multiplicarea

cu ==
1 2 3 4 5 6 7 8 9 10 11 12 13 14

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest /* ER EG AL.C */ document pentru #include<stdio.h>uzul personal.
int main(void) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int a = 0;

scop m| putei contact| la:


if (a=0)

prin tf("a=0 \n ANTAL Tiberiu Alexandru "); else tel.: 0040-264-530918 prin tf ("a<>0\n "); e-mail: antaltiberiu@pcnet.ro return 0; }

Rezultate:
a<>0

Conf. dr. ing. a i se atribuie valoarea 0 . Testul nu este n realitate dect o alt| atribuire. n linia 6 lui ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Compilatorul va suprascrie vechea valoare a lui a cu valoarea 0 i o salveaz| ntr-un Facultatea Construcii de | valoarea din registru. Pentru c| are valoarea numeric| 0 este registru. Apoi, este testat Maini Catedra de iunea else din construcia falsa i porMecanic| i Programare if se va executa. Programul va lucra corect dac| n 7 loc de a=0 se va scrie a==0 . Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului.

4.6 Operatori logici

Multiplicarea acestui document n scopcel de negare (!) si lucreaza cu v alor ile logice de Operatorii logici sunt binari, mai putin comercial este interzis|. 7 adeva rat/ fals p erm it n d co m bin are a ex presiilor rela t ion ale (care se obin cu ajutorul 7 operatorilor relaionali). Rezultatul nv||mnt superior bugetar pot multiplica tipul Sudenii participani la orice form| deunui operator logic este o valoare logic|, acest rezultatului este int. O expresie relaionala este: a=((b>5) && (c<=123)) || (d>22) || (!e). C 7 document pentru uzul personal. implementeaz| urm|torii operatori logici: S I, SAU i NU. Ar fi fost mai intuitiv| folosirea unor cuvinte pentru aceti operatori, C ns| i-a implementat prin simbolurile & & , || si !. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Operatorul N U (!) neag| valoarea operandului. Pentru ceilali operatori prezint n pot multiplica documentul|numai contra cost i|: acordul scris al autorului. n acest continuare tabele de adev r dup| care opereaz cu scop m| putei contact| la: Tabel de adev|r pentru S I logic Tabel de adev|r pentru S A U logic ANTAL Tiberiu Alexandru && fals adeva rat 7 || fals adeva rat 7 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro fals fals fals fals fals adeva rat 7
adeva rat 7 fals adeva rat 7 adeva rat 7 adeva rat 7 adeva rat 7

49

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Ca de obicei, valorii de de Maini 7 rat i se asociaz| orice valoare numeric| nenul|, iar Facultatea Construcii adev|r adeva valorii de adev|r fals ,i Programare Catedra de Mecanic| valoarea numeric| 0 . Operanzii pot fi de tip ntreg sau poantor. Curs n cuvinte,C Spus de limbaj folosind valori de adev|r, S I logic ntre doi operanzi ntoarce valoarea de -

adev|r adeva rat numai dac| ambii operanzi au valoarea de adev|r adeva rat. SAU logic, 7 7 Copyright 2001.valorile numerice sunt rezervate autorului. de adev|r, ntoarce valoarea Toate drepturile corespunz|toare valorilor descris folosind ntreag| 1 dac| unul dintre operanzi este nenul, altfel ntoarce valoarea 0 . Multiplicarea acestui document n scop comercial este interzis|. Pentru expresiile care conin mai muli operatori logici consecutivi, C garanteaz| c| evaluarea lor se face de orice form| dreapta i c| va realiza scurtcircuitare cnd valoarea Sudenii participani la la stnga la de nv||mnt superior bugetar pot multiplica acest de adev|r pentruexpresii se poate determina f|r| a-i evalua toi termenii; document a unei uzul personal.
if (a && b&& c || d) Sudenii participani instruct iune; -

la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:sus prima oar| se evalueaz| a . Dac| ia valoarea adeva rat, se n expresia logic| de mai 7 evalueaz| b . Dac| b ia valoarea de adev|r adeva rat se trece la c etc., adic| evaluarea se 7 face de la stngaAlexandru Mai departe, dac| rezultatul de adeva rat sau fals poate fi 7 ANTAL Tiberiu la dreapta. stabilit la un moment dat, nu se mai fac evalu|ri n acelai scop n continuare. De exemplu, tel.: 0040-264-530918 dac| a este adeva rat i b fals , c nu ar mai fi evaluat - pentru c| un fals ntr-un lan de 7 e-mail: antaltiberiu@pcnet.ro & & -uri face ca tot lanul s| fie fals (vezi tabela de adev|r pentru && ) - termenul tehnic fiind de scurtcircuitare. Urm|toarea evaluare care se face este pentru d .
Utilizarea parantezelor rotunde

1 2 3 4 Copyright 2001. Toate drepturile sunt rezervate autorului. if (!a == 3) 5 prin tf("a d iferit de 3 \n "); 6 else 7 Multiplicarea acestui cu 3 \n "); n scop comercial este interzis|. prin tf("a ega l document

n poriunea de program care urmeaz| prezint un exemplu de program care nu face ce ati putea crede. n linia 4 a exemplului urm|tor, prin condiia dintre parantezele rotunde ncerc s| zic: "dac| a nu este egal cu 3". Din Conf. dr. ing.nefericire, !a se evalueaz| prima oar|, iar pentru c| a are valoarea 3 , adic| ANTAL Tiberiu Alexandru este adeva rata , !a primete valoarea de fals , adic| 0 . Apoi, 0 se compar| cu 7 7 Universitatea Tenhic| din Cluj-Napoca 3 i rezultatul afiat vade "a egal cu 3" . fi Maini Facultatea Construcii Catedra de Mecanic| i Programare int a; Curs de limbaj C a=3;

Sudenii participani la orice form| de nv||mnt superior bugetar potn plus sub forma Pentru eliminarea acestei probleme se va folosi o pereche de paranteze multiplica acest (!(a == 3)) . Prin acesteapersonal. fi mai clar, iar mentenana lui i depanarea vor fi mult document pentru uzul codul va uurate n viitor. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Operatorii pe biti sunt binari, mai putin cel de negare (~ ). Operanzii sunt interpretati ca o secventa de bit exceptiile 7 7 ANTAL -Tiberiui,Alexandrufiind descrise n cadrul notelor din tabelul urmator. Urm|torii operatori la nivel de bit sunt definiti n C: tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Denumire Scriere n C Nota 7

4.7 Operatori pe biti -

S I pe bit i -

&

expresie1 & expresie2

50

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini S A U pe bit i | Catedra de Mecanic| i Programare SA U E ^ Curs de XC LU SIV pe bit i limbaj C

expresie1 | expresie2 expresie1 ^ expresie2 ~expresie1

Copyright 2001. Toate drepturile sunt rezervate autorului. mai este numit si operatorul N U pe bit i ~ "complementul lui 1" ntruct rezultatul lui este complementul fata -7 Multiplicarea acestui document n scop comercial este interzis|. de 1 al operandului Sudenii participani la orice form| de nv||mnt superior << expresie2multiplica acest bugetar pot expresie1 document pentru uzul personal. operandul expresie1 este interpretat ca o secventa de biti, iar operandul -7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte 7 numaruldoritoare persoane de biti expresie2 specifica 7 deplasare la stnga << cu care se realizeaza deplasarea la 7 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest dreapta a secventei de biti scop m| putei contact| la: corespunzatoare operandului 7 expresie1 ANTAL Tiberiu Alexandru tel.: 0040-264-530918 expresie1 >> expresie2 e-mail: antaltiberiu@pcnet.ro operandul expresie1 este interpretat ca o secventa de biti, iar operandul -7 expresie2 specifica numarul de biti 7 7 de pla sar e la d rea pta >> cu care se realizeaza deplasarea la 7 stnga a secventei de biti corespunzatoare operandului 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Ei se pot aplica numai tipurilor ntregi (char, short , int i long cu sau f|r| semn), iar Facultatea lor este tot devaloare de tipul ntreg. C a fost iniial creat de Kernighan i rezultatul Construcii o Maini Catedrape oMecanic| i Programarescrierea unui sistem de operare i din acest motiv ei Ritchie de main| PDP-11 pentru Curs de nevoie de instrumente ct mai flexibile pentru manipularea regitrilor mainii. au avut limbaj C Aa s-au n|scut operatorii la nivel de bit. Vei observa c| & pe bit i && logic respectiv | Copyright 2001. Toate .drepturile sunt rezervate autorului. pe bit i || logic seaman| ntruct Kernighan i Ritchie foloseau mai mult operatorii pe bii 7 dect cei logici au rezervat un singur caracter operatorilor pe bii pentru o scriere ct mai scurt|. n continuare document n scop comercial este r pentru Multiplicarea acestui sunt prezentate tabelele de adev|interzis|.operatorii la nivel de bii: Tabel departicipani la orice form| dede adev|r pentru Tabel nv||mnt superior bugetar pot multiplica acest Tabel de adev|r pentru Sudenii adev|r pentru S I pe bit i SAU pe bit i S A U EXCLUSIV pe bit i document pentru uzul personal.
& 0 1 | 0 1 ^ 0 1 expresie1

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 0 0 0 0 0 1 0 0 1 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 1 0 1 1 1 1 1 1 0 scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 /* OP PE BIT1.C */ e-mail: antaltiberiu@pcnet.ro

1 2 #include<stdio.h> 3 void m ain () 4 { 5 unsigne d short a, b, c; 6 char *format1, *format2; 51

7 8 9 10 11 a=0x0FF0; 12 b=0xFF00; Copyright 2001. Toate drepturile sunt rezervate autorului. 13 14 c = a << 4;printf(fo rm at1,a ,"<<",4,c ); 15 Multiplicarea acestui document n scop comercial este interzis|. c = a >> 4;printf(form at1,a ,">>",4,c ); 16 c = a & b;pr intf(fo rm at1,a ," & ",b ,c); 17 c Sudenii = a | b;p rintf(form at1,a ," | ",b,c); participani la orice form| de nv||mnt superior bugetar pot multiplica acest 18 c = a ^ b;pr intf(fo rm at1,a ," ^ ",b,c); 19 document ~a ;prin tf(form at2,'~',a,c); c = pentru uzul personal. 20 a = ~c ;prin tf(form at2,'~',c,a); 21 } Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini = %04X \n"; form at1 =" %04X %s %0 4X Catedra de Mecanic| 04X = %04X \n"; form at2 ="%c% i Programare Curs de limbaj C

Rezultate: pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 0FF0 << 0004 = FF00 scop m| putei contact| la: 0FF0 >> 0004 = 00FF
0FF0 & FF00 = 0F00 0FF0 FF00 = FFF0 ANTAL|Tiberiu Alexandru 0FF0 ^ FF00 = F0F0 tel.: 0040-264-530918 ~0FF0 = F00F e-mail:= 0FF0 antaltiberiu@pcnet.ro ~F00F

1 2 3 #include<stdlib.h> 4 5 int main(void) 6 {

Specificatorul de format %04X spune c| se vor folosi 0 -uri pentru poziiile neocupate, l|imea num|rului fiind de 4 cifre, num|rul fiind afiat n hexazecimal (X este descriptor pentru baza 16 ). Se tie c| un num|r ntreg scris n baza de numeraie 10 , poate fi convertit n unul binar - baza de numeraie 2 - caz n care num|rul din baza 10 se va transforma ntr-o dr. ing.| de 0 i 1 . Aceti Alexandruact ioneaza la niv el de b it, n sensul c| primul 7 Conf. secven ANTAL Tiberiu operatori bit al prim ulu i opera nd va fi p us n corespondent a cu primul bit al celui de al doilea -7 Universitatea Tenhic| din Cluj-Napoca operand , se efectueaz| operaia dictat| de operator, apoi se trece la perechea a doua de Facultatea Construcii de Maini bii .a.m.d. Catedra de Mecanic| i Programare Curs decei care C neleg hexa, programul OP PE BIT2 .C prezint| valorile hexa n binar. Pentru limbaj nu Conversia valorii numerice ntregi f|r| semn n binar se face folosind o funcie din Copyright 2001. Toate drepturile sunt te ltoa i autorului. biblioteca standard C. Ea se nume rezervate pentru rigoare o descriu pe scurt n continuare: Multiplicarea acestui document n scop comercial este interzis|. ltoa - converteste un ntreg lung ntr-un sir de caractere Prototip:participani _ltoa(long valoare , char * s ir, int b aza ); char * - superior bugetar pot multiplica acest Sudenii la orice form| de nv||mnt Fisier prototip: ltoa - <stdlib.h> document pentru uzul personal. Valoare ntoars|: _ltoa ntoarce un poantor la un ir de caractere. n caz de eroare nu se ntoarce o valoare special|. Sudenii participani la orice|form| de nv||mnt cu plat| sau alte persoane doritoare Parametri: valoare - num r care va fi convertit; pot multiplicasdocumentul numaiurma conversiei; acordul scris al autorului. n acest - ir - ir rezultat n contra cost i cu scop m| puteibaza - baza sistemului de numeraie n care se face conversia, un num|r contact| la: ntreg f|r| semn ntre 2 i 36. Remarca ANTAL 7 : s ir este terminat n caracterul nu ll. Tiberiu Alexandru tel.: 0040-264-530918 /* OP PE BIT2 .C */ e-mail: antaltiberiu@pcnet.ro #in clude<std io.h>

52

7 8 9 10 11 form at1 =" %16s %s %04X = %16s\n "; 12 form at2 Copyright 2001.="\n % 16ss%s\ n %16 s\nrezervate autorului. Toate drepturile sunt ----------------\n %16s\n \n"; 13 form at3 =" %c% 16 = %16s\n "; 14 15 Multiplicarea acestui document n scop comercial este interzis|. a=0x0FF0; 16 b=0xFF00; 17 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 18 c = a << 3; 19 document pentru uzul personal. itoa(a,ca ,2); 20 itoa(c,cc,2); 21 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare prin tf(form at1,ca ,"<<",3,cc ); 22 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 23 c = a >> 3; 24 scop m| putei contact| la: itoa(a,ca ,2); 25 itoa(c,cc,2); 26 ANTAL Tiberiu Alexandru prin tf(form at1,ca ,">>",3,cc); 27 tel.: 0040-264-530918 28 c = a & b; antaltiberiu@pcnet.ro 29 e-mail:itoa(a,ca ,2); 30 itoa(b,cb ,2); 31 itoa(c,cc,2); 32 prin tf(form at2,ca," & ",cb,cc ); 33 34 c = a | b; 35 itoa(a,ca ,2); 36 Conf. dr. ing. ANTAL Tiberiu Alexandru itoa(b,cb ,2); 37 itoa(c,cc,2); Universitatea Tenhic| din Cluj-Napoca 38 prin tf(form at2,ca," | ",cb,cc); 39 Facultatea Construcii de Maini 40 Catedra de Mecanic| i Programare c = a ^ b; 41 Curs de limbaj C itoa(a,ca ,2); 42 itoa(b,cb ,2); 43 itoa(c,cc,2); 44 Copyright 2001. Toate drepturile sunt rezervate autorului. prin tf(form at2,ca," ^ ",cb,cc ); 45 46 Multiplicarea acestui document n scop comercial este interzis|. c = ~a; 47 itoa(a,ca ,2); 48 itoa(c,cc,2); 49 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest prin tf(form at3,'~',ca,cc); 50 document pentru uzul personal. a = ~c; 51 itoa(a,ca ,2); 52 itoa(c,cc,2); Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 53 prin tf(form at3,'~',cc,ca); 54 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 55 scop m| putei 0; return contact| la: 56 }

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca un sig ne d sho rt a, b, c; Facultatea Construcii de cc[17 ]; Maini char ca[17], cb[17 ], Catedra de Mecanic| i Programare char *format1, *format2, *format3; Curs de limbaj C

ANTAL Tiberiu Alexandru Rezultate: tel.: 0040-264-530918 111111110000 << 0003 = e-mail: antaltiberiu@pcnet.ro = 111111110000 >> 0003
111111110000 1111111100000000 ---------------&

111111110000000 111111110

53

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca 111100000000 Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C 111111110000 | 1111111100000000 ---------------Copyright 2001. Toate 1111111111110000

drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.


111111110000 ^ 1111111100000000 Sudenii participani la orice form| ---------------document pentru uzul personal. 1111000011110000

de nv||mnt superior bugetar pot multiplica acest

~ 111111110000 = 1111000000001111 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare ~1111000000001111 = 111111110000 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact|te tipul de dat| tablou, declarat n linia 8, care nc| nu a fost Dei programul folose la:

prezentat, rezultatele lui vin s| l|mureasc| felul n care se execut| operaiile la nivel de ANTAL Tiberiu Alexandruo funcie standard, are caracterul und erscore n faa numelui bii. Observai c| _ltoa fiind tel.: 0040-264-530918include n program n linia 3. i c| prototipul ei se e-mail: antaltiberiu@pcnet.ro Programele folosesc tipul ntreg short f|r| semn pentru c| acesta se reprezint| pe 16 bii. Dac| foloseam tipul int, dup| cum am mai spus deja, pe unele maini el se reprezint| pe 16 bii, iar pe altele pe 32.

Se observ| c| N U pe bii (~ ) neag| valorile biilor din num|r, astfel un 1 devine 0 i un 0 devine 1 . Deplasarea la stnga (<< ) cu un bit corespunde nmulirii valorii num|rului ntreg Conf. deplasarea cu 2 Tiberiu Alexandru echivalent| cu o nmulire cu 4, etc. Poziiile cu 2, dr. ing. ANTAL bii la stnga este Universitatea Tenhic| din Cluj-Napoca Deplasarea la dreapta (>> ) cu 1 bit corespunde r|mase vacante se vor completa cu 0. Facultateanum|rului cu 2.Maini i c| bitul din dreapta se pierde n procesul deplas|rii mp|ririi Construcii de Observa Catedra deexista posibilitatea recuper|rii lui. f|r| a mai Mecanic| i Programare Curs de limbaj C Pentru deplasarea la dreapta, n cazul numerelor cu semn, cel mai Folosii unsigned semnificativ bit bitul corespunz|tor puterii Copyright 2001. Toate drepturile -sunt rezervate autorului. celei mai mari a lui 2 - care cu >> reprezint| semnul, este inserat n noul num|r. Dac| tipul este unsigned , pe poziiile vacante se vor insera numai 0 -uri. Din punctul de vedere al Multiplicarea acestui document n scop comercial este interzis|. reprezent|rii interne a numerelor ntregi totul este corect, ns| dac| cunoatem acest mod de lucru, bitul de semn poate s| fie o surpriz|. n cazul numerelor cu semn, surpriza nu Sudenii participanieste pozitiv. de nv||mnt superior bugetar pot multiplica acest apare dac| num|rul la orice form| document pentru uzul personal. Un caz clasic de utilizare a operatorului & este mascarea unor bii Cazuri clasice de dintr-un num|r. Mascarea nseamn| c| efectul lor persoane doritoare Sudenii participani la orice form| de nv||mnt cu plat| sau alten valoarea num|rului utilizare este ascuns. Fie contra cost & x0f n care a este autorului. n acest pot multiplica documentul numai expresia a=ai cu acordul scris al variabil| caracter. x0f este n binar 00001111. Datorit| lui S I pe bit i , n poziiile unde avem 0 n scop m| putei contact| la: reprezentarea binara 00001111 , obinem 0 , iar n urma S I -ului pe bit i , valoarea 7 respectivilor bii Alexandru din a nu mai conteaza. Un alt caz clasic de utilizare, de data aceasta 7 ANTAL Tiberiu pentru operatorul |, este setarea pe 1 a unor bii dintr-un num|r. n urma expresiei a=a tel.: 0040-264-530918 1 n num|rul x0f vor fi 1 i n a . | x0f , acei bii care sunt e-mail: antaltiberiu@pcnet.ro

54

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare C permite scrierea Curs de limbaj C prescurtat| a expresiilor cu mai muli operatori. Se poate combina operatorul de atribuire cu unul din operatorii descrii pn| acum, astfel c| n locul formulei: 2001. Toate drepturile sunt rezervate autorului. Copyright

4.8 Atribuirea compusa 7


(ex pre sie1 ) = acestui document n scop comercial Multiplicarea(exp res ie1) <o per ator > (ex pre sie2 );

este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest se poate scrie: document pentru uzul personal.
expresie1 <operator> = expresie2;

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot|multiplica documentul numai contra cost expresiilor: scris al autorului. n acest Iat cteva exemple de scriere condensat| a i cu acordul scop m| putei contact| la:
a=a+b; /* se scrie si sub forma */ a +=b; a=a*b ; /*Tiberiu Alexandru ANTAL se scrie si sub forma */ a *=b; a=a /(b+c) /* se scrie si sub forma */ a /=b+c; tel.: 0040-264-530918

e-mail: antaltiberiu@pcnet.ro C evalueaz| mai nti expresia din dreapta operatorului compus, din acest motiv a/=b+c este a=a/(b+c) i nu este a=a/b +c . Efectul celor dou| forme de scriere este acelai, ns| metoda de evaluare nu. n varianta lung|, valoarea lui <expre sie1> se "evalueaz|" de dou| ori (la ntlnirea operatorilor de adunare i atribuire), iar n varianta compus| numai o dat|. Pentru mai multa claritate s| 7 vedem cam cum se genereaz| codul n limbajul main| pentru a=a+3; "ia valoarea lui a din Conf. dr. ing. ANTAL Tiberiu Alexandru RAM i ncarc-o ntr-un registru", "ia valoarea din registru i adun-o cu 3 ", "ia valoarea din Universitatea Tenhic| din Cluj-Napoca registru i stocheaz-o napoi n RAM pe locul lui a ". Dac| am fi scris numai a+=3 , din cele Facultatea Construcii de Maini de mai sus ar r|mne:i Programare a stocat| n RAM i adun|-o cu 3 ". Putem spune ca 7 Catedra de Mecanic| "ia valoarea lui o expresie de forma expresie1 <opera tor> = expresie2 este echivalenta cu expre sie1 = 7 Curs de limbaj C expresie1 <operator> (expresie2), cu exceptia ca expresie1 este evaluata o singura data. - 7 7 7 7 Copyright 2001. Toate limbaj attsuntmic ca C s-au implementat astfel de atribuiri? Pe Din nou, de ce ntr-un drepturile de rezervate autorului. vremea lui K&R, cnd optimizarea codului compilat nu prea exista, posibilitatea scrierii Multiplicareacretea viteza de lucru i sc|dea dimensiunea programului. n acest mod acestui document n scop comercial este interzis|. Pe vremea lui K&R diferena ntre de nv||mnt superior bugetar pot aceti operatori Sudenii participani la orice form|un program scris f|r| i altul scris cumultiplica acest era mare (altfel, aceti personal. nu ar fi fost implementai). Azi, n cazul unui compilator document pentru uzul operatori cu un optimizator bun, codul ar trebui s| fie identic n ambele cazuri. Putem spune c| aceti operatori au fost p|strai numai din motive de compatibilitate cu versiunile vechi Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare de C. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Operanzii unei atribuiri compuse trebuie s| fie de tip ntreg sau real. Fiecare operator de atribuire compus| realizeaz| conversia pe care operatorul binar corespunz|tor o face i ANTAL Tiberiu Alexandru corespunz|tori. Pentru cazul adun|rii (+= ) i sc|derii (-= ) restrnge tipurile operanzilor operatorii pot avea ca tel.: 0040-264-530918 operand stng un tip poantor caz n care operandul drept trebuie s| fie un ntreg. e-mail: antaltiberiu@pcnet.ro

55

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C n standardul C nu s-a fixat spaiul de RAM folosit la stocarea tipurilor de date pentru diferitele implement|ri de compilatorare. Astfel, este posibil ca o implementare de C s| Copyright 16 biiToate drepturile sunt rezervate autorului.i (4 octei). Teoretic, ar putea foloseasc| 2001. (2 octei) pentru tipul int, iar alta 32 de bi fi i implement|ri care folosesc 64 de bii pentru ntregi lungi (long int). Din acest motiv Multiplicareacunoatem n avans spaiulcomercialstocarea unui obiect. Operatorul sizeof este dificil s| acestui document n scop folosit la este interzis|. vine s| rezolve aceast| problem|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Form a : 7 sizeof identificator sau sizeof (nume-tip)

4.9 Operatorul sizeof

1 2 3 4 5 6 7 8 9 10 11 12

Sudenii participani la orice form|adic| o expresiecu plat|fie o expresie conversie de tip, Operandul este fie un identificator, de nv||mnt unar|, sau alte persoane doritoare pot multiplica documentul numai contra paranteze. Operatorul sizeof ntoarce m|rimea adic| un specificator de tip cuprins ntre cost i cu acordul scris al autorului. n acest scop m| putei contact| la: operandului n raport cu dimensiunea tipului char. El permite evitarea scrierii de cod cu m|rimea tipurilor de date dependente de tipul de main| utilizat. Rezultatul lui sizeof este de obiceiTiberiu Alexandru int. ANTAL de tipul unsigned tel.: 0040-264-530918 /* SIZEantaltiberiu@pcnet.ro e-mail: OF .C */
#include <stdio.h> int main(void) { long a;

Conf. dr. ing. ANTAL Tiberiu Alexandruocteti\ n", sizeo f a); prin tf("\"a \" se stoch eaza p e %u prin tf("un tip din Cluj-Napoca Universitatea Tenhic|sh ort se stoch eaza p e %u octeti\n ", size of Facultatea Construcii de Maini return 0; Catedra de Mecanic| i Programare } Curs de limbaj C Rezultate: Copyright 2001. Toate drepturile sunt rezervate autorului. "a" se stocheaza pe 4 octeti
un tip short se stocheaza pe 2 octeti

(sh ort));

Multiplicarea acestui document n scop comercial este interzis|. Aplicat unui tablou - o structur| de date care va fi discutat| n capitolul 9 - operatorul va avea ca participani la orice form| de i al tabloului. n cazul tipurilor de date structur| Sudeniirezultat num|rul total de octenv||mnt superior bugetar pot multiplica acest (struct) sau reuniune (personal. document pentru uzul union ) - care se vor discuta n capitolul 10 - operatorul va avea ca rezultat num|rul de octei al obiectului. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

4.10 Operatorul de evaluare secvent 7 ANTAL Tiberiu-iala Alexandru


Form a : 7 exp resie, ex pres ie_a tribu ita 7

tel.: 0040-264-530918 secvenial|, deseori numit i operatorul virgul|, evalueaz| cei 2 Operatorul de evaluare e-mail: antaltiberiu@pcnet.ro operanzi ntre care este interpus secvenial de la stnga la dreapta.

56

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Este folosit n mod tipic la evaluarea uneia sau a mai multor expresii, acolo unde, prin Facultatea Construcii de Maini context, este permis| i Programare expresie. Operandul stng (exp resie ) este evaluat Catedra de Mecanic| doar o singur| ca o expresie void , deci nu are tip, iar rezultatul operaiei are aceeai valoare i tip cu Curs de limbaj C operandul din dreapta (exp resie_ atribu ita ). Operanzii pot avea orice tip. Operatorul nu 7

ntoarce o l -v a lu e . Un exemplu de utilizare va fi dat n capitolul de instruciuni, la Copyright 2001. Toate drepturile sunt rezervate autorului. prezentarea ciclului for . Multiplicarea acestui document n scop comercial este interzis|.

4.11 Operatorul nv||mnt superior bugetar pot multiplica acest expresie Sudenii participani la orice form| de document pentru uzul personal. conditionala 7

C are un singur operator ternar de nv||mnt cu plat| sau alte o alternativ| pentru Sudenii participani la orice form| (cu trei operanzi) care este persoane doritoare instruciunea if (condit ie) instruc iune1; else instruc iune2; prezentat| deja sumar. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Form a : 7 condit ie ? expresie1 : expresie2; ANTAL Tiberiu Alexandru Prima oar| se evalueaz tel.: 0040-264-530918 | condit ie i dac| aceasta are valoarea numeric| 0 , valoarea de adev|r antaltiberiu@pcnet.ro este falsa . Altfel, valoarea de adev|r este adeva rata . Cnd condit ie este 7 7 7 e-mail: adeva rata valoarea imediat dup| ? , adic| valoarea lui expresie1, este folosit| pentru a da 7 7 valoarea expresiei condiionale. Dac| condiie este falsa valoarea dup| : , adic| expresie2, 7 se folosete pentru a da valoare expresiei condiionale. Tipul celor dou| expresii trebuie s| fie identic; nu prea are sens s| scriei o expresie care se evalueaz| cnd la o valoare doub le cnd la una char, n funcie de o condiie. Dac| totui Conf.celoring. ANTAL Tiberiu, Alexandru tipul dr. dou| expresii difer| tipul expresiei rezult| din aplicarea regulilor de conversie discutate deja. De exemplu, dac| i i n sunt de tipul int, iar x de tipul float, exp resia i>0 Universitatea Tenhic| din Cluj-Napoca ? x : n va avea tipul float indiferent de valoarea lui i . Facultatea Construcii de Maini Catedra de Mecanic| i Programare Expresia condiC Curs de limbaj ional| se poate folosi n orice context n care se poate folosi o "expresie clasic|". n general, ea duce la scrierea mai succint| a codului (vezi exemplele care urmeaz| unde acelai efect este obinut cu operatorul ternar ? : i cu if ). Copyright 2001. Toate drepturile sunt rezervate autorului.
int a,b=10,c=-3; Multiplicarea acestui b=(a>c)?a:c;

document n scop comercial (a>c)interzis|. if este


b=a;

int a,b=10,c=-3;

else Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest b=c; document pentru uzul personal.

Poate vei fi mirai c| aici am folosit paranteze rotunde n jurul condiiei; explicaia acestei Sudenii participani la orice form| de|nv||mnt cu plat| sau alte persoane doritoare scrieri st| n paragrafele care urmeaz . pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

4.12 Precedenta operatorilor ANTAL Tiberiu Alexandru


1 /* PR EC ED E.C */ 2 #include<stdio.h> 3 int main(void) 57

C trateaz| operatorii cu importan| diferit| conform precedenei lor. Exist| aproximativ tel.:de operatori n C . Fiecare dintre ei are un "grad de importan|" specific. Fie 40 0040-264-530918 e-mail: antaltiberiu@pcnet.ro programul:

4 5 6 7 8 9 return 0; Copyright 2001. 10 }

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca { Facultatea a = 3*7+50/9; Maini Construcii de int Catedra de Mecanic| i Programare Curs de limbaj C % i\n ",a); prin tf("a =

Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Rezultat:


a = 26

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Expresia 3*7+50/9uzul personal.urm|toarele semnificaii: ((3*7)+50)/9 sau( 3*(7+50))/9 sau document pentru ar putea avea 3*(7+(50/ 9)) etc. Semnificaia ei corect| este ns| (3*7)+(50/9) pentru c| C asociaz| o importanparticipani la orice form| de nv||mnt cu plat| sau alte Astfel, nmulirea i Sudenii | mai mare operatorilor * i / dect operatorului + . persoane doritoare mpmultiplicarealizeaz| nainte de adunare. Precedena este cea care definen ordinea pot |rirea se documentul numai contra cost i cu acordul scris al autorului. te acest de evaluare a operatorilor dintr-o expresie. scop m| putei contact| la:

4.13 Asociativitatea operatorilor


1 2 3 4 5 6 7 8 9 10 /* AS OC IAT.C */ #include<stdio.h> int main(void) Conf. dr. ing. ANTAL Tiberiu Alexandru { Universitatea Tenhic| din Cluj-Napoca int b = 3*7/9;

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Precedena nu ne spune totul. De exemplu, care este ordinea de evaluare a operatorilor e-mail: antaltiberiu@pcnet.ro ntr-o expresie n care avem mai muli operatori de aceeai preceden|, cum sunt * i / sau - i + ? n acest caz se aplic| regula asociativit|ii. Asociativitatea este de la stnga la dreapta sau de la dreapta la stnga.

Facultatea Construcii de Maini prin Mecanic| i Programare Catedra de tf("b = % i\n ",b); Curs de limbaj C
return 0; }

Copyright 2001. Toate drepturile sunt rezervate autorului. Rezultat: b = 2 Multiplicarea acestui document n scop comercial este interzis|. n 3*7/9 dei * i / au aceea preceden|, asociativitatea lor este de pot multiplica acest Sudenii ,participani la orice iform| de nv||mnt superior bugetar la stnga la dreapta. Astfel, mai nti se efectueaza * , adic| se rezolva subexpresia 3*7 , care d| 21 , apoi 21/9 , 7 7 document pentru uzul personal. care d| 2 . Sudenii unei expresiila orice form| de nv||mnt cu plat| sau alte|, dar asociativitatea n cazul participani de forma a=b+=c; , = i += au aceeai preceden persoane doritoare potla dreapta la stnga. Operatorul += se va rezolvaacordul scrisvaloarea lui c se adun| la de multiplica documentul numai contra cost i cu prima oar|, al autorului. n acest scop m| putei contact| rii se atribuie lui a . b , apoi rezultatul adun| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

4.14 Tabel cu precedenta si - asociativitatea operatorilor C


58

Tabelul care urmeaz| prezint| precedena n ordine descresc|toare precum i asociativitatea operatorilor C. O mic| parte din ei nu au fost nc| discutai pentru c| sunt

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca legai de subiecte nc| netratate: poantor, tablou, structur| i apel de funcie. Facultatea Construcii de Maini Catedra de Mecanic| i Programare Simbol Operaia Asociativitate Curs de limbaj C [ ] () . -> postfix ++ po stfix -Expresie de la stnga la dreapta Copyright 2001. Toate drepturile sunt rezervate autorului. sizeof & * + - ~ ! (conver sie Unar de la dreapta la stnga tip) prefix ++ prefix -Multiplicarea acestui document n scop comercial este interzis|. * / % Multiplicare de la stnga la dreapta Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest + de la stnga la dreapta document pentru uzul personal. Adunare << >> Deplasare la nivel de bit de la stnga la dreapta Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot>multiplica documentul numai Relaionali i cu acordul scris alla stnga la n acest contra cost < <= >= de autorului. dreapta scop m| putei contact| la: == != Egalitate de la stnga la dreapta

ANTAL Tiberiu Alexandru & tel.: 0040-264-530918 ^ e-mail: antaltiberiu@pcnet.ro


| && ||

i la nivel de bit
Sau la nivel de bit

de la stnga la dreapta

Sau exclusiv la nivel de bit de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la dreapta la stnga de la dreapta la stnga de la stnga la dreapta

i logic
Sau logic

?: Expresie Conf. dr. ing. ANTAL Tiberiu Alexandru condiional| Universitatea -= <<= >>=din Cluj-Napoca = *= /= %= += Tenhic| &= |= ^= Atribuire simpl| i Facultatea Construcii de Maini compus| Catedra de Mecanic| i Programare , Evaluare secvenial| Curs de limbaj C

Operatorii 2001. Toate celul| a tabelului au aceeai preceden|. Se observ| c| + i - unar Copyright din aceeai drepturile sunt rezervate autorului. au o preceden| mai mare dect operatorii corespunz|tori binari. Operatorii de atribuire simpl| i compus| au aceeai preceden| nsa mai mic| dect a majorita-ii celorlati 7 7t Multiplicarea acestui document n scop comercial este interzis|. mai mic| dect a celor operatori. Din cauz| c| precedena operatorilor pe bii este relaionali, la testarea expresiilor la nivel de bit, trebuie folosite paranteze pentru ca Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest rezultatele s| fie corecte: document pentru uzul personal.
if ((a & M ASC A) == x 0f) { . . .}

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare NOTA: ntr-o expresie se pot folosi i cu acordul scris al autorului. pentru a pot multiplica documentul numai contra cost parantezele rotunde ( ) n acest impune o ordine de 7 scop m| putei contact| la: efectuare a operatiilor. Daca expresia are mai multe perechi de paranteze rotunde, evaluarea se ncepe cu subexpresia cuprinsa ntre parantezele cele mai interioare. 7 ANTAL Tiberiu Alexandru tel.: 0040-264-530918 n C nuantaltiberiu@pcnet.ro e-mail: este specificat| ordinea de evaluare a operanzilor unui operator (excepie fac operatorii & & , ||, ?: i v ir g u la ); astfel, dac| privim expresia 1/3 + 2*4 din punctul de vedere 7 al operatorului de adunare, nu se tie dac| mai nti se evalueaz| 1/3 sau 2*4 .

59

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Am de limbaj C Cursnumit operand o entitate asupra c|reia acioneaz| un operator. Expresia este o secvent a de op erato ri s i operanzi care efectueaz| oricare din urm|toarele trei aciuni: -7 < 2001. Toate drepturile sunt rezervate autorului. calculeaz| o valoare; Copyright < specific| un obiect sau funcie; < Multiplicarea genereaz| efecte secundare. acestui document n scop comercial este interzis|.

4.15 Expresia

n limbajul C, oper an zii fac parte din categoriile: Sudenii constante; la orice form| de nv||mnt superior bugetar pot multiplica acest - participani document pentru uzul personal. - identificatori; - iruri; Sudenii apeluri de funcii; form| de nv||mnt cu plat| sau alte persoane doritoare - participani la orice - expresii de selecie a membrilor unui tablou; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest - putei contact| la: scop m| expresii complexe formate prin combinarea operanzilor i operatorilor sau prin cuprinderea operanzilor ntre paranteze. ANTAL Tiberiu Alexandru Efectele secundare apar cnd valoarea unei variabile este modificat| ca urmare a evalu|rii tel.: 0040-264-530918operaiile de atribuire au efecte secundare. Apelurile de funcii pot unei expresii. Toate e-mail: antaltiberiu@pcnet.ro avea efecte secundare dac| modific| valoarea unui articol extern vizibil lor, prin atribuire direct| sau indirect| prin intermediul unui poantor. De exemplu, efecte scundare apar la urm|torul apel de funcie:
ad un a(i+1, i=j+2);

Argumentele ANTAL Tiberiu Alexandruevaluate n orice ordine. Expresia i+1 poate fi Conf. dr. ing. unui apel de funcie pot fi evaluat| nainte sau dupa i=j+2, rezultatele funciei ad un a() fiind diferite n fiecare caz. 7 Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini x[i]=i++; Catedra de Mecanic| i Programare Curs de limbaj mai sus, valoarea lui x[i] este imprevizibil|. Lucrurile se vor clarifica mai n exemplul de C bine dup| ce vei parcurge i capitolul legat de tablouri. Pn| atunci e suficient s| tii c| Copyright 2001. x[i] extrage al i -elea element al tabloului x . Indicele poate lua fie valoarea forma de scriere Toate drepturile sunt rezervate autorului. nou| a lui i , fie cea veche. Practic, rezultatul poate varia n funcie de compilatorul folosit sau de nivelul de optimizare activat pentru compilatorul curent. Multiplicarea acestui document n scop comercial este interzis|. n documentaiile tehnice aleform| de nv||mnt superior bugetar pot multiplica acest Sudenii participani la orice limbajului C vei ntlni noiunea de sequence point, adic| punct de secvent a . Voi ncerca s| l|muresc pe scurt aceast| noiune. Un punct de document pentru - 7 personal. uzul secven| este un punct aflat la sfritul unei expresii complete sau la atingerea operatorilor ||, & & , ?: , virgula sau naintea apelului unei funct ii , pn| la care este 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alteia ANSI/ISO C exist| garantat c| toate efectele secundare sunt terminate. n documenta persoane doritoare pot multiplicapunctul de secventa anterior i cel acordul scris al autorului.va modifica fraza: ntre documentul numai 7 - contra cost i cu curent, unui obiect i se n acest scop m| putei contact| la: dat| prin evaluarea expresiei. n plus, valoarea anterioar| va valoarea stocat| cel mult o fi referit| numai pentru a determina valoarea de stocat. A doua propoziie este cam criptic| i spune Alexandru 7 ANTALTiberiu ca: dac| un obiect este scris n interiorul unei expresii, orice referin| la acesta n|untrul expresiei din care face parte se face n scopul calcul|rii valorii care tel.: 0040-264-530918 urmeaz| s| fie stocat|. Aceast| regul| constrnge expresiile legale la cele n care referirea e-mail: antaltiberiu@pcnet.ro precede modificarea valorii. ncepatorii ntr-ale limbajului C nu fac diferena ntre termenii "comportament definit 7 prin implementare", "comportament nespecificat" i "comportament nedefinit". Dei am
60

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca discutat deja semnificaia acestor tremeni, s| vedem ce se petrece n cazul particular care Facultatea Construcii de Maini urmeaz|. Comportamentul definit prin implementare presupune c| implementarea Catedra de Mecanic| i Programare compilatorului utilizat s| selecteze un comportament care trebuie s| fie documentat. Curs de limbaj C nespecificat presupune ca implementarea compilatorului sa selecteze Comportamentul 7

un comportament care nu este neap|rat documentat. Nedefinit nseamn| c| orice se poate CopyrightPentruToate drepturile sunt rezervate autorului. compilatorului n cazul unor ntmpla. 2001. c| standardul nu impune comportamentul situaii din categoria nedefinit|, compilatorul poate s| fac| orice. n caz particular nu Multiplicarea acestui c| restul programului va funciona normal. Cazul pe care l prezint exist| nici o garanie document n scop comercial este interzis|. n continuare face parte din categoria celor nedefinite. Fie liniile de program: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int a =7; document pentru uzul personal.
prin tf(%i\ n,a ++*a ++);

Sudenii participani la orice form| folosit de mine este 56sau alte persoanede evaluare R|spunsul afiat de compilatorul de nv||mnt cu plat| . Cnd ordinea doritoare pot multiplica sa fie clar definit| (adic| nu cost i cu acordul scris al autorului. n acest conteaz|, fara documentul numai contra putem spune exact ordinea n care compilatorul 7 7 7 scop m| putei contact|ila: expresiei), spunem c| semnificaia expresiei este nedefinit|. va evalua diferitele p|r ale Scrierea acestor expresii este de evitat. Totui, amatorii le folosesc pentru c| uneori compilatorul le evalueaza n ordinea gndit| de ei, iar acetia presupun c| totul este n 7 ANTAL Tiberiu Alexandru regul| din moment ce evaluarea funcioneaz| conform atept|rilor. Pentru cazul tel.: 0040-264-530918 exemplului anterior, r|spunsurile posibile teoretic ar fi fost 7*8 i 8*7 care dau 56. Un alt e-mail: antaltiberiu@pcnet.ro r|spuns posibil putea fi 49 , n cazul n care compilatorul folosit ar fi ales s| fac| nmulirea mai nti i apoi increment|rile (alegerea ar fi fost corect| pentru c| punctul de secven| apare pentru expresia a++*a++ numai dup| ultimul a++ unde expresia se termin|). Postfix ++ nseamn| c| se face incrementarea mai trziu, compilatorul nefiind obligat s| o fac| imediat. Pentru c| n ANSI C nu se specific| modul de tratare a acestor cazuri, teoretic, codul de mai sus putea s| afieze 0 sau 34 sau 56465 sau s| duc| la blocarea calculatorului. Conf. dr. ing. ANTAL Tiberiu Alexandru Programatorii greescdin multe ori ncercnd s| fac| prea multe ntr-o singur| expresie, Universitatea Tenhic| de Cluj-Napoca prognoznd comportametul compilatorului pe baza ordinii de evaluare a operatorilor. De Facultatea Construcii de Maini exemplu,de Mecanic| i Programare ire (* ) are preceden| mai mare dect cel de adunare Catedra tim c| operatorul de nmul (+ ). Astfel, n expresia a + b * c , mai nti se nmulete b cu c , apoi rezultatul se adun| la Curs de limbaj C a . De multe ori zicem pe scurt c| nmulirea se face naintea adun|rii. n acest caz este chiar adev|rat, dar pentru expresia a++ + b++ * c++ cele afirmate nainte nu ne mai ajut|. Copyright 2001. Toate drepturile sunt rezervate trei variabile sunt i incrementate. Nu Aici, pe lng| nmulire i adunare, toate cele autorului. putem ti care dintre ele va fi incrementat| prima; totul depinde de compilator (de Multiplicarea acestui document n scop comercial este interzis|. exemplu, compilatorul poate stoca valoarea lui a ntr-un registru i s-o incrementeze imediat, dei va trebui s| rein| valoarea veche pn| dup| realizarea nmulirii). n final, mai trebuie s| tii c| parantezele nu dicteaz| ordinea de evaluare globalmultiplica dect Sudenii participani la orice form| de nv||mnt superior bugetar pot | mai mult acest o face precedena. Parantezele sunt mai tari i suprascriu precedena fortnd care document pentru uzul personal. operanzi sunt legai de care operatori. Din acest motiv putem spune c| afecteaz| semnificaia general| aorice form| de nv||mnt cu plat| sau alte persoane doritoare a Sudenii participani la expresiilor, dar nu spun nimic despre ordinea de evaluare subexpresiilor i de rezolvare a efectelor secundare. Deci, nu se poate "fora" ordinea pot multiplica subexpresii din expresia dat | ca exemplu prin ad|ugarea de paranteze sub evalu|rii unor documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact|. la: pentru aceast| form| de scriere nu se va ti care dintre forma a++ + (b++ * c++) Nici increment|ri va fi efectuata prima. Parantezele vor fora ca multiplicarea s| aib| loc 7 ANTAL Tiberiu Alexandru a ar fi forat oricum aceast| ordine de evaluare. nainte de adunare, preceden tel.: 0040-264-530918 Morala este c| scrierea unui cod e-mail: antaltiberiu@pcnet.ro care depinde de ordinea de evaluare este o experien| ce trebuie dep|it|. Astfel de expresii se vor evalua "corect" numai sub anumite compilatoare i se justific| numai pentru a satisface curiozitatea programatorului cu privire la aceste expresii "interzise". Dac| nu este clar cum se va realiza ceva de un anumit compilator singura ans| este evitarea capcanei.
61

Capitolul 4 - Op ANTAL Tiberiu Conf. dr. ing. eratorii limb ajului CAlexandru Universitatea Tenhic| din Cluj-Napoca Pentru a uura scrierea formulelor matematice n limbajul C prezint n continuare un Facultatea Construcii de Maini tabel cu exemple de transcriere a unor astfel de formule n expresii ale limbajul C. Catedra de Mecanic| i Programare Curs de limbaj C Formul| matematica 7 Scriere n C Copyright 2001. Toate drepturile sunt rezervate autorului. a*b

Multiplicarea acestui document n scop comercial este interzis|.

a*b*c

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest a/b document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau a/b/c alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest sau scop m| putei contact| la: a/(b*c) ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
(a+d)/(b+c)

(a*a*a*a+2*a*a+1)/(b*cos(x)+c)

sau
(pow(a,4.)+2.*pow(a,2.)+1.)/(b*cos(x)+c) (exp(x)+log(x))/sqrt(b+c)

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

exp(x)+log(x)/sqrt(b+c)

exp(x)+log(fabs(x+1))/sqrt(b+c)

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicareaprezentate mai sus intervin funcii din biblioteca standard a limbajului C. n expresiile acestui document n scop comercial este interzis|. Descrierea acestora este prezentat| n paragraful 14.5. Tot acolo sunt explicate i condiiile n care pot la orice form| de nv||mnt valorile bugetar ale argumentelor Sudenii participani fi folosite aceste funcii, adic|superior permise pot multiplica acesti valorile ntoarse de c|tre acestea. document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

62

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|.

5 Instructiunile limbajului C -

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. nstruciunile sunt cele prin care se controleaz| execuia programului. n limbajul C, care face parte la orice form| imperative, problemele se rezolv| prin descrierea Sudenii participani din clasa celorde nv||mnt cu plat| sau alte persoane doritoare algoritmului de rezolvare a problemei n termenii instruciunilor limbajului. Deci, pentru pot multiplica documentul numai contratim algoritmul de rezolvare a problemei,acest s| a putea scrie un program C, trebuie s| cost i cu acordul scris al autorului. n apoi scop m| putei contact| la: fim suficient de bine familiarizai cu instruciunile limbajului C pentru a descrie algoritmul folosind aceste instruciuni, operaie numit| i programare sau scriere a programului. ANTAL Tiberiu Alexandru generale pentru rezolvarea problemelor, care pleac| de la Exist| cteva caracteristici tel.: 0040-264-530918 iile se obin prin manipularea datelor. Iata cam ct trebuie s| tim presupunerea c| solu 7 din C pentru a scrie un program: e-mail: antaltiberiu@pcnet.ro 1. citirea datelor n program - operat ii de intrare; 2. stocarea datelor n program - tipuri de date s i declarat ii ; 3. instruciuni de prelucrare, manipulare a datelor - instruct iun i C care depind de tipul problemei de rezolvat; 4. afiarea rezultatelor calculate - operat ii de ies ire . Conf. dr. ing. ANTAL Tiberiu astfel nct: Instruciunile sunt organizate Alexandru Universitatea Tenhic| din Cluj-Napoca a) unele sunt executate condiionat, adic| numai dac| o anumit| condiie sau o Facultatea Construcii de ii sunt adev|rate i se numesc instruct iuni condit ion ale (if , mul ime de condi Maini switch ); Catedra de Mecanic| i Programare b) unele C Curs de limbaj sunt repetate, att timp ct o anumit| condiie este adev|rat| i se numesc instruct iuni de ciclare (w hile , do-w hile , for ); c) altele sunt grupate sub sunt rezervate autorului. executate, prin specificarea Copyright 2001. Toate drepturile un singur nume i pot fi acelui nume din diferite locuri ale programului i se numesc funct ii . Multiplicarea au efecte si nu ntorc valori. Ele sunt este interzis|. Instructiunile acestui document n scop comercial executate secvential n ordinea scrierii lor n program. Unele instructiuni, prin efectul lor particular, pot ntrerupe executia Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica (goto , secventiala a programului producnd salturi ntre diferite portiuni de program acest - 7 document pentru uzul personal. continue, break, return ).

5.1 Instructiunea expresie si blocul -

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| pn| acum sau printf() i sca nf() devin instruciuni dac| sunt Expresiile prezentate la: urmate de caracterul punct i virgul| (;). n limbajul C ; poart| denumirea de terminator de instruct iuni. Acesta marcheaz| terminarea unei instruciuni i are utiliz|ri multiple. ANTAL Tiberiu Alexandru Ai v0040-264-530918 folosit inclusiv la terminarea declaraiilor, adic| este i terminator |zut deja c| este tel.: de declarat ii . e-mail: antaltiberiu@pcnet.ro
Form a : 7 expresie; instruct iun e ex pres ie . 63

O expresie urmat| de ; se numete

Majoritatea instruciunilor

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca expresie C Construcii desau apeluri de funcii. Toate efectele secundare ale instruciunii Facultatea sunt atribuiri Maini expresie de Mecanic| i Programare executarea instruciunii urm|toare. Dac| expresia Catedra sunt terminate nainte de lipsete, construcia se numete instruct iun e vid a . 7 Curs de limbaj C

Instruciuni expresie C sunt: Copyright 2001. Toate drepturile sunt rezervate autorului.
1 a=0; 2 b=b+1; Multiplicarea acestui 3 prin tf("Te salu t!\n ");

document n scop comercial este interzis|.

Sudenii participani iunile expresie de nv||mnt superior bugetaro expresie s| fie util| Expresiile i instruc la orice form| pot s| fie complicate. Pentru ca pot multiplica acest document pentru uzul personal. trebuie s| modifice spaiul de date al programului (denumirea formal| este "trebuie s| produc| efecte secundare"). Liniile 1 i 2 sunt exemple de instruciuni expresie corecte Sudenii | dau valori noiorice form| de i b . La fel, linia 3 este un apel de funcie, fiind i pentru c participani la variabilelor a nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai. contra cost i cu acordul scris al autorului. n acest ea o instruciune expresie corect| Instruciuni expresie "degenerate" ale celor de mai sus ar putea putei contact| la: scop m| fi:
0; ANTAL b+1;

Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro fiecare calculeaz| o valoare f|r| ca apoi s| mai fac| ceva cu Ele sunt sintactic corecte, dar ea. Din acest motiv valorile calculate se pierd, iar instruciunile sunt inutile. Cazul "degenerat" prezinta instruciuni expresie care nu produceau efecte secundare. Este 7 posibil i opusul acestei situaii si anume ca o expresie s| aib| efecte secundare multiple (vezi a++*a++ ). n acest caz expresia este fie confuz| prin rezultatul ntors, fie nedefinit|. Acoladeleing.)ANTAL Tiberiu Alexandru o secven| de instruciuni i declaraii ntr-o Conf. dr. ({ } sunt folosite pentru a grupa instruct iune compusa care mai poart| i denumirea de bloc. Prin aceast| grupare blocul 7 Universitatea Tenhic| din Cluj-Napoca devine sintactic echivalentul unei singure instruc iuni. Facultatea Construcii de Maini Catedra de Mecanic| i Programare Form a : 7 { Curs de limbaj C instruct iune1 . . . Copyright 2001. Toate drepturile sunt rezervate autorului. instruct iunen -

Multiplicarea acestui} document n scop comercial este interzis|. Deci acest grup de instruciuni cuprins ntre acolade se va putea scrie oriunde C permite Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest scrierea unei singure instruciuni. Un astfel de exemplu sunt acoladele ntre care se scriu document pentru uzul personal. instruciunile care formeaz| corpul funciei m ain (). Nu se pune ; dup| acolada de nchidere (} ) a unui bloc. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

5.2 Instructiunea if-else -

ANTALit, am ajuns la descrierea construciei if-else pe care am utilizat-o deja n capitolul n sfrs Tiberiu Alexandru tel.: 0040-264-530918te pentru luar ea u nei d ecizii n mersul logic al rezolv|rii problemei, precedent. Se folose fiind modul tradiional de programare a unei ntreb|ri de tipul daca -atunci sau n cazul 7 e-mail: antaltiberiu@pcnet.ro n care-atunci .
Form a : 7 if (expresie)

64

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini instruct iune1 Catedra de Mecanic| i Programare else Curs de limbaj C instruct iune2 -

Copyright 2001.expresie care poate fi de tipul aritmetic sau poantor. Dac| exp resie este exp resie este o Toate drepturile sunt rezervate autorului. nenul| (!= 0 ), adic| adeva rata , se execut| instruct iune 1. Altfel (== 0 ) se execut| 7 7 Multiplicarea Poriunea else instructiune2 ; este este interzis|. instruct iune2.acestui document n scop comercialopional|. Astfel, o form| valid| este i: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Form a : 7 if (expresie) document pentru uzul personal. instruct iune1 Sudenii caz, instructiune1 se form| dedac| i numai dac| exp resie este nenul|. Dac| este n acest participani la orice execut| nv||mnt cu plat| sau alte persoane doritoare pot| se trece peste instructiune1 i programul continu| cuscris al autorului. |toare. nul multiplica documentul numai contra cost i cu acordul instruciunea urmn acest scop m| putei contact| la: ntruct if testeaz| numai valoarea numeric| pentru exp resie , n loc de if ANTAL Tiberiu Alexandru != 0) se poate scrie prescurtat if (expresie). Cteva exemple if (expre sie de utilizare ale lui if sunt prezentate n continuare: tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /* IF1.C */ int m ain () { int a1 = 11, a2 = 11, a3 = 11; char c1 = 40, c2 = 40, c3 = 40; float x1 = 12.987, x2 = 12.987, x3 = 12.987;

Conf. dr. ing. ANTAL Tiberiu Alexandru /* Prim ul grup de instru ctiuni de com parare */ Universitatea Tenhic| = -13; /* a3 = -13 if (a1 == a 2) a3 din Cluj-Napoca */ if (a1 > a 3) c1 = 'A'; /* c1 */ Facultatea Construcii de Maini = 65 if (!(a 1 > a 3)) c 'B ';/* c1 nu Catedra de Mecanic| 1i= Programare se mo difica */ if (c2 <= c3 ) x1 = 0.0; /* x1 = 0.0 */ Curs de limbaj x 2) x 3 = c3/2; /* x3 = 20 if (x 1 != C */
/* Al doilea grup de instruc iuni d e rezervate autorului. Copyright 2001. Toate drepturile suntcom parare */ if (a1 = (x 1 != x 2)) a 3 = 10 00; /* a1 = un n um ar pozitiv oa recare si a3 = 1000 */ if (a1 = a2) a3 = 222; /* a1 = a2 i a3 = 222 */ Multiplicarea acestui=document n=scop comercial este interzis|. if (a1 != 0) a3 333; /* a3 333 */ if (a1) a3 = 44 4; /* a3 = 444 */

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest /* Al treilea grup de instru ctiuni de com parare */ document pentru uzul personal.

a1 = a2 = a3 = 77; if ((a1 == a 2) & & (a1 == 77 )) a3 = 33; /* a3 = 33 */ Sudenii participani(a3 orice form| de nv||mnt*/ plat| sau alte persoane doritoare if ((a1 > a 2) || la > 12)) a 3 = 22; /* a3 = 22 cu if (a1 & & a2 && a3) a3 = contra cost i cu 11 */ /* a3 = acordul scris al autorului. n acest pot multiplica documentul numai11; if ((a1 = 1) && (a2 = 2) && (a3 = 3)) x1 = 12.00; /* a1 = 1, a2 = 2, a3 = 3, x1 = 12.00 */ scop m| putei contact| la: if ((a1 == 2 ) && (a2 = 3) & & (a3 = 4)) x 1 = 14 .56; /* x1 nu se m odifica */

ANTAL Tiberiu Alexandru para tii */ /* Al patru lea grup de com if (a1 == a1); a3 tel.: 0040-264-530918 = 27.345; /* a3 se m odifica intotdea una */ */ e-mail:if (a1 != a 1) a3 = 27 .345; /* a3 nu se modifica antaltiberiu@pcnet.ro if (a1 = 0) a3 = 27 .345; /* a1 = 0, a3 nem odificat */
return 0; }

65

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Observai cConstrucii de Maini Facultatea | instruciunile if prezentate se termin| n ;. Asta pentru c| gramatical, dup| condiia de Mecanic|if , Programareinstruciune. Deoarece instruciunile din exemplul Catedra de test din i urmeaz| o anterior sunt instruciuni expresie, acestea trebuie s| se termine n ;. Curs de limbaj C if-else Copyright 2001. if execut| o singur| instruc iune n funcie de rezultatul deciziei. Dac| Toatei drepturile sunt rezervate autorului. dori s| se execute mai multe instruciuni trebuie s| folosii instruct iunea compusa . 7 Multiplicarea acestui document n scop comercial este interzis|. if (b == 0.0) prin tf("Fractia n ed Sudenii participani laeorice efin ita\ n"); form| de nv||mnt else document pentru uzul personal. { f=a/b; prin tf("Fractia % f\n ", f); Sudenii participani laeorice form| de nv||mnt }

1 2 3 4 5 6 7

superior bugetar pot multiplica acest

acoladele din liniile 4 i 7 . ANTAL Tiberiu Alexandru tel.: 0040-264-530918 C permite ca un if s| conin| pe locul instruciunilor un alt if. O astfel de Suprapunerea e-mail: antaltiberiu@pcnet.roif -uri se numesc im bric ate sau suprapu se . Fie secvena: secven| de
if -urilor if (expr esie1) instruct iune1 else if (ex pres ie2) instruct iune2 Conf. dr. ing. ANTAL Tiberiu Alexandru else if (ex pres ie3) Universitatea Tenhic| din Cluj-Napoca instruct iune3 Facultatea Construcii de Maini else Catedra de Mecanic| i Programare instruct iune4 -

cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scopsus, puteibcontact| la: nenul|, se execut| tot grupul de instruciuni cuprinse ntre Mai m| dac| are o valoare

Curs de limbaj C ea este caracteristic| unei multi-decizii. Expresiile exp resie 1 , exp resie2 i exp resie3 sunt evaluate n ordine astfel: dac| exp resie1 este adeva rata se execut| instruct iune1 i 7 7 Copyright 2001. Toate drepturile sunt rezervate autorului. secvena de if -uri se termin|; altfel se execut| ramura else , care conine un nou if unde decizia se ia pe baza lui exp resie2 etc. instruct iunex poate s| fie o singur| instruciune Multiplicarea acestui document n scop comercial este interzis|. sau una compus|. Ultimul else trateaz| cazul "nici una dintre expresiile anterioare nu este adeva rata " instruct iune4 este atins| n cazul cnd nici una dintre condiiile puse nu au 7 7 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest fost satisf|cute. Sa vedem ce se petrece ns | pentru o situa ie de forma: 7 document pentru uzul personal.
if (expr esie1) if (expr esie2) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplicainstruct iune1 documentul numai contra cost i cu acordul scris al autorului. n acest else scop m| putei contact| la: instruct iune2 -

ANTAL Tiberiu Alexandru n acest caz se pune problema apartenenei lui else . C rezolv| aceast| ambiguitate tel.: 0040-264-530918 asociindu-l pe else celui mai apropiat if. Conform acestei reguli, else este asociat lui if e-mail: antaltiberiu@pcnet.ro ie nu ne convine trebuie s| folosim acoladele dup| cum se (exp resie2 ). Dac| aceast| situa prezint| n exemplul care urmeaz|:
int a=7; if (a>0) 66 int a=7; if (a>0)

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca if (a < 100) Facultatea Construcii de Maini prin tf("a in (1, 100)\ n); Catedra de Mecanic| i Programare else Curs de limbajafa ra lu i (0, 100 )\n"); prin tf("a in C

{ if (a < 100) prin tf("a in (1, 100)\ n);

Copyright 2001. Toate drepturile sunt

} else prin tf("a este rezervate autorului. n ega tiv\ n"); ,a ]

min max Multiplicarea Cazuri clasice deacestui document n scop comercial este interzis|. vom folosi if sub forma: if (a>= amin && a <= a max) . . ., iar condiia scris| utilizare

Pentru a verifica dac| o variabil| a este ntr-un domeniu dat [a

se citete astfel "dac| a este mai mare sau egal cu a min i mai mic sau Sudenii participani la orice form| de torii ntr-alesuperior bugetarspot multiplica acest egal cu a max". ncep| nv||mnt C vor fi tentai | pun| problema de document pentru uzul personal. a max) . . . Aceast| expresie este analizat| de compilatorul mai sus sub forma: if (a min <= a <= C la fel cu expresia a min + a + a max. Adic| se adun| a min la a , apoi la rezultat se mai adun| a max. Folosind parantezele rotunde ordinea de rezolvare a operatorilor poate fidoritoare Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane pus| ntr-o form| didactic documentul + a) + contra cost i cu acordul scris <= a max este n acest pot multiplica | astfel, (a minnumaia max. Similar, expresia a min <= aal autorului. echivalent| cu expresia (a min <= a) <=la:max. Se verific| dac| a min este mai mic sau egal cu a , rezultatul scop m| putei contact| a este 0 sau 1 dup| cum relaia este falsa sau adeva rata . Apoi se compar| valoarea 7 7 7 numeric| de 0 sau 1 - n funcie de rezultat - cu a max, iar rezultatul este valoarea 1 sau 0, ANTAL Tiberiu Alexandru dup| cum relaia este adeva rata sau falsa . Se observ| c| la a doua comparaie nu mai 7 7 7 tel.: 0040-264-530918 particip| valoarea variabilei a , ci ntotdeauna una din valoarile numerice de 0 sau 1, e-mail: antaltiberiu@pcnet.ro rezultatele celei de a doua comparaii fiind altceva dect ne-am propus noi iniial- pentru c| nu particip| a -ul ca operand. La realizarea unei operaii, n funcie de ndeplinirea unei condiii, if se scrie n mod tipic sub forma: if (a > m ax im ) . . . Operatorul > ntoarce valoarea 1 dac| a este mai mare dect m ax im sau 0 altfel. if l interpreteaz| pe 0 ca fals i pe 1 ca adeva rat. 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic||i Programaredec if pentru cazul mu lti-deciziilor . switch este o variant mai flexibil| Curs de limbaj C

5.3 Instructiunea switch Form a : 7

Copyright 2001. Toate drepturile sunt rezervate autorului.


{

switch(expresie)

Multiplicarea acestuicase expr-const1 : comercial este interzis|. document n scop instruct iuni1 case expr-const2 : instruct iuni2 . Sudenii participani .la .orice form| de nv||mnt superior bugetar pot multiplica acest default: instruct iuni3 document pentru uzul personal. }

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Maimultiplica documentul numaiexp resie ; dac|cu acordul scris al autorului. n acest pot nti se testeaz| valoarea lui contra cost i aceasta este egal| cu una dintre valorile constantelor ntregi expr-consti se face ramificarea pe cazul corespunz|tor. Fiecare caz scop m| putei contact| la: separat este marcat printr-o etichet| format| din unul sau mai muli ntregi sau printr-o expresie Tiberiu Alexandru ANTAL constant| (expr-consti ). n caz de egalitate ntre valoarea lui exp resie i cea constant| din case se continu| execuia programului, ncepnd cu instruciunile tel.: 0040-264-530918 (instruc iuni1 , instruc iuni2 etc.) acelui caz. Grupul instruc iuni3 marcat cu eticheta e-mail: : sunt executate dac| nu s-a g|sit nici o egalitate. Poriunea de fau lt: este opional|; antaltiberiu@pcnet.ro de fau lt dac| aceasta nu exist| nu se face nimic. n secvena de program care urmeaz| se pune problema select|rii unei variante pe baza coninutului variabilei cmd . Implement|rile sunt scrise folosind att if ct i switch . fisiere (), program (), com pila re() , optiu ni() i alte _c om en zi() sunt nume de funcii. Implementarea cu switch arat| modul n care se
67

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca poate executa acelai grupMaini iuni pentru mai multe etichete diferite (cazul funciei Facultatea Construcii de de instruc fisiere () care este selectata la ap|sarea literelor f mic i F mare). 7 Catedra de Mecanic| i Programare Curs de limbaj C if ((cm d =='F ') || (cmd =='f')) fisiere (); else if (cm d == 'R ') prog ram (); Copyright 2001. Toate drepturile sunt else if (cm d == 'C ') com pila re(); else if (cm d == 'O ') optiu ni(); else alte_com en zi(cm d); switch(cmd) { rezervate autorului. 'f': fisiere();break case 'F': case case 'R': program();break; case 'C': compilare();break; Multiplicarea acestui document n scop comercial este interzis|. case 'O': optiuni;break; def au lt: alte_ com en zi(cm d); Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica }

acest

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

document pentru uzul personal. Din punctul de vedere al tipului expresiei de testat, sw itch este mai puin flexibil dect if . La switch se pot testa numai valori nv||mnt cu plat| sau alteexpresiei de testat se Sudenii participani la orice form| de de tipul ntreg, iar valoarea persoane doritoare poate comparadocumentul numai contra cost i cu acordul scris al autorului. n expresia pot multiplica numai cu constante. La if se pot testa i valori de tip real, iar n acest de testat pot interveni la: variabile ct i constante. n exemplul prezentat mai sus scop m| putei contact| att observai o instruciune neprezentat| nc|, break . Pentru a nelege rolul ei, f|r| a spune mai multe despre ea, prezint programul urm|tor: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 /* SW ITCH .C */ #include<stdio.h> e-mail: antaltiberiu@pcnet.ro
en um zile {lun i=1, m arti, m iercu ri,joi,vine ri,sim ba ta, d um inica }; int main(void) { enu m zile azi;

Conf. dr. ing. ANTAL Tiberiu Alexandru 7 prin tf("Ba ga un nu m ar in tre 1 si Universitatea Tenhic| din Cluj-Napoca sca nf("% i",& azi); Facultatea Construcii de Maini sw itch(azi) Catedra de Mecanic| i Programare { Curs de limbaj C luni: case
case ma rti:

= ");

case mie rcur i: Copyright 2001. Toate drepturile sunt rezervate autorului. case joi: case vineri: puts("Cara-te la lucru ...!");break; Multiplicarea cas e sim ba ta: pr intf("R elax eaz a-teeste interzis|. acestui document n scop comercial si "); case duminica: printf("fa o excursie !");break; de fau lt: orice form| de nv||mnt superior bugetar Sudenii participani laprin tf("N u e xis ta a sa o zi !"); } document pentru uzul personal. retu rn(0 ); }

pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Rezultate: scop m| putei contact| la: Baga un numar intre 1 si 7 = 3 Baga un numar intre 1 si 7 = 6 Baga un numar intre 1 si 7 =
Cara-te la lucru ...! Relaxeaza-te si fa o excursie ! fa o excursie !

ANTAL Tiberiu Alexandru Am spus c| la ntlnirea "egalit|ii" switch face ca programul s| se continue din acel punct, tel.: 0040-264-530918 break ntrerupe aceast| continuare fireasc| fornd saltul la acolada din linia 23 , iar e-mail: antaltiberiu@pcnet.ro execuia programului continua cu urm|toarea linie de program dup| aceast| acolad| (mai 7 sus, linia 24 ).

68

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Instruc limbaj C Curs deiunile de ciclare sau mai pe scurt ciclurile asigur| posibilitatea execuiei unei instruciuni n mod repetat. Toate ciclurile sunt formate din dou| p|ri: una sau mai multe expresii care controleaz| reluareasunt rezervate autorului.adica instruciunea sau grupul 7 Copyright 2001. Toate drepturile ciclului i corpul ciclului, de instruciuni a c|rei execuie se reia. C are trei instruciuni de ciclare: w hile , do-w hile i for Multiplicarea acestui document n scop comercial este interzis|.

5.4 Instructiuni de ciclare -

5.4.1 Instructiunea de ciclare while -

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. w hile este ciclul de baz| n C. Are o singur| expresie de control - exp resie - i execut| reluarea unei instruciunii - instruct iune - care se mai numete i corpul ciclului - atta Sudenii participanivaloareaform| de r adeva rat.cu plat| sau alte persoane doritoare timp ct exp resie ia la orice de adev|nv||mnt 7 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Form a : 7 while (expresie) ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Execuia instruciunii w hile seam|n| cu if . Dac| condiia exprimat| prin exp resie este e-mail: antaltiberiu@pcnet.ro adeva rata , se execut| instruct iune. n continuare, dup| execuia lui instruct iune, 7 7 condiia este testat| din nou. Dac| este nc| adeva rata , se reia instruct iune. Ct timp 7 7 condiia r|mne adeva rata , corpul ciclului se reia. Cnd condiia devine falsa (pentru c| 7 7 7 depinde ntr-un fel oarecare de valori care sunt modificate n corpul ciclului) corpul ciclului nu se reia, execuia programului continund cu prima instruciune care urmeaz| dup| aceasta. Gramatical, exp resie trebuie s| fie de tipul aritmetic sau poantor. Secvenele de evaluare ing. ANTAL Tiberiu Alexandru Conf. dr. pentru exp resie i instruct iune sunt: Universitatea Tenhic| din Cluj-Napoca exp resie Construcii de Maini Facultatea instruct iune Catedra de Mecanic| i Programare . . . Curs de limbaj C exp resie Copyright 2001. Cazuri clasice de Toate drepturile sunt rezervate autorului. adev|rat| este aplicaia clasic| a ciclului w hile . n exemplul urm|tor, utilizare Reluarea unui grup de instruciuni att timp ct o condiie este
instructiune

1 2 3 4 5 6 7 8 9 10 11 12

instruciunea n scop comercial este corespunde liniilor de program n Multiplicarea acestui documentreluat| este compus| iinterzis|. domeniul 7-10 . Atta timp ct valoarea variabilei i este mai mic| dect 6 , instruciunile care alc|tuiesc instruciunea compus| a corpului lui w hile se reiau. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. /* W HILE .C */
#include <stdio.h> int main(void) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int i = 0; scop m| putei contact| la: w hile (i < 6) { prin tf("Va loar ANTAL Tiberiu Alexandru ea lui i este % i\n ", i); i++; tel.: 0040-264-530918 } e-mail:return 0; antaltiberiu@pcnet.ro }

Rezultate:
Valoarea lui i este 0 69

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Valoarea lui i este 1 Facultatealui i este de Maini Construcii 2 Valoarea Catedra de Mecanic| i3 Valoarea lui i este Programare Curs de limbaj C Valoarea lui i este 4 Valoarea lui i este 5

Copyright 2001. Toate drepturile sunt rezervate autorului. Variante de scriere a programului anterior sunt i:
#include <stdio.h> #include <stdio.h> Multiplicarea acestui document n scop comercial este interzis|. int main(void) int main(void) { { int i = 0; int i = bugetar pot multiplica acest Sudenii participani la orice form| de nv||mnt superior0; w hile (i < 6) w hile (i < 6) document pentru uzul personal. { prin tf("i este %i\ n", i++ ); prin tf("i este %i\ n", i); return 0; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare i=i+1; } } pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest return contact| la: scop m| putei 0; }

De evitat tel.: 0040-264-530918

ANTAL Tiberiu Alexandru Dac| n exemplul de mai sus puneam caracterul ; dup| linia 6 (adic|, scriem w hile(i < 6); ) ciclul while va fi "executat la infinit". Prin definiia e-mail: antaltiberiu@pcnet.ro C ateapt| ca w hile s| se ncheie ntr-o instruciune care gramatical| este corpul cicului. Caracterul ;, numit instruct iun ea v ida satisface aceast| cerin|. 7 Creterea valorii lui i n corpul ciclului este esenial| pentru atingera condiiei de ieire din ciclu. Scris n aceast| form|, ciclul w hile se termin| dup| caracterul ;. Instruciunea compus| n care se modific| valoarea lui i nu mai face parte din w hile . Deci, valoarea lui i nu se modific| r|mnd 0 , iar condiia de p|r|sire a ciclului (i>=6) nu se mai ndeplinete. C va testa la infinit ndeplinirea condiiei de ieire din ciclu. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic|cele Cluj-Napoca erori apar la punerea condiiei de p|r|sire a Experiena arat| c| din mai frecvente Facultatea Construcii | presupunem c| dorii s| afiati valoarea lui i ct timp este mai ciclului. De exemplu, s de Maini Catedra de Mecanic|i i Programare mic| sau egal| cu 7 scriei programul: Curs de limbaj C

1 2 3 4 5 6 7 8 9 10 11

/* W HILE 1.C */ #include<stdio.h> Copyright 2001. Toate

drepturile sunt rezervate autorului.

int main(void) Multiplicarea acestui document n scop comercial este interzis|. { int i=1; prin tf("am ince orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii participani lapu t\n "); while (i == 7) document pentru uzul personal.i++); prin tf("i = %i\n ", prin tf("s-a term ina t\n "); } Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare

pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Rezultate: scop m| putei contact| la:
am inceput s-a terminat

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 este gresit! Trebuie s| reinei c| este esenial| scrierea corecta a Programul de mai sus 7 e-mail: antaltiberiu@pcnet.ro n cazul de mai sus condiia i == 7 este falsa de la nceput, condiiei de parasire a ciclului. 7 7 7 motiv pentru care se sare peste corpul lui w hile i se continu| programul cu urm|toarea instruciune (linia 11 ). Ciclul w hile infinit se poate obine i din neatenie. Dac| n programul W HILE .C linia 6 se va scrie sub forma w hile (i < 6); , ntre caracterul ) paranteza rotund| nchis|- i caracterul ; - punct i virgul| - se formeaz| corpul ciclului.
70

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Din aceast| cauz| valoarea i -ului nu se mai incrementeaz|, iar condiia de p|r|sire a Facultatea Construcii de Maini ciclului nu se ndeplineste. Ocazional, vom dori s| nu se fac| nimic n corpul ciclului w hile . Catedra de Mecanic| i Programare Un astfel de exemplu este linia w hile ((ch = ge tcha r()) != '\n'); . Aici se citete un caracter Curs de ia getchC care se stocheaz| n ch i se verific| dac| rezultatul este diferit de cu func limbaj ar()

caracterul '\n'. Deci acest ciclu va relua citirea unui caracter de la tastatur| atta timp ct Copyright este diferit de '\n'. Putem spune c| secvena de program ateapt| introducerea caracterul 2001. Toate drepturile sunt rezervate autorului. lui '\n' - ap|sarea tastei <Enter> - pentru ca programul s| treac| mai departe la instructiunea acestui document n scop comercial este interzis|. Multiplicarea urmatoare. 7 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Cea de a doua instruciune de ciclare este do-while . Ea testeaz| condiia de terminare a ciclului dup| executarea instruciunii. w hile testeaza aceast| condiie nainte doritoare ia 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane de execu instruciunii care formeaz| corpul ciclului. Dincu acordul scris al autorului. n acest c| acest punct de vedere putem spune pot multiplica documentul numai contra cost i do-w hile este un w hile cu "susul n jos". scop m| putei contact| la:

5.4.2 Instructiunea de ciclare do-while -

Form a : 7 ANTAL

do Tiberiu Alexandru tel.: 0040-264-530918instruct iune w hile (exp resie); e-mail: antaltiberiu@pcnet.ro

Datorit| test|rii condiiei de reluare a ciclului dup| execuia lui instruct iune , corpul acestui ciclul se va executa cel puin o dat|. Dac| exp resie este falsa corpul nu se reia. 7 Secvenele de evaluare ale lui exp resie i instruct iune sunt: instruct iune Conf. dr. ing. ANTAL Tiberiu Alexandru exp resie Universitatea Tenhic| din Cluj-Napoca . . . exp resie Facultatea Construcii de Maini 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Catedra de Mecanic| i Programare /* DOde limbaj C*/ Curs -W HILE .C


#include<stdio.h> int m ain () Copyright 2001. Toate { int a=3;

drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.


prin tf("inc epu t\n "); do { Sudenii participani la orice form|);de prin tf("\ta = %i\ n",a a--; document pentru uzul personal. } wh ile (a > 0 ); prin tf("sfirs it\n ");

nv||mnt superior bugetar pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica 0; return documentul numai contra cost i cu acordul scris al autorului. n acest } scop m| putei contact| la: Rezultate: ANTAL Tiberiu Alexandru inceput tel.: 0040-264-530918 a = 3 e-mail: antaltiberiu@pcnet.ro a = 2
a = 1 sfirsit

n linia 5 se iniializeaz| valoarea lui a cu 3 , linia 10 face decrementarea lui a , iar expresia
71

Un exemplu

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca testat| este a > 0 din linia 11 . Corpul ciclului este format din instruciunile liniilor 8-11 Facultatea Construcii de Maini cuprinsede Mecanic| i Programare Catedra ntre acolade. Curs de limbaj C n practic| ciclul do-w hile este mai puin folosit dect cel w hile . Exist|

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

ns| cazuri cnd este necesar sau cel puin convenabil de utilizat. S| Copyright 2001. Toate drepturiledorim s| scriem un program care citete de la tastatur| presupunem c| sunt rezervate autorului. un num|r ntreg, apoi afieaz| num|rul de cifre i semnul num|rului. Pentru c| un num|r are cel puin o acestui document n ca execuia corpului ciclului Multiplicarea cifr|, este convenabilscop comercial este interzis|.s| se fac| cel puin o dat|. Programul care urmeaz| implementeaz| o astfel de rezolvare. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest /* DO -W HILE 1.C */ document pentru uzul personal.
#include<stdio.h> int main(void) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { int a, c=0; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest char semn;

scop m| putei contact| la:


prin tf("a = ");

ANTAL Tiberiu Alexandru sca nf("% i", &a ); prin tf("%i a re tel.: 0040-264-530918 ", a ); e-mail: antaltiberiu@pcnet.ro
do c++; w hile ((a/=10 )!=0);

if (semn = (a < 0)) a=-a;

Conf. dr. ing. ANTAL Tiberiu Alexandru return 0; Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini Catedra de Mecanic| i Programare Rezultat: Curs5839 a = de limbaj C
5839 are 4 cifre si este pozitiv

prin tf("%i c ifre s i este %s\ n", c, sem n ? "n ega tiv" : "p ozitiv ");

Copyright 2001. Toate drepturile sunt rezervate autorului.

5.4.3 Instructiunea de ciclare for Multiplicarea acestui document n scop comercial este interzis|.

for este sintactic cel mai complicat dintre cele trei cicluri. n esen| este asem|nator cu w hile , avnd chiar o condiie de terminare identic| cu cea bugetar pot for este cea mai Sudenii participani la orice form| de nv||mnt superior de la w hile . multiplica acest

concis| form| de ciclu care reunete condiiile de nceput, condiia de terminare mpreun| document pentru uzul personal. cu instruciunile de avans ce trebuie parcurse nainte de reluarea execuiei corpului ciclului. participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii

pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Formm| puteifor (expresie1; expresie2; expresie3) 7 scop a : contact| la: instruct iune ANTAL Tiberiu Alexandru Gramatical, cele trei tel.: 0040-264-530918componente ale lui for sunt expresii. n cazurile comune expresie1 i expresie3 sunt atribuiri, iar expresie2 este o expresie relaional|. Oricare dintre cele e-mail: antaltiberiu@pcnet.ro trei expresii pot fi omise, ns| caracterele ; trebuie scrise. Caracterele ; - punct i virgul| separ| cele trei expresii i nu au nimic n comun cu terminatorul de instruciuni C. Cnd compilatorul ntlnete un ciclu for, va evalua la nceput pe expr esie1. Apoi, pe expresie2, iar dac| este adeva rata , se execut| corpul ciclului (instruct iune). Se continua cu 7 7 7
72

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca expresie3 pentru a trece la pasul urm|tor, apoi expresie2 se evalueaz| din nou pentru a Facultatea Construcii de Maini verifica dac| exist| pasul urm|tor. Pe timpul execuiei ciclului for, secvenele de evaluare Catedra de Mecanic| i Programare ale expresiilor sunt: Curs de limbaj C expresie1 Copyright 2001. Toate drepturile sunt rezervate autorului. expresie2 instruct iune expresie3 Multiplicarea acestui document n scop comercial este interzis|. expresie2 instruct iune Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest expresie3 . . document. pentru uzul personal. expresie2 instruct iune Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare expresie3 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest expresie2

scop m| putei contact| la: expresie1 se evalueaz| o singur| dat|. expresie3 se evalueaz| dup| fiecare reluare a corpului Tiberiu (Alexandru ). Ultima expresie care se va evalua este expresie2 pentru ANTAL ciclului instruct iune c| atunci cnd ea devine falsa , ciclul se termin|. 7 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Construcia: Comparaie for (exp_init ializare; exp_term inare; exp_av ans) while - for instruct iune; este echivalent| cu:
exp_init ializare; while(exp_terminare) Conf. dr. ing. ANTAL Tiberiu Alexandru { Universitatea Tenhic| din Cluj-Napoca instruct iune; exp_a Facultatea Construcii de Maini vans; }

Catedra de Mecanic| i Programare Curs de limbaj C Este util| comparaia ciclului for cu echivalenii lui din alte limbaje de Comparaie Cprogramare. Ciclul for prezentat n tabelul care urmeaz| este BASICCopyright 2001. Toate drepturile sunt rezervate autorului. instruciuni de ciclare din "aproximativ echivalent" cu urm|toarele FORTRANlimbajele BASIC, FORTRAN i PASCAL: Pascal Multiplicarea acestui document n scop comercial este interzis|. Limbaj de programare Forma de scriere 7 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest C for document pentru uzul personal. (i=a; i<= b; i=i+p) BASIC for i=a to b step p Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare FORTAN do 7 contra pot multiplica documentul numai i=a,b,p cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Pascal for i:=a to b ANTAL Tiberiu Alexandru Unele limbaje de programare cum sunt Pascal i Ada permit numai incrementarea sau tel.: 0040-264-530918 decrementarea variabilei de control a ciclului - i n exemplele de mai sus. Dac| se dorete e-mail: antaltiberiu@pcnet.ro | de 1 a variabilei de control, trebuie folosit un ciclu de tipul modificarea cu o valoare diferit w hile . Altele cum este FORTRAN, permit ca aceeai variabil| de control s| fie numai de tipul ntreg. Din aceast| prism| C este cel mai puin restrictiv pentru c| nu are "o variabil| de control a ciclului", toate cele trei componente ale ciclului for fiind expresii arbitrare. n C, spre deosebire de FORTRAN, dac| expresie2 este falsa nainte de prima 7
73

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca execuie a corpului cicluluiMaini -iune), acesta nu se va parcurge. n C, spre deosebire Facultatea Construcii de (instruct de Pascal, o variabil|i Programare controlul execuiei ciclului i p|streaz| valoarea Catedra de Mecanic| folosit| pentru final| dup| terminarea ciclului. La terminarea unui ciclu, datorit| realiz|rii condiiei de Curssirelimbaj C - condiia testat| devine falsa - valoarea variabilei de control, n C, dup| p|r| de a ciclului 7

1 2 3 4 5 6 7 8 9 10 11 12 13 14

ciclu va fi prima pentru care condiia a fost falsa i nu ultima pentru care a reuit. De 7 Copyright 2001.legal| modificareasunt rezervate autorului. Toate drepturile acestei variabile n interiorul ciclului i a valorii finale asemenea, este b care controleaz| terminarea ciclului. Pentru exemplificarea unui ciclu for , unde "pasul" de parcurgere este diferit de 1 prezint un program care calculeaz| valoarea funciei Multiplicarea acestui document ,n scop comercial este interzis|. cosinus n intervalul [0, B ] cu pasul de 0.1 radiani. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest /* FO R.C */ document pentru uzul personal.
#include<stdio.h> #include<math.h>

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare #define PI 3.141592553 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int main (void) scop m| putei contact| la:
{

ANTAL Tiberiu Alexandru for(ungh i=0.0; tel.: 0040-264-530918 unghi <= P I; unghi+=0.1) prin tf("cos (%3.2 e-mail: antaltiberiu@pcnet.rolg) = %lf\n ", un gh i,
return 0; }

dou ble u ngh i;

cos(u ng hi));

Rezultate:
. . . cos(2.8) = -0.942222 Conf. dr. ing.-0.970958 cos(2.9) = ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca cos( 3) = -0.989992 cos(3.1) -0.999135 Facultatea=Construcii de Maini

Catedra de Mecanic| i Programare += se folosete pentru a crete valoarea variabilei unghi cu 0.1 la fiecare reluare a ciclului. Curs de limbaj C n linia 3, m ath .h , este antetul standard pentru declaraiile funciilor matematice, n particular, pentru funcia cos (). Copyright 2001. Toate drepturile sunt rezervate autorului. Ciclul for pare a fi ideal atta timp ct avem o singur| expresie de Extinderea ciclului Multiplicarea acestui document n scop comercial este interzis|. | sau mai multe astfel iniializare i una singur| pentru avans. Dac| dou for de expresii ar fi necesar de executat, acolo unde for permite numai una singur|, s-ar p|rea | ar fi nevoie de o alt| instruciune C. Problema Sudenii participani la orice form| decnv||mnt superior bugetar pot multiplica acest poate fi upentru uzul | prin folosirea operatorului virgul|. El garanteaz| evaluarea or dep|it personal. document secvenial| a expresiilor de la stnga la dreapta, valoarea i tipul expresiei fiind date de cea mai din dreapta. la orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani Fie codul for(a=1, b=2, i=0; a=b=5, i<10; a++, b--, i++), expresie1 este format| din a=1, b=2, i=0 . Aici, mai nti se execut| a=1 , apoi b=2 i n final i=0 . Dac| ntr-un pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest caz nu avem nevoie de expresie1 i expresie3, este corect s| scriem un for de forma: for(; scop careputeiechivalent cu while (i<7). m| este contact| la: i<7;)
Ciclul for infinit tel.: 0040-264-530918

ANTAL Tiberiu Alexandru Dac| se omite expresie2, implicit se presupune c| aceasta are valoarea 1 (adeva rat), deci ciclul nu se va termina. Astfel, o construcie de forma 7 for(;;) produce e-mail: antaltiberiu@pcnet.ro un ciclu for infinit. O diferen| ntre w hile i for este c| la for, expresie2 este opional|, pe cnd la while , exp resie este obligatorie. Omiterea lui exp resie n ciclul w hile va fi semnalat| de compilator ca o eroare de sintax|. Dac| dorii n mod deliberat s| scriei un ciclu w hile infinit folosii construcia wh ile(1).

74

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca for este de preferat cnd cele trei expresii manipuleaz | aceeai variabil| Facultatea De ce attea Construcii de Maini sau structur| de date pentru iniializare, test de terminare i avans. Catedra de instruciuni de Mecanic| i Programare Dac| acest ablon de prelucr|ri nu este respectat, probabil w hile ar ciclare?de limbaj C Curs oferi o rezolvare mai clar|, cel puin pentru c| n cazul lui for ne

atept|m la un tipic descris mai sus, nu si pentru w hile . Copyright 2001. Toate drepturile sunt rezervate autorului.

5.5 Instructiunea break -

Multiplicarea acestui document n scop comercial este interzis|. Crearea deliberat| a unui ciclu infinit pare s| fie o aciune fatal|, din pot multiplica astfel Sudenii participani la orice form| de nv||mnt superior bugetar moment ce un acest de program nu se uzul personal. document pentru va termina niciodat|. Nu i n C ! Aici, se poate s|ri n afara oric|rui tip de ciclu prin folosirea instruciunii break. Instruciunea break termin| execuia celui mai apropiat do-w hile , for, w hile sau switch . Spun "cel mai apropiat" pentru c| este posibil| Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare suprapunerea mai multor cicluri. Efectul este acela de trecere a controlului la urm|toarea pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest instruciune dup| cea terminat|. scop m| putei contact| la:
Form a : 7

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 break este frecvent utilizat| n switch pentru a termina o ramur| particular|. Nu se poate e-mail: antaltiberiu@pcnet.ro folosi n afara instruciunilor de ciclare sau a lui switch .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* BR EA K.C */ #include <stdio.h> int main(void) { Conf. a; ing. ANTAL Tiberiu Alexandru int dr. UniversitateaaTenhic| din Cluj-Napoca for(a = -2 ; < 3 ; a++) { Facultatea Construcii de Maini if (a == Mecanic| i Programare Catedra de 0) { Curs de limbaj C corp ul ciclului fo r, IES IRE cu b rea k, a este %d \n ", a); prin tf("In break; } Copyright 2001. Toate drepturile sunt rezervate autorului. prin tf("In corp ul ciclului fo r, a es te %d \n ", a); } Multiplicarea acestui document n scop comercial este interzis|. return 0; }

break;

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Rezultate: document pentru uzul personal. sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: utilizeaz| la testarea unor condiii de terminare excepional| break se Cazuri clasice de a ciclurilor. ntr-un astfel de caz se dorete saltul n afara corpului utilizare ciclului mai ANTAL Tiberiu Alexandru devreme dect n cazul realiz|rii condiiei de p|r|sire a ciclului - cazul termin|rii normale. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
In corpul ciclului for, a este -2 In corpul ciclului for, a este -1 Sudenii participani la orice form| de nv||mnt este 0 cu plat| In corpul ciclului for, IESIRE cu break, a

5.6 Instructiunea continue break 75

foreaz| saltul imediat n afara celui mai apropiat ciclu, continue foreaz| saltul la urm|toarea reluare a ciclului. Instruciunea continue transfer| controlul execuiei

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca programului la nceputul ciclurilor do-w hile , for, w hile din punctul n care apare, s|rind Facultatea Construcii de Maini peste instruciunile r|mase n corpul corespunz|tor ciclului n care se g|sete. n cazul Catedra de Mecanic| i Programare ciclurilor w hile i do-w hile , saltul se face la reevaluarea condiiei de terminare a ciclurilor Curs resie . n cazul lui for, saltul se face la expresia de avans - expresie3 - apoi se - exp de limbaj C

reevalueaz| condiia de p|r|sire a ciclului - expresie2. Copyright 2001. Toate drepturile sunt rezervate autorului.
Form a : 7 continue;

Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Cazuri clasice de s| facem salt la nceputul ciclului pentru a testa expresia de p|r|sire a utilizare document pentru uzul personal. ciclului, eventual pentru a relua corpul acestuia, f|r| a trece prin toate instruciunile din corpul ciclului curent. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest /* CO NT INU E.C */ #include<stdio.h> scop m| putei contact| la:
#include<math.h> continue se folosete n elaborarea unui program cu cicluri, cnd dorim

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

ANTAL Tiberiu Alexandru int main(void) tel.: 0040-264-530918 { int a,b; e-mail: antaltiberiu@pcnet.ro
for(a = -2; a < 3; a++) for(b = -2; b < 3; b++) { if (a <= 0) break; if (b == 0) continue; printf("a = %2 d, b=%2 d, sq rt(a)/b = %f\ n", a ,b, sqr t(a)/b ); Conf. dr. ing. ANTAL Tiberiu Alexandru } Universitatea Tenhic| din Cluj-Napoca return 0; } Facultatea Construcii de Maini

Catedra de Mecanic| i Programare Rezultate: Curs de limbaj C

a= 1, b=-2, sqrt(a)/b = -0.500000 a= 1, b=-1, sqrt(a)/b = -1.000000 Copyright 2001. Toate drepturile sunt rezervate autorului. a= 1, b= 1, sqrt(a)/b = 1.000000 a= 1, b= 2, sqrt(a)/b = 0.500000 a= 2, b=-2, sqrt(a)/b = -0.707107 Multiplicarea acestui document n scop comercial este interzis|. a= 2, b=-1, sqrt(a)/b = -1.414214 a= 2, b= 1, sqrt(a)/b = 1.414214 Sudeniib= 2, sqrt(a)/b = form| de nv||mnt superior bugetar a= 2, participani la orice 0.707107

pot multiplica acest

document pentru uzul personal. n exemplul anterior, expresia Sudenii participani la orice form| se poate evaluacu plat| dac|alte 0 i a>=0 . n linia 12 , de nv||mnt numai sau b persoane doritoare pot multiplicaa <=0 este adev|rat|, se sare ni cu acordul scris interior pentru cacest se cnd condiia documentul numai contra cost afara ciclului for al autorului. n | nu scop m| putei contact| la: poate calcula . n linia 13 , cnd conditie b == 0 este adeva rata , mp|rirea nu se poate 7 7 efectua - Tiberiu c| b este zero - i se trece la o nou| reluare a ciclului for interior. ANTAL pentru Alexandru tel.: 0040-264-530918 Instruciunile break i continue sunt forme particulare ale instruciunii e-mail: antaltiberiu@pcnet.ro Ce sunt break i de salt necondiionat goto . F|r| a intra n prea multe am|nunte, unele continue? firme de software interzic folosirea lui goto n programe. Pentru c| break i continue sunt ntr-o relaie foarte apropiat| de goto , aceleai firme propun utilizarea moderat| a acestor instruciuni. De ce aceast| oroare fata de goto ? -7 n 1966, Bhm si Jacopini publica o lucrare n care arata ca orice program poate fi scris 7 7 7
76

Capitolul 5 - Instruciunile limbajului C Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca f|r| utilizarea saltului de Maini 7 Facultatea Construcii necondiionat. Utilizarea lui goto ngreuneaza mult nelegerea programului i n general va sc|dea viteza lui de execuie. Putem spune deci c| un Catedra de Mecanic| i Programare program cu salturi necondiionate va fi de calitate ndoielnic|. Curs de limbaj C

5.7 Instructiunea goto . . .

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. obligat s| o prezint i pe Pentru c| C are o instruciune de salt necondiionat goto m| simt aceasta. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Form a : 7 goto eticheta ; 7 Sudenii participani la instruct iune nv||mnt cu plat| sau alte persoane doritoare eticheta : orice form| de 7 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Instruciunea goto face saltul la instruciunea instruct iune marcat| cu eticheta eticheta . 7 n exemplul care urmeaz|, goto transfer| controlul programului la instruciunea etichetat| ANTAL : cnd a Alexandru 0 . cu iesire Tiberiu ia valoarea tel.: 0040-264-530918 /* GO TO .C */ e-mail: antaltiberiu@pcnet.ro
#include <stdio.h> int main(void) { int a;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Conf. dr. ing. ANTAL Tiberiu Alexandru { Universitatea Tenhic|0) goto iesire; if (a == din Cluj-Napoca prin tf("In corp ul ciclului fo r, a Facultatea Construcii de Maini } de Mecanic| i Programare Catedra iesir e: prin tf("Am iesit cu g oto d in fo r!\n "); Curs de limbaj0; C return
}

for(a = -2 ; a < 3 ; a++)

es te %d\ n", a );

Copyright 2001. Toate drepturile sunt rezervate autorului. Rezultate: In corpul ciclului document n scop comercial este interzis|. Multiplicarea acestui for, a este -2 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru Un num e de eticheta urmeaz| aceleai reguli de scriere ca pentru uzul personal. 7 Ce este o numele de variable. Eticheta se poa te ata s a orica rei instruct iun i din 7 eticheta ? 7 corpul funct iei n care apare instruciunea goto . Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Exist| situaii cnd folosirea unui goto este ndrept|it|. Cazul clasic iscop m| putei contact| la: totui uneori se este abandonarea unei construcii de mai multe cicluri suprapuse la folosete! apariia unei ANTAL Tiberiu Alexandru erori fatale n interiorul unuia dintre ciclurile suprapuse. Folosirea lui break ar duce la ieirea numai din cel mai apropiat ciclu, tel.: 0040-264-530918 ciclurile suprapuse fiind imposibil| far| utilizarea lui goto . ieirea direct| din toate e-mail: antaltiberiu@pcnet.ro
In corpul ciclului for, a este -1 Am iesit cu goto din for!

77

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|.

6 Functia -

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest ste ideal uzul scrierea document pentru ca la personal.unui program acesta s| fie ct mai uor de neles i de ntreinut. Pentru aceasta programele lungi trebuie transformate n poriuni de programe mai scurte,la orice form|toare n funcionare i casaueles, persoane doritoare Sudenii participani de sine st|t| de nv||mnt cu plat| n alte care puse cap la cap, s| dea programul iniial. n acest scop s-a creat funct ia . Ea poate fi privit| ca o cutie pot multiplica num e s i argumente care realizeaza o sarcin a specif ica . Cea maiacest | documentul numai contra cost i cu 7acordul scris al autorului. n dificil neagra cu un 7 7 7 scop m|aputei contact| la: este aducerea programului de la forma f|r| funcii, la o form| sarcin| programatorului mai compact|, prin rescrierea lui sub forma unor funcii cu num|r optim de parametri, n ANTAL Tiberiu Alexandruii i n alte programe, al ascunderii informaiei, al clarit|ii i scopul reutiliz|rii unor func tel.: 0040-264-530918programului. ntreinerii optime a e-mail: antaltiberiu@pcnet.ro Funct ia trebuie s| duc| la compartimentarea programului n poriuni de program prin care s| se: - defineasca o sarc ina clara , care se reia de mai multe ori n acelai program, 7 7 7 eventual se poate refolosi i n alte programe; - obin| o cutie neagra , adic| detaliile de implementare s| nu trebuiasc| s| fie 7 cunoscute n restul programului pentru a o utiliza; Conf. dr. ing. ANTAL Tiberiu Alexandru buna a sarcin ii . n acest scop, este probabil - realizeze implementarea ct mai 7 Universitatea Tenhic|din Cluj-Napoca ca funcia s|- i dep|easc| atribuiile suficiente pentru rezolvarea sarcinii Facultatea Construcii programul pentru care s-a scris, dac| se anticipeaz| posibilitatea particulare din de Maini extinderii funci Programare Catedra de Mecanic| ionalit|ii ei i pentru alte programe; - limbaj Curs de ajung| Cutiliznd apelurile funciilor- la un program n care sarcinile de rezolvat se observ| clar, adic| s| obinem un prog ram lizibil , n loc s| avem un program lung, complicat, dificil de sunt rezervate autorului. Copyright 2001. Toate drepturileneles, cu poriuni de cod care se repet|; - poat| rescrie oricnd n vederea obinerii unei robustei i performane mai bune f|r| alte modific|ri n restul programului. Aceast| rescriere trebuie s| fie posibil| Multiplicarea acestui document n scop comercial modul de implementare al funciilor. din moment ce restul programului nu tie este interzis|. Sudenii participani la orice form| dedin mai multe funcii care pot fi stocate n unul sau Programul C este, n general, format nv||mnt superior bugetar pot multiplica acest document fiiere surs|personal. mai multe pentru uzul C. Limbajul C a fost proiectat pentru utilizarea simpl| i eficient| a funciilor. El este orientat pentru proiectarea aplicaiilor prin funcii, limbajul C numindu-se din acest motiv, funcional. Am v|zut deja plat| sau alte persoane doritoare Sudenii participani la orice form| de nv||mnt cu c| n C variabilele trebuie declarate nainte de a fi folosite n program.contra cost i cu acordul scris funcii. Ele sen acest i pot multiplica documentul numai Procedura este identic| i la al autorului. declar| se definesc pentru a putea fi folosite n program. Asem|narea i diferena ntre o scop m| putei contact| la: declaraie i definiie de funcie se va l|muri n paragrafele urm|toare. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Dup| cum am mai spus, funcia este o poriune de program, scris| de noi sau de altcineva, care rezolv| o sarcin| distinct| din program. n liniile care urmeaz| doresc s| clarific modul de apelare a funciilor prin prisma observ|rii exemplelor prezentate pn| acum. Urm|toarele concluzii se pot trage:

6.1 Apelul functiilor -

78

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca N o funcie se apeleaza prin 7 Facultatea Construcii de Maini numele ei urmat de o pereche de paranteze rotunde; Nde Mecanic| i Programare , acestea se vor plasa ntre paranteze rotunde i vor dac| funcia are arg um en te Catedra fi separate prin virgule. Curs de limbaj C

Iat| cteva exemple de apeluri de funcii: Copyright 2001. Toate drepturile sunt rezervate autorului.
p rintf (" Un ap el d e fu nc tie"); /* functia c u n u mele pr in tf() a re 1 a rgu men t, s ir ul "Un apel de functie" */ document n scop comercial este interzis|. Multiplicarea acestui printf("% d\ n",i); /* aceea si functie prin tf() are aici 2 arg um ente */

Sudenii participani la orice form| de nv||mnt superiorum ent o pot multiplica acest cos (x+y+1.61 80 34); /* functia m atem atica cos() are ca arg bugetar exp resie */ document functia g etch() nu are getch (); /* pentru uzul personal. a rgum ente */ Argumentele unei funcii pot fi constante, nume de variabile, sau alte persoane doritoare Sudenii participani la orice form| de nv||mnt cu plat| funcii sau expresii complexe. Din multiplica documentul numai contra cost i cu acordul scris al autorului. n acest pot acest motiv n loc de : scop m| putei contact| la:
z=x+y+1.618034; prin tf("%f\ n", co s(z));

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 se poate scrie: e-mail: antaltiberiu@pcnet.ro


prin tf("%f" ,cos(x +y+1 .618 034 ));

Observai mai sus c| funcia cu numele printf() are ca argument o alt| funcie, cos (). Multe funcii ntorc o valoare care poate fi folosit| n expresii complexe:
x=r *cos (fi); Conf. dr. ing. ANTAL Tiberiu a=a tan (x)*co s(z)*(x +y)/(z+3.2);

Alexandru Universitatea Tenhic| din Cluj-Napoca n exemplul anterior ata Maini Facultatea Construcii den() i cos () sunt funcii din biblioteca matematic| standard care Catedra de Mecanic| i Programare se folosesc n expresiile: i . Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului.

6.2 Definirea unei functii Multiplicarea acestui document n scop comercial este interzis|.

Funciile sunt echivalentul subprogramelor i procedurilor din alte limbaje de programare de nivel nalt. Acestea primesc ca da te de intrare un num|r de param etri, execut| apoi Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest o poriune de cod numit| corpul funct iei i n final ntorc o valoare de un anumit tip document pentruFunciile care nu ntorc valori se declar| de tipul void . O funcie trebu ie calculat| n corp. uzul personal. ntodeauna declarata ntr-un prototip de funct ie nainte de a fi apelat| - noiunea de 7 prototip va fi l|murit| n paragrafele care urmeaz|. Funcia grupeaza instruct iuni sub 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare un multiplica documentul numaiiei este cost i cu acordul scris al autorului. i produce pot sin gu r n um e . N um ele func contra folosit pentru apelarea funct iei n acest execuia putei contact| la: ini care fac parte din corpul funciei. Funcia din care se grupului de instruc scop m| apeleaz| o alt| funcie se numete funct ie apelanta , iar funcia care se apeleaz| se 7 numete funct ie apelata . Funct ia apelat|, de obicei, ntoarce o valoare n funcia 7 ANTAL Tiberiu Alexandru instruciunilor din corpul ei. Valoarea ntoars| n funcia apelant| calculat| pe baza tel.: 0040-264-530918 apelant| se poate ignora dac| aa dorete programatorul. Modalitatea de ntoarcere a e-mail:calculate de funcia apelat| n funcia apelant| este instruciunea return . Forma valorii antaltiberiu@pcnet.ro ei de scriere este: return expresie;. ex pre sie se va converti la tipul de valoare pe care l ntoarce funcia, dac| este cazul. Funcia ne permite s| execut|m acelai grup de instruciuni, cuprinse n corpul ei, din diferite por iuni ale unui program i pentru diferite valori ale variabilelor grupate n corpul funciei, folosind parametri. Din cele spuse rezult|
79

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca c| o funcieConstruciite prin: Facultatea se define de Maini - de Mecanic| i Programare Catedra nu m ele folosit pentru apelul funciei; - o lista de zero sau mai muli param etri care se transfer| funciei pentru Curs de limbaj C directe sau n vederea dirij|rii unor prelucr|ri; prelucr|ri

- un corp care conine instruciunile ce ndeplinesc sarcina pentru care funcia a Copyright 2001. |; fost creat Toate drepturile sunt rezervate autorului. - o valoare ntoarsa . 7 Multiplicarea acestui document n scop comercial este interzis|. Form a : 7 tip_ntors nume _functie(lista declarat iilor de p ara m etri) Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest { document pentru uzul personal. loca le declarat ii -

instruct iuni Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare } pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Un caz special este cnd funcia revine n programul apelant pentru c| aceasta s-a terminat - s-a ajuns la acolada } care specific| terminarea corpului funciei - f|r| a ntlni ANTAL Tiberiu Alexandru de valoare se ntoarce pentru acest caz? Este ciudat ca o o instruciune return . Ce fel tel.: ie, uneori s| ntoarc| o valoare, aleori nu. Conform definiiei, funcia trebuie s| func0040-264-530918 e-mail: antaltiberiu@pcnet.ro - cu sau f|r| return . Dac| return lipsete sau nu este ntorc| valoare n ambele cazuri ntlnit, asta nu nseamn| c| nu se ntorce o valoare, ci c| valoarea ntoars| nu este previzibil|, fiind "gunoi".

Conform standardului, tipul valorilor ntoarse de o funcie poate fi: aritmetic, structur| (struct), reuniune (union ), vid (void ), poantor (pointer); dar nu poate fi o funcie (function) sauANTAL Tiberiu Alexandru Conf. dr. ing. un tablou (array ).

6.2.1 Definirea unei functii - exemplu Copyright 2001. Toate drepturile sunt rezervate autorului.

Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini o funcie care trebuie s| afieze valoarea lui S| presupunem c| avem de scris Catedra de Mecanic| i Programare [a,b] cu pasul constant h . pentru un x care parcurge intervalul Curs de limbaj C Tipul valorii ntoarse de functia afisa re() -

1 int afisare(double a, double b, double h) Multiplicarea acestui document n scop comercial este interzis|. 2 { Funcia afisa re() are 3 parametri de 3 int linia; 4 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest tipul doub le cu numele: a , b , h 5 document pentru uzul personal. prin tf("-------------------------------\ n"); 6 prin tf("| nr.| x | sin(x )/x |\n"); 7 prin tf("-------------------------------\ n"); 8 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 9 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest for(linia=1; a<=b; a+=h,linia++) 10 scopif (a putei contact| la: m| != 0 .) 11 prin tf("|%2i. | %10 .7lg | %10 .7lg|\n ", linia , a, sin (a)/a ); 12 else 13 ANTAL Tiberiu 0; return Alexandru Valoare ntoars| de funcie 14 tel.: 0040-264-530918 15 e-mail: antaltiberiu@pcnet.ro prin tf("-------------------------------\ n"); 16 retu rn 1; 17 }

Valoare ntoars| de funcie

Pentru funcia cu numele afisa re() sunt specificate urm|toarele elemente: Tipul ntors: int, specificat n linia 1;
80

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Numele funct iei: afisare , Maini Facultatea Construcii de specificat n linia 1. El trebuie s| fie distinct de numele altor funcii, variabile, etc. pentru ca s| asigure identificarea unic| a funciei n program; Catedra de Mecanic| i Programare Parametri: double a, double b, double h , specificai n linia 1. Fiecare parametru trebuie Curs deun tip iC n um e ; s| aib| limbaj un

Valoarea ntoarsa: return 0, n linia 13 i return 1, n linia 16. Dac| funcia are specificat 7 Copyright 2001.ntoarse aceasta va fi ntoars| prin folosirea lui return . un tip al valorii Toate drepturile sunt rezervate autorului. Corpul funct iei: format din instruciunile cuprinse ntre acoladele {, } din liniile 2 i 17 . Multiplicarea acestui document n scop comercial este interzis|. Valorile de afiat sunt calculate n ciclul for din linia 9 . Datele sunt prezentate ntr-o form| tabelar|, capulla orice form| de at n liniilesuperior | n urma avansului cu acest Sudenii participani de tabel fiind afi nv||mnt 5-7. Dac bugetar pot multiplica pasul h parametrul a ia valoarea numeric| 0., atunci mp|rirea este compromis| i avem un caz document pentru uzul personal. de eroare. Dupa terminarea afisarii se revine din funcie ntorcnd valoarea numeric| de 7 -7 0 - terminare cu eroare. Altfel, dac| terminarea este normal|, revenirea din funcia Sudenii participani la orice numeric| nv||mnt cu plat| sau alte persoanecu succes. form| de de 1 - ea indicnd terminarea afi|rii doritoare afisa re() se face cu valoarea pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

6.3 Tiberiu Alexandru functie Apelul de ANTAL


Form a : 7

Apelul de funcie este n realitate un operator . El are ca operanzi doua exp resii s i are 7 tel.: 0040-264-530918 ca efect tran sferu l controlu lui pro gra m ulu i s i al argum entelor , dac| acestea exist|, la -

e-mail:a de cod cuprinsa n corpul funciei apelate. secven antaltiberiu@pcnet.ro 7

expresie_specificator_de_funct ie (expresie_lista _argum ente) 7

identific| funcia care este apelat|, fiind un nume de funcie sau o expresie care n urma evalu|rii specific| adresa unei funcii. Conf. dr. ing. 7 _a rgu mTiberiu Alexandru expresii, separate prin virgul|, care constituie ANTAL en te este o list| de expresie_lista Universitatea funciei apelate. Termenul de a r gu m ent se folosete pentru o expresie a argumentele Tenhic| din Cluj-Napoca Facultatea Construcii de Maini c|rei valoare este transferat| printr-un apel de funcie. Termenul de param etru este Catedra de Mecanic| i Programare - variabil| - ntr-o funcie sau ntr-o declaraie de folosit pentru un obiect de intrare Curs ie. Termenii de parametru actual i param etru formal sunt folosii uneori pentru func de limbaj C a face aceeai distincie. Copyright 2001. Toate drepturile sunt rezervate autorului.
expresie_specificator_de_funct ie -

6.3.1 Conversii aritmetice standard la apelul de Multiplicarea acestui document n scop comercial este interzis|. functparticipani la orice form| de nv||mnt superior bugetar pot multiplica acest -ii Sudenii

Pentru c| avem de a face cu un operator, tipu l con ver siilor rea lizate pentru operanzii document pentru uzul personal. -iei n apel, depinde de existent a prototipului funciei care alc|tuiesc argumentele funct unde sunt declarate tipurile corespunz|toare argumentelor funciei apelate. Dac| funct ia Sudenii participani declara iilor de tipuri de argumente, sau alte persoane doritoare are prototip , pe baza la orice form| de nv||mnt cu plat|compilatorul face verific|ri de tip, multiplicade tip i de num|r, ntre argumente acordul scrisn lipsa prototipului , se pot conversii documentul numai contra cost i cu i parametri. al autorului. n acest fac numai conversii aritmetice standard ale valorilor expresiilor din lista de argumente scop m| putei contact| la: n apelul de funcie. Aceste conversii se realizeaz | individual pentru fiecare argument n funcie de tipul argumentelor. O valoare de tip float se va converti automat n doub le ; una ANTAL Tiberiu Alexandru char sau short n int; una unsigned char sau unsigne d short n unsigned int . tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

6.3.2 Apelul unei functii - exemplu 81

Pentru facilitarea nelegerii, dezvolt n continuare problema propus| n paragraful 6.2.1. De aceast| dat| ns| funcia afisa re() are o nou| definiie. Versiunea anterioar| era incorect implementat| n C, fiind specific| celor care vin s| lucreze n C, din alte limbaje

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca de programare. F|r| a de Maini multe detalii, comparaia cu valoarea numeric| 0. era Facultatea Construcii intra n prea incorect|. Noua abordare folosete constanta DBL_EPSILON definit| n fiierul antet Catedra de Mecanic| i Programare floa t.h . DBL_EPSILON este cea mai mic| valoare de tip doub le pentru care avem Curs de limbaj C != 1.0 . 1.0+DB L_ EP SIL ON Aceast| linie i spune Copyright 2001. Toate drepturile suntcompilatorului cum rezervate autorului. /* FU NC TIE1.C */ lucreaz| funcia #include<stdio.h> #include<math.h> afisa re() Multiplicarea acestui document n scop comercial este interzis|. #include<float.h>

Sudenii participani la ou ble form| de nv||mnt superior bugetar int afisa re(d ou ble a, d orice b, d ou ble h); /* Prototip afisare () */ document pentru uzul personal.

pot multiplica acest

int main(void) { Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare doub le a,b,pas; pot prin tf("a = documentul numaiCompilatoruli cu c| aceste scris al autorului. n acest multiplica "); contra cost tie acordul expresii trebuie s| sca nf("% lf",contact| la: &a ); scop m| putei fie de tipul doub le din prototip i le prin tf("b = "); convertete automat dac| cumva nu sunt de sca nf("% lf", &b ); ANTALtf("pa s = Alexandru Tiberiu "); tipul corespunz|tor. prin tel.:sca nf("% lf", &p as); 0040-264-530918 if (!afis are (a,b,p as)) /* Ape e-mail: antaltiberiu@pcnet.ro lul functiei afisare () */ prin tf("Er oar e in calcule !\n \tTerm ina re fo rtata .\n"); else prin tf("Te rm ina re cu succes.\n "); return 0; } int afisare(double a, double b, double h) Conf. dr. ing. ANTAL Tiberiu Alexandru { Universitatea Tenhic| din Cluj-Napoca int linia;

Facultatea Construcii de Maini prin de Mecanic| i Programare Catedratf("-------------------------------\ n"); prin tf("| nr.| x | sin(x )/x |\n"); Curs de tf("-------------------------------\ n"); limbaj C prin
for(linia=1; a<=b; a+=h,linia++) Copyright 2001. Toate drepturile sunt rezervate autorului. if ((a >= D BL _E PS ILO N ) || (a <= -D BL _E PS ILO N )) prin tf("|%2i. | %10 .7lg | %10 .7lg|\n ", linia , a, sin (a)/a ); Multiplicarea acestui document n scop comercial este interzis|. else return 0;

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest prin tf("-------------------------------\ n"); document pentru uzul personal.
return 1; }

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Rezultate: scop 1 putei contact| la: a = m| a = -1
b = 2 pas = .1 ANTAL Tiberiu Alexandru ------------------------------tel.: 0040-264-530918| sin(x)/x | | nr.| x e-mail: antaltiberiu@pcnet.ro ------------------------------| 1. | 1 | 0.841471| | 2. | 1.1 | 0.8101885| | 3. | 1.2 | 0.7766992| | 4. | 1.3 | 0.7411986| b = 1 pas = .2 ------------------------------| nr.| x | sin(x)/x | ------------------------------| 1. | -1 | 0.841471| | 2. | -0.8 | 0.8966951| | 3. | -0.6 | 0.9410708| | 4. | -0.4 | 0.9735459|

82

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca | 5. | 1.4 | 0.7038927| Facultatea Construcii de Maini | 6. | 1.5 | 0.6649967| Catedra de Mecanic||i Programare | 7. | 1.6 0.6247335| Curs | | 8. de limbaj C 1.7 | 0.5833322| | 9. | 1.8 | 0.5410265| |10. | Copyright 2001. 1.9 | drepturile sunt Toate 0.4980527| ------------------------------Terminare cu succes.

| 5. | -0.2 | 0.9933467| Eroare in calcule! Terminare fortata.

rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la sunt eseniale pentru apelul unei funcii: Urm|toarele elemente orice form| de nv||mnt superior bugetar pot multiplica acest Prototipul: este definit personal. i informeaz| compilatorul despre modul n care lucreaz| document pentru uzul n linia 6 funcia. Astfel, funcia cu numele afisare , are trei argumente de tipul doub le i ntoarce o valoareparticipani .la orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii de tipul int Apelul: este documentul numai contra cost i cu acordul El are autorului. n acest pot multiplica poriunea afisare(a,b,pas) din linia 17. scris al ca efect transferul argumentelor contact| la: scop m| putei i al controlului execuiei programului la funcia cu numele afisa re() . Dac| funcia ar fi apelat| prin linia afisare(1,a,pas), primul argument ar fi de tipul int. Conform celor spuse la 6.3.1, n acest caz se face conversia automat| a lui 1 la tipul doub le , adic| la ANTAL Tiberiu Alexandru nu ar fi de tipul corect. 1.0 pentru c| acest parametru tel.: 0040-264-530918 Valoarea ntoarsa: valoarea ntoars| de funcie este folosit| pentru a decide care dintre 7 e-mail: antaltiberiu@pcnet.ro | pe ecran. Dac| terminarea se face cu eroare se revine mesajele de terminare se afieaz cu valoarea 0 , afisa re() este falsa pentru c| nu i-a dus treaba pn| la cap|t i se execut| 7 linia 18 . Altfel, valoarea ntoars| este 1 , iar afisa re() este adeva rata i se execut| linia 7 7 20 corespunz|toare lui "afisare nu este falsa ". Este posibil ca valoarea ntoars| de funcie 7 s| fie atribuit| unei variabile. Este corect deci scriem c=a fisa re(a ,b,pa s); . Nu este obligatoriu ca valoarea ntoars| s| fie folosit| n funcia apelant|. Este corect deci i un apel de forma afis are (a,b,p as); . n acest caz valoarea ntoars| se va pierde. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca duce la evitarea unor dezastre pentru c| pe baza Folosirea prototipului Rolul prototipului Facultatea Construcii de Maini poate face verific|rile de tip necesare la apelul funciei. lui compilatorul Catedra de Mecanic| | linia 6 nu se scrie n program, adic| prototipul lipsete, la un apel Dac i Programare Curs de limbaj C de forma afisare(1,a,pas) vor fi probleme serioase ntruct compilatorul presupune c| toi parametri sunt de tipul corect. Primul argument nu se convertete automat de la tipul int la doub le , 2001. Toate drepturile sunt n RAM autorului. Copyright iar pentru c| reprezentarearezervate i m|rimea pentru stocare a celor dou| tipuri difer| rezultatele obtinute vor fi dubioase. Multiplicarea acestui document n scop comercial este interzis|.

6.4 participani la orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii Prototipuri

Linia int apentru uzul personal. b , dou ble h ); se numete prototipul funciei afisa re() . document fisa re(d ou ble a , dou ble Compilatorul are nevoie de cte un prototip pentru fiecare funcie apelat| n program. Prototipul funciei poart| denumirea tehnic| de declarat ia de prototip a funct iei. Acesta Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare conine trei tipuri de informaii care trebuie cunoscute n funcia apelant|: nu m ele pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest funct iei apelate , tipul ntors, numa rul, ordinea s i tipul tuturor argumentelor funcie 7 scop m| Prezena prototipului anun| compilatorul de intenia noastr| de a apela funcia apelate. putei contact| la: afisa re() . Informaiile din prototip ajut| compilatorul s| genereze codul corect pentru ANTAL Tiberiu Alexandruefectuarea de verific|ri pe marginea apelului de funcie (de apelul de funcie i permit tel.: 0040-264-530918 exemplu, se poate verifica dac| a fost transferat num|rul corect de argumente). Dac| prototipul este omis, apelul e-mail: antaltiberiu@pcnet.rofunciei se va realiza folosind convenii standard. Lista parametrilor se folosete pentru verificarea corespondenei dintre argumentele funciei din apel si lista parameterilor din definiia funciei. -

83

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Valoarea ntoarsa: conform acestor convenii, o funcie f|r| prototip se 7 nFacultatea Construcii de Maini lipsa presupune c| ntoarce o valoare de tipul int. Probleme speciale apar de Catedra de prototipuluide Mecanic| i Programare exemplu la funciile matematice sin (), cos (), tan (), ex p() etc. care ntorc funcie ... limbaj C Curs de o valoare de tipul doub le . F|r| prototipuri, valorile ntoarse sunt

incorecte datorit| trunchierii la 2, la 4, eventual la 8 octei a valorii Copyright 2001. Toate drepturile sunt rezervate autorului. ntoarse. Argumentele funct iei: compilatorul va presupune c| num|rul corect de argumente a fost transferat funciei n apel i | scop comercial este interzis|. Multiplicarea acestui documentcn tipurile lor sunt corecte. Cnd am vorbit de rolul prototipului am dat un exemplu n care num|rul de argumente era corect, dar tipul primului participani la orice form| de nv||mnt superior bugetar potcu o opiune de Sudenii parametru nu. Majoritatea compilatoarele sunt echipate multiplica acest avertizare pentru uzul personal. document pe nivele. Dac| nivelul de avertizare este sc|zut (low level warning) compilatorul nu va afia avertismente pentru apelul funciilor f|r| prototip. Creterea acestui nivel va cauza apariia unor mesaje de avertisment pentru funciile f|r| prototip. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scrise de cei care au scris Prototipurile funciilor standard sunt scris al autorului. n acest Prototipurile scop m| putei contact| la: i sunt stocate n fis iere antet (header files ). Programatorul bibiloteca funciilor din trebuie doar s| foloseasc| directiva #include pentru fiierul antet biblioteca ANTAL Tiberiu Alexandru relevant. Numele acestuia este specificat ntotdeauna n documentaia standard compilatorului. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Sper c| ai observat c| prototipul unei funcii este prim a linie din Cum scriem definit ia ei urmata de caracterul ;. Astfel, dac| funcia s-a definit deja 7 prototipuri? este suficient s| copiem aceast| prim| linie din definiie. Numele argumentelor din prototip este ignorat complet de compilator, astfel n loc de int afisa re(d ou ble a , dou ble b , dou ble h); putem scrie int afisare(double, double, doub le); . Dac| aceste argumente au totui nume, acestea nu trebuie s| fie identice cu cele Conf. dr. ia funciei. Apare ntrebarea de ce s| mai includem aceste nume dac| tot sunt din defini ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din funcie are un rol, numele argumentelor pot furniza informaii ignorate? Pentru c| orice Cluj-Napoca semnificative despre func Maini Facultatea Construcii de ionarea ei. De exemplu, n loc de int a fisa re(d ou ble a , dou ble b, dou ble h Mecanic| i Programare Catedra de ); a fi putut scrie un prototip de forma int a fisa re(d ou ble in cep ut, d ou ble sfirs it, dou ble p as); care ar fi l|murit pe deplin semnificaia celor trei argumente. Curs de limbaj C
Rolul lui ; n 2001. Toate drepturile sunt rezervate autorului. Copyright identice, de unde va ti compilatorul care este prototipul i care este prototip

Pentru c| prototipul i prima linie din definiia funciei sunt aproape

definiia? Hot|rrea se ia pe baza caracterului care urmeaz| dup| Multiplicarea acestui document n scop comercial este interzis|. caracterul "{"arata ca paranteza rotund| nchis|, ") ", n felul urmator: 7 7 7 este vorba de o definitie, iar caracterul ";" de un prototip. Din acest motiv ad|ugarea unui Sudenii participani lalinie aform| funcii conducesuperior bugetar |. Dac| mai nti se caracter ; dup| prima orice unei de nv||mnt la o eroare fatal pot multiplica acest ntlnete compilatorul crede c| document ;pentru uzul personal. a fost un prototip. Dup| prototip vine o acolad| "{", adic| se ncepe un bloc, de cine anume va ine acest bloc? Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Exemplele care contra cost i cu cteva prototipuri. n limbajul C, spre pot multiplica documentul numai urmeaz| prezint| acordul scris al autorului. n acest Exemple de deosebire de limbajul Pascal, nu exist| noiunea de procedur|. Cuvntul scop m| prototipuri putei contact| la: cheie void trebuie folosit explicit, ca tip ntors de o funcie, pentru a defini un fel de "funcie echivalent|" cu o procedur|, adic| una care nu ANTAL Tiberiu Alexandru ntoarce o valoare. void folosit n lista argumentelor specific| o funcie f|r| argumente. tel.: 0040-264-530918 Este bine ca la specificarea unui prototip s| se scrie un scurt comentariu care descrie rolul e-mail: antaltiberiu@pcnet.ro funciei. Iat| cteva exemple:
/* Citeste un intreg de la tastatura, nu are argumente, intoarce o va loare de tipu l int */ 84

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int ci teste _in t(void ); Facultatea Construcii de Maini Catedra de Mecanic|sonor - beep, /* Emite un semnal i Programare Curs de limbaj C nu are argumente, nu intoa rce o valoa re */ void u n_ beep(v oid );

Copyright 2001. Toate drepturile sunt rezervate autorului.


/* Ca lculea za m edia aritm etica a trei nu me re intre gi, Multiplicareaen te de tip in t, trei ar gu m acestui document n scop comercial este interzis|. intoarce un tip doub le */ doub le m ed ie_ ar(in t, int, int);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document un numar personal. /* Citeste pentru uzulreal de a tastatura,
verificarea argumentelor este dezactivata, intoarce un tip int */ Sudenii participani la orice form| de nv||mnt cites te_rea l();

cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| prototip merit|la: fie discutat. Forma de scriere folosit| produce dezactivarea Ultimul putei contact| s| verific|rilor la nivelul argumentelor. Ceea ce nu nseamna c| nu se transfer| argumente. 7 ANTAL apel funciei cite ste_rea l() i s-ar putea transfera unul sau mai multe argumente n orice Tiberiu Alexandru tel.: 0040-264-530918 de avertisment s| fie afiat. f|r| ca m|car un mesaj e-mail: antaltiberiu@pcnet.ro

6.5 Parametrii functiilor -

Argum entele sunt nume ale valorilor care se transfera funct iei printr-un apel . 7 -

Parametrii sunt obiectele de intrare pe care funcia le primete efectiv i le prelucreaz| n corpul ei. n declaraia de prototip ntre parantezele rotunde este specificat| lista parametrilor ANTAL Numele parametrilor care se folosesc n corpul funciei se mai Conf. dr. ing. funciei. Tiberiu Alexandru numesc i valorile transferate funciei. Numele acestora poate fi acelai sau diferit cu cele Universitatea Tenhic| din Cluj-Napoca din declaraConstrucii de Maini lista parametrilor exist| cel puin un parametru, lista Facultatea ia de prototip. Dac| n se poate termina cu o virgul| urmat| de trei puncte, adic| n ",...". Aceast| notaie specific| Catedra de Mecanic| i Programare o funcie cu num|r variabil de argumente. n apel o astfel de funcie trebuie s| aib| cel Curs attea argumente ci parametri sunt naintea virgulei. Ordinea i tipul parametrilor puin de limbaj C trebuie s| fie la fel cu cele din declaraia funciei dac| aceasta exist|. Tipurile Copyright 2001. Toate drepturile sunt rezervate autorului. s| devin| compatibile cu tipul argumentelor, dup| conversii aritmetice standard, trebuie corespunz|tor al parametrilor. Multiplicarea acestui document n scop comercial este interzis|.

6.6 Ordinea evaluarii argumentelor 7

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru | avem urm|toarea linie de cod: printf(" . . . ", sqr(5 .0), cos(7 .9));. Poate S| presupunem c uzul personal. v| pare surprinz|tor, dar ordinea n care cele dou| funcii sunt apelate este nedefinit| din Sudeniide vedere al standardului ANSI C. Unele compilatoarealte persoane doritoare punctul participani la orice form| de nv||mnt cu plat| sau vor apela sqr () mai nti, iar altele cos () documentul numai contra cost i cu acordul de mai sus nu este important| pot multiplica i ambele variante sunt corecte. Pentru cazul scris al autorului. n acest ordinea putei contact| la: scop m| evalu|rii. n cazul n care s-ar afia ceva din interiorul fiec|rei funcii, rezultatul ntors la fiecare apel ar fi corect, ordinea evalu|rii argumentelor nefiind nsa definit|. 7 Totui, nainte deAlexandru funcia apelat|, toate argumentele vor fi evaluate incluznd intrarea n ANTAL Tiberiu aici i toate efectele secundare. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

6.7 Transferul prin valoare


85

C este un limbaj unde n locul fiec|rui argument de transferat unei funcii se transfer| o copie a valorii argumentului. Acest tip de transfer de argumente n care funcia primete

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca o copie a valorilor originale, protejate astfel contra modific|rilor, poart| denumirea de Facultatea Construcii de Maini transfer prin valoare . Funcia poate modifica valorile parametrilor ei, care fiind copii ale Catedra de Mecanic| i Programare argumentelor, nu duc la modificarea valorilor argumentelor. Uneori este un avantaj, Curs de limbaj C alteori un dezavantaj. Pentru c| o funcie poate ntoarce o singur| valoare, de exemplu n

cazul unei funcii cite ste_d oi_ intregi() nu se pot ntoarce valorile celor doi ntregi folosind Copyrightfuncie. Va fi drepturile|sunt rezervate autorului. o singur| 2001. Toate necesar s scriem o func ie cite ste_intr eg() care va fi apelat| de dou| ori pentru a citi cei doi ntregi. O metod| de eliminare a acestui inconvenient este variabila externa. nainte de a n scop acestea este interzis|. Multiplicarea acestui document trece lacomercialdoresc s| menionez c| C suport| i o 7 metod| de tran sfer pr in refe rint a . Aici parametrul nu este o copie a valorii variabilei -7 transferate, ci a adresei la care este nv||mnt superior bugetarAi v|zut deja acest Sudenii participani la orice form| de stocat| variabila n RAM. pot multiplica acest mecanism pentru uzul personal. nf() care este capabil| s| altereze valorile parametrilor. document n aciune la funcia sca Totul este ns| legat de operatorul & care urmeaz| s| fie discutat la tipul de dat| structurat poantor. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

6.8 Variabile externe sau variabile ANTAL Tiberiu Alexandru globale tel.: 0040-264-530918

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Programele C sunt formate din obiecte ex terne. Acestea sunt variabile sau funcii. e-mail: antaltiberiu@pcnet.ro Denumirea de "externe" se folosete pentru a le diferenia de obi ecte le denumite interne. Acestea sunt argumentele funciilor i variabilele declarate n interiorul funciilor - dac| v| amintii de paragraful despre definiia funciilor, n corpul acestora ap|rea o linie de forma: declarat ii loca le . Variabilele externe sunt definite n afara funciilor. Din acest motiv ele nu in de nici o funcie, fiind la dispoziia tuturor funciilor programului. n standard aceste variabile sunt descrise ca avnd legare externa pentru c| toate 7 Conf. dr. ing.numele acestora, chiar i din func ii care au fost compilate separat, identific| referinele la ANTAL Tiberiu Alexandru Universitateanumele respective (este posibil ca un acelai nume s| identifice obiecte obiectele cu Tenhic| din Cluj-Napoca Facultatea Se pot defini i Maini externe care s| fie vizibile numai n fiierul surs| n distincte). Construcii de variabile care au fost Mecanic|Felul n care se realizeaz| definiia lor va fi discutat ntr-un paragraf Catedra de definite. i Programare urm| de limbaj durate de existen|. n limbajul C funciile sunt ntotdeauna externe. Spre Curs tor, numit C deosebire de limbajul Pascal, nu este posibil s| se defineasc| n interiorul unei funcii o alt| funcie. Pentru c| variabilele externe sunt global accesibile, adic| pot fi utilizate din Copyright 2001. Toate drepturile sunt rezervate autorului. ntregul program, ele permit implementarea unei strategii de comunicaie ntre funcii care ar trebui s| ntoarc| mai mult de o valoare. n exemplul care urmeaz| o astfel de Multiplicarea acestui _rea li() . Aceasta stocheaz| datele citite n dou| variabile globale, funcie este cite ste_2 document n scop comercial este interzis|. deim par tit i impartitor , de tipul float. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest /* EX TER pentru uzul personal. document N.C */
#include<conio.h> #include<stdio.h> Sudenii participani #include<float.h>

la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest /*Prototipu rile functiilor din prog ram */ scop m| putei contact| la:
void cite ste_ 2_ rea li(void ); float calcule aza _ci tul(floa t deim pa rtit, float im pa rtitor); ANTAL Tiberiu Alexandru void a fiseaza _ci tul(floa t cit);

tel.: 0040-264-530918 c on st flo at IN F IN IT = F LT _M A X ; e-mail: antaltiberiu@pcnet.ro

floa t de im pa rtit, im pa rtito r; /* dou a var iabile extern e - globale */ /* functia m ain() - punctu l de intrare in p rogram */ int main(void) 86

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca { Facultatea t cit; /* o variab ila locala */ Construcii de Maini floa Catedra de Mecanic| i Programare do { Curs de limbaj C cite ste_2 _rea li(); cit=ca lculeaz a_ citu l(deim pa rtit,im pa rtitor); afis eaza_ citu l(cit); Copyright 2001. Toate != 'i'); drepturile sunt rezervate autorului. } wh ile (ge tch()

Multiplicarea acestui document n scop comercial este interzis|. return 0;


} /* sfarsitul fun ctiei main () */

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. /* definitiile functiilor */
void citeste_2 _rea li() { Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare prin tf("Ba ga 2 nu m ere, deim pa rtit si im pa rtitor: pot multiplica documentul numai contra cost i cu acordul"); scris al autorului. n acest sca nf("% f %f",&d eim pa rtit,& im pa rtitor); scop m| putei contact| la: } float calculeaza_citul(float deimpa rtit, float impartitor) ANTAL Tiberiu Alexandru { tel.: 0040-264-530918 == 0.0F) if (impartitor e-mail: antaltiberiu@pcnet.ro retu rn(IN FIN IT); else retu rn(d eim pa rtit/im pa rtitor); } void a fiseaza _ci tul(floa t cit) { if ing. ANTAL Tiberiu Alexandru Conf. dr. (cit == INFINIT) prin tf("Citu este n ed efin Universitatea Tenhic| din lCluj-Napoca it\n "); else Facultatea Construcii de Maini f\n ",cit); prin tf("Citu l este % Catedra de Mecanic| i Programare }

Curs de limbaj C Rezultate: Baga 2 numere, deimpartit si impartitor: 1 2 Copyright 2001. Toate drepturile sunt rezervate autorului.

Citul este 0.500000 Baga 2 numere, deimpartit si impartitor: -1 34.57 Multiplicarea acestui document n scop comercial este interzis|. Citul este -0.028927 Baga 2 numere, deimpartit si impartitor: 1 0 Citul este nedefinit Sudenii participani la orice form| de nv||mnt superior bugetar pot Aici s-a introdus i pentru terminare

multiplica acest

document pentru uzul personal.

Este bine ca prototipurile funciilor s| se scrie la nceputul programului. ncepnd cu acea Sudenii participani la|orice form| de lui, funciile cu plat| sau alte persoane doritoare linie de program i pn la terminarea nv||mnt pot fi apelate prin numele lor oriunde pot multiplica pot fi f|cute verific|contra cost i cu acordul scris al autorului. n acest n program i documentul numai ri de tip pe marginea fiec|rui apel. scop m| putei contact| la: Limbajul C permite ca variabilele externe i funciile s| fie organizate n mai multe fiiere surs| C Tiberiu care se pot ANTAL distincteAlexandru compila mpreun| sau separat pentru a crea un program executabil. Dac| dorii, unele funcii pot fi stocate n biblioteci, caz n care pot fi refolosite tel.: 0040-264-530918 n mai multe programe. Problema care se pune este cum se va reorganiza un program e-mail: antaltiberiu@pcnet.ro existent n unul cu mai multe fiiere? O modalitate de reorganizare a programului anterior n 5 fiiere surs| C este:
1 /* CIT.H */ 87

2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca #include<float.h> Facultatea Construcii de Maini Catedra de Mecanic| i Programare void cite ste_ 2_ rea li(void ); Curs de limbaj C

float calcule aza _ci tul(floa t deim pa rtit, float im pa rtitor); void a fiseaza _ci tul(floa t cit);

Copyright 2001. Toate drepturile sunt rezervate autorului.

con st flo at IN FIN IT = FL T_ M AX ; /* definitia con stantei IN FIN IT */ Multiplicarea acestui document n scop comercial este interzis|. float deimpartit, impartitor; /* definitiile variab ilelor */ /* M AIN .C */ Sudenii participani la orice form| #include<conio.h> document "cit.h" uzul personal. #include pentru

de nv||mnt superior bugetar pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int main(void) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest { scop m| putei contact| la: ila locala */ floa t cit; /* o variab do { cite ste_2 ANTAL Tiberiu Alexandru _rea li(); tel.: 0040-264-530918cit=ca lculeaz a_ citu l(deim pa rtit,im pa rtitor); afis eaza_ e-mail: antaltiberiu@pcnet.ro citu l(cit); } wh ile (ge tch() != 'i');
return 0; } /* CIT2R EA L.C */ #include<stdio.h> Conf. dr. ing. ANTAL Tiberiu Alexandru ex tern floa t de im pa rtit, im pa rtito r; /*declara tiile variabilelor extern e */

Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini void citeste_2 _rea li() Catedra de Mecanic| i Programare { Curs de limbaj C ga 2 nu m ere, deim pa rtit prin tf("Ba

Copyright 2001. Toate drepturile sunt rezervate autorului. }

si im pa rtitor: "); sca nf("% f %f",&d eim pa rtit,& im pa rtitor);

/* CA LCIT .C */ Multiplicareaflo at IN FIN IT; /* declaracomercial este interzis|. */ ex tern con st acestui document n scop tia constan tei INFIN IT

Sudenii participani la orice deimpa rtit, float impartitor) bugetar pot multiplica acest float calculeaza_citul(float form| de nv||mnt superior document pentru uzul personal. {
if (impartitor == 0.0F) retu rn(IN FIN form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la oriceIT); else pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteiretu rn(d eim pa rtit/im pa rtitor); contact| la: } /* AF ICIT.C */ ANTAL Tiberiu Alexandru #include<stdio.h> tel.: 0040-264-530918 ex tern con st flo at IN FIN IT; /* declara tia constan tei INFIN IT */ e-mail: antaltiberiu@pcnet.ro void a fiseaza _ci tul(floa t cit) { if (cit == INFINIT) 88

8 9 10 11 }

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca prin tf("Citu l este n Facultatea Construcii de Maini ed efin it\n "); else Mecanic| i Programare Catedra de prin Curs de limbaj C tf("Citu l este % f\n ",cit);

Copyright 2001. Toate drepturile sunt rezervate autorului. Cele 5 fiiere surs| sunt: CIT.H , M AIN .C , CIT2REA L.C , CA LC IT.C i AFIC IT.C . Cele care au extensia C pot fi compilate independent unul de cel|lat. Fiierul CIT.H este antetul n Multiplicarea acestuidocument n scop icomercial este interzis|. care am stocat defini iile constantelor variabilelor externe, mpreun| cu prototipurile funciilor din program. Pentru nelegerea criteriilor folosite la reorganizarea programului Sudeniicunoscut| nola orice form| de nv||mnt superior bugetar pot multiplica acest trebuie participani iunea de vizibilitate a variabilelor C. document pentru uzul personal. La nceputul cursului am prezentat succint preprocesorul i directiva #include . Forma folosit| n linia 3 din M AIN.C este o variant| specialcu plat| sau alte persoaneconinutului Sudenii participani la orice form| de nv||mnt | care permite nc|rcarea doritoare fiierului CIT.H , din directorul curent n programul surs| Cscris al autorului. n |muriri pot multiplica documentul numai contra cost i cu acordul unde acesta apare. Lacest suplimentare vor fi datela: capitolul directivelor de procesare. scop m| putei contact| n ANTAL Tiberiu Alexandru 6.8.1 Vizibilitatea (scope)

tel.:declararea unei variabile se specific| automat i vizibilitatea ei. Aceasta depinde de La 0040-264-530918 e-mail: care s-a f|cut declaraia variabilei n program i deter m ina port iunile de program locul n antaltiberiu@pcnet.ro 7 din care acea varia bila poa te fi folosita , adic| este vizibil|. Un nume este vizibil, deci 7 7 poate fi utilizat numai n poriunile de program care fac parte din zona de vizibilitate. Vizibilitatea unui nume poate fi limitat| pentru a crete restriciile la nivelul unui fiier, al unei funcii, al unui bloc, sau al unui prototip de funcie n care acesta figureaz|. Urm|toarele categorii de vizibilit|i sunt posibile: - bloc: un bloc este o poriune de program cuprins| ntre acolade { ... }. n C se mai Conf. dr. ing. te i vizibilita te locala ntruct ea corespunde corpului funciei n care s-a nume ANTAL Tiberiu Alexandru 7 Universitateadeclaraia. O Cluj-Napoca f|cut Tenhic| din astfel de variabil| este vizibil| din locul n care s-a f|cut Facultatea Construcii de Maini declaraia ei i pn| la acolada de nchidere a blocului "} " n care s-a realizat Catedra de Mecanic| i Programare declaraia; Curs de parametri de funct ie : au aceeai vizibilitate cu variabilele declarate n interiorul - limbaj C funciilor si astfel corespund vizibilit|ii de tipul bloc; - prototip de funct ie : variabilele declarate n interiorul Copyright 2001. Toate drepturile sunt rezervate autorului. unui prototip de funcie au o vizibilitate special|. Aceasta ncepe din punctul corespunz|tor declaraiei parametrului i ine pn la paranteza rotund| ") " care nchide lista parametrilor Multiplicarea acestuidocument|n scop comercial este interzis|. funciei; - fis ier: variabilele cu aceast| vizibilitate sunt declarate n afara tuturor blocurilor. Sudenii participani la orice form| ncepnd cu punctul n bugetar pot multiplica acest Aceste nume sunt vizibile, de nv||mnt superior care s-au declarat, pn| la document pentru uzul personal. | al declaraiei. terminarea fiierului surs Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Vizibilitatea unei variabile scop m| putei contact| la: externe sau a unei funcii este cea de tip fiier. Dac| o variabil| extern| este referit| n program nainte de a fi definit| ntr-un program surs| distinct sau n cel curent este obligatorie folosirea cuvntului cheie ex tern . Legat de variabilele ANTAL Tiberiu Alexandru externe, se uziteaz| doi termeni: declaraia i definiia. O declarat ie este un anun legat tel.: 0040-264-530918 de propriet|ile variabilei - n principal ale tipului acesteia. O definit ie adaug| anunului e-mail: antaltiberiu@pcnet.ro RAM pentru stocarea acelei variabile. Pentru programul anterior i alocarea spaiului n anterior, liniile 8 i 9 ale fiierului surs| CIT.H sunt definiii pentru constanta INF INIT i pentru variabilele deim par tit i impa rtitor . Tot aici se face i alocarea spaiului pentru stocarea acestor obiecte n RAM. Liniile care conin extern const float INFINIT; i extern float de im pa rtit, im pa rtito r; sunt numai declaraii ale constantei i variabilelor respective

6.8.2 Declaratia si definitia - -

89

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca - stocarea lor n RAM s-a fMaini ca urmare a definiiilor lor. Este obligatoriu s| existe Facultatea Construcii de |cut deja o definiie aMecanic| i Programarentr-unul din fiierele surs| ale programului. Toate Catedra de unei variabile externe celelalte fiiere pot conine numai declaraii externe pentru accesul la aceasta. Curs de limbaj C

n cazul funciilor, problema este diferit|. Distincia ntre o declaraie de variabil| extern| Copyright2001. Toate drepturile | se face prin autorului.sau absena cuvntului cheie i o defini ie de variabil| extern sunt rezervate prezena extern . La funcii, definiia este format| din antetul funciei - prima linie a acesteia mpreun| cu corpul ei. Declaraia funciei se face prin prototipul ei. Multiplicarea acestui document n scop comercial este interzis|. Dup| cum am mai spus - vezi 6.6, o declaraie extern| este singura variant| posibil| n C pentru funcii. Din acest motiv, cuvntul cheie orice form| deopional n superioria de prototip. Astfel acest Sudenii participani la extern este nv||mnt declara bugetar pot multiplica void cites te_2_pentru uzul i ex tern void citeste_2 _re ali(void ); sunt acelai lucru. document rea li(void ); personal.

6.9 Stiva

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Stivam| putei contact| la: scop este o regiune din RAM gestionat| dup| politica Ultimul Introdus este Primul Extras (L ast I n F irst O ut sau prescurtat, LIFO ). Imaginai-v| o stiv| de c|ri sub forma: Conceptual, stiva limbajului C este asemenea acestor c|ri. Introducerea un ei ca rt i noi 7 ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Figura 4 - O stiv| (de c|ri) Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n stiv| se face numai la nivelul c|rii celei mai de sus - cea pus| ultima n stiv|, aceasta Facultatea Construcii de Maini fiind chiar vrful stivei. Altfel apare pericolul ca nteaga stiv| s| se pr|bueasc|. Catedra de Mecanic|-irespect| aceeai procedur|: numai cartea cea mai de sus va putea Programare Extragerea unei ca rt i 7 Curs de |r| s| apar| pericolul pr|buirii stivei. Conform celor spuse, unei stive i se poate limbaj C fi luat| f ad|uga un articol nou numai la vrful acesteia i i se poate extrage un articol numai de la Copyright 2001. Toate drepturile permite sa se vada autorul si titlul accesul la ele este vrful ei. Daca asezarea cartilor sunt rezervate autorului. 7 7 7 7 simplu, atta timp ct introducerea i extragerea c|rilor se face sub controlul riguros al procedurilor acestui document n scop comercial s| extragem Multiplicareaprezentate. De exemplu, dac| dorim este interzis|.cea de a treia carte de la vrful stivei, se extrag pe rnd primele trei c|ri, apoi se pun la loc ultimele dou|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

6.9.1 Stiva si limbajul C Limbajul C utilizeaz| o zona de RAM 7

cu politica menionat| den um ita chiar stiva 7 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pentru: pot multiplica documentul numai contra cost iale acordulsunt al autorului. n acest - stocarea valorilor v aria bilelor loc cu (care scris declarate n interiorul scop m| putei contact| la: funciilor); - stocare a v alor ilor tra nsfera te prin mecanismul parametrilor funciei apelate; - Tiberiu adresei de ANTAL stocareaAlexandru revenire n funcia apelant|. tel.: 0040-264-530918 Operaia de introducere pe stiv| se numete n englez| push , iar cea de extragere pop . e-mail: antaltiberiu@pcnet.ro Cnd o valoare de variabil| se transfer| ca parametru al unei funcii, o copie a valorii respective se introduce pe stiv|. Funcia extrage de pe stiv| aceast| valoare copie pe post de parametru. Pentru c| funcia poate accesa numai valoarea parametrului, spaiul folosit pentru stocarea originalului fiind alocat ntr-un alt bloc de funcie, valoarea original| nu se poate modifica n corpul funciei. Operaia de rezervare a unei poriuni din RAM pentru
90

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca stocarea unui obiect se numete alocare . Dac| funcia are declarate variabile locale, Facultatea Construcii de Maini alocarea de Mecanic| i Programare face tot pe stiv|. Funcia are responsabilitatea ca la Catedra spaiului pentru acestea se terminarea ei s| elibereze automat spaiul alocat acestor variabile. La revenire n funcia Curs de|limbajia apelat| are sarcina de a distruge i spaiul alocat pe stiv| pentru apelant , func C

parametrii ei. Cum tie ns| C unde anume s| se revin| n funcia apelant|? La apelul Copyright trebuie s| rein| unde anume era nainte de intrarea n funcia apelat|. n acest funciei, C 2001. Toate drepturile sunt rezervate autorului. scop, el va stoca tot pe stiv| adresa locaiei curente care va fi adresa de revenire. Multiplicarea acestui document n scop comercial este interzis|. Mecanismul transferului de parametri prin stiv| se poate descrie astfel: funcia apelant| introduce pe stiv| parametrii n ordinea lor invers| de apariie Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest n pentru uzul personal. documentlista de parametri [pu sh(p ara m etri)] ; se stocheaz| pe stiv| adresa de revenire n funcia apelant|, apoi se apeleaz| funcia; Sudenii participani la | i citete parametrii de pe stiv|; sau alte persoane doritoare funcia apelat orice form| de nv||mnt cu plat| pot multiplicadocumentul numai contra cost i cu acordul scris al autorului. loca le)] ; func ia apelat| introduce pe stiv| variabilele locale [pu sh(v aria bile n acest scop m| putei contact| la:ia apelat| extrage variabilele locale [pop (variab ile loca le)] i la revenire, func sare napoi la funcia apelant| (pe baza adresei care a fost stocat| pe stiv| la ); ANTAL Tiberiu Alexandru funcia apelant| extrage parametrii de pe stiv| [pop (par am etri)] ; valoarea ntoars| de funcia apelat| este tratat| - dac| este cazul. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

6.9.2 Exemplu de lucru cu stiva


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /* AR IA.C */ #include<stdio.h> doub le ar ia(d ou ble, d ou ble);

Conf. dr. ing. ANTAL Tiberiu Alexandru int main(void) Universitatea Tenhic| din Cluj-Napoca { Facultatea Construcii de Maini double h,r,a; Catedra de Mecanic| i Programare prin tf("ina Curs de limbaj C ltim ea cilindru lui = ");
sca nf("% lf", &h ); prin tf("raz a cilin dru lui = "); Copyright nf("% lf", &r );drepturile sunt sca 2001. Toate

rezervate autorului.

a=a ria(r,h); Multiplicarea acestui document n scop comercial este interzis|. prin tf("ari a cilin dru lui e ste: % lg\n ",a);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest return 0; } document pentru uzul personal.
double aria(double raza, double inaltimea) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest double pi=3.1415926535;

scop m| putei contact| la:


}

return pi*raza*raza*inaltimea;

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Rezultate: e-mail: antaltiberiu@pcnet.ro inaltimea cilindrului = 2
raza cilindrului = 3 aria cilindului este: 56.5487

Programul i ncepe execuia cu funcia m ain (). Pentru c| r ,


91

i a sunt variabile locale,

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca se aloc| spaiul pentru de Maini stiv|. Cnd se apeleaz| aria() , cu argumentele r i h , Facultatea Construcii acestea pe valorile acestor variabile se copiaz| pe stiv|. Se apeleaz| funcia. Argumentul r se afl| pe Catedra de Mecanic| i Programare poziia parametrului raza , iar argumentul h se afl| pe poziia parametrului inaltimea . Din Curs de limbaj C i citete valorile parametrilor de pe stiv|, aria() va stoca valoarea lui acest motiv, cnd

n raza i cea a lui h n inaltimea . Pentru c| funcia are o variabil| local| cu numele pi Copyright 2001. Toate drepturile suntrezervate autorului. valoarea "3.1415926535". Se se aloc| spaiul pe stiv| pentru ea i se iniializeaz| cu calculeaz| valoarea ariei cu expresia din linia 25 i se revine n funcia apelant| (m ain ()), datorit| lui acestui document n scop comercial este interzis|. Multiplicareareturn care produce terminarea funciei apelate i revenirea din ea. Compilatoarele au strategii diferite de ntoarcere a valorilor la revenirea din funcii. Unele ntorc valoarea pe stiv|,orice form| detri. nainte de terminarea funcieimultiplica acest Sudenii participani la altele n regi nv||mnt superior bugetar pot apelate, ea este responsabil| pentru "distrugerea" lui pi prin extragerea lui de pe stiv|. La revenirea n document pentru uzul personal. m ain () , cei doi parametri raza i inaltimea sunt distrui i ei. Valoarea ntoars| este salvat| ntr-un registru, de aici copiindu-se n variabila a . Dup| afiarea rezultatului pe Sudenii participani la0orice form| de nv||mnt cu iei m ain () alte persoane doritoare ecran urmeaz| return . nainte de terminarea func plat| sau se distruge spaiul alocat pot stiv| pentru r , h i a .numai contra cost i se acordul scris al autorului.pentru a fi pe multiplica documentul Apoi valoarea "0 " cu ncarc| ntr-un registru n acest scop m| putei contact|de operare. transferat| sistemului la:
r

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

6.10 Organizarea memoriei pentru programele n executie -

Cnd un program este n curs de execuie memoria alocat| lui este divizat| n mai multe zone de RAM numite i segmente: Segmentul de cod (CODE SEGMENT): aceasta este poriunea de RAM n care sunt stocate Conf. dr. ing. ANTAL Tiberiu Alexandru iilor din programele C - m ain () de exemplu instruciunile main| corespunz|toare func Universitatea Tenhic| din Cluj-Napoca printf() . Prin definiie, zona segmentului de cod sau cele extrase din biblioteci- de exemplu Facultatea Construcii de Maini pe timpul execuiei programului, altfel ar fi posibil s| este protejat| contra modific|rilor scriem un program careProgramare pe sine. Catedra de Mecanic| i se modific| Stiva(STACK): o por Curs de limbaj C iune de RAM n care sunt stocate toate variabilele locale. Coninutul acestei zone i dimensiunea ei se modific| pe timpul execuiei programului, depinznd de apelurile i2001. Toate drepturileiile care alc|tuiesc programul. n unele limbaje, stiva are Copyright de revenirile din func sunt rezervate autorului. o dimensiune maxim| fix| pe timpul execuiei unui program. Vor aparea erori ca urmare 7 a ncerc|rii de a extrage articole de pe stiva vid| sau ca urmare a introducerii n stiva plin| Multiplicarea acestui document n scop comercialpentru care nu mai este loc. Ultimul caz (datorit| modului de implementare) a unui articol este interzis|. este mai des ntlnit i se numete depa s ire de stiva (stack overflow ) avnd ca efect 77 Sudenii participani la orice form| de nv||mntzonei de stiv|, rezultnd erori a acest suprascrierea unor locaii de memorie adiacente superior bugetar pot multiplica c|ror document este dificil|. personal. depanare pentru uzul Segmentul de date (DATA SEGMENT): este o zon| de RAM n care se stocheaz| variabilele globale. Din moment orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la ce variabilele globale sunt ntotdeauna stocate acolo i au o dimensiune fix|, spre deosebire de celecost i cu acordul scris|al i se distrug automat, pot multiplica documentul numai contra locale care se creeaz autorului. n acest dimensiunea total| a segmentului de date nu se schimb| pe timpul execuiei programului. scop m| putei contact| la: HEAP-ul: este o zon| de RAM a c|rui dimensiune poate varia n timpul execuie programului. n limbajul C, dimensiunea lui este controlat| prin patru funcii de alocare ANTAL|Tiberiu Alexandru , calloc() , rea lloc() i free() . Pe heap, poriuni de memorie dinamic a memoriei m alloc() tel.: 0040-264-530918 alocate i eliberate ntr-o ordine arbitrar|, iar ablonul de alocare denumite blocuri sunt e-mail: antaltiberiu@pcnet.ro vor fi cunoscute numai n timpul execuiei programului. mpreun| cu dimensiunea lui Funciile pentru manipularea heap-ului vor fi discutate ntr-un capitol urm|tor.

92

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

6.11 Durata de existenta sau -7 persistentdrepturile sunt rezervate autorului. -a (storage class) Copyright 2001. Toate variabilelor n scop comercial este interzis|. Multiplicarea acestui document

n funcie de segmentul n care sunt stocate, avem va riab ile glo ba le , loca le i registru . Despre cele registru nu am discutat pn| acum explicit, ns| dac| v| amitii, n capitolul Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest operatorilor am folosit uneori exprimarea "valoarea expresiei se stocheaz| ntr-un document n limbajul C exist| cuvinte cheie prin care se poate controla segmentul n care registru". pentru uzul personal. se aloc| spaiul pentru stocarea variabilelor. n majoritatea c|rilor de C acest subiect este Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare tratat sub denumirea de durate de existent a . -7 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru pentru stocarea variabilelor locale este alocat pe stiv|. Cnd Am spus c| implicit, spaiul func0040-264-530918 tel.: ia este apelat|, variabilele locale sunt stocate pe stiv|. La terminarea funciei, spaiul folosit pentru aceste variabile este eliberat - se mai zice c| stiva este desc|rcat|. Deoarece e-mail: antaltiberiu@pcnet.ro procedurile de alocare i eliberare a spaiului din RAM pentru aceste variabile decurg automat, durata lor de existena (modul n care compilatorul aloc| spaiul de stocare n RAM pentru variabile) se ntreine automat, de unde si numele de au to . Folosirea cuvntului cheie au to este deci inutil| dac|, de exemplu, n ARIA.C modific|m linia 8 de la doub le h,r,a; la auto double h,r,a; efectul va fi c| aceste variabile vor deveni automate cum de altfel erau deja. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| compilatorul asigur| gestionarea pe stiv| a spaiului alocat acestor Dei din Cluj-Napoca Iniializarea variabile, acestea nu se iniializeaz| implicit. Este obligatoriu ca Facultatea Construcii de Maini variabilelor au to utilizatorul s| fac| Catedra de Mecanic| i Programareexplicit iniializarea i s| in| minte c| valorile stocate Curs de limbaj C n aceste variabile se pierd - datorit| desc|rc|rii automate a stivei - la revenirea din funcie. Din acest motiv se mai spune c| ntre dou| apeluri ale funciei valorile variabilelor locale se pierd. n realitate nu se poate ca o variabil| s| nu conin| o Copyright 2001. Toate drepturile sunt rezervate autorului. valoare. Acesta este i cazul valabil pentru variabilele au to , dar valoarea pe care o conin nu este previzibil|, adic| nu ne putem baza pe valoarea lor iniial|. Multiplicarea acestui document n scop comercial este interzis|. Dac| o funcie care conine foarte multe variabile locale este apelat| de Performane Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest multe ori din diferite poriuni ale unui program, pentru fiecare apel document pentru spaiul variabilelor locale va fi alocat respectiv desc|rcat de pe stiv| la uzul personal. terminarea funciei. Aceast| procedur| este consumatoare de timp, iar programul va rula ncet datorit| strategieiorice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la de programare adoptate. Probabil soluia ntr-un astfel de caz estemultiplicavariabile s| fie globale. pot ca unele documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

6.11.1 Durata de existenta auto -7

6.11.2 Durata de existenta static -7 ANTAL Tiberiu Alexandru

Din punctul de vedere al segmentului n care se stocheaz|, spaiul alocat variabilelor static tel.: 0040-264-530918 este segmentul de date. Acesta este segmentul n care sunt stocate i variabilele globale. e-mail: antaltiberiu@pcnet.ro Dac| o variabil| local| este declarat| static (static|), spaiul pentru aceasta nu se mai aloc| pe stiv|, ci pe segmentul de date.
Iniializarea variabilelor static

Variabilele static sunt init ializ ate im plicit cu valoarea 0 la nceputul execuiei programului. Acestea vor "reine" valorile stocate n ele i ntre
93

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca apelurile funciilor n careMaini declararea lor ntruct m|rimea segmentului de date Facultatea Construcii de s-a f|cut este fix| de Mecanic| i Programareprogramului (spaiul alocat lor nu se distruge). Un Catedra pe tot parcursul execuiei exemplu cu declararea unei variabile statice este prezentat n continuare: Curs de limbaj C 1 int test(void) 2 Copyright 2001. Toate drepturile sunt rezervate autorului. { 3 int i; /* variab ila locala auto */ 4 sta tic in t Multiplicarea Co nto r; document ila scop comercial este interzis|. acestui /* variab n statica, Contor este initializata cu 0 */ 5 . . . 6 }

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru Pentru aceste variabile nu exist| faze de creare i distrugere care se uzul personal. Performane reiau n funcie de apelurile din program, motiv pentru care programele cu la orice variabile ruleaza mai rapid dect cele cu variable au to . 7 Sudenii participaniastfel de form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Variabilele scop m| putei contact| la: cu durata de existen| static au o vizibilitate limitat| la Vizibilitatea blocul n care au fost declarate. Dac| este vorba de variabile statice variabilelor static externe, acestea nu pot fi accesate din alte fiiere surs|, asigurnd astfel ANTAL Tiberiu Alexandru de ascundere a datelor. Din acest motiv putem spune c| o modalitate tel.: 0040-264-530918 o vizibilitate local|. Iata un exemplu n acest sens: variabilele statice au 7 e-mail: antaltiberiu@pcnet.ro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 /* STA TIC.C */ #include<stdio.h> void f1(v oid ); void f2 (void ); void f3 (void );

Conf. dr. ing. ANTAL Tiberiu Alexandru int i; /* un i glob al */ Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini int main(void) { Catedra de Mecanic| i Programare int i=3; C Curs de limbaj/* un i local au to */ Copyright 2001. Toate drepturile sunt rezervate autorului. f1();
f2(); f3(); Multiplicarea acestui document n scop comercial este interzis|. prin tf("in m ain () i=%i\ n",i);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest } document pentru uzul personal.
void f1(void) { Sudenii participani /* orice form| de nv||mnt cu plat| sau alte persoane doritoare la i local static */ sta tic in t i=5; pot multiplica documentuln",i); contra cost i cu acordul scris al autorului. n acest prin tf("in f1 () i=%i\ numai } scop m| putei contact| la: void f2(void) ANTAL Tiberiu Alexandru { tel.: 0040-264-530918/* alt i local static */ sta tic in t i=7; e-mail:prin tf("in f2 () i=%i\ n",i); antaltiberiu@pcnet.ro } void f3(void) { /* aici se afiseaz a valoa re i-ului globa l */ 94

return 0;

37 38

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca prin tf("in f3 () i=%i\ n",i); Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C Rezultate: in main() i=3 in f1() i=5 Copyright 2001. in f2() i=7 in f3() i=0

Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Dintre variabilele "i" cele din liniile 8 , 24 , 30 sunt permanente, iar cea din linia 12 este Sudenii participani vedei, toate valorile stocate superior bugetar poti multiplica acest temporar|. Precum la orice form| de nv||mnt sunt distincte. De numele acestor variabile este acelai, ele sunt permanent separate. De asemenea, valorile celor trei "i" -uri document pentru uzul personal. sunt i inaccesibile ntre ele. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica n condiii obinuite, numele de funcii sunt globale i vizibile n toate Funciile static documentul numai contra cost i cu acordul scris al autorului. n acest modulele scop m| putei contact| la: unui program. Dac| o funcie este declarat| static , numele ei va deveni invizibil n afara modulului n care s-a declarat. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro anun| compilatorul ca va fi des utilizat| n program. Din O variabil| declarat| ca register acest motiv ar fi bine s| fie stocat| ntr-un registru al UCP pentru ca programul s| fie ct mai mic i ct mai rapid n rulare. Cuvntul cheie este motenit din C K&R cnd nu existau optimizatoare de cod. Acesta este motivul pentru care numeroase posibilit|i de optimizare au fost incluse ca parte a limbajului. O declaraie register este de forma:

6.11.3 Durata de existenta register -7

Curs de limbaj C i poate fi aplicat| numai variabilelor au to sau parametrilor de funcii. Copyright 2001. Toate drepturile sunt rezervate autorului. Variabilele register nu sunt iniializate implicit, din care cauz| Iniializarea programatorul este nevoit s| le este interzis|. Multiplicarea acestui document n scop comercialiniializeze. Numai n acest fel valoarea variabilelor lor de plecare va fi previzibil|. register Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Declaraia register este luat| n seam| de compilator numai dac| are un Restricii de registru liber n UCP. Tipurile de date care pot fi stocate ntr-un utilizare participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii registru al UPC sunt dependente i de tipul acestuia. Num|rul de pot multiplica documentulai unui contra este ii cu acordul scrisde autorului. Trebuie s| regitri numai UCP cost el dependent al tipul lui. n acest scopm| puteiaici c| variabilele stocate n regitrii UCP nu au adres|, motiv pentru care contact| la: men ionez tot nu pot participa n expresii care fac calcule cu aceast| adres| - vezi poantorii. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Noiunea de legare determin| modalitaile de comunicare ntre funciile unor module distincte ale unui program prin apel i prin intermediul variabilelor externe.

void f(register unsigned j, register short s) Conf. dr. ing. ANTAL Tiberiu Alexandru { Universitatea Tenhic| din Cluj-Napoca regis ter int i; register char ch; Facultatea Construcii de Maini . . Catedra. de Mecanic| i Programare }

6.12 Tipuri de legare


95

Vizibilitatea poate fi privit| n dou| contexte distincte. Unul

lexical ,

uneori numit i

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca vizibilia te statica pentru c| este fixat| si la momentul compil|rii corespunde por iunilor 7 Facultatea Construcii de Maini de programMecanic| i Programare obiectului sunt cunoscute. Dup| cum ai v|zut, n din care caracteristicile Catedra de programul ST ATIC .C , acelai nume de identificator este declarat de mai multe ori avnd Curs de|i distincte sau aceleai vizibilit|i, reuind ns| s| refere corect identificatorul n vizibilit limbaj C

cauz|. Aceasta pentru c| vizibilitatea lexical| permite ca acelai nume s| fie folosit n Copyright diferite f|r|drepturile sunt rezervate autorului. vizibilit|i 2001. Toate nici o interferen|, chiar dac| vizibilitatea lui este aceeai, cu condiia ca acesta s| fie unic n spaiul numelor din care face parte. Multiplicarea acestui document n scop comercial este interzis|. Cel|lalt context al vizibilit|ii este asociat funciilor i variabilelor externe, prin care se deruleaz| co municatla orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii participani-ia ntre m odule le separat com pila te ale programului. Exist| trei tipuri de legare: uzul personal. 7 i nespecificata . Dac| declaraia unui obiect cu 7 7 document pentru interna , externa vizibilitate de tip fis ier conine cuvntul cheie static , atunci identificatorul are legare interna . n interiorul unui modul, fiecare utilizare a identificatorului cu legare intern| 7 Sudenii participani la orice form| de nv||mntie. Dac| prima declaraie cudoritoare reprezint| un unic identificator de obiect sau func cu plat| sau alte persoane vizibilitate pottip fis ier a identificatorului nu folosete durata de existent| static obiectul n acest de multiplica documentul numai contra cost i cu acordul scris al autorului. are legare scop m| i este echivalent externa putei contact| la: cu specificarea duratei de existen| extern . Un nume de 7 identificator cu legare extern| specific| aceeai funcie sau obiect de tipul dat|, asemenea ANTAL alte declaraii cu acelai nume i cu legare extern|. Cele dou| declaraii pot fi n oric|rei Tiberiu Alexandru acelai modul sau n tel.: 0040-264-530918module distincte. Dac| obiectul sau funcia are durat| de existen| fiier, atunci devine vizibil n toate modulele programului. Fiecare obiect, indiferent de e-mail: antaltiberiu@pcnet.ro legare, trebuie s| aib| o singur| definiie. Obiectele cu legare extern| vor avea o singur| definiie la nivelul tuturor modulelor programului. Obiectele cu legare intern|, fiind interne fiec|rui modul, trebuie s| aib| cte o definiie separat| n fiecare modul. Dac| la declararea unui identificator vizibilitatea lui este de tip bloc i nu include durata de existen| extern , identificatorul nu are legare i este unic n funcie. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Urm|torii identificatori nu au legare: un identificator Maini Facultatea Construcii de declarat diferit de orice altceva dect un obiect sau funcie; un identificator declarat parametru de funcie; Catedra de Mecanic| i Programare un identificator cu vizibilitate bloc pentru un obiect declarat f|r| cuvntul Curs de limbaj C extern . Copyright 2001. Toate drepturile sunt rezervate autorului. Dac| un identificator nu are legare, redeclararea lui la acelai nivel de vizibilitate genereaz| o eroare de redefinire. Multiplicarea acestui document n scop comercial este interzis|.

6.12.1 Legarea form| de nv||mnt de program - un Sudenii participani la orice si modulelesuperior bugetar pot multiplica acest document pentru uzul personal. exemplu comentat

Cele prezentate pn|la orice form| de nv||mnt cu plat| sau nelege exemplul care va Sudenii participani acum vor fi reluate sistematizat pentru a alte persoane doritoare fi prezentat n continuare, deci am contra|cost i cu acordul scris al autorului. nde fiier. pot multiplica documentul numai spus c variabilele extern sunt vizibile la nivel acest Sunt definite n afara oric|rei funcii i pot fi accesate de majoritatea funciilor. Funciile scop m| putei contact| la: pot fi definite numai la nivel extern , deci nu pot fi imbricate. Implicit, toate referinele la variabilele sau funciile extern sunt referine la acelai obiect, deci au legare extern|. ANTAL Tiberiu Alexandru modificarea acestei convenii implicite. Utilizarea lui static duce la tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Declaraiile de variabile la nivelul extern sunt fie definiii de variabile (declarat ii de definit ii) , fie referine la variabile definite altundeva (declarat ii de referent iere ). O declaraie de variabil| extern| (extern ) care face i iniializarea variabilei se numete declaraie de definitie a variabilei. 96

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Urm|toarele reguli sunt valabile pentru static : Facultatea Construcii de Maini variabilele declarate n afara Catedra de Mecanic| i Programare tuturor blocurilor f|r| cuvntul rezervat static i p|streaz| valorile n tot programul. Pentru a restrnge accesul acestora la unele Curs de limbaj de programe particulare se folosete static, ceea ce le va conferi legare module C

interna. Pentru a le face globale, se omite specificarea tipului de durat| de 7 Copyright 2001. sau se drepturilecel extern, caz n care legarea va fi externa; existen| Toate specific| sunt rezervate autorului. 7 o variabil| extern| se poate defini o singur| dat| ntr-un program. Se poate defini Multiplicareavariabil|documentin scopcomercial este interzis|. o alt| acestui cu acela nume i durata de existen| static ntr-un alt modul de program. Din moment ce definiiile static sunt vizibile numai n modulul n care s-au f|cut, nu vor exista conflicte. Aceasta este o bugetar pot de ascundere a Sudenii participani la orice form| de nv||mnt superiormetod| util| multiplica acest numelor de identificatori document pentru uzul personal. care se partajeaz| ntre funcii ale unui singur modul de program i nu sunt vizibile pentru alte module; static poate fi utilizat i n cazul numelor de funcii, caz n care numele funciei este Sudenii participani n afara form| de nv||mnt cun caresau altedeclarat. doritoare f|cut invizibil la orice modulului de program plat| a fost persoane pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop |toarele reguli sunt valabile pentru extern : Urm m| putei contact| la: specificatorul de durat| de existen| extern declar| o referin| la o variabil| ANTAL Tiberiu Alexandru Se poate folosi o declaraie extern pentru a face o definiie definit| ntr-un alt loc. dintr-un alt modul vizibil sau pentru a face vizibil| o variabil| nainte de definirea tel.: 0040-264-530918 e-mail:ei n cadrul aceluiai modul; antaltiberiu@pcnet.ro pentru ca o referin| extern| s| fie valid|, variabila la care se face referin| trebuie s| fie definit| numai o singur| dat|, la nivel extern. Aceast| definiie poate fi n oricare din modulele programului.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /***************************************************** * * Conf. dr.Fisierul sursaTiberiu Alexandru ing. ANTAL C (modu lul) 1.c * * Universitatea Tenhic| din Cluj-Napoca * * Facultatea Construcii de Maini *******************************************************/

Catedra de Mecanic| i Programare Curs de limbaj C #include<stdio.h>

ex tern in t i; /* declara tie de referen tiere a lui i, definit ma i jos */

Copyright 2001. Toate drepturile sunt rezervate autorului.


void urm ato r(void ); /* prototipul fun ctiei urm ator() */ void alta (void); /* document n scop comercial fisieru l sursa Multiplicarea acestuiprototipul fun ctiei alta() dineste interzis|. 2.c */ m ain () participani la orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii { document pentru uzul personal. i++; printf("% d\ n",i); /* i este eg al cu 4*/ Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare urm ator (); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest }

scop m| putei contact| la:

int i =3; /*definitia lui i sau declara tia de defin itie a lui i */

ANTAL Tiberiu Alexandru tel.: urmator(void) void 0040-264-530918 e-mail: antaltiberiu@pcnet.ro {

i++; printf("% d\ n",i); /* i este 5 */ alta (); } 97

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini /****************************************************** Catedra de Mecanic| i Programare * * Curs de limbaj C

* Fisierul sursa C (modu lul) 2.c * * * Copyright 2001. Toate drepturile sunt rezervate autorului. ********************************************************/

Multiplicarea acestui document n scop comercial este interzis|. #include <stdio.h>


ex tern in t i; /* declara tie de referen tiere la i din fisierul 1.c */

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. void alta(void)
{ i++; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare printf("% d\ n",i); /* este */ pot multiplica documentul inumai6contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: }

ANTAL Tiberiu Alexandru n exemplul de mai sus, sunt prezentate dou| fiiere surs| (sau module de program) C, tel.: 0040-264-530918 1.c i 2.c . Pentru crearea unui program executabil se va folosi un proiect, att n Borland e-mail: antaltiberiu@pcnet.ro C ct i n Microsoft C, care va conine cele dou| nume de fiiere. Cele dou| fiiere surs| conin n total 3 declaraii externe ale lui i . Numai una dintre ele este o declaraie de definiie i anume int i=3; (linia 20 din 1.c ) care definete variabila global| i i o iniializeaz| cu valoarea 3 . Declaraia de refereniere la nceputul lui 1.c (linia 8) face variabila global| vizibil| nainte de apariia definiiei ei n fiier. Declaraia de refereniere din linia 8 a modulului 2.c face variabila vizibil| n modulul 2.c . Dac| nu se specific| o defini ie ing. ANTAL Tiberiu Alexandru Conf. dr.pentru variabila i ntr-unul dintre modulele de program, compilatorul presupune c| este o declaraie de refereniere ex tern int i i c| o declaraie de definiie de forma int Universitatea Tenhic| din Cluj-Napoca i = 0 apare undeva ntr-un alt modul al programului. Facultatea Construcii de Maini Catedra de Mecanic| i Programare Toate cele 3 funcii, m ain (), u rm ator() i alta (), execut| aceeai operaie: incrementeaz| Curs de limbaj C o afieaz| pe ecran. Valorile afiate sunt 4 , 5 , i 6 . valoarea lui i , apoi Copyright 2001. Toate drepturile sunt rezervate autorului.

6.12.2 Legarea si duratele de existenta ale -7 Multiplicarea acestui document n scop comercial este interzis|. variabilelor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Fie programul: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.
/* LEG DU RE X.C */ #include<stdio.h> Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int i=1; void a lta(vo id); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest

scop m| putei contact| la:

int m ain () { ANTAL Tiberiu Alexandru la i-ul din linia 3*/ extern int i;/* Referin ta static in t a; /* Valoa tel.: 0040-264-530918 rea initiala e 0 si vizib ila num ai in m ain() */ reg iste r in t b = 0 ; /* b va fi e-mail: antaltiberiu@pcnet.ro stocta intr-u n registru */ int c = 0;/* c are im plicit durata d e existenta auto */ prin tf("%d \n %d \n %d \n %d \n ",i,a,b,c); /* Valorile afisa te sunt 1, 0, 0, 0 */ alta(); return 0; 98

16 17 18 19 20 static in t *ex t_i=& i; /* ext_i e glob ala si atribu ita unu i poantor */ 21 int i= 16; i este redefinit si Copyright /*a=2; /* acest a este i-ul global nu ma fun ctia alta()*/ 2001. Toate drepturile izibilrezervate autorului. sunt num ai n i este vizibil */ 22 static in t v 23 a+=2; 24 Multiplicarea acestui document n t_i); comercial este interzis|. prin tf("%d \n %d \n %d \n ", i,a,*ex scop 25 /* Valorile afisa te sunt 16, 4 si 1*/ 26 }

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini Catedra de Mecanic| i Programare void alta(void) Curs de limbaj C {

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. i este definit| la nivel extern cu valoarea iniial| 1 (linia n exemplul de mai sus, variabila
3 ).

O declaraie extern este folosit| n funcia m ain (), pentru a declara o referin| la Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane 0 pentru c| variabila extern| i . Variabila a static| este iniializat| automat cu valoarea doritoare pot multiplica ializare estenumai .contraia printf() acordul scris al autorului. pe coloan|. valoarea de inidocumentul omis| Func cost i cu va afia valorile 1 , 0 , 0 i 0 n acest scop m| putei contact| la: Noiunea de poantor (pointer n englez|) nu a fost nc| discutat|. Pentru moment este suficient Tiberiu c| un poantor stocheaz| adresa unei variabile. n funcia alta (), adresa ANTAL s| tii Alexandru variabilei globale i se folosete pentru a iniializa poantorul static extern_i. Metoda de tel.: 0040-264-530918 iniializare funcioneaz| pentru c| variabila global| are o durat| de existen| de tipul e-mail: antaltiberiu@pcnet.ro static , n sensul c| adresa din RAM la care este stocat| nu se schimb| pe timpul execuiei programului pentru c| variabila se aloc| n segmentul de date . n continuare, variabila i se redefinete ca variabil| local| cu valoarea iniial| de 16 (linia 20 ). Aceast| redefinire nu afecteaz| valoarea stocat| n i extern, aceasta fiind ascuns|, prin folosirea aceluiai nume pentru o variabil| local|. Valoarea global| este acum accesibil| indirect prin poantorul extern_i . ncercarea de a da adresa variabilei auto i unui poantor nu merge pentru c| adresa va fi Tiberiu Alexandru Conf. dr. ing. ANTAL diferit| la fiecare intrare n bloc. Variabila a este declarat| static i iniializat| cu valoarea 2Cluj-Napoca Universitatea Tenhic| din (linia 22 ). Acest a nu intr| n conflict cu a -ul din m ain () din moment ce Construciistatic sunt vizibile la nivel intern, adic| numai n interiorul blocului Facultatea variabilele de Maini n care au fost declarate. Catedra de Mecanic| i Programare Curs de limbaj C Variabila a este m|rit| cu 2 , rezultnd valoarea 4 . Dac| funcia alta (), ar fi apelat| din nou n acelai program, valoarea iniial| pentru a ar fi 4 din moment ce variabilele static i Copyright valorile pe timpul n care programul autorului. | n blocul n care au fost p|streaz| 2001. Toate drepturile sunt rezervate iese i reintr declarate. Multiplicarea acestui document n scop comercial este interzis|.

6.13 Recursivitatea

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest documentC permite utilizarea recursivit|ii. O funct ie care se apeleaza pe ea nsa s i se Limbajul pentru uzul personal. 7 7n um es te recu rsiva . Dac| apelul nu se face direct din corpul funciei, ci indirect , prin una 7 Sudeniimulte funcii,la orice grupul de nv||mnt cu plat| sau "mutual recursiv". Dac| o sau mai participani atunci form| acestor funcii se numete alte persoane doritoare astfel de funcdocumentul numai contra mod i cu acordul scris al autorului. va termina pot multiplica ie se va apela pe sine n cost nentrerupt, programul nu se n acest niciodat putei contact| la: scop m||. Pentru evitarea acestei situaii, funcia realizeaz| un test bazat pe parametrii ei n care verific| un caz iniial - o condiie din care poate reveni cu o valoare f|r| a se apela pe Tiberiu Alexandru ANTAL sine. tel.: 0040-264-530918 Exemplul clasic de funcie recursiv| este factorialul: e-mail: antaltiberiu@pcnet.ro
0!=1 n!=n *(n-1)!

sau, ca s| ne apropiem puin de scrierea n limbajul C:


99

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare sau Curs de limbaj C

Programul2001. Toate drepturile sunt rezervate autorului. Copyright C corespunz|tor este:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* FA CTO RIA .C */ Multiplicarea acestui #include<stdio.h>

document n scop comercial este interzis|. superior bugetar pot multiplica acest

un sign ed long facto la orice form| de nv||mnt Sudenii participanirial(u nsign ed int);

document pentru uzul personal.


int main(void) { Sudenii participani n; unsigned int la

orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest prin tf("n = "); scop m| putei contact| la: ANTAL Tiberiu Alexandru return 0; tel.: 0040-264-530918 } e-mail: antaltiberiu@pcnet.ro
sca nf("% u", & n); prin tf("fac toria l(%u ) = %lu \n ", n ,fa ctoria l(n));

unsigned long factorial(unsigned int n) { if (n == 0) retu rn 1L; /* aici e m ai sana tos sa scriem n <=0 */ else retu rn n *fac toria l(n-1); }

Conf. dr. ing. ANTAL Tiberiu Alexandru Rezultat: Universitatea Tenhic| din Cluj-Napoca n = 7 factorial(7) = 5040 de Maini Facultatea Construcii Catedra de Mecanic| i Programare Funcde factoria l() are un singur parametru, pe n , care se va stoca pe stiv|. La fiecare Curs ia limbaj C apel recursiv pe stiv| se va stoca noua valoare a lui n independent de cea anterioar|. Iniial n ia valoarea 7 , odrepturile sunt rezervate|autorului.apoi la primul apel recursiv al Copyright 2001. Toate copie a lui n se stocheaz pe stiv|, lui factoria l() argumentul va lua valoarea 6 , o copie a valorii noului argument - valoarea 6 - se va stoca din nou pe stiv| i procedura de apel recursiv va continua pn| ce Multiplicarea acestui document n19 . Pentru acesteste interzis|. argumentul ia valoarea 0 - linia scop comercial caz aplelul recursiv nu se reia, ci se revine din funcie cu valoarea numeric| 1 . Terminarea apelului recursiv determina 7 Sudenii participani la orice form| de nv||mnt superior bugetar =pot multiplica acest revenirea n linia 20 unde se poate calcula valoarea lui factorial(1) 1*factorial(0)=1*1=1. Apoi se revine - din cauza lui return - cu o nou| valoare, cea a lui factoria l(1) n aceeai document pentru uzul personal. linie i se calculeaz| factorial(2) = 2*factorial(1)=2*1=2 . n final, dup| ce se execut| toate revenirile, se obine valoareaform| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice lui factorial(7) = 7*factorial(6)=7*6*5*4*3*2*1=5040 . pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Recursivitatea este o metoda de a curp ind e infin itul n fin it . 7 scop m| Avantaje iputei contact| la: Programele recursive vor fi din acest motiv compacte. Din cauza c| dezavantaje ale utilizeaz| masiv lucrul cu stiva acestea vor rula ncet i pot duce la recursivit|ii ANTAL Tiberiu Alexandru apariia erorii numite "dep|ire de stiv|". Recursivitatea este tel.: 0040-264-530918 convenabil| pentru prelucrarea unor structuri de date recursive cum e-mail: antaltiberiu@pcnet.ro sunt de exemplu listele sau arborii.
Evitarea recursivit|ii

n limbajele imperative (C, Pascal, BASIC, FORTRAN) - unde programatorul descrie explicit secvenele de pai ce trebuie urmai pentru a obine rezultatul - iteraia este de preferat n locul
100

Capitolul 6 - Funct ii Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca recursivit|ii, cel puin de Maini de vitez|. Se numete iteraie repetarea unei secvene Facultatea Construcii din motive de instruciuni. IteraiileProgramare Catedra de Mecanic| i sunt caracterizate printr-o mulime de condiii iniiale, un pas de iteraie i o condiie de terminare. Implementat| iterativ, funcia factoria l() este: Curs de limbaj C 1 unsigned long factorial(unsigned int n) 2 Copyright 2001. Toate drepturile sunt rezervate autorului. { 3 un sign ed lon g p,i; 4 Multiplicarea acestui document n scop comercial este interzis|. 5 for (p=1L,i=2L;i<=n;i++) 6 Sudenii participani la orice form| de nv||mnt superior bugetar p*=i; 7 document pentru uzul personal. 8 return p; 9 }

pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul iile iniiale n p=1L,i=2L, acordul scris alie n i++ i condiia de Ciclul for grupeaz| condi numai contra cost i cu pasul de itera autorului. n acest scop m| putei contact| la: terminare n i<=n . ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

101

Capitolul 7 - Preprocesarea Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

7 Preprocesarea

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest rogramul uzul personal. document pentrupreprocesor este apelat de compilator pentru realizarea prelucr|rilor de macrosubstituie, compilare condiionat| i includerea de fiiere, nainte de compilarea programului sursform| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice | C. pot multiplica documentul numai contra cost i precedat| de cea numit| preprocesare . Conform celor spuse, faza de compilare este cu acordul scris al autorului. n acest scop m| putei contact| la: preprocesor se deruleaz| prin instruc ini sau directive de Comunicaia cu programul preprocesare . Acestea ncep cu semnul diez, "#". Sintaxa acestor linii este independent | ANTAL Tiberiu Alexandru de restul limbajului de programare. Liniile pot s| apar| oriunde n textul surs|, efectul tel.:poate fi local sau global. lor 0040-264-530918 e-mail: antaltiberiu@pcnet.ro NOTA: Nu se pune punct si virgula (;), n mod mecanic, dupa o 7 7 directiva pentru ca aceasta nu este o instructiune a limbajului C. 7 7 Programul preprocesor are rolul de a elimina comentariile din programul surs| i de a efectua numeroase substituii de texte n acesta pe baza directivelor de preprocesare. Rezultatul acANTALde mai sus este un nou program surs|, invizibil de obicei pentru Conf. dr. ing. iunilor Tiberiu Alexandru utilizator si care va fi transferat programului compilator. De regul|, directivele sunt Universitatea Tenhic| din Cluj-Napoca surs|. Ele pot fi scrise ncepnd cu oricare linie, plasate n primele linii ale programului Facultatea Construcii de Maini prefer| scrierea lor la nceputul programului din prima dar din motive de consisten|, se Catedraade Mecanic| i .Programare de preprocesare cauzeaz | modificarea programului coloan| textului surs| Directivele Curs , ns| aceste modific|ri dureaz| numai atta timp ct ine faza de compilare a surs|de limbaj C programului surs|. Preprocesarea se deruleaz | n mai multe faze succesive, dar distincte logic, care depind de drepturile sunt rezervate autorului. Copyright 2001. Toateimplementarea programului preprocesor. n continuare prezint cteva din fazele preproces|rii, mpreun| cu preluc|rile caracteristice fazelor. Multiplicarea acestui document n scop comercial este interzis|. Liniile de program surs| care se termin| n caracterul backslash "\" i Lipirea liniilor sunt urmate de trecere la o linie nou| (caracterul newline ), care se Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest obine prin ap|sarea tastei <Enter> n textul surs| C, se mbin| document pentru singur| linie a programului surs|. pentru a forma o uzul personal.
Directiva #define pot multiplica documentulde caractere cu uni cu acordul scris alpentru definirea unor unui ir numai contra cost altul. Se folosete autorului. n acest

Sudenii participani la orice form| permite definirea de macrocomenzi pentru nlocuirea Directiva #define de nv||mnt cu plat| sau alte persoane doritoare constante scop m| putei contact| la: numerice n vederea creterii lizibilit|ii programului.
#define Tiberiu Alexandru ANTAL PI 3.151592653 #define TIP_CERC 0

tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Form a : 7 #d efine IDE NT IFICA TO R1 s ir2 unde IDENTIFICATOR1 este un cuvnt f|r| spaii. s ir2 este separat de IDENTIFICATOR1 prin cel puin un spaiu i poate fi orice caracter, cuvnt sau propoziie; de asemenea,
102

Capitolul 7 - Preprocesarea Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca poate conine orice num|r de spaii. Directiva #define are ca efect nlocuirea tuturor Facultatea Construcii de Maini apariiilor lui IDENTIFICATOR1 din cadrul modulului curent cu s ir2 ncepnd cu linia Catedra de Mecanic| i Programare urm|toare directivei. Exist| i o form| mai "savant|" a lui #define , ns| pe aceasta am s-o Curs deprin intermediul exemplelor. prezint limbaj C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Copyright 2001. Toate /* DE FIN E1.C */ #include <stdio.h>

drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

#define INCEP UT 5 /* Valoa rea de incepu t a ciclului */ #define SFAR SIT 10 /* Valoa rea de sfarsit a ciclului */ Sudenii participani((A)>(B)?(A):(B )) de nv||mnt superior M AX */pot #d efin e M AX (A,B ) la orice form| /* ma cro definitia lui bugetar #d efin e M IN (A,Buzul personal. )) /* ma cro definitia lui M IN */ document pentru ) ((A)>(B)?(B):(A

multiplica acest

int main(void) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot int i, min, max; multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int comp = contact| la: scop m| putei 7;

ANTAL Tiberiu Alexandru { tel.: 0040-264-530918 com p); m ax = M AX (i, e-mail:m in = M IN (i, com p); antaltiberiu@pcnet.ro
} return 0; }

for (i = IN CE PU T ; i <= S FA RS IT ; i++)

prin tf("i=% 2i, com p=% 2i, m ax este %2i si m in e ste % 2i\n ",i,com p,m ax ,\ m in);

Rezultate: ANTAL Tiberiu Alexandru Conf. dr. ing. i= 5, comp= 7, max este 7 si min est e Universitatea Tenhic| esteCluj-Napoca est e din 7 si min i= 6, comp= 7, max Facultatea Construciieste 7 si min est e i= 7, comp= 7, max de Maini i= 8, comp= 7, max i Programare Catedra de Mecanic| este 8 si min est e i= 9,de limbaj C max este 9 si min est e Curs comp= 7,
i=10, comp = 7, max est e 10 si min e ste

5 6 7 7 7 7

Copyright 2001. Toate drepturile sunt rezervate autorului. n exemplul anterior am folosit noiunea de macro. O macrodefiniie sau, mai pe scurt, un ma cro este o form| special| de #define capabil cel putin n aparenta s| realizeze o decizie -7 Multiplicareaimplementeze o funcscop comercial este interzis|. unic. La definirea unui logic| sau s| acestui document n ie matematic| sub un nume macro este necesar s| nu existe spaii ntre numele lui i paranteza deschis| dup| care se specific| parametrii. Voi folosi linia 6 din programul de mai sus multiplica acest Sudenii participani la orice form| de nv||mnt superior bugetar potpentru a explica funcionarea unui macro. n orice loc din textul surs| n care preprocesorul g|seste document pentru uzul personal. cuvntul MAX urmat de un grup de paranteze, va atepta specificarea a doi parametri care vor participani ila orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii fi substitui conform specificaiilor din a doua parte a macrodefiniiei. Astfel, primul parametru va substitui fiecare A din a doua parte a macrodefiniiei, iar al doilea pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest parametru va substitui fiecare apariie a lui B n cea de a doua parte din macrodefiniie. scop m| putei contact| la: , fiecare A se va substitui cu i , iar fiecare B cu com p . Astfel, Cnd se ajunge la linia 16 linia 16 care va fi transferat| compilatorului este: ANTAL Tiberiu Alexandru tel.: = ((i) > (com p)?(i):(com p)) m ax0040-264-530918 e-mail: antaltiberiu@pcnet.ro NOTA: Comentariile mpreuna cu sirurile de caractere ramn 7 7 ntotdeauna neafectate de substitutiile cauzate de macrodefinitii. S| trecem n continuare la un exemplu de macro care va da chix elegant.
103

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Capitolul 7 - Preprocesarea Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca /* DE FIN E2.C */ Facultatea<stdio.h> Construcii de Maini #include Catedra de Mecanic|A*A #define GRESIT(A) i Programare acro gresit pen tru patra t /* M Curs de P AT RA #d efin e limbaj CT(A ) (A)*(A ) /* M acro O k pen tru patra t

*/ */ #d efin e A DU N A_ CH IX (A) (A )+(A) /* Asa adu nare a nu va m erge ...*/ #d efin e A DU N A_ OK (A) ((A)+(A)) /* Asa da ... Copyright 2001. Toate drepturile sunt rezervate autorului. */ #define START 1 #define STOP 3

Multiplicarea acestui document n scop comercial este interzis|.


int main(void) { Sudenii participani int i, val_ct=3;

la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.
for (i = S TA RT ; i <= ST OP ; i++) { Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare prin tf("Pa tratu l lui % 2i es te %2i\n ",i+va l_ct, P AT RA T(i+v al_ ct)); pot multiplica documentulgnumaiacontra cost i %3i\n ",i+va l_ct, G RE SIT (i+va l_ct)); cu acordul scris al autorului. n acest prin tf("\tP atra tul resit lu i %2 i este scop m| putei contact| la: } prin Tiberiu Alexandru ANTALtf("\n Ac um testa m m acr o-u l de a du na re\ n"); for (i = S TA RT ; i tel.: 0040-264-530918<= ST OP ; i++) { e-mail:prin tf("M acro de a du na re gre sit = %2i\ antaltiberiu@pcnet.ro , si acum cel O k = % 2i\n ",5*A DU N A_ CH IX(i), 5*AD UN A_ OK (i)); } return 0; }

Conf. dr. ing. ANTAL Tiberiu Alexandru Rezultate: Patratul lui Tenhic| din Cluj-Napoca Universitatea 4 este 16 Patratul gresit a lui Facultatea Construcii de Maini 4 este Patratul lui 5 este 25 Catedra de Mecanic| i Programare 5 este Patratul gresit a lui Curs de limbaj 6 Patratul lui C este 36
Patratul gresit a lui 6 este

7 11 15

Copyright 2001. Toate drepturile sunt rezervate autorului.

Acum testam macro-ul de adunare Macro de adunare gresit = 6, si acum cel Ok = 10 Multiplicarea acestui document n scop comercialOk = interzis|. Macro de adunare gresit = 12, si acum cel este 20 Macro de adunare gresit = 18, si acum cel Ok = 30

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Avem dou| macrodefiniii greite n liniile 3 i 5 . Pentru cel din linia 3, n linia 17 , cnd document pentru uzul personal. i ia valoarea 1 , iar val_ct , 5 , se calculeaz| suma lor prin i+val_ct , adic| 1+5=6 . Pentru cazul macrodefinitiei PATRAT , valorile se grupeaz| astfel: (1+5)*(1+5)=6*6=36 . n varianta Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare GRESIT avem 1+5*1+5=11 . Deci, parantezele rotunde sunt necesare pentru gruparea pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest ea corect| a parametrilor, dar conteaz| cte sunt i unde le punem. Pentru linia 5, i scopit|, am folosit stilul de paranteze care d| rezultatele corecte la produs, ns| la gre m| putei contact| la: adunare nu se poate lucra la fel. Pentru 5*AD UN A_ CH IX(i) cu i=1 , obinem 5*1+1=5+1=6 . Ceea ce doream s| obinem ANTAL Tiberiu Alexandru este 5*(1+1)=5*2=10, care este r|spunsul corect obinut cu ADUNA_OK ca urmare a parantezelor puse n jurul ntregii expresii. Un pic de studiu tel.: 0040-264-530918 individual al macrodefiniiilor din cele dou| exemple prezentate sper c| va clarifica modul e-mail: antaltiberiu@pcnet.ro n care se pune problema. n general, programatorii experimentai pun paranteze n jurul fiec|rui argument de macro i paranteze adiionale n jurul ntregii expresii. O linie de forma #und ef IDENTIFICATOR1 face ca definiia lui IDENTIFICATOR1 s| fie
104

Directiva

Capitolul 7 - Preprocesarea Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca uitat| de preprocesor. Este corect s | se aplice #und ef asupra unui identificator care nu Facultatea Construcii de Maini a fost definit. Catedra de Mecanic| i Programare Curs de limbaj C Directiva #include insereaz| coninutul unui fiier n programul surs|.

#include Copyright 2001.

Practic, linia directivei se va nlocui prin coninutul ntregului fiier. De Toate drepturile sunt rezervate de identificatori i/sau definiii de funcii obicei fiierul conine declaraii autorului. care sunt grupate ntr-un singur modul pentru a facilita un anumit tip Multiplicarea acestui document n scop comercial este interzis|. de operaii, cum ar fi cele de intrare/ieire, prelucrare a irurilor etc. Acelai fiier poate fi inclus n mai multe module ale aceluiai program sau ale unor programe diferite. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest #include<stdio.h> document pentru uzul personal.
#include<string.h>

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Form a : 7 #in clude<n um efis ier> sau # include num efis ier pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Aceast| directiv| nu face mai mult cu programul dect ar face un simplu editor de texte; editoarele de texte sunt i ele capabile de operaia de includere a coninutului unui fiier ANTAL Tiberiu Alexandru stocat pe disc n coninutul fiierului curent. num efis ier trebuie s| fie numele unui fiier tel.: 0040-264-530918 disc. Prima form| asigur| c|utarea lui num efis ier n locuri definite text ASCII stocat pe e-mail: antaltiberiu@pcnet.ro dependent de implementarea particular| a preprocesorului. Cea de-a dou| form| va c|uta mai nti pe num efis ier n acelai loc cu programul surs|, apoi va trece la c|ut|rile specifice primei forme.
Directive de condiionat|. Acestea permit numai compilarea unor poriuni din compilare programul surs|. Se poate scrie astfel un program general, portabil sub Conf. dr. condiionat|ing. ANTAL Tiberiu Alexandru
#if , #ifdef , #ifndef , #else , #e nd if

sunt directive pentru compilare

1 2 3 4 5 6 7 8 9 10 11

mai din Cluj-Napoca Universitatea Tenhic|multe sisteme de operare, de exemplu DOS i UNIX, poriunile specifice sistemului de operare fiind compilate, n funcie de valori luate Facultatea Construcii de Maini de anumite constante. Voi prezenta cteva dintre directivele de compilare condiionat| Catedra de Mecanic| i Programare prin intermediul exemplelor. Curs de limbaj C n programul urm|tor - IFD EF .C , OPTIUNE_1 apare ntr-un #define f|r| argumente. Copyright 2001. form| drepturile sunt rezervate autorului. la crearea identificatorului Aceasta este o Toate particular| de #define care duce OP TIUN E_1. Dac| ulterior se testeaz| existena lui se poate lua o decizie pe baza existenei sau inexistenei lui. Pentru c| O PTIUNE_1 este Multiplicarea acestui document n scop comercial este interzis|.definit n linia 4, cnd preprocesorul ajunge la linia 16 , va include n programul surs| tot ceea ce exist| ntre liniile 16 i 19 . ifdef se traduce "dac| s-a definit", iar end if marcheaz| terminarea grupului Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest de instruciuni care vor fi incluse n programul surs| la existena lui OP TIUN E_1. Pentru document pentru uzul personal. a nu avea definit identificatorul OPTIUNE_1 este suficient s| transform|m linia 4 ntr-un comentariu prin modificarea ei la forma /* #de fine OP TIUN E_1 */ , apoi se recompileaz|, Sudenii participani la orice n execuie programul. plat| sau alte persoane doritoare linkediteaz| i se relanseaz| form| de nv||mnt cu pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest /* IFDE F.C */ contact| la: scop m| putei
#include <stdio.h>

ANTAL TiberiuNE _1 /* Se de f. ident. pentru con trolul preproces orului Alexandru #d efine O PTIU tel.: 0040-264-530918 #ifdef OPTIUNE_1 e-mail: antaltiberiu@pcnet.ro int con t = 17; /* Ac. linie exista d oar da ca s-a de f. OPTIU NE _1 */
#e nd if int main(void) { int i; 105

*/

12 13 14 15 16 17 18 19 20 21 22 23 24 25

Capitolul 7 - Preprocesarea Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca for (i = Facultatea 0 ; i < 3 ; i++)de Maini Construcii { Catedra de tf("In ciclu , ind ex = %d ", i); prin Mecanic| i Programare Curs de limbaj C #ifdef OPTIUNE_1 /* CopyrightAceasta linie exista sau nu,rezervate autorului. TIUN E_1 */ 2001. Toate drepturile sunt condiionata d e OP prin tf(" si cont = % d", co nt); #e nd if Multiplicarea acestui document n scop comercial este interzis|. prin tf("\n "); }

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest return 0; document pentru uzul personal. }
#undef OPTIUNE_1

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Dacmultiplica documentul numai contra cost i se obin rezultatele: pot | programul este rulat n forma de mai sus cu acordul scris al autorului. n acest In ciclu, index = 0 si cont = 17 scop m| putei contact| si cont = 17 la: In ciclu, index = 1
In ciclu, index = 2 si cont = 17

ANTAL Tiberiu Alexandru F|r 0040-264-530918 tel.:| definiia lui OPTIUNE_1 din linia 4 se obine: In ciclu, index = 0 e-mail: antaltiberiu@pcnet.ro
In ciclu, index = 1 In ciclu, index = 2

Exemplul care urmeaz| ilustreaz| utilizarea directivelor de preprocesare pentru includerea unei portiuni de cod n programul surs| dac| un identificator nu este definit. Directiva ifndef se citete dac| nu s-a definit - if not defined. Se folosesc doi identificatori ANTAL Tiberiu Alexandru Conf. dr. ing.OPTIUNE_1 i AFISARE_DA TE , iar n funcie de existena lor se pot obine 3 variante de r|spunsuri. Dac| exemplul anterior era pur didactic i simplu, acesta este Universitatea Tenhic| din Cluj-Napoca tot didactic, dar puin de Maini Facultatea Construcii mai complex. Identificatorul OPTIUNE_1 are rolul inversat din programul anterior, iar AFISARE_DATE se folosete pentru a valida afiarea dac| acesta Catedra de Mecanic| i Programare este definit. Dac| AFISARE_DATE nu este definit se va afia un mesaj specific acestui Curs de limbaj C caz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Copyright 2001. Toate drepturile sunt rezervate autorului. /* IFN DE F.C */


#include <stdio.h> #d efine O PTIU NE _1 /* Se de n scop comercial controlul prep Multiplicarea acestui documentfineste id. pentru este interzis|. rocesoru lui */ #define AFISARE_DATE /* Daca id. este definit se va a fisa */

Sudenii OPTIUNE_1la orice form| de nv||mnt superior bugetar pot multiplica acest #ifndef participani int cont = 17; /* Linia ex ista document pentru uzul personal. num ai daca OP TIUN E_1 n u este de finita */
#e nd if

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int main(void) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest { int i; scop m| putei contact| la:
#ifndef AFISARE_DATE ANTALtf("N u se Alexandru r ezu ltate c u a cea sta v ersiun e a p rog ram ulu i\n "); Tiberiu vo r afisa prin tel.: 0040-264-530918 #e nd if

e-mail: antaltiberiu@pcnet.ro
for (i = 0 ; i < 3 ; i++) { #ifdef AFISARE_DATE prin tf("In ciclu , Ind ex = %i", i);

106

23 24 v a afisa con ditionat */ 25 26 27 prin tf("\n "); 28 #e nd if Copyright 2001. Toate drepturile sunt rezervate autorului. 29 } 30 31 Multiplicarea acestui document n scop comercial este interzis|. return 0; }

Capitolul 7 - Preprocesarea Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca #ifndef OPTIUNE_1 Facultatea Construcii de co nt); /* Linia se Maini printf("con t = %i", Catedra de Mecanic| i Programare #e nd if Curs de limbaj C

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Pentru cazul cnduzul personal. identificatori se afieaz| rezultatele: exist document pentru = 0 | cei doi In ciclu, Index
In ciclu, Index = 1 Sudenii participani 2 In ciclu, Index = la

orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Celelalteputei variante de rezultate sper s| le g|sii voi. Sunt numai 3 tipuri de rezultate scop m| dou| contact| la: care se vor afia, dei exist| 4 st|ri distincte care pot fi obinute prin gruparea st|rilor de existen|Tiberiu Alexandru ANTAL sau inexisten| a celor doi identificatori.
Directiva #line e-mail: antaltiberiu@pcnet.ro

tel.: 0040-264-530918 Directiva #line spune preprocesorului c| pentru programul C generat,

num|rul intern de linii i numele fiierului C s| fie modificate. Compilatorul folosete aceste numere de linii i numele de fiier pentru afiarea erorilor g|site n faza de compilare.
Form a : 7 #line constanta "num e de fis ier" 7 -

Conf. dr. ing. prin #line 123 "test1.c" , num|rul intern de linie este modificat la 123 iar De exemplu, ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca numele fiierului la test1.c. Facultatea Construcii de Maini Catedra de Mecanic| i compilator are un set de opiuni dependente de UCP i sistemul Orice Programare Directive Curs de limbaj C de operare sub care se ruleaz|. De exemplu, pentru unele programe # pra gm a datele trebuie s| fie stocate la anumite adrese n RAM. Alteori dorim s| control|m modul n care funciile primesc parametri. Directiva Copyright 2001. Toate drepturile sunt rezervate autorului. #p ra gm a asigur| aceste facilit|i, dar argumentul ei este de obicei diferit pentru fiecare combinaie deacestui i sistem de scop comercial este interzis|. acestora va trebui s| Multiplicarea UCP document n operare. Pentru cunoaterea consultai documentaia compilatorului pe care l folosii. Sudenii participani la|orice grup de identificatori care n urma pot multiplica acest Exist un form| de nv||mnt superior bugetar substituiei produc Nume predefinite uzul personal. document pentruinformaii speciale. Acetia nu se pot redefini sau "uita" cu #undefine . Civa dintre acetia se afla n tablelul care urmeaz|: 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Nume identificator Semnificatie scop m| putei contact| la: __LINE__ O constant| n baza zecimal| ce conine num|rul de ordine a liniei ANTAL Tiberiu Alexandru curente din codul surs|. tel.: 0040-264-530918 __FILE__ Un ir ce conine numele fiierului n curs de compilare. e-mail: antaltiberiu@pcnet.ro __DATE__ Un ir care conine data compil|rii sub forma Mm m dd yyyy .
__TIME__

Un ir care conine ora compil|rii sub forma hh:m m:ss .

107

1 2 3 4 5 6 7 8 9 10 11 12

Capitolul 7 - Preprocesarea Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Prezint n continuare un exemplu de folosire a acestor nume: Facultatea Construcii de Maini Catedra de Mecanic| i Programare /* PR ED EF.C */ Curs de limbaj C #include<stdio.h>

Copyright 2001. Toate drepturile sunt rezervate autorului.


int main(void) {

Multiplicarea acestui document n scop comercial este interzis|.


prin tf("Lin ia d e pr ogr am %d ,\nd in fis ieru l sur sa % s,\n com pila t\ la d ata %s, o ra orice form| de nv||mnt superior bugetar pot multiplica Sudenii participani la% s\n ",__ LIN E_ _, _ _F ILE __ , __ DA TE __ , __ TIM E_ _); acest document pentru uzul personal. return 0; }

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Rezultate: pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Linia de program 9, la: scop m| putei contact|
din fisierul sursa C:\Visual C++\prefef.c, compilat la data Feb 3 2000, ora 16:22:29

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

108

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

8 Poantori

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest rincipial, uzul personal. document pentruvariabila de tipul poantor sau, mai pe scurt, poantorul (pointer-ul n englez|) stocheaza adresa un ei locat ii din RAM . Poantorul poate fi tipizat, adic| 7 prin tipul lui va indicala orice form| dela care poanteazplat| sau alte persoane doritoare tipul obiectului nv||mnt cu |. Poantorii pot fi privi i asemenea Sudenii participani unor salturi care asigur| leg|turi dintr-o parte a programului n alta. Tony Hoare, n pot multiplica documentul numai contra cost i cu acordul Design", 1973, Prentice-Hall colecia lui de eseuri "Hints on Programming Language scris al autorului. n acest scop m| "Intr oducere a poan torilor n lim ba jele d e ni vel n alt a fost un pas napoi dupa spunea: putei contact| la: 7 care este pos ibil sa nu ne mai revenim niciodata " . n C, nu trebuie s| ne facem griji 7 7 ANTAL afirmaiei de mai sus, cel puin pentru c| K&R nu l numesc limbaj de nivel nalt, datorit| Tiberiu Alexandru tel.: 0040-264-530918 ci mai degrab| un limbaj de asamblare de nivel nalt. Pentru c| C este un limbaj destul de jos este imposibil s| se scrie e-mail: antaltiberiu@pcnet.ro n el ceva serios f|r| poantori. De exemplu, este imposibil s| alter|m valorile argumentelor unei funcii aducnd modific|ri asupra parametrilor n corpul funciei, cu cele discutate pn| acum. Numai folosind poantori se pot crea variabile noi n timpul execuiei programului. C permite programului s| aloce o cantitate de RAM pe heap, ntorcnd o adres| care poate fi stocat| ntr-un poantor. Aceast| tehnic| poart| denumirea de aloca re din am ica a mem oriei. 7
RAM-ul i Universitatea Tenhic| ie avnd o adres| unic| i un coninut unic, care se poate modifica. loca din Cluj-Napoca poantorii

Conf. dr. ing. ANTAL Tiberiu Alexandru c| RAM-ul este o secven| de locaii, fiecare n primul capitol, am spus Facultatea Construcii de Mainiorganizare a locaiei este grupul de 8 bii, care se mai Cazul tipic de nume te i octet. Putem spune c| RAM-ul este un "vector" M = (L 1, L 2, ..., Catedra de Mecanic| iProgramare L k, ..., de )limbaj L k este o locaie format| dintr-un grup de 8 bii, iar k este adresa locaiei. Curs L n , unde C tii c| tipul char se stocheaz| pe un octet, iar tipul long pe 4 octei consecutivi. La nivelul RAM-ului, 2001. Toate drepturile suntse stocheaz| ntr-un grup de 4 (eventual 2) locaii Copyright n cazul comun, poantorul rezervate autorului. succesive (vezi n Figura 5 pe L 1, L 2, L 3, L 4). n Figura 5 se reprezinta grafic legatura 7 7 creata prin poantarea la o variabila a de tipul char de catre un poantor pta . 7 7 7 Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Figura 5 - Model de reprezentare a poantorului n RAM e-mail: antaltiberiu@pcnet.ro Cnd un poantor stocheaz| adresa unui obiect, prin modificarea coninutului poantorului a adresei stocate n el - putem poanta la diferite obiecte din RAM. Astfel, apare posibilitatea manipul|rii (atribuire, citire, modificare) informaiilor stocate la adrese diferite cu ajutorul unei singure variabile, aceea de tipul poantor.
109

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Datorit asem| Facultatea Construcii de|Maini n|rii poantorilor cu instruciunea goto este posibil s| se Poantorii n ANSI fac| leg|turi incorecte sau cu zone de RAM interzise. Deci, din neatenie C Catedra de Mecanic| i Programare sau lips| de experien|, un poantor va putea poanta "incorect". Era cazul Curs de limbaj C ca o oarecare disciplin| s| fie introdus| i pentru variabila poantor. Aceasta este marea contribuie a standardului ANSI C. El definete regulile de lucru cu Copyright 2001. ToateAcestea au fost preluate din practic|, de la programatorii variabilele poantor. drepturile sunt rezervate autorului. profesioniti, iar compilatoarele C bune oblig| la folosirea acestora. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 8.1 Declararea poantorilor document pentru uzul personal.

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

Un poantor se declar| n C prin precedarea numelui de variabil| cu caracterul asterisc "*". Acesta informeaz| compilatorul c| dorim s| declar|m o variabil| poantor i s| aloce spaiul corespunz|tor num| la orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participanirului de octei necesari pentru a stoca o adres| de memorie. Dac| prin linia: pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
char a;

ANTAL Tiberiu Alexandru se declar| o variabil| a de tipul ntreg char, atunci prin linia: tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro char *pta; se declar| o variabil| poantor la un tip char cu numele pta. Din punct de vedere al declaraiei, poziia caracterului * este nesemnificativ| att timp ct se afla ntre tipul i 7 numele variabilei poantor. Astfel, declaraia de mai sus se poate scrie i aa:
char* dr. ing. Conf. pta;

1 2

ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Se pot declara mai muli poantori n aceeai linie de program astfel: Facultatea Construcii de Maini Catedra de*ptb, pt1; i Programare char *pta , Mecanic| Curs de limbaj C int* ptx1, x2, *ptx3; n linia 1, pta ptb sunt poantori la rezervate autorului. Copyright 2001.iToate drepturile sunt tipul char, dar pt1 este o variabil| de tipul char pentru c| * lipsete. n linia 2, ptx1 i ptx sunt poantori la tipul int, iar x2 este o variabil| ntreag|. Multiplicarea acestui document n scop comercial este interzis|.

Tipul poantorului Sudenii participani la oriceiform| de nv||mnt superior bugetar pot multiplica acest program, poantorul are un tip prin care compilatorul este anunat

La fel cum o variabil| are un tip ce specific| atributele acesteia n

document pentru asupra num|rului de octei i a atributelor datelor care sunt valide uzul personal. ncepnd de la adresa poantat| de poantor. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

8.2 Operatorul adresa "&" 7


Operatorul adresa " &" 7 1 /* PT1.C */ 2 #include<stdio.h> 3 4 int a, *p ta; /* a si pta su nt varia bile globale */ 110

l-am folosit n funcia sca nf(). El are ca rezultat adresa unei ANTAL Tiberiu Alexandru n zona segmentului de date. Tehnic vorbind & ntoarce variabile stocate pe stiv| sau tel.: 0040-264-530918Operandul poate fi un nume de funcie sau un nume de obiect, iar adresa operandului. rezultatul este un poantor la operand. e-mail: antaltiberiu@pcnet.ro

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

5 6 7 8 */ 9 pta =& a; /* se atribuie a dresa lui a poan torului pta */ 10 a=50; 50 variab Copyright 2001. /* se atribuie va loarea stocata n ilei a */p t1a */ Toate drepturile sunt rezervate autorului. 11 pt1a=pta ; /* se atribuie a dresa pta lui 12 13 Multiplicarea acestui document n", &a );comercial este interzis|. prin tf("ad resa lu i a: %p\n scop 14 prin tf("con tinu tul lu i a: %i\n \n ", a); 15 Sudenii participani la oricei form| de n", p ta); nv||mnt superior bugetar pot multiplica acest 16 prin tf("con tinu tul lu pta : %p\ 17 document pentruloar ea la ca re p oan teaza p ta: %i\n \n ", *pta ); prin tf("va uzul personal. 18 19 Sudenii participani la orice form|%p\nv||mnt cu plat| sau alte persoane doritoare prin tf("con tinu tul lu i pt1a : de n", p t1a); 20 prin tf("va loar ea la ca re p pot multiplica documentul numai oan teaza p t1a: %acordul scris al autorului. n acest contra cost i cu i\n \n ", *pt1a ); 21 22 scop m| putei contact|nu m eric e su nt: % i %i % i\n ", a, *pta , *pt1a ); prin tf("va lorile la: 23 24 ANTAL Tiberiu Alexandrum odifica va loarea lui a */ *pt1a=22 ; /* aici se 25 tel.: 0040-264-530918 nu m eric e su nt: % i %i % i\n ", a, *pta , *pt1a ); 26 prin tf("va lorile 27 e-mail: antaltiberiu@pcnet.ro 28 return 0; 29 }

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini int main(void) Catedra de Mecanic| i Programare { Curs de limbaj C/* pt1a este va riabila locala int *pt1a;

Rezultate:
adresa lui a: 004237A4 continutul lui a: 50

Conf. dr. ing. ANTAL Tiberiu Alexandru continutul lui pta: din Cluj-Napoca Universitatea Tenhic| 004237A4 valoarea la care poanteaza pta: 50 Facultatea Construcii de Maini Catedra de Mecanic| i Programare continutul lui pt1a: 004237A4 Curs de limbaj C valoarea la care poanteaza pt1a: 50
valorile numerice sunt: 50 50 50 Copyright 2001. Toate drepturile sunt valorile numerice sunt: 22 22 22

rezervate autorului.

Multiplicarea acestui document variabil| ntreag|, iar interzis|. un poantor la ntreg. n n programul anterior a este o n scop comercial este pta este aceste condiii & a are ca rezultat adresa variabilei a din segmentul de date. Aceast| Sudeniiprin operatoruloriceatribuire, se copiaz| -superior bugetar pot multiplica acest adres|, participani la de form| de nv||mnt vezi linia 9 - n poantorul pta. Din rezultatele afiate de program se document pentru uzul personal. observ| c| poantorii stocheaz| tot numere, ns| acestea sunt intepretate ca i adrese. Prin "tradiie", adresele se scriu n notaie hexazecimal|, ceea ce ajuta la distingerea lor de valorile numerice "normale".alte persoane doritoare 7 Sudenii participani la orice form| de nv||mnt cu plat| sau pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Valoarea unui poantor se poate afia folosind n printf() specificatorul de Afiarea putei contact| la: scop m| format %p. poantorilor
Reprezentarea tel.: 0040-264-530918 | 3 variabile: a declar spaiului de date

ANTAL Tiberiu Alexandru n programul

PT 1.C

se

e-mail: antaltiberiu@pcnet.ro tipul ntreg, variabil| de pta - variabil| poantor la ntreg global|, pt1a - variabil| poantor la ntreg local|. Acesta din urm| stocheaz| adresa variabilei de tipul int. pta fiind un

Figura 6

111

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca poantor global este inide Maini valoare special| numit| NULL , despre care voi discuta Facultatea Construcii ializat cu o pe larg ntr-un paragrafProgramare 7 Catedra de Mecanic| i urm|tor. Variabila a fiind global| este automat init ializata cu valoarea 0 . Pentru a uura nelegerea problemei, prezint n Figura 6 spaiul de date al Curs de limbaj C programului anterior. Copyright 2001. iul se aloc| pe stivsunt rezervate autorului. Pentru pt1a spa Toate drepturile |, iar acolo unde s-a f|cut aceast| alocare sunt stocate cteva valori acestui document n scop comercial este interzis|. Multiplicareaimprevizibile. ntruct acestea sunt lipsite de utilitate pentru programator, prefer s| zic c| variabilele form|au nici o Sudenii participani la orice nu de nv||mnt superior bugetar pot multiplica acest valoare, iar n reprezentarea spaiului de document pentru uzul personal. date am folosit "? " pentru a simboliza situaia. Variabila a are stocat| n ea valoarea 0 . Figura 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot urma execuiei liniilornumai 10 , ptacost i cu acordul scris al autorului. n acest n multiplica documentul 9 i contra va scop m|la a , iar n a se va stoca valoarea 50 , poanta putei contact| la: deci reprezentarea spaiului datelor devine ANTAL Tiberiu Alexandrumoment avem un cea din Figura 7. Din acest poantor la variabil| ntreag| a i o valoarea tel.: 0040-264-530918 stocat| antaltiberiu@pcnet.romanipulat|, fie e-mail: n ea, care va putea fi prin numele variabilei a , fie prin poantorul la aceasta pta , dup| cum se va vedea n Figura 8 continuare. Variabila pt1a este i ea tot o variabil| poantor la un tip int. Prin atribuirea din linia 11 , adresa din pta se copiaz| i n pt1a , deci pt1a va poanta n acelai loc cu pta. Situaia este ilustrat| n Figura 8.
Reguli de Universitatea Tenhic| din Cluj-Napocadeclaraia acestuia. Motivul acestei interdicii st| poantorului folosit n atribuire a n faptul c| prin Facultatea Construcii de Maini intermediul unui poantor este posibil s| avem acces la adreselor

Conf. dr. ing. ANTAL Tiberiupoate poanta numai la o variabil| de acelai tip cu tipul Un poantor Alexandru valoarea numeric| Catedra de Mecanic| i Programare de la adresa poantata de poantor. Tipul poantorului Curs de limbaj C specific| cum anume va fi tratat| valoarea de la acea adres|. Ar fi tragic ca prin intermediul poantorilor s| fie permis|, de exemplu, tratarea unei valori de tipul int ca una de tipul doub le . Un compilator bun trebuie s| sancioneze orice tentativ| de Copyright 2001. Toate drepturile sunt rezervate autorului. acest fel. Multiplicarea acestui document n scop comercial este interzis|.

8.3 participani la orice form| de nv||mnt superior bugetar pot multiplica acest Operatorul de indirectare, "*" Sudenii

Operatorul de indirectare "*" este ntr-un fel opusul celui adres|. Dac| "&" are ca rezultat document pentru uzul personal. adresa unei variabile, operatorul "*" folosete aceast| adres| stocat| ntr-o variabil|

poantor pentru accesarea conintului locaiei de memorie corespunz|toare. Operatorul de Sudenii participani la orice form| numeric| indirect plat|aici alte persoane doritoare indirectare "*" acceseaz| o valoare de nv||mnt cu - de sau i numele de indirectare pot multiplica documentul numai contra cost i cu s| fie o valoare de poantor. Rezultatul prin intermediul unui poantor. Operandul trebuie acordul scris al autorului. n acest scop m| putei contact| la: operaiei este valoarea adresat| de operand, adic| valoarea de la adresa la care poanteaz| operandul. Tipul rezultatului este tipul pe care operandul l adreseaz|. Se mai spune c| operatorul "*" realizeaz| dereferent ierea poantorului, adic| l covertete ntr-o l-value . ANTAL Tiberiu Alexandru tel.: 0040-264-530918 n programul PT 1.C , pentru c| pta poanteaz| la a , folosirea indirect|rii, adic| a formei de e-mail: antaltiberiu@pcnet.ro scriere *pta , permite manipularea valorii ntregi stocate n variabila a . n orice loc din program n care este permis| utilizarea lui a , ncepnd cu linia 10 , este permis| i utilizarea lui *pta . Semnificaia lor este identic| att timp ct pta poanteaza la a . n linia 11 , pt1a este f|cut s| poanteze la aceeai adres| cu pta , deci de acum i pt1a poanteaz| la a si *pt1a se poate folosi n locul lui a pentru c| sunt identice. printf() din linia 22 , n care 112

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca se folosesc Construcii de Maini i de identificare a variabilei a , afieaz| de 3 ori aceeai Facultatea toate cele 3 modalit| valoare. Dei sunt declarate 3 variabile, n realitate spaiul folosit pentru stocarea valorii Catedra de Mecanic| i Programare ntregi este unul singur, corespunz |tor variabilei a . Curs de limbaj C
Modificarea valorii Toate drepturile sunt rezervate autorului. Copyright 2001. poantat| de poantori. Este poantate de posibil| ns| i modificarea poantor

Pn| acum n programul prezentat am extras valoarea numeric|

Multiplicarea acestui documentsubscop comercial este interzis|. acestei valori n controlul operatorului de atribuire. Aceasta se ilustreaz|la orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii participani n linia 24 n care i se atribuie valoarea uzul personal. , prin *pt1a . document pentru 22 variabilei a printf() din linia 26 cauzeaz| afiarea a noii valori, de 22 , de trei ori. Avem deci trei nume Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare alternative pentru o singur| variabil| pe a , Figura 9 pot multiplican Figura 9 se prezint| spacost i cu acordul scris al autorului. n acest *pta i *pt1a . documentul numai contra iul scop m| pentru contact| situaie. de date putei aceast| la: ANTAL Tiberiu Programul care urmeaz| conine o eroare - n jargonul programatorilor Alexandru plonia sau bug n englez|. 7 e-mail: antaltiberiu@pcnet.ro
/* PTR 2.C */ #include<stdio.h> int main(void) { Conf. dr. ing.*ptb; ANTAL int b,

O eroare aceasta tel.: 0040-264-530918 7 eroare se numeste comun|


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca b=13; Facultatea Construcii de Maini prin Mecanic| "); Catedra de tf("b= % i\ni Programare Curs de limbaj C *ptb=7;
prin tf("b= % i\n "); return 0; }

Figura 10

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Starea spaiului de date a programului, cnd se ajunge la linia 12 , se prezint| n Figura Sudenii participani la orice form| de; s| se modifice valoarea stocat| n variabila b . Din 10. Probabil sperai ca prin linia *ptb=7 nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. p|cate, linia ptb=&b; lipsete i pentru c| ptb este o variabil| local| au to , va fi iniializat| cu o valoare aleatoare. Presupunnd ca tipul int se stocheaz| pe 4 octei, linia 12 va suprascrie 4 octei din RAM form| de nv||mnt cu plat| sau alte foarte pu in probabil Sudenii participani la oricencepnd cu adresa stocat| n ptb. Este persoane doritoare ca cei 4 octei sdocumentul numai contra cost ibcu acordul scris al se poate face oriunde, pot multiplica | fie chiar cei corespunz|tori lui . Practic, scrierea autorului. n acest inclusiv n segmentul de la: caz n care programul va "cr|pa" subit. Scrierea n segmentul scop m| putei contact| cod, de date, n stiv| i pe heap este permis|, ns| va avea ca efect modificarea la valori aleatoare a unor obiecte care vor duce cel puin la rezulate eronate. Este posibil s| apar| ANTAL Tiberiu Alexandru i un caz mai deosebit de scriere n afara zonelor de adres| puse la dispoziia programului tel.: |tre sistemul de operare. Dac| sistemul de operare lucreaz| cu protecie (UNIX sau de c 0040-264-530918 e-mail: antaltiberiu@pcnet.ro ucis nainte de a apuca s| fac| ceva r|u. Sub vechiul Windows NT) programul este MS-DOS, el va corupe o parte din propriul lui cod, al altui program sau cel al DOS-ului. Rezultate "ciudate" vor fi observate n programul actual sau n altele, dup| caz. n W indow s, o astfel de eroare produce terminarea aplicaiei cu mesajul "General Protection Fa ult ".
113

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Cea mai sigur| metod| de iniializare a unui poantor este iniializarea n Facultatea Iniializarea Construcii de Maini linia declaraiei lui. Astfel, pentru exemplul anterior, n loc int b, *ptb; Catedra poantorilor de Mecanic| i Programare se poate scrie int b, *ptb=&b;. Curs de limbaj C

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

8.4 Ce este NULL?

Copyright 2001. Toate drepturile sunt rezervate autorului. Am v|zut dejaacestui document n scop comercial este interzis|. Multiplicarea c| exist| posibilitatea definirii unor constante folosind directiva #define a preprocesorului. NULL este o astfel de valoare definit| n mai multe fiiere antet (de exemplu n std io.h ). Ea indic| faptul c| poantorul care ia aceast| valoare special| nu Sudenii participani la orice form| de | declaraia superior bugetar pot multiplica acest, poanteaz| adresa unui obiect C. Dac nv||mnt unei variabile poantor este global| document pentru uzulvor iniializa variabila poantor cu valoarea special| NULL . Secvena compilatoarele ANSI personal. de bii corespunz|toare lui NULL nu este neap|rat valoarea numeric| zero, fiind Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare | dependent| de compilatorul specific pe care lucr|m. Pentru a face codurile surs compatibile ntre diferite compilatoare a cost i cu acordul scris al autorului. n acest pot multiplica documentul numai contra fost necesar| reprezentarea poantorului NULL printr-un macro. NULL este de fapt numele acestui macro. Setarea unui poantor folosind scop m| putei contact| la: acest macro se face printr-o atribuire de forma ptb = NULL . De asemenea, aceast| valoare special| poate fi testat| n expresii pentru a verifica dac| un poantor este sau nu iniializat. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 /* PTR 3.C */ e-mail: antaltiberiu@pcnet.ro #include<stdio.h>
int *ptb; int main(void) { int b; /* int *ptb=N UL L; */ b=13; Conf. dr. ing. ANTAL Tiberiu prin tf("b= % i\n ",b);

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini if (ptb == NULL) prin tf("poan toru l ptb Catedra de Mecanic| i Programare e ste in valid!\ n"); else Curs de limbaj C
{

Copyright 2001. Toate drepturile sunt rezervate autorului. prin tf("b= % i\n ",b);
}

*ptb=7;

Multiplicarea acestui document n scop comercial este interzis|.


return 0; }

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. o variabil| global|, motiv pentru care este iniializat| n programul anterior, ptb este automat cu valoarea NULL . Dac| ar fi fost local|, iniializarea trebuia f|cut| explicit de noi ca i n participani la orice form| de nv||mnt cu nici sau alte nici explicit, avem Sudeniilinia 8. n cazul cnd iniializarea nu se face plat|automat,persoane doritoare o problem|, pentru ca nu avem de unde s| cost i cu|acordul scris al autorului. n acest 7 pot multiplica documentul numai contra tim dac valoarea poantat| este una real| sau "gunoi", detecia cu un if , ca n exemplul anterior, neputndu-ne salva de la dezastru. scop m| putei contact| la:

8.5 Poantorii si argumentele functiilor ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
114

n programul EX TE RN .C din paragraful 6.6 am prezentat un program care citea dou| numere reale, apoi calcula i afia ctul lor. Implementarea dat| folosea variabile globale. Implementarea care urmeaz| folosete variabile locale i transferul de parametri prin

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca poantori. Am spus deja laMaini prin valoare c| funcia apelat| nu are cum s| modifice Facultatea Construcii de apelul valorile variabilelor pe Programare Catedra de Mecanic| i post de argumente din funcia apelant| pentru c| se transfer| numai o copie a lor prin stiv|. Soluia este s| apeleze funcia cu poantori la parametri. Curs de limbaj C Majoritatea programatorilor aleg transferul valorilor de obiect prin adres| i nu prin

valoare, din motive de cretere a vitezei de execuie a programului. De asemenea, metoda Copyright 2001. singura care permite modificarea valorilor variabilelor ale c|ror adrese de transfer este Toate drepturile sunt rezervate autorului. s-au transferat ca argumente din interiorul funciei care s-a apelat. Multiplicarea acestui document n scop comercial este interzis|.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 /* AP ELP TR .C */ #include<conio.h> Sudenii participani la orice form| #include<stdio.h> document pentru uzul personal. #include<float.h>

de nv||mnt superior bugetar pot multiplica acest

/*Prototipu rile functiilor din prog ram */ Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare void cite ste_ 2_ rea li(float *d eim pa rtit, float *im pa rtitor); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest float calcule aza _ci tul(floa t deim pa rtit, float im pa rtitor); scop m| putei_ci tul(floa t cit); void a fiseaza contact| la: c on st flo Tiberiu Alexandru ANTAL at IN F IN IT = F LT _M A X ;

tel.: 0040-264-530918 /* functia m ain() - punctu l de e-mail: antaltiberiu@pcnet.ro int main(void)


{

intrare in p rogram */

Conf. Universitatea Tenhic| din Cluj-Napoca return 0; Facultatea Construcii de Maini } Catedra de fun ctiei i Programare /* sfarsitul Mecanic| main () */ Curs de limbaj C

floa t cit,d eim pa rtit,im pa rtito r; /* 3 variab ile locale */ do { cite ste_2 _rea li(& de im pa rtit,& im pa rtito r); cit=ca lculeaz a_ citu l(deim pa rtit,im pa rtitor); afis eaza_ citu l(cit); } wh ile (ge tch() != 'i'); dr. ing. ANTAL Tiberiu Alexandru

/* definitiile functiilor */ void citeste_2_reali(float *deimp artit, float *impartitor) Copyright 2001. Toate drepturile sunt rezervate autorului. { prin tf("Ba ga 2 nu m ere, deim pa rtit si im pa rtitor: "); sca nf("%f %f",d eim pa rtit,im pa rtito r); Multiplicarea acestui document n scop comercial este interzis|. }

Sudenii participani la orice deimpa rtit, float impartitor) bugetar pot multiplica acest float calculeaza_citul(float form| de nv||mnt superior document pentru uzul personal. {
if (impartitor == 0.0F) retu rn(IN FIN Sudenii participani la oriceIT); form| de nv||mnt cu plat| sau alte persoane doritoare else pot multiplicaretu rn(d eim pa rtit/im pa rtitor);i cu acordul scris al autorului. n acest documentul numai contra cost scop m| putei contact| la: } void a fiseaza _ci tul(floa t cit) ANTAL Tiberiu Alexandru { tel.: 0040-264-530918 if (cit == INFINIT) e-mail: antaltiberiu@pcnet.ro n ed efin it\n "); prin tf("Citu l este else prin tf("Citu l este % f\n ",cit); }

115

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Liniile modificate fa| de Maini Facultatea Construcii de implementarea din programul EX TE RN .C s-au marcat prin culoarea de Mecanic| i Programare prin citeste_2_ rea li(&d eim pa rtit,& im pa rtitor); se Catedra gri a fondului. n linia 18 , apeleaz| funcia citeste_2_rea li() cu dou| argumente ce sunt adresele variabilelor Curs parlimbaj C de tit i impartitor . Evident, declaraia funciei a fost i ea modificat| de la void deim
cites te_2_ rea li(); la void citeste_2_reali(float *deimpartit, float *impartitor); . Se observ| Copyright 2001. Toate drepturile sunt rezervate autorului. c| cei doi parametri sunt poantori la tipul float, ca urmare orice modificare a lor n corpul funciei cite ste_2 _rea li() se va reflecta i asupra valorilor variabilelor deim par tit i impartitor din func document n scop comercial este interzis|. Multiplicarea acestuiia apelant| main() . La revenirea din cite ste_2 _rea li() valorile variabielor deim par tit i impartitor vor fi modificate datorita funciei sca nf(). Aceasta, 7

dup| primul argument are caform| de nv||mnt superior bugetar pot motiv, de obicei, Sudenii participani la orice argumente adrese de variabile. Din acest multiplica acest numele variabilelor n care se vor citi valori trebuie s| fie precedate de operatorul & . Aici document pentru uzul personal. nu este cazul pentru c| aceste variabile stocheaz| ele nsele adrese, fiind poantori. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

8.6 Functii cu numar variabil de 7 parametri ANTAL Tiberiu Alexandru

Unele funcii C cum tel.: 0040-264-530918ar fi printf() accept| un num|r variabil de argumente pe lng| un num|r antaltiberiu@pcnet.ro Declaraia de funcie unde ultimul argument din lista e-mail: fixat de argumente. argumentelor este o virgul| urmat| de suit| de 3 puncte ",..." va lucra cu un num|r variabil de argumente. Este necesar s| existe cel puin un argument fix, chiar dac| acesta nu va fi folosit ulterior, pentru a putea accesa lista argumentelor variabile. Varianta portabil| de acces la argumentele acestor funcii s-a implementat n C prin intermediul unor macrodefiniii ale c|ror nume ncep cu va _... . Acestea sunt folosite Conf. dr. ing. ANTAL Tiberiu Alexandru pentru a parcurge lista argumentelor cnd funcia apelat| nu tie num|rul i tipul Universitatea Tenhic| din Cluj-Napoca n acest scop sunt: acestora. Prototipurile funciilor utilizate Facultatea Construcii de Maini tip va_arg(va_list arg _p tr, tip); Catedra de Mecanic| i Programare void va_end(va_list arg _p tr); Curs de limbaj C
void v a_ star t(va_list arg _p tr, pre v_ pa ram );

Copyright 2001. Toate este "stdarg.h" . rezervate autorului. iar fiierul de prototip drepturile sunt Multiplicarea acestui document informaia necesar| lui va_a rg va_list este un tablou care ine n scop comercial este interzis|.

i va_end. Cnd funcia apelat| folosete un num|r variabil de argumente n ea se declar| o variabil| arg _p tr de
tipul va_list . Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. va_start este un macro care cere 2 parametri, arg _p tr i prev_param ce vor fi explicai n continuare. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplicaun macro care devine o expresiecu acordul iscris i valoare cu n acest documentul numai contra cost i de acela tip al autorului. urm|torul va_a rg este scop m| putei contact| la: prima utilizare a lui arg_p tr ntoarce primul argument din argument de transferat. La list|. prev_param este numele parametrului obligatoriu precednd imediat primul ANTAL Tiberiu Alexandru. Fiecare utilizare succesiv| ntoarce urm|torul argument al argument opional din list| listei. Aceasta se face tel.: 0040-264-530918 prin dereferenierea lui prev_param i apoi prin incrementarea lui pentru a poanta la urm|torul parametru. va_a rg folosete tip pentru a realiza e-mail: antaltiberiu@pcnet.ro dereferenierea i localizarea urm|torului argument. La fiecare apel succesiv a lui va_a rg se modific| prev_param pentu a poanta la urm|torul parametru din list|. va_end ajut| funcia apelat| s| revin| la normal. va_end poate modifica pe prev_param aa nct s| nu mai poat| fi folosit| dect dup| reapelarea lui va_a rg .
116

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca va_end va fi apelat| dup| ce va_a rg a citit to i parametrii, altfel programul putnd s| o Facultatea Construcii de Maini ia razna. de Mecanic| i Programareilustreaz| modul de lucru cu aceste macrodefiniii: Catedra Programele care urmeaz| Curs de limbaj C /* VA LST 1.C */
#include<stdio.h> #include<stdarg.h> Copyright 2001. Toate #include<limits.h>

drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. void m inim (char *for m at, ...)
{ int min; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest va_list arg_ptr; document pentru uzul personal. int arg;

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare va _start(a rg_ ptr, form at); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest m in=v a_ arg (arg la: scop m| putei contact| _p tr, int);
prin tf("%d ", min);

ANTAL Tiberiu Alexandru while ((arg = va_arg(arg_ptr, { tel.: 0040-264-530918 prin tf("%i ", a rg); e-mail: antaltiberiu@pcnet.ro
if (min > arg) min=arg; } va _e nd (arg _p tr); prin tf(form at, m in); }

int)) != INT_MAX)

Conf. dr. ing. ANTAL Tiberiu Alexandru int main(void) { Universitatea Tenhic| din Cluj-Napoca m inim ("\n M inim ul este: Facultatea Construcii de Maini% i\n ",1,12,2,3,4,5,3,INT_ M AX ); Catedra de Mecanic| i Programare return 0; Curs de limbaj C } Rezultate: Copyright 2001. Toate drepturile sunt rezervate autorului.
1 12 2 3 4 5 3 Minimul este: 1

Multiplicarea acestui document n scop comercial este interzis|. Pentru programul urm|tor, funcional n varianta prezentat| mai jos, v| propun s| Sudeniii participani|la orice form| de nv||mnt de doub le . ncerca s|-l facei s lucreze cu valori float n loc superior bugetar pot multiplica acest document pentru uzul personal.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /* VA LST 2.C */

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare #include<stdio.h> pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest #include<stdarg.h> scop m| putei contact| la:
do ub le m ed ar(int n, d ou ble *m ax , ...) { ANTAL Tiberiu Alexandru double s, arg; tel.: 0040-264-530918 int i; e-mail:va_list arg_ptr; antaltiberiu@pcnet.ro va _start(a rg_ ptr, m ax ); *m ax =va _a rg(a rg_ ptr, d ou ble); prin tf("%5 .3f ", *m ax ); 117

Capitolul 8 - Poantori Conf. dr. ing. ANTAL 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca for Facultatea (i=1;i<n;i++) de Maini Construcii { Catedra de Mecanic| i Programare_p tr, dou ble)); s+= (arg = v a_ arg (arg Curs de limbaj C tf("%5 .3f ", arg); prin
if (*max < arg) *max=arg;

Copyright 2001. Toate drepturile sunt rezervate autorului.


va _e nd (arg _p tr);

Multiplicarea acestui document n scop comercial este interzis|. return s/n;


}

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int main(void) document pentru uzul personal. {
double fmax; prin tf("\n M ed ia a ritm etica este: %10.5 f\n cu ed ar(4 , alte persoane doritoare Sudenii participani la orice form| de nv||mnt ", mplat| sau&fm ax , 1.0, 4.0,3.0, -4.0)); prin tf("M ax im ul este: % f\n ", fm ax );

pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei 0; return contact| la:
}

ANTAL Tiberiu Alexandru Rezultate: tel.: 0040-264-530918 1.000 4.000 3.000 -4.000 e-mail:aritmetica este: antaltiberiu@pcnet.ro 0.75000 Media
Maximul este: 4.000000

Cnd argumente de tip char sunt transferate ca argumente variabile ele se convertesc automat la tipul int. Similar, argumentele de tipul float se convertesc automat la tipul doub le n cazul argumentelor variabile. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini C permite declarareaide poantori la orice tip, inclusiv declararea unui poantor la un Catedra de Mecanic| Programare poantor la un tip Curs de limbaj C oarecare.

8.7 Poantori la poantori


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /* PTR PTR .C */ Copyright 2001. Toate #include<stdio.h>

drepturile sunt rezervate autorului.

int main(void) Multiplicarea acestui document n scop comercial este interzis|. { int a=7; Sudenii participani la orice form| de nv||mnt superior bugetar int *pta; document pentru uzul personal. int **ptpta;

pot multiplica acest

pta=&a; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare ptpta=&pta; pot multiplica documentul numai ,a); contra cost i cu acordul scris al autorului. n acest prin tf("%p a: [%i]\n ",&a scop m| putei contact| la: -> [%i]\n",&p ta,pta ,*pta ); prin tf("%p pta: [%p] prin tf("%p ptpta : [%p] -> [%i]\n",&p tpta,p tpta ,**ptp ta);

ANTAL Tiberiu Alexandru retu rn(0 ); tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro } Rezultate:
0065FDF4 0065FDF0 a: [7] pta: [0065FDF4] -> [7] 118

Capitolul 8 - Poantori Conf. dr. ing. ANTAL

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca 0065FDEC ptpta: [0065FDF0] -> [7] Facultatea Construcii de Maini Catedra de Mecanic| iaProgramare | n programul anterior este o variabil Curs de int, pta C un poantor la un tip de tipul limbaj este int, iar ptpta este un poantor la un Copyright 2001. Toate drepturile sunt n poantor de tipul int. Spaiul datelor, rezervate autorului. starea final|, se prezint| n Figura 11. n desen m|rimea locaiilor simbolizate sub Multiplicarea acestui document n scop comercial este interzis|. forma dreptunghiurilor este aceeai. Am presupusparticipani la orice i poantorii Sudenii c| att tipul int ct form| de nv||mnt superior bugetar pot multiplica acest se reprezint| pe 4 uzulpersonal. grup de Figura 11 document pentru octe i, iar unui 4 octei i corespune cte un dreptunghi. Deasupra fiec|rui dreptunghi st| scris| adresa de nceput a primului dintre cei 4 octei Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare consecutivi, folosii la stocarea respectivei variabile. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

8.8 Tiberiu Alexandru la functii Poantori ANTAL

n C, numele unei funcii este un poantor constant la nceputul codului funciei. Pentru c| tel.: 0040-264-530918definit ca un poantor la funcia respectiv|, numele funciei se poate numele funciei este e-mail: unei variabile poantor la funcie. O variabil| poantor la funcie poate fi transferat| atribui antaltiberiu@pcnet.ro ca parametru unei alte funcii i poate fi folosit| ntr-o funcie pentru apelarea funciei la care poanteaz|. Modul declaraiei variabilei poantor la funcie se prezint| n continuare.
Form a : 7 tip (*variabila_poantor_la_funct ie) (lista de p ara m etri) 7

Conf. dr.permis| efectuarea de operaii aritmetice cu o variabil| poantor la funcie. De Nu este ing. ANTAL Tiberiu Alexandru Universitatea poate "lua valoarea" n urma unei atribuiri, numai a unei funcii cu acelai asemenea ea Tenhic| din Cluj-Napoca Facultatea Construcii cu acelai tip de valoare ntoars| cu cele specificate n declaraia ei. num|r de parametri i de Maini Catedra de Mecanic| i Programare urm|tor: Un exemplu se prezint| n programul Curs de limbaj C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 /* PTR FN C.C */ #include <stdio.h> Copyright<ctype.h> 2001. Toate drepturile sunt rezervate autorului. #include #include <conio.h> cha r iesire(in acestui document n scop comercial este interzis|. Multiplicarea t c); cha r fisie re(in t c); cha r ed itare (int c); Sudenii participani la orice form| de nv||mnt superior bugetar cha r altcara cter(in t c);

pot multiplica acest

document pentru uzul personal.

/* ptrfunctie se declara ca poantor la o functie ce primeste ca parametru de intrare o valoare int si ntoarce o va loare de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice form| cha r */ cha r (*ptrfun ctie)(in t);

pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: m ain ()
{ int ch; ANTAL Tiberiu Alexandru for(;;) tel.: 0040-264-530918 { e-mail: antaltiberiu@pcnet.ro ()); ch= tou pper(getch sw itch (ch) { case 'I': ptrfunctie=iesire; break; case 'F': ptrfunctie=fisiere; break; case 'E': ptrfunctie=editare; break; default: ptrfunctie=altcaracter; 119

Capitolul 8 - Poantori Conf. dr. ing. ANTAL 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini fu nctia prin p oantoru l /* aici se ape leaza Catedra de Mecanic| i Programare goto treispe; if ('I' == (ptrfunctie)(ch)) Curs de limbaj C }
treis pe: p rintf("Ga ta, ai IES IT !\n"); Copyright 2001. Toate drepturile sunt }

la ea */

rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. char iesire(int c) { prin tf("\a i ap asa t %c s i esti in fun ctia: IE Sudenii participani la orice form| de nv||mnt SIR E\ n",c); superior bugetar return c; document pentru uzul personal. }

pot multiplica acest

char fisiere(int c) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul c si es ti in fu nctiaiFISIER E\ n",c); al autorului. n acest numai contra cost : cu acordul scris prin tf("ai a pa sat % scop m| putei c; return contact| la: }

ANTAL Tiberiu Alexandru char editare(int c) tel.: 0040-264-530918 { e-mail:prin tf("ai a pa sat % c si antaltiberiu@pcnet.ro
return c; }

es ti in fu nctia : ED ITA RE \n ",c);

char altcaracter(int c) { prin tf("ai a pa sat % c si N U S TIU ce doresti ... \n",c); return c; Conf. dr. ing. ANTAL Tiberiu Alexandru }

Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Aici linia cha r (*ptrfun ctie)(in t) declar| un poantor cu numele ptrfu nctie la o funcie care Catedra de Mecanic| i Programare ntoarce o valoare char. Toate funciile care sunt are un parametru de intrare int i Curs de prin acest poantor la funcie ntorc tipul char i un singur parametru de intrare apelate limbaj C de tipul int. Copyright 2001. Toate drepturile sunt rezervate autorului. O variabil| poantor la o funcie ascunde o facilitate foarte puternic| de programare. Nu recomand aceast| tehnic| de lucru ncep|torilor, dar am meionat-o ntruct conceptul Multiplicarea acestui document n scop comercial este interzis|. intimideaz|, fiind privit ca ceva dificil de abordat. Dup| cum vedei nu este chiar aa! Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

120

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. abloul este o colect ie de date identice ca tip, distincte nsa prin indice . Num|rul 7 de dimensiunila orice form| depinde de limbaj, dar n general, nu este limitat. O ale tabloului de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani variabil| obinuit| - un scalar - poate fi privit| ca un tablou cu dimensiunea zero. pot tablou cu o documentul numai contra cost i cu acordul scris"vector", iar unul acest | multiplica singur| dimensiune este cunoscut sub numele de al autorului. n cu dou Un scop m| putei contact| la: de "matrice". n majoritatea limbajelor imperative, o referin| dimensiuni sub denumirea la un element de tablou se scrie sub forma a[i,j] unde, a este nu m ele tabloului , iar i i j ANTAL Tiberiu Alexandru sunt indici . Elementele tabloului sunt de obicei stocate n locaii de memorie consecutive. tel.: 0040-264-530918 Limbajele difer| de obicei prin metoda de stocare a datelor pe rnduri continue sau pe coloane continue. e-mail: antaltiberiu@pcnet.ro

9 Tablouri

Tablourile sunt folosite pentru stocarea unui grup de valori care se vor accesa ntr-o ordine imprevizibil| (de exemplu, o structur| de dat| numit| list| se preteaz| mult mai bine pentru stocarea unor valori care se acceseaz| secvenial).

9.1 Declararea tablourilor

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Un tablou se declar| folsind un tip , un n um e de variabil| i o list| de constante cuprinse Facultatea Construcii de Maini ntre paranteze dreptunghiulare care definesc dim en siu nile tabloului. Catedra de Mecanic| i Programare Curs de limbaj C Form a : 7 tip n um e[d im en siu ne 1][dim en siu ne 2] ... [dim en siu ne N ]; Copyright 2001. Toate drepturile sunt rezervate autorului. Pentru a declara un tablou cu o singura dimensiune de 7 elemente de tipul int, cu numele 7 a , scriem: Multiplicarea acestui document n scop comercial este interzis|.
int a[7];

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest documentopentru uzul personal. cele 7 elemente ale tabloului a se vor aloca consecutiv n C este regul| c| spaiul pentru n memoria fizic|. Astfel, putem spune de exemplu c| al doilea element este adiacent cu Sudenii participani la orice form| .a.m.d. al treilea, al patrulea cu al cincelea de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Pentru declara un tablou scop m|aputei contact| la: cu 2 dimensiuni, prima de 5 , a doua de 3 de tipul float, cu numele m , scriem: ANTAL Tiberiu Alexandru floa t m [5][3]; tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro C poate lucra cu orice tipuri de elemente, inclusiv structuri sau reuniuni (care vor fi discutate n capitolele urm|toare), cu excepia tipului void . Este obligatoriu ca ntre parantezele dreptunghiulare s| fie scris| o expresie constant|, ntreag| i pozitiv|. n locul declaraiei anterioare a lui m se poate scrie:
121

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca #d efine D 1 5 Facultatea Construcii de Maini #define D2 3 Catedra de Mecanic| i Programare floa t m [D1 ][D2 ]; Curs de limbaj C Nu sunt ns| corecte urm|toarele forme de declaraie: int d1=5; con Copyright 2001. Toate drepturile sunt rezervate autorului. st int d2=3 i const floa t m [d1][d2];

Multiplicarea acestui document n scop comercial este interzis|.

in t c1=5; int c2=3 floa t m [c1][c2 ];

Dei c1 c2 sunt evident constante, compilatorul nu va accepta aceast| multiplica acest Sudenii iparticipani la orice form| de nv||mnt superior bugetar potform| de scriere. ntre parantezele drepte pot s| apar| numai expresii constante (termenii acestor expresii document pentru uzul personal. sunt valori numerice constante).
Iniializarea pot multiplica documentul numai contra cost i cu acordultablou. autorului. ndefiniia iniializarea fiec|rui element de scris al Sintactic, acest tablourilor putei contact| la: scop m|

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Un tablou este format din elemente. Iniializarea tabloului presupune iniializatorului de tablou este recursiv| i are forma:

ANTAL Tiberiu Alexandru <init ializator>::= expresie constanta | <{lista de init ializare}> | <{lista de init ializa re,}> 7 7 7 tel.: 0040-264-530918 <lista de init ializare>::= <init ializator> | <lista de init ializare>, <init ializator> 7 7 e-mail: antaltiberiu@pcnet.ro este o list| init ializator separat| prin virgule. Fiecare init ializator din list| este, fie o expresie constant|, fie o alt| lista de init ializare. Astfel, listele pot fi 7 cuprinse unele n altele.
lista de init ializare 7 -

Dac| tabloul are o singur| dimensiune, se scrie o singur| list| cu valorile de iniializare Conf. dr. prin ANTAL Tiberiu Alexandru separate ing. virgule. Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de int a[7] ={1,-4,2,28,7 ,67,99}; Maini Catedra de Mecanic| i Programare Sub de limbaj C Cursaceast| form| de scriere toate cele 7 elem en te ale tabloului unidimensional a sunt iniializate. Ordinea valorilor din list| este i cea de atribuire la elementele de tablou. Astfel, primul element va lua valoarea 1rezervate autorului. | num|rul de valori este mai Copyright 2001. Toate drepturile sunt , al doilea -4 , etc. Dac mic dect cel al elementelor de tablou, iniializarea se face la fel, adic| n ordinea valorilor din list| pn| cnd se epuizeaz| toate valorile listei. Elementele r|mase neinializate vor Multiplicarea acestui document n0scop comercial este interzis|. fi iniializate automat cu valoarea . Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int b[7 ]={1}; document pentru uzul personal. Mai sus, primul element din b este iniializat cu valoarea 1 , celelalte cu valoarea 0 . Un alt caz este participani la orice form| de tabloului nu sunt specificate, dar sunt specificate Sudenii cnd num|rul de elemente ale nv||mnt cu plat| sau alte persoane doritoare un num|r oarecare de valori pentru iniializare. n acest cazscris al autorului. nnum|rul pot multiplica documentul numai contra cost i cu acordul compilatorul va fixa acest de elemente alecontact| la: cel al valorilor de iniializare, atribuirea acestora la elementele scop m| putei tabloului la de tablou facndu-se n ordinea apariiei n list|. ANTAL ,3,4}; Tiberiu Alexandru int c={1,2 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Mai sus c este un tablou unidimensional cu 4 elem en te , primul este iniializat cu valoarea 1 , al doilea cu valoarea 2 , etc. Iniializarea unui tablou bidimensional se face astfel:
122

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int m[3][2]= { Facultatea Construcii de Maini {2, 8}, Catedra de Mecanic|{0, Programare i 7}, Curs de limbaj C {6, 7,}, };

Copyright 2001. Toate drepturile sunt rezervate autorului. Tabloul m are dou | dimensiuni , p rim a cu 3 elem en te , a doua cu 2 . El corespunde unei ma trice cu 3 linii i 2 coloane . Se iniializeaz| prim a linie cu 2 respectiv cu 8 , a doua cu Multiplicarea acestuiidocument n scop din linia este interzis|. | dup| ultima expresie comercial 3 au o virgul 0 i 7 etc. Observa c| iniializatorii constant|. Aceste virgule sunt permise, dar nu obligatorii i separ| o expresie constant| Sudenii participanisepar| oform| de nv||mntializare) bugetar pot multiplica acest de alta. Cele care la orice list| (lista de init superior de alta sau un iniializator 7 document pentru altul personal. obligatorii. (init ializator) de uzul sunt ns| Sudenii Limit|ri ale participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare iniializa un element din cu acordul scris al autorului. n acest pot multiplica documentul numai contra cost i mijloc, f|r| iniializarea elementelor iniializ|rilor anterioare. scop m| putei contact| la: Nu se poate specifica un factor de repetiie pentru iniializ|ri sau

9.2 Accesul la elementele de tablou


ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Numerotarea elementelor de tablou ncepe de la zero. e-mail: antaltiberiu@pcnet.ro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 /* TA B1.C */ #include <stdio.h> int main(void) { int a[7], d1, i;

Conf. dr. ing.eof a/ sizeof a[0 ]; /* d1 = 7 nr. elem entelor de tab lou ANTAL Tiberiu Alexandru d1=siz Universitatea Tenhic| din Cluj-Napoca /* eleme ntele prim esc de Maini Facultatea Construcii valori intr-o ord ine oarec are */ a[0]=5; a[2]=13; i Programare Catedra de Mecanic| a[5]=67; a[6]=28; a[1+2]=3; a[3/2]=1; a[2*2]=7; Curs de limbaj C m en tele ta blou lui a su nt: "); prin tf("Ele
for 2001. Toate Copyright (i=0;i<d1;i++) drepturile sunt rezervate autorului. prin tf("%-4 i", a[i]);

*/

Multiplicarea acestui document n scopsunt: "); este interzis|. comercial prin tf("\n Ind icii ta blou lui a
for (i=0;i<d1;i++) Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest prin tf("%-4 i", i); document pentru uzul personal.

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare for (i=0;i<d1;i++) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteiprin tf("%-9 p", & a[i]); contact| la:
prin tf ("\n ");

prin tf("\n Ad resele elem en telor s un t: ");

ANTAL Tiberiu Alexandru return 0; } tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Rezultate:

Figura 12

Elementele tabloului a sunt: 5 1 13 3 7 67 28 Indicii tabloului a sunt: 0 1 2 3 4 5 6 Adresele elementelor sunt: 0065FDDC 0065FDE0 0065FDE4 0065FDE8 0065FDEC 0065FDF0 0065FDF4

123

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Observai cConstrucii de Maini de tablou sunt consecutive. Primul element are indicele Facultatea | adresele elementelor zero , al doilea unu , ultimul indice ia valoarea num|rului total de elemente ale tabloului Catedra de Mecanic| i Programare minus o unitate. n Figura 12 se prezint| spaiul de date al programului corespunz|tor Curs de limbaj Ca . Tabloul are o dimensiune i 7 ele m en te . Conform celor spuse, indicii variabilei tablou

pot varia de la 0 la 6=7-1 . n C nu se verific| dac| indicele se ncadreaz| n domeniul Copyright 2001. Toate drepturileexemplu a[7]=0 care are un indice incorect. Pentru acest permis. Este simplu s| scriem de sunt rezervate autorului. caz, orice ar fi stocat n locaiile de memorie urm|toare lui a[6] s-ar suprascrie cu valoarea lui a[7], valorile numerice stocate acolo prin intermediul altor variabile devenind corupte. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

9.3 Operatorul de indexare al Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare tablourilor numai contra cost i cu acordul scris al autorului. n acest pot multiplica documentul
scop m| putei contact| la: Form a : 7 expresie1[expresie2]

ANTAL Tiberiu Alexandru O expresie1 urmat| de tel.: 0040-264-530918 operatorul [expresie2] specific| indexarea unui tablou. Una dintre expresii trebuie s| fie un poantor sau un tip tablou, adic| s| fie declarat| sub una dintre e-mail: antaltiberiu@pcnet.ro formele: tip* , tip[ ] . Cealalt| trebuie s| fie de tip ntreg. Forma de utilizare comun| este cea n care expresia de tip ntreg este ntre parantezele drepte. Operatorul adres| este comutativ, deci expresie1[expresie2] i expr esie2[exp resie1] sunt echivalente pentru c| rezultatul operatorului de indexare se calculeaz| prin definiie cu expresia: *((exp resie2)+(expre sie1 )). Conf. dr. ing. ANTAL Tiberiu Alexandru int a[10],a2; Tenhic| din Cluj-Napoca Universitatea a2 =a[1]; Facultatea Construcii de Maini a2 =1[a ]; Catedra de Mecanic| i Programare Curs de element al taboului este 0 . Astfel, domeniul indicelui pentru un tablou cu o Primul limbaj C dimensiune i n elemente este de la tablou[0] pn| la tablou[n-1] . Copyright 2001. Toate drepturile sunt rezervate autorului.

9.4 Conversia numelor de tablouri n Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest poantori personal. document pentru uzul
Multiplicarea acestui document n scop comercial este interzis|.

Dac| tipul unei expresii sau subexpresii este "tablou cu elemente de tipul T", valoarea acestei expresii se va descompune ntr-un poantor la primul element din tablou, iar tipul Sudenii participani la la tipul T. Aceast| conversie nu se va realiza dac| expresia este expresiei va fi poantor orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numaioperatorul adres| (& ), operatorulautorului. n acest ), operandul urm|torilor operatori: contra cost i cu acordul scris al de incrementare (++ scop m| puteidecrementare (-- ) sau operatorul sizeof. operatorul de contact| la:
1 2 3 4 5 6 7 8 9 /* TA B2.C */ ANTAL Tiberiu Alexandru #include<stdio.h>

tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro int main(void)


{ floa t x[10]; float *ptx, *pt1x; pt1x= &x[0 ]; 124

10 11 12 13 14 15 return 0; Copyright 2001. 16 }

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca ptx=x; Facultatea Construcii de Maini Catedra de tf("ad resa i Programare en t (x[0]) din prin Mecanic| prim ulu i elem Curs de limbaj C = %p si pt1x =%p ", ptx , pt1x ); prin tf("ptx

tab lou l x es te: %p \n ", &x [0]);

Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Rezultate:


adresa primului element (x[0]) din tabloul x este: 0065FDD0 ptx= 0065FDD0 si pt1x =0065FDD0 nv||mnt superior bugetar pot Sudenii participani la orice form| de

multiplica acest

document pentru uzul personal. n Figura 13 se prezint| spaiul de date al programului TAB2.C. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Observa i c| adresa primului pot multiplica documentul numaisi element de tablou se poate g| contra cost i cu acordul scris al autorului. n acest scop m| puteimetode, la: prin dou| contact| fie prin aplicarea operatorului adres| ANTAL Tiberiuelement de tablou, asupra primului Alexandru care se scrie &x[0] tel.: 0040-264-530918 , fie prin aplicarea aceluiai operator asupra Figura 13 e-mail: antaltiberiu@pcnet.ro numelui tabloului, care se scrie & x . Adresa primului element se convertete ntr-un poantor constant la primul element al tabloului, motiv pentru care valoarea lui nu se poate modifica. Orice ncercare de modificare a acestei adrese este sancionat| de compilator, lucru normal din moment ce dac| aceast| adres| ar putea fi modificat|, compilatorul ar putea "uita" adresa de nceput a tabloului. Ca urmare a conversiei prezentate la operatorul de indexare se poate afirma Conf. dr. ing. ANTAL Tiberiu Alexandru folosit ca un poantor i invers, se poate indexa mai mult. n C numele unui tablou poate fi Universitatea un tablou. Dac| x este un tablou unidimensional, urm|toarele expresii sunt un poantor ca Tenhic| din Cluj-Napoca echivalente: (x + i) == &(x Maini Facultatea Construcii de [i]), *(x + i) == x[i] Catedra de Mecanic| i Programare Curs de limbaj C Exist| cteva diferene ntre un poantor la un tablou (ptx , pt1x ) i un Diferene ntre tablou (x[D1] ). Prima este alocarea de memorie. La declararea unui tablou i poantor tablou, compilatorul aloc| spaiul de memorie specificat prin num|rul de laCopyright 2001. Toate drepturile sunt rezervate autorului. tablou elemente ale dimensiunii automat. La declararea unui poantor la un tablou, utilizatorul trebuie s| aloce explicit spaiul pe heap prin folosirea Multiplicarea acestuim allo c() sau calloc(), eventualeste interzis|. uneia dintre funciile document n scop comercial s| atribuie poantorului o adres| a unui spaiu deja alocat. A doua diferena este aceea c| numele tabloului devine un poantor 7 Sudenii participani la orice form| de nv||mnt superior bugetar potla care poanteaz| constant la primul element de tablou. Fiind poantor constant, valoarea multiplica acest nu se poate modifica, n concluzie document pentru uzul personal. nu se pot efectua manipul|ri ale respectivei adrese. De exemplu, nu se poate scrie x++ , ns| se poate scrie ptx++ . Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

9.5 Calculul pozitiei si a valorii celui - ANTAL Tiberiu Alexandruelement de tablou de al i-elea tel.: 0040-264-530918

Elementul i - al tabloului x (vezi Figura 13) este accesat prin expresia x[i] . Pentru tabloul e-mail: antaltiberiu@pcnet.ro x unidimensional de reali - elemente de tipul float - procedura de calcul este urm|toarea: 1. Valoarea ntreag| a lui i este nmulit| cu num|rul de octei folosii pentru stocarea tipului float. Aceast| valoare calculat| va reprezenta a i -a poziie a tipului float fa| de adresa de nceput a lui x i se numete offset sau, pe romnete, deplasament . 2. Aceast| valoare se adun| la valoarea poantorului x , pentru a forma o adres| care
125

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca se afl| la i poziii float fa| de adresa lui x . Facultatea Construcii de Maini 3. Se aplic| operatorul de indirectare (* ) asupra acestei adrese, valoarea rezultat| Catedra de Mecanic| i Programare fiind valoarea elementului al i -lea din x . Curs de limbaj C

Conform celor spuse putem scrie x[i] = *(x +i*siz eof(flo at)) . Copyright 2001. Toate drepturile sunt rezervate autorului. x[0] reprezint| valoarea primului element din x , din moment ce offsetul corespunz|tor lui Multiplicarea acestui document n scop comercial este interzis|. x este 0 . O expresie de forma x[5] refera elementul cu offsetul 5 din x , adic| al 6 -lea 7 element din tablou. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

9.6 Aritmetica poantorilor

Puterea limbajul C la orice modul consistent i cu plat| sau alte persoane doritoare Sudenii participanivine din form| de nv||mnt sistematic de integrare ntr-un tot al tablourilor, poantorilor al aritmeticii adreselor. Operaii valide cu poantori sunt: pot multiplica documentuli numai contra cost i cu acordul scris al autorului. n acest atribuirea ntre poantori de acelai tip; adunarea sau sc|derea unui poantor la un ntreg; scop m| putei contact| la: adunarea, sc|derea i comparaia ntre elementele aceluiai tablou; atribuirea i comparaia cu NULL . ANTAL Tiberiu Alexandru
Adunareaantaltiberiu@pcnet.ro e-mail: dintre un ntreg. Adunarea lor decurge astfel: valoarea ntreag| este convertit| poantor i un ntreg

tel.: 0040-264-530918 Este corect| adunarea unui poantor la un element de tablou cu un ntr-un offset prin nmulirea acesteia cu dimensiunea elementului de tablou la care poanteaz| poantorul, apoi se face suma dintre valoarea stocat| n poantor i offset. Suma va fi un poantor de acelai tip cu poantorul original. El va poanta la un obiect al aceluiai tablou, pe baza valorii de offset calculate. Dac| ptr este un poantor la un element de tabloul de tipul T , atunci ptr+1 va poanta la urm|torul element din tabloul de tipul T . Dac| suma rezultat| este n afara limitelor tabloului, rezultatul este Conf. dr. ing. ANTAL Tiberiu Alexandru nedefinit. Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini /* TA B3.C */ Catedra de Mecanic| i Programare #include<stdio.h> Curs de limbaj C

1 2 3 4 int main(void) 5 { Copyright]={1,2,3 ,4,5}; drepturile sunt rezervate autorului. 2001. Toate 6 int x[5 7 8 Multiplicarea acestui document n scop comercial este interzis|. int *ptr; 9 10 ptr=x; Sudenii participani la orice%i, x [0] de nv||mnt superior bugetar pot multiplica acest form| =%i\ n", ptr, *ptr, x [0]); 11 prin tf("ptr = % p, *ptr = 12 document pentru uzul personal. 13 ptr++; 14 Sudenii participani la*ptr= % i, x[1] de i\n ", ptr, *ptr , x[1]); sau alte persoane doritoare prin tf("ptr+ + = %p , orice form| =% nv||mnt cu plat| 15 potptr+=3; multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 16 scop m|tf("ptr+ contact| *ptr = %i, x [4] =%i\n ", ptr, *ptr , x[4]); 17 prin putei =3 = % p, la: 18 19 ANTAL Tiberiu Alexandru return 0; 20 }

tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Rezultate:

ptr = 0065FDE4, *ptr= 1, x[0] =1 ptr++ = 0065FDE8, *ptr= 2, x[1] =2 ptr+=3 = 0065FDF4, *ptr= 5, x[4] =5

126

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n Figura Construcii de Maini de Facultatea 14 se prezint| spaiul date alde programului anterior Catedra Mecanic| i Programare ( TA B3 .C ). Poantorul ptr este Curs de limbaj C primului element iniializat cu adresa

al tabloului un idim ens ional x cu 5 Copyrightde tipul int.drepturile din rezervate autorului. elem en te 2001. Toate printf() sunt linia 11 va afia 1 pentru valoarea stocat| la adresa poantat| de ptr. scop comercial Multiplicarea acestui document nLa Figura 14 este interzis|. incrementarea poantorului, adresa stocat| n acesta nu va fiorice form| ci 0065FDE8. Compilatorul tie c| ptrmultiplica acest Sudenii participani la 0065FDE5, de nv||mnt superior bugetar pot este un poantor la tipul intpentruse stocheaz| pe 4 octei (sizeof (int) = 4). Astfel, va aduna 4 la adresa document , care uzul personal. 0065FDE4 , pentru incrementare. Putem spune c| la acest tip de adunare, valoarea num|rului ntreg adunat la adresa stocat| ntr-un poantor se "scaleaz|" prin dimensiunea Sudenii participani la oriceacesta. de nv||mnt cu plat| sau alte persoane doritoare obiectului la care poanteaz| form| pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Este corect| sc|derea unui ntreg dintr-un poantor. Aceasta se va Sc|derea dintre un realiza n aceleai condiii cu adunarea. poantor i un ntreg ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Este corect| i adunarea sau sc|derea a doi poantori la obiecte de acelai e-mail: i Adunareaantaltiberiu@pcnet.ro tip. Rezultatul este un ntreg cu semn reprezentnd valoarea offsetului sc|derea a dintre cele dou| obiecte poantor. Poantorii consecutivi difer| prin valoarea doi poantori 1. Valoarea este nedefinit| dac| poantorii nu poanteaz| la acelai obiect tablou.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /* TA B4.C */ #include<stdio.h> Conf. dr. ing. ANTAL

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int main(void) Facultatea Construcii de Maini { Catedra de Mecanic| i Programare do ub le v[5]={1.1,2.2,3 .3,4.4,5.5}; Curs de limbaj C
double *ptr1, *ptr2;

Copyright 2001. Toate drepturile sunt rezervate autorului. ptr1=v+1;


ptr2=v+4;

Multiplicarea acestui document n scop comercial este interzis|.


prin tf("ptr1 = %p , *ptr1= %lf, v[0] =%lf\ n", p tr1, *ptr 1, v[0]); prin tf("ptr2 = Sudenii participani %porice form| de nv||mnt tr2, *p tr2,bugetar la , *ptr2 = %lf, v [4] =%lf\ n", p superior v[4]); prin tf("ptr2 -ptr1 = %i\ n", p tr2-p tr1);

pot multiplica acest

document pentru uzul personal.


return 0; } Sudenii participani

la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Rezultate: scop m| 0065FDD8, *ptr1= 2.200000, v[0] =1.100000 putei contact| la: ptr1 =
ptr2 = 0065FDF0, *ptr2= 5.500000, v[4] =5.500000 ptr2-ptr1 = 3 ANTAL Tiberiu Alexandru

tel.: 0040-264-530918 n Figura 15 se prezint| e-mail: antaltiberiu@pcnet.ro spaiul datelor pentru programul anterior (TA B4 .C ). Compilatorul realizeaz| sc|derea scalnd valoarea g|sit| conform tipului la care poanteaz| poantorii ptr1 = 0065FDD8 i ptr2 = 0065FDF0 , deci ptr2-ptr1=24. n urma scal|rii acestei valori prin dimensiunea tipului la care poanteaz| poantori (tipul doub le se

127

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca stocheaz| Construcii dei,Maini| Facultatea pe 8 octe adic sizeof(doub le) = 8 ) se obine 24/8 Catedra de Mecanic| i Programare = 3. Curs de limbaj C

dintre doi Multiplicarea acestui documentsn Figura 15 poantori e scop comercial este interzis|. poate realiza numai dac| acetia poanteazparticipani la orice form| acestui caz, rezultatul comparaiei este nedefinit.acest Sudenii | la acelai tablou. n afara de nv||mnt superior bugetar pot multiplica Este corect| comparaia unui poantor cu valoarea NULL . Un caz special de comparaie corect| document pentru uzul personal. este cnd adresa primului element dup| ultimul din tablou este folosit| ntr-o comparaie sau ntr-o expresie aritmetic|. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris de autorului. n acest Operaiile aritmetice cu poantori in cont al tipul de dat| la care Consistena scop m| putei contact| la: poanteaz| poantorul. Toate manipul|rile de poantori iau automat n aritmeticii adreselor considerare tipul la care poanteaz| poantorul. De exemplu, dac| ANTAL Tiberiu Alexandru increment|m un poantor la tipul char, noua adres| este mai mare cu un octet (o unitate), iar tel.: 0040-264-530918 dac| se incrementeaz| un poantor la float, noua adres| va fi cu 4 octei - spaiul de RAM folosit pentru stocarea unui tip float - mai mare. e-mail: antaltiberiu@pcnet.ro

Compararea 2001. Toate drepturile sunt rezervate autorului. Copyright comparaie poantorilor

Operaia

de

9.7 Tablouri multidimensionale

Un tablou se poate construi din elemente de tip aritmetic, poantor, structur|, reuniune sau un alt tablou. Pentru ultimul caz se obin tablouri multidimensionale. Declaraia unui tabloudr. ing. ANTAL Tiberiu Alexandru doua dimensiuni i cu nu m ere le de e lem en te 7 Conf. de elemente float cu numele m , de 3 , respectiv 5 se scrie: Universitatea Tenhic| din Cluj-Napoca Facultatea1Construcii de Maini #d efine D 3 Catedra D2 5 #define de Mecanic| i Programare floa t m [D1 ][D2 ]; C Curs de limbaj
m este un 2001. Toate drepturile sunt rezervate autorului. Copyright tablou format din 3 articole de tipul tablou, fiecare astfel de articol este la rndul lui un tablou cu 5 elemente. Astfel, oricare din expresiile m , m [i] sau m [i][j] sunt corecte. Primele dou| au tipul tablou, respectiv m este un tablou cu 3 elemente de tipul Multiplicarea acestui document n scop comercial este interzis|. tablou, cu elementul de tip tablou de 5 elemente float, iar m [i] este un tablou cu elementele de tipul tablou cu 5 elemente float. Ultima expresie are tipul float i reprezint| valoarea

Sudenii| a elementului n cauz|. Operaiile de evaluare a valorilor elementelor de tablouri numeric participani la orice form| de nv||mnt superior bugetar pot multiplica acest document ipentru uzul personal. se aplic| aici. Astfel, dac| e1 este un tablou, iar e2 un indice, e1[e2] este echivalent| cu *((e1)+(e2 )), deci se poate scrie m [i][j] = *(m [i]+j) . Asociativitatea operatorului [ ] este de la stnga la dreapta, deci m [i][j] = *((m de + (i*sizeof(m [j]))). Regulile de evaluare ale acestei Sudenii participani la orice form| [j]) nv||mnt cu plat| sau alte persoane doritoare expresii in de documentulpoantorilor. m [j] este un poantor scris al se va aduna o acest pot multiplica aritmetica numai contra cost i cu acordul la care autorului. n valoare ntreag|.putei contact|*((m[j]) + (i*siz eof(m [j]))), sizeof(m [j]) este m|rimea unui tablou de scop m| n adunarea la: reali (float) cu num|rul de elemente D2. Se poate scrie astfel: *((m[j]) + i*sizeo f(m [j])) = *(m [j] + i*D2*sizeo f(float)). n final, expresia *(m[j] + i*D2* size of(floa t)) se convertete n ANTAL Tiberiu Alexandru *((m +j*size of(floa t))+i*D2*sizeo f(float)). ntruct m [j] este un poantor, operatorul de tel.: 0040-264-530918 | pentru calculul adresei acestuia. indirectare nu se aplic e-mail: antaltiberiu@pcnet.ro Dup| cum am spus, C face automat toate aceste transform|ri i calcule. Observai c| prima dimensiune a tabloului (D1 ) nu particip| la calculele pentru determinarea poziiei unui element. Din acest motiv, cnd tablourile vor fi transmise ca parametri de funcii, prima dimensiune poate fi omis|. Prima oar| va fi evaluat| subexpresia cuprins| ntre
128

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca parantezele cele mai interioare, care ine de j, apoi va fi evaluat| subexpresia care ine de Facultatea Construcii de Maini i . Ultimul indice, j , este evaluat n expresie naintea celuilat, i . Din acest motiv se zice c| Catedra de Mecanic| i Programare el variaz| mai repede. Elementele corespunz|toare ultimului indice vor fi stocate n zone Curs de limbaj C Dac| se face corespondena cu elementele unei matrice, m , unde i este continue de RAM.
i,j

rndul i j coloana, se poate spune c| tabloul cu dou| dimensiuni este stocat pe rnduri. Copyright 2001. Toate drepturile sunt rezervate autorului.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* TA B5.C */ #include <stdio.h> Multiplicarea acestui document n scop comercial este interzis|. #d efine D 1 3 #define D2 2 Sudenii participani la orice form| de nv||mnt superior bugetar #define TIP int

pot multiplica acest

document pentru uzul personal.


TIP m [D1 ][D2 ]= {{1,2}, {3,4}, Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare {5,6} pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest };

scop m| putei contact| la:


int main(void) { ANTAL Tiberiu int i,j;

Alexandru tel.: 0040-264-530918 e-mail:char *ptr; antaltiberiu@pcnet.ro


for(i=0;i<D1;i++) { for(j=0;j<D2;j++) prin tf("%4 i ",m [i][j]); prin tf("\n "); }

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca prin tf("\n "); Facultatea Construcii de Maini for(i=0;i<D1;i++) { Catedra de Mecanic| i Programare for(j=0;j<D2;j++) Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. }


prin tf("\n "); Multiplicarea acestui document n scop comercial este interzis|. p tr=m ; for(i=0;i<D1;i++) Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest { for(j=0;j<D2;j++) document pentru uzul personal. prin tf("%4 i ",*(ptr + i*D 2*sizeo f(TIP ) + j*size of(TIP))); prin tf("\n "); Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare }

printf("% 4i ",*(*(m +i)+j)); prin tf("\n ");

pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest return contact| la: scop m| putei 0;
}

ANTAL Tiberiu Alexandru Rezultate: tel.:10040-264-530918 2 e-mail: antaltiberiu@pcnet.ro 3 4


5 1 3 5 6 2 4 6 129

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca 1 2 Facultatea Construcii de Maini 3 4 Catedra de Mecanic| i Programare 5 6 Curs de limbaj C Linia 21 prezint| modul de acces clasic - prin operatorul de indexare - la valorile elementelor unuiToate drepturile sunt rezervate autorului. mod de acces care folosete Copyright 2001. tablou bidimensional. Linia 29 prezint| un formulele de conversie ale adreselor de tablou n poantori, iar linia 38 implementeaz| formulele folosite de C pentru calculul poziiei n RAM a unui element de tablou. Multiplicarea acestui document n scop comercial este interzis|.

Voi numi n continuare tabloul cu dou| dimensiuni matrice. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest n programare, matricea este organizat| pe rndu ri i document pentru uzulse prezint| organizarea conceptual| coloane . n Figura 16 personal. a matricei m[3][2] cu 3 rndu ri i 2 coloane. Reprezentarea Sudenii a matricei este orice n Figura nv||mnt cu plat| sau alte persoane doritoare n RAM participani la dat| form| de 17. Prin declaraia pot multiplica documentul la un tablou ale c| i elemente m[3][2], m devine un poantornumai contra costruicu acordul scris al autorului. n acest sunt m[0]puteicontact| la: scop m| , m[1] i m[2]. La rndul lui, m[0] este un poantor la un tablou ale c|rui elemente sunt m[0][0] i m[0][1]. n general, Tiberiu Alexandruse poate accesa prin formula: Figura 16 ANTAL un element m [i][j] m [i][j]= *(m [i]+j) . Cunoscnd c| m[i] se descompune n *(m+i) tel.: 0040-264-530918 se mai poate scrie m [i][j]= *(*(m + i)+j) . Concluzionnd, toate expresiile care urmeaz| vor e-mail: antaltiberiu@pcnet.ro m de tipul TIP din matricea M referi valoarea aceluiai element :
i,j D1xD2

m [i][j] *(m [i]+j) *(*(m +i)+j) *(m +i*D 2*sizeo f(TIP )+j*size of(TIP))

Conf. dr. ing. ANTAL Tiberiu Alexandru Dac| tabloul este tridimensional va Universitatea Tenhic|Asociativitatea din Cluj-Napoca avea 3 indici. Facultatea Construcii de Maini operatorului [ ] este la stnga la Catedra de Mecanic| i Programare la dreapta. Pentru calcularea adresei care de stocat C Cursestelimbaj | valoarea selectat| prin indici se evalueaz| num e[indice1] . Adresa care rezult| drepturile sunt rezervate autorului. Copyright 2001. Toate din adunarea adresei lui n um e cu offsetul indice1 formeaz| o expresie poantor, apoi Multiplicarea acestui document n scop comercial este interzis|. offsetul lui indice2 se adun| la expresia anterioar| pentru a forma o nou| Sudenii participani la orice form| de|nv||mnt superior bugetar pot multiplica acest expresie poantor, continundu-se pn document pentru uzul personal. la epuizarea indicilor. Operatorul de indirectare (* ) se aplic| numai dup| evaluarea ultimului indice. de Sudenii participani la orice form| Fienv||mnt cu plat| sau alte persoane doritoare declaraiile: documentul numai contra cost i cu acordul scris al autorului. n acest pot multiplica Figura 17 scop m| putei contact| la:
#d efine D 1 3 #define D2 4 ANTAL Tiberiu Alexandru #define D3 5 tel.:T3 d[D 1][D2][D 3]; int 0040-264-530918 int i, *ptrT 3d , (*ptr prfT3d )[D3 e-mail: antaltiberiu@pcnet.ro ];

n exemplul de mai sus, s-a declarat un tablou multidimensional T3d de 3 elemente, fiecare element fiind un tablou de 4 x 5 (D2 x D3) valori de tipul int . O referin| la un element al unui astfel de tablou apare n expresia i=T 3d [0][0][1];
130

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Generaliznd cele discutate mai sus se poate spune c| tablourile multidimensionale sunt Facultatea Construcii de Maini stocate pe Mecanic| i Programare variaz| cel mai repede. n consecin|, expresia Catedra de linii, deci ultimul indice T3d[0][0][2] va referi urm|torul element de tablou din RAM, adic| pe cel de al 3-lea. Curs de limbaj C

G|sirea valorii lui T3d[2][1][3] se face astfel: Copyright 2001. Toate drepturile sunt rezervate autorului. 1. Primul indice r este multiplicat cu dimensiunea unui tablou int de 4 x 5 (D2 X D3) elemente. Acest rezultat va poanta la cel de al 3 -lea tablou 4 x 5 . Multiplicarea acestui document n scop comercial este interzis|. unui tablou int de 5 (D3) 2. Cel de al doilea indice 1 este multiplicat cu dimensiunea elemente i adunat la adresa reprezentat| de T3d[2]. 3. Fiecare element al form| de nv||mnt superior tipul int, deci indicele final, Sudenii participani la orice tabloului de 5 elemente este debugetar pot multiplica acest 3 , este multiplicatuzul personal. int nainte de adunarea lui la T3d [2][1]. document pentru cu lungimea lui 4. Operatorul de indirectare este aplicat valorii poantor, rezultatul fiind elementul int de la acea adres|. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contrala valoarea T3d[i][j][k], este: Formula de calcul final| pentru accesul cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
*(((T3d + i*D3*D 2*sizeo f(int)) + j*D 2*sizeo f(int)) + k *size of(int));

ANTAL Tiberiu Alexandru Cteva cazuri pentru tel.: 0040-264-530918 care operatorul de indirectare nu mai este aplicat sunt: e-mail: antaltiberiu@pcnet.ro
ptrT3 d=T3 d[2 ][3]; ptrptrT3 d=T3 d[1];

n primul caz, expresia T3d[2][3] este o referin| valid| la tabloul tridimensional T3d , referindu-se un tablou unidimesional cu D3 elemente. Pentru c| valoarea poantorului adreseaz| un tablou, operatorul de indirectare nu este aplicat. Similar, rezultatul T3d [1] este o valoare poantor la un tablou de 2 dimensiuni (D2 x D3). Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

9.8 Transferul tablourilor si functiilor ca parametri de rezervate autorului. functie Copyright 2001. Toate drepturile sunt

Dac| parametrul unei funcii este tab lou de tip ul T , declaraia este astfel transformat| nct se va citi "poan to r la ti pu l T ". Dac| un parametru este declarat ca funct ie ce Multiplicarea lacestui document n scop comercial este interzis|. "poantor la funct ie ce ntoarce tipu T , aceasta se transform| astfel nct se va citi ntoarce tipu l T ". Funcia va putea ntoarce o valoare de orice tip aritmetic, structur|, reuniune, poantor sau orice form| de nv||mnt sau tipul tablou. Sudenii participani lavoid dar nu de tipul funcie superior bugetar pot multiplica acest document pentru uzul personal.

9.8.1participani la orice form| de nv||mnt cuunidimensional Transferul unui tablou plat| sau alte persoane doritoare Sudenii

Dac| avem un tablou unidimensional declarat astfel: int a[5], el se transfer| unei funcii pot numele m ed ia_ aritm etic a() , scriind cost i cu acordul scris. al autorului. nva trata cu multiplica documentul numai contra media_aritmetica(a) Compilatorul acest scop m|tabloului a conform celor discutate pn| acum, ca pe un poantor constant la primul numele putei contact| la: element al tabloului. Deci tabloul nu se transfer| prin valoare, ci funciei i se va transfera ANTAL Tiberiuacest motiv, din interiorul funciei se vor putea modifica valorile stocate un poantor. Din Alexandru tel.: 0040-264-530918 apelant|. Dac| funcia m ed ia_ aritm etic a() va avea doi parametri, n tabloul din funcia tabloul a i num|rul de elemente ale tabloului, urm|toarele forme de declaraie sunt e-mail: antaltiberiu@pcnet.ro corecte:
doub le m ed ia_ aritm etica (int a [ ], int nr_ elem en te);

131

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca sau Facultatea Construcii de Maini Catedra de Mecanic| i Programare doub le m ed ia_ aritm etica (int *a , int n r_e lem en te); Curs de limbaj C

Pentru c| tot ceea ce primete funcia este un poantor, ea nu are de unde s| tie num|rul Copyright 2001.tabloului. Astfel, este necesar al doilea parametru, nr_ elem en te , care va de elemente ale Toate drepturile sunt rezervate autorului. trebui s| fie num|rul de elemente ale tabloului. Multiplicarea acestui document n scop comercial este interzis|.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 /* TA B6.C */ #include<stdio.h>

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. do ub le m ed ia_ aritm etic a(in t [ ], int);
int main(void) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int ve ctor[5]={1,2,3 ,4,5}; scop m| putei medar; la: doub le contact| m ed ar=m Alexandru ANTAL Tiberiu ed ia_ aritm etica (vec tor,5); tel.: 0040-264-530918 prin tf("M ed ia a ritm etica este: %lg\ n", e-mail: antaltiberiu@pcnet.ro return 0; } double media_aritmetica(int a[ ], int nr_elemente) { int i;

m ed ar);

Conf. dr. ing. ANTAL Tiberiu Alexandru double total=0.0; Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini for(i=0; i<nr_eleme nte; i++) Catedra de Mecanic|tota l+= a [i]; i Programare Curs de limbaj C
return total/nr_elemente; }

Copyright 2001. Toate drepturile sunt rezervate autorului. Rezultate: Multiplicarea acestui document n scop comercial este interzis|. Media aritmetica este: 3 n programul prezentat tabloul de nv||mnt superior bugetar numit vector este Sudenii participani la orice form|unidimensional de 5 elem ente pot multiplica acest argumentul funciei m personal. etic a() n linia 11 . Parametrul a primete ca valoare document pentru uzul edia_ aritm adresa primului element din vector, adic| pe &vector[0]. n interiorul funciei a[i] este modalitatea de acces la elementele tabloului, a[0] = cua[1] = 2 sau alte persoane doritoare Sudenii participani la orice form| de nv||mnt 1, plat| etc. Al doilea parametru este num|rul de elemente ale vectorului care asigura oprirea indicelui i la ultimul element valid 7 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest de tablou. a[0] este primul element, iar ultimul este a[5] pentru c| atunci cnd i va lua scop m| putei contact| la: for. Datorit| apelului prin adres|, orice modificare a valorilor valoarea 6 se iese din ciclul lui a[i] se va reflecta asupra lui vecto r[i]. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

9.8.2 Transferul unui tablou unidimensional prin poantor


Funcia m ain () ramne identic| cu cea anterioar|.
132

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca /* TA B7.C */ Facultatea Construcii de Maini #include<stdio.h> Catedra de Mecanic| etic a(in t *, int); do ub le m ed ia_ aritm i Programare Curs de limbaj C int main(void) { Copyright a[5]={1,2,3 ,4,5}; 2001. Toate drepturile int doub le medar;

sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.


m ed ar=m ed ia_ aritm etica (a,5);

Sudenii participani la ritm etica este: nv||mnt superior bugetar pot multiplica acest orice form| de %lg\ n", m ed ar); prin tf("M ed ia a document pentru uzul personal.
return 0; } Sudenii participani

la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest double media_aritmetica(int *ptr, int nr_elemente) scop m| putei contact| la: {
int *ptr_capat=ptr + nr_elemente;

ANTAL Tiberiu Alexandru double total=0.0; tel.: 0040-264-530918 e-mail:w hile (ptr < ptr_c ap at) antaltiberiu@pcnet.ro
total+= *ptr++; return total/nr_elemente; }

n linia 10 , n urma apelului se copiaz| adresa elementului 0 n ptr i valoarea numeric| Conf. dr. ing. nr_ elem en te . Iniializarea 5 n variabila ANTAL Tiberiu Alexandru din linia 19 va atribui poantorului ptr_capat Universitatea Tenhic| din Cluj-Napoca adresa ptr+n r_e lem en te*siz eof(in t). Pentru simplitate, presupunem c| adresa lui ptr n zecimal este 1000. Astfel, adresa Facultatea Construcii de Maini stocat| n ptr_capat este ptr_capat = 1000+5*4=1020. Aceast| adres| este dincolo de domeniul alocat tabloului a ns| conform celor spuse la Catedra de Mecanic| i Programare comparalimbaj C Curs de ia poantorilor, este corect s| o folosim. Din acest motiv se scrie ptr < ptr_capat i nu ptr <= ptr_capat. Instruciunea din linia 24 face adunarea valorilor elementelor poantate de ptr . total este iniializat| cu valoarea 0 , iar valoarea poantat| de poantor care Copyright 2001. iToate total, care devine 1 . Apoi poantorul se incrementeaz| i adresa lui este 1 se adun| ea la drepturile sunt rezervate autorului. prtr devine 1000+1*4 , adic| 1004. Cum relaia 1004 < 1024 este adeva rata , ciclul continu| 7 7 Multiplicarea 2 se adun| la valoareascop comercial esteaceasta devenind 1+2 =3 . Poantorul i valoarea de acestui document n curent| a lui total, interzis|. este incrementat la adresa 1008 , etc. Dup| ce s-au adunat cele 5 numere, poantorul va Sudenii participani la orice form| adresa stocat| superior bugetar pot multiplica acest poanta la adresa 1020. Aceasta este de nv||mnt n ptr_capat motiv pentru care ciclul nu se reia. Valoarea ntoars| este 7 document pentru uzul personal. media aritmetica, adic| suma elementelor mp|rit| la num|rul de elemente. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteiare o preceden| mai mare dect operatorul * . Dac| ++ se realizeaz| prima Operatorul ++ contact| la:

9.8.3 Operatorii * si ++ la poantori -

oar|, de ce se adun| prima oar| valoarea i numai apoi se incrementeaz| poantorul? ANTALaTiberiu Alexandru s| revenim la modul de lucru al operatorului ++ postfix. Fie Pentru nelege rezultatul tel.: 0040-264-530918dac| scriem b=a++; valoarea lui a este salvat| ntr-un registru. a se declaraia int a=3,b;, e-mail: antaltiberiu@pcnet.ro apoi valoarea din registru este atribuit| lui b . Deci incrementeaz| devenind 4 , incrementarea se face naintea atribuirii. Dac| x este o variabil| ntreag|, iar p un poantor la un tip ntreg, n cazul unei expresii de forma x=*p++ , adresa din p se salveaz| ntr-un registru, apoi p se incrementeaz|. Valoarea adresei salvate n registru este folosit| cu operatorul * pentru extragerea valorii poantate de la adresa neincrementat|.
133

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n aceast| form Facultatea Construcii de Maini | coninutul adresei din p se salveaz| ntr-un registru. (*p)++ Con inutul locaiei Catedra de Mecanic| i Programare poantate de p se va incrementa, dar poantorul p va continua s| poanteze la aceeai locaie. Expresia va crete cu 1 valoarea Curs den locaia poantat| de p , f|r| a modifica ns| adresa stocat| n poantorul p . O astfel stocat| limbaj C

de expresie, dac| poanteaz| la un tablou, garanteaz| incrementarea continu| a Copyright 2001. Toatepoantat de poantor. elementului de tablou drepturile sunt rezervate autorului.

*++p

Multiplicarea acestui document n scop comercialdeci nu se folosete registrul. Valoarea Aici operatorul ++ este prefixat, este interzis|. stocat| n p se incrementeaz|, apoi se acceseaz| valoarea stocat| la aceast| nou| adres| O astfel de expresie garanteaz| ratarea trat|rii Sudenii participani la orice form| de. nv||mnt superior bugetar pot multiplica acest primului element uzul personal. document pentru dintr-un tablou.

9.8.4 Transferul unui tablou bidimensional

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai este obligatoriu ca declaraia de autorului. n acestin| Dac| tabloul este bidimensional, contra cost i cu acordul scris al parametru s| con scop|rul putei contact| la: num m| de coloane al parametrului tablou. Num|rul de linii este irelevant, din moment ce se va transfera un poantor la un tablou de rnduri, unde fiecare rnd este un tablou cu ANTAL Tiberiu Alexandru D2 elemente de tipul T . Ca exemplu, voi prezenta un program care face suma i produsul elementelor nenule dintr-o matrice A mxn. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 /* TA B8 .C */ #include<stdio.h> #define R 7 #d efine C 10

vo id Cites teM atric e(int [ ][C], int, in t, ch ar ); void ScrieM atr ice(int [ ][C], in t, int, char); Conf.Sdr. ing. ANTAL e(int [ ][C], int , int ); void um Pr odM atric Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int C iteste N rElem (int *, in t, cha r);

Facultatea Construcii de Maini int main(void) Catedra de Mecanic| i Programare { Curs de limbaj C n , m ; int a[R ][C],
if (CitesteNrElem(&n,R,'r')) return 0; Copyright 2001. Toate drepturile sunt rezervate autorului. if (CitesteNrElem (&m,C,'c')) return 0; if (m <1) retu rn(0 ); Cite steM atric e(a,n ,m,'a'); Scr ieM atric e(a,n ,m,'a'); Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Su documentm ProdM atric e(a,n ,m); pentru uzul personal.

Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare return documentul numai contra cost i cu acordul scris al autorului. n acest pot multiplica 0; } scop m| putei contact| la: ANTAL Tiberiu Alexandru ][C], int r, int c, char num e) void CitesteMatrice(int m[ { tel.: 0040-264-530918 e-mail:int i,j; antaltiberiu@pcnet.ro for(i=0;i<r;i++) for(j=0;j<c;j++) { prin tf("%c [%i][%i] = ",nu m e,i,j); sca nf("% d", & m [i][j]);
134

prin tf("Su m a: %i\n Produs ul: % i\n ", a[0][0], a[0 ][1]);

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C void ScrieMatrice(int m[ ][C], int r, int c, {

char num e)

int Copyright i,j; 2001. Toate drepturile sunt rezervate autorului. prin tf("M atric ea %c e ste:\n ", nu m e); for(i=0;i<r;i++)

Multiplicarea acestui document n scop comercial este interzis|. { Sudenii document pentru uzul personal. }
} for(j=0;j<c;j++) participani prin tf("%i ", m [i][j]); la orice form| de nv||mnt prin tf("\n ");

superior bugetar pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int CitesteNrElem(int *x, int d, char num e) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest { scop m| putei contact| m e); prin tf("%c = ", nu la:
sca nf("% i", x);

ANTAL Tiberiu Alexandru if (*x > d) tel.: 0040-264-530918 { e-mail: antaltiberiu@pcnet.ro e, prin tf("\n Eroar
return 1; } return 0; }

nu m aru l de e lem en te este pr ea m are \n ");

void Suming. ANTAL Tiberiu ][C], int r , int c) Conf. dr. ProdM atrice(int m[ Alexandru { Universitatea Tenhic| din Cluj-Napoca int i,j; Facultatea sum a = 0, produ s = 1; int Construcii de Maini

Catedra de Mecanic| i Programare for(i=0;i<r;i++) Curs de limbaj C

for(j=0;j<c;j++) { Copyright 2001. Toate drepturile sunt rezervate autorului. su m a+=m [i][j]; if (m [i][j] != 0) prod us *=m [i][j]; Multiplicarea }acestui document n scop comercial este interzis|. m[0][0]=suma; m[0][1]=produs; Sudenii participani la orice form| de nv||mnt superior bugetar }

pot multiplica acest

document pentru uzul personal. Rezultate: r= 2 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare c= 4 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest a[0][0] = 1 scop m| putei contact| la: a[0][1] = 2
a[0][2] = 3 a[0][3] = 0 ANTAL Tiberiu Alexandru a[1][0] = 0 tel.: 0040-264-530918 a[1][1] = 4 e-mail: antaltiberiu@pcnet.ro a[1][2] = 5 a[1][3] = 6 Matricea a este: 1 2 3 0 0 4 5 6 135

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Suma: 21 Facultatea Construcii de Maini Produsul: 720 Catedra de Mecanic| i Programare Curs de limbaj C manipuleaz| matricea sunt CitesteM atr ice(), ScrieMatrice() i Func iile care Su m Pr od M atr ice() . Parametrul tablou este declarat sub forma: in t m [ ][C]. El poate fi ns| declarat sub una din formele: int m[R][C] autorului. Copyrighti2001. Toate drepturile sunt rezervate sau int (*m)[C]. Pentru ultima form|, parantezele rotunde sunt obligatorii pentru c| [ ] are preceden| mai ridicat| dect * . Dac| a fi scris numai int *m[C], [ ] dimensiunea C s-areste interzis|. Multiplicarea acestui document n scop comercial lega de numele m , deci m[C] va fi un tablou, apoi * s-ar lega de tipul int, adic| elementele tabloului ar fi poantori la tipul int. Pentru nelegerea detaliat| a moduluinv||mntinterpreteaz| declaramultiplica acest Sudenii participani la orice form| de n care C superior bugetar pot iile complexe v| recomand citirea ANEXEI 2. document pentru uzul personal.

Sudenii participaninotatie o folosim? form| 9.8.5 Care la orice - de nv||mnt cu plat| sau alte persoane doritoare

potprogramul documentul numai contra cost i cu iacordul scris al autorului. n acest la n multiplica care urmeaz|, att forma a[i] ct *ptr sunt folosite pentru accesul elementele unui tablou la: scop m| putei contact| unidimensional. Care dintre notaii este mai bun|?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* TA B9.C */ ANTAL Tiberiu Alexandru #include<stdio.h>

tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro int main(void)


{ floa t x[5 ]={1.1F ,2.2F ,3.3F ,4.4F,5 .5F }; float *ptr=x; prin tf("x[2 ]= %g \n ", x[2]); prin tf("2[x ]= %g \n ", 2[x]); prin tf("*(x+2)= Tiberiu *(x+2 )); dr. ing. ANTAL%g\n \n ",Alexandru

Conf. Universitatea Tenhic|%g \nCluj-Napoca din ", ptr[2]); prin tf("ptr[2 ]= Facultatea Construcii deg\n ", *(ptr+2 )); prin tf("*(ptr+2)= % Maini Catedra de Mecanic| i Programare return C Curs de limbaj0;
}

Copyright 2001. Toate drepturile sunt rezervate autorului. Rezultate:


x[2]= 3.3 2[x]= 3.3 Multiplicarea *(x+2)= 3.3

acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest ptr[2]= 3.3 document pentru uzul personal. *(ptr+2)= 3.3 nainte participani la orice form| de nv||mnt 10 din programul TA B9 .C . Forma de Sudeniide a r|spunde la ntrebare, observai linia cu plat| sau alte persoane doritoare scriere este corect|, astfel numai contraacceseaz| acordul scris al autorului. n acest 7 pot multiplica documentul ca x[2] i 2[x] cost i cu valoarea aceluiai element de tablou. Asta m| putei operatorul [ ] se descompune ntr-o adunare, iar adunarea este comutativ|. pentru c| contact| la: scop R|spunsul la ntrebare este folosirea notaiei ct mai uor de neles n contextul problemei care se rezolv|. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

9.9 iruri de caractere


n C nu
136

ex ista un tip specific pentru s irul de caractere . El se declara ca un tablou 7 7 unidim ensional de caractere . Se poate lucra i cu un poantor la un tip char. Dac| irul

este declarat ca un tablou de caractere, spaiul pentru stocarea elementelor de ir este

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca alocat automat. Dac| irulMaini | ca un poantor la caracter, nu se aloc| spaiu pentru Facultatea Construcii de se declar elementele Mecanic| i Programare 7 Catedra de lui, utilizatorul fiind nevoit s|-l aloce explicit cu m allo c() , calloc() sau sa-i atribuie adresa unui ir deja existent. Un caracter special este folosit pentru marcarea Curs de rii irului. Acest caracter se numete nu ll i se scrie ca '\0'. Nu trebuie s| termin| limbaj C

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

confundai acest nu ll cu NULL discutat la poantori. Acel NULL marca o valoarea invalid| Copyright 2001. Toate drepturile suntfel. Pentruautorului. nu ll este garantat| valoarea de poantor i putea fi definit| n orice rezervate caracterul 0 . Scrierea de '\0' este preferabila unui simplu 0 deoarece compilatorul, conform celor 7 discutate la constante, atribuie n scop lui 0 i char lui '\0'. Diferena dintre tipuri este Multiplicarea acestui documenttipul intcomercial este interzis|. spaiul folosit pentru stocare, int se stocheaz| pe 2 sau 4 octei, iar char pe unul singur. Pentru stocarea unuila orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii participani zero este suficient un singur octet. document pentru uzul personal.
/* TA B10.C */ #include <stdio.h>

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int main(void)documentul numai contra cost i cu acordul scris al autorului. n acest pot multiplica { scop m| putei contact| la:
cha r num e[5]; /* Declara tia variab ilei sir de caractere */

ANTAL Tiberiu Alexandru nu m e[0 ] = 'T'; nu m e[1] = 'i'; tel.: 0040-264-530918 nu m antaltiberiu@pcnet.ro e-mail:e[2 ] = 'b';

nu m e[3 ] = 'i'; nu m e[4] = '\0'; /* Cara cterul nu ll - marchea za term inarea textului */ prin tf("N um ele este: % s\n ", nu m e); prin tf("Al 3 -lea caracte r este : %c\ n", n um e[2]); prin tf("O p arte din nu m e este: %s \n ", &n um e[1]);

Conf. dr. 0; ANTAL Tiberiu Alexandru return ing. } Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Rezultate: Mecanic| i Programare Catedra de Numele este: Tibi Curs de limbaj C Al 3-lea caracter este: b
O parte din nume este: ibi

Copyright 2001. Toate drepturile sunt rezervate autorului. n linia 6, n um e este un tablou unidimensional cu 5 elem en te de tipul Iniializarea char. Putem spune c| comercial este interzis|. Multiplicarea acestui document n scop avem 5 variabile de tipul char cu numele num e[0], irurilor num e[1], num e[2], num e[3], nume[4]. Variabila n um e este un ir de caractere ce poate stoca cel mult superior bugetar pot multiplica acest Sudenii participani la orice form| de nv||mnt 5 caractere, dar pentru c| este nevoie i de caracterul nu ll, ce marcheaz| terminarea irului, mai r|mn numai 4 caractere document pentru uzul personal. utilizabile. Pentru a stoca date n ir se folosesc 5 instruciuni de atribuire, fiecare atribuind un caracter alfabetic la cte unul dintre caracterele irului. n final, ultimul Sudenii din ir este valoarea numeric| 0 care indic|cu plat| sau alte persoaneiniializarea caracter participani la orice form| de nv||mnt terminarea irului. Dup| doritoare pot multiplica documentul va fi afiat pe ecran cu acordul irului de caractere acesta numai contra cost i n linia 14 . scris al autorului. n acest scop m| putei contact| la: Caracterul de conversie %s din printf() se folosete la afiarea irurilor de caractere. Afiarea ncepe Alexandru ANTAL Tiberiucu primul caracter al irului i se termin| la ntlnirea caracterului nu ll. Observai c| n printf() doar numele irului trebuie specificat, f|r| nici un indice, pentru tel.: 0040-264-530918 c| suntem interesai ca afiarea s| se fac| ncepnd cu primul caracter. Pentru c| toate e-mail: antaltiberiu@pcnet.ro cele discutate la tablouri r|mn valabile i aici, n um e se refer| la ntregul ir, iar nu m e[i] la un singur caracter din ir. Din exemplul anterior ai putea deduce c| utilizarea irurilor este greoaie din moment ce trebuie iniializat individual fiecare element de ir. Realitatea este ns| mai simpl|, iar
137

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca exemplul a Construcii de Mainiprezenta un mod de tratare al elementelor de ir identic Facultatea avut numai rolul de a cu metodele generale de iniializare prezentate la tablouri. Urm|toarele metode de Catedra de Mecanic| i Programare init ializare pot fi practicate n cazul unui ir de caractere: Curs de limbaj C 1 char nu m e[7] = {'V','a','s','i','l','e','\0'}; 2 Copyright 2001. Toate drepturile sunt char p renu me [9]="Gheorgh e"; 3 char titlu[ ]="doctor inginer";

rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. n linia 1, folosind o metod| de iniializare specific| tuturor tablourilor, compilatorul nu este suficient de detept ca s| se prind| c| este vorba de un ir, motiv pentru care trebuie Sudenii participani la orice form| deir. L|sarea lui afar| ar fi duspot un tablou corect s| punem cu mna terminatorul de nv||mnt superior bugetar la multiplica acest document pentru uzulir de caractere neterminat. n linia 2, variabila p re nu m e este iniializat, dar la un personal. iniializat| cu un ir de caractere. Conform celor prezentate n paragraful numit Sudenii participani la ir este o secven| de caractere cuprins| ntre ghilimele. Aici, "Elemente de C" un orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica"se prinde" cnumai contra|cost i cu ir i adaug| automat la sfritul lui compilatorul documentul | se lucreaz cu un acordul scris al autorului. n acest caracterul nu ll. Linia 3 la: scop m| putei contact| prezint| cazul n care num|rul de elemente ale irului se deduce de c|tre compilator, el fiind num|rul de caractere din ir plus unu, pentru terminatorul de ir care din nou se adaug| automat. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 n linia 15 , printf() ilustreaz | modul de afiare al unui singur caracter e-mail: antaltiberiu@pcnet.ro Afiarea unor din ir utiliznd caracterul de conversie %c i specificnd caracterul
poriuni ale irului

particular din variabila n u me pe care dorim s-o afi|m. Ultimul printf() ilustreaz| modul n care se poate afia o poriune din ir prin specificarea punctului de nceput si utiliznd indicele. Dup| cum tii deja, operatorul & ntoarce adresa lui num e[1].

9.9.1 Atribuirea n cazul de siruri /* TA B11.C */ #include 2001. Toate Copyright<stdio.h> #include <string.h>

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca O eroare frecvent| este de Maini Facultatea Construcii scrierea unei atribuiri de forma num e="Ion"; . Aici, nume stocheaz| adresa primului caracter din ir, adic| adresa lui 'I'. Aceast| adres| este constant|, modul Catedra de Mecanic| i Programare strc py () din biblioteca standard. de lucru corect este folosirea funciei Curs de limbaj C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. int main(void)


{ cha r num e1[12], num orice m ax im [25]; Sudenii participani la e2[12], form| de nv||mnt superior bugetar pot multiplica acest char titlu[ ]="Acesta este un titlu."; document pentru uzul personal.

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare strcp y(n um e2, "T ibi"); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest prin tf(" %s\ n\ n", la: scop m| putei contact|titlu ); ANTAL Tiberiu Alexandru if(strcm p(num e1, num e2) > 0 ) tel.: 0040-264-530918 strcpy (max im , nu m e1); e-mail: antaltiberiu@pcnet.ro
else strcpy (max im , nu m e2); prin tf("N um e 1 es te: %s \n ", nu m e1); prin tf("N um e 2 este: % s\n ", nu m e2);

strcpy (nu m e1, "Ioa na "); /* atribuirea unu i sir la o variab ila */

/* com paratia a 2 siruri */

prin tf("Ce l mai m are nu m e in sen s alfa betic este : %s\ n", m ax im );

138

24 25 26 27 28 29 return 0; Copyright 2001. 30 }

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca strcp y(m ax im Facultatea ax im ,, "nu m/* concaten area a doua siruri Construcii e1); Maini de strcat(m "); Catedra de Mecanic| i Programare strca t(max im , nu m e2); Curs de limbajdo ua nu m e su nt: % s\n ", m ax im ); prin tf("Ce le C

*/

Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Rezultate:


Acesta este un titlu.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Nume 1 este: Ioana document pentru uzul personal. Nume 2 este: Tibi
Cel mai mare nume in sens alfabetic este: Tibi Sudenii participani la orice form| de nv||mnt cu plat| Cele doua nume sunt: Ioana Tibi

sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Funcm| de bibliotec| strc py () este declarat| n fiierul antet string .h (vezi linia 3 din scop ia putei contact| la: programul anterior) iar descrierea ei este dat| n continuare: ANTAL Tiberiu Alexandru strcpy - copiaza un sir de caractere 7 tel.: 0040-264-530918 Prototip: char *strcpy(char *s irDestinat ie, const char *s irSursa ); 7 e-mail:prototip: <string.h> Fisier antaltiberiu@pcnet.ro Valoare ntoars|: ntoarce irul destinaie. Nu se poate afla din valoarea ntoars| dac| s-a realizat copierea f|r| eroare. Parametri: s irDestinat ie este irul n care se face copierea; s irSursa este irul din care se face copierea; el trebuie s| fie terminat n 7 caracterul nu ll. Remarca:ing. ANTAL py () copiaz| caracter cu caracter, inclusiv caracterul terminator de 7 Funcia strc Tiberiu Alexandru Conf. dr. ir, din s irSursa n s irDestinat ie . Oprirea copierii se face dup| ntlnirea caracterului 7 Universitatea Tenhic| din Cluj-Napoca nu ll . Lipsa lui duce la un comportament nedefinit n funcionare, prezena lui nu ll fiind Facultatea Construcii de Maini singura metod| de verificare a atingerii limitei lui s irSursa . s irDestinat ie trebuie s| fie 7 Catedra de Mecanic| i Programare coninutul lui s irSursa . Altfel, foarte probabil, din suficient de mare pentru a stoca tot 7 Curs de limbaj CRAM destinat| lui s irDestinat ie este dep|it|, programul va "cr|pa". cauza c| zona de Copyright 2001. Toate drepturile sunt rezervate autorului.

9.9.2 Sortarea alfabetica a sirurilor 7 Multiplicarea acestui document n scop comercial este interzis|.

Funcia care permite compararea a dou| iruri este strc m p() (string compare - vezi linia 17 ). Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. strcmp - compara doua siruri de caractere 7 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Prototip: int strcmp( const char *s ir1, const char *s ir2 ); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Fisier prototip: <string.h> scop m| putei contact| la: Valoare ntoarsa: funcia compar| pe s ir1 cu s ir2 i ntoarce un rezultat n funcie de 7 relaia dintre cele dou| iruri, astfel: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Valoare ntoarsa 7 Relatia e-mail: antaltiberiu@pcnet.ro ntre s ir1 i s ir2 <0 0
s ir1 s ir1 -

< s ir2 == s ir2 139

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini >0 s ir1 > s ir2 Catedra de Mecanic| i Programare Curs de limbaj C i s ir2 sunt iruri terminate n nu ll care vor fi comparate. Parametri: s ir1 -

Din descriere se observ| c| strc sunt rezervate autorului. Copyright 2001. Toate drepturilem p() va ntoarce o valoare >0 dac| primul ir este mai mare dect al doilea, zero dac| au aceeai lungime i aceleai caractere i o valoare <0 dac| primul ir esteacestui document n scop comercial iruri, n funcie de rezultat, este copiat Multiplicarea mai mic dect al doilea. Unul dintre este interzis|. n variabila ir m ax im prin linia 18 sau 20 , apoi cel mai mare nume, n sensul alfabetic, se afieaz| n linia 22. Nu trebuie s| fii surprini c| Tibi va fi mai mare pentru c| Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest lungimea nu conteaz|, fiind semnificativ| numai poziia n alfabet. Trebuie s| tii c| document mai depindepersonal. n care au fost scrise numele, adic| cu litere mari sau rezultatul pentru uzul i de modul mici. Exist| funcii care permit transformarea unui ir oarecare ntr-unul numai cu Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare majuscule sau numai cu litere mici. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

9.9.3 Concatenarea sirurilor -

Lin iile 24-27 ilustreaz| o alt| funcie standard, strc at() (string concatenation). Aceast| ANTAL Tiberiu Alexandru

funcie adaug| caracterele din al doilea ir la cap|tul primului ir, avnd grij| s| fac| tel.: 0040-264-530918 ajustarea caracterului nu ll. Astfel, n um e1 se copiaz| n m ax im , apoi dou| spaii se e-mail: antaltiberiu@pcnet.ro concateneaz| la m ax im i n final num e2 se concateneaz| la combinaia anterioar|. Rezultatul afieaz| numele celor dou| iruri stocate n variabila ir m ax im .

irurile sunt utile i simplu de utilizat, dar necesit| unele precauii. Este o eroare s| copiai un ir n altul care este declarat mai scurt dect sursa, deoarece compilatorul va realiza copierea i va suprascrie o poriune din program sau din date. Pentru c| nu exist| nici o dr. ing. ANTAL Tiberiu Alexandru Conf. metod| de a avertiza programatorul despre acest dezastru, e bine s| fii cu b|gare de seam|. Universitatea Tenhic| din Cluj-Napoca
Facultatea Construcii de Maini Pentru a g|si toate funciile de lucru cu iruri, consultai documentaia compilatorului (sau Catedra de Mecanic| i Programare sistemul lui de ajutor). Exist| funcii care copiaz| cel mult un num|r fixat de caractere, Curs de limbaj C altele adaug| caractere n faa, la mijlocul sau la cap|tul unui ir. Desigur, pot i scoate caractere de oriunde din ir. Merit| citit| aceast| documentaie pentru c|, n unele cazuri, Copyright 2001. Toateidrepturile sunt rezervate autorului. funciile peste care da va vor simplifica mult treaba. 7 Multiplicarea acestui document n scop comercial este interzis|.

9.10 Poantori la nv||mnt superior bugetar pot multiplica acest siruri Sudenii participani la orice form| de

Durata de existen| a irului, tehnic denumit constant| s ir , este static . Compilatorul va document pentru uzul date toate irurile care nu iniializeaz| un tablou de caractere. De personal. stoca n segmentul de exemplu, la o iniializare de forma char sir[ ]="Salut!"; caracterele din irul "Sa lut!" i variabila sir ar putea fi orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la stocate pe stiv|. Pentru exemplul care urmeaz| variabila poantor la caracter ptrSir este stocat| pe stiv|, cost iirul acordul scris al autorului. n acest pot multiplica documentul numai contra dar cu "Sir de caractere cu poantor" este ntotdeauna stocat n segmentul de date. scop m| putei contact| la:
1 2 3 4 5 6 7 8 9 /* TA B12.C */ ANTAL Tiberiu Alexandru #include <stdio.h>

tel.: 0040-264-530918 int main(void) e-mail: antaltiberiu@pcnet.ro


{ char *ptrSir; ptrSir ="Sir de ca ractere cu poan tor"; pu ts(ptrS ir); 140

10 11 12

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini return 0; Catedra de Mecanic| i Programare } Curs de limbaj C Rezultate: Sir de caractere cu drepturile sunt rezervate autorului. Copyright 2001. Toate poantor

Funcia pu ts() acestuidocument n scop de intrare este interzis|. Multiplicarea prime te ca parametru comercial adresa primului caracter din ir. Ea verific| dac| apare caracterul null ; dac| da, i ntrerupe execuia. Altfel, afieaz| caracterul curent pe ecran, adun| 1 la adresa lui, verific| dac| caracterul curent este nu ll Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest. etc. Observai c| opera iile de prelucare a irurilor sunt dependente de caracterul nu ll document pentru uzul personal. Acesta este motivul pentru care irurile sunt cunoscute i sub numele de iruri cu terminator nu ll, iar n unele documentaii mai apar i sub numele de iruri ASCII-Z. Sudenii metod| de stocare permite depnv||mnt cu plat| sau alte persoane doritoare Aceast| participani la orice form| de |irea limitelor de stocare fixe. Practic, irul poate pot multiplica documentul numaiRAM. n loc de pu ts() sescris al autorului. n acest fi orict de lung dac| ncape n contra cost i cu acordul poate folosi printf() pentru afiarea irului contact| la: scop m| putei scriind printf("% s",p trS ir);. Aici "%s" e un ir constant stocat n segmentul de date. ANTAL Tiberiu Alexandru Caracterele unui ir constant se stocheaz| n ordinea lor de apariie n locaii de memorie tel.: 0040-264-530918 consecutive, iar caracterul '\0' este ad|ugat automat la sfritul lui. e-mail: antaltiberiu@pcnet.ro
Optimiz|ri la la stocarea irurilor. Compilatorul poate s| nu stocheze dou| iruri, stocarea irurilor

Conform standardelor ANSI i ISO compilatoarele pot s| fac| optimiz|ri

dintre care unul este un subir al celuilalt, la adrese de memorie diferite.

9.10.1 Consideratii despre cresterea vitezei Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca programelor de Maini Facultatea Construcii
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Fie programul: Catedra de Mecanic| i Programare Curs de IT1.C */ /* SIRV limbaj C


#include<conio.h> #include<string.h> Copyright 2001. Toate

drepturile sunt rezervate autorului.

int main(void) Multiplicarea acestui document n scop comercial este interzis|. { char sirtab lou[ ]="Salut bad e!\n"; int i,lungime; Sudenii participani la orice form| de nv||mnt superior bugetar

pot multiplica acest

document pentru uzul personal.

lun gim e=str len(sirta blou ); for (i=0; i < lungim e; i++) Sudenii participani la orice form| pu tch(sirtab lou [i]);

de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest return scop m| putei 0; contact| la:
}

ANTAL Tiberiu Alexandru Rezultat: tel.: 0040-264-530918 Salut bade! e-mail: antaltiberiu@pcnet.ro El va afia irul "Salut bade!\n", caracter cu caracter, prin folosirea funciei pu tch (). nainte de fiecare incrementare a lui i se va afia caracterul sirtab lou[i] . La fiecare referire a unui element de tablou, locaia de memorie la care se afl| elementul se calculeaz| dup| formula &sirtablou[0] + i *sizeof(char). Altfel spus, C ncepe sa calculeze 7
141

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca adresa de baz| a lui sirtablou sau &sirtabolu[0], apoi determin| offset-ul i*sizeof(char) i Facultatea Construcii de Maini adun| cele dou| valori pentru a obine adresa elementului. n acest caz sizeof(char) d| 1 Catedra de Mecanic| i Programare i nmulirea este simplu de efectuat, dar dac| tabloul ar fi avut elemente de tipul float sau Curs le lucrurile s-ar fi complicat. La fiecare referire de element de tablou, este necesar | de limbaj C doub

realizarea unei nmuliri, operaie care este costisitioare ca timp de execuie. S| aducem Copyright 2001. Toate la forma: sunt rezervate autorului. programul de mai sus drepturile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* SIRV IT2.C */ Multiplicarea acestui #include<conio.h> #include<string.h>

document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. int main(void)
{ char sirtab lou[ orice form| e!\n"; Sudenii participani la ]="Salut bad de nv||mnt cu plat| sau alte persoane doritoare char *psir=sirtablou; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int i,lungime; scop m| putei contact| la: lun gim e=str len(psir);

ANTAL Tiberiu Alexandru for (i=0; i < lungim e; i++) tel.: 0040-264-530918 sir++ ); pu tch(*p e-mail: antaltiberiu@pcnet.ro
return 0; }

n linia 8 s-a ad|ugat un poantor psir care este iniializat n linia de declaraie. Rezultatul va fi identic cu cel al programului anterior, dar la fiecare reluare a ciclului se incrementeaz| psir i se afieaz| *psir . Altfel spus, deplasarea n ir se face prin Conf. dr. ing. ANTAL TiberiuCnd compilatorul ntlnete expresia psir++ , o aduce la incrementarea unui poantor. Alexandru Universitatea Tenhic| din Cluj-Napoca |t|ire este eliminarea determin|rii adresei forma psir+sizeof(char) . O alt| mbun Facultatea Construcii Cum nmulirile sunt operaii ncete, prin aceast| metod| am elementului de baz|. de Maini economisit timp. Incrementarea sau decrementarea unui poantor, pentru parcurgerea Catedra de Mecanic| i Programare unui de limbaj C Curstablou, este ntotdeauna mai rapid| dect generarea complet| a adresei unui element, avantaj de care putem beneficia numai dac| folosim notaia de poantor n locul celei de tablou. Copyright 2001. Toate drepturile sunt rezervate autorului.

9.10.2 Tablouri de poantori la siruri 1 char tsir[5][11]; 2 char *pts ir[5];

Multiplicarea acestui document n scop comercial este interzis|. tii deja c| n C ne putem referi la un element de tablou n mai multe moduri. Fie Sudeniiiile: declara participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest n linia 1, tsir este un tablou bidimensional cu elemente de tipul char, iar n linia 2, *ptsir scop un tablou de poantori la char. Sintactic, referirile de forma tsir[i][j] i pts ir[i][j] sunt este m| putei contact| la: corecte i echivalente. tsir este ns| un tablou pentru care se aloc| 5x11 locaii de tipul ANTAL Tiberiu Alexandru poziiei unui element tsir[r][c] este c+r*11 . n cazul lui ptsir se char, iar formula de calcul a tel.: | spaiu numai pentru un tablou de 5 poantori. Acetia nu sunt iniializai s| poanteze aloc 0040-264-530918 undeva, motiv pentru care utilizatorul trebuie s|-i iniializeze explicit n momentul e-mail: antaltiberiu@pcnet.ro declaraiei sau prin instruciuni ale programului. Presupunnd c| fiecare poantor poanteaz| la un ir de 11 caractere, se vor aloca 5x11 locaii pentru caractere i 5 locaii pentru poantori. Deci, din punctul de vedere al spaiului de memorie alocat, cea de a doua metod| este mai costisitoare. Atunci de ce s| o folosim? Avantajul celei de a doua metode
142

Capitolul 9 - Tablouri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca este c| irurile pot avea lungimi diferite. Fie declaraia: Facultatea Construcii de Maini Catedra deaj_err[5]={"an gre sit","lu na gre sita ", "zi in [0 ,31]", Mecanic| i Programare char *mes Curs re fata la"}; "eroa de limbaj C

"eroa re n ecu no scu ta",\

S-a iniializat un tablou m esaj_err de rezervate autorului. Copyright 2001. Toate drepturile sunt 5 elemente de tipul poantor la char. Observai c| nu este necesar ca irurile la care poanteaz| elementele tabloului mesa j_err s| aib| aceeai lungime. n Figura 19 se prezint| spaiul de date pentru declaraia de mai sus. Multiplicarea acestui document n scop comercial este interzis|. Dac| declaraia ar fi fost de forma: de nv||mnt superior bugetar pot multiplica acest Sudenii participani la orice form| document pentru uzul personal. char tmesaje[5][19]={"an gresit","luna gresita", "zi in [0,31]", "eroare necu no scu ta",\
"eroa re fata la"};

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare spa iul de date era cel din Figura 18. cost cu acordul cea mai mare este "eroare pot multiplica documentul numai contra irulicu lungimeascris al autorului. n acest necunoscuta" i are 18 caractere plus terminatorul de ir. nseamn| n total 19 caractere scop m| putei contact| la: pentru stocarea lui. tm esa je este un tablou de 5 elem en te de tipul tablou de 19 ele m en te de tipul char. Elementele tabloului de 5 elemente au toate acelai tip, i anume tablou de ANTAL Tiberiu Alexandru 19 elemente de tipul char. Indiferent dac| spaiul de 19 caractere este ocupat sau nu, se tel.: | 19 caractere pentru un element tme saje[i] . aloc 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Figura 18 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Figura 19 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

143

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

10 Structuri

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest tructura, numit personal. document pentru uzul | nregistrare (record ) n limbajele Ada i Pascal sau tupl| (tup le ) n programarea funcional|, este tipul de dat| cel mai general al limbajului C. Structura este format| din membri,de nv||mnt cuputnd avea un tip diferit de ceilali Sudenii participani la orice form| fiecare membru plat| sau alte persoane doritoare membri. Pentru c| tipul unui membru este arbitrar este posibil ca acesta s| fie el nsui pottip structurat, ca de exemplu tablou sau structur|. Tipul deal autorului. n permite un multiplica documentul numai contra cost i cu acordul scris dat| structur| acest scop m| putei contact| la: gruparea unor tipuri de date, distincte sau nu, sub un singur nume.
Modific|ri aduse tel.: 0040-264-530918 de parametri de tipul structur| funciilor i ntoarcerea unei valori de de standardizare

ANTAL Tiberiu n ANSI C sunt definite noiunile de atribuire a structurilor, transferul Alexandru

tipul structur e-mail: antaltiberiu@pcnet.ro | de c|tre funcie. Majoritatea compilatoarelor asigurau aceste facilit|i, f|r| ns| ca mecanismul de lucru s| fie unitar i definit precis. O declaraie de structur| specific| un nou tip de dat| i o secven| de variabile, numite membri sau cmpuri ale structurii, care pot avea tipuri distincte. Formele declaraiei de structur| sunt: Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca stru ct [tip ] { lista-m em bri } [ide ntifica tori ]; Facultatea Construcii de Maini Catedra de Mecanic| i Programare sau de limbaj C Curs
struc t tip 2001. Toate drepturile Copyright iden tificatori;

sunt rezervate autorului.

1 stru ct 2 { 3 4 5

Un identificator opional tip d| nume comercial este interzis|. Multiplicarea acestui document n scoptipului structurii i va putea fi utilizat ulterior la referirea tipului structur|. n C este necesar| utilizarea explicit| a cuvntului rezervat struct pentru a declara o variabilde de tipul structur|. identificatori sunt variabile Sudenii participani la orice form| | nv||mnt superior bugetar pot multiplica acest opionale de tipuluzul personal.in sub numele lor ntreaga secven| a membrilor din document pentru struct care lista-mem bri definii de acel tip structur|. Declaraia unui tip structur| este numai un ablon pentru declaraii ulterioare ale unor variabile de tipul structur|. Numele din Sudenii participani s| orice|form| de ori n aceeai structur|. alte persoane doritoare la apar de dou| nv||mnt cu plat| sau lista-mem bri nu pot pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: n continuare prezint modalitatea declar|rii unor tipuri de structuri. Declararea tipurilor Cuvntul struct va fi urmat de numele tip . Acest nume de tip permite de structuri identificarea ablonului, f|r| a realiza alocarea de memorie la crearea ANTAL Tiberiu Alexandru tipului structur|. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
Data int zi; int luna; int an; 144

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca }; Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj _fa struc t M em bruC m ilie { char nu m epers oa na [50]; Copyright varsta; 2001. Toate drepturile sunt rezervate autorului. int };

Multiplicarea acestui document n scop comercial este interzis|.


stru ct Su m a_ platita { Sudenii participani la orice form| struc t Data data _pla tii; document pentru uzul personal. long suma; char m otiv [255 ]; }; Sudenii participani la orice form|

de nv||mnt superior bugetar pot multiplica acest

de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest struc t Che ltuieli_f am ilie scop m| putei contact| la: {
struct Mem bru_familie cine; stru ct Sum a_ pla tita ANTAL Tiberiu Alexandru cit[2]; struc t Che ltuieli_f am ilie *ptrC heltuie li; tel.: 0040-264-530918 };

e-mail: antaltiberiu@pcnet.ro Tipul structur| cu numele de Da ta este format din trei ntregi. Avantajul fa| de folosirea unui tablou este c| membrii au nume sugestive i dac| este cazul pot avea tipuri distincte. n cazul unui tablou am fi avut trei elemente, numerotate cu 0, 1 i 2, toate de tipul int. Num|rul de ordine al elementului nu putea sugera semnificaia lui, trebuia ca noi s| reinem c| n elementul 0 am stocat ziua, n elementul 1 luna i n elementul 2 anul. Conf. dr. ing. ANTAL Tiberiu Alexandru Tipul de dat|Tenhic| din Cluj-Napocaem bru _fa m ilie este format din doi membri, un Universitatea structur| cu numele M tablou de caractere i un ntreg. Tipul structur| Su m a_ platita este format din trei Facultatea Construciiunul este de tipul structur| Da ta . i n final, tipul structur| membri dintre care de Maini Catedra de fam ilie , are trei membri, primul de tip structur|, al doilea tablou cu elemente Mecanic| i Programare Ch eltuieli_ Curs de structur|, iar ultimul poantor la un tip structur|. limbaj C de tipul Copyright 2001.Tipul structurii informeaz| compilatorul despre modul n care se va Toate drepturile sunt rezervate autorului. este declarat n liniile 1-6 . Numele zinastere i zisalar sunt nume de variabile. ntre acolada de nchidere i caracterul ; se pot specifica oricte Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest nume de variabile, separate prin virgul|, care vor deveni variabile de tipul structur| document pentru uzul personal. respectiv. Dac| dorim s| declar|m i alte variabile de acelai tip, ns| dup| caracterul ;, dei Da ta este un tip de dat| asemenea, de exemplu, lui int, struct trebuie s| precead| Sudeniitipului structurorice form| se poate scrie cu plat| estealte persoane doritoare numele participani la |, adic| nu de nv||mnt Da ta ci sau obligatorie scrierea sub pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest forma stru ct Data . scop m| putei contact| la:
stru ct Data { ANTAL Tiberiu Alexandru int zi; tel.: 0040-264-530918 int luna; e-mail:int an; antaltiberiu@pcnet.ro } zinastere, zisalar; struct Data zioarecare; stru ct D ata sapta m an a[7]; 145

Declararea unor construi variabila de tipul respectiv. Odat| ce avem declarat un tip variabile de tip structur| se pot declara variabile de tipul structur Multiplicarea acestui document n scop comercial este interzis|. |. Mai jos, tipul Da ta structur|

1 2 3 4 5 6 7 8 9 10

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini saptamana este un tablou de 7 ele m en te , fiecare element fiind o structur| de tipul Da ta . Catedra de Mecanic| i Programare Fiecare element are deci un an, o lun| i o zi distinct|. Ne referim la elementul 0 prin Curs de limbaj iar prin saptam ana[0].zi la membrul zi al elementului 0 . Pentru a accesa C saptamana[0] ,

elementului 4 scriem saptamana[4].luna etc. Copyright 2001. Toate drepturile sunt rezervate autorului. n capitolul despre tablouri am v|zut modul n care se foloseau Iniializarea variabilelor Multiplicarea acestui document n scop comercial estetablourilor cu una sau mai multe acoladele pentru iniializarea interzis|. de tip structur| dimensiuni. Iniializarea structurilor se face dup| o sintax| Sudenii participani lasimilar|. Dedeexemplu, dac| dorim s| iniializ|m variabila orice form| nv||mnt superior bugetar pot multiplica acest zioarecare n locul liniei 8 scriem: document pentru uzul personal.
luna stru ct D ata zioareca re ={19,12,19 76};

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numaiprimului membru - zi , a dou| valoare - 12 - n acest al prima valoare - 19 - i se atribuie contra cost i cu acordul scris al autorului. celui de scop m| putei contact|ila: doilea membru - luna a treia valoare - 1976 - membrului an . Dac| se declar| o variabil| de tipul structur| cu numele babe : ANTAL Tiberiu Alexandru struct Mem bru_familie babe; tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro iniializarea mem brilor ei se face astfel:
strcp y(bab e.nu m epe rsoa na ,"Sm ara nd a Q uiz "); babe.varsta=24;

Pentru c| este posibil ca o structur| s| declare membri de tipul structur|, voi prezenta un exemplu de inializare i pentru acest 7 Conf. dr. ing. ANTAL Tiberiu Alexandrucaz. S| presupunem ca se declar| o variabil| x de tipul structur| Su m a_ platita . n cazul tablourilor cu mai multe dimensiuni, pentru Universitatea Tenhic| din Cluj-Napoca fiecare dimensiune foloseam o pereche de acolade. Pentru structuri cu membri structur|, Facultatea Construcii de Maini iniializareaMecanic| i Programare Catedra de unui membru se face similar, fiind necesar| pentru fiecare astfel de membru cte o pereche de acolade. Curs de limbaj C
struct Su ma _platita x={ Copyright 2001. Toate drepturile sunt rezervate autorului. {12,7 ,197 6}, 12345000, "N im icuri" Multiplicarea acestui document n scop comercial este interzis|. };

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

10.1 Operatorul de selectie a unui Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare membru denumai contra cost i cu acordul scris al autorului. n acest 7 pot multiplica documentul structura

scop m| putei contact| la: Form a : 7 expresie.mem bru ANTAL Tiberiu Alexandru tel.: 0040-264-530918 operatorul de select ie a membrului "." i apoi de numele membrului O expresie urmat| de e-mail: antaltiberiu@pcnet.ro face selecia membrului din structur| sau reuniune (reuniunea sau union va fi prezentat| n capitolul urm|tor). Primul operand, exp resie , trebuie s| fie o structur| sau o reuniune, al doilea trebuie s| identifice un mem bru . Rezultatul este valoarea membrului selectat i este o l-value dac| membrul este o l-value , adic| poate s| apar| n stnga operatorului de atribuire.
146

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca /* STR UC T1.C */ Facultatea Construcii de Maini #include<stdio.h> Catedra de Mecanic| i Programare #include<string.h> Curs de limbaj C stru ct Data { Copyright r zi; Toate drepturile sunt rezervate autorului. 2001. cha char luna; Multiplicarea acestui document n scop comercial este interzis|. int an; };

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest struc t M em bru _fa m ilie document pentru uzul personal. {
char nu m e_ perso an a[50]; int varsta; Sudenii participani la orice form| char func tie[2 5];

de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: };
stru ct Su m aP latita ANTAL Tiberiu Alexandru { tel.: 0040-264-530918 _pla tii; struc t Data data e-mail:long suma; antaltiberiu@pcnet.ro char m otiv [255 ]; }; stru ct Ch eltu ieli { struct Mem bru_familie cine; stru ct ANTAL Tiberiu Alexandru Conf. dr. ing. Sum aP latita cit[2]; struc t Universitatea Che ltuieli *ptrC heltu ieli; Tenhic| din Cluj-Napoca };

Facultatea Construcii de Maini Catedra de Mecanic| i Programare int main(void) { Curs de limbaj C
struct Ch eltuieli a = {

Copyright 2001. Toate drepturile sunterezervate autorului. {"Sile a M icu ",47 ,"ca p d fa m ilie"},
{{{1,2,19 98 },100 000L ,"ch ef"}, {{3,4,19 99},2000000L ,"nun ta"}},

Multiplicarea NULL document n scop comercial este interzis|. acestui Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.%i, % s, a che ltuit as a:\ n", a.cine .nu m e_ perso an a,\ printf("%s, de v ars ta
a.cin e.va rsta , a.cin e.fu nctie); for(i=0;i<2;i++) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare printf("- zi = % i, luna = %i, an = %i, lei = % li, pe ntr u % s\n",\ pot multiplica documentul numai contra cost i, cu acordulta_ pla tii.a n, a .cit[i].sum a, \ a.cit[i].data_ platii.zi, a.cit[i].da ta_ pla tii.lu na a.cit[i].da scris al autorului. n acest scop m| otiv); contact| la: a.cit[i].m putei return 0; ANTAL Tiberiu Alexandru } tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Rezultate: Sile aMicu, de varsta 47, cap de familie, a cheltuit asa: - zi = 1, luna = 2, an = 1998, lei = 100000, pentru chef - zi = 3, luna = 4, an = 1999, lei = 2000000, pentru nunta }; int i;

147

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Dac| membrul de accesat este tablou cu o dimensiune, de Facultatea membru Accesul la un Construcii de Maini exemplu cit Catedra de Mecanic| i Programare, avnd elementele de tipul structur| Su m aP latita , tablou operatorul [ ] trebuie folosit pentru accesul la elementele tabloului Curs de limbaj C dup|, cum se observ| n liniile 48 i 49.

Accesul la un membru al unui membru structur|

Copyright 2001. Toate drepturile sunt rezervate autorului. lui o structur|, de exemplu Cnd un membru este la rndul membrul cine este o structur| de tipul M em bru _fa m ilie , trebuie Multiplicarea acestui document ndou| ori operatorul "." pentru a accesa un membru din folosit de scop comercial este interzis|. interiorul membrului structur| (vezi liniile 44 i 45 ). Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

10.2 Comparatie ntre tablou si Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest structura la: 7 scop m| putei contact|

Att tabloul ct i structura sunt tipuri de date structurate. Tipurile structurate se definesc n termenii unor tipuri deja existente. Exist| mai multe metode de combinare a ANTAL Tiberiu Alexandru a forma o structur| de date complex|, acestea fiind numite tipurilor constituente pentru metode de structurare . Metodele de structurare difer| prin strategia de construire a tel.: 0040-264-530918 tipului structurat i modalit|ile de acces la componentele acesteia. Variabila tablou e-mail: antaltiberiu@pcnet.ro grupeaz| componente de acelai tip, numite elemente, sub un singur nume, numele tabloului. Metoda de selectare a unei componente este indexarea, numele tabloului primind ca argument indexul pentru a selecta o component| particular|. Variabila structur| grupeaz| sub acelai nume componente de tipuri diferite, numite membri, metoda de acces la acestea fiind selectorul de membru. Putem spune c| ambele tipuri structurate permit gruparea de variabile sub un singur nume. n ciuda acestei asem|n|ri, Conf. dr. ing.trateaz| cele dou|Alexandru compilatorul ANTAL Tiberiu tipuri structurate diferit. Dup| cum tii deja, n C numele Universitatea Tenhic| din Cluj-Napoca de tablou. Pentru o variabil| de tipul structur|, unui tablou este adresa primului element Facultatea Construcii de Maini numele variabilei structur| este asemenea unui nume de variabil| simpl| (nu este adresa unui membru al structurii). Catedra de Mecanic| i Programare Curs de limbaj C Cnd un tablou se transfer| ca parametru al unei funcii nu se poate alege modul de transfer pentru c| numele tabloului este automat transformat ntr-un poantor constant Copyright 2001. Toate drepturile sunt rezervate autorului. la primul element de tablou. Nu exist| nici o metod| prin care s| for|m transferul unui parametru tablou prin valoare. n cazul structurii, decizia este la dispoziia Multiplicarea acestui document n scop comercial este interzis|. ct i prin poantor. programatorului, aceasta putndu-se transfera att prin valoare Sudenii participani la oriceun tablou.nv||mntposibil s| bugetar potun poantor acest O funcie nu poate ntoarce form| de Este ns| superior ntoarcem multiplica la un document pentru uzul personal. element de tablou, iar dac| acesta este chiar primul element putem spune c| ntregul tablou este ntors. Argumentul de mai sus este ns| prea slab n comparaie cu structura, care se poate ntoarce orice form| de nv||mnt poantor. Sudenii participani laatt prin valoare ct i prin cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Cele m| putei contact| fi sintetizate n tabelul urm|tor: scop spuse mai sus pot la: Tip Numele obiectului ANTAL Tiberiu Alexandru obiect tel.: 0040-264-530918 este e-mail: antaltiberiu@pcnet.ro tablou poantor constant la primul element Transfer n caz de parametru de functie poantor Valoare ntoarsa de 7 funcie -

148

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini structura structura n sine 7 valoare sau poantor Catedra de Mecanic| i Programare Curs de limbaj C

prin valoare sau prin poantor

Copyright 2001. Toate drepturile sunt rezervate autorului. 10.3 Atribuirea structurilor

O variabil| de tipul structur| poate fi atribuit| unei alte variabile de acelai tip structur| Multiplicarea acestui document n scop comercial este interzis|. prin intermediul lui "=" . Valorile tuturor membrilor variabilei structur| din dreapta lui = vor fi copiate n membrii variabilei structur| din stnga lui = (inclusiv membri tablou sau Sudenii|). De exemplu, folosind tipul structur| Da ta declarat mai sus i dou| variabile structur participani la orice form| de nv||mnt superior bugetar pot multiplica acest zi1 i zi2 , dintre care prima este ini ializat|, document pentru uzul personal.
struct Data zi1 {28,7,1967}, zi2; Sudenii participani la orice form|

de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest este corect s| scriem: scop m| putei contact| la:
zi2=zi1

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 complicat| va fi structura, toi membrii ei se vor copia. n cazul Indiferent de ct de e-mail: antaltiberiu@pcnet.ro este imposibil| pentru c| numele tabloului este un poantor tablourilor, o astfel de operaie constant la primul element de tablou. n cazul unei declaraii de forma:
char a[8 0], b[80 ];

o atribuire de genul "b=a" ar ncerca s| modifice adresa poantorului constant b la cea a lui a , lucru imposibil pentru c| poantorul fiind constant, el va poanta tot timpul execuiei Conf. dr. ing. aceeai adres|. Compilatorul va sanciona o astfel de atribuire printr-un programului ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca mesaj de eroare. De asemenea, este imposibil| comparaia ntre dou| variabile de tipul Facultatea dar comparaia se poate face membru cu membru, dac| membrii nu sunt structur|, Construcii de Maini Catedra sauMecanic| i Programare tablouri de structuri. Curs de limbaj C Copyright 2001. Toate drepturile suntvariabilelor de tipul 10.4 Transferul rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. structura ca parametri de functii 7 -

Dac| n cazul tabloului nu era de ales, la structuri o variabil| se poate transfera prin Sudeniisau prin poantor. Problema de nv||mnt superior bugetar pot multiplica acest valoare participani la orice form| care se pune este de alegere a celei mai avantajoase document pentru uzul personal. iile de transfer se deruleaz| prin stiv|, n sensul c| metode de transfer. Toate opera obiectele de transferat se copiaz| pe aceasta. Dac| obiectul este mare copierea lui va dura Sudenii participani rula ncet. n plus, apare posibilitatea dep|iriipersoane doritoare mult i programul va la orice form| de nv||mnt cu plat| sau alte dimensiunii maxime a stivei. Transferul unui poantor va ocupacostmult 4 octei. Transferul unei valori acest pot multiplica documentul numai contra cel i cu acordul scris al autorului. n de tipul structur putei contact| la: scop m| | va fi dependent de tipul membrilor structurii. Alegerea ntre copierea a 4 octei sau a unui num|r mai mare este simpl|. Putem spune c| este mai avantajoas| folosirea transferului prinAlexandru ANTAL Tiberiu poantor, aceasta asigurnd i independena de spaiul necesar pentru stocarea variabilei structur|. Considernd tipul structurat Da ta , cele dou| metode de tel.: 0040-264-530918 transfer posibile sunt ilustrate n urm|toarele prototipuri: e-mail: antaltiberiu@pcnet.ro
void f_ va loar e(stru ct Data zi); void f_ poa ntor(stru ct Data *zi);

iar apelurile celor dou| funcii, considernd o variabil| cu numele zi de tipul structurat
149

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Da ta sunt: Facultatea Construcii de Maini Catedrare(zi); de Mecanic| i Programare f_v aloa Curs detor(& zi);C f_p oan limbaj

n primul 2001. Toate drepturile sunt | din 3 tipuri int care Copyrightcaz, variabila zi fiind formatrezervate autorului. se stocheaz| pe 4 octei pe stiv| se vor copia 12 octei. n cel de al doilea caz, poantorul va ocupa pe stiv| numai 4 octei. Multiplicarea acestui document n scop comercial este interzis|.

10.5 Poantori la structuri


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 stru ct Data { ANTAL Tiberiu Alexandru cha r zi; tel.: 0040-264-530918 char luna; e-mail:int an; antaltiberiu@pcnet.ro }; void cite ste_ da ta(struct Da ta *);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Transferul prin poantori este mai eficient dect cel prin valoare dar codul din funcii devine mai complicatla orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani de scris. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest /* STR UC T2.C */ scop m| putei contact| la: #include<stdio.h>

int main(void) { struc t ANTAL Tiberiu Alexandru Conf. dr. ing. Data o_zi; cites te_da ta(& din Cluj-Napoca Universitatea Tenhic| o_zi); prin tf("Da ta es te: %i, % i, %i\ n",o_zi.zi, o_zi.lun a, o_ zi.an ); Facultatea Construcii de Maini }

Catedra de Mecanic| i Programare void citeste_ daC Curs de limbaj ta(struc t Data *pzi)
{ prin tf("zi = ");

Copyright nf("% i",& (*pzi).zi); 2001. Toate drepturile sunt rezervate autorului. sca
prin tf("lun a = "); sca nf("% i",& (*pzi).lu na ); Multiplicarea acestui document n scop comercial este interzis|. prin tf("an = "); sca nf("% i",& (*pzi).a n);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest } document pentru uzul personal. Rezultate: zi = 28 participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii luna = 12 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest an = 1978 scop m| putei contact| la: Data este: 28, 12, 1978 ANTAL Tiberiu Alexandrupoantor n cazul transferului unui tel.: 0040-264-530918 accesa prin: e-mail: antaltiberiu@pcnet.ro
(*p).mem bru p

la o structur|, un membru numit

m emb ru

se va

Observai aceast| form| de scriere n liniile 22 , 24 , 26 . ntrebarea care apare este legat| de necesitatea folosirii parantezelor rotunde.
150

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare De cede limbaj C s| scriem (*p).mem bru n loc de *p.mem bru ? Cei doi operatori, "*" i Curs este necesar "." au precedene diferite. Operatorul de selecie a unui membru de structur|, "." , are precedena2001.mai mare. Astfel, sunt rezervate*p.mem bru , avem implicit *(p.mem bru). Copyright cea Toate drepturile dac| se scrie autorului. Pentru ca la compilare totul s| mearg| bine, p ar trebui s| fie o structur|. Dar p nu este o structur|, ci un poantor la structur|. Dac| totui p ar fi fost o structur|, mem bru ar fi Multiplicarea acestui documentar fi aflat valoarea este interzis|. | p.mem bru . Adic| ar fost accesat, ns| operatorul "*" n scop comercial la care poanteaz fi fost departe de a accesa ceea ce credeam noi - valoarea lui mem bru poantat| de p . Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Deoarece au folosit mult poantorii la structuri, Kernighan i Ritchie au inventat un operator nou care s| fie mai simplu de folosit. El era format din dou| caractere separate, "-" i ">" participani la oricedat "-> ". Era ceva similar cu "/" combinat cu "*"doritoare a Sudenii care combinate au form| de nv||mnt cu plat| sau alte persoane din care rezultat "/*", adic| secvena de deschidere cost i comentariu. Formaautorului. complicat| pot multiplica documentul numai contra a unui cu acordul scris al de scriere n acest (*p).mem bru devine p->mem bru , fiind mai uor de scris i de citit. scop m| putei contact| la:

10.5.1 De ce (*p).membru?

10.5.2 Utilizarea lui p->membru


void citeste_ da ta(struc t Data *pzi) { prin tf("zi = "); sca nf("% i",& pzi->zi); prin tf("lun a = "); sca nf("% i",& pzi->lun a); Conf. dr. ing. ANTAL Tiberiu Alexandru prin tf("an = "); sca nf("% i",& pzi->an ); Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Dup| cum se observ| n codul care urmeaz|, de exemplu (*pzi).zi devine pzi->zi. e-mail: antaltiberiu@pcnet.ro

Catedra de Mecanic| i Programare Ce se petrece ns| dac| membrul structurii este la rndu-i o structur|? Curs de limbaj C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 /* STR UC T3.C */ Copyright 2001. Toate drepturile sunt rezervate autorului. #include<stdio.h> stru ct Data { Multiplicarea acestui document n scop comercial este interzis|. cha r zi; char luna; Sudenii participani la orice form| de nv||mnt superior bugetar int an; }; document pentru uzul personal.

pot multiplica acest

struct Persoana Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest char nu m e[8 0]; struc t Data data na scop m| putei contact| la: sterii; };

ANTAL Tiberiu s(stru ct Pe rsoa na *); void cite ste_ per Alexandru tel.: sc rie_ per s(stru void 0040-264-530918ct Pe rsoa na *); e-mail: antaltiberiu@pcnet.ro
int main(void) { stru ct Pe rsoa na un ul; cites te_per s(& un ul); 151

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca scrie_ per s(& un ul); Facultatea Construcii de Maini Catedra de Mecanic| i Programare return 0; Curs de limbaj C } void citeste_pers(struct Persoana *om) Copyright 2001. Toate drepturile sunt rezervate {

autorului.

Multiplicarea acestui document n scop comercial este interzis|. prin tf("N um ele: ");
gets (om ->nu m e); prin tf("zi = "); Sudenii participani la orice form|rii.zi); de nv||mnt superior bugetar pot multiplica acest sca nf("% i",& om ->da tan aste document pentru uzul personal. prin tf("lun a = "); sca nf("% i",& om ->da tan aste rii.lun a); prin tf("an = "); Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare sca nf("% i",& om ->da pot multiplica documentul tan aste rii.an );cost i cu acordul scris al autorului. n acest numai contra }

scop m| putei contact| la:

void scrie_pers(struct Persoana *om) { ANTAL Tiberiu Alexandru prin tf("N um ele tel.: 0040-264-530918 este: % s\n ", om ->nu m e); prin tf("\tD ata nasterii este: %i, e-mail: tan aste rii.lun a, om ->da tan aste rii.an ); om ->da antaltiberiu@pcnet.ro }

%i,

%i\ n",om ->da tana sterii.zi,\

Rezultate:
Numele: Ion Apostol zi = 11 luna = 12 Conf. 1947 ANTAL Tiberiu Alexandru an = dr. ing. Numele este: Tenhic| din Cluj-Napoca Universitatea Ion Apostol Data nasterii este: 11, 12, 1947

Facultatea Construcii de Maini Catedra decMecanic| sterii este un membru structur|, membrul zi este accesat prin Observa i | da tana i Programare Curs detanasterii.zi i nu prin om->da tanasterii->zi , din moment ce da tana sterii este o om->da limbaj C structur| i nu un poantor la structur|. Copyright 2001. Toate drepturile sunt rezervate autorului. Am spus deja | transferul printr-un poantor este este interzis|. Multiplicareacacestui document n scop comercialmai eficient dect cel prin referin|, dar n cazul acestui transfer este posibil| modificarea valorilor poantate de poantor, ceea ce este uneori un dezavantaj. n cazul de nv||mnt superior bugetar pot multiplica acest Sudenii participani la orice form|tablourilor acest fapt este de neevitat, iar elementele tabloului vor putea fi ntotdeauna modificate n interiorul funciei care le primete ca document pentru uzul personal. parametru. Un dezavantaj al transferului prin poantor al parametrilor structur| este cazul n care nu dorim s| realiz|m modific|ri ale structurilor n interiorul funciei, dar din Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare grab|, de exemplu, n locul operatorului "==" scriem "=" . pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Soluia acestei probleme este utilizarea cuvtului cheie const discutat n Utilizarea lui paragraful 3.3.2. La fel ca n cazul unei variabile obinuite, este posibil const ca un poantor s| fie declarat poantor constant. De exemplu, prin ANTAL Tiberiu Alexandru declaraia const float *x; se declar| x ca un poantor la un float constant. tel.: 0040-264-530918 Valoarea stocat| n poantor se poate modifica. De exemplu, putem scrie x-;, dar valoarea e-mail: antaltiberiu@pcnet.ro stocat| la adresa respectiv| nu se poate modifica, adic| nu se poate scrie *x=21; ntruct compilatorul va semnala linia cu eroare. n cazul structurii, folosirea lui const conduce la un poantor la o structur| constant|, motiv pentru care membrii structurii nu vor putea fi modificai prin intermediul poantorului.
152

10.5.3 Problema transferului prin poantor

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

10.6 ntoarcerea unei valori structura de catre o functie 7 7 Copyright 2001. Toate drepturile sunt rezervate autorului.

Funciilor li se pot transfera structuri prin valoare i pot ntoarce structuri, dei de multe ori aceast| modalitate de ntoarcere este ineficient|. Consideraiile legate de eficiena Multiplicarea acestui document aceleai comercial este interzis|. de parametri. Cu ct ntoarcerii structurilor r|mn n scop ca n cazul transferului structura este mai mare, cu att eficiena transferului prin valoare este mai sc|zut| fa| de cea prin poantor. Exist| form| de nv||mnt superior bugetar pot valori structur| Sudenii participani la orice cazuri n care beneficiile transferului unei multiplica acest permit implementarea unor operatori. Un astfel de caz se prezint| n continuare. document pentru uzul personal. Presupunem c| dorim s| scriem o funcie care s| poat| aduna dou| numere complexe. ntoarcerea unei valori structur| permite scrierea cu plat| sau ad un ac() care doritoaren Sudenii participani la orice form| de nv||mnt unei funcii alte persoane s| apar| dreapta unui egal. Dac| c1 i c2 sunt cele dou| numere complexe, iar n c3 dorim s| stoc|m pot multiplica documentul numai contra cost i cu acordul scris ad autorului. n acest | suma celor dou| numere, scriem c3=c1+c2 . Folosind funcia al un ac(), ce realizeaz scop m| putei contact| la: c3=adun ac(c1,c2) (vezi linia 15 ). adunarea complex|, scriem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

ANTALPLE X1.CAlexandru /* CO M Tiberiu */ #include <stdio.h> tel.: 0040-264-530918 e-mail:complex antaltiberiu@pcnet.ro struct
{ doub le real,imagin ar; }; void a fisa rec(s truct com plex a); stru ct com plex ad un ac(struct com plex a, stru ct com plex b);

Conf. dr. ing. ANTAL Tiberiu Alexandru int main(void) Universitatea Tenhic| din Cluj-Napoca { Facultatea Construcii de Maini struct complex c1={1.,2.}, c2={-2.,3.}, c3; Catedra de du na c(c1,c2 ); c3=a Mecanic| i Programare Curs de limbaj C afis are c(c3);
return 0; Copyright 2001. Toate drepturile sunt rezervate autorului. }

Multiplicarea acestui complex a)n scop comercial este interzis|. void afisarec(struct document { prin tf("%+lf %+lf\n ",a.re al,a.im Sudenii participani la orice form| deag ina r); nv||mnt superior bugetar } document pentru uzul personal.
struct complex adunac(struct complex a, struct complex b) { Sudenii participani la orice form| de nv||mnt cu plat| sau struct complex suma=a;

pot multiplica acest

alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: su m a.re al+=b .rea l;
sum a.imagina r+=b.imaginar;

ANTAL Tiberiu Alexandru return suma; tel.: 0040-264-530918 } e-mail: antaltiberiu@pcnet.ro Rezultat:
-1.000000 +5.000000

Varianta de scriere a programului folosind poantorii este:


153

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca /* CO M PLE X2 .C */ Facultatea<stdio.h> Construcii de Maini #include Catedra de Mecanic| i Programare Curs de limbaj struct complex C { doub le real,imagin ar; Copyright 2001. Toate drepturile sunt rezervate autorului. };

Multiplicarea acestuicom plex a); scop comercial este interzis|. void a fisa rec(s truct document n void a du na c(stru ct com plex *a, struct com plex *b, struct com plex *su m ac); Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int main(void) document pentru uzul personal. {
struct complex c1={1.,2.}, c2={-2.,3.}, c3; ad un ac(& c1,& c2,& c3); Sudenii participani la orice form| de nv||mnt afis are c(c3);

cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei 0; return contact| la:
}

ANTAL Tiberiu Alexandru void afisarec(struct complex a) tel.: 0040-264-530918 { e-mail:prin tf("%+lf %+lf\n ",a.re al,a.im ag ina r); antaltiberiu@pcnet.ro
} void adu nac(struct complex *a, struct complex *b, struct complex *sum ac) { su m ac-> rea l=a->rea l+b->rea l; sum ac->imagina r=a->imaginar+b->ima ginar; } Conf. dr. ing. ANTAL Tiberiu Alexandru

Universitatea Tenhic| din Cluj-Napoca Pentru acest program se folosete transferul prin poantori pentru toi parametrii. Chiar Facultatea Construcii de Maini daca nu exist| ineficientul transfer prin valoare, observai modul n care suntem obligai 7 Catedram funcia de adunare ad un ac(& c1,& c2,& c3); (vezi linia 14 ) spre deosebire de linia s| apel| de Mecanic| i Programare Cursdu na c(c1,c2 ); din programul precedent. c3=a de limbaj C
O eroare fatal|

Copyright 2001. Toate drepturile sunt|rezervate autorului. primului program pentru a Probabil unii mai gr bii ar fi rescris codul lucra cu transferul prin poantori sub forma: Multiplicarea acestui document n scop comercial este interzis|.
struct complex* adunac(struct complex a, struct complex b) { Sudenii participani la suma=a; orice form| de nv||mnt superior bugetar struct complex

pot multiplica acest

document pentru uzul personal.

su m a.re al+=b .rea l; sum a.imagina r+=b.imaginar; Sudenii participani la orice form| de

nv||mnt cu plat| sau alte persoane doritoare pot multiplica &suma; documentul numai contra cost i cu acordul scris al autorului. n acest return scop m| putei contact| la: } Programul con Alexandru ANTAL Tiberiuine o eroare fatal|. Variabila s um a este stocat| pe stiv|, adic| spaiul pentru aceasta este alocat pe stiv| la intrarea n funcie i eliberat la ieirea din aceasta, tel.: 0040-264-530918 astfel c| dup| ieirea din funcie, adresa poantat| de & su m a nu mai face parte din spaiul e-mail: antaltiberiu@pcnet.ro de date al programului.

154

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

10.7 Crearea unei liste nlantuite 7 prin folosirea structurilor Copyright 2001. Toate drepturile sunt rezervate autorului.

Limbajul C permite crearea i manipularea unor structuri de date avansate cum ar fi listele nl|nuite, arborii, grafele etc. n cele ce urmeaz| prezint cel mai simplu caz, lista Multiplicareauita, folosit| pentru scop comercial este interzis|. simplu nl|n acestui document n stocarea unor numere ntregi (int ). Lista sim plu 7 nlant uita este o structur| de date n care fiecare element conine un poantor la urm|torul - 7 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru Figura 20 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro element, formndu-se astfel o list| liniar|. Reprezentarea ei grafic| o gasiti n Figura 20, 7 iar un element al listei se declar| prin structura:
stru ct elem en t { int data; /* aici este stocata data "u tila" */ struct element * elem_urm ; } Conf. dr. ing. ANTAL Tiberiu Alexandru

Universitatea Tenhic| din Cluj-Napoca Structura cu numele element are o particularitate curioas| i anume aceea c| se refer| la Facultatea Construcii de Maini ea ns|i. Am ntlnit deja aa ceva n cazul funciilor cnd am vorbit despre recursivitate. Catedra dese vede, aceasta apare att la nivelul funciilor ct i la cel al datelor. Structura Dupa cum Mecanic| i Programare 7 Curs de limbaj C | dintr-un ntreg de tipul int i un poantor la o structur| de tipul element este format element . Dei compilatorul nu tie exact ce nseamn| un poantor la o structur| de tipul Copyright 2001. Toate drepturile sunt i necesari pentru stocarea unui poantor. Astfel element , el cunoate num|rul de octe rezervate autorului. creeaz| un spaiu n structur| necesar pentru stocarea unui poantor. n programul LIS TA 1.C listaacestui document declararea a patru variabile de tipul element . Observai Multiplicarea este creat| prin n scop comercial este interzis|. c| mai nti este declarat i iniializat elementul e4 care este ultimul element al listei. ntruct acest element orice urma , fiind ultimul, superior bugetar pot multiplica acest Sudenii participani lanu areform|de nv||mnt valoarea corespunz|toare poantorului la urm|torul element de list| este iniializat| cu valoarea NULL . Apoi este declarat e3 i document pentru uzul personal. legat de e4 prin iniializarea din linia 12 . Aceasta este singura metod| prin care elementele listei pot fi legate, adic| nu se poate s|-l declar|m pe e3 i s| ncer|m s|-l Sudenii participani la orice form| de nv||mnt cu plat| sau nu exist| nu-i doritoare leg|m de un e4 care nc| nu exist| (pentru c| din moment ce alte persoane cunoatem pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest adresa). scop m| putei contact| la:
1 2 3 4 5 6 7 8 9 10 /* LISTA 1.C */ #in clude<std io.h> ANTAL Tiberiu Alexandru

tel.: ct elem en t { 0040-264-530918 stru e-mail:int data; antaltiberiu@pcnet.ro


struct element *elem_urm ; }; int main(void) { 155

11 12 13 14 15 16 struct elem ent Copyright 2001. Toate *el_cu rent sunt 1; drepturile = &e rezervate autorului. 17 18 while (el_curent != NULL) 19 Multiplicarea acestui document n scop comercial este interzis|. { 20 prin tf("Va loar ea este: %i\n ", el_c uren t->da ta); 21 el_curent=el_curent->elem_urm ; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 22 } 23 document pentru uzul personal. 24 return 0; 25 } Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca stru ct elem en t Facultatea Construcii e4 = {-1, & e4}; }; de = {22, NULL Maini stru ct elem en t e3 Catedra de ct elem en ti Programare Mecanic| e2 = {12, & e3}; stru Curs de limbaj C en t e1 = {10, & e2}; stru ct elem

pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Rezultate: scop m| putei contact| la: Valoarea este: 10
Valoarea este: 12 ANTAL Tiberiu Alexandru Valoarea este: -1 Valoarea este: 22 tel.: 0040-264-530918

e-mail: antaltiberiu@pcnet.ro O alternativ| pentru crearea listei este codul:


1 2 3 4 5 6 7 8 9 10 stru ct stru ct stru ct stru ct stru ct elem en t elem en t elem en t elem en t elem en t e4 = {22, NULL }; e3 = {-1, N ULL }; e2 = {12, N ULL }; e1 = {10, N ULL }; *el_curen t;

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea = &e4; e3.elem_urm Tenhic| din Cluj-Napoca e2.elem_u rm = &e3; Facultatea Construcii de Maini e1.elem_urm = &e2; i Programare Catedra de Mecanic| el_cure nt=&e 1; Curs de limbaj C Aici n prima etap| poantorii nu poanteaz| nic|ieri, fiind iniializai toi cu valoarea NULL , Copyright 2001. Toate drepturile sunt rezervate din liniile 7-10 care duce la nl|nuirea dup| care poantorii sunt completai prin codul autorului. elementelor listei. Ordinea iniializ|rilor este important|. De exemplu, dac| s-ar fi folosit Multiplicarea acestui document n scop comercial este interzis|. secvena:
e4.elem_u rm = &e3; Sudenii participani la orice form| e3.elem_u rm = &e2; document pentru uzul personal. e2.elem_ urm = &e1; el_curent=&e4;

de nv||mnt superior bugetar pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare leg|multiplica documentul numai contra opusie4 este primul element i e1 este ultimul), pot turile ntre elemente se fac n sensul cost ( cu acordul scris al autorului. n acest dup| cum se poate observa scop m| putei contact| la: la afiarea rezultatelor:
Valoarea este: 22 ANTAL Tiberiu Alexandru Valoarea este: -1 tel.: 0040-264-530918 Valoarea este: 12 Valoarea este: 10 e-mail: antaltiberiu@pcnet.ro

156

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Poriunea de program care realizeaz| afiarea elementelor listei este un exemplu clasic Curs de limbaj C de vizitare a tuturor elementelor din list|. Spaiul datelor este prezentat n Figura 21, adresele folosite n figur| au un rol didactic, uurnd nelegerea operaiei de parcurgere Copyright 2001. Toate drepturile sunt rezervate autorului. n poantorul el_curent prin a listei. Adresa primului element de list| este stocat| atribuirea din linia 16 (vezi LIS TA 1.C ). Modul de nl|nuire a elementelor listei ne oblig| s| o parcurgem ntr-un singur sens. comercial este liniei 16 Multiplicarea acestui document n scop Dac| n locul interzis|. scriam struct element *el_curent = &e4; parcurgerea listei ar fi fost compromis|, pentru c| e4 nu are un element urm|tor.participani la orice form| dese mai numete i coada listei ,pot multiplica acest Sudenii Acest ultim element al listei nv||mnt superior bugetar iar primul element, acela cu care se ncepepersonal. document pentru uzul parcurgerea listei, capul listei .

10.7.1 Parcurgerea listei simplu nlantuite 7 -

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Figura 21 Parcurgerea listei prin vizitarea tuturor elementelor ei se realizeaz| prin ciclul w hile din linia 18 . Ct timp el_curent este diferit de valoarea NULL se va executa afiarea valorii stocate n membrul data al structurii, apoi prin linia de program el_curen t = Conf. dr. ing. ANTAL adresa Alexandru el_curent->elem_u rm; Tiberiuurm|torului element din list| este transferat| n el_curent. Universitatea Tenhic| din Cluj-Napoca vor fi stocate pe rnd adresele 0x0065FDD8, Observai c| n poantorul el_curent 0x0065FDE0, 0x0065FDE0, 0x0065FDF0 i, n final, valoarea special| NULL , caz n care Facultatea Construcii de Maini condiia de reluare a corpului ciclului w hile devine fals |. Catedra de Mecanic| i Programare Curs de limbaj C

10.8 Instructiunea typedef Copyright 2001. Toate drepturile sunt rezervate autorului.

n C clasic, tipurile de date definite de utilizator nu primeau un nume, excepie f|cnd struct (i union care va fi discutat n paragaful urm|tor). Chiar i n acest caz, declaraiile Multiplicarea acestui document n scop comercial este interzis|. acestor variabile trebuiau precedate de cuvintele struct sau union . ANSI C, implementeaz| un nou nivel de ascundere a informaiilor prin typedef. Aceasta permite Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest crearea de noi nume pentru tipurile de date, prin asocierea unui tip de dat| existent la un document pentru uzul personal. nume, apoi putndu-se declara variabile de acel tip. Iat| cteva exemple: Sudenii in t *ptrIn t; la orice form| de nv||mnt cu plat| sau alte persoane doritoare typ ed ef participani typ ed ef cha r N um e[22 ]; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest typedef enum contact| la: scop m| putei {mascul, femela, necunoscut} sex;
typ ed ef struct { Num e num e,prenume; ANTAL Tiberiu Alexandru sex Gen; short Varsta; tel.: 0040-264-530918 float Med ie; e-mail: antaltiberiu@pcnet.ro } stud en t; typ ed ef stude nt a nd estud ii[10 0]; Form a : 7

typede f nu m e_d ef_tip identificator 157

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini typedef permite simplificarea scrierii declaraiilor de date conducnd la compactizarea i Catedra de Mecanic| i Programare uniformizarea programelor. Nu se poate folosi n interiorul unei funcii. O declaraie Curs de specificC un nume care, n cadrul vizibilit|tii declaraiei, devine sinonim al tipului limbaj | typedef

specificat n seciunea nu m e_d ef_tip din declaraie. Spre deosebire de declaraiile struct, Copyright 2001.typedef nu creeazsunt rezervate | nou, ci numai un nou nume pentru un union i enum , Toate drepturile | un tip de dat autorului. tip deja existent. Se poate spune c| typedef este asemenea lui #define cu excepia c| este interpretat| de compilator i nu de preprocesor. este interzis|. Multiplicarea acestui document n scop comercialFie declaraiile:
typ ed ef cha r CHAR; la oricecaracter */ Sudenii participani /* tip form| de nv||mnt superior typ ed ef C HAR * PS TR ; /* poan tor la un sir (char *) */ document pentru uzul personal. poan tor far la un sir */ typedef CHAR far * LPSTR /*

bugetar pot multiplica acest

Sudenii introduse prin orice form| de mai sus sunt sinonime cu tipurile urm|toare: Numele participani la declaraiile de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:Tip sinonim Nume
CHAR char ANTAL Tiberiu Alexandru tel.: 0040-264-530918 char * PSTR e-mail: antaltiberiu@pcnet.ro LPSTR char __far *

Rolul lui typedef

Conform celor spuse deja typedef nu aduce nimic nou n semantica declaraiilor, adic| variabilele declarate cu typedef au aceleai propriet|i cu cele ale c|ror declaraii sunt scrise explicit. Primul motiv al folosiriiing.typedef const| n creterea lizibilit|ii programelor. Al doilea const| n faptul lui ANTAL Tiberiu Alexandru Conf. dr. c| typedef permite ascunderea datelor asigurnd independena implement|rii de detaliile Universitatea Tenhic| din Cluj-Napoca acesteia. Dac| un program are poriuni dependente de maina pe care se ruleaz|, folosirea Facultatea permite ca numai declaratiile typedef s| fie modificate la mutarea programului lui typedef Construcii de Maini Catedra de Mecanic| i Programare pe o alt| main|. Curs de limbaj C

10.9 Tipul de data union 7


Copyright 2001. Toate drepturile sunt rezervate autorului.
union sau tipul reuniune este similar cu struct, dar n interzis|. Multiplicarea acestui document n scop comercial este cazul unei

variabile de tipul union toi membrii acesteia sunt stocai ncepnd de la aceei adres| de memorie, sub numele variabilei de tipul union , practic partajndu-se memoria total| a reuniunii ntre acest Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica toate componentele ei. Se va aloca spaiul maxim pentru fiecare variabil| de tipul union , prin document pentru uzul personal. alocarea spaiului pentru membrul de dimensiunea cea mai mare a reuniunii. Sub numele reuniunii se va stoca o singur| component|. Eventual, este posibil accesul sub forma mai Sudenii participani la acelaiform| de locaii de memorie alocate pentru reuniune. Forma multor tipuri de date la orice grup de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest general| este: scop m| putei contact| la:
Form a : 7

ANTAL Tiberiu Alexandru <num e_m emb ru1>; <tip1> tel.: 0040-264-530918<tip2> <num e_m emb ru2>; e-mail: antaltiberiu@pcnet.ro . . .
<tipn> <num e_m em brun>; };

union <num e_u nion> {

158

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Variabila de tipul union permite deci stocarea la momente diferite a unor valori de tipuri Facultatea Construcii de Maini diferite n aceeai zon| de RAM. Utilizarea lui union poate produce erori grave n execuie Catedra de Mecanic| i Programare dac| se manipuleaz| o variabil| de tipul union f|r| a ti care din valorile posibile au fost Curs de n ea. OC stocate limbaj modalitate de evitare a acestei capcane st| n stocarea ntr-o variabil|

auxiliar| a unei valori ce s| permit| identificarea tipului valorii stocate n union . Copyright 2001. Toate drepturile sunt rezervate autorului.
/* UN ION .C */ #include<stdio.h> Multiplicarea acestui document n scop comercial este interzis|. #define INTREG 1 #define REAL 2 Sudenii participani la orice form| de nv||mnt superior bugetar #define CARACTER 3

pot multiplica acest

document pentru uzul personal.


m ain () {

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare stru ct { pot multiplicaint iCare; numai contra cost i cu acordul scris al autorului. n acest documentul scop m| puteiunion { la: contact| ANTAL Tiberiu tel.: 0040-264-530918 }; e-mail:} antaltiberiu@pcnet.ro tab lou stru ct[3];
int i; tabloustruct[0].iCare=INTREG; tabloustruct[0].iA=10; tabloustruct[1].iCare=REAL; tabloustruct[1].fA=11.123457; int iA; float fA; Alexandru char cA;

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca tabloustruct[2].iCare=CARACTER; Facultatea Construcii de='a'; tablou str uct[2 ].cA Maini Catedra de Mecanic| i Programare for(i=0 ;i<3;i++) { Curs de limbaj C

switch (tab lou stru ct[i].iCa re) { cas e IN TR EG :prin tf("intr eg = %d \n ", tab lou stru ct[i].iA); Copyright 2001. Toate drepturile sunt rezervate autorului. break; cas e R EA L:pr intf("r eal = %f\ n", tablou stru ct[i].fA); break; Multiplicarea acestui document n scop comercial este interzis|. cas e CAR AC TE R:p rintf("caracter = % c\n ", tab lou stru ct[i].cA); brea k; Sudenii participani t: prin tf("Eroarde nv||mnt superior bugetar pot multiplica de falu la orice form| e/n "); } document pentru uzul personal. } }

acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Rezultate: scop m| putei intreg = 10 contact| la:
real = 11.1234 caracter = a

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

10.10 Cmpuri de biti 159

Ca o completare adus| membrilor unui tip struct sau tip union , identificatorului unui membru i se poate specifica printr-o declaraie num|rul de bii pe care se va stoca. Acest tip de membru se va numi cmp de bii. Lungimea se specific| n declaratorul numelui de

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca cmp prin caracterul ":" . Un cmp de bii este interpretat ca tip ntreg. Facultatea Construcii de Maini Catedra de Mecanic| i Programare Form a : limbaj C d eclarato r : expresie constanta 7 tip 7 Curs de exp resie 2001. Toate drepturile sunt de bii ai cmpului. 7 Copyrightconstanta specific| num|rulrezervate autorului. Tipul declaratorului poate fi: unsigned int, signed int sau int, iar ex pre sie constanta trebuie s| fie un ntreg pozitiv. 7

Nu este permis| declararea de tablouri, poantori estecmpuri de bii sau de funcii care Multiplicarea acestui document n scop comercial de interzis|. ntorc cmpuri de bii. Nu se poate aplica operatorul & asupra acestor cmpuri. Cmpuri anonime participani la orice form| de nv||mnt superior bugetar dar acestea nu acest Sudenii (f|r| nume) pot fi declarate n scopul alinierii n memorie, pot multiplica pot fi referite, iar coninutul lor este nedefinit n timpul execuiei programului. M|rimea documentde bii trebuie s| fie suficient de mare pentru a conine num|rul de bii. n acest cmpului pentru uzul personal. sens, urm|toarea declaraie este ilegal|: Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest short a:17; scop m| putei contact| la: n exemplul care urmeaz| se definete un tablou bidimensional de structuri cu numele de ecran : Tiberiu Alexandru ANTAL tel.: 0040-264-530918 struct e-mail: antaltiberiu@pcnet.ro {
unsigned unsigned uns igned uns igned } ecr an [25][8 0]; short short short short caracter: 8; culoare:4; sub liniere:1; blink :1;

Conf. dr. ing. ANTAL Tiberiufiecare element este o structur| cu patru membri cmpuri Tabloul are 2000 de elemente, Alexandru Universitatea Tenhic| din Cluj-Napoca blink . M|rimea structurii este de 2 octei. de bii: caracter, culoare , subliniere i Facultatea Construcii de Maini ANSI C de Mecanic| i Programare din punct de vedere semantic ca ntregi. Aceasta Catedra trateaz| cmpurile de bii nseamn| c| unCcmp de bii va fi folosit ntr-o expresie n mod identic cu o variabil| Curs de limbaj ntreag|, indiferent de num|rul de bii din cmp. Pentru compilatorul C al Microsoftului cmpurile de bii se aliniaz| n interiorul unui tip int ncepnd de la bitul cel mai puin Copyright 2001. Toate drepturile sunt rezervate autorului. semnificativ. Fie codul: Multiplicarea acestui document n scop comercial este interzis|. struc {
unsigned short a:3; unsigned short orice Sudenii participani la b:6; form| de nv||mnt superior bugetar pot multiplica acest unsigned short c:7; document pentru uzul personal. } x; void main(void) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest x.a=2; /* in bina r 10 */ scop m| putei contact| r 111 */ la: x.b=7; /* in bina x.c=0; /* in bina r 0 */ } ANTAL Tiberiu Alexandru

tel.: 0040-264-530918 biii vorantaltiberiu@pcnet.ro e-mail: fi stocai astfel:


00000000 00111010 cccccccb bbbbbaaa

Observai c| accesul la cmpurile de bii este acelasi cu cel la membri struct sau union . 160

Capitolul 10 - Structuri Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Exis de Maini Facultatea Construcii| cazuri cnd spaiul de RAM este critic i dorim s| l ocup|m ct Cnd se folosesc mai bine, mpachetnd mai multe variabile ntr-un singur octet al Catedra de Mecanic| i Programare cmpurile cu bii? mainii. Un alt motiv sunt interfeele, care impun un anumit mod de Curs de limbaj C grupare a biilor unui octet, de exemplu, pentru a comanda un dispozitiv

hardware legat la calculator. Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

161

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

11 Consideratii privind stilul de programare n limbajul C generalizarea sortarii prin 7 inserare directa cu ajutorul 7 poantorilor la functii -

e numete sortare procesul de rearanjare, pe baza unui criteriu, a unei mulimi de obiecte, ntr-o ordine specific|. Rolul Conf. dr. ing. ANTAL Tiberiu Alexandru sort|rii este facilitarea g|sirii unor obiecte din mulimea Tenhic| din Cluj-Napoca algoritmilor de sortare spune c| algoritmul de Universitatea de obiecte sortate. Teoria sortare ales este dependent de structura datelor de sortat. n general, metodele de Facultatea Construcii de Maini sortare sunt clasificate n dou| categorii mari: sortarea fisierelor i sortarea tablourilor. Catedra de Mecanic| i Programare Cele dou| strategii sunt uneori numite i sortare externa, pentru c| fiierele sunt stocate 7 Curs de limbaj C n memorii externe (de exemplu hard disk-uri), respectiv interna pentru c| tablourile sunt 7 stocate n memoria intern| (RAM) a calculatorului. Copyright 2001. Toate drepturile sunt rezervate autorului.

11.1 Terminologie si notatii Multiplicarea acestui document n scop comercial este interzis|.

Fiind date articolele a1,a2, ..., an, sortarea const| n permutarea lor n ordinea ak1, ak2, ..., Sudenii participani la oricefuncie f de ordonare, superior f(a ) # f(a ) # ...# f(a acest akn, astfel nct fiind dat| o form| de nv||mnt s| avem bugetar pot multiplica kn). n k1 k2 document pentru uzul personal. cazurile banale, funcia de ordonare nu se evalueaz| pe baza unor expresii matematice, ci se stocheaz| explicit ntr-un membru numit cheie a unei structuri care va ine i articolele Sudenii participani la orice form| destructur | care stocheaz| cele descrise mai sus este: de sortat. Din cele spuse, tipul de dat| nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest struct tip_obiect { scop m| putei contact| la: int cheie; float a; ANTAL Tiberiu Alexandru /* "alte componete" ale structurii */ tel.: 0040-264-530918 }; e-mail: antaltiberiu@pcnet.ro Comentariul " alte componente" din structura de mai sus reprezint| date relevante, caracteristice pentru fiecare obiect de sortat. cheie reprezint| un cmp ntreg care identific| unic un obiect din mulimea de sortat. Alegerea lui ca ntreg este oarecum arbitrar|, practic fiind posibil| alegerea oric|rui tip pentru care se poate defini o relaie
162

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca de ordine total|. Facultatea Construcii de Maini Catedra de Mecanic| i Programare n continuare vom studia cazul sort|rii tablourilor in situ , cnd algoritmul de sortare Curs de limbaj C n acelai tablou n care la nceperea sort|rii erau obiectele nesortate. produce rezultatul

Exist| algoritmi de sortare intern| care produc rezultatul sort|rii ntr-un tablou nou, de Copyright 2001. Toatetip cu cel desunt rezervate autorului. principiul minimiz|rii risipei aceeai dimensiune i drepturile sortat. Se merge deci pe de RAM din calculator. Deoarece cantitatea de RAM necesar|, conform celor afirmate, se rezum| chiar la tabloul original de comercial este interzis|. Multiplicarea acestui document n scopsortat, adic| sortarea se face n tabloul original nesortat, trebuie s| alegem criterii de evaluare a algoritmului studiat diferite de cantitatea de RAM folosit| pentru sortare. Eficiena acestor algoritmi se va m|sura prin Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest num|rul de comparaii de chei C i a num|rului de modificari prin atribuirile A ale 7 document pentru uzul personal. obiectelor de sortat n vederea realizarii sortarii. Aceste numere (C i A ) sunt funcii de 7 7 num|rul n al obiectelor de sortat. Un algoritm de sortare performant are C proporional Sudenii participani lanorice form| de nv||mnt cu plat| saucontinuare se va prezenta cu n lg (n) respectiv cu 2, cnd algoritmul este mai modest. n alte persoane doritoare pot multiplica sortare prin inserare direct|. i cu acordul scris al autorului. n acest algoritmul de documentul numai contra cost scop m| putei contact| la:

11.2 Sortarea prin inserare directa 7

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Metoda const| n divizarea conceptual| a tabloului de sortat a ntr-o secven| destinaie e-mail: antaltiberiu@pcnet.ro valorilor de chei, i una surs|, a , ..., a , nc| nesortat|. La a1, ..., ai-1,deja sortat| pe baza i n fiecare pas, ncepnd cu i=2 (al doilea articol) i incrementnd pe i, elementul cu numarul de ordine i din irul surs| este selectat pentru a fi mutat n secvena destinaie, 7 prin inserare la locul dictat de valoarea cheii. Procesul de g|sire a locului obiectului ai se face prin operaiile de comparare i/sau deplasare, inserare. Obiectul ai se compar| cu obiectul curent aj din secvena destinaie dupa care, fie se insereaz| n secvena destinaie, 7 fie obiectul aj ANTAL Tiberiu stnga cu o poziie n secvena destinaie. Algoritmul este se deplaseaz| la Alexandru Conf. dr. ing. formulat n liniile urm|toare: Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini variabila a este tablou[1..n] de tipul tip_obiect Catedra de Mecanic| i Programare Curs de limbaj C sortare_prin_inseraredirecta() { Copyright 2001. Toate drepturile sunt rezervate autorului. variabile ntregi i, j; variabile de tipul tip_obiect x; repeta pentru i:=2 pna la n 7 Multiplicarea acestui document7n scop comercial este interzis|. { x:=a[i]; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest j=i-1; document pentru uzul personal. repeta ct timp ((j >=1) i (x.cheie < a[j].cheie)) <- COMPARATIE 7 , { Sudenii participani a[j+1]=a[j]; <- ATRIBUIRE cu plat| sau alte persoane doritoare la orice form| de nv||mnt pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest j=j-1; scop m| putei}contact| la: a[j+1]=x; <- ATRIBUIRE } ANTAL Tiberiu Alexandru } 0040-264-530918 tel.: e-mail: antaltiberiu@pcnet.ro Num|rul de comparaii de chei C i n deplasarea a i-a este cel mult i-1 i cel putin 1 . Num|rul A i de atribuiri de obiecte este C i+1 , aadar num|rul total de comparaii i atribuiri pentru cele doua cazuri extreme sunt: 7

163

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Mentionez ca n formulele de mai sus i reprezinta numarul de reluari a ciclului exterior, 7 7 7 7 n timp ce n descrierea algoritmului acelasi i reprezinta pozitia Multiplicarea acestui document n scop comercial este interzis|. elementului de inserat. 7 Cel mai favorabil caz apare cnd obiectele sunt iniial ordonate. Cel mai defavorabil caz apare cnd acestea sunt ordonate invers. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

11.3 Implementarea algoritmului de Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: sortare
ANTAL Tiberiu Alexandru /* SIN DIR 1.C */ #include<stdio.h> tel.: 0040-264-530918 e-mail: b[10 ] = {3,6,1,2,3 ,8,4 ,1,7,5 }; antaltiberiu@pcnet.ro int iTa
void sinsdir(int a [ ], int N); int main(void) { int i; Conf. dr. ing. ANTAL Tiberiu Alexandru pu tcha r('\n'); for(i=0;i<10;i++) Universitatea Tenhic| din Cluj-Napoca prin tf("%d ", iTa b[i]);

Facultatea Construcii de Maini Catedra de Mecanic| i Programare sin sdir(iTa b,10 ); Curs de limbaj C pu tcha r('\n');

for(i=0;i<10;i++) Copyright 2001. Toate drepturile sunt rezervate autorului. prin tf("%d ", iTa b[i]);

Multiplicarea acestui document n scop comercial este interzis|. return 0;


}

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest void sinsdir(int a [ ], int N) document pentru uzul personal. {
int i,j; in t iX ; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare for (i=1;i<N;i++) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest { scop m| puteiiX =a[i]; la: contact| j=i-1; w hile ((iX < a ANTAL Tiberiu Alexandru [j]) { tel.: 0040-264-530918 a[j+1 ]=a[j]; e-mail: antaltiberiu@pcnet.ro j=j-1; } a [j+ 1]=iX ; } } 164 && (j >= 0))

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

11.4 Sa revenim la problema initiala 7 - 7 ... poantorii la sunt rezervate autorului. functii Copyright 2001. Toate drepturile

S| consider|m urm|toarea problem| real|. Dorim s| scriem o funct ie care sa poata 7 7 sorta virtual orice colect ie d e da te ce se poate stoca ntr-un tablou. Ar putea fi un tablou Multiplicarea acestui document n scop comercial este interzis|. de iruri, unul de ntregi sau unul de valori reale sau chiar de structuri. SIN SD IR 1.C este scris pentru sortarea unor ntregi. Ce ar trebui s| modific|m pentru ca programul s| lucreze participani la orice form| de nv||mnt superior bugetar pot ia de comparare Sudenii i cu alte tipuri de date? ncepem cu funcia sin sd ir() , unde funcmultiplica acest va fi modificat|. uzul personal. document pentru
/* SIN SD IR2.C */ Sudenii participani #include<stdio.h>

la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int iTa b[10 ] = {3,6,1,2,3 ,8,4 ,1,7,5 }; scop m| putei contact| la:
void sinsdir(int a [ ], int N); ANTAL Tiberiu Alexandru int co m pa ra(in t m , int n );

tel.: 0040-264-530918 int main(void) e-mail: antaltiberiu@pcnet.ro


{ int i; pu tcha r('\n'); for(i=0;i<10;i++) prin tf("%d ", iTa b[i]);

Conf. dr. ing. ANTAL Tiberiu Alexandru pu tcha r('\n'); Universitatea Tenhic| din Cluj-Napoca for(i=0;i<10;i++) Facultatea Construcii de Maini prin tf("%d ", iTa b[i]); Catedra de Mecanic| i Programare Curs de limbaj0; return C
}

sin sdir(iTa b,10 );

Copyright 2001. Toate drepturile sunt rezervate autorului.


void sinsdir(int a [ ], int N) { Multiplicarea acestui document n scop comercial este interzis|. int i,j; in t iX ; for (i=1;i<N;i++) Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest { document pentru uzul personal. iX =a[i]; j=i-1; Sudenii participani(com pa ra(iX ,a[j]) && (j >= 0)) cu plat| sau alte persoane doritoare w hile la orice form| de nv||mnt pot multiplica{documentul numai contra cost i cu acordul scris al autorului. n acest a[j+1 ]=a[j]; scop m| putei contact| la: j=j-1; } ANTAL Tiberiu Alexandru a [j+ 1]=iX ; } tel.: 0040-264-530918 } e-mail: antaltiberiu@pcnet.ro int compara(int m, int n) { retu rn (m < n); } 165

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Pentru c| dorim ca funcia de sortare s| fie independent| de tipurile de date de sortat, o Catedra de Mecanic| i Programare variant| de lucru este folosirea de poantori la tipuri void n loc de poantori la tipul int. Curs denceput,C Pentru limbaj programul va fi putin modificat pentru a ne apropia de o variant| din care -

sa se poata face trecerea simpl| la varianta cu poantori void . Versiunea care urmeaz| este 7 7 Copyright 2001. Toate la int. modificat| la poantori drepturile sunt rezervate autorului.
/* SIN SD IR3.C */ Multiplicarea acestui #include<stdio.h>

document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int iTa b[10 ] = {3,6,1,2,3 ,8,4 ,1,7,5 }; document pentru uzul personal.
void sinsdir(int *p a, in t N); int co m pa ra(in t *m , intorice Sudenii participani la *n );

form| de nv||mnt cu plat| sau alte persoane doritoare pot main(void)documentul numai contra cost i cu acordul scris al autorului. n acest multiplica int scop m| putei contact| la: {
int i; pu tcha r('\n'); ANTAL Tiberiu Alexandru for(i=0;i<10;i++) tel.: 0040-264-530918 prin tf("%d ", iTa b[i]);

e-mail: antaltiberiu@pcnet.ro
sin sdir(iTa b,10 ); pu tcha r('\n');

for(i=0;i<10;i++) prin tf("%d ", iTa b[i]); return 0; Conf. dr. ing. ANTAL Tiberiu Alexandru } Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii deN) void sinsdir(int *p a, in t Maini { Catedra de Mecanic| i Programare int i,j; Curs de limbaj C

in t iX ; for (i=1;i<N;i++) Copyright 2001. Toate drepturile sunt rezervate autorului. { iX =pa [i]; Multiplicarea j=i-1; document n scop comercial este interzis|. acestui w hile (com pa ra(& iX ,&p a[j]) && (j >= 0)) { Sudenii participani pa orice form| de nv||mnt superior bugetar pot multiplica acest la [j+1]=p a[j]; j=j-1; document pentru uzul personal. } p a[j+ 1]=iX ; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare } pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest }

scop m| putei contact| la:


int compara(int *m, int *n) { ANTAL Tiberiu Alexandru retu rn (*m < *n); tel.: 0040-264-530918 }

e-mail: antaltiberiu@pcnet.ro Observai modific|rile. Acum lui sin sd ir() i se transfer| un poantor la int, iar din funcia sin sd ir() se transfer| poantori la elementele unui tablou care dorim s| fie comparat prin intermediul funciei de comparare com pa ra(). Normal, n com pa ra() se face dereferenierea poantorilor pentru a putea face comparaia dorit|. n urm|torul pas se vor
166

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca converti poantorii din sin sd ir() la poantori la tipul void pentru ca funcia s| devin| i mai Facultatea Construcii de Maini independent| de tipuli Programare Catedra de Mecanic| datelor de sortat. Curs de limbaj C /* SIN SD IR4.C */ #include<stdio.h>

Copyright 2001. Toate drepturile sunt rezervate autorului.


int iTa b[10 ] = {3,6,1,2,3 ,8,4 ,1,7,5 };

Multiplicarea acestui in t N); void sinsdir(int *p a, document n scop comercial este interzis|.
int co m pa ra(v oid *m , void *n);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int main(void) document pentru uzul personal.
{

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pu tcha r('\n'); for(i=0;i<10;i++) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteiprin tf("%dla: iTa b[i]); contact| ", ANTAL Tiberiu Alexandru pu tcha r('\n'); tel.: 0040-264-530918 e-mail:for(i=0;i<10;i++) antaltiberiu@pcnet.ro
return 0; } void sinsdir(int *p a, in t N) { Conf. dr. ing. ANTAL Tiberiu Alexandru int i,j; in t iX Universitatea; Tenhic| din Cluj-Napoca for Construcii Facultatea (i=1;i<N;i++) de Maini { Catedra de Mecanic| i Programare iX =pa [i]; Curs de limbaj C j=i-1; w hile (com pa ra((v oid *)&iX , (void *)&pa [j]) && (j >= 0)) { Copyright 2001. Toate drepturile sunt rezervate autorului. pa [j+1]=p a[j]; j=j-1; Multiplicarea }acestui document n scop comercial este interzis|. p a[j+ 1]=iX ; } Sudenii participani la orice form| de nv||mnt superior bugetar pot } sin sdir(iTa b,10 );

int i;

prin tf("%d ", iTa b[i]);

multiplica acest

document pentru uzul personal.

int compara(void *m, void *n) { Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int *m1, *n1; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest m 1= (int *) m ; scop m| putei contact| la: n1= (int *) n; retu rn (*m 1 < *n1); } ANTAL Tiberiu Alexandru

tel.: 0040-264-530918 Observai c| n apelul lui com pa ra() s-a introdus operatorul de conversie forat| a tipului e-mail: antaltiberiu@pcnet.ro poantorilor de la void la tipul de dat| de sortat n momentul actual. Pentru c| ceea ce se transfer| lui sin sd ir() este nc| tot un poantor la ntregi, ar trebui s| convertim aceti poantori n poantori la tipul void cnd i transfer|m ca parametri n linia de apel a lui com pa ra() .
167

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca Sa revenimConstrucii de Mainiir() . Dorim s| facem primul parametru de tipul void , dar 7 Facultatea la problema lui sin sd n acelai timp trebuie fProgramare iX care i el este de tipul int. De asemenea, acolo Catedra de Mecanic| i |cut ceva cu unde apare iX=p a[i]; tipul lui pa[i] trebuie s| fie cunoscut pentru a ti ci octei vor fi Curs de limbaj Cn orice alt| variabil| care ar putea fi substituit| cu iX . copia i n iX sau

Copyright 2001. Toate drepturile suntsin sdir() obine informaii despre tipul datelor de Versiunea SIN SD IR 4.C , prin funcia rezervate autorului. sortat, deci i despre dimensiunea individual| a fiec|rui element de tablou datorita 7 faptului c| primul parametru este poantor la tipul ntreg. Dac Multiplicarea acestui document n scop comercial este interzis|.| dorim s| modific|m pe sin sd ir() ca s| sorteze orice tip de dat|, trebuie ca acel poantor s| fie la tipul void . Dar aa se pierdeparticipanilegat| deform| de nv||mnt superior bugetar tablou, motiv pentru Sudenii informaia la orice m|rimea individual| a elementului de pot multiplica acest care n SIN SD IR 5.C acesta se transfer| ca parametru separat. document pentru uzul personal.
/* SIN SD IR5.C */ Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare #include<stdio.h> pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest #include<string.h>

scop m| putei contact| la:

lon g iT ab [10] = {3 ,6,1,2 ,3,8 ,4,1,7 ,5};

ANTAL Tiberiu Alexandru t m arim e, void sinsdir(void *pa , size_ tel.: 0040-264-530918 int co m pa ra(v oid *m , void *n); e-mail: antaltiberiu@pcnet.ro
int main(void) { int i; pu tcha r('\n'); for(i=0;i<10;i++) prin tf("%d ", iTa b[i]);

int N );

Conf. dr. ing. ANTAL Tiberiuab [0],10); sin sdir(iTa b, siz eof iT Alexandru Universitatea Tenhic| din Cluj-Napoca pu tcha r('\n'); Facultatea Construcii de Maini for(i=0;i<10;i++) Catedra de Mecanic| i Programare prin tf("%ld ", iTa b[i]); Curs de limbaj C
return 0; } Copyright 2001.

Toate drepturile sunt rezervate autorului. este interzis|.

voi d sin sd ir (v oi d *p a, s iz e_ t m a ri m e, in t N) Multiplicarea acestui document n scop comercial { int i,j;

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest un documentsig ne d cha r personal. pentru uzul cB ufX [4];
unsigned char *bpa=pa;

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare for (i=1;i<N;i++) { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei/* iX=pa [i]; */ contact| la:

m em cpy (cBu fX , bpa +i*m arim e, m arim e); j=i-1; ANTAL Tiberiu Alexandru ra( (vo id *) & cB ufX , (void *) (bpa +j*m arim e)) && (j >= 0 )) w hile (com pa { tel.: 0040-264-530918 m em cpy e-mail: antaltiberiu@pcnet.ro(bpa +(j+1)*m arim e, bp a+j*m arim e, m arim e); /* pa[j+1]=pa[j]; */ j=j-1; } m em cpy (bpa +(j+1)*m arim e, cB ufX , ma rim e); /* a[j+1]=iX; */ 168

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C int compara(void *m, void *n) { long *m 1, *n1; Copyright 2001. Toate drepturile sunt rezervate autorului. m 1= (lon g *) m ; n1= (long *) n;

Multiplicarea acestui*n1); retu rn (*m 1 < document n scop comercial este interzis|.
}

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Observai c| tipul uzul personal. document pentru de dat| al tabloului a trecut de la int la long , aceasta pentru a ilustra c| sunt necesare modific|ri i n com pa ra(). Problema lui iX este i ea rezolvat| printr-un buffer de 4 caractere f|r| semn folosit pentru a stoca un long . Poantorul la caractere f|r| Sudenii participani lapentru a poantanv||mnt cu element) tabloului de sortat. semn *bpa este folosit orice form| de baza (primul plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei s| se modifice i ceea ce i se tranfser| lui com pa ra() i felul n care se face A fost necesar contact| la: deplasarea elementului de inserat. Utilizarea lui m em cpy() i notaia de poantor n locul celei de tablou duc la reducerea dependenei de tipul de dat|. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Trecemantaltiberiu@pcnet.ro e-mail: n continuare la S IN SDIR6.C care sorteaz| iruri de caractere n locul celor de ntregi long . Desigur, trebuie s| modific|m funcia de comparaie din moment ce irurile se compar| altfel dect ntregii.
/* SIN SD IR6.C */ #include<stdio.h> #include<string.h> #define MA X_B UF 256

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca char sT ab2[6][23] = {"Shiva mb u K alpa", Facultatea Construcii de Maini "De m agistro", Catedra de Mecanic| i"Yoga S utra", Programare "Param arthasa ra", Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


void sinsdir(void *pa , size_ t m arim e, int N ); int co m pa ra(v oid *m , void *n); int main(void) Sudenii participani la orice form| de { int i; document pentru uzul personal. pu tcha r('\n'); for(i=0;i<6;i++) Sudenii participani la orice sTa b2[i]); prin tf("%s \n ", form| de

"Shiva-P uran a", "Pa du ka Pa nc ha ka "};

Multiplicarea acestui document n scop comercial este interzis|. nv||mnt superior bugetar pot multiplica acest

nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest sin sdir(sT ab 2,23 ,6); scop m| putei contact| la:
pu tcha r('\n\ n');

ANTAL Tiberiu Alexandru for(i=0;i<6;i++) tel.: 0040-264-530918 \n ", sTa b2[i]); prin tf("%s e-mail: antaltiberiu@pcnet.ro
return 0; } voi d sin sd ir (v oi d *p a, s iz e_ t m a ri m e, in t N) { 169

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca int Facultatea i,j; Construcii de Maini Catedra de Mecanic|ri Programare_B UF]; un sig ne d cha cB ufX [M AX Curs de limbaj C char *bpa=pa; unsigned for Copyright (i=1;i<N;i++) drepturile sunt rezervate autorului. 2001. Toate { m em cpy (cBu fX , bpa +i*m arim e, m arim e);

Multiplicarea j=i-1; document n scop comercial este interzis|. acestui


w hile ((j>=0) && (com par a((void *)& cB u fX , (void *)(bpa +j*m arim e)) != 0)) { Sudenii participani m em cpyform| de nv||mnt superior bugetar pot multiplica acest la orice (bpa +(j+1)*m arim e, bp a+j*m arim e, m arim e); document pentru uzul personal. j=j-1; } m em cpy orice form| de nv||mnt cu plat| Sudenii participani la(bpa +(j+1)*m arim e, cB ufX , ma rim e);sau alte persoane doritoare } pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest }

scop m| putei contact| la:

int compara(void *m, void *n) { ANTAL Tiberiu Alexandru int k; tel.: 0040-264-530918 ch ar *m 1 = m ; e-mail:char *n1 = n; antaltiberiu@pcnet.ro k=s trcm p(m 1,n1); if (k < 0) return 1; return 0; }

Faptul c| sin sd ir() nu s-a schimbat n raport cu varianta din SIN SD IR 5.C indic| faptul c| Conf. dr. ing. ANTAL Tiberiu Alexandrutipuri de date. Ceea ce a r|mas de f|cut este funcia poate sorta un domeniu larg de Universitatea Tenhic| din Cluj-Napoca pe care dorim s| o utiliz|m pentru ca algoritmul transferul numelui funciei de comparare s| fie ntr-adev|r general. La fel Facultatea Construcii de Maini cum numele tabloului este adresa primului element din tablou nde Mecanic|de date, numele funciei se descompune n adresa acelei funcii din Catedra segmentul i Programare segmentul de cod. Astfel, vom folosi un poantor la funcie, n acest caz unul la funcia de Curs de limbaj C comparare. Copyrightla funcToate drepturile sunt rezervate autorului.parametri, respectiv de valori Poantorii 2001. ii trebuie s| fie identici ca num|r i tip de returnate, cu funciile la care poanteaz|. Pentru cazul nostru se declar| poantorul la Multiplicarea acestui document n scop comercial este interzis|. funcie sub forma: Sudenii participani co nst void *); de nv||mnt superior bugetar pot multiplica acest int (*p f)(con st vo id*, la orice form| document pentru uzul personal. Atenie, dac| n loc de linia de mai sus am fi scris int *pf(const void*, const vo id *) am fi avut prototipul pentru o funcform| de nv||mnt cu plat| sau alte persoanepentru c| n Sudenii participani la orice ie care ntoarce un poantor la ntreg. Aceasta doritoare C operatorul parantez| () numai contra | mai cu acordul scris al autorului. n acest pot multiplica documentul are preceden cost i mare dect operatorul poantor * . Prin punerea parantezelor sub forma (*pf) se specific| faptul c| declar|m un poantor la o scop m| putei contact| la: funcie. Acum modific|m declaraia funciei sin sd ir() prin ad|ugarea unui al 4-lea parametru, un poantor la funcia corect|. Prototipul funciei devine astfel: ANTAL Tiberiu Alexandru tel.: sinsdir(void *pa void 0040-264-530918 , size_ t m arim e, int N , int (*pf)(const vo id*, co nst void *)); e-mail: antaltiberiu@pcnet.ro Cnd se apeleaz| sin sd ir() , se utilizeaz| numele funciei de comparaie dorit. Programul SIN SD IR 7.C ilustreaz| modul n care aceast| abordare permite utilizarea aceleiai funcii sin sd ir() pentru sortarea diferitelor tipuri de date.
170

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca /* SIN SD IR7.C */ Facultatea Construcii de Maini #include<stdio.h> Catedra de Mecanic| i Programare #include<string.h> Curs de MA X_B #define limbaj C UF 256 lon g lT ab [9] = {1,5,7,3,5,9,8,5 ,6}; Copyright 2001. Toate drepturile sunt rezervate autorului. char sT ab2[6][23] = {"Shiva mb u K alpa", "De m agistro", Multiplicarea acestui documentutra", comercial este interzis|. "Yoga S n scop "Param arthasa ra", Sudenii participani la "Shiva-P uran a", ka "}; orice form| de nv||mnt superior bugetar "Pa du ka Pa nc ha

pot multiplica acest

document pentru uzul personal.

void sinsdir(void *pa , size_ t m arim e, int N , int (*pf)(const vo id*, co nst void *)); int co m pa ra_ long(const void *m , con st vo id *n ); cu plat| sau alte persoane doritoare Sudenii participani la orice form| de nv||mnt int c om pa ra_ sir(co nst void *m , con st vo id *n );

pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei int main(void) contact| la:
{ int i; ANTAL Tiberiu Alexandru pu ts("\n Ina inte tel.: 0040-264-530918 de s orta re:\n "); e-mail:for(i=0;i<9;i++) antaltiberiu@pcnet.ro prin tf("%ld ", lTab[i]); pu ts("\n "); for(i=0;i<6;i++) prin tf("%s \n ", sTa b2[i]); sin sdir(lTa b,4,9,com pa ra_ long); sin sdir(sT ab 2,23 ,6,com Alexandru Conf. dr. ing. ANTAL Tiberiupa ra_ sir); Universitatea Tenhic| din Cluj-Napoca pu ts("\n \n Du pa de s orta re:\n "); Facultatea Construcii de Maini for(i=0;i<9;i++) Catedra de Mecanic| i Programare prin tf("%ld ", lTab[i]); pu ts("\n "); Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


return 0; } Multiplicarea acestui

for(i=0;i<6;i++) prin tf("%s \n ", sTa b2[i]);

document n scop comercial este interzis|. acest

void sinsdir(void *pa , size_ t m arim e, int N ,int (*pf)(con st vo id*, co nst void *)) Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica { document pentru uzul personal. int i,j;

un sig ne d cha Sudenii participani r cB ufXform| de nv||mnt cu plat| sau alte persoane doritoare la orice [M AX _B UF]; unsigned char *bpa=pa; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: for (i=1;i<N;i++) { m ANTAL Tiberiuem cpy (cBu fX , bpa +i*m arim e, m arim e); Alexandru j=i-1; tel.: 0040-264-530918 w hile ((j>=0) && (p f((void *)&c Bu fX , (void e-mail: antaltiberiu@pcnet.ro {

*)(bpa +j*m arim e)) != 0))

m em cpy (bpa +(j+1)*m arim e, bp a+j*m arim e, m arim e); j=j-1; } m em cpy (bpa +(j+1)*m arim e, cB ufX , ma rim e); } 171

Capitolul 11 - Considera ii privin d stilul de pro gra Conf. dr. ing. ANTAL Tiberiu Alexandru mare n limb ajul C Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini Catedra de Mecanic| i Programare int compara_sir(void *m, void *n) Curs de limbaj C { int k; ch ar *m 1 = m ; Copyright 2001. =Toate drepturile sunt rezervate autorului. char *n1 n; k=s trcm p(m 1,n1); Multiplicarea0) return 1; if (k < acestui document n scop comercial este interzis|. return 0; }

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. int compara_long(void *m, void *n)
{ long *m 1,*n1; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare m 1 = (long *) m ; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest n1 = (long *) n; scop m| putei(*m 1 < *n1); retu rn contact| la: }

ANTAL Tiberiu Alexandru Rezultatele afiate de tel.: 0040-264-530918 program sunt: Inainte de sortare: e-mail: antaltiberiu@pcnet.ro
1 5 7 3 5 9 8 5 6 Shivambu Kalpa De magistro Yoga Sutra Paramarthasara Conf. dr. ing. ANTAL Tiberiu Alexandru Shiva-Purana Paduka Panchaka Universitatea Tenhic| din Cluj-Napoca

Facultatea Construcii de Maini Dupa de sortare: Catedra de Mecanic| i Programare Curs 5 5 6 7 8 1 3 5de limbaj C 9
De magistro Copyright 2001. Toate drepturile sunt rezervate autorului. Paduka Panchaka Paramarthasara Multiplicarea acestui document n scop comercial este interzis|. Shiva-Purana Shivambu Kalpa Yoga Sutra

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul ntlnit nc| cele dou| funcii utilizate n programele de mai sus, Pentru cei care nu au personal. urmeaz| cteva explicaii. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest memcpy - copiaza caractere ntre buffer-e 7 scop m| puteivoid *m em cpy ( void *de st, con st vo id *s rc, siz e_ t cou nt ); contact| la: Prototip: Fisier prototip: mem cpy - <m em ory .h > sau <string .h > Valori ntoarse: m em cpy() ntoarce valoarea lui dest . ANTAL Tiberiu Alexandru Parametri: tel.: 0040-264-530918dest - buffer destinaie; src - buffer e-mail: antaltiberiu@pcnet.ro surs|; count - num|rul de caractere ce se copiaz|. Remarca: Funcia m em cpy() copiaz| count octei din src n dest . 7 strcmp - compara doua siruri - vezi 9.9.2 7 7 172

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

12 Operatii de intrare/iesire (I/E) n C

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare peraiile de intra re/ie s ire scrise cost i cu acordul scris al autorului. n incluse pot multiplica documentul numai ,contra prescurtat uneori sub forma I/E , nu suntacest n limbajul C, ns| majoritatea programelor trebuie s| interacioneze ntr-un scop m| putei contact| la: se ruleaz|, ANSI C folosete n acest scop un set de funcii oarecare fel cu mediul n care

definite precis n biblioteca standard a limbajului. Majoritatea funciilor de I/E ale C ANTAL fluxuri (Alexandru date. Fluxurile sunt conectate la dispozitive pe care C le folosesc Tiberiu s tre am s ) de tel.: 0040-264-530918 (files ). n acest mod C reuete s| ne scuteasc| de cunoaterea numete generic fiiere e-mail: antaltiberiu@pcnet.ro detaliilor de funcionare a acestor dispozitive (tastatur|, monitor, pe disc, imprimant|). Un flux reprezint| o secven| de date de tipul text sau binar. Primul flux se numete flux de text i conine numai caractere ASCII, iar cel de al doilea se numete flux binar i poate conine orice fel de secven| de bii. Conexiunea dintre fluxuri i dispozitivele asociate implicit acestora este dat| n tabelul care urmeaz|: Denumire ANTAL Tiberiu Alexandru Este conectat la dispozitivul Conf. dr. ing.flux Universitatea Tenhic| din Cluj-Napoca stdout ecran. Facultatea Construcii de Maini stdin tastatur|. Catedra de Mecanic| i Programare Curs de limbaj C stprn imprimant|.
stdaux ecran. Copyright 2001. Toate drepturile sunt rezervate autorului. stderr ecran. Multiplicarea acestui document n scop comercial este interzis|.

Pentru c| teoretic funciile de I/E din C sunt f|cute s| lucreze cu fluxuri, unele din funcii Sudenii participani lalucrului cu un anumit flux. De exemplu printf() lucreaz| numai cu sunt dedicate exclusiv orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzulipersonal. evoluate" care pot lucra cu orice fluxuri. De exemplu fluxul stdout. Exist| funcii "mai fpr intf() lucreaz| cu oricare dintre fluxurile de mai sus, ns| numele fluxului cu care se Sudenii participani la orice form| de nv||mntfunciei. n programul urm|tor efectul lucreaz| trebuie explicit precizat ca parametru al cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest celor dou| funcii este echivalent: scop m| putei contact| la:
/* FLU X1.C */ #include<stdio.h> ANTAL Tiberiu Alexandru int m ain () tel.: 0040-264-530918 { e-mail:prin tf("Te salu t. (din p rintf)\n "); antaltiberiu@pcnet.ro fprintf(std ou t, "Te s alu t. (din fprin tf)\n"); return 0; }

173

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Rezultate: Construcii de Maini Facultatea Te salut. (din printf) Catedra de Mecanic| i Programare Te salut. (din fprintf) Curs de limbaj C Cnd un program i ncepe execuia, codul de pornire al programului deschide automat fluxurile de mai sus, drepturile sunt rezervate autorului. Copyright 2001. Toate iar programul poate lucra f|r| alte operaii premerg|toare cu acestea. Dac|, de exemplu, am dori s| lucr|m cu un fiier pe disc, fluxul i se asociaz| fiierului prin operaia numit| deschiderea (open ) fiierului. Numai dup| aceast| operaie Multiplicarea acestui document n scop comercial este interzis|. se va putea folosi fpr intf() pentru a stoca date n fiier.

Rolul unui flux document pentru uzul personal.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Am spus c| un flux trebuie s| fie asociat unui fiier pe care s|-l manipuleze, ns| standardul nu ne spune clar ce este un flux i care este rolul lui. De asemenea, nu se specific| modul n care fluxul trebuie s| fie Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoaren implementat, chestiunea fiind l|sat| la latitudinea celor care scriu compilatorul. pot multiplica documentul numai contraecost erau ncete, programele n curs de execuie vremurile cnd dispozitivele de i ntrare/i ire i cu acordul scris al autorului. n acest scop m| putei mult maila: n RAM rulau contact| rapid dect aceste dispozitive erau n stare s| furnizeze datele cerute de program. De exemplu, cnd un program citea caractere individuale de pe disc, acesta era nevoit Alexandrupn| ce discul f|cea o rotaie i sectorul cu data n cauz| putea ANTAL Tiberiu s| atepte fi citit apoi pentru citirea urm|torului caracter din program, atepta pn| cnd discul era tel.: 0040-264-530918 n poziantaltiberiu@pcnet.ro de dispozitive hardware au inventat pentru eliminarea e-mail: ia bun|. Produc|torii acestei atept|ri memoria cache pentru ca discul s| nu citesc| numai un singur caracter. n acest caz dei programul citea un singur caracter, el era extras din cache i perioada de ateptare era mult mai mic| (asta pentru c| n cache se citeau n avans mai multe caractere f|r| a fi siguri c| va fi nevoie de ele; algoritmi complecsi erau folosii pentru a determina care caractere s| fie stocate i care s| fie desc|rcate din memoria cache). Acest cache este o memorie tampon ntre dispozitiv i program care, prin prenc|rcarea cu date, poate duce la creterea vitezei de lucru Conf. dr. ing. ANTAL Tiberiu Alexandru cu dispozitivul. Fluxurile realizeaz| aceeai operaie ca i memoria din Cluj-Napoca Universitatea Tenhic| cache la nivel software. Astfel, dac| dispozitivul cu care se lucreaz| nu are la nivel hardware o memorie cache, software-ul rezolva acest neajuns (probleme 7 Facultatea Construcii de Maini apar dacdens| acestai Programare cache-ul este dublat i viteza scade uor din acest | Mecanic| are, deoarece Catedra motiv). Curs de limbaj C Din tabelul prezentat anterior se observ| c| att stdout ct i
stderr

De ce exist| 2001. Toate drepturile sunt rezervate autorului. Copyright afieaz| informaiile pe ecran. ntrebarea care se pune este de ce a fost stdout i stderr ?

nevoie de dou| fluxuri care lucreaz| cu acelai dispozitiv? R|spunsul se Multiplicarea acestui n filozofia n scop comercial este interzis|. a crescut mpreun| cu afl| document sistemului de operare UNIX care C. UNIX a introdus noiunile de redirectare i conduct| (pipe) care au devenit att de populare nct noile sisteme de operare MS-DOS, Windows 95/98/NT i OS/2 le-au Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest implementat i ele. Daca avem un program executabil numit prg.exe, lansat n execuie 7 document pentru uzul personal. sub forma prg, el va folosi ca ieire ecranul monitorului, dar lansat n execuie prin linia prg > fisier.txt, va la oriceca ieire fiierul cu numele fisier.txtpersoane doritoaren Sudenii participani folosi form| de nv||mnt cu plat| sau alte care va fi creat directorul curent i va conine ceea ce a fost anterior afiat pe ecran. Deci ieirea normal|, pot multiplicamonitorului, a fost redirectat| c|tre disc. O alt| variant| ar fi folosirea unei adic| ecranul documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact|dac| lansarea n execuie se face prin prg | print, datele de ieire conducte. De exemplu, la: ale lui prg sunt transmise automat programului print care va afia coninutul primit de ANTAL Tiberiu Alexandru | idei de mai sus au devenit fundamentale pentru UNIX, la prg la imprimant|. Cele dou ns| ap|rea o problem tel.: 0040-264-530918 | n cazul erorilor: dac| prg dorea s| afieze un mesaj de eroare, acesta antaltiberiu@pcnet.ro e-mail:fie era inserat n fiierul fisier.txt la gr|mad| cu datele utile, fie era afiat i el la imprimant|. Era nevoie ca aceste mesaje s| fie afiate pe ecran indiferent de redirect |rile pe care le f|cea utilizatorul. Problema a fost rezolvat| prin crearea a dou| fluxuri sdtout care se poate redirecta, i stderr care este independent de operaiile de redirectare.

174

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C printf - realizeaza iesirea cu format pe fluxul stdout 7 Prototip: int p rintf(con st ch ar *fo rm at, [, arg um en te] ...); Copyright 2001. Toate drepturile sunt> Fisier prototip: prin tf - <std io.h rezervate autorului. Valori ntoarse: prin tf () ntoarce num|rul de caractere afiate sau o valoare negativ| Multiplicarea acestuidac| a ap|rutscop comercial este interzis|. document n o eroare. Parametri: format - ir de formatare a informaiilor afiate; Sudenii participani arg um en te - argumente opionale. la orice form| de nv||mnt superior bugetar pot multiplica acest Remarca: pentru uzul personal. | formatat un grup de caractere i valori pe fluxul 7 funcia printf() afieaz document standard de ieire, stdout. Dac| argumentele exist|, n irul format trebuie s| existe specificaii stricte care sa determine modul de afiare a argumentelor. format este un ir 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare de caractere, deci o secven| de caractere alfanumerice cuprinse ntre ghilimele. Acesta pot multiplica documentul numai contra cost i cu acordul scris al autorului. n care se trebuie s| fie prezent n orice instruc iune printf() , controlnd modul n acest scop m| putei contact| | i afieaz| fiecare argument al funciei. format conine dou| convertete, formateaz la: categorii de caractere, caractere simple i specific atori d e con vers ie . Ca rac terele sim ple ANTAL Tiberiu Alexandrupe ecran, iar specific atorii d e con vers ie acioneaz| asupra sunt pur i simplu copiate argumentelor [, argumen te] realiznd traducerea acestora din reprezentarea intern| tel.: 0040-264-530918 folosit| antaltiberiu@pcnet.ro e-mail: de C la cea de caractere nainte de afiarea lor pe stdout. n exemplul care urmeaz|, "Sum a este %d \n" este format , %d i \n sunt specificatori de conversie, iar Su m a este este un grup de caractere simple. iS um a este unicul argument al funciei printf() , fiind corespuz|tor lui [, argumen te] din forma general| a funciei:

12.1 Functii de iesire pe stdout -

prin tf("Su m a es te %d \n", iS um a);

Conf. dr. ing. mai sus este un pic tras| de coad| pentru c| oricine observ| c| printf() are Explicaia de ANTAL Tiberiu Alexandru Universitatea argumente, "Suma este %d \n" i iS um a . De ce am spus atunci c| unicul n realitate 2 Tenhic| din Cluj-Napoca Facultatea al funciei esteMainia ? Funcia printf() necesit| cel puin un argument, n argument Construcii de iS um sensul c|de Mecanic| obligatoriu, motiv pentru care nu l-am mai num|rat si pe acesta. Catedra acesta este i Programare Curs de limbaj C Exist | doua categ orii de specif icatori d e con vers ie , unii ncep cu simbolul % (procent) 7 i sunt, de 2001. Toate drepturile sunt rezervate purtnd denumirea de specificatori de obicei, urmati de un singur caracter, autorului. Copyright format sau de scriptor i de form at, i specific| tipul datei de afiat i modalitatea de formatare a acesteia la afiarea pe ecran. Pentru fiecare specificator de format trebuie s| Multiplicarea singur argument de afiat; dac| tipul acestuia i cel specificat de descriptor existe cte un acestui document n scop comercial este interzis|. nu sunt identici, C va ncerca s| realizeze conversia de la tipul argument la cel al Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acesti descriptorului de format. Descriptorul %d specific| o afiare a unei valori ntregi. Al document pentrufrecvent utilizai sunt prezentai n tabelul care uremeaz|: specificatori mai uzul personal. Sudenii participani laTipul form| de nv||mnt cuModul de alte- are orice plat| sau afispersoane doritoare Specificator pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest de conversie argumentului scop m| putei contact| la: d, i int num|r zecimal ntreg. ANTAL Tiberiu Alexandru o int tel.: 0040-264-530918 x, X int e-mail: antaltiberiu@pcnet.ro
u c int int

num|r octal f|r| semn. num|r hexazecimal f|r| semn cu abcdef pentru 0x i cu ABCDEF pentru 0X . num|r zecimal f|r| semn. un singur caracter.
175

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii char * de Maini s afieaz| caracterele unui ir pn| la ntlnirea lui Catedra de Mecanic| i Programare '/0' sau pn| la atingerea num|rului maxim de caractere specificate n precizie. Curs de limbaj C f doub le num|r real implicit n formatul: [-]m.zzzzzz; Copyright 2001. Toate drepturile sunt rezervate zecimale z este dat de precizia folosit| num|rul de autorului. la afiare i implicit este 6. Multiplicarea acestui document n scop comercial este interzis|. e, E doub le num|r real implicit n formatul: [-]m.zzzzzz e xx sau [-]m.zzzzzz E xx ; bugetar de multiplica acest Sudenii participani la orice form| de nv||mnt superiornum|rul potzecimale z este dat de precizia folosit| la afiare i implicit este 6 . document pentru uzul personal. g, G doub le folosete modul de afiare de la %e sau %E dac| Sudenii participani la orice form| de nv||mnt cumai mic dect persoane doritoare exponentul este plat| sau alte -4 sau mai mare sau cost i cu precizia; altfel autorului. n acest pot multiplica documentul numai contraegal dectacordul scris al folosete modul de afiare de la %f ; nu afieaz| zerourile scop m| putei contact| la: nesemnificative, num|rul de caractere folosite pentru afiare fiind minim. ANTAL Tiberiu Alexandru

tel.: 0040-264-530918 *, poantor p void e-mail: antaltiberiu@pcnet.ro

num|rul afiat este un poantor (adres| de memorie).

Unele exemple prezentate pn| acum foloseau %f pentru afiarea valorilor variabilelor de tipul float, iar altele %lf pentru afiarea valorilor variabilelor de tipul doub le , dei tabelul de mai sus nu spune nimic despre tipul float. Realitatea este c| printf( ) lucreaz| numai cu %f att pentru tipul float, ct si pentru tipul doub le datorit| conversiilor implicite (vezi 6.3.1) dr. ing.n cazul argumentelor de funcii. Acestea se aplic| la printf() pentru c| f|cute ANTAL Tiberiu Alexandru Conf. argumentele intervin n partea variabil| a funciei cazul fiind similar cu cel al apelurilor Universitatea Tenhic| din Cluj-Napoca de funcii f|r| prototip. Facultatea Construcii de Maini Catedra de Mecanic| i Programare La t imea sau prec izia afi|rii se poate specifica explicit ca o valoare ntreag| sau prin 7Curs de limbaj Cn care valoarea se calculeaz| prin conversia argumentului, obligatoriu caracterul * , caz de tipul int, care precede obiectul de afiat. n cazul cnd sunt specificate att l|imea ct i precizia, 2001. Toate drepturile sunt rezervate autorului. (.). Copyright acestea trebuie separate prin caracterul punct L|ime de 5 caractere Multiplicarea acestui document n scop comercial este interzis|.
printf("%5i", j);

Sudenii participani L|ime de 10 caractere la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.
printf("%10.5f", x);

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Precizie de 5 caractere pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
printf("%*.5f",10,x); /* Latime va riabila */

ANTAL Tiberiu Alexandru Observai c| l|imea (num|rul de caractere) pe care se afieaz| valoarea argumentului se tel.: 0040-264-530918 definete prin plasarea dup| caracterul % a unui num|r ntreg. De exemplu, un cmp e-mail: antaltiberiu@pcnet.ro ntreg cu l|imea de 5 se scrie %5d . Valorile afiate vor fi aliniate la dreapta cu spaii pe locul poziiilor din l|ime neocupate de num|rul afiat. Pentru afiarea caracterului % se scrie % % . Ultimul exemplu prezint| cazul l|imii variabile. S|geata arat| c| valoarea numeric| de 10 se pune n coresponden| cu caracterul * . Este posibil ca n locul valorii numerice s| fie folosit| o variabil| de tipul ntreg.
176

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Forma general| a specificatorului de format este: %[in dicator][la t im e][.prec izie] [F |N|h|l] 7Facultatea Construcii de Maini Spe cificator Con vers ie Catedra de Mecanic| i Programare Curs de limbaj C Caracterele indicator, sunt - , + , # i spat iu . Pot ap|rea n orice combinaie i ordine avnd -

semnificaiile: Copyright 2001. Toate drepturile sunt rezervate autorului.

Indicator Semnificaie Multiplicarea acestui document n scop comercial este interzis|. Aliniere la stnga, completare la dreapta cu spaii. Dac| nu este specificat se face aliniere la dreapta i completare la stnga cu zerouri Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest sau spaii. document pentru uzul personal.
+ Conversiile cu semn rezult| cu + sau - . Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Dac| valoarea este pozitiv| sau cu acordul ncepe cu un spa n acest pot spat iu multiplica documentul numai contra cost i nul| ieireascris al autorului.iu n loc de + ; valorile scop m| putei contact| la: negative p|streaz| semnul - . # Specific| afiarea argumentului convertit conform celor care urmeaz|: ANTAL Tiberiu Alexandrueste folosit mpreun| cu o , x sau X , prefixeaz| orice cnd tel.: 0040-264-530918 valoare nenul| de ieire cu 0 , 0x , sau 0X . Implicit, nu se e-mail: antaltiberiu@pcnet.ro spaii; afieaz| cnd este folosit mpreun| cu descriptorii e , E sau f , va fora afiarea punctului zecimal n toate cazurile. Implicit, acesta apare numai dac| num|rul are i parte zecimal|; cnd este folosit mpreun| cu g sau G foreaz| afiarea punctului zecimal n toate cazurile i previne trunchierea zerourilor care urmeaz| dup| num|r. Implicit, punctul zecimal Conf. dr. ing. ANTAL apare numai dac| dup| acesta urmeaz| cifre. Dac| acestea sunt Tiberiu Alexandru Universitatea Tenhic| zerouri ele vor fi suprimate; din Cluj-Napoca Facultatea Construciieste ignorat cnd este folosit mpreun| cu c , d , i , u, sau s . de Maini Catedra de Mecanic| i Programare Curs de limbaj C

n forma general| a specificatorului de format, toate cmpurile cuprinse ntre paranteze Copyright 2001. Toate drepturile sunt rezervate autorului. drepte sunt opionale. [F|N|h|l|L] poart| denumirea de modificatori ai valorii de intrare, specificnd lungimea document n scop comercial este interzis|.|: Multiplicarea acestui argumentului conform celor care urmeaz
F - poantor far N - poantor near Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. h - sh ort in t sau short l - long sau unsigned long Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare L - lon g d ouble pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Aceti modificatori afecteaz| modul n care printf() interpreteaz| tipul de dat| corespunz|tor argumentului. n cazul normal, argumentele corespunz|toare lui %p i %s ANTAL Tiberiu Alexandru sunt0040-264-530918 modelului de memorie folosit la generarea programului executabil. tel.: poantori de tipul F spune c| interpreteaz| argumentul ca pe un poantor far. h i l suprascriu m|rimea e-mail: antaltiberiu@pcnet.ro implicit| a argumentelor numerice din printf() , astfel ca l se aplic| la ntregi (d, i, x ) i la 7 valori reale (e, f, g ), iar h numai la tipurile ntregi. n prezena lui l argumentul este interpretat ca long int pentru d, i, x , ca doub le n prezena lui e, f, g sau ca long d ou ble n cazul lui L .

177

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Un alt tip de s pecific ator Maini vers ie ncepe cu caracterul backslash (\ ). Secvena \n Facultatea Construcii de d e con este cunoscut|, din motive istorice, sub numele de secvent a escape i reprezint| un -7 Catedra de Mecanic| i Programare caracter special inserat ntr-un ir. n acest caz \n insereaz| un caracter newline - trecere Curs de limbajla nceput de rnd . Cteva din secvenele escape mai utile sunt: la linie nou| i C

\f - trecere la nceput de rnd (formfeed ); Copyright 2001. Toate drepturile sunt rezervate autorului. \t - tabulator orizontal (horizontal tab ); \b - terge caracterul din stnga cursorului (backspa ce Multiplicarea acestui document n scop comercial este interzis|.); \a - caracterul alert| (bell ) are ca efect emiterea unui semnal sonor; Sudenii participanicar orice form| de nv||mnt superior bugetar pot multiplica acest \r - retur de la (carriage return ); document - trecere la linie nou| (newline ); pentru uzul personal. \n \\ - caracterul backslash , adic| \ ; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare multiplica documentul numai contra cost i ? acordul scris al autorului. n acest \? - caracterul semn de ntrebare, adic| pot cu \ooo - caracterul la: ASCII n nota ie octal|, unde o este o cifr| ntre 0 i 7 ; scop m| putei contact| \xhh - caracterul ASCII cu codul hexazecimal hh , unde h este o cifr| ntre 0 i F . ANTAL Tiberiu Alexandru tel.: 0040-264-530918 te primul argument pentru a afla num|rul de argumente care Funcia printf() folose e-mail: | i tipul acestora. Ea va genera probleme dac| num|rul de argumente sau tipul urmeazantaltiberiu@pcnet.ro acestora este incorect. puts- realizeaza iesirea unui sir pe fluxul stdout Prototip: int puts(const char *s ir); Conf. dr. ing. ANTAL Tiberiu Alexandru Fisier prototip: pu ts - <std io.h > Universitatea Tenhic| din Cluj-Napoca Valori ntoarse: puts() ntoarce o valoare nenegativ| n caz de succes, iar altfel Facultatea Construcii de Maini ntoarce constanta EOF . Catedra de Mecanic| i Programare Parametri: s ir - irul care va fi trimis pe stdout. Curs de limbaj C Remarca: funcia pu ts() trimite pe stdout irul, nlocuind caracterul terminator de ir ('\0') 7 cu caracterul de trecere la linie nou| ( rezervate autorului. Copyright 2001. Toate drepturile sunt '\n'). Multiplicarea acestui document n scop comercial este interzis|.

12.2 Functii de intrare de pe stdin Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest
document pentru uzul personal. Pentru funciile care vor fi prezentate n continuare trebuie s| tii c| acestea sunt buffer-ate. Aceasta nseamn| c| datele introduse pe stdin vor fi prelucrate numai dup| Sudenii participani la orice form| deeste o zon| de memorie folosit| pentru stocarea de ap|sarea tastei <Enter>. Un buffer nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra costintrare care va poanta noile date scrise n mesaje. Tipic, buffer-ul are un poantor de i cu acordul scris al autorului. n acest scop m|un poantor de ieire care va poanta la urm|torul element care va fi citit i un buffer, putei contact| la: contor care num|r| spaiul nc| r|mas neocupat din buffer. Principala lui utilizare este decuplarea a dou| procese, ANTAL Tiberiu Alexandruastfel nct citirea i scrierea s| poat| opera la viteze diferite i pentru blocuri de date de m|rimi diferite. Exist| mai muli algoritmi pentru utilizarea tel.: 0040-264-530918 buffer-elor: First in First Out (FIFO sau coada ), Last In First Out (LIFO sau stiva ), 7 7 e-mail: antaltiberiu@pcnet.ro doub le buffering care permite ca un buffer s| fie citit n timpul n care cel|lat este nscris, buffer circular n care dac| citirea sau scrierea trece de cap|t acestea se continu| de la nceput buffer-ului.

178

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca getchar -Construcii de Maini unui caracter de pe stdin 7 Facultatea realizeaza citirea Prototip: Mecanic|int Programare ); Catedra de i g etch ar(v oid Fisier prototip:C getchar - <std io.h > Curs de limbaj Valori ntoarse: ntoarce caracterul citit. Copyright 2001. Toate drepturile sunt rezervate autorului. 1 /* GE TCH AR .C */ 2 Multiplicarea acestui #include<stdio.h> 3 int main(void) 4 Sudenii participani { 5 6 7 8 9 10 11 12 13

document n scop comercial este interzis|.

la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. int car; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare while((car = getchar()) != EOF) pot multiplicaprin tf("<- '%c'\n", car); documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
prin tf("EO F\ n");

ANTAL Tiberiu Alexandru return 0; tel.: 0040-264-530918 } e-mail: antaltiberiu@pcnet.ro Rezultate:


xyz <- 'x' <- 'y' Conf. dr. ing. ANTAL Tiberiu Alexandru <- 'z' Universitatea Tenhic| din Cluj-Napoca <- ' ' Facultatea Construcii de Maini a Catedra de Mecanic| i Programare <- 'a' Curs de <- '

limbaj C Toate drepturile sunt rezervate autorului.

' Copyright 2001. EOF

Multiplicarea acestui document n scop comercial este interzis|. ntruct stdin foloseste un buffer la citirea irului de caractere xyz cu funcia getch ar() Sudenii participani la prelucrate numai dup| ap|sarea tastei <Enter>. La ap|sarea aceste caractere vor fi orice form| de nv||mnt superior bugetar pot multiplica acest acestei taste se observ personal. document pentru uzul | c| ciclul este executat de patru ori, apoi funcia getchar() r|mne f|r| caractere i continua s| atepte date de pe stdin (tastatur|). La ap|sarea lui a alte 7 dou| caractere sunt prelucrate, caracterul 'a' i <Enter>, iar ciclul este din nou executat Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare de dou| ori. n sistemul de operare MS-DOS caracterul <Ctrl>+al autorului. n acest | pot multiplica documentul numai contra cost i cu acordul scris <Z> care se genereaz de lam| putei contact||la: scop tastatur| prin ap sarea simultan| a tastelor <Ctrl> i <Z> este folosit pentru marcarea sfritului de fiier. Cnd getch ar() ntoarce acest caracter ciclul se termin|. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 c| v-a s|rit deja n ochi c| variabila car este declarat| de tipul int Poate De ce int i nu i nu de tipul e-mail: antaltiberiu@pcnet.ro char. n cartea lui K&R, la fel ca i n C standa rd , nu se char? specific| dac| tipul char este cu sau f|r| semn. Dei chestiunea pare a fi nesemnificativ|, valoarea lui EOF este definit| ca -1 . Dac| un produc|tor de compilator alege s|-l implementeze pe char f|r| semn, atunci cnd getch ar() va ntoarce valoarea EOF , adic| pe -1 , pentru a indica sfritul fiierului, n variabila car ar fi stocat| valoarea 255 (pentru c| ea nu poate stoca numere negative).
179

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Compararea valorii 255de Maini ca ciclul s| fie executat la nesfrit, condiia de p|r|sire Facultatea Construcii cu -1 face nefiind ndeplinit| niciodat|. Folosirea lui int garanteaz| c| semnul valorii numerice va Catedra de Mecanic| i Programare fi reprezentat corect, motiv pentru care situaia descrisa nu poate s| apar|. 7 Curs de limbaj C

scanf - realizeaza intrarea cu rezervate autorului. 7 Copyright 2001. Toate drepturile sunt format de pe fluxul stdin Prototip: int scan f(con st ch ar *fo rm at, [, arg um en te] ...); Multiplicarea acestuiscanf - <std io.h > comercial este interzis|. document n scop Fisier prototip: Valori ntoarse: sca nf () ntoarce num|rul de cmpuri convertite i atribuite cu Sudenii participani succes; nu sunt incluse cmpurile citite i neatribuite. Valoarea 0 la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.c| nu s-a efectuat nici o atribuire. Valoarea EOF se nseamn| ntoarce n caz de eroare sau dac| s-a detectat caracterul terminator Sudenii participani de orice form| de nv||mnt cu plat| sau alte persoane doritoare la fiier. Parametri: format - ir contra cost folosit pentru formatarea informa acest pot multiplica documentul numaide caracterei cu acordul scris al autorului. n iilor de citit; scop m| putei contact| la: arg um en te - argumente opionale. ANTAL 7 : funcia sca nf() citete date de pe stdin i le scrie n locaiile de memorie Tiberiu Alexandru Remarca specificate de argumente. Fiecare argument trebuie s| fie un poantor la o variabil| de tel.: 0040-264-530918 tipul corespunz|tor specificatorului de format din format . sca nf() se oprete din citire e-mail: antaltiberiu@pcnet.ro cnd caracterele de conversie din irul format au fost epuizate sau cnd, datorit| unor sc|p|ri, se ncearc| introducerea unor caractere care duc la o eroare. Tipurile de caractere care pot fi ntlnite n irul format sunt: spat ii sau tabulatori care sunt ignorate, caractere obis nu ite (neprecedate de caracterul % ), care trebuie s| fie identice cu ceea ce se citete de pe fluxul de intrare cnd se ajunge la acestea i specificatori de con vers ie care se formeaz| la fel ca i la printf() din caracterul % , urmat de caracterul * Conf. dr. ing. ANTAL Tiberiuvalorii citite, un num|r opional ce specific| l|imea maxim| opional de anulare a atribuirii Alexandru Universitatea Tenhic| din Cluj-Napoca a cmpului, un h , l sau L opional care indic| lungimea sursei i un caracter de conversie a c|rui semnificaie se de Maini Facultatea Construcii prezint| n tabelul urm|tor. Catedra de Mecanic| i Programare Curs de limbaj C Specificator Tipul Data de intrare de conversie argumentului Copyright 2001. Toate drepturile sunt rezervate autorului.
d int num|r zecimal ntreg. Multiplicarea acestui document n scop comercial este interzis|. i int num|r ntreg zecimal, octal (ncepe cu 0 ) sau Sudenii participani la orice form| hexazecimal (ncepe cu 0x sau 0X ). multiplica acest de nv||mnt superior bugetar pot document pentru uzul personal. num|r ntreg octal f|r| semn, cu sau f|r| 0 la o int nceput. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare x, multiplica documentul numai contra cost i cu acordul scris al autorului.| n acest int num|r ntreg n notaie hexazecimal| f|r 0x sau pot X 0X la nceput, folosind abcdef pentru 0x i scop m| putei contact| la: ABCEDF pentru 0X .

ANTAL Tiberiu Alexandru u int tel.: 0040-264-530918 c int e-mail: antaltiberiu@pcnet.ro


s f, e, g char * doub le

num|r ntreg zecimal f|r| semn. un caracter.

ir de caractere.
num|r real n virgul| flotant| cu semn, punct zecimal i exponent opional.
180

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca Funcia scaConstrucii de Maini printf() . Ea realizeaz| operaia de intrare de pe stdin , Facultatea nf() este opusul funciei n timp ce printf() o realizeaz| pe cea de ieire pe stdout. sca nf() citete caracterele de pe Catedra de Mecanic| i Programare stdin i le interpreteaz| conform caracterelor de conversie din primul argument, irul Curs de limbaj C format . Argumentele opionale arg um en te trebuie s| fie adrese ale unor locaii de

memorie. Copyright 2001. Toate drepturile sunt rezervate autorului.


int a, b ; Multiplicarea . . .

acestui document n scop comercial este interzis|.

Sudenii d % d", & a, &la orice sca nf("% participani b);

form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. n exemplul de mai sus, se citesc 2 ntregi, separai printr-un spaiu; primul va fi stocat Sudenii participani deorice form| de nv||mnt cu plat| sau alte persoanela care sunt n variabila a , iar cel la al doilea n variabila b . Pentru specificarea adresei doritoare pot multiplica documentul numai contra cost(adres|). Spascris al autorului. n acest | stocate variabilele se folosete operatorul & i cu acordul iul ntre cei doi %d nseamn scopmultputei contact| la: iu, i anume orice combinaie de un num|r de spaii, tab-uri mai m| dect un simplu spa i linii noi ntre cele 2 valori. Dac|, de exemplu, dorim s| separ|m numerele printr-o ANTALvirgul| n loc de spaii scriem: singur| Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
sca nf(% d,% d, & a, & b);

Dac| dorim s| citim un ir de caractere scriem:


#include <stdio.h> Conf.()dr. ing. ANTAL Tiberiu Alexandru m ain Universitatea Tenhic| din Cluj-Napoca {

Facultatea Construcii de Maini char nu m e[30 ]; Catedra de tf(Cu m tei Programare prin Mecanic| nu m esti: ); Curs de limbaj C sca nf(% s,nu m e);
prin tf(Sa lut, % s\n ,nu m e); } Copyright 2001.

Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Pentru c| n um e este un ir de caractere, care n C se stocheaz| sub forma unui tablou, valoarea lui num e este adresa de nceput a tabloului, din care motiv nu se folosete Sudenii participani la orice form| de nv||mntn varianta de mai sus dac| irul de operatorul & n faa lui n um e . Probleme apar superior bugetar pot multiplica acest document introdus de la tastatur| conine spaii. n acest caz sunt citite caracterele numai caractere pentru uzul personal. pn| la primul spaiu, el fiind considerat ca terminator al irului. O soluie poate fi programul: Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: #include<stdio.h>
m ain ()

ANTAL Tiberiu Alexandru { tel.: 0040-264-530918], pre nu m e1[10], char nu m e[10 e-mail:prin tf(Cu m te nu m esti: ); antaltiberiu@pcnet.ro

pren um e2[10];

sca nf(% s %s %s,nu m e, pre nu m e1, pren um e2); prin tf(Sa lut, % s %s \n ,nu m e, pre nu m e2); }

181

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca O alt| variant| ar fi utilizarea funciei gets() care consider| ca terminator al irului Facultatea Construcii de Maini introdus de |sarea tasteiProgramaremoment n care insereaz| automat la cap|tul irului Catedra ap Mecanic| i <Enter>, caracterul nu ll ('\0'). Curs de limbaj C

gets - realizeaza intrarea sunt linii de pe fluxul 7 Copyright 2001. Toate drepturileunei rezervate autorului. stdio Prototip: cha r *ge ts(char *b uffer); Multiplicarea acestuigets - <std n scop comercial este interzis|. document io.h > Fisier prototip: Valori ntoarse: gets() ntoarce argumentul n caz de succes. Un poantor nu ll se Sudenii participani ntoarceform| de nv||mnt superior bugetar pot multiplica acest la orice n caz de eroare. document pentru uzul zon| de RAM n care se va stoca irul. Parametri: buffer - personal. Remarca: funcia gets() citete o linie de pe stdin i o stocheaz| n variabila buffer. Linia 7 Sudenii participani la orice form| de nv||mnt cu plat| sau altelinie nou| ('\n'). gets() const| n toate caracterele ei, inclusiv primul caracter de trecere la persoane doritoare potnlocui acest ultim caracter cu contra cost i cude ir ('\0') nainte de a ntoarce linia va multiplica documentul numai cel terminator acordul scris al autorului. n acest citit|m| putei contact| la: scop . ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

12.3 Functii pentru operatii cu fisiere Dup| cum am mai spus, majoritatea funciilor de I/E din biblioteca C sunt f|cute s| lucreze cu fluxuri. De exemplu tii deja c| printf() este versiunea simplificat| a lui fpr intf() . n multe din cazuri, singura diferen| dintre funciile particulare fluxurilor stdin Conf. dr. ing. ANTAL Tiberiu Alexandru i stdout discutate pn| acum (printf() , sca nf() , gets() , pu ts() etc.) i cele care pot lucra cu fiiere n general, const| n faptul c| pentru cele din urm| se poate specifica numele Universitatea Tenhic| din Cluj-Napoca fluxului cu care opereaz|. Maini Facultatea Construcii de Denumirea acestor funcii care lucreaz| cu fiiere se formeaz| de obiceide Mecanic|funciei de I/E discutat pn| acum, prefixat de caracterul 'f'. Astfel, Catedra din numele i Programare sca nf() devine fscan f() , printf() devine fpr intf() , gets () devine fge ts() etc. Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului.

12.3.1 Deschiderea fisierelor -

Multiplicarea acestui document ierul, acestuia trebuieinterzis|. nainte de a putea manipula fi n scop comercial este s| i se asocieze un flux. Aceast| asociere dintre flux i fiier se realizeaz| prin funcia fop en (). Funcia va asocia un flux cu Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest un nume de fiier existent pe disc, fiind obligatorie i specificarea modului de acces la datele din fiier. document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare fopen - deschide un fisier pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Prototip: FIL E *fo pen (con st ch ar *n um efisier, co nst cha r *m od ); scop m| putei contact| la: Fisier prototip: fopen - <stdio.h> Valori ntoarse: fop en () ntoarce un poantor la fiierul deschis. Un poantor N ULL ANTAL Tiberiu Alexandru este ntors dac| exist| erori. tel.: 0040-264-530918num efisier - numele fiierului; Parametri: e-mail: antaltiberiu@pcnet.ro accesului permis la fiier. mod - tipul
Declararea unui flux

Un flux este declarat prin tipul FILE *, adic| un poantor la tipul de dat| FILE . Dac| dorii s| tii cum este definit acest tip de dat| putei c|uta definiia lui n fiierul cu prototipuri stdio.h. F|r| a intra n prea multe
182

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca am|nunte FILE , este ode Maini care stocheaz| informaii despre fiier: poziia bufferFacultatea Construcii structur| ului, pozide Mecanic| i Programare Catedra ia caracterului curent din buffer, dac| fiierul este citit sau scris, dac| au ap|rut sau nu erori. Utilizatorul nu trebuie s| cunoasc| aceste detalii de implementare, el fiind Curs de limbaj C pentru declararea unei variabile de acest fel sub forma FILE* pfis;, responsabil numai

dup| cum se observ| n linia 6 a programului care urmeaz|. Argumentul folosit pentru Copyright 2001. Toate drepturile sunt este prezentat n tabelul urm|tor. specificarea modului de acces la fiier rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Mod de deschidere Semnificaie Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest a fiierului document pentru uzul personal. "r" Deschide un fiier existent pentru citire. Sudenii participani la orice form| decreeaz|, dac| este cazul, altefipersoane doritoare "w " Deschide sau nv||mnt cu plat| sau un ier pentru scriere. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: "a" Deschide sau creeaz| un fiier pentru ad|ugare. ANTAL Tiberiu Alexandru "r+" Deschide un fiier existent pentru citire i scriere. tel.: 0040-264-530918 "w+" Creeaz e-mail: antaltiberiu@pcnet.ro | sau deschide un fiier pentru citire i scriere. "a+" Deschide sau creeaz|, dac| este cazul, un fiier pentru citire i ad|ugare.
"rb"

Deschide un fiier binar pentru citire.

"wb" Deschide un fiier binar pentru scriere. Conf. dr. ing. ANTAL Tiberiu Alexandru "ab" Deschide un fi Universitatea Tenhic| din Cluj-Napoca ier binar pentru ad|ugare. Facultatea Construcii de Maini un fiier text pentru citire. "rt" Deschide Catedra de Mecanic| i Programare "w t" Deschide un fiier text pentru scriere. Curs de limbaj C "at" Deschide un fiier text pentru ad|ugare. Copyright 2001. Toate drepturile sunt rezervate autorului. "r+b" Deschide un fiier binar pentru citire i scriere.

Multiplicarea acestui document|n scop comercial este interzis|. "w+b" Creeaz un fiier binar pentru scriere.
"a+b" Deschide un fi nv||mnt superior ugare. Sudenii participani la orice form| de ier binar pentru ad|bugetar pot multiplica acest document pentru uzul personal. un fiier text pentru citire i scriere. "r+t" Deschide "w +t" Creeaz| un fi nv||mnt cu citire i alte persoane doritoare Sudenii participani la orice form| de ier text pentru plat| sauscriere. pot multiplica documentul numai un fiier text pentru citire i scriere. "a+t" Deschide contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Dac| vei executa programul care urmeaz| vei g|si pe disc un fiier numit salut.txt, de 11 bii lungime, care conine mesajul din linia 10 .

12.3.2 Scrierea datelor ntr-un fisier 1 /* FO PE N1.C */ 2 #include<stdio.h> 183

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca int main(void) Facultatea Construcii de Maini { Catedra de Mecanic| i Programare FILE *pfis; Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. {


fprintf(p fis, "S alu tare !\n ");

if (( pfis = fopen("salut.txt", "w")) != NULL)

Multiplicarea fclos e(pfis); acestui document n scop comercial este interzis|.


}

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest else { document pentru uzul personal.
prin tf("Er oar e de scrie re in fisier ul sa lut.tx t\n "); per ror("p orice ca: "); Sudenii participani la en tru form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplicareturn 1; documentul numai contra cost i cu acordul scris al autorului. n acest } putei contact| la: scop m|

19 ANTAL Tiberiu return 0; 20 }

Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro fop en () ntoarce un poantor la o structur| de tipul FILE care se numete mai sus pfis . Deci numele fluxului nostru este pfis i este conectat la fiierul salut.txt de pe disc. ntruct membrii structurii FILE sunt tratai direct de funciile pentru accesul la fiiere, utilizatorul nu trebuie s|-i cunoasc| pentru ca s| lucreze cu acetia. Ceea ce utilizatorul trebuie s| cunoasc| este numele poantorului la fiier.

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| dinierul nu a putut fi deschis, un poantor cu valoarea NULL este Dac| fi Cluj-Napoca Problema Facultatea Construcii de Maini O eroare comun| este scrierea numelor de fiiere f|r| ntors de funcie. accesului la Catedra de Mecanic| i Programare dublarea caracterelor backslash ('\'). De exemplu dac| argumentul fiiere Curs de limbaj C n u m e f i s i e r c o n i n e i o c a l e s cr i s | s u b f o r ma "C:\ pro g\lim ba je\c\sa lut.tx t" , caracterele \ simple vor fi interpretate ca parte a2001. Toate drepturile sunt rezervate autorului. unei sevene escape, scrierea corect| a irului de mai sus n C fiind: Copyright "C:\ \pr og\ \lim ba je\\ c\\ salu t.txt" . Dac| n DOS i Windows problema de mai sus poate sa apara, n UNIX, pentru c| directorii din cale sunt separai prin caracterul slash ('/'), 7 7 Multiplicarea acestui document n scop comercial este interzis|. ea nu mai este actual| (n C '\t', '\n' etc. au semnificaia unor secvene escape, dar nu i '/t', '/n' etc.). Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. ntruct lucrul cu fluxul se deruleaz| prin poantori, n cazul unei erori Tratarea erorilor tot la orice form| indica este faptul c| o sau alte ap|rut prin folosirea Sudenii participani ceea ce putem de nv||mnt cu plat|eroare a persoane doritoare valorii speciale contra cost i poantor. Dac| fop autorului. n acest pot multiplica documentul numaiN U LL pentru cu acordul scris al en () ntoarce valoarea NULL cu siguran| a ap|rut o eroare, ns| nu tim prea multe despre natura erorii. S-ar scop m| putei contact| la: putea ca numele fiierului s| fie greit sau reeaua pe care lucr|m s| fi c|zut, din acest motiv standardul trateaz| erorile prin intermediul unei variabile numite errno care ANTAL | num|rul erorii. Fiecare implementare de C atribuie o valoare unic| fiec|rei stocheaz Tiberiu Alexandru tel.: 0040-264-530918 erori posibile, de exemplu 1 poate fi fiier inexistent, 2 memorie insuficient| etc. Este e-mail:|antaltiberiu@pcnet.ro posibil accesarea valorii numerice a lui errno prin scrierea liniei extern int errno; la nceputul programului. Valoarea numeric| va fi actualizat| n cazul unei erori, ns| num|rul n sine ne spune prea puine. Ar fi mai util dac| am putea afia un mesaj corespunz|tor erorii ap|rute i aceasta se poate realiza prin funcia perro r() care a fost folosit| n linia 16 . Aceasta afieaz| pe ecran mesajul dintre ghilimele i un mesaj extras dintr-o tabel| de mesaje de eroare utile pentru a clarifica sursa exact| a erorii.
184

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca perror - afiseaza un Maini de eroare 7 Facultatea Construcii de mesaj Prototip: Mecanic|void p erro r(con st ch ar *m esa j); Catedra de i Programare Fisier prototip:C - de limbaj perror - <stdio.h> sau <stdlib.h> Curs Valori ntoarse: nu are. Parametri: mesaj - irul de caractere care formeaz| mesajul de afiat. Copyright 2001. Toate drepturile sunt rezervate autorului. Remarca: perro r() afieaz| un mesaj de eroare pe stderr . 7

Multiplicarea acestui document n scop comercial este interzis|. m esaj este afiat prima oar|, urmat de o virgul|, apoi mesajul de eroare corespunz |tor ultimuluiparticipani la orice|form| a produs eroarea de sistem i, pot final, caracterul Sudenii apel din bibliotec care de nv||mnt superior bugetar n multiplica acest newline . Dac| mesaj este un poantor N ULL sau un poantor la un ir NULL , perro r() document pentru uzul personal. afieaz| numai mesajul de eroare de sistem. Pentru rezultate reale, perro r() se apeleaz| imediat dup| funcia care ar putea ntoarce eroarea, altfel apelurile de noi funcii vor Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare suprascrie valoarea numeric| a lui errno . Dac| operaia a reuit fiierul este deschis i se pot multiplica documentul numai contra cost iecran se face cu funcia printf() , scrierea scrie n el mesajul dorit. ntruct scrierea pe cu acordul scris al autorului. n acest scop m|fiputei contact|cu funcia fpr intf() . Aceasta are prototipul int fprintf(FILE *flux, ntr-un ier se va face la: const cha r *for m at [, arg um en te]...); i va folosi, asemenea lui printf() , un ir form at ANTALformatarea datelor i o list| de argumente opionale. n plus, fpr intf() are ca pentru Tiberiu Alexandru argument i poantorul tel.: 0040-264-530918 la fiierul n care va realiza scrierea (pentru cazul de mai sus, pfis ). n liniaantaltiberiu@pcnet.ro ia de nchidere a fiierului prin funcia fclo se() , necesar| e-mail: 11 se realizeaz| opera pentru ca sistemul de operare s| poat| actualiza informaiile legate de fiier n strucura de director. Ea primete ca parametru pe pfis i are ca efect deconectarea fluxului de fiierul pe care l-am deschis pe disc.

12.3.3 ANTAL Tiberiu Alexandru Conf. dr. ing.Citirea si afisarea datelor dintr-un fisier
Universitatea Tenhic| din Cluj-Napoca i afiarea datelor stocate ntr-un fiier existent Programul care urmeaz| realizeaz| citirea Facultatea Construciieste asemenea funciei getch ar(), cu diferena c| poate lucra cu un pe disc. Funcia getc() de Maini Catedra la un fiier, prototipul ei fiind int getc(F ILE *flux );. Funcia pu tc() trimite un poantor de Mecanic| i Programare caracter pe un C Curs de limbaj flux care este specificat prin unicul ei parametru. Funciile getch ar() i pu tch ar() sunt definite n termenii lui getc() , pu tc() , stdin i stdout prin macrodefinitiile urmatoare:2001. Toate drepturile sunt rezervate autorului. 7 Copyright
#de fin e getcha r() getc(stdin) Multiplicarea acestui document n scop #d efin e pu tcha r(c) pu tc((c), stdo ut)

comercial este interzis|.

2 #include<stdio.h> 3 4 int main(void) 5 { 6

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest n programul FG ET .C se folosete un tablou nu m efis de 80 de caractere pentru stocarea document pentru uzul personal. numelui de fiier mpreun| cu calea c|tre acesta, dac| este cazul. Observai c| n funcia sca nf() din linia 11 prin care se citete numele fiierului l|imea maxim| poate fi de 79 de Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare caractere pentru ca nu cumva s| se scrie peste ultimul caracter al irului, el fiind rezervat pot multiplica documentul numaiObservai de asemenea c| numele tabloului nu este caracterului terminator de ir. contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: | (& ), ntruct numele unui tablou n C este un poantor la precedat de operatorul adres primul element din tablou. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 /* FGE TC.C */ e-mail: antaltiberiu@pcnet.ro

char nu m efis[80]; 185

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca FILE *pfluxin; Facultatea car; Construcii de Maini int Catedra de Mecanic| i Programare Curs de limbaj C ele fisier ulu i de afis at: "); prin tf("N um

Copyright 2001. Toate drepturile sunt rezervate autorului.


if ((pfluxin = fopen(numefis, "r")) == NULL)

sca nf("% 79s ", nu m efis);

Multiplicarea acestui document n scop comercial este interzis|. {


fprintf(std err,"F isier ul % s nu a pu tut fi d eschis pt. citire ", nu m efis);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest per ror("in trucat"); return 1; document pentru uzul personal.
}

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare while ((car = fgetc(pfluxin)) != EOF) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteipu tcha r(car); contact| la:
fclos e(pflu xin ); ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail:return 0; antaltiberiu@pcnet.ro

25 26 }

Rezultate:
Numele fisierului de afisat: Salutare!

salut.txt

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca i aici perro r() se folosete pentru a genera un mesaj care explic| natura erorii. Observai Facultatea17 se folosete return 1; pentru ca programul s|-i ntoarc| sistemului de operare c| n linia Construcii de Maini Catedra de Mecanic| i Programare | a ap|rut o eroare, motiv pentru care nu i-a putut o valoare prin care s| indice faptul c Curs de limbaj C succes. termina treaba cu Copyright 2001. Toate drepturile sunt rezervate autorului. O alt| modalitate de a scrie un program care realizeaz| aceeai operaie cu cel de mai sus se prezint| n continuare: Multiplicarea acestui document n scop comercial este interzis|.
1 Sudenii participani la orice form| /* FGE TS.C */ 2 #include<stdio.h>uzul personal. document pentru 3 4 int main(void) 5 { pot 6 7 8 9 10 11 12 13 14 15

Numele unui fiier existent deja pe disc

de nv||mnt superior bugetar pot multiplica acest

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare multiplica documentul numai contra cost i cu acordul scris al autorului. n acest FILE *pfluxin; scop m| putei contact| la:
char bu ffer[80], num efis[80];

ANTAL Tiberiu Alexandru prin tf("N um ele fisier ulu i tel.: 0040-264-530918nu m efis); sca nf("% 79s ", e-mail: antaltiberiu@pcnet.ro
{

de afis at: ");

if ((pfluxin = fopen(numefis,"r")) == NULL) fprintf(std err,"F isier ul % s nu a pu tut fi d eschis pt. citire ", nu m efis); per ror("in trucat"); 186

16 17 18 19 20 21 22 23

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca return 1; Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C while (fgets(buffer, sizeof(buffer), pfluxin) prin tf("%s ", bu ffer);

!= NULL)

Copyright 2001. Toate drepturile sunt rezervate autorului.


fclos e(pflu xin );

Multiplicarea acestui document n scop comercial este interzis|. la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Funcia fge ts() este perechea lui gets() citind un ir de pe un flux. Asemenea lui gets() , ea Sudenii participani la orice form| de s| stocheze cu plat| sau alte persoane doritoare o are nevoie de o zon| de RAM n care nv||mnt irul citit. n programul de mai sus pot multiplica documentul se folosete n acest scop. fge ts() are nevoie de trei argumente: variabil| cu numele buffer numai contra cost i cu acordul scris al autorului. n acest scop m| puteizona de RAM n care se va stoca irul, lungimea zonei de RAM n care va un poantor la contact| la: fi stocat irul i un poantor la fiier. Dac| funcia gets() ntoarce un poantor cu valoarea NULL nseamn| Alexandru o eroare pentru c| liniile din fiier s-au terminat. Altfel ANTAL Tiberiu c| a ap|rut programul afieaz|, folosind printf() , coninutul liniei citite. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

24 return 0; 25 Sudenii participani }

12.4 Fisiere ASCII si fisiere binare n - C


Conf. dr. ing. ANTAL Tiberiuia din fiiere n dou| moduri distincte, n funcie de modul Limbajul C trateaz| informa Alexandru Universitatea Tenhic|deschis. n mo d u l AS CII , dac| C g|sete n fiier un caracter n care fiierul este din Cluj-Napoca Facultatea Construcii de Maini <Ctrl>+<Z> (ASCII 26 ), la citirea lui, acesta va fi interpretat ca terminator de fiier Catedra de Mecanic| ajuns la sfritul i va presupune c| s-a i Programare fiierului. C nu scrie automat la sfritul fiierului ASCII acest caracter, dar el poate fi scris explicit "cu mna". De asemenea, caracterul de Curs de limbaj C trecere la linie nou| '\n' (newline ) este stocat sub forma a dou| caractere ASCII 13 10 (carriage 2001. Toate drepturile sunt RAM esteautorului. Copyright return i line feed ), dar n rezervate stocat numai n formatul intern C, sub forma terminatorului de linie, adic| ASCII 10 (line feed ). Atunci cnd irul "Salutare!\n" a fost scris pe disc fiierul salut.txt avea 11 octei lungime ntruct a fost scris sub forma Multiplicarea acestui document n scop comercial este interzis|. S a l u t a r e ! 13 10 i pentru c| modul implicit de scriere pe disc este cel ASCII. n modul binar C nu interpreteaz| coninutul fiierului cnd scrie sau citete datele n el. Sudenii participanide orice form| de nv||mntexemplu, bugetar pot program pentru Acesta va fi modul la lucru cu datele cnd, de superior scriem un multiplica acest document ierelor. Dacpersonal. mai sus va fi scris folosind modul binar, coninutul pe disc copierea fi pentru uzul | irul de al fiierului va fi S a l u t a r e ! 10 , ns| la folosirea lui fop en () trebuie specificat i caracterul "b". Daca la orice form| de s| scriem un ier sau alte persoane doritoare 7 Sudenii participanide exemplu dorimnv||mnt cufiplat|binar n locul caracterului "w " folosim pe "wb". pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
Probleme care ANTAL Tiberiu Alexandru unui fiier s| fie marcat| de caracterul special terminarea vin din0040-264-530918 tel.: MS-DOS

Cnd a fost inventat sistemul de operare MS-DOS, cineva a hot|rt ca

<Ctrl>+<Z> a c|rui valoare ASCII este 26. Citirea unui octet cu e-mail: antaltiberiu@pcnet.ro modul ASCII devenea o problem| ntruct acesta putea valoarea 26 n marca terminarea fiierului. De exemplu fge tc() ntoarce valoarea EOF i citirea nu se poate continua. Acesta este motivul pentru care citirea fiierelor binare n modul ASCII va conduce la citirea unui num|r mic de linii din cele totale pentru c| la ntlnirea caracterului ASCII 26 citirea se oprete. Pentru c| MS-DOS a avut o oarecare influen| asupra sistemelor de operare Windows 95, 98, NT i OS/2 toate acestea au prezentat
187

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca aceeai problem|. Azi, de Maini <Ctrl>+<Z>, uneori scris i ^Z, nu mai este stocat Facultatea Construcii caracterul la cap|tul fiMecanic| i Programare terminarea acestora, ntruct au fost foarte multe Catedra de ierelor pentru a marca probleme cu aplicaii care nu reueau s| scrie acest marcaj de terminare pe disc. Aceste Curs de limbaj C puteau crete peste anumite limite admise ocupnd, n cel mai r|u caz, fiiere neterminate

tot spaiul discului. Dac| n cazul fiierelor binare acest caracter nu mai marcheaz| Copyright 2001. Toatentrebarea care apare este cum se poate detecta terminarea unui terminarea fiierelor, drepturile sunt rezervate autorului. fiier binar. Sistemele de operare moderne pastreaza pe disc num|rul de octei stocai 7 7 ntr-un fiier, acestui fiind informaia folosit| pentru interzis|. Multiplicarea aceasta document n scop comercial estedetectarea termin|rii fiierului.

Probleme care document pentru terminalelor (UNIX avea cod foarte "dur" scris pentru comanda acestor uzul personal. vin din UNIX

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Caracterul '\n' (newline ) era folosit n UNIX pentru comanda terminale). Un terminal de tipul consol| sau imprimat| avea un cap care Sudenii participani la orice form| de la cap|tul unei plat|trebuia spersoanela nceputul atunci cnd ajungea nv||mnt cu linii sau alte | revin| doritoare pot multiplica operaie se numea retur de carimotiv pentru care caracterul ce comanda documentul numai contra cost , cu acordul scris al autorului. n acest liniei. Aceast| scop m| aciunecontact| la: aceast| putei s-a numit carriage return . Apoi, hrtia trebuia s| avanseze cu o linie n sus, aceast| operaie consta n avansul la o linie noua , caracterul care comanda aceast| 7 activitate numindu-se newline . n sistemul de operare UNIX aceste dou| operaii se ANTAL Tiberiu Alexandru f|ceau la scrierea unui singur caracter i anume '\n', tocmai pentru c| aici codul tel.: 0040-264-530918 corespunz|tor comenzii acestor terminale era mare. MS-DOS este o "idee" de sistem de e-mail: antaltiberiu@pcnet.ro operare. Datorit| simplit|ii lui s-a decis c| newline nu trebuia s| fac| dou| operaii, astfel ca aici sunt necesare caracterele '\r' (carriage return - ASCII 13 ) i '\n' (line feed 7 ASCII 10 ) pentru a obine acelai efect asupra capului de scriere ca i n UNIX cu '\n'.

12.4.1 Pozitionarea n fisierele binare Conf. dr. ing. ANTAL Tiberiu Alexandru Exist| dou| Tenhic| din Cluj-Napoca Universitateamecanisme pentru poziionare n fiiere. Metoda tradiional| este funcia fse ek () ce are descrierea: Maini Facultatea Construcii de Catedra de Mecanic| i Programare Curs de- muta poantorul de fis ier ntr-o pozitie specificata fseek limbaj C 7 7 Prototip: int fs eek ( FILE *flux , long offse t, int origin e ); Copyright 2001. Toate drepturile sunt rezervate autorului. Fisier prototip: fseek - <stdio.h> Valori ntoarse: Multiplicarea acestuin caz de succes, fse ek () ntoarce 0interzis|. document n scop comercial este . Altfel, ntoarce o valoare nenul|. Pentru dispozitive incapabile sa efectueze c|utarea poziiei 7 specificate, valoarea ntoars| este nedefinit|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Parametri: flux - poantor la structura FILE ; document pentru uzul personal. offset - num|r de octei fa| de origine; Sudenii participani origine - poziia iniial|. la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numaide fiiercost i cu acordul scris alpoziie specificat| prin Remarca: fse ek () mut| poantorul contra asociat fluxului la o nou| autorului. n acest 7 scop m| putei contact| la: offset octei fa| de originea origine. Urm|toarea operaie pe flux va avea loc din noua poziie. Argumentul origine trebuie s| fie una din urm|toarele constante definite n ST DIO.HTiberiu Alexandru ANTAL : tel.: 0040-264-530918 poziia curent| a poantorului de fiier; S E EK _ C UR e-mail:S E EK _ EN D - sfritul fiierului; antaltiberiu@pcnet.ro SEEK_SET - nceputul fiierului. Cnd un fiier este deschis pentru ad |ugare, poziia curent| este determinat| de ultima
188

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca operaie deConstrucii nu Maini Facultatea I/E. Dac| de s-au efectuat operaii de I/E asupra fiierului deschis pentru ad|ugare, poziia poantorului de fiier este la nceputul fiierului. Catedra de Mecanic| i Programare Curs de limbaj C Pentru fluxuri deschise n modul text, fseek () are o utilitate limitat| pentru c| decodificarea caracterelor carriage return i linefeed poate Copyright 2001. Toate drepturile sunt rezervate autorului. cauza ca fse ek () s| produc| rezultate neateptate. Singurele poziion|ri care sunt garantate pentru fluxuri deschise n mod text sunt: c|utarea cu offset scop comercial este interzis|. Multiplicarea acestui document n 0 relativ la orice valoarea de origine origine; c|utarea de la nceputul fiierului cu offset ntors de funcia ftell().

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.ie fse ek () este parametrul offset care fiind de tipul long Problema fundamental| a func poate lua valoarea maxim| de 2 31-1 , adic| permite poziionarea peste o poriune de 2.1Gb Sudeniiparticipani rezolvarea acesteinv||mntstandardul definete alte dou| funcii a unui fi ier. Pentru la orice form| de probleme cu plat| sau alte persoane doritoare cu multiplica documentul numai contra cost i cu acordul scris al autorului. n acest poturm|toarele prototipuri: scop m| putei contact| la:
inf fg etpo s(FIL E *flu x, fp os_ t *ptr); ANTAL Tiberiu Alexandru fpos _t *p tr); int fs etpo s(FIL E *flu x, co nst

tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Aici fpos_t este un tip dependent de implementare n stare s| stocheze o poziie dintr-un fiier de m|rime arbitrar|. Funcia fge tpo s() nregistreaz| poziia curent| din flux n *ptr pentru ca s| fie utilizat| n fse tpo s() . Funcia fse tpo s() realizeaz| poziionarea n flux la poziia nregistrat| prin fge tpo s() n *ptr. Pentru exemplificarea lucrului cu aceste funcii vor fi folosite nc| dou| funcii fread () i fw rite() care au prototipurile: Conf. dr. ing. ANTAL Tiberiu m arim e, size _t n rob , FILE, *flu x); size _t fre ad (void *ptr, size_ t Alexandru Universitatea Tenhic| din Cluj-Napoca size _t fw rite(co nst void *ptr, size_ t m arim e, size _t n rob , FILE, *flu x); Facultatea Construcii de Maini CatedraciteMecanic| ifl u x n tabloul poantat de ptr cel mult nrob de obiecte de fread () de te de pe Programare Curs de limbaj Crim e . ntoarce num|rul obiectelor citite care poate fi mai mic dect dimensiunea m a num|rul cerut de noi. Determinarea st|rii dup | citire se face cu una din funciile feo f() sau ferror () . fw2001. scrie din tabloul poantat de ptr , nrob de obiecte cu dimensiunea m a rim e Copyright rite () Toate drepturile sunt rezervate autorului. pe flux . Valoarea ntoars| este num|rul obiectelor scrise care poate fi mai mic dect nrrob n caz de eroare. Multiplicarea acestui document n scop comercial este interzis|.
1 Sudenii participani /* FSE TGE T.C */ 2 3

la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. #include<stdio.h>

4 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int m ain () 5 { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 6 7 8 9 10 11 12 13 14 15 int nrcit,nrscr; scop m| putei contact| la: double d; char tc[50 ]; ANTAL Tiberiu Alexandru fpos_t pozitie; tel.: 0040-264-530918 e-mail:FILE * i, *e; antaltiberiu@pcnet.ro i=fop en ("fisie r.bin ", "rb" ); e=fo pen ("noufisier .bin ", "w b"); nrc it=fre ad (&d , sizeo f(d), 1, i); 189

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca prin tf("S-a citit %i obi ect.\n ",nrc it); Facultatea Construcii de Maini Catedra de Mecanic| i Programare fgetpos (i, &p ozitie ); Curs de limbaj C (tc, sizeof(ch ar), 20 , i); nrc it=fre ad

Copyright 2001. Toate drepturile sunt rezervate autorului.


fsetp os(i, & poz itie);

prin tf("S-a u citit %i obie cte.\n ",nrc it);

Multiplicarea acestui documentar),scopi); nrc it=fre ad (tc, sizeof(ch n 60, comercial este interzis|.
prin tf("S-a u citit %i obie cte.\n ",nrc it);

Sudenii participani la sizeo fform| de nv||mnt superior bugetar pot multiplica acest nrs cr=fw rite(tc, orice (cha r), nrc it, e); prin tf("S-a u scris %i ob iecte .\n",nrs cr); document pentru uzul personal.
nrs cr=fw rite(& d, siz eof (d ), de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice form| 1, e); printf("S -a s cris % ob iect.\n ",nrsc r); pot multiplica documentuli numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: fsee k(i,0L ,SE EK _S ET ); nrc it=fre Alexandru ANTAL Tiberiuad (&d , sizeo f(cha r), 8, i); prin tf("S-a u citit %i obie cte.\n ",nrc it); tel.: 0040-264-530918 e-mail:nrs cr=fw rite(& d, siz eof (d ), 1, e); antaltiberiu@pcnet.ro printf("S -a s cris % i ob iect.\n ",nrsc r); fclos e(i); fclos e(e);

40 retu rn (0 ); 41 Conf. dr. ing. ANTAL }

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Pentru ade Mecanic| i Programare Catedra rula acest program avei nevoie de un fiier text numit fisier.bin care s| conin| textul: limbaj C Curs de Copyright 2001. Toateeste un mic fisier de 57 de caractere. 1.0123456789Acesta drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Rzultatele afiate pe ecran sunt:
S-a citit 1 obiect.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest S-au citit 20 obiecte. document pentru uzul personal.
S-au citit 49 obiecte. S-au scris 49 obiecte. Sudenii participani la orice S-a scris 1 obiect.

form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest S-au citit 8 obiecte. scop scris 1 obiect. la: m| putei contact| S-a ANTAL Tiberiu Alexandru iar pe disc va fi creat un fiier cu numele nou fisier.bin avnd urm|torul coninut: tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
6789Acesta este un mic fisier de 57 de caractere.1.0123451.012345

Programul este numai un exemplu de utilizare a acestor funcii i nu este unul coerent. n
190

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca liniile 12-13 sunt deschise cele dou| fluxuri n modul binar. Primul fread () citete sizeof(d) Facultatea Construcii de Maini = 8 octei de pe fluxul de intrare i n variabila d . Poziia curent| din flux va fi salvat| Catedra de Mecanic| i Programare folosind funcia fge tpo s() n pozitie . Apoi se ncearc| citirea n tabloul tc a 20 x 1 octei, Curs se revine la aceast| poziie i se ncearc| citirea a 60 de octei. Din rezultate se apoi de limbaj C

observ| c| numai 49 de obiecte (octei) au putut fi citite. n final se va folosi funcia fse ek () Copyright 2001. Toate drepturile sunt rezervate autorului. pentru a exemplifica revenirea la nceputul fluxului i . Multiplicarea acestui document n scop comercial este interzis|.

12.5 Lucrul form| nregistrari 7 Sudenii participani la orice cu de nv||mnt superior bugetar pot multiplica acest
document de nregistrare (record ) este familiar| celor care au lucrat n Pascal sau au Noiunea pentru uzul personal. folosit sisteme pentru gestionarea bazelor de date. S| presupumem c| avem de scris un Sudenii participani la orice form| de nv||mntdin care fac parte i media lor general|. program care s| stocheze numele studenilor, anul cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest O nregistrare cu acest tip de date va fi de forma: scop m| putei contact| la: N u m e: Vasile Cosmin An : 1234/1 ANTAL Tiberiu Alexandru Medie generala : 9.78 7 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Observai c| exist| att date ASCII ct i date numerice n virgul| flotant|. n limbajul C o astfel de grupare de date poate fi pus| la un loc folosind o structur| de forma:
struct student { char nu m e[40]; Conf. dr. ing. ANTAL Tiberiu Alexandru char gru pa [10]; Universitatea Tenhic| din Cluj-Napoca float medie; Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C Vom scrie n continuare un program SC RIE.C care s| stocheze mai muli studeni pe disc, ntr-un fiier numit stud.dat. Copyright 2001. Toate drepturile sunt rezervate autorului. 1 Multiplicarea acestui /* SCR IE.C */ 2 #include<stdio.h>

document n scop comercial este interzis|. de nv||mnt superior bugetar pot multiplica acest

3 Sudenii participani la orice form| #include<conio.h> 4 document pentru uzul personal. #define NRM AX 100 5 6 struct student Sudenii participani

7 { pot multiplica documentul numai 8 scop m| putei contact| la: char nu m e[40]; 9 10

la orice form| de nv||mnt cu plat| sau alte persoane doritoare contra cost i cu acordul scris al autorului. n acest

11 }; tel.: 12

13 int m ain () 14 { 15 16 17

ANTAL Tiberiu Alexandru 0040-264-530918 e-mail: antaltiberiu@pcnet.ro


FILE *pies; int c, nrstud; stru ct stud en t tstu de nti[NRM AX ]; 191

grup a[10 ]; float medie;

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca float x; Facultatea Construcii de Maini Catedra de Mecanic| i Programare c=0; Curs de limbaj C odu n r. de stude nti ca re vor prin tf("Intr sca nf("% i", &n rstu d); Copyright 2001. Toate drepturile fflush(s tdin );

fi stoca ti: ");

sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. do {


prin tf("N um e stu de nt: ");

Sudenii participani la orice form| e); nv||mnt superior bugetar pot multiplica acest gets (tstud en ti[c].nu m de fflush(s personal. document pentru uzultdin );
prin tf("Gr up a: "); Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplicasca nf("% 9s", & tstu de nti[c].gr up i cu acordul scris al autorului. n acest documentul numai contra cost a); scop m| putei contact| la: prin tf("M ed ia g en era la: "); sca nf("% f",& tstu ANTAL Tiberiu Alexandru de nti[c].m ed ie); tel.: 0040-264-530918 fflush(s tdin ); e-mail: antaltiberiu@pcnet.ro ++c; } w hile (c < nrs tud );

if ((pies = fopen("stud.dat", "w")) == NULL) {

Conf. dr. ing. ANTAL Tiberiu Alexandru per ror("in trucat"); Universitatea Tenhic|1;din Cluj-Napoca return Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C de nti, siz eof(s truct stu de nt), fw rite(tstu
fclos e(pie s);

fprintf(std err,"F isier ul stu d.dat n u a pu tut fi d eschis pt. scriere ");

nr stu d, pies);

Copyright 2001. Toate drepturile sunt rezervate autorului. document n scop comercial este interzis|.

50 return 0; 51 Multiplicarea acestui }

1 2

Sudenii participani la orice care s| de nv||mnt superiorn fiierulpot multiplica acest Pentru a realiza un program form| poat| citi datele scrise bugetar stud.dat tot ceea ce document pentrueste sa folosim fread () n loc de fw rite () i s| deschidem fiierul pentru trebuie s| facem uzul personal. 7 citire n loc de scriere. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest /* CITE STE .C */ scop m| putei contact| la: #include<stdio.h>

3 #include<conio.h> 4 ANTAL Tiberiu Alexandru #define NRM AX 100

5 tel.: 0040-264-530918 6 e-mail:student struct antaltiberiu@pcnet.ro 7 { 8 9 10 }; char nu m e[40], gru pa [10]; float medie;

192

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca int m ain () Facultatea Construcii de Maini { Catedra de Mecanic| i Programare FILE *pin; Curs de limbaj C int c, nrstud;

Copyright 2001. Toate drepturile sunt rezervate autorului.


prin tf("Intr odu n r. de stude nti ca re vor fi ci titi: ");

stru ct stud en t tstu de nti[NRM AX ];

Multiplicarea acestui rstu d); sca nf("% i", &n document n scop comercial este interzis|.
fflush(s tdin );

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest if ((pin = fopen("stud.dat", document pentru uzul personal. "r")) == NULL)
{ fprintf(std err,"F isier de nv||mnt a plat| fi d eschis pt. scriere "); Sudenii participani la orice form| ul stu d.dat n u cu pu tut sau alte persoane doritoare pot multiplicaper ror("in trucat"); contra cost i cu acordul scris al autorului. n acest documentul numai return 1; la: scop m| putei contact| }

ANTAL Tiberiu Alexandru frea d(tstu de nti, tel.: 0040-264-530918 siz eof(s truct e-mail:fclos e(pin ); antaltiberiu@pcnet.ro
c=0; do {

stu de nt), nr stu d, pin);

prin tf("N um e stu de nt: "); pu ts(tstu de nti[c].n um e);

Conf. dr. ing. ANTAL Tiberiu en era la: %f \n",tstu de nti[c].m ed ie); prin tf("M ed ia g Alexandru Universitatea Tenhic| din Cluj-Napoca prin tf("----------------------------------------------\ n"); Facultatea Construcii de Maini ++c; Catedra de Mecanic| i Programare } w hile (c < nrs tud ); Curs de limbaj C Toate drepturile sunt rezervate autorului.

prin tf("Gr up a: %9s\ n", tstu den ti[c].gru pa );

41 return 0; 42 Copyright 2001. }

1 /* CITE STE 1.C */

Multiplicarea acestui document n scop comercial este interzis|. O alt| variant| a acestui program ns| care folosete spaiu pentru stocarea n RAM numai pentru o singur| nregistrare i nu pentru un tablou de nregistr|ri, este: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

2 #include<stdio.h> Sudenii participani 3 #include<conio.h> 4 5 struct student

6 { ANTAL Tiberiu Alexandru [10]; 7 char nu m e[40], gru pa 8 tel.: 0040-264-530918 float medie; 9 e-mail: antaltiberiu@pcnet.ro }; 10 11 int m ain () 12 { 13 FILE *pin; 193

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca int c, nrstud; Facultatea Construcii u nstud en t; de Maini stru ct stu de nt Catedra de Mecanic| i Programare Curs de limbaj C odu n r. de stude nti ca re vor prin tf("Intr sca nf("% i", &n rstu d);

fi ci titi: ");

Copyright 2001. Toate drepturile sunt rezervate autorului.


if ((pin = fopen("stud.dat", "r")) == NULL)

Multiplicarea acestui document n scop comercial este interzis|. {


fprintf(std err,"F isier ul stu d.dat n u a pu tut fi d eschis pt.\ scriere ");

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest per ror("in trucat"); return 1; document pentru uzul personal.
}

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare c=0; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest do { scop m| putei contact| la:
fsee k(pin, (lon g) c*s izeo f(stru ct stu de nt), 0); frea d(& un stu ANTAL Tiberiu Alexandru de nt, siz eof(s truc t prin tf("N tel.: 0040-264-530918 um e stu de nt: "); pu ts(un stu de nt.n e-mail: antaltiberiu@pcnet.ro um e); stud en t), 1, pin);

prin tf("Gr up a: %9s\ n", u nstud en t.gru pa ); prin tf("M ed ia g en era la: %f \n",un stu de nt.m ed ie); prin tf("----------------------------------------------\ n");

++c; w hile (c < nrs tud );

Conf. dr. ing. ANTAL Tiberiu Alexandru fclos e(pin ); Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini return 0; Catedra de Mecanic| i Programare } Curs de limbaj C Programul2001. Toate drepturile sunt rezervate autorului. ierului. n linia 29 poziia noii Copyright folosete fse ek () pentru poziionare n cadrul fi nregistr|ri se g|sete prin deplasarea peste c*sizeof(struct stude nt) octei n fiier, n raport cu nceputul fiierului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

12.6 Citirea parametrilor din linia de Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare comanda numai contra cost i cu acordul scris al autorului. n acest 7 pot multiplica documentul

Cei care ai lucrat n sistemul 7 scop m| putei contact| la: de operare DOS cunoatei comanda copy sursa destinatie care permite copierea unui fiier de la o surs|, la o destinaie. Programul care urmeaz| implementeaz| o Alexandru ANTAL Tiberiu variant| rudimentar| a acestei comenzi. Utilizatorul trebuie s| specifice dou| nume de fiiere, unul surs| - pe cine copiem - i unul destinaie - unde i sub ce nume tel.: 0040-264-530918 copiem. Modul de lucru cu fiierele este cel binar, iar dup| ce operaia de copiere s-a e-mail: antaltiberiu@pcnet.ro derulat, funcia fclo se() este folosit| pentru a nchide fiierele de surs| i destinaie. n limbajul de programare C folosirea lui fclo se() nu este obligatorie ntruct la terminarea programului, care are loc la ntlnirea lui return() din funcia m ain (), fiierele deschise vor fi automat nchise. Totui, nchiderea unui fiier de care nu mai este nevoie trebuie s| devin| obinuin| pentru programator deoarece num|rul maxim de fiiere care pot fi
194

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca deschise simultan este limitat de obicei de c|tre sistemul de operare. Dac| un fiier Facultatea Construcii de Maini deschis va fi nchis cndProgramare nevoie de el, atunci un alt fiier va putea fi deschis Catedra de Mecanic| i nu mai este f|r| a se dep|si limita maxim| admis| de sistemul de operare. Pericolul de mai sus apare Curs uit|m s| nchidem fiiere ntr-o funcie care este apelat| n mod repetat, n final cnd de limbaj C

mesajul de eroare primit la folosirea lui fop en () fiind "too many open files". Copyright 2001. Toate drepturile sunt rezervate autorului.
/* CO PIE1.C */ Multiplicarea acestui #include<stdio.h>

document n scop comercial este interzis|.

#define BUFF ER 32*1024 Sudenii participani la orice char bu ffer[B UFF ER ]; int main(void)

form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare { pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest char su rsa [80 ], destin atie[8 0]; scop m| putei contact| la: FILE *flux_s, *flux_d;
size _t n rcit;

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 fis ieru lui prin tf("N um ele e-mail:gets (sur sa); antaltiberiu@pcnet.ro
{

sursa: ");

if ((flux_s = fopen(sursa,"rb")) == NULL) fprintf(stderr,"Fisierul %s nu a putu t fi desch is pentru citire\n", sursa ); per ror("in trucat"); return 1; } Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca prin tf("N um ele fis ieru lui Facultatea Construcii de Maini d estin atie: "); gets Catedra de(des tina tie); Programare Mecanic| i if ((flux_d = fopen(destinatie,"w+b")) == NULL) Curs de limbaj C {

Copyright); de stin atie 2001. Toate drepturile sunt rezervate autorului.


per ror("in trucat");

fprin tf(stderr,"Fisierul %s nu a putut fi desc his pentr u s criere \n ",\

Multiplicarea return 1; acestui document n scop comercial este interzis|.


}

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest w hile (!feof(flu personal. document pentru uzul x_ s))
{

Sudenii participani nrc it=fre ad (bude nv||mnt ffer[0 ]), BU FF ER persoane doritoare la orice form| ffer, s izeo f(bu cu plat| sau alte , flux _s); if (ferror(flu contra pot multiplica documentul numai x_ s)) cost i cu acordul scris al autorului. n acest { scop m| putei contact| la: ANTAL Tiberiu Alexandru } tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro fw rite(b uffer,
{ per ror("\ tEroar e la s criere" ); break; 195 per ror("\ tEroar e la citire" ); break;

siz eof(b uffe r[0]), nrc it, flux _d ); if (ferror(flu x_ d))

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca } Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj C s); fclos e(flu x_

Copyright 2001. Toate drepturile sunt rezervate autorului.


return 0; Multiplicarea acestui }

fclos e(flu x_ d);

document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Cnd programul de mai sus este lansat n execuie, conversaia cu utilizatorul se va derula document pentru uzul personal. sub forma: Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Numele fisierului sursa: a.exe pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Numele fisierului destinatie: b.exe scop m| putei contact| la: Cei care ai folosit comanda DOS copy tii c| operaia de mai sus se realizeaz| prin ANTAL Tiberiu Alexandru scrierea copy a.exe b.exe la prompterul sistemului de operare. Fiierul a.exe din tel.: 0040-264-530918 copiat sub numele de b.exe n acelai director. Limbajul C permite directorul curent va fi e-mail: antaltiberiu@pcnet.ro modalitate portabil|, astfel ca programul de mai sus poate accesul la linia comand| ntr-o 7 fi rescris pentru a citi parametrii introdui dup| numele programului executabil, la fel ca n cazul comenzii copy. Pn| acum antetul folosit pentru funcia m ain () a fost int m ain (void ). Pentru a se putea citi parametrii liniei comand| trebuie folosit urm|torul prototip: Conf.ain (int aANTAL Tiberiu Alexandru dr. ing. rgc , cha r * ar gv[ ]); int m Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini ntruct de Mecanic| i Programare numai parametri numele lor poate fi schimbat de Catedra variabilele argc i argv sunt noi cndlimbaj C Curs de scriem corpul funciei m ain (), de exemplu sub forma:
int m ain (int nr_a rg, char * linie_ arg[ ]) Copyright 2001. Toate drepturile sunt rezervate { }

autorului.

. . . Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest cu condiiapentru uzul personal. s| nu fie modificate. argc este un ntreg care conine document ca ordinea i tipul lor num|rul de cuvinte introduse de utilizator, iar argv este un tablou de poantori la iruri de caractere care stocheaz| cuvintele efectiv introduse de utilizator (mai precis o copie exact| Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare a acestora). pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:
/* CO PIE2 .C */ #include<stdio.h> ANTAL Tiberiu Alexandru #include<string.h> tel.: 0040-264-530918 #define BUFF ER 32*1024 char bu ffer[B UFF ER ];

e-mail: antaltiberiu@pcnet.ro
int m ain (int argc, char *ar gv [ ]) { char su rsa [80 ], destin atie[8 0]; 196

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca FILE *flux_s, *flux_d; Facultatea _t n rcit; Construcii de Maini size Catedra de Mecanic| i Programare int i; Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. {


fprintf(stderr,"Programul %s necesita 2 param etri\nfisierul sursa si pe\ cel d estin atie \n ", argdocument n scop comercial este interzis|. Multiplicarea acestui v[0]); for(i=0; argv[i] != NU LL; i++)

if (argc != 3)

Sudenii participani fprintf(std err, de rgv [%i] = %s \n ", i, argbugetar pot multiplica acest la orice form| "a nv||mnt superior v[i]); return 1; document pentru uzul personal.
}

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare strcp y(su rsa , arg v[1]); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest strcp y(destin atie , arg v[2]); scop m| putei contact| la: ANTAL Tiberiu Alexandru { tel.: 0040-264-530918 fprintf(stderr,"Fisierul %s e-mail: antaltiberiu@pcnet.ro per ror("in trucat");
return 1; } if ((flux_d = fopen(destinatie,"w+b")) == NULL) { fprintf(stderr,"Fisierul %s Conf. dr. ing. ANTAL Tiberiu Alexandru nu a p u tut fi desc his pentr u s riere\ n",\ de stin atie ); Universitatea Tenhic| din Cluj-Napoca per ror("in trucat"); if ((flux_s = fopen(sursa,"rb")) == NULL) nu a putu t fi des chis pe ntru citire\n ", sursa );

Facultatea Construcii de Maini return 1; Catedra de Mecanic| i Programare } Curs de limbaj C


w hile (!feof(flu x_ s))

Copyright 2001. Toate drepturile sunt rezervate autorului. {


nrc it=fre ad (bu ffer, s izeo f(bu ffer[0 ]), BU FF ER , flux _s);

Multiplicarea acestuiif (ferror(flu x_ s)) comercial este interzis|. document n scop


{

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest per ror("\ tEroar e la citire" ); document pentru uzul personal. break;
}

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare fw rite(b uffer, siz eof(b uffe r[0]), nrc it, flux al autorului. n acest pot multiplica documentul numai contra cost i cu acordul scris _d ); if la: scop m| putei contact| (ferror(flu x_ d))
{

ANTAL Tiberiu Alexandru per ror("\ tEroar e break; tel.: 0040-264-530918 } e-mail: antaltiberiu@pcnet.ro
} fclos e(flu x_ s); fclos e(flu x_ d); 197

la s criere" );

Capitolul 12 - Operat ii de Tiberiu- Alexandru Conf. dr. ing. ANTALintrare/iesire n limbajul C Universitatea Tenhic| din Cluj-Napoca prin tf("Co pierea a fo st realiza ta cu succes.\n "); Facultatea Construcii de Maini return 0; Catedra de Mecanic| i Programare } Curs de limbaj C

Dac| programul Toate drepturile sunt rezervate autorului. | copie2 a.exe b.exe, spaiul Copyright 2001. este lansat n execuie prin linia de comand de date pentru argc i argv se reprezint| n Figura 22. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Figura 22 ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

198

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: n program aflat n execuie divizeaz| poriunea de memorie n care a fost nc|rcat conform desenului din ANTAL Tiberiu Alexandru Figura 23. Dimensiunea tel.: 0040-264-530918i de da te sunt segmentelor de cod e-mail: pe toata durata execuiei fixate antaltiberiu@pcnet.ro 7 p r o g r a m u lu i . D i m e n s i u n e a segmentului de stiva crete cnd se 7 apeleaz | funcii, se transfer| parametri i se creeaz| variabile locale, respectiv scade cnd se revine din funcing. ANTAL Tiberiu Alexandru Conf. dr. ii, iar spaiul pentru variabilele locale i parametri este Universitatea Tenhic| din Cluj-Napoca dezalocat. Segmentul de heap, sau Facultatea Construcii de Maini heap-ul, este plasat n "opoziie" cu Catedra de Mecanic| i Programare cel de stiv| n sensul c| atunci cnd Curs de limbaj Cstivei crete, cel spaiul alocat disponibil pentru heap scade i Copyright 2001. Toate drepturile sunt rezervate autorului. invers. Linia dintre heap i stiv| este punctat| pentru a simboliza c| cele Figura 23 dou| zone nu acestui document n scop Multiplicarea sunt delimitate static. comercial este interzis|. Heap-ul pune la dispoziia programatorului un spaiu de RAM pe care acesta l poate aloca dinamic. participani la orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii Problema este m|rimea acestui spaiu. n cazul sistemelor de operare simple, cum este MS-DOS, programul executabil conine stocat n el un num|r care defineste document pentru uzul personal. cantitatea total| de memorie necesara pentru ca programul sa fie executat. Num|rul 7 7 acesta este spaiul de RAM maxim care se aloc| programului de catre sistemul de 7 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare operare. Dup| nc|rcarea segmentelor de cod i de date, ceea ce r|mne se mparte ntre pot | i heap. Dac| segmentul de stiv| crecostprea mult i d| peste cel de heap programul stiv multiplica documentul numai contra te i cu acordul scris al autorului. n acest scop m| putei contact| la: "crapa". 7

13 Alocarea dinamica a 7 memoriei

ANTAL Tiberiu Alexandru n cazul sistemelor de operare moderne programul este nc|rcat undeva tel.: 0040-264-530918 Alocarea n RAM i l|sat s| se execute. Dac| spaiul n care s-a nc|rcat devine memoriei antaltiberiu@pcnet.ro e-mail: n cazul prea mic, de exemplu pentru c| stiva i heap-ul cresc prea mult,
sistemelor de operare moderne

sistemul de operare g|sete o alt| zon| de RAM mai mare n care va copia segmentele de cod i de date. n noua zon|, stiva i heap-ul vor fi plasate ct mai departe, apoi din nou programul este l|sat s| se execute. Dac| stiva i heap-ul cresc prea mult se ncearc| din nou g|sirea unei zone i mai mari de
199

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca RAM, iar num|rul de de Maini procedurii este practic influenat numai de limitele Facultatea Construcii repet|ri ale memoriei fizice a calculatorului. Dac| sistemul de operare tie sa lucreze cu memorie 7 Catedra de Mecanic| i Programare virtual|, limitele memoriei fizice sunt dep|ite n c|utarea spaiului necesar execut|rii Curs de limbaj C programului. n cazul sistemelor de operare "pe 32 de bii" cum sunt UNIX, Windows NT

i 95/98, limita este dat| de 232 octei, ceea ce corespunde la aproximativ 2 GB de RAM. Copyright 2001. Toate majoritatea sistemelor de autorului. n realitate, pentru c| drepturile sunt rezervate operare trebuie s| r|mn| rezidente n RAM, cantitatea de memorie disponibil| este ceva mai mic|. n cazul sistemelor de operare "pe 64 de bii", de exemplu Winows NT pe un interzis|. Multiplicarea acestui document n scop comercial esteprocesor DEC Alpha, limita crete la 264 bii care ar fi un num|r de ordinul TB (Tera octei). Ultima limit| a spaiului folosit pentru stocarea programelorform| de nv||mnt superior Memoria virtual| folosit| de Sudenii participani la orice n execu ie este hard disc-ul. bugetar pot multiplica acest un sistem de operare trebuie salvat| undeva dar ntruct majoritatea calculatoarelor nu document pentru uzul personal. dispun de foarte mult| memorie RAM, urm|torul dispozitiv de stocare a datelor care nu
mai ncap n RAM este hard disc-ul. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

13.1 Functii pentru alocarea ANTAL Tiberiu Alexandru tel.: 0040-264-530918 dinamica a memoriei 7 e-mail: antaltiberiu@pcnet.ro

malloc - aloca un bloc de memorie pe heap 7 Prototip: void *m alloc (size_t d im en siu ne ); Fisier prototip: m allo c() - <stdlib.h> i <malloc.h> Valori ntoarse: m allo c() ntoarce un Conf. dr. ing. ANTAL Tiberiu Alexandrupoantor de tipul void la spaiul alocat sau NULL dac| Cluj-Napoca Universitatea Tenhic| din spaiul liber existent pe heap este insuficient pentru a realiza alocarea. Dac Facultatea Construcii de Maini | se ntoarce un poantor de tipul diferit de void , Catedra de Mecanic|trebuie folosit operatorul de conversie forat| a tipului pentru i Programare valoarea ntoars|. Dac| dimensiune este zero, m allo c() aloc| spaiu Curs de limbaj C pentru un obiect de lungime 0 octei i ntoarce un poantor valid la acesta. Copyright 2001. Toate drepturile sunt rezervate autorului. Parametri: dimensiune - num|rul de octei alocai pe heap. Remarca: Spaiul alocat de m allo scop heap are cel interzis|. 7 7 Multiplicarea acestui document n c() pecomercial este puin marimea lui dimensiune n octei. Blocul poate fi mai mare din cauza stoc|rii i a unor informaii legate de gestionarea heap-ului i a operaiei deform| de nv||mnt superior bugetar execuie programul Sudenii participani la orice aliniere. Codul care lanseaz| n pot multiplica acest utilizatorului folosete m allo c() pentru alocarea spaiului pentru variabilele environ , envp document pentru uzul personal. i argv . Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost elementele scris ializate cu n acest calloc - aloca un tablou pe heap cu i cu acordul init al autorului. 0 7 scop m| putei contact| la:*calloc(size_t numa r, size _t d im en siu ne ); Prototip: void 7 Fisier prototip: calloc() - <stdlib.h> i <malloc.h> ANTAL Tiberiu Alexandru Valori ntoarse: tel.: 0040-264-530918calloc() ntoarce un poantor la un spaiu suficient de mare pentru stocarea e-mail: antaltiberiu@pcnet.ro unui num|r de obiecte de dimensiunea specificat| prin dimensiune pe heap. Fiecare obiect este ini ializat cu valoarea zero. Parametri: numa r - num|rul de obiecte; 7 dimensiune - marimea, n octeti, a unui obiect alocat pe heap. 7 200

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca realloc - Construcii de Maini de memorie 7 Facultatea realoca blocurile Prototip: Catedra de Mecanic|void *re alloc (void *ptrb loc, siz e_ t dim en siu ne ); i Programare Curs de limbaj C Fisier prototip: calloc() - <stdlib.h> i <malloc.h> Valori ntoarse: rea lloc () ntoarce un poantor void la blocul de memorie realocat. Copyright 2001. Toate drepturile sunt|rezervate autorului. Valoarea ntoars este NULL dac| dimensiune este zero i ptrbloc nu este NULL sau dac| nu este suficient| memorie disponibil| Multiplicarea acestuipentru a expanda spaiul blocului interzis|. document n scop comercial este la cel specificat n dimensiune . n primul caz spaiul originar alocat blocului este eliberat, iar n cel de Sudenii participani al doileaform| de nv||mnt superior bugetar pot multiplica acest la orice blocul originar r|mne nemodificat. document pentru uzul personal. Parametri: ptrbloc - poantor la spaiul originar alocat blocului de memorie; dimensiune - noua dimensiune a blocului de memorie n octei. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest free - putei contact| la: 7 7 scop m|dezaloca (elibereaza) spatiul alocat unui bloc de memorie Prototip: void fre e(vo id *p trblo c); ANTAL Tiberiu Alexandru Fisier prototip: free() - <stdlib.h> i <malloc.h> tel.: 0040-264-530918 Valori ntoarse: nu are e-mail: antaltiberiu@pcnet.ro Parametri: ptrbloc - poantor la un bloc de memorie alocat deja cu m allo c() , calloc() sau rea lloc() care va fi eliberat (dezalocat). Remarca: dup| dezalocarea unui bloc de memorie spaiul disponibil pe heap crete. 7

13.2 Alocarea dinamica a memoriei 7 pentru vectori

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C n limbajul C tablourile sunt implementate ntr-o form| destul de primitiv|. Nu exist| un mecanism al limbajului pentru modificarea num|rului de elemente sau de dimensiuni ale Copyright 2001. Toate drepturile sunt rezervate autorului. limbajul BASIC care are unui tablou dup| declararea acestuia (spre deosebire de instruciunea Re Dim numai pentru acest scop). Este ns| posibil ca un spaiu continuu de Multiplicareasacestui document n scop comercial esteia de continuitate a tabloului este adrese fizice | fie alocat unui tablou pe heap. Condi interzis|. garantat| ns|i prin modul de lucru al funciilor de manipulare a heap-ului. n acest scop programul trebuie s| declare un poantor la adresa superior a blocului de memorie acest Sudenii participani la orice form| de nv||mntde nceputbugetar pot multiplica alocat pe heap. De exemplu, n locul unui tablou declarat prin floa t a[10 0]; putem declara un document pentru uzul personal. poantor la tipul float (floa t *pa ;), apoi folosind funcia m allo c() aloc|m spaiul dinamic pe heap tabloului cu expresia pa form| de(100* sizeo f(float));. Spaiul de persoane doritoare Sudenii participani la orice = m alloc nv||mnt cu plat| sau alte memorie n acest caz va fimultiplicaheap i nu pe numai contra cost i cui acordul scris al autorului. al tabloului pot alocat pe documentul segmentul de date ca n primul caz. Un element n acest pa va putea fi referit prin expresia pa[i] . Dac| se aloc| mai multe tablouri pe heap este scop m| putei contact| la: de cte un poantor de tipul elementelor de tablou. Este nevoie pentru fiecare tablou posibil| i folosirea lui m allo c() pentru alocarea pe heap a spaiului folosit pentru stocarea ANTAL Tiberiu Alexandru unei singure variabile. Aceasta este cea mai simpl| modalitate de folosire a functiei tel.: 0040-264-530918 m allo c() , iar programul care urmeaz| ilustreaz| modul de folosire a funcie m allo c() n e-mail: antaltiberiu@pcnet.ro acest scop:
/* M ALL OC 1.C */ #include <malloc.h> #include <stdio.h> 201

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int main(void) Facultatea Construcii de Maini { Catedra deble *pf; Mecanic| i Programare dou Curs de limbaj ble *) malloc (sizeof(dou ble)); pf= (d ou C

Copyright 2001. Toate drepturile %p \nrezervate autorului. prin tf("Co ntin utu l lui pf: sunt ",pf);
prin tf("Va loar ea la ca re p oan teaza: % lf\n ",*pf);

*pf=123.456789;

Multiplicarea acestui document n scop comercial este interzis|. free (pf); Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest return 0; } document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Rezultate: pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Continutul lui pf: 00780EB0 scop m| putei contact| la:
Valoarea la care poanteaza: 123.456789

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 sus poantorului pf la tipul doub le i se atribuie valoarea ntoars| de n programul de mai e-mail: antaltiberiu@pcnet.ro m allo c.h. Apoi lui *pf i se atribuie valoarea 123.456789, funcia m allo c() - declarat| n stocnd aceast| valoare la adresa la care poanteaz| pf. Linia (double *) malloc(sizeof (dou ble)) face urm|toarele: - expresia m alloc (sizeof (do ub le)) ntoarce num|rul de octei utilizai pentru stocarea unui tip doub le , adic| valoarea 8 ; - funcia ma lloc(dimensiune) aloc| un num|r de dimensiune octei consecutivi pe Conf. dr. ing. ANTAL Tiberiu Alexandru heap-ul neutilizat i ntoarce adresa de nceput a blocului de memorie; Universitatea Tenhic| din Cluj-Napoca - expresia (doub le *) foreaz| tratarea adresei de nceput ca un poantor de tipul Facultatea Construciiie am spus deja c| poart| denumirea de forare a tipului - casting). de Maini doub le (aceast| opera Catedra de Mecanic| i aceast| operaie automat, dar majoritatea compilatoarelor C vor Unele compilatoare fac Programare Curs demesajulC eroare Non-portable pointer assignement dac| conversia este omis|; genera limbaj de - n final, adresa este stocat| n pf. Aceasta nseamn| c| s-a creat dinamic o Copyright 2001. Toate drepturile sunt rezervatereferi prin *pf. variabil| real| de tipul doub le pe care o putem autorului. Multiplicarea acestui document n scop comercial este interzis|. Dac| dorii s| alocai dinamic spaiul pentru elementele unui vector, programul urm|tor ilustreaz participani la orice form| calloc(). Sudenii | modul de lucru cu funciade nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.
1 /* CA LLO C1.C */ 2 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare #include <malloc.h> 3 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest #include <stdio.h> 4 scop m| putei contact| int main(void) 5 { 6 7 8 9 10 11 12 13

la:

int *Vector,i,n; ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail:prin tf("N r. elem en telor antaltiberiu@pcnet.ro sca nf("% i",& n);

d e ve ctor = ");

if ((Vector=(int *) calloc(n,sizeof(int))) == NULL) { fprintf(stderr,"Nu se poate a loca spatiul de %u oc teti"\ 202

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca "\n pen tru %u intre gi pe stiva \n ", Facultatea Construcii de Maini return 1; Catedra de Mecanic| i Programare } Curs de limbaj C for (i=0; i<n;i++)

n*s izeo f(int), n );

Copyright 2001. Toate drepturile sunt rezervate autorului. {


prin tf("Ve ctor + %2i = ", i);

Multiplicarea sca nf("%i", V ector+ i);scop comercial este interzis|. acestui document n
}

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest prin tf("Lis uzul personal. document pentru ta a dre selor: ");
for (i=0; i<n;i++) prin tf("%8 p ",(Ve ctor + nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice form| de i)); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest prin tf("\n Lista la: scop m| putei contact|va lorilor : "); for (i=0; i<n;i++) prin tf("%8 d ANTAL Tiberiu Alexandru",*(V ector tel.: 0040-264-530918 e-mail:prin tf("\n "); antaltiberiu@pcnet.ro free (Vector); return 0; + i));

36 37 }

Conf. dr. ing. ANTAL Tiberiu Alexandru Rezultate: Universitatea Tenhic| din Cluj-Napoca Nr. elementelor de vector = 3 Facultatea Construcii de Maini Vector + 0 = 123 i Programare Catedra de Mecanic| Vector + 1 = C Curs de limbaj 34553
Vector + 2 = 2323 Lista adreselor: 00780EB0 00780EB4 00780EB8 Copyright 2001. Toate drepturile sunt rezervate autorului. Lista valorilor: 123 34553 2323

Multiplicarea acestui document n scop comercial este interzis|. Programul permite manipularea valorilor de tipul int n condiiile de necunoatere a num|rului acestora n momentul compil|rii programului. n linia 11 se ncearc| alocarea Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest spaiului pentru un num|r de n elemente de tipul int. Cnd calloc() ntoarce valoarea document pentru uzul personal. NULL nseamn| c| nu exist| suficient spaiu pe heap pentru alocarea blocului cerut. Elementele vectorului la careform| de nv||mnt cureferite prin sintaxa *(Vedoritoaren Sudenii participani la orice poanteaz| Vector sunt plat| sau alte persoane ctor + i). locul acesteia s-ar fi putut scrie i Vec tor[i]. n linia 34 se elibereaz| spaiul alocat pe heap pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest pentru bloc. scop m| putei contact| la: Ce se petrece dac| la un moment dat ne d|m seama c| avem nevoie de mai multe elemente ANTAL Tiberiu Alexandru dect cele citite n variabila n ? Funcia rea lloc() permite modificarea cantit|ii de memorie tel.: 0040-264-530918 alocate unui bloc. S| presupunem c| n locul celor n elemente dorim s| realoc|m spaiu e-mail: antaltiberiu@pcnet.ro pentru 2*n elemente de tipul int. Va fi nevoie de un nou poantor. n exemplul care urmeaz| poantorul se numeste ReV ector , iar spaiul pentru stocarea tabloului va fi realocat folosind expresia: Re Ve ctor = rea lloc(Vector, 2*n *size of(in t));.

203

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca i n acest caz este posibilMaini Facultatea Construcii de ca realocarea s| nu reueasc|, adic| s| nu se g|seasc| o zon| continu| de Mecanic| i Programare Catedra de memorie dinamic| cu dimensiunea cerut|. n acest caz rea lloc() va ntoarce valoarea NULL care va fi atribuit| lui ReVector . Dac| adresa obinut| din rea lloc() ar fi Curs de limbaj C lui Vector, n cazul nereuitei aloc|rii, adresa iniial| ar fi fost pierdut| fost atribuit| direct

pentru c| valoarea N U LL ar fi fost pus| n locul celei iniiale (datorit| operatorului de Copyright 2001. alocarea reuete, urm|toarele dou| scenarii sunt posibile: atribuire). Dac| Toate drepturile sunt rezervate autorului. 1. rea lloc() a fost n stare s| creasc| regiunea de memorie iniial alocat| Multiplicarea blocului, motiv pentru care adresa lui ReVector este aceeai cu cea a lui acestui document n scop comercial este interzis|. Vector sau Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest 2. realloc() nu a putut crete m|rimea blocului alocat iniial i a trebuit s| document pentru uzul|personal. g|seasc un bloc nou. Adresa lui ReVector i cea a lui Vector vor fi diferite n acest caz. Blocul iniial va fi copiat la noua adres| i n continuarea lui se Sudenii participani laspaiulform| de nv||mnt cu plat| sau alte persoane doritoare va aloca orice pentru obiectele noi. pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Ce se petrece n cazul tablourilor cu mai multe dimensiuni si cum anume se va aloca dinamic Tiberiu Alexandru spaiul pentru acestea? S| presupunem c| lucr|m cu un tablou float ANTAL tempmed zil[10][365] care va stoca temperatura medie pentru fiecare zi din an a 10 regiuni tel.: 0040-264-530918 distincte. Dac| am dori s| aloc|m dinamic spaiul pentru acest tablou, permind ca e-mail: antaltiberiu@pcnet.ro num|rul de regiuni s| fie variabil i numai partea de 365 de float-uri s| fie fix|, codul ar putea fi scris astfel:
float **pp tm pm ed zil; **pp tm pm ed zil = ca lloc(nrreg iun i, 365 * size of(floa t));

Conf.nrregiuni va conine num|rul de regiuni n care se va m|sura temperatura medie. unde dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca | suficiente informaii pentru ca poantorul Acest stil de declarare nu ofer| ns Facultatea Construcii de|Maini pp tm pm edz il s| permit deplasarea corect | prin tablou. De exemplu, cnd scriem Catedra de Mecanic| i Programare ptmpm edzil[3][100], 3 trebuie s| produc| saltul peste 4 blocuri de 365 de r -uri (3*365*4 = 5696 octei) i apoi 100 peste nc| 4*100 = 400 de octei. n total trebuie s| se sar| 6096 Curs de limbaj C octei, ns| compilatorul nu poate determina acest lucru folosind declaraia poantorului. Copyright 2001. Toate drepturile sunt rezervate autorului.
/* PTT AB .C */ Multiplicarea acestui #include<stdio.h> int main(void) Sudenii participani

document n scop comercial este interzis|.

la orice form| de nv||mnt superior bugetar pot multiplica acest { document pentru uzul personal.
floa t tm pm ed zil[3][10],**pp tm pm ed zil; tm pm ed zil[0 ][0]=3.; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pptm pm ed zil=(floa **)tm pm ed zil; pot multiplica documentult numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: prin tf(" tmpm ed zil %p\ n", tm pm ed zil); prin tf(" pptm pm ed zil %p\ n", p ptm pm ed zil); ANTAL Tiberiu Alexandru prin tf(" tmpm ed zil[0][0] % f\n ", tm pm ed zil[0][0]);

tel.: 0040-264-530918 prin tf(" &tm pm ed zil[0][0] e-mail: antaltiberiu@pcnet.ro


return 0; }

% p\n ", &tm pm ed zil[0][0]); prin tf("& pptm pm ed zil[0][0] % p\n ", &p ptm pm ed zil[0][0]);

204

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Rezultate: Construcii de Maini Facultatea tmpmedzil 0065FD80 Catedra de Mecanic| i Programare pptmpmedzil 0065FD80 Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


&pptmpmedzil[0][0] 40400000

tmpmedzil[0][0] 3.000000 &tmpmedzil[0][0] 0065FD80

Multiplicarea acestui document n scop comercial este interzis|. n programul de mai sus se poate observa uor c| tmpm edzil[0][0] i pptmpm edzil[0][0] sunt dou| obiecte diferite pentru c| de nv||mnt superior tmp m edz il i pptm pmacest Sudenii participani la orice form| au adrese diferite, dei bugetar pot multiplica edz il poanteaz| pentru uzuladres|. Cum se poate rezolva aceast| problem|? Soluia st| n document la aceeai personal. declararea poantorului sub forma: Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica ed zil)[365]; numai contra cost i cu acordul scris al autorului. n acest floa t (*ptm pm documentul scop m| putei contact| la: Compilatorul "va ti" c| n cazul expresiei ptm pm ed zil[3][100 ], 3 trebuie nmulit cu ANTAL Tiberiu Alexandru dimensiunea a 365 de float-uri (pptm pm edz il fiind poantor la un tablou de 365 de float-uri tel.: 0040-264-530918 3 duce la saltul peste 3 astfel de tablouri). De asemenea, "tie" c| 100 trebuie scalat prin e-mail: antaltiberiu@pcnet.ro ca adresele folosite pentru poziionarea n tablou vor fi dimensiunea lui float, astfel 7 calculate corect.

13.3 Alocarea dinamica a memoriei 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca pentru matrice Facultatea Construcii de Maini

Dup| cum ai dedus dinProgramare | acum, cnd se aloc| dinamic spaiul pentru un Catedra de Mecanic| i cele citite pn tablou unidimensional (vector), dimensiunea acestuia poate fi g|sit| n timpul execuiei Curs de limbaj C programului. La utilizarea unor tablouri cu mai multe dimensiuni, nu trebuie s| cunoatem prima dimensiune n momentul compil|rii. Necesitatea cunoaterii celorlalte Copyright 2001. Toate drepturile sunt rezervate autorului. n continuare se vor discuta dimensiuni depinde numai de felul n care vom scrie noi codul. problemele aloc|rii dinamice a spaiului pentru tablourile de ntregi cu 2 dimensiuni Multiplicareantregi).documentnceput, comercial|m cazul n care se cunoate a 2-a (matrice de acestui Pentru n scop consider este interzis|. dimensiune n momentul compil|rii programului. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Metoda 1: Una dintre metodele de a trata problema este utilizarea lui typedef. Pentru alocarea spaiului unui tablou de dou| dimensiuni reamintii-v| notaiile echivalente: Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest iTab 2[rand ][coloana ] = 1; *(*(iTab 2 + rand ) + coloana) = 1; scop m| putei contact| la: este de asemenea adev|rat c| urm|toarele notaii genereaz| acelai cod: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 iTab2[rand] *(iTab2 + rand) e-mail: antaltiberiu@pcnet.ro deci iTab2 poate fi privit ca un tablou de tablouri, iar iTab2[n] ca un poantor la cel de al n- elea tablou din tabloul de tablouri. Fie programul:

205

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca #include <stdio.h> Facultatea Construcii de Maini #include<stdlib.h> Catedra de Mecanic| i Programare Curs de limbaj C 5 #define COLOANE

Copyright t tip_ Ta bR an du ri[C OLO AN E]; typ ed ef in 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document tip_TabRanduri* prand; Sudenii participani int main(void) n scop comercial este interzis|.

la orice form| de nv||mnt superior bugetar pot multiplica acest { document pentru uzul personal.
int iNrRan duri = 10; int iRand, iColoana; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pra nd =m alloc (iNrR an du ri* C OL cost i cu acordul scris al autorului. n acest pot multiplica documentul numai contraOA NE * size of(in t)); for (iRand ; iRand scop m| putei contact| la:< iNrR and uri; iRan d++) { for (iColoana ANTAL Tiberiu Alexandru = 0; iColoana < COL OA NE ; { tel.: 0040-264-530918 prand[iRand][iColoana]=22; e-mail: antaltiberiu@pcnet.ro } } return 0; } iColoana ++)

Am presupus ANTAL Tiberiu Alexandru Conf. dr. ing. c| utilizai un compilator ANSI care face automat conversia de la poantorul void ntors deTenhic| din Cluj-Napoca compilator antic, trebuie s| facei conversia cu Universitatea ma lloc() . Dac| utilizai un mna, scriind prand= (tip_TabR andu ri *) m allo c (...) . Utilizarea acestor declaraii face Facultatea Construcii de Maini ca prand s| aib| toate caracteristicile unui nume de tablou (cu excepia c| prand poate Catedra de Mecanic| i Programare fi modificat) i notaia de tablou poate fi folosit| n continuarea programului. Aceasta Curs de | c| dacC dorii s| scriei o funcie care s| modifice coninutul tabloului, COLOANE nseamnlimbaj | trebuie s| fie unul din parametrii transferai funciei, dupa cum am discutat la tablouri i 7 Copyright 2001. Toate drepturile sunt rezervate autorului. funcii.

Multiplicarea acestui document n scop comercial este interzis|. Metoda 2: n metoda anterioar| prand este un poantor la un tip de tablou unidimensional de num|r de C O LO AdeE de ntregi. Exist| obugetar sintactic| mai simpl| Sudenii participani la orice form| N nv||mnt superior scriere pot multiplica acest pentru a exprima acest lucru, f|r| a utiliza typedef: document pentru uzul personal.
int (*p1rand )[CO LO AN E];

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Aici variabila p1rand are aceleai caracteristici cu prand i reprezint| un poantor la un scop m| putei contact| la: tablou de ntregi, iar dimensiunea tabloului se d| prin C O LO A N E . Plasarea parantezelor face ca notaia de poantor sa fie predominant| ntruct f|r| acestea notaia de tablou are 7 ANTAL Tiberiumare. Dac| scriam: preceden| mai Alexandru tel.: 0040-264-530918 e-mail:rand [CO LO AN E]; int *p1 antaltiberiu@pcnet.ro
p1rand ar fi C O LO A N E .

fost un tablou de poantori cu num|rul de poantori la ntregi egal cu

206

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Metoda 3: Consider|de Maini care nu se cunosc num|rul de elemente la momentul Facultatea Construcii m cazul n compil|rii. O metod| ar Programare tablou de poantori la tipul ntreg i apoi alocarea Catedra de Mecanic| i fi crearea unui spaiului pentru fiecare rnd n parte i stocarea adresei rndului alocat n poantorul Curs de limbajdin tablou. corespunz|tor C

Copyright 2001. Toate drepturile sunt rezervate autorului.


/* ALD INT A1.C */ #include <stdio.h> Multiplicarea acestui #include <stdlib.h>

document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int main(void) document pentru uzul personal.
{

Sudenii participani10 ; orice form| de nv||mnt lcu plat| sau alte persoane*/ la /* sau se citeste in timpu execu tiei program ului doritoare int iN rC oloan e = potint iRand; documentul numai contra cost i cu acordul scris al autorului. n acest multiplica scop m| putei contact| la: int **pRand;
pR an d = m alloc (iNrR an du ri * siz eof(in t *));

int iNrRandu ri = 5; /* Nu ma rul de linii cat si cel de coloan e se eva lueaza */

ANTAL TiberiuNULL) if (pRand == Alexandru tel.: 0040-264-530918 { e-mail: antaltiberiu@pcnet.ro tiul puts("\ nN u p ot alo ca s pa
exit(0); }

p en tru iRa nd poa ntori.\n ");

prin tf("\n \n \n Ind ice P oan tor(hex a) P oan tor(ze c) for (iRand = 0; iRa Tiberiu Alexandru Conf. dr. ing. ANTALnd < iN rRa ndu ri; iRand ++) { Universitatea Tenhic| din Cluj-Napoca pRa nd [iRa nd ] = de Maini Facultatea Construciima lloc(iN rColoa ne * sizeof(in t)); if Catedra(pRand[iRand] == NULL) de Mecanic| i Programare { Curs de limbaj C exi t(0);

Dife ren ta(ze c)");

prin tf("\n N u p ot alo ca s pa tiul p entr u R an d[% d]\n ",iRan d);

Copyright 2001. Toate drepturile sunt rezervate autorului.


}

Multiplicarea acestui document n scop comercial este interzis|. if (iRand > 0)


printf(" % d",(in t)(pR an d[iR an d] - pR an d[iR an d-1]));

printf("\ n% d

%p

%d", iR an d, pR an d[iR an d], pR an d[iR an d]);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest } document pentru uzul personal.
return 0;

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare } pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Rezultate:
Indice Poantor(hexa) Poantor(zec) ANTAL Tiberiu Alexandru 0 00770710 7800592 tel.: 0040-264-530918 1 00770760 7800672 e-mail: antaltiberiu@pcnet.ro 2 3 4 007707B0 00770800 00770850 7800752 7800832 7800912 Diferenta(zec) 20 20 20 20

207

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n codul anterior pRand este un poantor la un poantor la tipul int. Pentru cazul nostru, Facultatea Construcii de Maini poanteazde Mecanic| i Programare Catedra | la primul element al unui tablou de poantori la tipul int. Dac| lucrai cu aceast| metod| accesul la un element de tablou se face tot n stilul clasic, adic| Curs de limbaj C a]= 22 , dar aceasta nu nseamn| c| datele din tabloul cu 2 dimensiuni pR an d[ran d][coloan

sunt stocate continuu n memorie. Copyright 2001. Toate drepturile sunt rezervate autorului. Num|rul de apeluri al funciei mn scop este: Multiplicarea acestui document allo c() comercial este interzis|. Pentru tabloul de poantori 1 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Pentru alocarea spaiului fiec|rui rnd 5 document pentru uzul personal. ______________________________________ Total 6 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Dac| dorii ca un bloc continuu de memorie s| fie alocat pentru tablou, putei folosi metoda urm|toare. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Metoda 4: Aici se aloc| un bloc continuu de memorie pentru stocarea tabloului. Apoi se e-mail: antaltiberiu@pcnet.ro creeaz| un tablou de poantori care vor poanta la fiecare rnd. Dei se utilizeaz| un tablou de poantori, tabloul actual este continuu n memorie.
/* ALD INT A2.C */ #include <stdio.h> #include ing. ANTAL Conf. dr. <stdlib.h>

Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int main(void) Facultatea Construcii de Maini { Catedra de Mecanic| i Programare int **pRand; Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. int k; Multiplicarea acestui documentin timpul ex ecutiei prog ram ului int iNrColoane = 8;/* citite n scop comercial este interzis|.
int iRand, iColoana; int iNrRandu ri = 5;/* Am bele dim ensiu ni pot fi evalua te sau p ot fi*/ */ int *piA; int *pte st;

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. tablou */ /* Aici se aloca spatiul pen tru Sudenii m alloc (iNrRla orice form| de nv||mnt cu plat| sau alte persoane doritoare piA = participani an du ri * iN rColoa ne * sizeof(in t)); potif (piA == NULL) multiplica documentul numai contra cost i cu acordul scris al autorului. n acest { scop m| putei contact| la:
pu ts("\n N u p ot alo ca s pa tiul p en tru tab lou "); exit(0); ANTAL Tiberiu Alexandru } 0040-264-530918 tel.: e-mail: antaltiberiu@pcnet.ro /* Aici se aloca spatiu pe ntru po antorii la ran dur i */ pR an d = m alloc (iNrR an du ri * siz eof(in t *)); if (pRand == NULL) { 208

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca pu ts("\n N u p ot alo ca s pa tiul p en tru poa ntori"); Facultatea Construcii de Maini exit(0); Catedra de Mecanic| i Programare } Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.


for (k = 0; k < iNrRa ndu ri; k++)

/* Aici se va po anta la p oantori */

Multiplicarea acestui document n scop comercial este interzis|. {


pRa nd [k] = piA + (k * iN rColoa ne );

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest } document pentru uzul personal.
/* Aici se ilustreaz a m odu l in care poa ntorii la rand uri se incre me nteaza */ prin tf("\n \n Ilus trar ea m form| in ca re po an torii la ran du ri persoane doritoare Sudenii participani la orice odulu i de nv||mnt cu plat| sau altese incr em en teaza" ); potprin tf("\n \n Ind ex Poa ntor(he x) D ifere nta (zec)"); multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: for (iRand = 0; iRa nd < iN rRa ndu ri; iRand ++) { ANTAL Tiberiu Alexandru printf("\ n% d tel.: 0040-264-530918 %p ", iRa nd , if (iRand > 0) e-mail: antaltiberiu@pcnet.ro printf(" pR an d[iR an d]);

%d ",(pR an d[iR an d] - pR an d[iR an d-1]));

} prin tf("\n \n Ac um se tip are ste ta blou l\n" ); for (iRand = 0; iRa nd < iN rRa ndu ri; iRand ++) {

Conf. {dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca + iColoana; pRand[iRand][iColoana] = iRand Facultatea Construcii de Maini d][iC oloa na ]); prin tf("%d ", pR an d[iR an Catedra de Mecanic| i Programare } Curs de limbaj C '); putch ar('\n
}

for (iColoan a = 0; iColoan a < iNrC oloane; iColoa na++)

Copyright 2001. Toate drepturile sunt rezervate autorului.


puts ("\n ");

Multiplicarea acestui document n scop comercial este interzis|.


/* Aici se ilustreaza faptul ca se utilizeaza un tablou bidimes ional intr-un bloc continu u de m em superior Sudenii participani la orice form| de nv||mnt orie. */

bugetar pot multiplica acest

prin tf("Ac um uzul personal. document pentrudem onstra m con tinu itate a in m em orie \n "); ptest piA; Sudenii =participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare potfor (iRand =documentul numai ndu ri; iRand ++) acordul scris al autorului. n acest multiplica 0; iRa nd < iN rRa contra cost i cu { scop m| putei contact| la: for (iColoan a = 0; iColoan a < iNrC oloane; iColoa na++) {

ANTAL Tiberiu Alexandru prin tf("%d ", *(ptest++)); tel.: 0040-264-530918 } e-mail: antaltiberiu@pcnet.ro putch ar('\n ');
} return 0; } 209

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Rezultate: Catedra de Mecanic| i Programare Ilustrarea modului in care poantorii la randuri Curs de limbaj C Index Poantor(hex) Diferenta(zec) Copyright 2001. Toate drepturile sunt rezervate 0 007706D0 1 007706F0 Multiplicarea acestui 2 00770710 3 00770730 Sudenii participani 4 00770750 8

se incrementeaza

autorului.

8 document n scop comercial este interzis|.

8 la orice form| de nv||mnt superior bugetar pot multiplica acest 8 document pentru uzul personal. Acum se tipareste tabloul

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 0 1 2 3 4 5 6 7 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest 1 2 3 4 5 6 7 8 scop 4 5 putei8contact| la: m| 6 7 2 3 9
3 4 5 6 7 8 9 10

ANTAL Tiberiu Alexandru 4 5 6 7 8 9 10 11 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Acum demonstram continuitatea
0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 10 4 5 6 7 8 9 10 11

in memorie

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca este: Num|rul de apeluri ale funcie m allo c() Facultatea Construcii de Maini Pentru tabloul n sine 1 Catedra de Mecanic| i Programare Pentru C 1 Curs de limbajtabloul de poantori ______________________________________ Copyright 2001. Toate drepturile sunt rezervate autorului. Total 2 Multiplicarea acestui document n scop comercial este interzis|. Sigur v-ai ntrebat de ce este important| continuitatea n memorie a tabloului. Un motiv ar fi acela c| prin m em orice form| face inializarea lui n bugetar pot Un alt motiv ar Sudenii participani laset() se poatede nv||mnt superiormod elegant.multiplica acest fi c| sistemul de operare implementeaz| m allo c() sub forma unei liste nlanuite care 7 document pentru uzul personal. conine date despre m|rimea fiec|rui bloc. Deci fiecare apel a lui m allo c() va duce la alocarea de spaiu n lista nl|uit| descris| mai sus. Cum n acest caz num|rul de apeluri Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare a lui m allo c() este mai mic, spaiul auxiliar consumat pentru stocarea poziiei i dimensiunii pot multiplica memorie alocate de aceast| implementare scris al autorului. n n cazul blocurilor de documentul numai contra cost i cu acordul este mai mic dect acest scop m| putei contact| la: anterior. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

13.4 Structuri dinamice de date


Alocarea dinamic| a memoriei se poate face i pentru structuri de date diferite de tablou. De exemplu, struct este des folosit| pentru structuri de date care au elementele legate ntre ele cum sunt listele, arborii, grafele etc. unde num|rul de elemente (noduri) necesare pentru stocarea datelor nu poate fi cunoscut exact la momentul compil|rii programului.
210

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n Figura 24 se reprezint| schema unei structuri de dat| numit| lista sim plu 7 Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

nlant uita . - 7

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numailiste simplu nl|nuite Figura 24 - Schema unei contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: Datele sunt stocate ntr-o structur|, care pe lng| informaia util| are i un poantor la ANTAL TiberiuOricnd i se poate ad|uga un nou nod listei dac| ultimul poantor este urm|torul nod. Alexandru actualizat pentru a poanta la noul element ad|ugat. Dac| se pleac| de la nceputul listei, tel.: 0040-264-530918 aceasta antaltiberiu@pcnet.ro n aproape, adic| nod cu nod, prin folosirea poantorului la e-mail: se va crea din aproape nodul urm|tor. Ultimul poantor este de obicei iniializat cu valoare NULL pentru a marca faptul c| aici lista se termin|. Un alt exemplu de list| este cea dublu nl|nuit|. Aceasta are doi poantori, unul la nodul urm|tor i unul la nodul anterior, n acest fel lista putnd fi parcurs| n dou| sensuri, spre deosebire de cea simplu nlanuit| care poate fi parcurs| numai ntr-un singur sens. Probabil cel mai bun exemplu de list| nlanuit| este Tabela de Alocare a Fiierele (FAT sau File Allocatio n T ab le ) folosit| de sistemul de operare Conf. AceastaANTAL Tiberiu Alexandru DOS. dr. ing. este o list| de cluster-e (cluster - spaiu pe disc cu m|rimea minim| alocat| Universitatea Tenhic| din Cluj-Napoca stocate pe disc. Din moment ce dimensiunea unui pentru stocare de date) alocat| fiierelor fiier poate crete, listele Maini 7 Facultatea Construcii de nlanuite sunt folosite n scopul stoc|rii lor. Fiecare intrare n FAT reprezint| un cluster pe disc i stocheaz | poziia urm|toarei intr|ri. Pentru a g|si Catedra de Mecanic| i Programare care clustere sunt folosite pentru stocarea unui fiier se parcurge FAT-ul pn| cnd se Curs de limbaj C ajunge la un marcaj de terminare a listei de clustere. Copyright 2001. Toate drepturile sunt rezervate autorului. Exemplul care urmeaz| prezint| un grup de funcii care aloc| spaiu pentru un nod al unei Multiplicarea acestui documentdatele stocate n aceasta prin parcurgerea ei de la cap la liste simplu nl|nuite, afieaz| n scop comercial este interzis|. coad| i n final elibereaz| spaiul alocat pe heap nodurilor listei. n paragraful 10.7 noiunea de list| a fost orice form| de noutatea programului care va fi multiplica acest7 Sudenii participani ladeja prezentat|,nv||mnt superior bugetar pot prezentat consta n alocarea dinamic| a memoriei pentru elementele listei (pentru a m| apropia de document pentru uzul personal. terminologia specific| listelor, aici elementele au fost numite noduri). Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare /* LISTA SI.C documentul numai contra cost i cu acordul scris al autorului. n acest pot multiplica */ #include<stdio.h> scop m| putei contact| la:
#include<string.h> #include<malloc.h> ANTAL Tiberiu Alexandru #include<stdlib.h> tel.: 0040-264-530918

e-mail: antaltiberiu@pcnet.ro
struct Nod { int cod; struct Nod *p_urm_Nod; }; 211

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca struct Nod* nod_ Nou (int c) Facultatea Construcii de Maini { Catedra de Mecanic| i Programare struct Nod *p; Curs de limbaj C if ((p = malloc(sizeof(struct Nod))) == NULL)

Copyright 2001. Toate drepturile sunt izat me m oria din am ica fprintf(std err, "S -a epu rezervate autorului.
ex it(9);

dispon ibila !\n ");

Multiplicarea acestui document n scop comercial este interzis|. } Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest p->cod=c; p->p_urm_N od=NULL; document pentru uzul personal.
return p; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare } pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: struct Nod* nod_ Inserare(struct Nod *curent, int c) { ANTAL Tiberiu Alexandru s tr uc t N od * N N ; N N =no d_ N ou (c);

tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro


c ur en t-> p_ u rm _ N od =N N ; r etu rn N N ; }

Conf.lista ing.fisa re(co nst stru ct N od *cu ren t) void dr. _A ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca { Facultatea Construcii de Mainit->cod ); prin tf("%i ", curen Catedra de Mecanic| i Programare } Curs de limbaj C
void lista_Parcurgere(const struct Nod *p) Copyright 2001. Toate drepturile sunt rezervate { stru ct N od *cu ren t;

autorului.

Multiplicarea acestui document n scop comercial este interzis|.


curent=(struct Nod *) p; while (curent != NULL) Sudenii participani la orice form| { document

de nv||mnt superior bugetar pot multiplica acest

pentru uzul personal.


lista_ Afisare(cu ren t);

curent=curent->p_urm_Nod; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare } pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest } scop m| putei contact| la: void lista_Eliberare(struct Nod *p) ANTAL Tiberiu Alexandru {

tel.: 0040-264-530918 ren t; stru ct N od *cu e-mail: antaltiberiu@pcnet.ro

prin tf("\n Elib era rea nod urilor:"); curent = p; while (curent != NULL) 212

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca { Facultatea Construcii de Maini curent=curent->p_urm_Nod; Catedra de Mecanic| i Programare lista_ Afisare(p); Curs de limbaj C (p); free

Copyright 2001. Toate drepturile sunt rezervate autorului. }


}

p=curen t;

Multiplicarea acestui document n scop comercial este interzis|.


int cite ste_N od () Sudenii participani {

la orice form| de nv||mnt superior bugetar pot multiplica acest int n; document pentru uzul personal.
prin tf("n = "); Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare sca nf("% i", &n ); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: return n; } ANTAL

Tiberiu Alexandru tel.: 0040-264-530918 int main(void) e-mail: antaltiberiu@pcnet.ro


{ int n; stru ct N od *cap , *cur en t; if ((n = citeste_Nod()) <= 0)

Conf. dr. ing. ANTAL Tiberiu Alexandru prin tf("Am term ina t!\n"); Universitatea Tenhic| din Cluj-Napoca ex it(0); Facultatea Construcii de Maini } Catedra de Mecanic| i Programare Curs de limbaj Cd_ N ou (n); curen t=no
cap =cu ren t;

Copyright 2001. Toate drepturile sunt rezervate autorului.


while (n > 0) { Multiplicarea acestui document n scop comercial este interzis|. if ((n = citeste_Nod()) > 0) participani curen t=no d_ Ins era re(cu ren t,n); la orice form| de nv||mnt superior

Sudenii } document pentru uzul personal.

bugetar pot multiplica acest

lista_ Pa rcu rge orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani lare(ca p); lista _E pot multiplica libera re(c apnumai contra cost i cu acordul scris al autorului. n acest documentul ); scop m| putei contact| la: return 0; }

ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Rezultate: e-mail: antaltiberiu@pcnet.ro


n = 1 n = 2 n = 3 n = 4 213

Capitolul 13 - Alo carea dinam ica a memor iei n limbajul C 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n = 5 Facultatea Construcii de Maini n = 6 Catedra de Mecanic| i Programare n = 7 Curs8de limbaj C n = n = 0 Copyright 2001. 8 1 2 3 4 5 6 7 Toate

drepturile sunt rezervate autorului.

Eliberarea nodurilor:1 2 3 4 5 6 7 8

Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

214

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

14 Biblioteca C Standard

Sudeniiapitolul care urmeaz|form| prezentare sumar| a funciilor din biblioteca C ANSI. participani la orice este o de nv||mnt cu plat| sau alte persoane doritoare Biblioteca standard nu este o cost i cu acordul scris aldar toate mediile de pot multiplica documentul numai contra parte a limbajului C, autorului. n acest programare C contact| o metod| de lucru cu fiierele antet descrise n continuare i o scop m| putei asigur| la: biblioteca standardizata corespunz|toare acestor declaraii. Declaraiile de funcii, tipuri 7 7 de date i macrodefinitii sunt stocate n fiiere denumite an tete standard . Acestea sunt ANTAL Tiberiu Alexandru prezentate n continuare, mpreun| cu o sumar| descriere. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Diagnostic: <as ser t.h > Testare tip caractere: <cty pe.h> : Numere de eroare: <err no .h> Limite definite prin implementare pentru virgula flotanta: <floa t.h> 7 7 Limite definite prin implementare: Conf. dr. ing. ANTAL Tiberiu Alexandru <lim its.h > Universitatea Tenhic| din Cluj-Napoca <loca le.h > Facultatea Construcii de Maini Functii matematice: <m ath .h> Catedra de Mecanic| i Programare Salturi C Curs de limbajnelocale: <setjm p.h > Semnale: <sig na l.h> Copyright 2001.numar drepturile sunt rezervate autorului. Liste cu Toate variabil de argumente: <std arg.h > 7 Multiplicarea acestui document n scop comercial este interzis|. Intrare si iesire: <std io.h > - Functii utilitare: <std form| Sudenii participani la orice lib.h> de nv||mnt superior bugetar pot multiplica acest document pentru uzul prelucrarea sirurilor: <string .h> Functii pentru personal. Functii pentru ora si data: <tim e.h> 77 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Includerea acestor antete scop m| putei contact| la: n programul surs| se face prin directiva #include discutat| deja n capitolul 7. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
<std de f.h>

14.1 <assert.h>

void ass ert(in t expre ssio n); macro folosit pentru realizarea diagnostic|rii unui program. Dac| expresia expression este falsa (ia valoarea numeric| 0) un mesaj va fi afiat pe 7 stderr i apoi se apeleaz| funcia ab ort() pentru terminarea execuiei programului. Fiierul 215

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca surs| i num|rul de linie a macrodefinitiei se afieaz| prin __FILE__ , __L IN E__ a Facultatea Construcii de Maini preprocesorului. Dac| N D E B U G este definit| acolo unde s-a inclus <assert.h> , macro Catedra de Mecanic| i Programare asser t() este ignorat. Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

14.2 <ctype.h> comercial este interzis|. Multiplicarea acestui document n scop

Antetul conine declaraiile funciilor pentru testarea caracterelor. Conform standardului, submulimea literelor implicite cuprinde 26 de caractere mici i 26 de caractere mari ale Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest alfabetului latin. Acestea pot varia n funcie de anumite set|ri locale specifice, sub documentfunciei setloca le() . controlul pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare int isaln um (int c); diferit de 0 dac cost i cu acordul scris un num|r ('A'-'Z', 'a'-'z' pot multiplica documentul numai contra | c este un caracter saual autorului. n acest , '0'-'9'), adic| dac| sunt adev|rate isalpha(c) sau isd igit(c ). Altfel are valoare 0 ; scop m| putei contact| la: int is alpha (int c); difera de 0 dac| c este o liter| din alfabet ('A'-'Z', 'a'-'z'); 7 ANTAL Tiberiu Alexandru 7 de 0 dac| c este un caracter de control (0x7F , 0x00 -0x1F ); int iscn trl(int c); difera tel.: 0040-264-530918 int is dig it(int c); difer| de 0 dac| c este o cifr| ('0'-'9'); e-mail: antaltiberiu@pcnet.ro int isgraph(int c); difer| de 0 pentru cazul n care caracterul este grafic, adic| se poate afia i este diferit de spaiu (0x21-0x7E ); int is low er(in t c); difer| de 0 dac| c este o liter| mic| ('a'-'z'); int isprint(in t c); difer| de 0 dac| c este un caracter ce se poate afia, inclusiv spaiu (0x20-0x7E ); Conf. dr. ing. ANTAL c); difer| de 0 dac| c este un semn de punctuaie diferit de spaiu, Tiberiu Alexandru int ispu nct(in t Universitatea|; cifr| sau liter Tenhic| din Cluj-Napoca Facultatea Construcii de Maini int issp ace (int c); difer| de 0 dac| c este spa iu , formfeed , ne w line , carriage Catedrahorizontal tab sau vertical tab (0x09-0x0D , 0x20 ); de Mecanic| i Programare return , Curs de limbaj C int is up per (int c); difer| de 0 dac| c este o liter| mare ('A'-'Z'); int 2001. Toate drepturile sunt rezervate o cifr| hexazecimal|; 7 Copyright is xd igit(in t c); difera de 0 dac| c este autorului. int tolow er(in t c); ntoarce echivalentul literei mici corespunz|toare lui c ; Multiplicarea acestui document n echivalentul literei mari corespunz|toare lui c . scop comercial este interzis|. int toup per(int c); ntoarce Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Remarca 7 document pentru uzul personal. isupper(c) implic| isalpha(c) Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare islower(c) implic| isalpha(c) pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest issspace(c), ispunct(c), iscntrl(c) sau isdigit(c) implic| !isalpha(c) scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro FLT _R AD IX - r|d|cina reprezent|rii exponeniale; FLT_ROUNDS - modul de rotunjire pentru adun|ri n virgul| flotant|; FLT_DIG - num|rul de cifre q astfel nct un num|r n virgul| flotant| cu q zecimale s| poat| fi rotunjit la o reprezentare n virgul| flotant| i invers f|r| pierderea

14.3 <float.h>

216

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca preciziei; Construcii de Maini Facultatea FLT_EPSILON cel mai mic Catedra de Mecanic| i-Programare num|r x astfel nct 1.0 + x != 1.0 Curs de limbajAN T_ DIG - num|rul de cifre zecimale din r|d|cin| specificate de FLT _M C FLT _R AD IX semnificative n virgul| flotant|; Copyright 2001. Toate drepturile sunt |r n virgul| flotant| care se poate reprezenta; rezervate autorului. FLT_MAX - cel mai mare num F LT _M A X _ EX P - cel mai mare ntreg astfel Multiplicarea acestui document n scop comercial este nct FLT_RA DIX ridicat la acea interzis|. putere s| dea un num|r care se poate reprezenta n virgul| flotant|; FLT _M IN - valoarea form| normalizat| pentru un num|r pot multiplica acest Sudenii participani la oriceminim|de nv||mnt superior bugetarn virgul| flotant|; document pentru _E X P - valoarea ntreag| negativ| minim| astfel nct FLT _R AD IX F LT _M I N uzul personal. ridicat la acel num|r s| dea o valoarea care se poate reprezenta n virgul| flotant|; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contraformat cu acordul scris al n virgul| flotant| cu Constantele prezentate pn| acum au cost i obiectul valorilor autorului. n acest scop m| putei contact| la:|toare tipului float). Cele care urmeaz| au aceleai semnificaii simpl| precizie (corespunz (i se pot identifica prin terminaia scris| n urma primului caracter und erscore , " _ ", din ANTAL Tiberiu Alexandru i DBL_DIG au aceeai semnificaie, dar valorile lor sunt nume; de exemplu, FLT_DIG tel.: 0040-264-530918 6 , iar DB L_D IG = 15 ) cu cele prezentate deja cu diferena c| sunt diferite. FLT _D IG = definite pentru valorile reprezentate n virgul| flotant| cu dubl| precizie (corespunz |toare e-mail: antaltiberiu@pcnet.ro tipului do ub le ): DB L_D IG , D B L _ E PS IL O N , D BL _ M ANT _D IG , D B L _ M A X , D B L_ M A X _E X P , DB L_M IN , D B L_ M IN _ EX P .

14.4 <limits.h> Conf. dr. ing. ANTAL Tiberiu Alexandru

CH AR Tenhic| din rul de bii dintr-un tip char; Universitatea _B IT - num|Cluj-Napoca Facultatea Construcii valoarea maxim| pentru o variabil| de tipul char; CHAR_MAX - de Maini Catedra de Mecanic| i Programare | pentru o variabil| de tipul char; CH AR _M IN - valoarea minim Curs de limbaj C INT_MAX - valoarea maxim| pentru o variabil| de tipul int; INT _M IN - valoarea minim| pentru o variabil| de Copyright 2001. Toate drepturile sunt rezervate autorului.tipul int; LONG_MAX - valoarea maxim| pentru o variabil| de tipul long; Multiplicarea_M IN - valoarea minim| pentru o variabil| de tipul long; acestui document n scop comercial este interzis|. LO NG SCHAR_MAX valoarea maxim| pentru o variabil de tipul signed char ; Sudenii participani la-orice form| de nv||mnt superior|bugetar pot multiplica acest SC pentru uzul valoarea document HA R_ M IN -personal. minim| pentru o variabil| de tipul signed char ; SHRT_MAX - valoarea maxim| pentru o variabil| de tipul short ; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare SH RT _M IN - valoarea minim| pentru o variabil| de tipul short ; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest UCHAR_MAX valoarea maxim| pentru o variabil| de tipul unsigned char ; scop m| putei contact|- la: UC HA R_ M IN - valoarea minim| pentru o variabil| de tipul unsigned char ; ANTAL Tiberiu Alexandru UINT_MAX - valoarea maxim| pentru o variabil| de tipul unsigned long ; tel.: 0040-264-530918 ULONG_MAX - valoarea minim| pentru o variabil| de tipul unsigned long ; e-mail: antaltiberiu@pcnet.ro USHRT_MAX - valoarea minim| pentru o variabil| de tipul unsigne d short ;

217

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C biblioteca matematic| este definit| numai pentru tipul doub le . Toate Din motive istorice numele formate prin ad|ugarea unui f sau l numelui din <math.h> sunt rezervate pentru Copyrightspecificarea de biblioteci avnd definiautorului. tipurile float i long d ou ble . a permite 2001. Toate drepturile sunt rezervate ii i pentru

14.5 <math.h>

Multiplicarea acestui document n scop comercial este interzis|.

14.5.1 Funcii trigonometrice bugetar pot multiplica acest Sudenii participani la orice form| de nv||mnt superior

doub le sin uzul personal. document pentru (dou ble x ); - sinus doub le cos (dou ble x ); - cosinus Sudenii participani lable x ); form| de nv||mnt cu plat|la multiplii impari ai lui B /2 i doub le tan (dou orice - tangenta are singularit|i sau alte persoane doritoare potapropie de valorile + 4 i - 4 la extremit|ile domeniuluiscris al autorului. n acest multiplica documentul numai contra cost i cu acordul de definiie. Implement|rile se scop m| putei contact| la: argumentul folosind cea mai bun| reprezentare a mainii comune prefer| s| reduc| pentru B; pentru argumente foarte apropiate de singularit|i reducerea poate conduce la o valoareTiberiu Alexandrua singularit|ii; ANTAL de partea greit| tel.: 0040-264-530918 ble x ); - arcsinus, rezultatul este n domeniul [-B /2, B /2] i x 0 [-1,1]; doub le asin (dou e-mail:doub le ac os(d ou ble x ); - arccosinus, rezultatul este n domeniul [0, B ] i x 0 [-1,1]; antaltiberiu@pcnet.ro doub le ata n(d ou ble x ); - arctangent|, rezultatul este n domeniul [- B , B ] . doub le ata n2 (dou ble y, do ub le x); - funcia arctangent| ata n2 () este preluat| din limbajul FORTRAN i corespunde lui arctan(y/x). Este bine definit| i pentru cazul n care x=0 , dar nu i pentru cazul n care ambele argumente sunt nule; rezultatul este n domeniul ing. B ]; Conf. dr. [-B , ANTAL Tiberiu Alexandru doub le sin h(d ou ble x ); - sinus hiperbolic; Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini cosinus hiperbolic; doub le cos h(d ou ble x ); Catedra de Mecanic| ou Programare i ble x ); - tangent| hiperbolic|. doub le tan h(d Curs de limbaj C

14.5.2 Functii exponentiale si logaritmice Copyright 2001. Toate drepturile sunt rezervate autorului.
x Multiplicarea acestui document e la x , ecomercial este interzis|. doub le ex p(dou ble x ); - n scop ; doub le log(dou ble x ); - logaritm natural, ln(x) , x>0 ; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest doub le log10(d ou ble x ); - logaritm zecimal, log 10(x) , x>0 ; document pentru uzul personal. y doub le pow (dou ble x , dou ble y); - x la puterea y , x ; o eroare de domeniu apare dac| x = 0 i y # 0 sau la orice form| de nv||mnt cu plat| sau alte persoane doritoare Sudenii participani dac| x<0 i y nu este ntreg; doub le sqr t(dou ble numai contra cost i , , x$0 pot multiplica documentul x ); - r|d|cin| p|trat|cu acordul . scris al autorului. n acest scop m| putei contact| la:

14.5.3 Cel mai apropiat ntreg, valoare absoluta, resturi 7


ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro
doub le ceil(dou ble x ); doub le floor(dou ble x; 218

- cel mai mic num|r ntreg care nu este mai mic dect x ; x ); - cel mai mare num|r ntreg care nu este mai mare dect

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca doub le fabs(d ou ble x ); - valoarea absolut| a lui x , |x|; Facultatea Construcii de Maini doub le lde xp (dou ble x , int n Catedra de Mecanic| i Programare ); - ntoarce x*2 n; Curs de limbajfrexp (do ub le x , int* e xp ); - mparte pe x ntr-o fracie normalizat| n doub le C intervalul [1/2, 1] care este ntors i o putere a lui 2 , care este stocat| n *exp . Dac| x = 0 ambele rezultate sunt drepturile sunt rezervate autorului. Copyright 2001. Toate 0 ; doub le m odf(doub le x, dou ble *ip); - mparte un num|r x n partea ntreag| i cea Multiplicarea acestui document n scop comercial este interzis|. stocat| n *ip , iar partea fracionar|, fiecare cu acelai semn al lui x . Partea ntreag| este fracionar| este ntoars|; Sudenii participani la oricexform|ble y ); - restul mparirii bugetarypot multiplica acest doub le fm od(dou ble , dou de nv||mnt superior lui x la , mod(x,y); document pentru uzul personal.

Funciileparticipani la orice form| de nv||mnt cu si folositealte persoane doritoare Sudenii frexp (), lde xp () i m od f() sunt primitive plat| sau de celelalte funcii din bibliotec|. Folosirea lor este problematiccost i cu acordul scrislde xp () pierznd precizia | pe unele arhitecturi al autorului. n acest pot multiplica documentul numai contra i frexp () putnd fi ineficient|. scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Macrodefinitiile EDOM i ERANGE sunt constante ntregi nenule folosite pentru semnalarea erorilor de domeniu i de reprezentare. O eroare de domeniu apare atunci cnd argumentul este n afara domeniului pentru care este definit| funcia. n cazul acesta variabila errno ia valoarea EDOM . O eroare de reprezentare apare dac| rezultatul unei funcii nu se poate reprezenta folosind tipul doub le . Dac| rezultatul a dus la o dep|ire, funcia n cauz| ntoarce valoarea HUGE_VAL i errno primete valoarea ERANGE . Dac| rezultatuling. ANTAL Tiberiu mic|, funcia ntoarce valoarea 0 ; unele implement|ri pot Conf. dr. este o valoare prea Alexandru seta n acest caz errno dinERANGE . Universitatea Tenhic| la Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

14.5.4 Tratarea condiiilor de eroare

14.6 <setjmp.h>

Declaraiile din <setjmp.h> furnizeaz| o metod| de evitare a secvenei normale de apel i Copyright 2001. Toate drepturile sunt rezervate autorului. revenire dintr-o funcie, tipic pentru a permite o revenire imediat| dintr-un apel de funcii imbricate. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani p_ bu f en v); - salveaz| informaia de stare n env pentru a putea fi int setjm p(jm la orice form| de nv||mnt superior bugetar pot multiplica acest ulterior folosit| de lon personal. document pentru uzulgjm p() . Valoarea 0 este ntoars| dac| apelul a fost direct i o valoare diferit| de 0 dac| saltul s-a f|cut cu un apel ulterior al unui lon gjm p() . Sudenii participani la orice form| in t nv||mnt custareasau alte persoane doritoare void long jm p(jm p_ bu f en v, de val); - reface plat| programului salvat| prin cel mai recent apel al lui setjm p() pe baza informa cu salvate n env. Execuia n acest pot multiplica documentul numai contra cost i ieiacordul scris al autorului.se reia ca i cnd setjm p() contact| la: scop m| putei tocmai s-a executat i a ntors valoare nenul| pentru val. Funcia care conine setjm p() nu a fost terminat|. Permite implementarea unui "goto" nelocal. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 /* JM P.C */ e-mail: antaltiberiu@pcnet.ro #include<stdio.h>

1 2

3 #include<setjmp.h> 4 5 int valoare; 6 jmp _b uf sa ltaici; 219

7 8 9 10 11 12 13 14 15 16 17 18

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca void sa lt(void ); Facultatea Construcii de Maini Catedra de Mecanic| i Programare int main(void) Curs de limbaj C {

Copyright 2001. Toate drepturile sunt rezervate autorului. if (valoare != 0)


{

va loar e=se tjmp(sa ltaici);

Multiplicarea prin tf("Sa lt cu v aloa rea %d \n", va loar e); acestui document n scop comercial este interzis|.
return valoare;

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest } prin tf("Ac uzul personal. document pentru um se a pele aza fun ctia salt()\n ");
salt();

19 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare return 0; 20 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest } 21 scop m| putei contact| 22 void salt(void)

la:

23 { ANTAL Tiberiu Alexandru 24 longjm p(sa ltaici,0); 25 }

tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Rezultate:


Acum se apeleaza functia salt() Salt cu valoarea 1

Remarca Conf. dr. 7 : Aceste rutine sunt utile cnd se trateaz| erori sau excepii ap|rute n funcii ing. ANTAL Tiberiu Alexandru de nivel foarte jos ale unuiCluj-Napoca Universitatea Tenhic| din program. Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

14.7 <signal.h>

Antetul <signal.h> asigur| facilitai pentru tratarea condi Copyright 2001. Toate drepturile sunt rezervate autorului.iilor excepionale care apar n cursul execuiei programului. De exemplu, apariia unui semnal de ntrerupere de la o surs| extern| acestui documenterori n cursul execuiei programului. Multiplicarea sau apariia unei n scop comercial este interzis|. Sudenii participani la oricevoid (*hand ler)(int)))(int); - instaleaz| o rutin| de tratare a void (*signal(int sig, form| de nv||mnt superior bugetar pot multiplica acest document pentru pentru semnalul sig , aceasta determinnd modul n care vor fi tratate erorilor software uzul personal. semnalele ulterioare. Dac| handler ia valoarea SIG_DFL se folosete rutina de tratare definit| participani la orice form| handler ia valoarea SIG_IGN semnalul este ignorat; Sudeniiprin implementare, iar dac|de nv||mnt cu plat| sau alte persoane doritoare altfel, funcia poantat| de numai contra cost i cu cu argumentul autorului. l() ntoarce pot multiplica documentul handler este apelat| acordul scris al sig . sig na n acest valoareaputei contact| la: scop m| anterioar| a lui handler pentru semnalul specific sau SIG_ERR n caz de eroare. Cnd apare un semnal sig ulterior, semnalul este ref|cut la starea implicit|. Dac| se revine din rutina de tratare a erorii execuia se reia din locul n care a ap|rut semnalul. ANTAL Tiberiu Alexandru Starea iniial| a semnalelor este definit| prin implementare. Valori permise pentru tel.: 0040-264-530918 semnale sunt: e-mail: antaltiberiu@pcnet.ro SIGABRT - terminare anormal|, de exemplu cu ab ort() ; SIGFPE - eroare aritmetic|, de exemplu mparire cu zero sau dep|ire; SIGILL - imagine ilegal| de funcie, de exemplu o instruciune ilegal|; S IG IN T - atenionare interactiv|, de exemplu o ntrerupere;
220

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca SIGSEGV acces ilegal la o zon| de RAM, de exemplu accesul este n afara Facultatea Construcii de-Maini limitelorde Mecanic| i Programare memoriei; Catedra SIGTERM - cerere de terminare transmis| programului. Curs de limbaj C int rais e(int sig); - transmite semnalul sig programului, ntoarce o valoare nenul| n caz de insucces. Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

14.8 <stdarg.h> Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest
document pentru uzul personal. |i pentru parcurgerea listei argumentelor unei funcii, Antetul <stdarg.h> asigur| facilit n cazul n care nu se cunoate num|rul i tipul acestora. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest void va _start(v a_ list ap , lasta rg); - macro pentru iniializare care trebuie apelat scop m| putei contact| la: nainte de accesarea oric|rui argument necunoscut. ap trebuie declarat| ca i o variabil| local| de tipul va_list , lastarg este numele ultimului parametru cunoscut al funciei; ANTAL Tiberiu Alexandru type va _a rg(v tel.: 0040-264-530918 a_ list ap , type ); - ntoarce o valoare de tipul type i de valoarea urm|torului argument f|r| nume. Modific| ap aa nct urm|toarea folosire a lui va _a rg() e-mail: antaltiberiu@pcnet.ro va ntoarce urm|torul argument; void va _e nd (va_list ap); - trebuie apelat| o dat| dup| prelucrarea tuturor argumentelor, si apoi nc| o dat| naintea termin|rii funciei. -

14.9 <stdio.h>

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Un flux (stream ) este ode Maini o destinaie de date care poate fi asociat| unui periferic Facultatea Construcii surs| sau (disc, tastatur|, monitorProgramare dintre implement|rile bibliotecilor C (mai ales sub Catedra de Mecanic| i etc.). Multe sistemul de operare UNIX) asigur|, pe lng| funciile standard de I/E (fop en (), fclo se() , Curs de limbaj C fread () , fw rite () , fse ek () ), o mulime de servicii de I/E nebuffer-ate (open () , clos e() , rea d() , w rite () , lseek () ). Comitetul de standardizare a decis s| nu standardizeze acest grup de Copyright 2001. Toate drepturile cu fluxuri de text i binare , dei sub unele sisteme de funcii. Biblioteca asigur| lucrul sunt rezervate autorului. operare, ntre acestea nu sunt diferene. Un flux de text este o secven| de linii, o linie Multiplicarea din zero, unul saun scop comercial este interzis|. este format| acestui document mai multe caractere i se termin| prin '\n'. n unele contexte este necesar| conversia unui flux de caractere de la o reprezentare la alta, de exemplu caracterul '\n' orice form| de nv||mnt superior bugetar i line feed . Un flux Sudenii participani la se convertete n caracterele carriage returnpot multiplica acest binar estepentru uzul neprelucrat| de octei care se stocheaz| ntr-un format intern cu document o secven| personal. proprietatea c| dac| acestea sunt scrise i apoi citite pe acelai sistem, compararea celor dou| secvene de date va conduce la egalitate. Un flux este conectat la un dispozitiv n Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare urma operaiei numite deschiderea fluxului, iar conexiunea este ntrerupt| prin operaia pot multiplica documentul numai contra cost i fiier ntoarce un poantor la un obiect de numit| nchiderea fluxului . Deschiderea unui cu acordul scris al autorului. n acest scop FILE care contact| | toate informaiile necesare pentru controlarea fluxului. Noiunile tipul m| putei stocheaz la: de poantor la fiier i flux sunt echivalente. La nceperea execuiei unui program fluxurile ANTAL Tiberiu Alexandru stdin , stdout i stderr sunt deschise automat. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Concepte privitoarea la fluxuri care pun probleme:

Definitia liniei: n UNIX, gruparea unui fi ier n linii se face sub efectul caracterului newline ('\n'). Tehnicile folosite n acest scop sunt dependente de sistemul de operare, de exemplu liniile pot fi separate prin caracterele carriage return i line feed , prin poriuni nenregistrate ale mediului de stocare sau prin prefixarea liniei prin lungimea acesteia.
221

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca n standard aceast| diversitate de tehnici este referit| specificnd c| newline este folosit Facultatea Construcii de Maini ca separator de linie lai Programare Catedra de Mecanic| nivelul programului, ns| n funcie de conveniile mediului pe care se face rularea, o implementare particular| poate transforma acest caracter, la citire sau Curs de limbaj C unor convenii particulare de mediu. la scriere, conform

Transparenta: Unele programe necesit| accesul autorului. date externe care nu suport| Copyright 2001. Toate drepturile sunt rezervate la surse de modific|ri. De exemplu, transformarea caracterelor carriage return i line feed n caracterul newline este interzis| n cazul prelucr|rii unui cod obiect. Standardul definete Multiplicarea acestuidou| tipuri n scop comercial este cel binar, pentru a permite ca un din acest motiv cele document de fluxuri, cel text i interzis|. program s| specifice dac| la deschiderea unui fiier coninutul acestuia va fi p|strat exact Sudenii participani la orice form| de nv||mnt superior bugetar | ntruct mediul nu sau dac| organizarea datelor sub forma liniilor este mai important pot multiplica acest document pentru acuratee simultan ambele tr|s|turi. poate reflecta cu uzul personal. Accesul aleator: Modelul de I/E UNIX asigur| accesul aleator la datele unui fiier, Sudeniiprin num|rulla orice form| de nv||mnt cu plat| unde caracterul newline este indexat participani de ordine al caracterului. Pe sisteme sau alte persoane doritoare pot multiplica documentul numai contra r necunoscut de caractere autorului. n acest prelucrat de program, devenind un num| cost i cu acordul scris al fizice acest mecanism scop m| nu i contact| la: consistena dac| fluxul este de tipul text. Standardul simplu putei p|streaz| abstractizeaz| propriet|ile semnificative ale accesului aleator la fluxurile de text de exemplu Tiberiu Alexandru |rii poziiei curente ntr-un fiier unde, prin repoziionare, ANTAL posibilitatea determin se va0040-264-530918 trziu. n acest scop ftell() ntoarce indicatorul de pozitie n fisier, tel.: putea reveni mai care are o semnificatie corecta numai daca este interpretat de fse ek (). Avnd ca valoare 7 e-mail: antaltiberiu@pcnet.ro 7 acest indicator, fse ek () va realiza repoziionarea n fiier n acelai loc. Astfel, o implementare poate sa codifice informaia de poziionare corespunz|toare unui fiier text 7 ct mai bine, singura constrngere fiind aceea c| ea trebuie s| poat| fi reprezentata ca o 7 valoare long . Folosirea funciilor fge tpos() i fse tpo s() elimin| chiar i aceast| constrngere. Buffer-are: UNIX permite controlul extinderii i al tipului de buffere din mai multe Conf. dr. ing. ANTAL Tiberiu Alexandru motive. De exemplu, un program poate avea propriul lui buffer de I/E pentru a crete Universitatea Tenhic| din Cluj-Napoca performanele sau poate realiza prelucrarea nebufferat| a caracterelor unui terminal de Facultatea Construcii de Maini cum este introdus. Unele sisteme asigur| accesul I/E care citete caraterul imediat Catedra la datele terminalului de intrare la nivel de linie, altele permit lucrul cu buffer-e exclusiv de Mecanic| i Programare alocate limbaj C Curs den program numai prin copierea datelor din sau n buffer-ele alocate de sistemul de operare. n standard buffer-ele sunt manipulate prin funciile setbu f() i setvb uf() care asigur| o gam| mare de facilit|i. sunt rezervate autorului. Copyright 2001. Toate drepturile Multiplicarea acestui document n scop comercial este interzis|.

14.9.1 Constante

Sudenii participani la orice form| de nv||mnt superior bugetar pot unui flux; acest multiplica FILE - tip care stocheaz| informaiile necesare pentru controlul document pentru uzul personal. stdin - fluxul standard de intrare; deschis automat la nceputul execuiei unui program; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare stdout documentul numai contra cost i cu automat la al autorului. n acest pot multiplica - fluxul standard de ieire; deschisacordul scrisnceputul execuiei unui program; scop m| putei contact| la: stderr - fluxul standard de eroare; deschis automat la nceputul execuiei unui program; ANTAL Tiberiu Alexandru tel.: 0040-264-530918 FILENAME_MAX - lungimea maxim| permis| pentru un nume de fiier; e-mail:FOPEN_MAX - num|rul maxim de fi iere care pot fi deschise simultan; antaltiberiu@pcnet.ro TMP_MAX - num|rul maxim de fiiere temporare care pot fi deschise n timpul execuiei unui program.

222

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Tipul de limbaj C unul ntreg, f|r| semn ntors de operatorul sizeof. Curs size_t este

14.9.2 Functii pentru operatii cu fisiere Copyright 2001. Toate nst cha r* filen am e, con st ch ar* m ode); - deschide un fiier i drepturile sunt rezervate autorului. FILE* fope n(co ntoarce un flux sau NULL dac| operaia nu reuete. Modurile (sau combinaiile) corecte Multiplicareasunt: document n scop comercial este interzis|. pentru mode acestui
"r" - deschide un fiier text pentru citire; Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest "w " - creeaz| un document pentru uzul personal. fiier text pentru scriere; dac| acesta exist| deja, coninutul lui este ters; "a" - mod de ad|ugare; nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la orice form| de scrierea se face ncepnd cu sfritul fiierului; pot multiplica"r+" - deschide un ficontra cost i cu acordul scris al autorului. n acest documentul numai ier text n modul de actualizare (citire sau scriere); scop m| putei"w+" - creeaz| un fiier text pentru actualizare; dac| acesta exista deja, contact| la: 7 coninutul lui se terge; ANTAL Tiberiu Alexandru "a+" - mod de ad|ugare; fiierul este deschis sau creat pentru actualizare, tel.: 0040-264-530918 iar scrierea se face la sfritul lui. e-mail: antaltiberiu@pcnet.ro

Modul de actualizare permite citirea i scrierea aceluiai fiier. fflus h() sau o funcie pentru poziionare (fsetpos() , fse ek (), rew ind() ) trebuie apelat| ntre o citire i o scriere sau invers. Dac| modul include b dup| litera iniial|, de exemplu "rb" sau "w+b", fiierul este prelucrat n modul binar. Conf. dr. ing. ANTAL Tiberiu Alexandru Universitateafreopen(const char* filenam e, const char* mode, FIL E* s trea m ); - deschide FILE* Tenhic| din Cluj-Napoca fiierul cu Construcii de e n modul mode i i asociaz| un flux. ntoarce fluxul sau NULL Facultateanumele file na mMaini n cazul unei erori. freopen () se foloseste de obicei pentru a schimba fiierele asociate lui Catedra de Mecanic| i Programare stdin ,de limbaj C stderr . Curs stdout sau int fflu sh(F ILE * stream ); - pentru un flux de ieire, face ca toate buffer-ele care conin nc| date Toate drepturile sunt rezervate autorului. Copyright 2001. nescrise s| fie scrise pe flux; efectul este nedefinit n cazul unui flux de intrare. n caz de eroare ntoarce EOF , altfel 0 . flush(NULL) golete toate fluxurile de ieire. Multiplicarea acestui document n scop comercial este interzis|. int fclose(FIL E* s trea m ); - nchide un flux dup| ce n prealabil l-a golit de toate datele care nc| nu au fost scrise i de nv||mnt iul folosit pentru buffer-ele acestuia. Sudenii participani la orice form| a dezalocat spasuperior bugetar pot multiplica acest ntoarce EOF n caz depersonal. altfel 0 . document pentru uzul eroare sau int remove(const char* filen am e); - terge fiierul cu numele file na m e. ntoarce o valoare nenul| n caz orice form| Sudenii participani la de eroare; de nv||mnt cu plat| sau alte persoane doritoare pot multiplica am e(con st ch ar* oldn am e, con st ch ar* new na m e); - schimb| acest int ren documentul numai contra cost i cu acordul scris al autorului. n numele scop m| putei o ld na m e la: n ew n am e . ntoarce o valoare nenul| n caz de eroare; fiierului de la contact| la FILE* tm pfile (); - creeaz| un fiier temporar (mode este "wb +" ) care va fi automat ANTAL Tiberiu Alexandru| programul se termin| normal. tm pfile() ntoarce fluxul, ters la nchidere sau dac tel.: 0040-264-530918 de eroare; respectiv NULL n caz e-mail: antaltiberiu@pcnet.ro char* tm pn am e(ch ar s [L_tm pn am ]); - creeaz| un ir s care conine un nume de fiier unic (numele respectiv nu mai exist|) i ntoarce un poantor la irul cu legare intern| si persistenta static . irul este stocat n s i trebuie s| aib| spaiu pentru stocarea a cel -7 puin L_tmpnam caractere. tm pn am e() genereaz| cte un nume diferit pentru fiecare apel, cel mult TMP_MAX nume diferite fiind garantate n timpul execuie programului.
223

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int Facultatea setvbuf(FIL E* s trea m , cha r* bu f, int m ode, size _t size); - asigur| controlul Construcii de Maini buffer-elor pentru flux. Programare | nainte de orice operaie (citire, scriere etc.) cu Catedra de Mecanic| i Trebuie apelat fluxul. Dac| mode ia valoarea _IOB UF buffering-ul este complet, pentru _IOLBF Curs de limbaj C | numai pentru fiierele text, iar pentru _IONBF nu se face buffering. buffering-ul exist

Dac| buf nu este NULL va fi folosit ca i buffer. size determin| m|rimea buffer-ului. Copyright 2001. Toate drepturile sunt rezervate autorului. setbu f() ntoarce valoare nenul| n caz de eroare; void setbuf(F ILE * stream , cha r* bu f); - dac| buf este NULL buffering-ul este Multiplicarea acestui document n scop comercial este interzis|. dezactivat pentru flux. Altfel, setbuf() este echivalent cu void setbuf(stream, buf, _IOFBF,
BU FS IZ);

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

14.9.3 Functorice form| de nv||mnt cu plat| sau alte persoane doritoare -ii pentru iesire cu format Sudenii participani la

int fprin tf(FIL E* s trea m , contra ar* i cu acordul scris al autorului. ie acest pot multiplica documentul numaicon st chcost fo rm at, ...); - convertete i scrien irea pe fluxul stream sub controlul lui format . Valoarea ntoars| este num|rul caracterelor scrise scop m| putei contact| la: sau o valoare negativ| n caz de eroare. irul format conine dou| tipuri de obiecte: caractere nor m ale , care sunt copiate pe fluxul de ieire i specificatori de conversie , ANTAL Tiberiu Alexandru fiecare dintre acetia cauznd conversia i scrierea argumentului corespunz|tor din tel.: 0040-264-530918 de conversie ncep cu % i se termin| ntr-un caracter de conversie. fpr intf() . Specificatorii e-mail: antaltiberiu@pcnet.ro ntre % i caracterul de conversie pot s| apar| urm|toarele caractere n orice ordine: Ind icatori (F lags):

aliniere la stnga; + , afiare a semnului ntotdeauna; spa iu , spaiu dac| primul caracter al num|rului nu este un semn; Conf. dr. ing. ANTAL Tiberiu Alexandru 0 , zerouri de aliniere a num Universitatea Tenhic| din Cluj-Napoca |rului, pentru uurarea prelucr|rilor numerice; # , modificatori de Facultatea Construcii de Mainiform|: pentru caracterul de conversie 0 , prima cifr| va fi zero, i Programare Catedra de Mecanic| pentru [x X ] prefixul va fi 0x sau 0X , pentru [eEfgG] se va folosi n rezultat ntotdeauna punctul zecimal, pentru [gG] zerourile nesemnificative Curs de limbaj C nu sunt afiate. La t 2001. Toate drepturile sunt rezervate autorului. 7Copyright im e : un num|r care specific| num|rul minim de caractere ale unui cmp. Argumentul care este convertit va fi afiat ntr-un cmp cu l|imea (num|rul de caractere) cel puin egal n scop comercial este valoarea Multiplicarea acestui document | sau mai mare dect interzis|. acestui num|r. Dac| n urma conversiei argumentul are mai puine caractere dect lungimea cmpului valoarea va fi aliniat| la stnga (sau la dreapta dac| se folosete indicatorul - ) Sudenii participani la ntreg spaiul de caracteresuperior bugetar pottmultiplica acest pentru a ocupa orice form| de nv||mnt specificate prin La -im e . Caracterul 7 document pentru uzul personal. spat iu , dar poate fi i caracterul 0 dac| indicatorul 0 folosit pentru umplere este este prezent; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Pun ct : separ| l|imea de lungimea unui cmp; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest Pre cizie : un num|r scop m| putei contact| la: care specific| num|rul maxim de caractere care sunt afiate dintr-un ir sau num|rul de zecimale care sunt afiate dup| punctul zecimal pentru [eEf] sau num|rul de cifre semnificative pentru [gG], sau pentru un ntreg num|rul ANTAL Tiberiu Alexandruvor fi afiate (zerouri pot fi afiate n faa ntregului dac| se minim de cifre care tel.: 0040-264-530918 folosete indicatorul corespunz|tor). e-mail: antaltiberiu@pcnet.ro
M odificatori de lungime: h,

-,

argumentul va fi afiat ca short sau ca unsigne d short ; l sau L , argumentul va fi afiat ca long sau ca unsigned long ;
224

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca La t im e sau prec izie pot fi specificate prin * , caz n care valorile se calculeaz| prin 7Facultatea Construcii de Maini conversia argumentului corespunz|tor caracterului * a c|rui valoare trebuie s| fie Catedra de Mecanic| i Programare obligatoriu de tipul int. Curs de limbaj C

Caractere de conversie fpr intf() Copyright 2001. Toate drepturile sunt rezervate autorului. : Caracter Tip argument se interzis|.Multiplicarea acestui document n scop comercial esteconverteste la d, i int notaie zecimal| cu semn. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest o int document pentru uzul personal. notaie octal| f|r| semn. x, X int notaie hexazecimal| f|r| semn. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare u int notaie cost i | f acordul scris al autorului. n acest pot multiplica documentul numai contrazecimalcu |r| semn. scop m| putei contact| la: c int un singur caracter, dup| conversie la usigned char .
s char * ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro f doub le

caracterele irului, afiarea continu| pn| la atingerea lui '\0' sau pn| cnd num|rul maxim de caractere de afiat a fost atins. notaia de forma [-]mmm.ddd unde d-urile sunt specificate prin prec izie . Precizia implicit| este 6 , precizia 0 suprim| punctul zecimal.

notaia de forma [-]m.dddddde(+|-)xx unde num|rul d-urilor este specificat prin prec izie . Conf. dr. ing. ANTAL Tiberiu Alexandru g, G doub le %e sau Universitatea Tenhic| din Cluj-Napoca %E sunt folosii dac| exponentul este mai mic Facultatea Construcii de Mainidect -4 sau mai mare sau egal cu precizia, altfel se foloseste %f . Zerourile nesemnificative i punctul Catedra de Mecanic| i Programare zecimal nu se afieaz|. Curs de limbaj C p void * afiarea de poantor. Copyright 2001. Toate drepturile sunt rezervate autorului. n int * num|rul de caractere scrise pn| n acel moment de printf() este scris n argument. Multiplicarea acestui document n scop comercial este interzis|. Nu se realizeaz| conversia argumentului.
e, E doub le

Sudenii participani la orice form| area caracterului % . bugetar pot multiplica acest % afi de nv||mnt superior document pentru uzul personal.
int prin tf(con la orice form at, ...); - printf(f, ... plat| sau alte persoane doritoare Sudenii participani st ch ar* form| de nv||mnt cu) este echivalent| cu fprintf(std ou t, f, ...); pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int sprintf(char* s, scop m| putei contact| la: const cha r* for m at, ...); - lucreaz| ca fpr intf() , cu excepia c| ieirea este scris| n irul s terminat n '\0'. s trebuie s| fie suficient de lung pentru a putea stoca rezultatul. Valoarea ntoars| este num|rul de caractere f|r| '\0'. ANTAL Tiberiu Alexandru int v fprintf(F tel.: 0040-264-530918ILE * stream , con st ch ar* fo rm at, va _list arg ); e-mail:int vp rin tf(co ns t char* for m at, v a_ list a rg); antaltiberiu@pcnet.ro int vsprintf(ch ar* s, co ns t char* for m at, v a_ list a rg);

Funciile

vp rin tf() , vfp rin f()

vsprintf()

sunt echivalente cu funciile corespunz|toare


225

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca printf() , cu excepia c| lista variabil| de argumente este nlocuit| prin arg , care a fost Facultatea Construcii de Maini iniializat| folosind macrodefinitia va_start , eventual prin apeluri ale lui va_a rg . Catedra de Mecanic| i Programare Curs de limbaj C

14.9.4 Functdrepturile sunt rezervate autorului. format Copyright 2001. Toate- ii pentru intrare cu
int fsca nf(F ILE * stream , con st ch ar* fo rm at, ...); - citete de pe fluxul stream sub Multiplicarea acestuidocument valorile comercial este interzis|. care urmeaz|, fiecare controlul lui format i atribuie n scop convertite argumentelor dintre acestea trebuind s| fie un poantor. Revenirea se face cnd s-a epuizat format . fscan f() ntoarce valoarea E O F dac| s-a ntlnit sfritul fibugetar pot multiplica|rut o Sudenii participani la orice form| de nv||mnt superior ierului sau dac| a ap acest eroare. Altfel ntoarcepersonal. de articole convertite i atribuite. irul format poate document pentru uzul num|rul conine: ! spat ii , tab-uri: se ignor , acestea fac parte dintre caracterele doritoare Sudenii participani la orice form| de|nv||mnt cu plat| sau alte persoane albe (w hite pot multiplicaspace = spa numai contra cost i cu acordul scrisvertical tab , formfeed ); documentul iu , tab, new-line, carriage return , al autorului. n acest scop m| puteicaracterela: m ale : care trebuie s| fie identice cu urm|torul caracter necontact| nor ! alb; ANTAL Tiberiu:Alexandru ! % spec ificatori d e con vers ie formai din % , un caracter opional pentru tel.: 0040-264-530918 suprimarea atribuirii, un num|r opional specificnd l|imea maxim| a e-mail: antaltiberiu@pcnet.ro dintre caracterele opionale [hlL] indicnd m|rimea cmpului, unul destinaiei, i un caracter de conversie. Un cmp de intrare se definete ca un ir de caractere ne-albe i ine pn| la urm|torul caracter alb sau, n cazul n care este specificat, este determinat de l|imea cmpului. Un caracter de conversie determin| conversia urm|torului cmp de intrare. n condiii normale, rezultatul este plasat n variabila poantat| de argumentul corespunz|tor. Dac| argumentul specific| suprimarea atribuirii prin * , de Conf. dr. ing. ANTAL Tiberiu Alexandru exemplu %*s cmpul de intrare este s|rit f|r| a se face atribuirea. Universitatea Tenhic| din de conversie specific| modul de interpretare a cmpului de Caracterul Cluj-Napoca Facultatea Construcii Caracterele de conversie [dinoux] pot fi precedate de h dac| intrare. de Maini Catedra de Mecanic| i Programare argumentul este un poantor short , i nu unul int, sau de l dac| argumentul Curs de limbaj C un poantor long . Caracterele de conversie [efg] pot fi precedate de l este dac| argumentul este un poantor la doub le , n locul unuia float, sau de L dac| poantorul este la long d ouble . Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial estefscan f() : Caractere de conversie interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Caracter Tip argument Data de intrare document pentru uzul personal. d int * ntreg zecimal. Sudenii participani la orice form| de nv||mnt octal (ncepealte 0 ) sau n doritoare i int * ntregul poate fi n cu plat| sau cu persoane hexazecimal i cu acordul scris al autorului. n acest pot multiplica documentul numai contra cost(ncepe cu 0x sau 0X ). scop m| putei contact| la: o int * ntreg octal, cu sau f|r| 0 la nceput. ANTAL Tiberiu Alexandru ntreg hexazecimal cu sau f|r| 0x la nceput. x int * tel.: 0040-264-530918 u un sign ed int* e-mail: antaltiberiu@pcnet.ro ntreg zecimal f|r| semn.

226

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini |toarele caractere de intrare sunt plasate n c char * urm Catedra de Mecanic| i Programare indicat pn| se atinge l|imea de caractere tabloul specificata (implicit aceasta este 1 ). Nu se adaug| '\0'. 7 Curs de limbaj C Saltul normal peste caracterele albe este inhibat, pentru rezervate autorului. Copyright 2001. Toate drepturile sunt citirea urm|torului caracater ne-alb se folosete %1s .

Multiplicareachar * document ir de caractere ne-albe (f|r| ghilimele). Argumentul acestui s n scop comercial este interzis|. va poanta la un tablou de caractere suficient de mare pentru nv||mnt superior bugetar pot multiplica va Sudenii participani la orice form| de stocarea irului i a terminatorului '\0' care acest fi document pentru uzul personal. ad|ugat automat.
e, f, g float * num|r n virgul| flotant|. Opional, acesta poate Sudenii participani la orice form| ine nv||mntir de numere alte persoanenu sa con de semn, un cu plat| sau care pot sau doritoare 7 pot multiplica documentul numai contra cost izecimal sau scris al autorului. n acest conina punctul cu acordul un exponent opional 7 scop m| putei contact| la: coninnd e sau E , urmat de un num|r ntreg cu semn. p void * ANTAL Tiberiu Alexandru valoare de poantor, aa cum este afiat| de printf("%p") . tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro scrie n argument num|rul de caractere citite pn| n n int * acel moment de apelul funciei. Nu se citete nimic de pe intrare. Num|rul articolelor convertite nu este incrementat.

caracterele din interiorul parantezelor dreptunghiulare definesc o mulime de c|utare pentru Conf. dr. ing. ANTAL Tiberiu Alexandru posibile n cmpul de intrare i diferite de caracterele Universitatea Tenhic| din Cluj-Napoca '\0' este ad|ugat automat la mulime. irul vid. Facultatea Construcii de Maini [^...] char * caracterele din interiorul parantezelor Catedra de Mecanic| i Programare dreptunghiulare definesc o mulime de c|utare pentru Curs de limbaj C caractere care nu pot face parte din cmpul de intrare i sunt diferite de irul vid. '\0' este ad|ugat automat la Copyright 2001. Toate drepturile sunt rezervate autorului. mulime.
[...] char * % afi scop comercial este interzis|. Multiplicarea% acestui document n area caracterului % .

Sudenii participanist ch ar* form| de...); - scanf(f, superior bugetar pot multiplica acest la orice form at, nv||mnt ...) este echivalent| cu fscanf(stdin, f, int scan f(con document pentru uzul personal. ...)
int ssca nf(ch ar* s, con st ch ar* form at, ...); echivalent| cu fscan f() , numai c| Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare intrarea este stocat| n irul s . pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

14.9.5 Functii de intrare/iesire la nivel de ANTAL Tiberiu Alexandru tel.: 0040-264-530918 caracter e-mail: antaltiberiu@pcnet.ro
terminarea fiierului.
char* fgets(char* s, int n , FILE* s trea m ); 227

int fgetc (FIL E* s trea m ); - ntoarce urm|torul caracter de pe fluxul stream , convertit la un ntreg de tipul unsigned char sau EOF n caz de eroare, respectiv la

- citete cel mult n-1 caractere de pe

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca stream n irul s , oprindu-se la ntlnirea caracterului newline . Caracterul newline este Facultatea Construcii de Maini inclus n de care se termina n '\0'; ntoarce s sau NULL n caz de eroare, respectiv la 7 Catedra s Mecanic| i Programare terminarea fiierului. Curs de limbaj C int fpu tc(int c , FILE* s trea m ); - scrie pe c , convertit la unsigned char pe stream . ntoarce caracterul scris sau EOFsunt rezervate autorului. Copyright 2001. Toate drepturile n caz de eroare. char* fpu ts(con st ch ar* s, FIL E* s trea m ); - scrie irul s care nu trebuie s| conin| caracterul '\n' acestui document n caz de succes ntoarce o valoare nenul|, respectiv EOF Multiplicarea pe fluxul stream . n scop comercial este interzis|. n caz contrar. int getc (FIL E* s orice form| de nv||mnt superior bugetar pot multiplica acest Sudenii participani latrea m ); - echivalent| cu fgetc(), cu excepia faptului c| poate fi un macro; poate evalua stream de mai multe ori. document pentru uzul personal. int g etch ar(); - echivalent| cu getc(stdin). Sudenii participani la orice form| te nv||mnt cu plat| sau alte persoane doritoarete de urm|toarea linie de pe stdin n s . nlocuie char* gets (cha r* s); - cite pot multiplica documentul numai contra ntoarce sacordul scris la autorului. n ierului caracterul terminator newline cu '\0'; cost i cu sau NULL al terminarea fiacest scop m| putei contact| la: respectiv n caz de eroare. int putc(int c, FIL E* s trea m ); - echivalent| cu fpu tc() cu excepia faptului c| poate ANTAL Tiberiu Alexandru stream de mai multe ori. fi un macro, poate evalua pe tel.: 0040-264-530918 e-mail:int p utcha r(int c); - este echivalent| cu pu tc(c, std ou t). antaltiberiu@pcnet.ro int pu ts(con st ch ar* s); - scrie pe s i un caracter newline pe stdo u t; ntoarce o valoare nenegativ| n caz de succes, respectiv EOF n caz contrar. int unget(int c, FILE* strea m ); - l mpinge pe c , care trebuie s| fie diferit de EOF , convertit la unsignd char pe stream , aa nct acesta va fi ntors la urm|toarea citire. Este garantat| mpingerea pe stream numai a unui singur caracter; ntoarce c sau EOF n caz dr. eroare. Conf. de ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs defrea d(void * ptr, size_ t size, size_ t nob j, FILE * stream ); - citete cel mult nobj limbaj C size_ t obiecte cu dimensiunea size de pe fluxul stream n ptr. ntoarce num|rul de obiecte citite. Copyright 2001. iToate drepturile folosite pentru autorului. Funciile feo f() ferror () trebuie sunt rezervate determinarea st|rii. size_t fwrite(const void* ptr, size_t size, size_ t nob j, FILE * stream ); - scrie pe fluxul Multiplicareaobiecte cu dimensiunea size dintr-un tablou ptr. ntoarce num|rul de obiecte stream nobj acestui document n scop comercial este interzis|. scrise care nu va fi mai mic ca nobj dect n caz de eroare. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.

14.9.6 Functii de intrare/iesire directe -

14.9.7 Functorice form| de nv||mnt cu plat| sau alte persoane doritoare -ii de pozitionare Sudenii participani la

int fsee k(F ILE * stream , long offse t, int cu acordul scris al autorului. ier pentru pot multiplica documentul numai contra cost i origin ); - seteaz| poziia n fin acest fluxul stream . contact| la: fiier binar poziia este setat| printr-un deplasament de scop m| putei Pentru un caractere fa| de origine, care poate fi SEEK_SET (nceput), SEEK_CUR (poziia curent|) sau SEEK_EN D (sfritul fiierului); pentru un flux text offset trebuie s| fie 0 ANTAL Tiberiu Alexandru sau o valoare ntoars| de ftell(), caz n care originea trebuie s| fie SEEK_SET. ntoarce tel.: 0040-264-530918 de eroare. o valoare nenul| n caz e-mail: antaltiberiu@pcnet.ro long ftell(FILE* strea m ); - ntoarce poziia curent| n fiier pentru fluxul stream sau -1L n caz de eroare. void rew ind (FIL E* s trea m ); - este echivalent| cu fseek(stream, 0L, SE EK _S ET ); cle are rr(s tre am ). 228

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int Facultateafgetpos(FILE* strea m , fpos _t* p tr); - i atribuie lui *ptr poziia curent| n fluxul Construcii de Maini stream . Tipul fpos_t se folosete pentru stocarea acestor valori; ntoarce o valoare nenul| Catedra de Mecanic| i Programare n caz de eroare. Curs de limbaj C int fsetpo s(F ILE * strea m , const fpos_ t* ptr); - seteaz| poziia curent| n fluxul stream la *ptr; ntoarce o valoare nenul| n caz de eroare. Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

14.9.8 Functii pentru tratarea erorilor Sudenii participani(FIL E* s trea m ); denv||mnt superior bugetar potfiier i de eroare void clea rerr la orice form| - terge indicatorii de terminare de multiplica acest document pentru uzul personal. pentru fluxul stream .
int feof(F ILE * stream ); - ntoarce o valoare nenul| dac| indicatorul de terminare Sudenii este setat pentru fluxul stream . de fiier participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest int ferro r(FIL E* scop m| putei contact| s trea m ); - ntoarce o valoare nenul| dac| indicatorul de eroare a la: fluxului stream este setat. void perror(const cha ANTAL Tiberiu Alexandru r* s); - afieaz| pe s i un mesaj de eroare dependent de implementare corespunz|tor lui errno , este echivalent| cu fpr intf(std err , "%s : %s\n ", s, tel.: 0040-264-530918 "me saj de eroa re") . e-mail: antaltiberiu@pcnet.ro

14.10 <stdlib.h>
Antetul <stdlib.h> conine un set de funcii pentru diferite conversii numerice, alocare de memorie i alte aciuniTiberiuun caracter similar. Conf. dr. ing. ANTAL avnd Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini s); - convertete pe s la doub le , este echivalent| cu doub le atof(con st ch ar* Catedra (char**)NULL) strtod(s, de Mecanic| i .Programare Curs de limbaj C int atoi(c onst ch ar* s); - convertete pe s la int, este echivalent| cu (int)strtol(s, (char**)NULL, 10). Copyright 2001. Toate drepturile sunt rezervate autorului. long atol(co nst cha r* s); - convertete pe s la long , este echivalent| cu strtol(s, (char**)NULL, 10). Multiplicarea acestui document n scop comercial este interzis|. doub le strto d(co nst cha r* s, ch ar** endp ); - convertete prefixul lui s la doub le , ignornd orice spaiu alb aflat n fa|. Stocheaz| un poantor la orice sufix neconvertit n Sudenii participani lacazul n care de nv||mnt.superior bugetarconduce la dep|ire, orice form| endp e NULL Dac| rezultatul pot multiplica acest *endp excepie f|cnd document pentru ntors cu semnul corespunz|tor, dac| rezultatul este o valoare prea mic|, HUGE_VAL este uzul personal. ntoarce valoarea 0 . n ambele cazuri errno primeste valoarea ERANGE . Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare long strtol(co nst cha r* s, ch ar** en dp , int base ); - convertete prefixul lui s la long pot multiplica iile albe de la nceput. Stocheaz| cu acordul scris al autorului. n acest n ignornd spa documentul numai contra cost i un poantor la orice sufix neconvertit scop m| putei contact|diferit de NULL . Dac| base este ntre 2 i 36 , conversia se face *endp dac| endp este la: presupunnd c| intrarea este n baza respectiv|. Dac| base este 0 , baza este 8 sau 16 . Un ANTALn fa| implic| octal, iar 0x sau 0X implica hexazecimal, altfel zecimal. Cifrele n zero (0 ) Tiberiu Alexandru 7 ambele cazuri trebuie tel.: 0040-264-530918 s| fie n domeniul [0, base-1]. Dac| rezultatul produce dep|ire, LONG_MAX sau LO NG _M IN este ntors, n funcie de semnul rezultatului, iar errno e-mail: antaltiberiu@pcnet.ro primeste valoarea ERANGE . unsigned long strtoul(const char* s, cha r** en dp , int base ); - lucreaz| identic cu strtol() , excepie facnd rezultatul ntors care este de tipul unsigned long , iar valoarea de eroare ULONG_MAX .
229

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca int Facultateara nd (); - ntoarce un num|r aleator n domeniul [0 , R A N D_ M A X ]. Construcii de Maini void srand(unsigned int seed); - folosete seed pentru a genera o nou| secven| Catedra de Mecanic| i Programare de numere pseudo-aleatoare. Valoarea iniial| este 1 . Curs de limbaj C void* calloc(size_t nobj, size_t size ); - ntoarce un poantor la o zon| nou alocat| de RAM corespunz|toare unui tablou rezervate autorului. Copyright 2001. Toate drepturile suntiniializat cu valori nule de nobj obiecte, fiecare de dimensiunea size sau NULL dac| alocarea nu se poate face. Multiplicarea acestui document n-scop comercial este interzis|. | de RAM nou alocat| i void* m alloc (size_t size); ntoarce un poantor la o zon neiniializat| pentru un obiect de dimensiunea size sau NULL dac| alocarea nu se poate face. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. _t size); - modific| spaiul alocat obiectului poantat de void* realloc(void* p, size p la size . Coninutul blocului este neschimbat pn| la mimimul dintre dimensiunea veche Sudenii participani la | noua dimensiune este mai mare, noul spaiu r|mne doritoare i noua dimensiune. Dacorice form| de nv||mnt cu plat| sau alte persoaneneiniializat. ntoarce un poantor la noul spaiu alocat cost i cu dac| alocarea nu se poate n acest pot multiplica documentul numai contra sau NULL acordul scris al autorului. realiza, caz n care *p r|mne nemodificat. scop m| putei contact| la: void free (void * p); - dezaloc| spaiul la care poanteaz| p . p trebuie s| fie NULL , caz n care nu se petrece nimic, sau un poantor ntors de calloc(), m allo c() sau rea lloc(). ANTAL Tiberiu Alexandru tel.: 0040-264-530918 - cauzeaz| terminarea anormal| a programului la fel cu void ab ort(); e-mail: antaltiberiu@pcnet.ro raise(SIGABRT). void exit(int sta tus ); - cauzeaz| terminarea normal| a programului. Funciile instalate folosind ate xit() sunt apelate n ordinea invers| celor de nregistrare, fiierele deschise sunt golite, fluxurile deschise sunt nchise, iar controlul este redat mediului. status este ntors mediului ntr-o form| dependent| de implementare. Valoarea zero nseamn| terminare cu succes, de asemenea pot fi folosite valorile EXIT_SUCCESS i EXIT_FAILURE . Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| (*fcm )(void )); - nregistreaz| funcia fcn pentru ca s| fie apelat| la int atex it(void din Cluj-Napoca Facultatea Construcii de Maini ntoarce valoare nenul| dac| nregistrarea nu se poate terminarea normal| a programului; realiza. Catedra de Mecanic| i Programare Curs de limbaj C (con st ch ar* s); - l transfer| pe s mediului de execuie. Cnd s este int sys tem NULL , system () ntoarce o valoare nenul| dac| exist| un procesor de comenzi. Cnd s nu Copyright 2001. Toate drepturile sunt rezervate autorului. este NULL , valoarea ntoars| este dependent | de implementare. char* gete nv (con st ch ar* na m e); - ntoarce, dependent de implementare, irul din Multiplicarea acestui document n scop comercialnu exist|. mediu asociat cu n am e , sau NULL dac| acest ir este interzis|.

Sudenii participani la orice form| de nv||mnt caut| n base[0] ...pot multiplicaarticol superior bugetar base[n-1] un acest (*cmp)(const void * ke yv al, con st vo id* d atu m )); document *key . Funcia cm p trebuie s| ntoarc| o valoare negativ| dac| primul argument identic cu pentru uzul personal. este mai mic dect cel de al doilea, zero dac| acestea sunt egale, sau pozitiv dac| primul Sudenii participanimare dect cel de nv||mnt cu plat| sau alte persoane doritoare argument este mai la orice form| de al doilea. Cele n articole trebuie s| fie n ordine cresc|toare. Functia ntoarce un poantor la articolul pentru care condiia a fost satisfacut| pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest sau m| putei aceasta nu scopNULL dac|contact| la: s-a g|sit. void qsort(void* base, size_t n, size_t size, int (*cm p)(con st vo id*, co nst void *)); sorteaz| n ordine cresc|toare ANTAL Tiberiu Alexandru tabloul base [0]...base[n-1] de obiecte cu dimensiunea size . Funcia de comparaie cm p trebuie s| ntoarc| valoare negativ| dac| primul argument tel.: 0040-264-530918 este mai mic dect cel de al doilea, zero dac| argumentele sunt egale, iar altfel o valoare e-mail: antaltiberiu@pcnet.ro pozitiv|. int a bs(in t n); - ntoarce valoarea absolut| a lui n de tipul int. long lab s(lon g n ); - ntoarce valoarea absolut| a lui n de tipul long . div_t div (int n um , int d en om ); - ntoarce n cmpurile quot i rem ale structurii
230

void* bse arc h(co nst void * ke y, con st void* b ase , size_ t n, size_t size, int

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca de tipul dive_t ctul i de Maini num /denom . Facultatea Construcii restul lui ldiv_t ldiv (lon g n um , lon g Catedra de Mecanic| i Programare d en om ); - ntoarce n cmpurile structurii de tipul ldiv_t ctul i restul lui num /denom . Curs de limbaj C

quot

rem

ale

Copyright 2001. Toate drepturile sunt rezervate autorului.

14.11 acestui document n scop comercial este interzis|. <string.h> Multiplicarea


Exist| dou| grupe de funcii pentru prelucrarea irurilor. Prima ncepe cu str ; a doua ncepe cu m em . Cu excepia lui m em de nv||mnt superior este nedefinit dac| copierea Sudenii participani la orice form| m ove() , comportamentulbugetar pot multiplica acest are loc ntre obiecte care se suprapun. document pentru uzul personal. Sudenii participani la orice co ns t char* ct); - l copiaz| pesaun s , inclusiv terminatorul char* strc py (char* s, form| de nv||mnt cu plat| ct alte persoane doritoare pot ;multiplica documentul numai contra cost i cu acordul scris al autorului. n acest '\0' l ntoarce pe s . scop m| putei contact| la: char* strn cpy (cha r* s, const cha r* ct, int n); - copiaz| cel mult n caractere din ct n s ; realizeaz| completarea cu '\0' dac| lungimea lui ct este mai mic| dect a lui n ; l ANTAL Tiberiu Alexandru ntoarce pe s . tel.: 0040-264-530918 char* strcat(char* s, con st ch ar* ct); - l concateneaz| pe ct la s; l ntoarce pe s . e-mail: antaltiberiu@pcnet.ro char* strn cat(cha r* s, co nst cha r* ct, int n); - concateneaz| lui s cel mult n caractere din ct; l ntoarce pe s care se va termina n '\0'. int strcmp(const ch ar* cs, con st char* ct); - l compar| pe cs cu ct ; ntoarce valoare negativ| dac| cs < ct, zero dac| cs == ct, sau pozitiv| dac| cs > ct. int strn cm p(const cha r* cs, const ch ar* c t, int n ); - compar| cel mult n caractere din cs cu ing. ANTAL Tiberiu Alexandru Conf. dr.ct. ntoarce valoare negativ| dac| cs < ct, zero dac| cs == ct, sau pozitiv| dac| cs > ct. Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini cs, in t c); - ntoarce un poantor la prima apariie a lui c char* strchr(const cha r* Catedra de Mecanic|acesta nu este g|sit. n cs sau NULL dac| i Programare Curs de limbaj C char* strrchr(co nst cha r* cs, in t c); - ntoarce un poantor la ultima apariie a lui c n cs sau NULL dac| acesta nu este g|sit. Copyright 2001. Toate drepturile sunt rezervate autorului. size_t strspn(const char* cs, const char* ct); - ntoarce lungimea prefixului lui cs format din caracterele lui ct. Multiplicarea acestui document n scop comercial este interzis|. size _t str csp n(co nst cha r* cs, const char* ct); - ntoarce lungimea prefixului lui cs format din caracterele care nu fac parte din ct. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest char* strpb rk(const ch ar* document pentru uzul personal. cs, con st char* ct); - ntoarce un poantor la prima apariie n cs a oric|rui caracter din ct, sau NULL dac| nu s-a g|sit nici unul. char* strstr(const char* cs, de nv||mnt - ntoarce un poantor la prima apari Sudenii participani la orice form|con st ch ar* c t); cu plat| sau alte persoane doritoare ie a lui ct n cs , sau NULL dacnumai contras-a g|sit. acordul scris al autorului. n acest pot multiplica documentul | aceasta nu cost i cu scop m| putei contact| la:ch ar* cs); - ntoarce lugimea lui cs. size _t str len(con st char* strer ror(in t n); - ntoarce un poantor la un ir definit prin implementare ANTAL Tiberiu Alexandru corespunz|tor erorii n . tel.: 0040-264-530918 char* strto k(cha r* s, con st ch ar* ct); - o secven| de apeluri la strtok () ntoarce e-mail: tokens) din s delimitai prin caracterele din ct. Primul apel din secven| are s cu atomi ( antaltiberiu@pcnet.ro valoare diferit| de NULL . Acesta g|sete primul atom din s care nu este format din caracterele lui ct; va termina aceast| c|utare prin suprascrierea urm|torului caracter din s cu '\0' i ntoarce un poantor la atom. Fiecare apel ulterior, indicat prin valoarea NULL a lui s , ntoarce urm|torul atom, continund c|utarea ncepnd cu ultimul atom. strtok ()
231

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca va ntoarceConstrucii|de Mainisit un nou atom. irul ct poate fi diferit la fiecare apel. Facultatea NULL dac nu s-a g| Catedra de Mecanic| i Programare Curs de limbaj Curmeaz| prezinta modul de prelucrare a datelor cu ajutorul funciei Programul care 7 strtok () . Observai c| data poate fi scris| n oricare dintre formatele: 28 Iul., 2000; 20/07/2000; 28-07-2000. Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. /* STR TO K.C */


#include<stdio.h>

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest #include<string.h> document pentru uzul personal.
int main(void) Sudenii participani {

la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest char s[ ]= "28 Iul., 2000"; char *ptr; scop m| putei contact| la:
ptr= s trtok (s, " .,-/\\" ); prin tf("ptr = % s\n ", ANTAL Tiberiu Alexandruptr); ptr= s trtok (NU tel.: 0040-264-530918 LL, " .,-/\\"); e-mail:prin tf("ptr = % s\n ", ptr); antaltiberiu@pcnet.ro return 0; }

Rezultate:
ptr = 28 Conf. dr. ing. ptr = Iul

ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini void* mem cpy(void* s , con st void* ct, in t n); - copiaz| n caractere din ct n s ; l Catedra de Mecanic| i Programare | cele dou| obiecte se suprapun. ntoarce pe s . Nu lucreaza corect dac 7 Curs de limbaj C void* m em m ove (void * s, con st vo id* ct, in t n); - copiaz| n caractere din ct n s ; l ntoarce pe s . Lucreaz|drepturile sunt rezervate autorului. Copyright 2001. Toate corect dac| cele dou| obiecte se suprapun. int m em cm p(const void * cs, co nst void * ct, int n ); - compar| primele n caractere din cs cu ct; ntoarce valoare negativ| dac| cs < ct, este interzis|. ct, pozitiv| dac| cs > ct. Multiplicarea acestui document n scop comercial zero dac| cs == void* m em chr (con st ch ar* cs, in t c, int n ); - ntoarce un poantor la prima apariie a lui c ntre primele caractere ale lui cs , sau NULL dac| acesta nu este g|sit. Sudenii participaninla orice form| de nv||mnt superior bugetar pot multiplica acest document pentru set(ch ar* s, int c, in t n); - nlocuiete fiecare dintre primele n caractere void* m em uzul personal. ale lui s prin c ; l ntoarce pe s . Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la:

14.12 <time.h>

ANTAL <time.h>Alexandru Antetul Tiberiu conine declaraiile tipurilor i funciilor folosite pentru manipularea tel.: 0040-264-530918Unele funcii prelucreaz| timpul local, care poate sa difere de cel din datelor i a timpului. 7 calendar, de exemplu din cauza e-mail: antaltiberiu@pcnet.ro zonei de timp. - tip aritmetic folosit pentru reprezentarea timpului; CLOCKS_PER_SEC - num|rul de unit|i clock_t pe secund|;
clock_t 232

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca time_t - tip aritmetic reprezentnd timpul; Facultatea Construcii de Maini stru Mecanic| i Programare Catedra de ct tm - structur| care reprezint| timpul din calendar: Curs de limbaj C tm_sec; - secunde dup| minut (0, 61); int int tm_min; - minute dup| or| (0,59); Copyright 2001. Toate drepturile sunt rezervate autorului. int tm_hou r; - ore dup| miezul nopii (0, 23); Multiplicarea int tm_mday; - ziuascop lun| (1, 31) acestui document n din comercial este interzis|. int tm_mon; - luni trecute dupa ianuarie (0, 11)l 7 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest int tm_year; - ani trecui dupa 1900; 7 document pentru uzul personal. int tm_wday; - zile trecute dupa duminic| (0, 6); 7 int tm_yday; form| de nv||mnt cu plat| sau alte 7 Sudenii participani la orice - zile trecute dupa 1 ianuarie (0, 356) persoane doritoare pot multiplicaint tm _isdst ; - indicator Daylight Saving Time (DST): este pozitiv dac| documentul numai contra cost i cu acordul scris al autorului. n acest scop m| puteieste activ, zero dac| este inactiv i negativ dac| informaia nu este contact| la: disponibil|. ANTAL Tiberiu Alexandru clock _t clo ck(); - ntoarce timpul consumat de procesor de la nceputul execuiei tel.: 0040-264-530918 | nu este disponibil. clock()/CLOCKS_PER_SEC este timpul n programului sau, -1 dac e-mail: antaltiberiu@pcnet.ro secunde. time_t tim e(tim e_ t* tp); - ntoarce timpul calendaristic curent sau -1 dac| nu este disponibil. Dac| tp este ne-NULL , valoarea ntoars| este atribuit| lui *tp . double difftim e(time_ t tim e2, tim e_ t tim e1); - ntoarce diferena n secunde dintre time2 i time1. time_t m ktim e(stru ct tm * tp); - ntoarce timpul local corespunz|tor lui *tp sau -1 Conf. dr. ing. ANTAL Tiberiu Alexandru dac| reprezentarea nu se poate face. Universitatea Tenhic| din Cluj-Napoca char* asc tim e(con Maini Facultatea Construcii de st stru ct tm * tp); - ntoarce timpul din structura *tp sub forma irului Sun Mecanic| i Programare. Catedra de Jan 3 14:14:13 1988\n\0 char* ctim Curs de limbaj C e(con st tim e_ t* tp); - convertete timpul calendaristic n Coordonate Universale de Timp (Coo rdin ated Un iversa l Tim e ) i ntoarce irul echivalent. Este echivalent 2001. Toate drepturile sunt Copyright| cu asc tim e(loca ltim e(tp)) .rezervate autorului. struct tm* g m time (const tim e_t* tp ); - ntoarce timpul calendaristic n Coordonate Universale de Timp sau NULL n | nu comercial este interzis|. Multiplicarea acestui documentdacscop este disponibil. struct tm * loca ltime(cons t tim e_ t* tp); - ntoarce timpul calendaristic *tp convertit Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest la timpul local. document pentru uzul personal. size _t sm ax , con st ch ar* fm t, con st stru ct tm * tp); size_t strftim e(ch ar* s, formateaz| *tp n s conform fm t care este analog irului format din printf() . Caracterele Sudenii participani la orice form| de nv||mnt cu plat| sau alteurmeaz|, caracterele de conversie ns| sunt altele i vor fi prezentate n tabelul care persoane doritoare potmultiplicafi copiate direct n scontra costsmax acordul scris al autorului. sn acest obi nuite vor documentul numai . Cel mult i cu caractere sunt copiate n . ntoarce num m| de caractere, la: scop|rulputei contact| exclusiv '\0', sau zero dac| au fost produse mai multe de smax caractere. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 Caracter de conversie Semnificatie e-mail: antaltiberiu@pcnet.ro %a %A %b

numele zilei abreviat. numele complet al zilei din s|pt|mn|. numele abreviat al lunii.
233

Capitolul 14 - Biblioteca C standard Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini complet al lunii. %B numele Catedra de Mecanic| i Programare %c reprezentarea local| a datei i timpului. Curs de limbaj C %d ziua din lun| (01-31). Copyright 2001. Toate drepturile sunt rezervate autorului. %H ora (reprezentat| prin 24 de ore) (00-23).

Multiplicarea acestui document(reprezentat| prinesteore) (01-12). %I ora n scop comercial 12 interzis|.


%j ziua din an (001-366). Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. (01-12). %m luna %M minutul (00-59). Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contralocal i cu acordul scris al autorului. n acest %p echivalentul cost al lui AM sau PM. scop m| putei contact| la: %S secunda (00-61). ANTAL Tiberiu Alexandrunum|rul s|pt|mnii din an (duminica este ziua 1 a %U tel.: 0040-264-530918 s|pt|mnii) (0-53). e-mail: antaltiberiu@pcnet.ro %w num|rul zilei din s|pt|mn| (0-6, duminic| este 0). %W

num|rul s|pt|mnii din an (luni este ziua 1 a s|pt|mnii) (0-53).

reprezentarea local| a datei. Conf. dr. ing. ANTAL Tiberiu Alexandru local| a timpului. %X reprezentarea Universitatea Tenhic| din Cluj-Napoca %y an f| Facultatea Construcii de Mainir| secol (00-99). Catedra de Mecanic| i Programare %Y an cu secol. Curs de limbaj C %Z numele zonei de timp, dac| exist|. Copyright 2001. Toate drepturile sunt rezervate autorului. %% caracterul %.
%x

Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

234

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Index

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. ... declaraia, 83, 114 ~ operatorul complement fa| de unu, 49 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest , operatorul virgul|, 54 0x constante hexazecimale, 34 document pentru uzul personal. != operatorul de neegalitate, 46 A ?: operatorul expresie condiional|, de nv||mnt cu213, 218, 228 persoane doritoare Sudenii participani la orice form| 55, 57 ab ort() , plat| sau alte pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest ' caracterul apostrof, 30 ab s() , 228 scop m| putei contact| la: + operatorul de adunare, 41, 42 acos() , 216 ANTAL Tiberiu Alexandru ++ operatorul de incrementare, 44, 45 adev|rat (True), 46 tel.: 0040-264-530918 ++, prefixat, 45 adres|, 11, 13, 32, 107 e-mail: antaltiberiu@pcnet.ro += operatorul de atribuire compus|, 53, aritmetica, 124 56 NULL , 112 * operatorul de nmulire, 41 operatorul, 108 / operatorul de mp|rire, 41 aliniere, 175, 222 ^ operatorul pe biti SAU EXCLUSIV, Conf. dr. ing. ANTAL Tiberiu Alexandru alocare Universitatea Tenhic| din Cluj-Napoca 49, 57 Facultatea Construcii 46 Maini dinamic|, 197 < operatorul mai mic, de Catedra de Mecanic| i Programare funcii, 198 << operatorul C Curs de limbaj deplasare la stnga, 49 pentru structuri dinamice de date, <= operatorul mai mic sau egal, 46 Copyright 2001. Toate drepturile sunt rezervate autorului. 208 = operatorul de atribuire, 40, 47 alocarea dinamica a memoriei == operatorul de egalitate, 46 Multiplicarea acestui document n scop comercial este interzis|. malloc, 200 > operatorul mai mare, 46 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest alocarea dinamic| a memoriei, 197 >= operatorul mai mare sau egal, 46 document pentru uzul personal. alocarea dinamic| a memorie >> operatorul deplasare la dreapta, 49 pentru matrice, 203 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare % operatorul modulo, 41 alocarea dinamic| a memorie pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest # operatori de contact| la: 100 preprocesare, pentru vectori, 199 scop m| putei & operatorul adres|, 52, 57, 108 funcii pentru alocarea dinamic| a ANTAL Tiberiu Alexandru memoriei, 198 \\ caracterul backslash, 26, 176, 182 tel.: 0040-264-530918 structuri dinamice de date, 208 \0, 36, 135 e-mail: antaltiberiu@pcnet.ro apel \a caracterul pentru alert|, 26, 36, 176 | operatorul pe biti SAU, 49 || operatorul logic SAU, 47
235

de funcie, 76, 77 operator, 79

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca argument, 24, 25, 58, 76, 83 Facultatea Construcii de Maini Catedra de Mecanic| rii, 83 ordinea evalu|i Programare Curs de limbaj C poantorii, 112

bs ea rch () ,

228 C

buffer, 176

transferul prin drepturile Copyright 2001. Toate valoare, 83 sunt rezervate autorului. calloc() , 228 ASCII, 35 cmpuri interzis|. Multiplicarea acestui document n scop comercial estede bii, 157 asctim e() , 231 caractere de punctuaie, 22 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest asin() , 216 caracterul , 22 document pentru uzul personal. asociativitate, 56, 126 ce este o etichet|?, 75 asser t() , 213 Sudenii participani la orice form| de nv||mnt, cu plat| sau alte persoane doritoare ceil() 216 pot n() , 216 ata multiplica documentul numai contra cost i cu acordul scris al autorului. n acest char, 30 scop m| putei contact| la: ata n2 () , 216 CH AR _B IT , 215 ANTAL Tiberiu Alexandru ate xit() , 228 CHAR_MAX , 215 tel.: 0040-264-530918 ato f() , 227 CH AR _M IN , 215 e-mail: antaltiberiu@pcnet.ro ato i() , 227 ciclul for infinit, 72
ato l() , au to ,

227 91

clearerr () , cloc k() ,

227

231

B clock_t, 230 Conf. dr. ing. ANTAL Tiberiu Alexandru biblioteca C Standard,din Cluj-Napoca CLOCKS_PER_SEC , 230 Universitatea Tenhic| 213 Facultatea Construcii de Maini assert.h, 213 comparaie C-BASIC-FORTRAN-Pascal, Catedra de Mecanic| i Programare 71 ctype.h, 214 Curs de limbaj C comparaie w hile - for, 71 float.h, 214 Copyright 2001.215 const , 37 limits.h, Toate drepturile sunt rezervate autorului. constante, 22 math.h, 216 Multiplicarea acestui document n scop comercial este interzis|. continue, 73 setjmp.h, 217 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest conversie, 200 stdarg.h, 219 document pentru uzul personal. aritmetice standard la apelul de stdio.h, 219 Sudenii participani la orice form| de nv||mnt cu plat| funcalte79 sau ii, persoane doritoare stdlib.h, 227 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest automat|, 43 string.h, 229 scop m| putei contact| la: caracter de, 173, 223, 224 bit, 12 exemplu, 81 ANTAL Tiberiu 30 de semn, Alexandru tel.: 0040-264-530918 forat|, 43 e-mail:nenul, 46 antaltiberiu@pcnet.ro la utilizarea operatorilor aritmetici, operatori, 48, 50 42 bloc, 25, 61, 82 cos () , 216 break, 73 cos h() , 216
236

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca ctim e() , 231 FLT_EPSILON , 215 Facultatea Construcii de Maini Catedra de Mecanic| i Programare cuvintele cheie, 22 FLT _M AN T_ DIG , 215 Curs de limbaj C D FLT_MAX , 215 Copyright 2001. Toate drepturile sunt rezervate autorului. P , 215 F LT _M A X _ EX declaraie FLT _M IN , 215 constante, 37 Multiplicarea acestui document n scop comercial este interzis|. FLT _R AD IX , 214 variabile, 27 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest FLT_ROUNDS , 214 declaraie cu iniializare, 33 document pentru uzul personal. flux, 171 difftim e() , 231 Sudenii participani la orice form| de nv||mnt cu plat|171 alte persoane doritoare binar, sau do-w hile , 69 pot multiplica documentul numai contra cost i cu acordul scris al autorului.liniaacest citirea parametrilor din n doub m| 32 le , putei contact| la: scop comand|, 192 E citirea i afiarea datelor dintr-un ANTAL Tiberiu Alexandru fiier, 183 EDOM, 217 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro de ce exist| stdout i stderr ?, 172 enum , 38 de text, 171 ERANGE , 217 ex p() ,

216 84

declararea unui flux, 180 deschiderea fiierelor, 180 fiiere ASCII i fiiere binare n C, 185 funcii pentru operaii cu fiiere, 180 lucrul cu nregistr|ri, 189

extern ,

Conf. dr. ing. ANTAL Tiberiu Alexandru legare, 93 Universitatea Tenhic| din Cluj-Napoca variabile, 84, 87 Facultatea Construcii de Maini extinderea ciclului fori72 Catedra de Mecanic| , Programare Curs de limbaj C F
fabs () , 217 Copyright 2001.

poziionarea n fiierele binare, 186 Toate drepturile sunt rezervate autorului.

problema accesului la fiiere, 182 fals (False), 46 Multiplicarea acestui document n scop comercial este interzis|. probleme care vin din MS-DOS, fclo se() , 221 Sudenii participani la orice form| de nv||mnt superior185 bugetar pot multiplica acest feo f() , 187, 227 document pentru uzul personal. probleme care vin din UNIX, 186 ferror () , 227 rolul unui flux, 172 fge tc() , 225 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare tratarea erorilor, 182 pottpo s() , 226 documentul numai contra cost i cu acordul scris al autorului. n acest multiplica fge scop m| putei contact| la: fm od() , 217 fge ts() , 225 FOPEN_MAX , 220 ANTAL Tiberiu Alexandru FILE , 220 tel.: 0040-264-530918 for , 70 FILENAME_MAX , 220 e-mail: antaltiberiu@pcnet.ro FORTRAN, 19, 71, 216 float, 32 scurt| comparaie C i FORTRAN floo r() , 216 n domeniul calculului FLT _D IG , 214 numeric, 243
237

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca fpr intf() , 222 Facultatea Construcii de Maini Catedra226 Mecanic| i Programare fpu tc() , de Curs de limbaj C fpu ts() , 226

130 transferul variabilelor de tipul structur|, 147

Copyright 2001. fread () , 226


free() ,

fw rite () , 226 Toate drepturile sunt rezervate autorului.

G 228 Multiplicarea acestui document n scop comercial este interzis|. getc() , 226 freopen () , 221 Sudenii217 getch superior frexp () , participani la orice form| de nv||mnt ar() , 226 bugetar pot multiplica acest document pentru uzul personal. geten v() , 228 fscan f() , 224 la orice form| de nv||mnt ,cu plat| sau alte persoane doritoare gets() 226 pot multiplica documentul numai contra costgmcu acordul scris al autorului. n acest i tim e() , 231 fse tpo s() , 227 scop m| putei contact| la: goto , 75 ftell() , 226 ANTAL76 funcia, Tiberiu Alexandru I tel.: 0040-264-530918 identificatori, 22 e-mail:apel, 76, 79 antaltiberiu@pcnet.ro apel - exemplu, 79 if-else , 62 Sudenii226 fse ek () , participani cu num|r variabil de parametri, 114 indirectare, 110 definire, 77 instruciune compus|, 62 definire - exemplu, 78 instruciune expresie, 61 Conf. dr. ing. ANTAL Tiberiu Alexandru exemple de prototipuri, 82 instruciune vid|, 62 Universitatea Tenhic| din Cluj-Napoca n lipsa prototipului, 81 Facultatea Construcii de Maini int , 30 Catedra de Mecanic| i Programare | de ntoarcerea unei valori structur INT_MAX , 215 Curs de limbaj |tre o funcie, 151 cC INT _M IN , 215 ordinea evalu|rii argumentelor, 83 Copyright 2001. Toate drepturile sunt rezervate autorului. ntregi n baze diferite, 31 parametri, 83 isa lnu m () , 214 Multiplicarea acestui document n scop comercial este interzis|. poantori la funcii, 117 isa lph a() , 214 poantorii i argumentele funciilor, Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest iscntr l() , 214 112 document pentru uzul personal. isd igit() , 214 prototipuri, 81 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare isg raph () , 214 prototipurile funciilor din pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest islo w er() , 214 scop m| puteibiblioteca la: contact| standard, 82 rolul lui ; n prototip, 82 isp rin t() , 214 ANTAL Tiberiu Alexandru i funciilor ca transferul tablourilor isp un ct() , 214 tel.: 0040-264-530918 parametri de funcie, 129 e-mail: antaltiberiu@pcnet.ro isspa ce() , 214 transferul unui tablou isu pp er() , 214 bidimensional, 132 isx digit() , 214 transferul unui tablou unidimensional prin poantor,
238

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini K P Catedra de Mecanic| i Programare Kernighan i Ritchie, 19, 22, 49, 149 perro r() , 182, 227 Curs de limbaj C L poantori, 107 Copyright 2001. Toate drepturile sunt rezervate autorului. 131 * i ++, l-value, 32, 40, 144 afiarea, 109 Multiplicarea acestui document n scop comercial este interzis|. lab s() , 228 aritmetica, 124 lde xp () , 217 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest conversia numelor de tablouri, 122 ldiv() , 229 pentru uzul personal. document declararea, 108 legarea Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare n ANSI C, 108 extern , 94 pot multiplica|documentul numai contra cost i cu acordul scris al autorului. n acest iniializare, 112 scop m| putei,contact| la: intern| 94 la funcii, 117 loca ltim e() , 231 ANTAL Tiberiu Alexandru la poantori, 116 log() , 216 tel.: 0040-264-530918 la iruri, 138 e-mail: 216 log10() , antaltiberiu@pcnet.ro iruri de caractere, 134 long d ou ble , 33 postfixat ++, --, 45 LONG_MAX , 215 pow () , 216 LO NG _M IN , 215 preprocesare, 100 lon gjm p() , 217ANTAL Tiberiu Alexandru Conf. dr. ing. #define, 100 Universitatea Tenhic| din Cluj-Napoca M Facultatea Construcii de Maini #include, 103 Catedra de Mecanic| i Programare macro, 101 #line, 105 Curs de limbaj C m allo c() , 228 #pragma, 105 m em chr() , 2001. Toate drepturile sunt rezervate autorului. Copyright 230 compilare condiionat|, 103 m em cm p() , 230 lipirea liniilor, Multiplicarea acestui document n scop comercial este interzis|. 100 m em cpy() , 230 nume predefinite, 105 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest m em m ove() , 230 printf() , 223 document pentru uzul personal. m ktim e() , 231 program, 10 m od f() , 217 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare programe pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest O 1.C, 95 scop m| putei contact| la: 2.C, 96 octet, 23, 107 ANTAL Tiberiu Alexandru AFICIT.C, 86, 92 offset, 123 tel.: 0040-264-530918 ALDINTA1.C, 205 operatori e-mail: antaltiberiu@pcnet.ro ALDINTA2.C, 206 asociativitate, 57

logici, 47 relaionali, 46
239

APELPTR.C, 113 ASOCIAT.C, 56

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca BAZEEX1.C, 31 Facultatea Construcii de Maini Catedra de Mecanic| i Programare BREAK.C, 73 Curs de limbaj C CALCIT.C, 86

OPARIT.C, 41 OPARITC1.C, 43 OPARITCV.C, 42

CALLOC1.C, 200 OPPEBIT1.C, 49 Copyright 2001. Toate drepturile sunt rezervate autorului. CHAREX1.C, 31 OPPEBIT2.C, 50 Multiplicarea acestui document n scop comercial este interzis|. CIT.H, 85 PRECEDE.C, 55 Sudenii participani la86 CIT2REAL.C, orice form| de nv||mnt superior 108 PT1.C, bugetar pot multiplica acest document pentru uzul personal. COMPLEX1.C, 151-153 PTR2.C, 111 CONTINUE.C, 74 PTR3.C, 112 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest COPIE1.C, 193 PTRFNC.C, 117 scop m| putei contact| la: DEFINE1.C, 101 PTRPTR.C, 116 DEFINE2.C, 102 ANTAL Tiberiu Alexandru tel.: 0040-264-530918 69 DO-WHILE.C, e-mail: antaltiberiu@pcnet.ro DO-WHILE1.C, 70 EREGAL.C, 47 EXTERN.C, 84 FACTORIA.C, 98 Conf. dr. ing. ANTAL Tiberiu Alexandru FGETC.C, 183 Universitatea Tenhic| din Cluj-Napoca FGETS.C, 184 Facultatea Construcii de Maini Catedra de Mecanic| i33 FLOATEX1.C, Programare Curs de limbaj C 171 FLUX1.C, SALUT.C, 23 SCRIE.C, 189 SINDIR1.C, 162 SINSDIR2.C, 163 SINSDIR3.C, 164 SINSDIR4.C, 165 SINSDIR5.C, 166 SINSDIR6.C, 167 SINSDIR7.C, 169 SIRVIT1.C, 139, 140

FOPEN1.C, 181 SIZEOF.C, 54 Copyright 2001. Toate drepturile sunt rezervate autorului. FOR.C, 72 STRTOK.C, 230 Multiplicarea acestui document n scop comercial este interzis|. FUNCTIE1.C, 80 STRUC2.C, 148 GOTO.C, 75 STRUCT1.C, 145 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. IF1.C, 63 STRUCT2.C, 149 IFDEF.C, 103, orice SWITCH.C, 66 Sudenii participani la104 form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest INCDEC.C, 45 TAB1.C, 121 scop m| putei contact| la: INTEX1.C, 29 TAB10.C, 135 JMP.C, 217 ANTAL Tiberiu Alexandru tel.: 0040-264-530918 96 LEGDUREX.C, e-mail: antaltiberiu@pcnet.ro LISTASI.C, 209 MAIN.C, 86 MALLOC1.C, 199
240

TAB11.C, 136 TAB12.C, 138 TAB2.C, 122 TAB3.C, 124 TAB4.C, 125

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca TAB5.C, 127 Facultatea Construcii de Maini Catedra de Mecanic| i Programare TAB6.C, 130 Curs de limbaj C TAB7.C, 131

SHRT_MAX , SH RT _M IN , SIGABRT ,

215

215

218

TAB8.C, Toate Copyright 2001. 132 drepturile sunt rezervate autorului. SIGFPE , 218 TAB9.C, 134 SIGILL, 218 Multiplicarea acestui document n scop comercial este interzis|. UNION.C, 157 S IG IN T , 218 Sudenii participani la orice form| de nv||mnt l(), 218 bugetar pot multiplica acest VALST1.C, 115 sig na superior document pentru uzul personal. VALST2.C, 115 SIGSEGV , 219 WHILE.C, 67 Sudenii participani la orice form| de nv||mnt 216plat| sau alte persoane doritoare sin () , cu pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest WHILE1.C, 68 sin h() , 216 scop m| putei contact| la: pu tc() , 226 irul, 22 ANTAL Tiberiu pu tch ar() , 226 Alexandru size_t, 221 tel.: 0040-264-530918 pu ts() , 226 sprin tf() , 223 e-mail: antaltiberiu@pcnet.ro Q sqr t(), 216
qso rt() ,

228 R

sra nd () , ssc an f() , stderr , stdin ,

228 225

r-value, 32, 37ANTAL Tiberiu Alexandru Conf. dr. ing. Universitatea Tenhic| din Cluj-Napoca raise () , 219 Facultatea Construcii de Maini rand () , 227 Catedra de Mecanic| i Programare rea lloc() , 228 C Curs de limbaj

220 220

220

stdout,

stiva, 88

alocarea memoriei n cazul recursivitate, 97 Copyright 2001. Toate drepturile sunt rezervate autorului. sistemelor de operare avantaje i dezavantaje, 98 moderne, 197 Multiplicarea acestui document n scop comercial este interzis|. lucru, 89 evitarea, 98 exemplu de
rem ove() ,

221 organizarea memoriei RAM pentru Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest programele n execuie, 90 ren am e() , 221 document pentru uzul personal. i limbajul C, 88 rew ind() , 226 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare S strc at() , 229 pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest strc hr() , 229 scop m| putei contact| la: sca nf() , 225 strc m p() , 229 SCHAR_MAX , 215 ANTAL Tiberiu Alexandru strc py () , 229 tel.: 0040-264-530918 SC HA R_ M IN , 215 e-mail: antaltiberiu@pcnet.ro stre rro r() , 229 setbu f() , 222 strf tim e() , 231 setjm p() , 217 strlen () , 229 setvb uf() , 222 strn cat() , 229
241

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca strn cm p() , 229 Facultatea Construcii de Maini Catedra de Mecanic| i Programare strn cpy() , 229 Curs de limbaj C strp brk() , 229

T tablou, 119

accesul la elementele de tablou, 121 Copyright 2001. Toate drepturile sunt rezervate autorului. la un membru tablou, 145 strr chr() , 229 accesul
strs pn () ,

229 alocarea dinamic| a memoriei Multiplicarea acestui document n scop comercial este interzis|. pentru matrice, 203 strs tr() , 229 Sudenii 227 calculul poziiei pot multiplica acest strtod () , participani la orice form| de nv||mnt superior bugetar i a valorii celui de document pentru uzul personal. al i-elea element al unui strtok () , 229 tablou, 123 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare strtol() , 227 comparaie al autorului. pot multiplica documentul numai contra cost i cu acordul scris ntre tablou in acest strtou l() , 227 structur|, 146 scop m| putei contact| la: struct, 142 conversia numelor de tablouri n ANTAL Tiberiu Alexandru 147 poantori, 122 atribuirea structurilor, tel.: 0040-264-530918 declarare, 119 e-mail:comparaie ntre tablou i antaltiberiu@pcnet.ro structur|, 146 diferene ntre tablou i poantor la tablou, 123 crearea unei liste nl|nuite prin folosirea structurilor, 153 iniializarea, 120 de ce (*p).membru?, 149 declararea, 142 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca iniializarea variabilelor de tip Facultatea Construcii |, 144 structur de Maini Catedra de Mecanic| i Programare ntoarcerea Curs de limbaj C unei valori structur| de c|tre o funcie, 150 operatorul de indexare al tablourilor, 122

iruri de caractere, 134 tablouri de poantori la iruri, 140


tablouri multidimensionale, 126

transferul tablourilor i funciilor ca modific|ri aduse de standardizare, Copyright 2001. Toate drepturile sunt rezervate autorului. parametri de funcie, 129 142 tan () , 216 Multiplicarea acestui selecie al unui operatorul de document n scop comercial este interzis|. tan h() , 216 membru de structur|, 144 Sudenii participani la orice form| de nv||mnt superior instruciuni, multiplica acest terminator de bugetar pot 61 p->membru, 149 document pentru uzul personal. tim e() , 231 poantori la structuri, 148 Sudenii participani la orice form| de nv||mnt cu231 sau alte persoane doritoare time_t , plat| transferul variabilelor de tipul pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest tip, 25, 27 scop m| puteistructur| la: parametri de contact| ca funcie, 147 constant|, 34 stru ct tm , 231 ANTAL Tiberiu Alexandru constanta ir de caractere, 36 tel.: 0040-264-530918 64 suprapunerea if -urilor, constante caracter, 35 e-mail: antaltiberiu@pcnet.ro switch , 65 constante cu nume, 37 system () , 228 constante enumerate, 38 constante numerice, 34
242

Index Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca ntregi, 29 Facultatea Construcii de Maini Catedra de Mecanic| i Programare real, 32 Curs de limbaj C simplu, 28

vizibilitatea bloc, 87 fiier, 87

variabile, 27 prototip Copyright 2001. Toate drepturile sunt rezervate autorului. de funcie, 87
void , 28 vp rin tf() , 223 Multiplicarea acestui document n scop comercial este interzis|. tipuri de baz|, 28 vsprintf() , 223 Sudenii directive tipuri de participani la orice form| de nv||mnt superior bugetar pot multiplica acest W document pentru uzul personal. #define, 100, 103 w hile , 67 #if, #include, la orice form| de nv||mnt cu plat| sau alte persoane doritoare #ifdef, #ifndef, Sudenii participani pot multiplica#else, #endif, 103 contra cost i cu acordul scris al autorului. n acest documentul numai scop m| putei contact| la: TMP_MAX , 220 tm pfile() , 221 ANTAL Tiberiu

Alexandru tel.: 0040-264-530918 tm pn am e() , 221 e-mail: antaltiberiu@pcnet.ro tolow er() , 214
tou pp er() ,

214

type casting, 200


typedef ,

155

Conf. dr. ing. ANTAL Tiberiu AlexandruU Universitatea Tenhic| din Cluj-Napoca UCHAR_MAX , 215 Facultatea Construcii de Maini Catedra de Mecanic| i Programare UC HA R_ M IN , 215 Curs de limbaj C UINT_MAX , 215 Copyright 2001.215 drepturile sunt rezervate autorului. ULONG_MAX , Toate
und erscore ,

27 Multiplicarea acestui document n scop comercial este interzis|. un get() , 226 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest union , 156 document pentru uzul personal. USHRT_MAX , 215 Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare V pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest va_am|, putei contact| la: scop rg 219 va_end , 219 ANTAL Tiberiu Alexandru va_start , 114, 219 tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro variabile durata de existen|, 27 vizibilitate, 27, 87
vfp rin tf() ,

223
243

Biblio dr. Conf.grafieing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Bibliografie

Copyright 2001. Toate drepturile sunt rezervate autorului. [1] Niklaus Wirth, ALGORITHMS+DATA STRUCTURES = PROGRAMS, Multiplicarea acestui document n scop comercial este interzis|. PRENTICE-HALL, INC., 1976. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest [2] Brian W. Kernighan, Dennis M. Ritchie, THE C PROGRAMMING document pentru uzul personal. LANGUAGE, SECOND EDITION, PRENTICE HALL SOFTWARE SERIES, 1988. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare [3] Steven Holzner with the Peter Norton Computing Group, C pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest PROGRAMMNIG, Brady Publishing, 1991. scop m| putei contact| la: [4] Turbo C reference guide, Borland International Inc., 1987. ANTAL Tiberiu Alexandru [5] Turbo C user's guide, Borland International Inc., 1987. tel.: 0040-264-530918 e-mail:[6] Herbert Schild, C manual complet, Teora, 1998. antaltiberiu@pcnet.ro [7] Popescu, M., Floricica, I., Jitaru, M., Metode avansate de utilizare a tehnicii 7 de calcul, Editura Militara, Bucuresti, 1989. 7 [8] M., Sargent, R., L., Shoemaker, The IMB PC from the inside out, AddisonWesley Publishing Company, 1986. [9] A., ANTAL Tiberiu Alexandru 7 Conf. dr. ing. S., Tanenbaum, Organizarea structurata a calculatoarelor, editia a IV-a, Computer Press AGORA,Cluj-Napoca 1999. Universitatea Tenhic| din Facultatea Construcii de Maini Structura datelor si tehnici de programare, Lito. [10] Giumale, C. Kalisz, E., Catedra de Mecanic| i Programare IPB, 1981. Curs de limbaj C [11] A., V., Aho, J., D. , Ullman, THE THEORY OF PARSING, TRANSLATION, AND COMPILING, VOLUME I: PARSING, PRENTICE-HALL, Copyright 2001. Toate drepturile sunt rezervate autorului. INC. Multiplicarea acestui documentMedema, M. Boasson, The programming languages [12] C. H. Smedema, P. n scop comercial este interzis|. Pascal, Modula, CHILL, Ada, Prentice Hall Inc., 1983. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest [13] Leon Livovschi, Bazele informaticii, Editura Albatros, 1979. document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

244

ANEXA 1 O scurta comparat ie ntre C s i FORTRAN 7 Conf. dr.-ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ceast| anex| apare ntr-o carte de C numai pentru c| n lumea calculelor numerice prostia a ANTAL Tiberiu Alexandru nceput s| se manifeste din plin. Firme serioase au cedat n faa 0040-264-530918 tel.: presiunilor i a modei venite din America intoxicnd lumea calculelor numerice cu tot felul de antaltiberiu@pcnet.ro e-mail: rutine scrise n C i C++. Aceast| tendin| ciudat| este probabil ntreinut| i de persoane care nu au experien| n calculul numeric, domeniu n care b|trnul FORTRAN predomin|, dei n ultima vreme a cam nceput s| piard| teren din motivele descrise mai sus. Iat| cteva dintre calit|ile FORTRAN-ului culese de mine de pe Internet:

ANEXA 1 - Scurta comparat ie 7 C - FORTRAN n domeniul calculului numeric

A. FORTAN satisface mai bine -7 Conf. dr. ing. ANTAL Tiberiu Alexandru nevoile oamenilor de stiinta dect C Universitatea Tenhic| din Cluj-Napoca pentru ca: 7 Facultatea Construcii de Maini - permite lucrul cu tablouri de dimensiune variabil| n subrutine, din acest motiv Catedra de Mecanic| i Programare pot fi scrise rutine cu scop general, f|r| a specifica explicit dimensiunea tabloului care este Curs de limbaj C transferat. C standard nu are aceast| facilitate important|, iar preul pl|tit const| n complicarea codului care s| poat| trata aceste cazuri. Unele compilatorare, de exemplu Copyright 2001. Toate drepturile sunt rezervate autorului. gcc , au aceast| extensie nestandard; - are un grup document n ii intrinseci cu este interzis|. Multiplicarea acestuimare de funcscop comercial precizie generic|. Aceste funcii pot fi optimizate foarte bine (prin scrierea lor n limbaj de asamblare cu optimizarea folosirii Sudenii participani | o oarecare standardizare a programelor lapot multiplica acest cache-ului) i asigur la orice form| de nv||mnt superior bugetar un nivel mai nalt, documentportabilitatea; crescnd pentru uzul personal. - asigur| intern lucrul cu aritmetica numerelor complexe; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare - are implementat numai contra cost i ial infix care este generic n raport pot multiplica documentulun operator exponencu acordul scris al autorului. n acest cu precizia i tipul care trateaz 7 scop m| putei contact| la: | foarte eficient cazuri speciale frecvente de genul numa r flotan t ** ntreg m ic ; ANTAL indicii de tablouri pot ncepe de la un ntreg arbitrar; - Tiberiu Alexandru tel.: 0040-264-530918 FORTRAN 90 suport e-mail:-antaltiberiu@pcnet.ro | o notaie de tablou care permite operaii pe poriuni de tablou, acesta fiind un avantaj n cazul calculului paralel; - FORTRAN 90 suport| selecia automat| a tipurilor de date numerice avnd specificate precizia i domeniul ceea ce face programele nca i mai portabile; 7 - extensiile FORTRAN pentru programare paralel| sunt strandardizate de
245

ANEXA 1 O scurta comparat ie ntre C s i FORTRAN 7 Conf. dr.-ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca consoriul High Performance Fortran . Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C FORTRAN 90 suport| majoritatea facilit|ilor specifice limbajelor C (poantori, alocare dinamic| de memorie etc.) i C++ (supranc|rcarea operatorilor, obiecte simple) avnd Copyright 2001. Toate drepturile sunt rezervate autorului. n plus o sofisticat| capacitate de manipulare a tablourilor. Are facilit|i privind precizia numeric| i controlul document n crescnd astfel portabilitatea programelor. Multiplicarea acestui domeniului, scop comercial este interzis|.

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest B. Modul de proiectare a limbajului FORTRAN permite viteza 7 document pentru uzul personal. maxima n executie: 7 Sudenii FORTRAN 77 orice form| de nv||mnt cu plat| sau alte persoaneoptimizarea - participani la nu lucreaz| explicit cu poantori, motiv pentru care doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest cu automat| a codului este simplificat|; FORTRAN 90 permite poantori explicii, ns| scop m| puteiscontact| la: optimiz|rii automate de cod; restricii care | nu d|uneze - Tiberiu Alexandru ANTAL FORTRAN a fost proiectat pentru a permite alocarea static| a memoriei, astfel nu se pierde timpul cu crearea i distrugerea nregistr |rilor de activare de pe stiv|, tel.: 0040-264-530918 pentru fiecare apel de procedur|. Proceduri recursive nu sunt posibile cu alocarea static|, e-mail: antaltiberiu@pcnet.ro dar pot fi simulate eficient dac| este cazul; - FORTRAN nu permite folosirea unor nume alternative ntre variabilele globale (COMMON) i argumentele fictive. Toate aceste restricii asigura o mai buna optimizare a codului fata de C. 7 7 -7 Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca FORTRAN, care n mare parte este public i de C. Exist| deja scris un numeros cod Facultatea Construcii de Maini foarte bun| calitate. Catedra de Mecanic| i Programare Curs de limbaj C D. C standard specific| numai existena bibliotecilor matematice n dubl| precizie Copyright 2001. Standardul FORTRAN oblig| laautorului. bibliotecilor n simpl| i dubl| (doub le ). Toate drepturile sunt rezervate existenta precizie, n plus muli produc|tori furnizeaz| biblioteci i pentru quad-precizie Multiplicarea acestuiRE AL*16 ). Codul ncomercial este interzis|. rapid dect cel n dubl| (long dou ble , document n scop simpl| precizie va fi mai precizie ntruct datele n simpl| precizie ocup| mai puin spaiu de RAM. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Calculele n quad-precizie (long d ou ble ) sunt uneori necesare pentru a minimiza document pentru rotunjire. n C exist| rutine matematice numai pentru doub le , acestea erorile de uzul personal. vor consuma un timp mai lung dect cel necesar n calcule de simpl| precizie, iar Sudenii participani la orice form| dedac| sunt folosite cu sau alte persoane doritoare exactitatea lor va l|sa de dorit nv||mnt cu plat| long d ou ble . pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: E. FORTRAN este proiectat sa efectueze calculele numerice foarte 7 ANTAL Tiberiu Alexandru clar si precis definite pentru ca: 7 tel.: 0040-264-530918 1) Ordinea evalu|rii expresiilor e-mail: antaltiberiu@pcnet.ro aritmetice este precis definit| i poate fi controlat| prin paranteze; 2) Declaraiile implicite de tip scurteaz | timpul de scrierea a programelor, dar n acelai timp fac programele mai vulnerabile la erori i complica depanarea; 7
246

ANEXA 1 O scurta comparat ie ntre C s i FORTRAN 7 Conf. dr.-ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca 3) Nu este dependent de scrierea cu litere mari sau mici; Facultatea Construcii de Maini Catedra de Mecanic| i Programareprogramatorul avnd libertatea deplin| n alegerea 4) Nu are cuvinte cheie rezervate, Curs de limbaj C numelor de identificatori;

5) Principiul o linie pe rnd crete mult lizibilitatea programelor; Copyright 2001. Toate drepturile sunt rezervate autorului. 6) Este un limbaj mult mai uor de nv|at dect limbajul C. Multiplicarea acestui document n scop comercial este interzis|.
F. Compilatoarele orice form| emit mesaje de eroare bugetar pot multiplica acest Sudenii participani la FORTRAN de nv||mnt superior i de diagnosticare mult mai

bune dect cele C. document pentru uzul personal.

Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

247

ANEXA 2 Citirea declarat Conf. dr.-ing. ANTAL -iilor C Alexandru Tiberiu Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

ANEXA 2 - Citirea declarat iilor C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|.

D
* [ ]

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. eclaraiile folosite n curs au fost relativ simple: int, float, tablouri de char, structuri de tipuri de baz| i poantori la acestea. Citirea unei declaraii C complexe se poate descompune n civa pai elementari. Pentrualte persoane doritoareii Sudenii participani la orice form| de nv||mnt cu plat| sau a putea citi ns| declara complexe trebuie s| cunoatem regulile pe care compilatorul le folose te pentru pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest interpretarea declaraiilor. Etapele de parcurs pentru nelegerea unei declaraii sunt: scop m| putei contact| la: Identificai numele variabilei care se declar|; ANTALi-v| n afar| n sens trigonometric (antiorar, yang); Roti Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro La ntlnirea lui Citii
poa ntor la tablou de ...

) funct ie care a Conf. (dr. ing. ANTAL Tiberiu Alexandrure ... s i ca re nto arce Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Citii stru ct S , union U sau e nu m E dintr-o singur| bucat|; Catedra de Mecanic| i Programare Citii coleciile adiacente de [ ][ ] dintr-o singur| bucat|. Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Exemplul 1 Fie declaraia: Multiplicarea acestui document n scop comercial este interzis|.
floa t *p[7 ];

Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal.| specifice: Declarara ia de mai sus poate s 1) un tablou de 7 poantori la float sau Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare 2) un poantor la un numai contra cost pot multiplica documentul tablou de 7 float. i cu acordul scris al autorului. n acest scop m| putei contact| la: ncepem citirea cu numele variabilei care se declar|, adic| ANTAL Tiberiu Alexandru| n sens trigonometric i g|sim [7]. Acum putem spune deja cu p . Ne rotim spre n afar tel.: 0040-264-530918 tablou de 7 . Continund cu rotirea d|m peste * care se citete poantor la ; pentru c| avem e-mail: buc|i vom spune mai precis 7 poa ntor i la , trecem mai departe printre ] i ; deja 7 antaltiberiu@pcnet.ro ajungnd n final la float. Sistematiznd cele citite mai sus, putem scrie: p este un 1) tablou de 7
248

ANEXA 2 Citirea declarat Conf. dr.-ing. ANTAL -iilor C Alexandru Tiberiu Universitatea Tenhic| din Cluj-Napoca 2) poa ntori la Facultatea Construcii de Maini 3) float Catedra de Mecanic| i Programare Curs de limbaj C

Deci, variabila p este un tablou care are 7 elemente, fiecare dintre acestea fiind un Copyright float. Toate drepturile sunt rezervate autorului. poantor la 2001. Multiplicarea acestui document n scop comercial este interzis|. Exemplul 2 Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Fie declaraia: document pentru uzul personal. int (*p) [11]; Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Diferena esenial| fa| de numai contra cost este acordul scris al autorului. n acest pot multiplica documentul exemplul anterior i cu un set de paranteze rotunde n jurul lui *p . Dei s-ar scop m| putei contact| la: parea c| efectul acestora este nesemnificativ, acestea 7 vor modifica ordinea de parcurgere n sipral| yang. ANTAL Tiberiu Alexandru Se ncepe cu p care este variabila declarat|, se tel.: 0040-264-530918 continu| spirala n interiorul parantezelor i ntlnim e-mail: antaltiberiu@pcnet.ro un * care ne face s| spunem poan tor la . Apoi continu|m rotirea n spiral| n afara parantezelor, ntlnim [11] i vom putea spune tablou de 11. Apoi termin|m spirala la int. Sistematiznd, putem spune: p este 1) un poa ntor la Conf. dr. ing. ANTAL Tiberiu Alexandru 2) un ta din d e 11 Universitatea Tenhic| blouCluj-Napoca Facultatea Construcii de Maini 3) int Catedra de Mecanic| i Programare Curs de limbaj C Deci variabila p este un singur poantor. La cap|tul poantorului, dup| iniializare, se va afla un tablou de 11 ntregi (int). Copyright 2001. Toate drepturile sunt rezervate autorului. Exemplul 3 Multiplicarea acestui document n scop comercial este interzis|. Fie declaraia: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest short **a[3 ][7]; document pentru uzul personal. Mai nti g|sim variabila care se declar|, adic| pe a Sudenii participani la orice form| de nv||mnt cu.plat| sau alte persoane doritoare Apoi ne rotim n spiral| yang i g|contra cost , careacordul scris al autorului. n acest pot multiplica documentul numai sim pe [3][7] i cu se citete conform regulilor expuse dintr-o bucat|, adic| scop m| putei contact| la: tablou de 3 tablouri de 7 . Continund rotirea g|sim cel mai apropiat * de a i zicem poa ntor la , apoi g|sim ANTAL Tiberiu Alexandru cel|lalt * spunnd din nou poantor la . La ultima tel.: 0040-264-530918i ; i d|m peste short . Deci putem spiral|, ieim ntre ] e-mail: antaltiberiu@pcnet.ro zice: a este un 1) un tablou 3 tablouri de 7 2) poa ntori la
249

ANEXA 2 Citirea declarat Conf. dr.-ing. ANTAL -iilor C Alexandru Tiberiu Universitatea Tenhic| din Cluj-Napoca 3) poa ntori la Facultatea Construcii de Maini 4) short Catedra de Mecanic| i Programare Curs de limbaj C

este un tablou de 3 tablouri de 7 poantori la poantori la short . Copyright 2001. Toate drepturile sunt rezervate autorului.
a

Exemplul 4 Multiplicarea acestui document n scop comercial este interzis|. Fie declaraia: Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest floa t *f(in t, do ub le); document pentru uzul personal. ncepemparticipani la oricentlnim mai nti (int, plat| sau alte persoane doritoare Sudenii cu spirala din f , form| de nv||mnt cu doub le ) i spunem funct ie numai contra cost i cu de pot multiplica documentul care are ca param etri acordul scris al autorului. n acest intrare putei contact| la:double s i ntoarce , la un int s i un scop m| urm|toarea spiral| g|sim pe * i spunem poa ntor la , apoi, n final, ajungem la float. Deci, ANTAL Tiberiu Alexandru f este: tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro re a re ca par am etri d e in trar e u n in t s i un float s i 1) o funct ie, ca ntoarce

2) un poa ntor 3) float

la

Conf. dr. a face deci cu prototipul unei funcii cu numele f care are ca parametri de intrare Avem de ing. ANTAL Tiberiu Alexandru un int i un doub le i ntoarce un poantor la un long . Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Exemplul 5 Curs de limbaj C Fie declaraia:
cha 2001. Toate Copyright r (*pf)(void );drepturile sunt rezervate autorului.

Multiplicarea acestui document n scop comercial este interzis|. Aici apare un set de paranteze rotunde n jurul lui *pf. Este declarat| variabila pf ; parantezele rotunde ne Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest oblig| s| realiz|m spirala yang n interioul lor ntlnind document pentrucitim poantor la. Apoi g|sim pe (void) pe * pentru care uzul personal. i citim funct ie care nu are p ara m etri s i care ntoarce, continund spirala ne orice n final nv||mnt cu plat| sau alte persoane doritoare Sudenii participani la oprimform| de la char. Deci pf este: pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei1) un poantor la o contact| la: 2) funct ie care nu are p ara me tri s i ntoarce un ANTAL Tiberiu Alexandru 3) char tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro Astfel, pf nu este un prototip de funcie, ci declaraia unui singur poantor cara va stoca o funcie. Un astfel de tip de poantor va putea poanta, de exemplu n segmentul de cod.

250

ANEXA 2 Citirea declarat Conf. dr.-ing. ANTAL -iilor C Alexandru Tiberiu Universitatea Tenhic| din Cluj-Napoca Exemplu Construcii de Maini Facultatea 6 Fie declara ia: Catedra de Mecanic| i Programare Curs de limbaj C plex (*tpf[7]) (void); stru ct com

Copyright 2001. Toate drepturile sunt rezervate autorului. Acest exemplu este imposibil de neles f|r| aplicarea regulilor. document n scop comercial este interzis|. Multiplicarea acestui ncepem cu tpf. Apoi parcurgnd spirala yang, ajungem la [7] i citim tablou de 7 . Continund g|sim pe * i citim Sudenii la , apoi ajungem la (void) citind funct ie superior bugetar pot multiplica acest poantor participani la orice form| de nv||mnt document pentru uzul personal. care nu are para m etri s i ntoarce . Acum se ajunge la struct complex , care fiind un caz special, se citete aa cum este scris. Punnd toate cele zise cap la cap, avem: Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare tpf este un pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei1) tablou la: 7 contact| de 2) poa ntori la ANTAL Tiberiu funct ii care nu au param etru de intrare s i ntorc 3) Alexandru tel.: 0040-264-530918 4) structuri complex e-mail: antaltiberiu@pcnet.ro
tpd este un tablou de 7 complex . Fiecare funcie

poantori la funcii care ntorc prin valoare cte o structur| ntoarce cte o singur| structur| de tipul complex .

Exemplul 7 Conf. dr. ing. ANTAL Tiberiu Alexandru Fie declaraia: Universitatea Tenhic| din Cluj-Napoca int Construcii de Maini Facultatea (*(*pfpa )(void))[5]; Catedra de Mecanic| i Programare Cursode limbaj Ccare probabil v-ar putea face s| Iat| declaraie picai un examen. Totui, s| aplic|m regulile deja Copyright 2001. Toate drepturile sunt declarat|. autorului. prezentate. pfpa este variabila rezervate Realiz|m parcurgerea n spiral| din interiorul parantezelor, ceea ce ne conduce la * , citind Multiplicarea acestui document n scop comercial este interzis|. poantor la . Parcurgerea n spiral| ne conduce mai departe la (void) citind funct ie care nu are param etri s i ntoarce. multiplica acest Sudenii participani, la orice form| de nv||mnt superior bugetar pot n continuare se ajunge la [5] care se va personal. de 5 i termin|m cu int. Recapitulnd, pfpa este: citi tablou document pentru uzul 1) un poa ntor la Sudenii participani la-orice form| arenv||mnt cu plat| sausalte persoane doritoare 2) o funct ie care nu de parametri de intrare - i care ntoarce pot multiplica3) un poa ntor la contra cost i cu acordul scris al autorului. n acest documentul numai scop m| putei contact| la: 4) un tablou de 5 5) Alexandru ANTAL Tiberiu int tel.: 0040-264-530918 e-mail: pfpa declar| un singur poantor. Restul declaraiei se folosete numai pentru a Astfel, antaltiberiu@pcnet.ro specifica ce anume se afl| la cap|tul poantorului dup| iniializare. Este un poantor la un cod, poantnd la o funcie f|r| parametri i care ntoarce un poantor ce poanteaz| la un tablou de 5 valori int.
251

ANEXA 2 Citirea declarat Conf. dr.-ing. ANTAL -iilor C Alexandru Tiberiu Universitatea Tenhic| din Cluj-Napoca ExemplulConstrucii de Maini Facultatea 8 Fie declara ia: Catedra de Mecanic| i Programare Curs de limbaj Cpf)(in t))(cha r); cha r *(*(*

Copyright 2001. Toate drepturile sunt rezervate autorului. pf este un poa ntor la , datorit| parantezelor rotunde i a lui * , urmeaz| (int) n scop comercial este interzis|. Multiplicarea acestui document i citim funct ie care are un pa ram etru de tip ul in t s i ntoarce . Continund parcurgerea n spiral| yang, ntlnim Sudenii semnificaia la orice form| de nv||mnt superior bugetar pot multiplica acest pe * cu participani poa ntor la , urmeaz| apoi document pentru uzul care are (char) i citim funct ie personal. un pa ra m etru de tipul char s i ntoarce . Urmeaz| nc| un * citit Sudenii participani la char. poa ntor la , apoi n finalorice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest pf este scop m| putei contact| la: 1) un poa ntor la 2) Alexandru ANTAL Tiberiu o funct ie ca re a re u n p ara m etru int s i ntoarce un tel.: 0040-264-530918 3) poantor la e-mail: antaltiberiu@pcnet.ro are un param etru char s i ntoarce un 4) o funct ie care 5) poa ntor la 6) char Astfel, pf este declaraia unui singur poantor din nou. Restul declaraiei servete numai Conf. dr. ing. ANTAL Tiberiu Alexandru Avem un poantor la o funcie care are un la specificarea tipului poantat de poantor. Universitatea Tenhic| dincare ntoarce un poantor. Poantorul ntors poanteaz| la o alt| parametru de tipul int i Cluj-Napoca Facultatea Construcii de Maini char i care ntoarce o valoare tot de tipul char. funcie care are ca parametru un Catedra de Mecanic| i Programare Curs de limbaj C nelegerea declaraiilor complexe poate fi mult uurat| prin folosirea lui typedef. Dac| dorim s| simplific|m declaraia floa t* p[7 ]; care declar| un tablou p de 7 poantori la float, Copyright 2001. Toate drepturile |t. Cre|m un nou tip poantor la float cu numele de ptf. vom ncepe ntotdeauna de la cap sunt rezervate autorului. Tabelul care urmeaz| prezint| cteva dintre variantele de folosire ale lui typedef pentru Multiplicarea acestui document n scop comercial este interzis|. exemplele deja parcurse. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Declaraie initiala - 7 cu typedef
floa t *p[7 ]; - tablou Sudenii participani p de 7 (1) poantori (1) typede f float *alte persoane doritoare la orice form| de nv||mnt cu plat| sau ptf; la float. ptf p[7 ]; pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| un tablou de 3 la: short **a[3 ][7]; - a este (1) typedef short ** pps;

tablouri de 7 (1) poantori la poantori la ANTALputem n Alexandru crea un (2) short ; Tiberiu continuare tel.: 0040-264-530918 la poantori la tablou de 3 poantori short , dup| care crearea lui e-mail: antaltiberiu@pcnet.roa va fi simpl|.
char (*pf)(void) - pf este un poantor (1) o funcie f|r| parametri.

pps a[3][7];

sau
(2) typ ed ef p ps a3[3]; a3 a[7]; (1) typed ef ch ar f(v oid ); f *pf; 252

la

ANEXA 2 Citirea declarat Conf. dr.-ing. ANTAL -iilor C Alexandru Tiberiu Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de(void); - tpf stru ct com plex (*tpf[7]) Maini (2) typed ef struct Catedra de Mecanic|(1)Programare(2) este un tablou de 7 i poantori la (1) typede f f *pf; funcde limbaj C Curs ii far| parametri care ntorc pf tpf[7]; structuri complex . Copyright 2001. Toate drepturile sunt rezervate autorului.

com plex f(void );

int (*(*pfpa )(void))[5]; - pfpa este (1) un (3) typ ed ef in t (*pt6 )[6]; Multiplicarea(2) funcdocument n scop comercial este interzis|. poantor la o acestui ie f|r| parametri (2) type de f pt6 f(void ); care ntoarce (3) un poantor la un (1) typedef f *pfpa; Sudeniide 6 int. tablou participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. cha r *(*(* pf)(in t))(cha r); - pf este un (4) typedef char *ptc; (1) poantor la o funcie cu un (3) typed ef ptc f(cha persoane doritoare Sudenii participani la orice form| de nv||mnt cu plat| sau alter); parametru int care ntoarce (2) un pot multiplica documentul numai contra cost i cu acordul *ptf; al autorului. n acest (2) typede f f scris poantor la (3) o funcie care are un scop m| putei contact|ntoarce (4) un parametru char care la: (1) ptf (*pf) (int); poantor la char. ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

253

GLOSAR Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Glosar

Copyright 2001. Toate drepturile sunt rezervate autorului.


AS CII A merican S tandard C ode for I nformation I nterchange Multiplicarea acestui document n scop comercial este interzis|. este un standard pe 7 bii pentru codificarea setului de Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest caractere folosit de sistemele de calcul. document pentru uzul personal. BIOS B asic I nput O utput S ystem este o interfaa software de 7 nivel foarte jos cu cu plat| sau alte PC. Este Sudenii participani la orice form| de nv||mnthardware-ul unui persoane doritoare implementat| n ROM BIOS i nc rcata la boot-area 7 pot multiplica documentul numai contra cost i cu acordul scris al|autorului. n acest PC-ului. scop m| putei contact| la: Bit (bit) b inary digit , denumirea unit|ii de informaie; n ANTAL Tiberiu Alexandru tehnica de calcul este cea mai mic| unitate de stocare, tel.: 0040-264-530918 suficient| pentru stocarea unui bit. e-mail: antaltiberiu@pcnet.ro Boolean o variabil| care poate lua numai dou| valorile: adeva rat sau fals . Denumirea vine de la Ge org e B oole , 7 matematician britanic, care a creat un sistem matematic ce lucra numai cu dou| valori de adev|r. Boot-are termenul vine din "to pull oneself up by one's Conf. dr. ing. ANTAL Tiberiu Alexandru bootstraps" i semnific| procesul de nc|rcare i Universitatea Tenhic| din Cluj-Napoca ini Facultatea Construcii de Maini ializare a sistemului de operare. Catedra de Mecanic| i Programare Buffer o zon| de memorie care asigur| stocarea temporar| a Curs de limbaj C datelor pentru dispozitivele de I/E.

Copyright 2001. Toate drepturilecomponent| n ierarhia de date a unui sistem de By te ( octet) o sunt rezervate autorului. calcul, tipic| pentru stocarea unui caracter (n Multiplicarea acestui document n scop comercial este36 de bii are 9 bii, iar pe unele sistemele de calcul pe interzis|. sisteme mai vechi, 6 sau 7 bii). Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest Cache document pentru uzul personal. zon| de memorie cu informaie salvat| pentru o referiri ulterioare. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare Device driver (driver de un software folosit acordul scris al unui dispozitiv pot multiplica documentul numai contra cost i cu pentru comandaautorului. n acest hardware. dispozitiv) contact| la: scop m| putei
FAT F ile A llocation T able este sistemul de fiiere nativ al ANTAL Tiberiu Alexandru sistemului de operare DOS. tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro G raphical U ser I nterface este o denumire utilizat| G UI pentru interfeele grafice prin care utilizatorul poate comanda un sistem de calcul.

254

GLOSAR Conf. dr. ing. ANTAL Tiberiu Alexandru Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini eveniment care suspend| procesul curent activ i Interrupt (ntrerupere) un Catedra de Mecanic| i Programare produce comutarea UCP pe un proces nou. Curs de limbaj C Interrupt driven un sistem care este controlat prin ntreruperi. Copyright 2001. Toate drepturile sunt rezervate autorului. Interrupt handler ( rutina 7 un program care prelucreaz| ntreruperi. pentru tratarea Multiplicarea acestui document n scop comercial este interzis|. ntreruperii)

Sudenii participani)la orice form| deie de rutine superior bugetar pot pentru toate Library (biblioteca 7 o colec nv||mnt software disponibil| multiplica acest document pentru uzul personal. programele.
Machine language limbaj nv||mnt cu plat| sau alte de UCP. Cel mai Sudenii participani la orice form| decu instruciuni nelese directpersoane doritoare pot multiplicaina) (limbaj mas documentul numai contralimbaj de cel main| este limbajul de n acest - 7 apropiat cost i cu acordul scris al autorului. scop m| putei contact| la: asamblare. M acro Tiberiu Alexandru ANTAL sau macrodefinit ie o referin| simbolic| la un grup de instruciuni sau date. Simbolul este nlocuit prin instruciuni sau valori tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro actuale n faza de expandare a macrodefinitiei. Octet (octet)

8 bii, termenul este folosit n domeniul reelelor de calculatoare n locul lui by te , ntruct pe unele sisteme de calcul acesta nu are 8 bii.

Type (tip) o mulime de valori din care o variabil| sau o constant| Conf. dr. ing. ANTAL Tiberiu Alexandru poate lua valori. Universitatea Tenhic| din Cluj-Napoca Facultatea Construcii de Maini Catedra de Mecanic| i Programare Curs de limbaj C

Copyright 2001. Toate drepturile sunt rezervate autorului. Multiplicarea acestui document n scop comercial este interzis|. Sudenii participani la orice form| de nv||mnt superior bugetar pot multiplica acest document pentru uzul personal. Sudenii participani la orice form| de nv||mnt cu plat| sau alte persoane doritoare pot multiplica documentul numai contra cost i cu acordul scris al autorului. n acest scop m| putei contact| la: ANTAL Tiberiu Alexandru tel.: 0040-264-530918 e-mail: antaltiberiu@pcnet.ro

255

You might also like