Sunteți pe pagina 1din 7

======== Capitolul 7 ======== ========================================= Tipurile enumerare, "typedef", si operatori pentru biti ========================================= -------------------------Tipurile enumerare ------------------------Pentru declararea

tipurilor enumerare se foloseste cuvantul rezervat "enum". Acesta va implica denumirea multimii, enumerarea elementelor (numite enumeratori), ca elemente ale multimii. ----------Exemplu: ----------enum zile {luni, marti, miercuri, joi, vineri, sam ata, duminica!" Aceasta declaratie creeaza tipul utilizator "enum zile". #uvantul rezervat "enum" este urmat de identificatorul "zile". Enumeratorii sunt identificatorii luni, marti, ... . Acestea sunt constante de tip "int". Prin conventie, primul este $, si apoi restul sunt incrementati. %eclararea varia ilelor de tip "enum zile" se face astfel: enum zile zi&, zi'" (aria ilele "zi&" si "zi'" pot lua ca valori elemente ale acestui tip. %e exemplu, zi& ) miercuri" va asi*na varia ilei "zi&" valoarea miercuri. +nstructiunea if (zi& )) zi') { ... ! va testa daca valoarea varia ilei "zi&" este e*ala cu valoarea varia ilei "zi'". Enumeratorii pot fi initializati. %e asemeni, putem declara varia ilele in timpul definirii tipului "enum". ----------Exemplu: ----------enum carti {trefla ) &, caro, frunza, inima! a, , c" %in moment ce "trefla" este initializata cu &, rezulta ca "caro", "frunza" si "inima" sunt initializate cu ', ,, respectiv -. ----------Exemplu: ----------enum fructe {mere ) ., pere, portocale ) ,, lamai! nr/frct" Este clar ca "pere" va fi initializat cu 0, iar "lamai" cu -. 1umele tipului enumerare poate lipsi, insa atunci nu mai putem declara alte varia ile de acel tip. ----------Exemplu: ----------enum {plop, molid, rad! copaci" 2in*ura varia ila de tip "enum {plop, molid, rad!" este copaci (nu se mai poate declara alta). ----------------------------Folosirea lui "typedef" ----------------------------# pune la dispozitie facilitatea "t3pedef" pentru redenumirea tipurilor deja existente.

----------Exemplu: -----------

t3pedef int culoare" culoare rosu, verde, al astru"

