You are on page 1of 23
ulatoarelor entra cel uidest sursa Ta sirul dest de inceput siruri de Aib.h: atof itoa, oa, trare/iesire Expresit 123 EXPRESII Asupra datelor pot fi aplicati operatori din diverse clase, rezultind construc(ii sintactice numite expresii. In forma lor cea mai general, expresiile sunt aledtuite din operanzi si operatori. Evaluarea expresiilor produce ca rezultat 0 valoare de un anumit tip. in metalimbajul BNF expresia poate fi definita astfel: ::=|| Prima varianté din definitie corespunde celei mai simple forme de expresie, redusa la o variabil& sau o constant de un anumit tip. A doua sia treia variant, prin aplicare repetatd, conduc la recursi expresiilor, proces evidengiat in exemplul urmator: We in construirea a +(-b} ¢ +15 ae ieee Ordinea de aplicare a operatorilor din expresii poate fi, total sau Partial, impusd prin folosirea parantezelor. Acestea sunt evaluate cu prioritate, iar dac& sunt mai multe niveluri de paranteze, evaluarea se realizeazi din interior spre exterior, in absenja parantezelor, respectiv in interiorul acestora, evaluarea se realizeaza in functie de ordinul de preceden& a operatorilor. 7.1. Operanzi si operatori Un operand poate fi una din urmatoarele construcji © oconstanta simbolica; © un literal; Bazele programirii calculatoarelor © variabila simpli; numele unui masiv; numele unui tip de dats; rnumele unei func referirea unui element de masiv; referirea unui cmp de articol; apelul unei funcfii; o expresie Din ultima posibilitate rezulti ci expresia este o constructie recursiva, Un operand are un tip gi o valoare. Valoarea se determina fie la compilare fie la execufie, Nu pot fi operanzi sirurile de caractere. Exemple: 4321, oxabe1 (literal) Fie declarafile: int v{1001 2 si v pot fi operanzi tn expresii: a are tipul int iar v are tipul pointer faint (tipul pointer nu face obiectul prezentei lucrr). Operatorii. se clasifica dupa diferite criterii, precum numéarul operanzilor asupra cdrora se aplic& si tipul de operatie pe care o realizeaza Majoritatea operatorilor sunt unari sau binari. Limbajul utilizeazé si un operator fernar (care se aplic& asupra a trei operanzi). Dupa tipul operafiei realizate, operatorii sunt aritmetici, logici, relajionali et. Intr-o expresie apar, de obicei, operatori din aceeasi clasa, dar pot fi si din clase diferite. Se pot scrie expresii complexe care s& contin& operatori din toate clasele. La evaluarea acestor expresii se {ine cont de prioritdile operatorilor (numite si clase de preceden8), de asoctativitatea lor si regula conversiilor implicite Atunei cénd un operator binar se aplic& 1a doi operanzi de tipuri diferite, inainte de a efectua operajia, cei doi operanzi sunt adusi la un tip comun. in general, operandul de tip inferior se converteste c&tre tipul operandului de tip superior. in primul rand se convertesc operanzii de tip char c&tre tipul int. Dack operatorul se aplica la doi operanzi cu acelasi tip nu se face nici 0 conversie, rezultatul avand acelasi tip cu cei doi operanzi. Daca valoarea Ini depaseste domeniul asociat tipului de data, rezultatul este an ron: oper: acest tip, ie acest conve acest a acest obtind unde v sau o€ poate a din sta income Poate i Efectelt determi ramérii caleulatoarelor este 0 constructie ‘a se determin’ fie la caractere. pointer taint (tipul i, precum numacul pe care o realizeaza. dajul ut Dupa tipul operatiei zeaza si un zeeagi clasd, dar pot fi ‘= s8 contin’ operatori se cont de prioritayile itatea lor si regula fei operanzi de ti sunt adugi la un tip averteste cAtre tipul stesc operanzii de tip wperanzi cu acelasi tip cu cei doi operanzi. fe dat, rezultatul este Expresit 125 Se eronat (eroarea de depisire de domeniu). Dac& operatorul se aplicd la operanzi de tipuri diferite, conversia se face astfel: 1. daca un operand este de tipul Jong double, celalalt se converteste la acest tip, iar rezultatul va fide tip Jong double; 2. daci un operand este de tip double, celalalt se converteste la acest tip, iar rezultatul va fi de tip double 3. dacd un operand este de tip float, atunci celilalt se converteste la acest tip, iar rezultatul va fide tip float; 4, daca un operand este de tip unsigned Jong, atunci celdlalt se converteste la acest tip, iar rezultatul va fi de tip unsigned long: 5. dac& un operand este de tip Zong, atunci celilalt se converteste la acest tip, iar rezultatul va fi de tip Jong; 6. daci unul din operanzi este de tip unsigned iar celilalt de tip int acesta se converteste la tipul unsigned, iar rezultatul va fi de tip unsigned. Regula se aplicé pe rind fiecdrui operator di obfindnd in final tipul expresiei 7.2. Operatorii de atribuire Atribuirea este o expresie cu forma generala: unde v este o variabila simpli, un element de masiv, un cdmp al unui articol sau o expresie in urma evaluatii cdreia se obfine o adrest. Entitatea care se poate afla in stanga operatorului de atribuire se numeste lefi value. Pentru a se putea efectua atribuirea, tipul expresiei si tipul entitatii din sténga operatorului de atribuire trebuie s& fie compatibile. Dacd sunt incompatibile se produce eroare la compilare (deoarece compilatorul nu poate insera in codul obiect apelurile pentru operatiile de convers ie). Efectele atribuirii constau in: © evaluarea expresiei din dreapta operatorului de atribuir determinarea unei valori si a unui tip; © memorarea valorii expresiei din dreapta in variabila din stanga; 126 Bazele programiaril calculatoarelor eee pregrantr i coteutatoarctor, © intreaga expresie de atribuire are valoarea si tipul variabilei din stanga, Observatie: 0 instructiune simpld poate fi construita pe baza unei expresii. Exemple: 2°23 este o expresie de atribuire: este 0 instrucfiune care provosc& evaluarea expresiei de atrib este 0 expresie relafional; este 0 instructiune care provoacd evaluarea expresiei de atribuire Gin acest caz rezultatul nu are semnificajie algoritmica, deoarece nu este folos nici un fl) Deoarece atribuirea este 0 expresie, iar operandul din dreapia este 0 expresie, se pot compune expresii de forma: . + tveexpresie) intrucat operatorul de atribuire are prioritate mica, parantezele nu sunt necesare iar expresia devine vi-v-expresie. Evaluarca se face de la Greapta la stinga, aga cum sugereazi forma cu paranteze: se evalueazi cxpresie, In urma cireia variabila v primeste o valoare, care este si valoarea intregii expresii. Aceastd valoare este apoi atribuita variabilei v1 in acest mod se pot construi expresii cu mai multe atribuiri succesive. Dac este nevoie, inaintea atribuirilor se fac conversii. Valoarea care se atribuie (rezultaté in urma evaludrii expresiei) este convertita la tipul entity pierderi de informayie sau chiar coruperi ale valorii expresici Rezultatele imprevizibile provin din faptul cd nu se face conversie propriu-zisi ci copiere binara din reprezentarea interna a rezultatului evaludrii expresiei catre destinatie (tabelul 7.1). expresii care primeste valoarea. Ca urmare a acestor conversii pot sd apara Exemplu: atribuie valoarea ~76. Expres: Exerei Tema: adecva Tipd sige La | unsig | | unsig [sh (de exe Variabi acestei yramiri calculatoarelor tipul variabilei din baza unei expresii. xpresiei de atribuire; expresiei de atribuire ssece nu este folosit fn dreapta este 0 nic, parantezele nu luarea se face de la inteze: se evalueaz’ 20 valoare, care este ribuita variabilei v1 siri succesive, vers. Valoarea care © convertita la tipul onversii pot s apara esiei au se face conversie tem’ a rezultatului rea 180, iar lui b i se resi 7 finclude maint) (signed char a7 unsigned char b=234; int on4357 beer nr Temi: verificati exercitiul anterior, prin includerea unor funcfii de afigare adecvate. Tabelul 7.1, Pierderi de informatie in expresia de atribuire [ip destnafe [Tip expresie | [ ~ [daci valoarea este mai mare decat 127,| | signed char | unsigned char |destinatia va fi un imreg negativ, cu rezutat | imprevizibil Joctetul cel mai semnificativ, ew rezulat | imprevizibi | rezultat Observagii i unsigned char | [short] int ‘mal semnifc imprevizibil [cei mai semnificativi dot octefi, ou rezultat imprevizibil [partea intreaga a valoril, daca se incadreaz’ in | ansigned char | long in | [shore] int] tong ine | int float \domeniul tipului int, altel rezultat imprevizibil oat [~ double [se reduce precizia (eu rotunjire) double _[ long double [se reduce precizia (eu rotunjire) in practica programarii, se utilizeaza frecvent expresiile de forma op (exp: se) (de exemplu a=a+b-c). Se observa redundanja de exprimare pm specificarea variabilei v atit in membrul sting cat si in cel drept. Pentru eliminarea acestei redundanfe, s-au introdus operatorii combinati, cu forma generala ops 128 Bazele programériicalculatoarelor unde op este un operator binar, aritmetic sau logic pe biti (/, 8, *:- #5 <<>> &,*, 1). O expresie de forma v op= expre: lent cu este echi v = v op (expresie) Exemple: Expresia a-atb-c este echivalent cu a =5 este echivalenté 1=1*5. Expresia ¢ Efectele aplicdrii operatorului compus sunt: se evalueaza expresie, se aplict operatorul op intre valoarea lui v si rezultatul obtinut, iar valoarea obtinuté se atribuie lui v. 7.3. Operatorii aritmetici {n ordinea prioritatii lor, operatorii aritmetici sunt: i. operatori unari +, -, ++ -~ operatori binari multiplicativi -, /, + i. operatori binari aditivi +, Operatiile efectuate de acesti operatori sunt descrise in tabelul 7.2. Tabelul 7.2. Operatorii aritmetici I [ ‘Semnificafie operatie [Operator | |___Semnificafie operae Schimbare semn [ = | | Pastrare semn (nici un efeet, mueste folosit) | = Decrementare (post sau pre) [Tnerementare (post sau pre) [Adunare Sekdere (Trnmulfre [Tmpartire [Tmparfire intreaga (edtul) [ Tmparfire intreaga (restul) Obse Tntres opera ada dea (preir b. da expre sal v opera opera insear Exem Opera a. dac: be dac ctu, prin it bibliot Exemy Determ realizes ramirii calculatoarelor PUB Hay evalueaza expresie, Se obtinut, iar valoarea nt: crise in tabelul 7.2. presi Observafie: Cu exceptia operatorului %, care admite numai operanzi intregi, ceilalti admit toate tipurile numerice Operatorii ++ si -- au efect diferit. depinziind de pozitia fai de operand, astfel a. daca apar dea fi utilizaté Ia evaluarea expresiei din (preincrementare) sau ~-vax (predecrementare): b. daca apar dupa operand, valoarea acestuia este folositi la evaluarea expresiei din care face parte, apoi este modificata: vaz++ (postinerementare) sau var-~ (postdecrementare). Incrementare/decrementarea au ca efeet modificarea _valorii operandului cu o unitate, Semnificatia unei unita{i depinde de tipul aintea operandului, valoarea acestuia este modificata inainte are face parte: ++var operandului asupra ciruia se aplicd, Pentru operanzi numerici, 0 unitate 'seamnai un. Exemple: mute este echivalent eu s nx este echivalent eu seeve Operatorul % are ca rol objiner restului une impartiri intregi. funcgie de tipul operanzitor a. daca cel putin un operand este de tip real, se exeeuta imparjire re b. dacd ambii operanzi sunt intregi, se executa impartire intre Operatorul / are efect diferit, si se objine catul Calculul cdtului gi restului unei imparjiri intregi se poate realiza si prin intermediul funcjiei div. Rezultatul functiei are tipul div_f, definit in biblioteca sidlib.h astfel struct {long int qu long int xem ) dives Exemph Detemninarea cétului (ca) si vestului (rest) imparyrii numarului m la numarul n se realizeazi astfel: av 130 Bazele programirii cateulutourelor 7.4, Operatorii logici si relagionali Expresiile logice sunt cele care, in urma evaluatii produc, in interpretarea programatorului, valorile adevdrat sau fals. Astfel de valori sunt produse de dowd categorii de operatori: operatori logici propriu-zisi si operatori relational Operatorii logici sunt prezentati in tabelul 7.3. (in ordinea prioritatii) iar operatorii relajionali in tabelul 7.4, ‘Tabelul 7.3. Operatorii logic Si logic Sau logic Sau exclusiv logic Nu exist in limbajul C nu exist tipul de data logic. Operanzii asupra carora logici sunt convertiti in valori numerice si interpretayi si fals pentru zero. se aplica operator conform conventiei: adevdrat pentru valoare nenul Rezultatul unei operatii logice este de tip int, conform convent i: pentru adevarat valoarea | iar pentru fals valoarea 0. La evaluarea expresiilor logice se aplica principiul evaluarii partial dac expresia este de tip aditiv (operanzi legati prin operatorul sau), in momentul in care s-a stabilit c& un operand are valoarea adevdrat toata expresia va fi adewarata si nu se mai evalueazi restul operanzilor. Asemindtor, pentru o expresie multiplicativé (operanzi lega{i_ prin operatorul i), daca un operand are valoarea fals, expresia are valoarea fals si nu se mai evalueaza restul operanzilor. Operatia saw exclusiv intre doi operanzi a si 6 se efectueazd cu expresia !asib | |!bssa, conform tabelului urmator #0 #0 Ce relafiona R conventi P si se fae: fals), Exemplu: Expresia a negativ, re: De se recom. algoritmilk Lin tabelul 7.5, ini calcuatoarelor Expresit _ _ ist 2 B fa "(| tase | mesa | Yaceer Tibet 3 i 1 0 o 0 a) oo 0 0 #0 oo 1 0 T i i) #0 1 0 i 0 i ABrii_produe, in Astfel de valori ci propriu-zigi si rdinea priovitiii) azii asupra eérore cice si interpretati fals penttu zero. conventiei: pentru evaluarii parfale: peratorul sau), in ea adevarat toati estul operanzilor. anzi legati prin a are valoarea fas se efectueazi cu @ Operatorii relajionali sunt prezentati in tabelul 7.4. Operatorii relationali au acelagi nivel de prioritate Rezultatul unei operatii relationale este de tip int, conform conventiei: pentru adevarar valoarea 1, iar pentru fais valoarea 0. Pentru a nu se gresi la evaluarea unor expresii complexe, este indicat 8 se facd rafionamentul bazat pe logica boolean’ (cu valori de adeviirat $i fals). belul 7.4. Operatorii relationali Semnifieafie operatie | Operator ‘Mai mare > Mai mare sau egal > Mai mic < Mai mic sau egal Egal Diferit Tt Exemplu — Expresia 2<0) |ib> Deplasare la stings Operanzii pot fi de orice tip intreg. Daca este nevoie, operanzii sunt extingi la reprezentare pe 16 biti. Executia are loc bit cu bit. Pentru o pereche de biti (x.y), valorile posibile rezultate in urma aplicarii operatorilor ogici la nivel de bit sunt prezentate in tabelul 7.6 Tabelul 7.6. Rezultatele operatiilor logice pe biti Exemple: 1234 se reprezinti binar 10011010010; se extinde la 16. biti (0000010011010010; apoi se aplica operatorul de complementare fay de 1 1111101100101101 (64301 dacd operandul era ffr& semn, -1235 dac& era cu semn) +1234 se reprezint& binar 10011010010; se extinde la 16 biti (0000010011010010; se neaga: 1111101100101110; apoi se apliea operatorul de ‘complementare fafa de 1: 000001001 1010001 (1233), 1234 se reprezinti binar 10011010010; se aplicé operatorul de ‘complementare faf§ de 1: 1111101100101 101; apoi se neagl: 100110100111 (1235), Expresit Toti binare la sta Oper cu care se + sténga sau la Exemple: Daca este echivale cu valoare=\ cu impartire [valoare/2™ cdtului) Open valoare si an bitului din px octet) se po efectuarea 0 echivalent, p Exemple: 1. Urmatoarea 2. Urmatoares char), erator « nevoie, operancii sunt bit cu bit. Pentru o a aplicarii operatorilor ce pe biti se extinde la 16 bifi mplementare fata de 1 emn, -1235 daca era cu se extinde Ia 16 biti: >i se aplic& operatorul de se aplic&d operatorul de ‘agi: 10011010011 (1235) Expresii 133 Tot in categoria operatiilor la nivel de bit se incadreaza si deplasiirile binare la stnga sau la dreapta a c inutului unei variabile intregi: Operanzii sunt de tip intreg, iar numrdr_pocipit indica numarul de biti cu care se deplaseaza valoarea. Operatorul << are ca efect deplasarea la stdnga iar >> deplasarea la dreapta. La deplasare se propaga valoarea 0. la stanga sau la dreapta. Exemple: are valoarea 42: 00010101<<1 2222 are valoarea $: 00010101 00101010 > 0000101 Daca tipul primului operand este unsigned, deplasarea spre stanga este echivalenta cu inmultirea cu 2 (valoare <>numar_pozitii este echivalent cu valoare= [valoare/2"™""""), unde parantezele drepte semnificd partea intreagd a cdtutui). Operatia de ..mascare” (retinerea bitilor care intereseazi dintr-o valoare si anularea celorlalgi) este des intalnita in aplicatii. Retinerea valorii bitului din pozitia p dintr-un numar a (se considera cazul reprezentirii pe un octet) se poate face prin deplasarea la stinga a lui a cu p-I pozitii si efectuarea operatiei & cu masca Ox/ (cu reprezentarea 00000001) sau. echivalent, prin ,mascarea” lui a cu 2°" si deplasare la stinga cu p-? pozitii. Exemple: 1. Urmatoatea secvend afigeaza, in ordine, bifii unui octet (data de tip char). 2. Unmatoarea secventa afigeaza, in ordine inversi, bifii unui octet (dati de tip char), 134 __ Bacele programiriicaleutatoarclor Expres : 2 se sch vans operar perma 7.6. Operatorul virguld (,) Exem Operatorul virgula este specific timbajului C. Pe langé rolul de separator intr-o list, virgula este considerat& gi operator intr-o seeventa de forma: Dupae operayi ° O24 seus exprosio n lua ca Operatorul virguld (, ) induce evaluarea succesiva a expresiilor, de la stanga la dreapta, intreaga secventa flind tratati ca 0 expresie careia i se atribuie in final valoarea si tipul corespunzatoare ultimei expresii evaluate (expresie_n). Operatorul se utilizeazd acolo unde este legal si apara o expresie in program gi se doreste realizarea unui calcul complex. exprimat Dupae prin mai multe expresi asi Exemple: Valorite variabilelor dup evaluarea expresiei sunt: a=10, e=13. b=16. d-5 (cat Valor be pa eval : nt: 810, e=13. b=16. d=5 (catul octetia impartirii tui 10 ta 2 pa » Operate unde si 7.7. Operatorul de conversie explicit ih simple, sau un ¢ Limbajul ofera posibilitatea conversiei explicite a tipului unei expresii cltre un tip dorit de utilizator (dar compatibil), Expresia de si 5 . entiagii conversie are forma generala: at care tiv Se observa c& operatorul nu are un simbol explicit. El este format din Exempl numele unui tip de data inclis tntve paranteze. Construcjia este numita expresie cast (conversia explicit& se numeste typecast). Trebuie rejinut c& nu nari caleulatoarelor Expresit 13s ’e Langa rolul de 1-0 seeventa de a expresiilor, de la spresie careia i se expresii evaluate legal si apara o complex. exprimat 6. d=5 (cdl ite a tipului_unei tibil). Expresia de 1. Eleste format din truefia este numité rebuie rejinut c& nu se schimba efectiv tipul operandului, doar se foloseste in expresie valoarea operandului convertité la un alt tip. Operajia de conversie de tip nu are efect permanent. Exemple: Dupa execu seeventei, a are valoarea 7 (nu 7.0) nefiind afectatd in nici un fel de operatia de conversie de tip, iar b are valoarea 7.0 (obtinuta prin conversia valorii Ii a catre tipul floai). Dupa executia seeventei, care valoarea 16, obfinuti prin adunarea valorii lui @ (7) sia celei rezultate prin conversia valorii lui 4 cdtre tipul intr 9) 7.8. Operatorul dimensiune Operatorul dim june este folosit pentru a afla dimensiunea in octeti 2 spajiului de memorie ocupat de 0 variabila de sau definit de un tip. Operatorul are mnemonica sizeof si poate fi folosit in una din formele: Sau sau s unde (ip este numele unui tip de data iar var poate fi numele unei variabile simple, numele unui masiv, numele unui articol, un elemel sau un edmp al unui articol nt al unui masiv in primele dowd forme, rezultatul va fi numarul de octeti alocati entitajii respective. Pentru ultima forma, rezultatul este numérul de octeti pe care ii va ocupa o variabila de tipul sip Exemple: seo are valoarea 2 ant) are valoarea 2 136 Bazele progranvari catculatoarelor long double a{19]; sixeof(a(4)) are valoarea 10 (tipul Jong double se reprezint& pe 10 octeti) eof are valoarea 100 (10 elemente de tip long double) 7.9. Operatorii paranteze Parantezele au rolul de a include 0 expresie sau lista de parametti ai functiilor. Prin includerea subexpresiilor intre paranteze se modified ordinea de evaluare a unei expresii. Asupra unei expresii intre paranteze nu se pot aplica orice operatori (de exemplu nu se pot aplica operatorii de incrementare sau decrementare). Exemplu: construcfille (+3) 4 sau -~(a-b) sunt eronate, La apelul unei funcfii, parantezele rotunde ..()” sunt numite operatori de apel de functic, cle delimiténd lista parametilor reali Parantezele patrate ..{]" au rolul de a include expresii care reprezinta indict pentru accesarea elementelor unui masiv. Ele se numese operatori de indexare 7.10. Operatorul conditional Operatorul conditional este singurul care are trei operanzi si este specific limbajului C. Forma generald este unde expresie 1, expresie 2 si expresie 3 sunt expresii. Operatorul conditional are simbolul 2:. Cele dowd caractere care compun simbolul apar interealate intre cei trei operanzi, conform formei generale, Constructia se numeste expresie condijionald. Valoarea si tipul acestei expresii sunt identice cu cele ale expresie 2 (daca expresie_I este adevarata) sau cu cele ale expresie_3 (daca expresie_I este fals). Exemplu: Expresit Variabila D a pentru a bic camp atu e« adresa un ac pointer; ec valoarea ¢ ul obiectul p expresie unui set de i pentru am care tipuri As maxima) s in incadreaza aritmetice, \gramarié calculatoarelor reprezintl pe 10 octeti) long double) a de parametti ai e se modifica ordinea paranteze nu se pot aplica operatorii de sunt numite parametrilor reali care reprezintd indieci sumese operatori de ei operanzi si este expresii. Operatorul Eempun simbolul apar Pele. Constructia se tei expresii sunt 8) sau cu cele Expres 137 Variabila c primeste valoarea maxima dintre a sib (i cemplul de mai sus, 9). 7.11. Alfi operatori Din categoria operatorilor limbajului fac parte si urmatorii a. operatorul de calificare, cu simbolul . (caracterul punct), folosit pentru a accesa un cémp al unui articol; , operatorul de calificare (cu simbolul ->) folosit pentru a accesa un cAmp atunci cand se tie adresa unei structuri ©. operatorul de referentiere (cu simbolul &) folos adresa unei variabile t pentru a extrage 4. operatorul de referentiere (cu simbolul *) folosit pentru a defini un pointer; €. operatorul de dereferenjiere (cu simbolul *) folosit pentru a extrage valoarea de la o anumitd adresd. Ultimii patru operatori sunt specifici lucrului cu adrese (care nu face obiectul prezentei lucrari). 7.12, Evaluarea expresiilor Expresiile sunt evaluate pe baza urmétoarelor reguli: - Precedenja: determin’ ordinea de efectuare a operatiilor int expresie in care intervin mai multi operatori (gradul de prioritate); ordinea de efectuare a operatiilor in set de operatori cu aceeasi precedent’; - Regulile de conversie de tip: asigura stabilirea unui tip comun pentru ambi operanzi, pentru fiecare operatie care solicita acest Iueru si in care tipurile difera. Asociativitatea si precedenta operatorilor (incepand cu prioritatea maxima) sunt redate in tabelul 7.7. In concluzie, expresiile care pot fi construite in limbajul C se + Asociativitatea: indi sul unui incadreazi in urmétoarele categorii: expresii de atribuire, expresii aritmetice, expresii logice. expresii relationale. 138 Bazele programirii caleulatoarelor Opera ‘Tabelul 7.7. Precedenja operatorilor said Grad de Operatori Asociativitate ior ou. > dela sti pia maxim - de la dreapta la stanga - ASCII reprez - — extern 8.1, ja © tbinar de la stinga le dreapta - "> deta dreapia la stinga | - 5 de la stinga la dreapia minim ; princip | sitrans ) peecra tampon infor: corespu programtirit caleutatoarelor ilor Grad de prioritate maxim Operaratii de intearefesire 139 8. OPERATII DE INTRARE/IESIRE CU TASTATURA/MONITORUL Deoarece ta ialura si monitorul sunt dispozitive asimilate fisieretor ASCII, operatiile de intrarefiesire se realizeazi cu comersie intre mobila ete.) si cea ismul operatie’ de seriere este prezentat in reprezentarea interna a datelor (vi .virgul 4 | a — =e | eS erento. Forma ait ASCH) Forma de ssriere Fig. 8.1. Mecanismul operafiei de scriere Serierea pe ecran se desfisoara in doi pasi: datele din memoria principal (MP) sunt convertite in formatul extern de reprezentare (ASCII) si transferate intro zona tampon (pasul 1), de unde sunt preluate gi afisate pe ecran (pasul 2). La citire datcle sunt preluate de la tastatura si depuse intr-o zona tampon (buffer), in format ASCII (pasul 1). De aici se preiau. se convertese in formatul intern si se depun in memoria prineip in zonele corespunzitoare parametrilor functiilor de citire, Format de cine Fig. 8.2, Mecanismul operatiei de citire 140 Bazele programa calculatoarelor : Operarap Se observa cd operatia de conversie are loc numai la transferul intre imerealat Zona tampon si memoria principala. in general, in zona tampon datele sunt | i corespu pistrate in acelasi format eu dispozitivul extern asociat. Datorita orientérii spre portabilitate, in limbajul C nu au fost ese implementate instrucfiuni de intrare/iesire. Operatiile de intrare/ies realizeazi prin apelul unor functii de biblioteca. Cele mai des utilizate funcyii de bibliotec& pentru afisarea datelor sunt printf, puts, putch, la cate se adaugi macroul puichar. Cele mai des folosite functii de bibliotecd pentru citirea datelor de la tastaturd sunt scanf, gets, geich, getche, la care se adauga macroul gerchar. Funciiile prinif si scanf sunt numite functii de intrare/iegire cu format (folosesc descriptori de format). Pentru utilizarea acestora, trebuie incluse explicit in programul sursi header-e, prin directiva include: Utilizatorul isi poate defini propriile functii de intrare/iesire daca ior. cele predefinite nu corespund necesita 8.1. Deseriptori de format Funefiile de intrare/iesire cu format au urmatoareastructura a parametrilor: q Fiecdrui element din lista de intrare/iesire a operatiei de citire/scriere corespund’ un descriptor de format in sirul descriptor. Descriptorii de format se pun in corespondengi cu elementele listei de trebuie intrare/iesire de la stdnga la dreapta {in exemplu, descripiorii de format sunt precizafi prin £1. Primulué descriptor 3 ti corespunde variabila a, iar celui de-al doilea ii corespunde variabila 6, Sirul descriptorilor de format este incadrat intre ghilimele (este gir de caractere). in cazul funciilor de afisare, descriptorii de format pot fi unui dese ur reprezenti de repreac datei care formeazi Pe cadrul des oa seri; prez, iar un cara ol numer de « multe cara caractere c explicita, + dreapta, co sunt spati, nesemnificr oP, © valoare r¢ fractionara rotunjeste 1 numarul m sirului, oc semnificayia aril ealculatoarelor a transferul intre npon datele sunt C nu au fost intrarefiesire se aai des utilizate putch, la care se sibliotecd pentru ache, la care se umite funeii de Pentru utilizarea , prin directiva urare/iesire dac& area structurd a de citire/scriere sirul_ descriptor nentele listei de si descriptor © fi ab. ele (este gir de format pot fi Operaratt de imrarehesire 11 intercalati in textul care va fi afisat. Fiecarui descriptor de format trebuie i corespunda exact un element din lista de intrare/iesir. Formatele de intrare/iesire indeplinese simultan rolurile de: a) Sabloane ale modului de reprezentare externa a datelor, care ofera imatorilor un control mai bun al citiii/serierii datelor. ipul de conversie. Forma generals a pros b) Paramemr prin cate se indi unui descriptor este: atea Un descriptor oferd posi adririi si alegerea explicit’ a reprezentirii exteme a datei. Cadrarea se face implicit la dreapta, iar modul de reprezentare externa este ales automat de compilator, in functie de tipul ¢ afigeaza. In plus, in limbajul C, toti descriptor formeazii un parametru separat al funcjiei de intrare/iesire. Pentru scrierea datelor pe ecran se pot folosi urmatorii parametri in cadrul descriptorilor de format: © Cadraj: implicit datele se aliniazé la dreapta cémpului in care se soriu; prezenta unui caracter — (minus) determina alinierea datelor la sting iat un caracter + (plus) determing alinierea la dreapta. datei care s i de format ¢ Laime: reprezim& un numat care specifica ligimea cdmpului, in numat de caractere, in care se va scrie valoarea. Dac& valoarea necesita mai multe caractere decdt latimea dati explicit, afigarea se va face pe atitea caractere cate sunt necesare. Dacd lijimea necesara este mai mick decat cea explici Greapta, conform cadrajului specificat. Impli sunt spajii. Daci numarul care precizeaza lajimea incepe cu zero, caractercle nesemnificative sunt zerouri. * Precizie: indica precizi © valoare real, parametrul indica numarul de zecimele afisate. Dacd partea fractionara confine mai multe cife semnificative decdt precizia, se rotunjeste la ultima zecimala. Dacd data este un gir de caractere, indica numérul maxim de caractere care se vor afisa, indiferent de lungimea sirului. se completeaz cu caractere nesemnificative la stinga sau la it, caracterele nesemnificative acu care se va scrie data. Daca aceasta este © Cod_conversie: este format din unul sau douk caractere, cu semnificatia precizatd in tabelul 8.1 12 _ _Bazete programiritcateutatoaretor Open ‘Tabelul 8.1. Semnificatia codurilor de conversie (codt _ - cores Go8 | Semnifi Observati wes conversie d zecimal cu semn (int) intregi i zecimal cu sem (inf) 0 octal fira semn u zzecimal fra semn | pring esazecimal Fed semn (int) Vtere func x miei Intregi seanf: hexazecimal (if) printf: hexazecimal fir semn (int) litere X | mari intregi sean: hexazecimal (int) f Mirgul mobil dadd ddd Forma 8 mobile st matematic) i coro) : apelui ST Virgula mmobils FIdddd.e[ 18d CRormat Vos15 mobita sstiinjifie) ane " apelur 2 ‘ca $i fsau e, depinde de precizie vVirgula mobil param E [ea sie, utilizeaza litera E peniru exponent virgula mobila (adres GT ea gig, ullizeazd litera E pentru exponent virguli mobilé rebut © imprima un singur caracter - intregi ‘operat imprima caractere pind la ‘WO’ (NULL) sau = pani la prec = poaie si preceadé descriptorit d, 0, x sau u, au L | e820 care se face conversia din int spre | ine (impli | Jong; daca precede descriptorul £, se face neat > conversie din float spre double de suc caracterul % | kR>% printf TO format Pentru citirea datelor de la tastatur’, descriptorul de format poate Funeti contine urmatorii parametri optionali: Primul © [afime: un numar care specificd latimea maxima a cdmpului din de car care se va citi valoarea respectivas urmea: © un caracter asterise (se va citi de la tastatura valoarea respecti numae! rezulta dar nu va fi atribuita nici unei variabile). Exemy 1 imiarit catculatoarelor intregi intregi inregi inivegi intregi intregi vvirgula mobili virgulé mobili 15 mobil virgulé mobil virgulé mobil intregi siruri intregi Wh ai de format poate 2 a cmpului din sloarea respectiva, Operarait de intrarehesire 143 Daca tipul obiectului nu concord cu specific torul de format (codul), se objin rezultate imprevizibile (compilatorul nu controleazi Corespondenta si incearca s& fact reprezentarea conform descriptorului), 8.2. Funetii de seriere/citire cu format Pentru operatiile de citire/scriere cu format, se folosese urmitoarele func{ii definite in biblioteca standard sidio./.: dresa2> J; Apelul prinf tansfera valoti care vor fi afigate, iar apelul scanf transfer adrese ale variabilelor ale c&ror valori se vor citi. De aceea, la apelul funetiei pring parametri reali pot fi variabile, constante, expresii sau apeluri de functii care returneaza valori, in timp ce la apelul functiei scanf parametrii reali trebuie si fie adresele variabilelor ale caror valori citese (adresele unde se depun valorile citite de la tastatura). in cazul funetiei scen/ trebuie transmise explicit adresele variabilelor. in acest scop se foloseste operatorul &, care ,extrage” adresa unei variabile. + Funetia prinf Funetia executa serierea datelor pe unitatea standard de iesive numairul de octeti (caractere) atisate in caz de succes sau -1 in caz de eroare. Parametrul al funcjiei printf poate contine caracter format care definese conversiile care se aplicd asupra obiectelor precizate, Funetia printf poate fi folositi pentru a afisa una sau mai multe valori Primul parametru al functiei prinif are semnificatie prestabilita, fiind un gir de caractere care confine descriptorii de format pentru toate datele care urmeazi a fi afisati (urmatorii parametri). Deoarece funojia returneazdi numirul de octefi afigat se pot face verificdri suplimentare asupra rezultatelor operajiei de afigare Exemple: 1. prin (implicit monitorul) si retumneazs care se afigeazi ca atare gi deseriptori de Printe("ts™, "abe 144 ‘Ambele apeluri au acelasi efect si anume afisarea sirului de earactere abcde. nee imesicd", tANZ ‘Apelul are ca efect afigarea sirului# Aa. 3p ‘Apelul are ca efect afisarea sirului #a* 4, Apeturile au ca efect afigarea pe ecran a sirurilor: + abedet 5. prince ("tt0: 23458 ‘Apelul are ca efect afigarea sirului #000 6. prine#("#e200",123) nee ("si0x", 123) Apelurile au ca efect afisarea sirurilor # ae , respectiv # »b in sirul care defineste formatul pot fi incluse seevene escape Se pot folosi constituite din caracterul backslash si un alt caracter urmitoarele combinayii uzuale: ‘¢ \n (newline): determin trecerea cursorului Ja inceputul rndului urmator al ecranulu # \t (/ab orizontal): determin’ afigarea unui caracter tab (implicit 8 spatii) pe ecran; @ \n (bell): determina declansarea difuzorului intern pentru un sunet de durata si freeventi standard; «¢ \v (dab vertical): determina saltul cursorului cu 8 rénduri mai jos: «# \b (backspace): revenirea cu o pozitie inapoi © \r (carriage return): revenire la inceputul randului curent. + Funcfia seanf Funcfia executé citirea datelor de Ja unitatea standard de intrare (implicit tastatura) si returneszi numdrul de cAmpuri corect procesate. Parametrul poate contine, in afara codurilor de conversie, caractere care vor trebui introduse ca atare de la tastatura in cadrul campului respectiv, Oper Exer trebu carac urmé spec litere (daci cont spec une Eroa lung Exe posil sndrii cateutatoarelor ere abede. tiv bl ter. Se pot. folosi wenfe escape inceputul réndului scter fab (implicit 8 em pentru un sunet 3 randuri mai jos: lui curent. standard de intrare iri corectprocesate. sdurilor de conversie, rain cadrul cémpului Qperarait de intrarehesire 148 Exemplu: Daca sirul descriptor conjine secvenia atunei de la tastatu trebuie introdus =< Caracterele .albe” (spatiu, tab) din cadrul sirului descriptor se ignori. Cémpul controlat de un specificator de format incepe cu primul caracter curent care nu este alb” si se termina in unul din cazurile urmatoare: © lacaracterul dupa care urmeaza un caracter ..alb”: la caracterul dupa care urmeazi un caracter_necorespunzitor specificatorului de format care controleazi cémpul respectiv (de exempht litere pentru tipul numeric); © Ia caracterul prin care se ajunge la lungimea maxima a cdmpului (daca lungimea a fost specifi i). in cazul cititii de caractere nu se aplicd aceasta regula, cémpul conjinénd un caracter oarecare, in cazul prezenjei unui caracter * in specificatorul de format, valoarea introdusé de la tastatu nu se atribuie nici tunei variabile si nu ii va corespunde un element din lista de intrarefiesire. Citirea se intrerupe in cazul unei erori, in locul in care s-a produs. att de: Eroarea poate fi = necorespondenta itre textul curent introdus si spe format care controleaza campul respeetiv - neconcordanta intre data din cdmp si specificatorul de format sub controlul caruia se face citirea. La citire. datele externe pot fi separate prin spatiu. tab. CR/LF sau virgula sau pot fi texte externe cu lungimi prestabilite (se precizeaa Jungimea textului exten), Exemple: > separate prin spagiu 3", 2,ay)> => Separate prin virgula > xeste sir de 5 caractere, y este sir de 2 caractere Deoarece numele masivelor de date sunt pointeri, atunei eand este posibila specificarea numelui, nu mai este nevoie de operatorul &.

You might also like