Acesta defineste tipul "culoare" ca fiind un sinonim al lui "int". Apoi declaram trei varia ile de tipul "culoare". ----------Exemplu: ----------(om ilustra folosirea lui "t3pedef" pentru un tip enumerare (creand o functie ce returneaza ziua urmatoare). enum zile {duminica, luni, marti, miercuri, joi, vineri, sam ata!" t3pedef enum zile zi" zi *aseste/ziua/urmatoare(zi z) { zi ziua/urmatoare" s4itc5(z) { case duminica: ziua/urmatoare ) luni" rea6" case luni: ziua/urmatoare ) marti" rea6" ... case sam ata: ziua/urmatoare ) duminica" rea6" ! return ziua/urmatoare" ! 7 alta versiune (mai succinta) folosind "cast" este: enum zile {duminica, luni, marti, miercuri, joi, vineri, sam ata!" t3pedef enum zile zi" zi *aseste/urmatoarea/zi(zi z) { return ((zi)(((int) z 8 &) 9 .))" ! ----------------------------------Expresii si operatori pe biti ----------------------------------7peratorii pe iti lucreaza cu expresii inte*rale reprezentate ca siruri de cifre inare. Acesti operatori sunt dependenti de sistem. 7peratorii pe iti sunt: 7peratori lo*ici -------------------&. #omplement pe it (unar): '. 2i pe it : ,. 2au exclusiv pe it : -. 2au inclusiv pe it : 7peratori de deplasare ---------------------------&. %eplasare stan*a '. %eplasare dreapta

: ; < =

: >> : ??

#a si ceilalti operatori, operatorii pe iti au re*uli de precedenta si asociativitate care determina precis cum se evalueaza expresiile ce contin astfel de operatori. 7peratorul : este unar, restul operatorilor sunt inari si lucreaza cu tipuri inte*rale. ------------------------Complement pe bit

------------------------7peratorul : se numeste operator de complement (sau operator de complement pe it). Acesta inverseaza reprezentarea sirului pe iti, adica $ devine & si & devine $. ----------Exemplu: @ie declaratia ----------int a ) A&.&" Beprezentarea inara a lui a este: $$$&$&$$ $$&&$$&& Expresia :a este: &&&$&$&& &&$$&&$$ Aceasta are valoarea intrea*a - A&.' ------------------------------Complement fata de doi ------------------------------Beprezentarea complementului fata de doi a unui numar natural este un sir de iti o tinut prin complementarierea scrierii lui n in aza '. #onsiderand complementul pe iti al lui n la care adunam &, o tinem reprezentarea complementului fata de doi a lui -n. 7 masina care utilizeaza reprezentarea complementului fata de doi ca reprezentare inara in memorie pentru valori inte*rale se numeste masina complement fata de doi. Beprezentarile complement fata de doi ale lui $ si -& sunt speciale. Astfel valoarea $ are toti itii "off", pe cand valoarea -& are toti itii "on". 1umerele ne*ative sunt caracterizate prin aceea ca au itul cel mai semnificativ &. Pe masinile care utilizeaza complementul fata de doi, 5ard-ul permite implementarea scaderii ca o adunare si un complement pe iti. 7peratia a - este aceeasi cu a 8 (- ), unde - se o tine considerand complementul pe iti al lui la care adunam &. --------------------------------------Operatori logici binari pe biti -------------------------------------#ei trei operatori ; (si), < (sau exclusiv) si = (sau inclusiv) sunt inari si au operanzi inte*rali. 7peranzii sunt operati it cu it. Ca elul de mai jos contine semantica lor: a a; a< a= -------------------------------------------$ $ $ $ $ & $ $ & & $ & $ & & & & & $ & ----------Exemplu: Presupunem ca avem declaratiile si initializarile ----------int a ) ,,,,, ) ...." Expresie Beprezentare (aloare ----------------------------------------------------------a $$$$&&$& $$$$$&$& ,,,, $$$&&&&$ $&&$$$$& .... a; $$$$&&$$ $$$$$$$& ,$., a< $$$&$$&& $&&$$&$$ -DEa= $$$&&&&& $&&$$&$& 0$,. :(a = ) &&&$$$$$ &$$&&$&$ -0$,0 (:a ; : ) &&&$$$$$ &$$&&$&$ -0$,0 ------------------------------------------------------------------------------------------------------------Operatori de deplasare stanga si dreapta ---------------------------------------------------#ei doi operanzi ai unui operator de deplasare tre uie sa fie expresii inte*rale. Cipul returnat de expresie este dat de operandul

din stan*a. 7 expresie de forma expresie& >> expresie' implica reprezentarea pe it a lui "expresie&" sa fie deplasata catre stan*a cu un numar de pozitii specificat de "expresie'". +n capatul din dreapta, vor fi adau*ate $-uri. ----------Exemplu: ----------c5ar c ) FGF"

-----------------------------------------------------------------------Expresie Beprezentare Actiune -----------------------------------------------------------------------c $&$&&$&$ nedeplasat c >> & &$&&$&$$ deplasare la stan*a cu & c >> &$&$$$$$ deplasare la stan*a cu c >> &A $$$$$$$$ deplasare la stan*a cu &A -----------------------------------------------------------------------#5iar daca valoarea lui "c" se memoreaza pe un octet, intr-o expresie aceasta ia tipul "int". %eci valoarea expresiilor "c >> &", "c >> -" si "c >> &A" se memoreaza pe doi octeti. 7peratorul de deplasare la dreapta "??" nu este c5iar simetric cu ">>". Pentru expresiile inte*rale fara semn, din stan*a se va deplasa $, iar pentru cele cu semn &. ----------Exemplu: ----------Presupunem ca avem declaratiile: int a ) & >> &A" unsi*ned ) & >> &A" --------------------------------------------------------------------------Expresie Beprezentare Actiune --------------------------------------------------------------------------a &$$$$$$$ $$$$$$$$ nedeplasat a ?? , &&&&$$$$ $$$$$$$$ deplasare la dreapta cu , &$$$$$$$ $$$$$$$$ nedeplasat ?? , $$$&$$$$ $$$$$$$$ deplasare la dreapta cu , -------------------------------------------------------------------------#a valoare intrea*a, a ?? , este --$DE, iar din matematica. ?? , este -$DE, lucru care este in concordanta cu notiunea de numar ne*ativ si pozitiv

%aca operandul din dreapta a operatorului de deplasare este ne*ativ sau are o valoare care este e*ala sau depaseste numarul de iti folositi pentru reprezentarea operandului din stan*a, atunci comportarea este nedefinita. Ca elul de mai jos ilustreaza re*ulile de precedenta (8 este mai prioritar) si asociativitate (de la stan*a la dreapta) referitoare la operatorii de deplasare. ----------Exemplu: Presupunem ca avem: unsi*ned a ) &, ----------) '"

-----------------------------------------------------------------------------------------------Expresie Expresie ec5ivalenta Beprezentare (aloare -----------------------------------------------------------------------------------------------a >> ?? & (a >> ) ?? & $$$$$$$$ $$$$$$&$ ' a >> & 8 ' >> , (a >> (& 8 ')) >> , $$$$$$$$ $&$$$$$$ Ea 8 >> &' H a ?? ((a 8 )>>(&' H a))?? $$$$&&$$ $$$$$$$$ ,$.' ------------------------------------------------------------------------------------------------------Masti -------7 "masca" este o constanta sau varia ila folosita pentru extra*erea itilor doriti dintr-o alta varia ila sau expresie. %in moment ce constanta "int" & are reprezentarea pe iti:

$$$$$$$$ $$$$$$$& aceasta poate fi folosita pentru determinarea itului cel mai nesemnificativ dintr-o expresie "int". #odul de mai jos foloseste aceasta masca si tipareste o secventa alternativa de $ si &: int i, masca ) &" for (i ) $" i > &$" 88 i) printf("9d", i ; masca)" %aca dorim sa *asim valoarea unui anume it dintr-o expresie, putem folosi o masca care este & in acea pozitie si $ in rest. ----------Exemplu: ----------Putem folosi expresia & >> ' pentru a vedea al treilea it (numarand de la dreapta). Expresia (v ; (& >> ')) I & : $ are valoarea & sau $ dupa cum este al treilea it din "v". Alt exemplu de masca este valoarea constanta 'AA (adica '<0 -&). Ea are reprezentarea $$$$$$$$ &&&&&&&& %eoarece doar octetul din dreapta este plasat pe "on", atunci expresia v ; 'AA va intoarce o valoare ce are reprezentare pe iti cu toti itii din octetul din stan*a "off" si cel din dreapta identic cu octetul din dreapta a lui "v". 2punem ca 'AA este o masca pentru octetul din dreapta. ------------------------------------------------------------------------n program de impac!etare si despac!etare a cu"intelor ------------------------------------------------------------------------2tim ca un caracter se memoreaza pe un octet, pe cand un intre* pe doi octeti. @olosind operatorii de deplasare, putem comprima doua caractere intr-un intre*. Jinclude >limits.5? Jinclude >stdio.5? Jinclude >conio.5? void it/print(int a) { int i" int n ) sizeof(int) H #KAB/L+C" int masca ) & >> (n-&)" for (i ) &" i >) n" 88i) { putc5ar(((a ; masca) )) $) I F$F : F&F)" a >>) &" if (i 9 #KAB/L+C )) $ ;; i > n) putc5ar(F F)" ! ! int pac6(c5ar a, c5ar ) { int p ) a" p ) (p >> #KAB/L+C) = " return p" ! c5ar unpac6(int p, int 6) MH 6 ) $, & HM { int n ) 6 H #KAB/L+C" MH n ) $, 0 HM unsi*ned masca ) 'AA"

masca >>) n" return((p ; masca) ?? n)" ! void main() { clrscr()" it/print(EA)" printf("Nna ) ")" it/print(pac6(FaF, F F))" putc5ar(FNnF)" *etc5()" printf("1umarul '-D,$ este impac5etarea caracterelor 9c si 9c", unpac6('-D,$,&), unpac6('-D,$,$))" *etc5()" ! -------------------------------#itere mari -$ litere mici -------------------------------Beluam un exemplu dintr-un capitol precedent si anume transformarea literelor mari in mici folosind operatori de deplasare. Jinclude >stdio.5? Jinclude >conio.5? Jinclude >ct3pe.5? void main() { clrscr()" int c" 45ile ((c ) *etc5ar()) O) E7@) { if (isupper(c)) MM sau (c?)FAF ;; c>)FGF) putc5ar(c = (& >> A))" else putc5ar(c)" ! ! ----------------%ecapitulare ----------------+n cele ce urmeaza, vom preciza cum se calculeaza valoarea unui numar pozitiv, respectiv ne*ativ (in memoria calculatorului). @ie declaratia int a" #onsideram reprezentarea sa in aza ' /////////////////////////////// //////////////////////////// =//////=//////=//////////////=///= =///=///=/////////////////=///= /{&E! /{&A! . . . . . . . /D /0 /. ....... /& %aca /{&E! ) $ atunci a ) suma/{j)&!<{&A! /jH'<j altfel consideram reprezentarea in aza ' a complementului lui a (:a) /////////////////////////////// ///////////////////////////// =///////=//////=////////////=////= =////=////=///////////////=////= F/{&E! F/{&A! . . . . . F/D F/0 F/. . . . . . . F/& unde F/j ) & - /j" :a ) suma/{j)&!<{&A! F/jH'<j" -a ) :a 8 &" a ) -(:a 8 &)" sfarsit. ----------------------------------------------Exercitii propuse spre implementare -----------------------------------------------

&. (Pocul 5artie, pumn, farfece) Presupunem ca avem doi jucatori care folosesc mana dreapta pentru reprezentarea a trei o iecte: 5artie ) palma intinsa pumn ) mana stransa su forma de pumn foarfece ) do ua de*ete departate (semnul (ictoriei) Ei isi arata simultan mana dreapta in una din aceste confi*uratii (de mai multe ori). %aca ei arata acelasi lucru, este remiza (nu casti*a nimeni). %aca nu se aplica una din urmatoarele trei re*uli: a) Kartia acopera pumnul. (deci palma intinsa casti*a fata de pumn) ) Pumnul spar*e foarfecele. c) @oarfecele taie 5artia. 2a se simuleze acest joc, facand un numar ar itrar de evenimente precizand scorul final. 2e cere sa se joace persoana-calculator, si varianta a doua calculator-calculator. '. 7 ruleta este o masina care selecteaza la intamplare un numar intre $ si ,A la intamplare. Pucatorul poate paria pe un numar parMimpar sau poate paria pe un numar oarecare. #asti*ul unui pariu parMimpar se premiaza cu 'M& dolari, cu exceptia celor in care ruleta ale*e $. %aca jucatorul "prinde" numarul selectat de ruleta, atunci este platit cu ,A ... & dolari. +ntre are: #onsiderand ca jucam pariuri de & dolar, cate parieri tre uie sa facem astfel incat sa pierdem &$ dolari I ,. @olosind functia " it/print" construiti un ta el (cu trei coloane) care sa contina n, reprezentarea inara a lui '<n, reprezentarea inara a lui '<n-&, pentru n ) $, &, ', ..., ,'. Apoi, afisati un ta el (tot cu trei coloane) care sa contina n, &$<n si &$<n-& pentru n ) $, &, ', ..., . (in aza zece). #e asemanare o servati I -. Gilele secolului '$ pot fi notate folosind intre*i in forma "ziMlunaMan". %e exemplu, &M.MD, inseamna & iulie &DD,. 2crieti o functie care memoreaza ziua, luna si anul compact, astfel: a) pentru zile (maxim ,&) sunt suficienti A iti" ) pentru luna (&') sunt suficienti - iti" c) pentru ani (&$$) sunt suficienti . iti" @unctia tre uie sa ai a la intrare ziua, luna si anul ca intre*i si tre uie sa returneze data "impac5etata" pe un "intre*" pe &E iti. 2crieti inca o functie care face "despac5etarea". A. @olosind operatori pe iti, scrieti pro*rame # care: a) testeaza daca un numar de tip "int" sau "lon*" este divizi il cu 0. Qeneralizare (divizi ilitate cu '<n)" ) testeaza daca un numar este pozitiv sau ne*ativ" c) calculeaza pentru un n dat, multiplii de ', -, ... Qeneralizare" d) calculeaza pentru un n dat, RnM'S, RnM-S, ... Qeneralizare" e) calculeaza m<n, folosind reprezentarea in aza ' a lui n si metoda "divide et impera" (vezi exercitiul ' din capitolul E). E. 2a se calculeze suma cifrelor unui numar cu n cifre.

S-ar putea să vă placă și