Sunteți pe pagina 1din 43

Capitolul 3 - Expresii n C.

Funcii de intrare/ieire uzuale pentru consol

22

Expresiile sunt combina\ii valide sintactic de date =i operatori. Aici, prin date, ]n\elegem deopotriv[ constante =i variabile. Spre deosebire de constante care sunt valori fixe, variabilele semnific[ valori care se pot modifica prin program. }n C, ca =i ]n alte limbaje, datele sunt clasificate ] n tipuri de date. xist[ tipuri de date fundamentale !numite =i predefinite , simple sau de baz[" =i tipuri de date derivate . #ipurile derivate !tablouri, pointeri, structuri, uniuni, enumer[ri =i orice tip definit de programator" se ba$ea$[ pe tipurile fundamentale.

IPURILE FUNDAMENTALE DE DATE

N!

#ipurile de date fundamentale din C se ]mpart ]n cinci categorii% "#ar, int, fl$at, d$uble =i v$id. &rimele patru tipuri se mai numesc =i tipuri aritmetice =i se refer[ respectiv la valori caracter, ]ntregi, reale ]n simpl[ preci$ie =i reale ]n dubl[ preci$ie. #ipul de date v$id indic[ absen\a oric[rei valori =i este utili$at, de exemplu, la descrierea func\iilor care nu returnea$[ nici o valoare. 'imensiunea $onei de memorie alocate =i domeniul de valori asociate tipurilor aritmetice pot s[ difere func\ie de varianta de implementare a limbajului =i de tipul de procesor folosit.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

23

Standardul A(S) C nu preci$ea$[ dec*t domeniul minimal de valori al fiec[rui tip de date, nu =i dimensiunea sa. }n majoritatea implement[rilor ]ns[, tipul "#ar ocup[ un octet, int ocup[ doi octe\i, iar fl$at patru octe\i. 'omeniul de valori poate fi modificat utili$*nd m$difi"at$rii de tip. Ace=tia sunt% si%ned, unsi%ned , s#$rt =i l$n%. +odificatorii si%ned, unsi%ned , s#$rt =i l$n% se pot aplica tipului int, si%ned =i unsi%ned , tipului "#ar, iar l$n%, tipului d$uble. fectul aplic[rii modificatorilor si%ned sau unsi%ned asupra tipurilor de date ]ntregi const[ ]n interpretarea diferit[, din punct de vedere al semnului, a informa\iei memorate. S[ consider[m o configura\ie binar[ de lungime (, bi\ii fiind numerota\i ca mai jos%

(,-

(,.

Figura 3.1 Configura\ie binar[ de N bi\i 'ac[ aceast[ $on[ o destin[m memor[rii doar a ] ntregilor po$itivi, printr,un calcul simplu se poate vedea c[ plaja de repre$entare este [0, .(,-]. 'ac[ $ona este destinat[ memor[rii at*t a ]ntregilor cu semn c*t =i f[r[ semn, bitul (,- va fi folosit pentru repre$entarea semnului !0 pentru numere po$itive, pentru numere negative", iar plaja de repre$entare va fi [,.(,-, .(,-,-]. Av*nd ]n vedere aceste considera\ii , de exemplu, o variabil[ de tip si%ned int va avea un domeniu de valori cuprins ]ntre ,1.234 =i 1.232, iar una de tip unsi%ned int va lua valori ]ntre 0 =i 35515. Observa\ii:

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

24

Pentru tipul ]ntreg de date ( char, int, short, long) reprezentarea implicit[ este signed. Specificarea unui modificator f[r[ tip ] nseamn[ considerarea implicit[ a tipului int. }n C nu e ist[ tipul de date boolean. !in acest moti" func\ioneaz[ urm[toarea con"en\ie# orice e presie diferit[ de zero are "aloarea adev[rat, iar dac[ e egal[ cu zero, "aloarea fals.

ARIA&ILE 'I TIPURI DE DATE


Asocierea dintre numele unei variabile =i un anumit tip de date se face folosind declara\iile. 6orma general[ a de"lara(iei unei variabile este% unde%
tip lista_de_variabile;

tip poate fi orice tip de date recunoscut ]n C, iar lista_de_variabile con\ine unul sau mai mul\i

identificatori desp[r\i\i prin virgul[. }n exemplele de mai jos vom folosi doar tipurile fundamentale. Exemple de declara\ii de "ariabile#
float x,y; int a,b1; short a_x,b_y; double z;

7rice variabil[ folosit[ ]n program trebuie mai ]nt*i declarat[. 'ac[ pe linia de declarare variabila este ini\iali$at[ se spune c[ are loc o definire a variabilei . Exemple de declara\ii $i defini\ii de "ariabile#
float x=38.981, ; int ab=!"#3; $har $h=%&%,z;

7rice variabil[ definit[ !adic[ declarat[ =i ini\iali$at[" p[strea$[ ]n continuare atributul de ba$[ al

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

25

variabilei, adic[ poate fi modificat[. 'ac[ se dore=te 8]ng9e\area: asocierii dintre o variabil[ =i o anumit[ valoare se utili$ea$[ m$difi"at$rul de a""es !sau "alifi"at$rul" "$nst. &ractic, efectul unei declara\ii de genul
$onst tip nu'e_variabila;

este crearea constantei simbolice nu'e care poate fi utili$at[, dar nu poate fi modificat[ prin program. 'ac[ tip lipse=te se consider[ implicit c[ tipul este int. }n exemplul de mai jos se definesc dou[ constante, constanta pi =i constanta de tip int, ore_zi. Exemplu:
$onst double pi=3.1"1#9()#3); $onst ore_zi=(";

)N*TANTE 'I TIPURI DE DATE


}n !apit$lul + !ve$i paragraful ,$"abularul limba-ului ", am pre$entat o clasificare a constantelor ] n% ]ntregi, reale, caracter, =ir. Se pune problema, c[rui tip de date ]i apar\ine o constant[ numeric[; C*nd constanta este caracter, r[spunsul este simplu% tipului "#ar. 'e asemenea, constanta ]n virgul[ mobil[ !]n nota\ie u$ual[ cu punct sau ]n nota\ie =tiin\ific[" va apar\ine tipului d$uble. &entru celelalte constante numerice compilatorul va considera implicit ]ncadrarea ]n cel mai mic tip de date compatibil. 'e exemplu, (3 este de tip int, )#*** de tip unsi%ned , (*****( de tip l$n% int. }ncadrarea ]ntr,un tip de date se poate face =i explicit ad[ug*nd constantei unul din sufixurile + sau ,, dac[ e ]ntreag[ sau - sau +, dac[ e real[. Constanta ] ntreag[ cu sufixul + este de tip l$n%, iar cu sufixul ,, de tip unsi%ned . Constanta real[ cu sufixul - are tipul

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

26

fl$at, iar dac[ e urmat[ de sufixul + are tipul l$n% d$uble.

UN!.II U/UALE DE INTRARE0IE'IRE PENTRU !)N*)L12 DE*!RIPT)RI DE F)RMAT


&re$ent[m ]n continuare func\iile folosite frecvent pentru transferul de date de la tastatur[ ]n memoria calculatorului !fun"(ii de intrare " =i din memoria calculatorului pe ecran ! fun"(ii de ie3ire "< cu aceast[ oca$ie introducem =i des"ript$rii de f$rmat cei mai folosi\i. 'eosebim trei categorii de func\ii de intrare=ie=ire pentru consol[% func\ii generale de intrare=ie=ire ! s"anf45 =i printf45"< func\ii speciale de intrare=ie=ire% func\ii pentru citirea =i scrierea caracterelor< func\ii pentru citirea =i scrierea =irurilor de caractere.

FUN!.IILE PRINTF45 'I *!ANF45 Aceste func\ii repre$int[ ec9ivalentele pentru consol[ a func\iilor de intrare=ie=ire pentru fi=iere, fprintf45 =i fs"anf45, func\ii care vor fi pre$entate ]n detaliu ]n !apit$lul 67. 6orma general[ a func\iei de afi=are printf45 este%
int printf.sir_for'at,lista_de_ar/u'ente0;

unde%

sir_for'at poate con\ine% mesaje pentru utili$ator,

secvente escape =i descriptori de format pentru valorile care se afi=ea$[< lista_de_ar/u'ente repre$int[ variabile sau expresii al c[ror con\inut se va afi=a.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

27

6unc\ia ]ntoarce num[rul de caractere scrise efectiv sau o valoare negativ[ ]n ca$ de insucces. reci![ri: !escriptorii de format ser"esc la efectuarea con"ersiilor dintre reprezentarea e tern[ $i intern[ (la citire) $i ]ntre reprezentarea intern[ $i e tern[ (la scriere)% formatul e tern presupune succesiuni de caractere, iar cel intern succesiuni de cifre binare% &t't la scriere c't $i la citire, descriptorii de format sunt pu$i ]n coresponden\[ de la st'nga spre dreapta cu elementele listei de argumente. &rgumentul trebuie s[ fie compatibil cu tipul anun\at ]n descriptorul de format corespunz[tor% !ac[ num[rul de argumente este mai mic dec't num[rul descriptorilor de format, datele de ie$ire sunt nedefinite% dac[ num[rul argumentelor este mai mare dec't num[rul descriptorilor de format, argumentele ]n plus sunt ignorate. }n #abelul 1.- pre$ent[m lista celor mai utili$a\i descriptori folosi\i de func\ia printf45 =i semnifica\ia lor.

"abelul 3.1 !escriptori de format Des"ript$ri


1u 1d sau 1i 1$ 1f 1e sau 1 2 1x sau 13 1o 1s

Utilizare numere ]ntregi $ecimale f[r[ semn numere ]ntregi $ecimale cu semn caracter numere reale ]n nota\ie u$ual[ numere reale ]n nota\ie =tiin\ific[ !e sau " 9exa$ecimal f[r[ semn !litere mici sau majuscule" octal f[r[ semn =ir de caractere

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

28

1/ sau 14

1p

se alege repre$entarea cu num[rul cel mai mic de caractere dintre cea ]n nota\ie u$ual[ =i cea ]n nota\ie =tiin\ific[ !de tip e sau " valoare pointer

'escriptorul 1x are ca efect afi=area cifrelor 9exa$ecimale &,5,6,7,2,- cu liter[ mic[< dac[ se folose=te 13 se afi=ea$[ cu litere mari. 'ac[ se folose=te 1e litera 8e8 din nota\ia =tiin\ific[ apare ca e, iar dac[ se folose=te > , apare ca majuscul[ !litera 2". ?alorile de tip l$n% int se afi=ea$[ utili$*nd 1ld, 1li,1lu,1lo sau 1lx. ?alorile de tip s#$rt int se afi=ea$[ utili$*nd 1hd, 1hi,1hu,1ho sau 1hx. &entru a afi=a valori d$uble se va alege una din variantele% 1lf,1le,1l2,1l/,1l4, iar pentru valori l$n% d$uble una din variantele% 1+f,1+e,1+2,1+/,1+4. #abelul 1.- pre$int[ descriptori de format f[r[ caracteristici de lungime, preci$ie =i aliniere. 6olosi\i astfel, ei alinia$[ implicit valorile la st*nga =i folosesc spa\iu de afi=are necesar repre$ent[rii acestor valori dup[ cum urmea$[% 1f afi=ea$[ implicit partea ]ntreag[, punctul =i 3 cifre la partea subunitar[< 1e sau 12 afi=ea$[ implicit o cifr[ la partea ] ntreag[, 3 cifre la partea subunitar[, caracterul e sau 2 =i exponentul precedat de 9 sau !< 1/ sau 14 alege repre$entarea cu cel mai mic num[r de caractere dintre cea u$ual[ =i cea =tiin\ific[. 1d,1i,1$,1o,1x,13,1s,1p folosesc un num[r de coloane egal cu num[rul de caractere ce trebuie afi=ate.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

29

xemplific[m folosirea descriptorilor pre$enta\i =i a secven\elor de evitare cu ajutorul urm[toarelor

&fi$area "alorilor $i sumei a dou[ numere ]ntregi, sub forma#


x=valoare y=valoare su'a=valoare
# include "stdio.h" void main(void) { int x=10, y=-43; !int" ("#n#tx=$d#t#y=$d#n#t &

suma=$i", x,y, x%y);

programe%

&fi$area unei constante ]ntregi $i a "alorilor sale ]n octal $i (e azecimal pe c'te un r'nd.
#include "stdio.h" void main(void) { const x=4'(); !int"("#n numa!ul este=$d#n",x); !int"("#n valoa!ea in octal este=$o",x); !int"("#n valoa!ea in hexa*ecimal este=$x",x); }

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

30

&fi$area unui caracter $i a codului s[u &SC))% afi$area se "a termina cu un semnal sonor.
#include "stdio.h" void main(void) { cha! a=./.; !int"("#n ca!acte!ul $c a!e codul 01233=$i#a",a,a); &

&fi$area unor "alori folosind di"er$i descriptori de format% comentariile arat[ efectul e ecu\iei func\iei printf.0.
#include "stdio.h" void main(void) { cha! ch; sho!t +; int i; lon, int -; "loat x; cl!sc!();

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

31

ch=.0.; !int"("#n 2a!acte!ul $c a!e codul 01233 = $i",ch,ch); 45 2a!acte!ul 0 a!e codul 01233 = 6' 54 +=('0; !int"("#n +=$hu",+); 45 +=('0 54

i=4'67; !int"("#n i=$i",i); 45 i=4'67 54 !int"("#n i=$u",i); 45 i=4'67 54 !int"("#n -i=$i",-i); 45 -i=-4'67 54 !int"("#n i=$i",i); 45 i=4'67 54 !int"(" a!e valoa!ea hexa*ecimala $x",i); 45 a!e valoa!ea hexa*ecimala 11d7 54 !int"(" sau echivalent, $8",i); 45 sau echivalent, 1197 54 !int"("#n i=$i",i); 45 i=4'67 54 !int"(" a!e valoa!ea octala $o",i); 45 a!e valoa!ea octala 107(7 54 -=1(34'6; !int"("#n -=$li",-); 45 -=1(34'6 54 x=76.'43(; !int"("#n !int"("#n !int"("#n !int"("#n !int"("#n x=$"",x); x=$e",x); x=$;",x); x=$,",x); x=$<",x); 45 45 45 45 45 45 45 45 45 45 x=76.'431): x=7.6'3(0e%01 x=7.6'3(0;%01 x=76.'43(00 x=76.'43(00 54 54 54 54 54 54 54 54 54 54

x=-0.1(34'67:); !int"("#n x=$"",x); !int"("#n x=$e",x); !int"("#n x=$;",x); !int"("#n x=$,",x); !int"("#n x=$<",x); &

x=-0.1(34'7 x=-1.(34'6:e-01 x=-1.(34'6:;-01 x=-0.1(34'7 x=-0.1(34'7

!int"("#n $s","testa!e");

Dimensiunea "8mpului de afi3are9 pre"izia =i m$dul de aliniere pot fi stabilite prin simboluri plasate ]ntre semnul 1 =i specificatorul descriptorului de format !i,d,u,f etc.".

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

32

Astfel, un ]ntreg po$itiv aflat ]ntre 1 =i specificatorul descriptorului de format indic[ dimensiunea minim[ a "8mpului de afi3are . 'ac[ =irul sau num[rul care se afi=ea$[ are mai multe caractere dec*t dimensiunea minim[ preci$at[, atunci afi=area va fi integral[, ]n ca$ contrar se completea$[ cu spa\ii p*n[ la reali$area dimensiunii minime. 'ac[ dorim ca aceast[ completare s[ fie f[cut[ cu cifra * ]n loc de spa\ii, atunci, ]nainte de ] ntregul care specific[ dimensiunea de afi=are, se pune cifra *. 'e exemplu, descriptorul 1:f semnific[ afi=area unui num[r real pe minim : coloane =i, completarea eventualelor coloane libere cu spa\ii, iar 1*:f impune acela=i num[r minim de coloane pentru afi=are, ] ns[ completarea coloanelor libere se va face cu cifra *. @tilitatea preci$[rii dimensiunii minime de afi=are apare mai ales la afi=area tablourilor ]n care alinierea se face pe coloane. &rogramul urm[tor ilustrea$[ efectul preci$[rii dimensiunii c*mpului de afi=are%

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

33

&fi$area unor "alori folosind descriptori de format cu precizarea dimensiunii c'mpului de afi$are
#include "stdio.h" void main(void) { int i; "loat x; i=4'67; !int"("#n !int"("#n !int"("#n !int"("#n i=$4i",i); i=$6i",i); i=$3i",i); i=$06i",i); 45 45 45 45 i=4'67 i= 4'67 i=4'67 i=004'67 54 54 54 54 54 54 54 54

x=76.1(3001; !int"("#n x=$10"",x); !int"("#n x=$010"",x);

45 x= 76.1(3001 45 x=076.1(3001

!int"("#n $3s","testa!e"); 45 testa!e !int"("#n $10s","testa!e"); 45 testa!e &

Pre"izia de afi3are se specific[ printr,un punct urmat de un ]ntreg po$itiv. Specificatorul de preci$ie astfel ob\inut se plasea$[ imediat dup[ dimensiunea c*mpului de afi=are !c*nd este preci$at[". )nterpretarea lui depinde de tipul de date avut ]n vedere. 'e exemplu, descriptorul 1:.3f indic[ afi=area unui num[r real pe minim : coloane =i cu 3 cifre $ecimale dup[ virgul[. Aucrurile se petrec asem[n[tor dac[ ]n loc de 1f se folose=te 1e sau 12. 'ac[ se folose=te unul din descriptorii 1/ sau 14 specificatorul de preci$ie arat[ minimul de cifre semnificative.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

34

Aplicat unui ]ntreg, specificatorul de preci$ie arat[ num[rul minim de cifre cu care va apare afi=at ] ntregul respectiv !dac[ ]ntregul nu are suficiente cifre atunci se completea$[ la ]nceput cu num[rul necesar de cifre *". @n descriptor de format prev[$ut cu specificator de dimensiune =i specificator de preci$ie poate fi aplicat unui =ir cu lungimea cuprins[ ]ntre valoarea specificatorului de dimensiune =i cea a specificatorului de preci$ie. 'ac[ se dep[=e=te valoarea specificatorului de preci$ie, =irul se trunc9ia$[. Se poate impune alinierea la st*nga a datelor plas*nd semnul ; !minus" imediat dup[ semnul 1 ]n cadrul descriptorului. &rogramul urm[tor ilustrea$[ toate ca$urile pre$entate%

&fi$area unor "alori folosind di"erse facilit[\i ale descriptorilor prezenta\i


#include "stdio.h" void main(void) { int i; dou=le x; i=4'67; !int"("#n i=$3.7i",i); !int"("#n i=$7.3i",i); !int"("#n i=$-7.3i",i); 45 i=0004'67 45 i= 4'67 45 i=4'67 54 54 54

x=76.1(3401; !int"("#n x=$10.3"",x); !int"("#n x=$-10.3"",x); !int"("#n x=$3.7"",x); !int"("#n x=$10.(e",x); !int"("#n x=$-10.1;",x); !int"("#n x=$10.3,",x); !int"("#n x=$-10.4<",x); !int"("#n !int"("#n !int"("#n !int"("#n &

45 45 45 45 45 45 45

x= 76.1(3 x=76.1(3 x=76.1(34010 x= 7.61e%01 x=7.6;%01 x= 76.1 x=76.1(

54 54 54 54 54 54 54 54 54 54 54

$.4s","testa!e"); 45 test $10.4s","testa!e"); 45 test $-10.4s","testa!e");45 test $-1.10s","testa!e");45 testa!e

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

35

6unc\ia de citire s"anf45 are forma general[% unde%

int s$anf.sir_for'at,lista_de_ar/u'ente0;

caractere de spa\iere albe, alte caractere< lista_de_ar/u'ente este de forma% <var1,<var(,...,<varn. &rin <v se ]n\elege adresa variabilei v. 6unc\ia ]ntoarce num[rul de argumente c[rora li s, a atribuit o valoare sau constanta 76 !egal[ de obicei cu B-" ]n ca$ de insucces. reci![ri % }n marea lor ma*oritate descriptorii de format folosi\i la func\ia scanf#$ sunt identici cu cei de la func\ia printf#$% practic, din tabelul prezentat anterior ob\inem o list[ "alid[ pentru scanf#$, ]ndep[rt'nd 12, 13,14. +olosi\i cu scanf#$ , descriptorii 1f,1e,1/ sunt ec(i"alen\i. ,ista de argumente este citit[ de la st'nga la dreapta $i asociat[ ]n aceast[ ordine cu lista de descriptori. +iecare descriptor arat[ func\iei scanf#$ tipul "alorii care se "a citi# ]ntreg, real, $ir, pointer etc.. S[ obser"[m c[ aceste "alori sunt transferate "ariabilelor v1,v(,...vn prin intermediul adreselor <v1,<v(,...<vn. -ste de men\ionat faptul c[ ]n cazul citirii unui $ir, deoarece ]nsu$i numele $irului reprezint[ o adres[, operatorul de luare a adresei < nu "a mai preceda obligatoriu numele $irului. .n e emplu de program care cite$te $iruri de caractere este prezentat ]n %apitolul & ("ezi paragraful Func\ii pentru prelucrarea 'irurilor de caractere ). Ca $i ]n cazul func\iei printf#$ descriptorii de format pot a"ea $i un modificator de lungime ma im[ a $irului de caractere care "a fi citit. !e e emplu, apelul#

sir_for'at poate con\ine descriptori de format,

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

36

s$anf.811#s8,sir0;

are drept consecin\[ citirea a ma imum 1# caractere din $irul de intrare $i atribuirea $irului format "ariabilei sir. !ac[ $irul de intrare are mai mult de 1# caractere, caracterele ]n plus se ignor[% la un nou apel al func\iei scanf#$ e plorarea $irului de intrare ]ncepe cu aceste caractere anterior ignorate. Caracterele albe de spa\iere ]n $irurile de intrare pot fi blan=urile (spa\iile albe), taburile (spa\ii tab), sau caracterul linie nou[ (tasta enter). &ceste caractere albe de spa\iere sunt ignorate dac[ ]n $irul format a"em corespunz[tor ]ntre descriptori cel pu\in un spa\iu. !e asemenea, orice alt caracter poate fi folosit ca separator ]n flu ul de intrare, cu condi\ia ca el s[ fie plasat corespunz[tor $i ]ntre descriptorii de format din sir_for'at. !ac[ aceast[ condi\ie nu e ]ndeplinit[, la prima neconcordan\[ (de la st'nga la dreapta) ]ntre separatorii din flu ul de intrare $i cei din sir_for'at e ecu\ia func\iei scanf#$ se ]nc(eie. !e e emplu, apelul func\iei scanf#$#
s$anf.81d,1f,1s8,<x,<y,sir0;

realizeaz[ o atribuire corect[ a datelor de intrare dac[ ele sunt desp[r\ite prin "irgul[. Pentru a atribui "ariabilei x "aloarea 3(, lui y "aloarea 1*.:# $i "ariabilei sir "aloarea an , ]n flu ul de intrare trebuie s[ a"em 3(,1*.:#,an .

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

37

Citirea numerelor reale x $i 3 de la tastatur[, calculul produsului x>3 $i afi$area lui ]n format e ponen\ial.
#include "stdio.h" void main(void) { "loat x,8; !int"("#n >astati doua nume!e se a!ate scan"("$" $"",?x,?8); 8=85x; !int"("#n @!odusul 85x este = $e", 8); &

!in s atiu ");

Observa\ii:
3 $i x sunt "ariabile diferite% 3=3>x; este o e presie de atribuire care se poate scrie mai scurt sub forma 3>=x; cu a*utorul operatorului compus >=.

6unc\iile s"anf45 =i printf45 sunt func\ii de intrare=ie=ire standard cu destina\ie general[. 'in considerente de eficien\[ !cod mai mic, vite$[ de execu\ie sporit[, comoditate ]n programare etc." limbajul C pune la dispo$i\ia utili$atorului =i func\ii cu destina\ie special[. FUN!.II *PE!IALE PENTRU !ITIREA0*!RIEREA !ARA!TEREL)R LA NI,ELUL !)N*)LEI Standardul A(S) C prevede dou[ func\ii simetrice pentru transferul caracterelor la nivelul consolei% func\iile %et"#ar45 =i put"#ar45. le ]=i au prototipurile ]n 8stdio.h8.

6unc\ia pentru citire %et"#ar45 are forma general[


int /et$har.void0;

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

38

=i ]ntoarce urm[torul caracter care va fi citit. 'ac[ s,a atins sf[r=itul =irului sau se produce o eroare se ] ntoarce 76. 'e=i nu apar\in standardului A(S) C, totu=i, func\iile %et"#45, %et"#e45, put"#45 sunt incluse frecvent ]n biblioteca standard a compilatoarelor compatibile '7S. &rototipurile acestor func\ii sunt ]n fi=ierul 9eader 8$onio.h8. 6unc\iile %et"#45 =i %et"#e45 sunt ec9ivalente func\ional cu func\ia %et"#ar45. 6orma general[ este%
int /et$h.void0; int /et$he.void0;

Spre deosebire de func\ia %et"#ar45 unde caracterul tastat este citit numai dac[ se apas[ ]n continuare tasta 2nter, func\iile %et"#45 =i %et"#e45 preiau caracterul imediat dup[ ce a fost tastat !f[r[ a mai ap[sa 2nter". 'e asemenea, func\ia %et"#45 preia caracterul de la tastatur[ f[r[ a,l afi=a pe ecran, ]n timp ce %et"#e45 afi=ea$[ pe ecran caracterul citit !citire cu ecou". 6unc\ia pentru afi=are put"#ar45 are forma general[
int put$har.int $h0;

unde $h este caracterul care se afi=ea$[. 6unc\ia ]ntoarce ]n ca$ de succes caracterul scris, iar ]n ca$ contrar 76.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

39

6unc\ia put"#45 este ec9ivalent[ func\ional cu put"#ar45 =i are forma general[


int put$h.int $h0; unde $h este caracterul care se afi=ea$[.

a este de asemenea o func\ie nestandard !nu e definit[ de standardul A(S) C" frecvent utili$at[.

Citirea si afi$area unui caracter folosind func\iile speciale /et$he.0 $i put$h.0


#include "stdio.h" #include "conio.h" void main(void) { cha! x; !int"("#n >astati o lite!aA "); x=,etche(); !int"("#n BultumescA 0ti tastat lite!a "); utch(x); ,etch(); &

FUN!.II *PE!IALE PENTRU !ITIREA0*!RIEREA 'IRURIL)R DE !ARA!TERE LA NI,ELUL !)N*)LEI 6unc\ii speciale pentru citirea=scrierea =irurilor de caractere la nivelul consolei sunt %ets45 =i puts45. Ambele func\ii ]=i au prototipurile ]n fi=ierul 9eader 8stdio.h8. Aceste prototipuri sunt pre$entate ]n !apit$lul 6+ al lucr[rii. 'eoarece ]n construc\ia acestor prototipuri intervine no\iunea de p$inter, pre$entat[ ]n detaliu ]n !apit$lul :, ne limit[m aici la a spune c[ prin apelul
/ets.sir_destinatie0;

se cite=te un =ir de la tastatur[ ]n sir_destinatie, iar apelul


puts.sir0;

are ca efect afi=area =irului sir pe ecran.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

40

'[m ca exemplu secven\a de program%


. . . . . . . /ets.x0; . . . . . . . printf.8?n @irul $itit este =80; puts.x0; . . . . . . .

@n program complet care utili$ea$[ func\iile %ets45 =i puts45 este pre$entat ]n !apit$lul ; !ve$i paragraful Fun"(ii pentru prelu"rarea 3iruril$r de "ara"tere".

PERAT)RI2 !LA*IFI!ARE
)perat$rii sunt elemente de ba$[ ale limbajului care arat[ ce opera\ii trebuie executate asupra unor $peranzi. }n C, operan$i pot fi constantele, numele de variabile, numele de func\ii, expresiile. Cogata familie de operatori confer[ limbajului C o tr[s[tur[ aparte. Clasificarea operatorilor C se poate face dup[ mai multe criterii% dup[ num[rul de operan$i prelucra\i ! unari9 binari9 ternari"< dup[ prioritatea avut[ ]n evaluarea expresiilor !"lase de pre"eden([ "< dup[ tipul operan$ilor ! aritmeti"i9 rela(i$nali9 l$%i"i 3i la nivel de bit ". )PERAT)RI UNARI9 &INARI9 TERNARI Din*nd cont de num[rul de operan$i prelucra\i, ]n C exist[ $perat$ri unari9 binari =i ternari . Clasele re$ultate nu sunt disjuncte, ]n sensul c[, de exemplu, un operator unar poate fi =i binar. Astfel, ]n expresia

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

41

!3 operatorul ! !minus" este unar, iar ]n expresia a!3,

este binar. Singurul operator ternar este operatorul condi\ional AB. 7peran$ii s[i sunt plasa\i dup[ sc9ema operand1 A operand( B operand 3. !LA*E DE PRE!EDEN.1 &riorit[\ile operatorilor impun ordinea de evaluare a expresiilor. Ca =i ]n calculele algebrice obi=nuite ordinea de evaluare poate fi modificat[ cu ajutorul parante$elor rotunde. 7peratorii care au priorit[\i egale, apar\in aceleia=i "lase de pre"eden([ . Aista operatorilor grupa\i dup[ clase de preceden\[ este dat[ ]n #abelul 1... "abelul 3.( Clase de preceden\[ Clasa - !parante$e, op. de selec\ie" . !op.unari" 1 !op. multiplicativi" E !op. aditivi" 5 !op. s9ift" 3 !op. rela\ionali" 2 !op. rela\ionali" 4 !FS)G pe bit" H !FSA@G exclusiv bit cu bit" -0 !FSA@G bit cu bit" -- !FS)G logic" -. !FSA@G logic" -1 !operator condi\ional" Operatori
.0 [] !C . 99 !! D E ! 9 < si$eof > cast 1 F > 9 ! GG CC G G= C C= == D= < H I << II AB

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

42

-E !atribuire" -5 !secven\iere"

= 9= != >= et$. ,

6unc\ionea$[, de asemenea, reguli de asociere de la st*nga la dreapta sau de la dreapta la st*nga. Singurii operatori care se asocia$[ de la dreapta la st*nga sunt operatorii unari =i operatorul AB, restul se asocia$[ de la st*nga la dreapta. )perat$rul de atribuire = ocup[ un loc aparte ]n familia operatorilor. Cu ajutorul lui putem s[ atribuim unei variabile o anumit[ valoare. 6orma sa general[ este%
v=e;

unde v este un nume de variabil[, iar e este o expresie. }n C, membrul st*ng =i membrul drept al unei atribuiri se mai numesc valoare st*ng[ ! lvalue ", respectiv valoare dreapt[ ! rvalue ". Spre deosebire de alte limbaje !6ortran, &ascal etc." ]n C, operatorul de atribuire poate apare =i ]n interiorul unei expresii, fapt ce permite o compactare a codului surs[. 'e exemplu, dou[ atribuiri succesive de genul%
&=pi>r>r; J=&>h;

pot fi scrise compact sub forma%


J=.&=pi>r>r0>h;

&ractic, ce am scris mai sus este o instru"(iune expresie . Ie$ultatul evalu[rii expresiei ! &=pi>r>r0este pi>r>r< dup[ cum se vede, acest re$ultat se poate folosi mai departe ]n calcule. Atribuirea valorii pi>r>r variabilei & apare ca un efect secundar al instruc\iunii expresie &=pi>r>r;. Compilatorul C permite ca ]n expresii de genul
v=e;

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

43

v =i e s[ aib[ tipuri diferite. }n aceast[ situa\ie au loc

"$nversii de tip. Iegula de conversie este urm[toarea% valoarea membrului drept !valoarea lui e" se converte=te la tipul membrului st*ng !tipul lui v". 'eoarece size$f !int" G= size$f !fl$at" G= size$f !d$uble", se spune c[ int este mai :slab: dec*t fl$at, care este la r*ndul s[u mai :slab: dec*t d$uble. 'ac[ membrul st*ng este de un tip mai :slab: dec*t tipul membrului drept pot avea loc pierderi de informa\ie !prin trunc9iere" sau dep[=irea posibilit[\ilor de repre$entare. 'e exemplu, ]n secven\a%
int x,y; float a,b; ......... x=a; b=y;

variabila x va primi partea f[r[ frac\ie a valorii a sau un re$ultat imprevi$ibil dac[ se dep[=esc posibilit[\ile de repre$entare, iar valoarea ]ntreag[ y va fi convertit[ la o valoare repre$entat[ ]n virgul[ mobil[. Considera\iile de mai sus referitore la conversia tipurilor sunt valabile =i ]n situa\ia ]n care cel pu\in unul dintre cei doi operan$i ai operatorului de atribuire sunt variante ale tipului int !"#ar, si%ned, unsi%ned , s#$rt9 l$n%" sau ale tipului d$uble !l$n% d$uble". }n C este posibil[ atribuirea multipl[ , ca ]n exemplul de mai jos%
x=y=z=s=*;

fectul este atribuirea valorii * variabilelor x,y,z,s. 'e asemenea, ]n anumite situa\ii se pot folosi operatorii de atribuire "$mpus[ . &ractic, orice atribuire de genul%
variabila=variabila operator expresie;

unde operator poate fi ales din lista de operatori >, F, 1, 9, !, CC, GG, |, <, H se poate scrie simplificat sub forma%

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

44

variabila operator=expresie; x9=(;

'e exemplu, expresia x=x9(; are acela=i efect cu

'ac[ v e un operand oarecare ca$urile u$uale de atribuire v=v91 =i v=v!1 se pot scrie simplificat sub forma v99 =i respectiv v!!. 7peratorul 99 se nume=te $perat$r de in"rementare , iar !! $perat$r de de"rementare . 6unc\ie de po$i\ia lor fa\[ de operand ei pot fi operatori prefix sau p$stfix . 'e exemplu% x=x91 se poate scrie x99 sau 99x, x=x!1 se poate scrie x!! sau !!x. 'ac[ operandul nu apare ]n cadrul unei expresii, dup[ cum se vede din exemplul de mai sus, nu are importan\[ dac[ operatorii sunt prefix sau postfix. C*nd operandul apare ]n cadrul unei expresii, dac[ este precedat de operatorul 99 sau !! se execut[ ]nt*i incrementarea sau decrementarea operandului =i apoi este folosit ]n expresie< dac[ este ]ns[ urmat de operatorul 99 sau !! incrementarea sau decrementarea se va face dup[ folosirea sa ]n expresie. 'e exemplu, expresia y=99x; e ec9ivalent[ cu secven\a x=x91;
y=x;

iar

x=x91;

expresia y=x99; e ec9ivalent[ cu secven\a y=x;

S[ observ[m c[ cele dou[ secven\e vor produce aceea=i valoare pentru x =i valori diferite pentru y. 6olosirea operatorilor de incrementare =i decrementare este recomandabil[ nu doar din ra\iuni de simplificare a scrierii programelor ci =i datorit[ faptului c[ majoritatea compilatoarelor C generea$[ coduri obiect foarte rapide ]n astfel de ca$uri.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

45

)perat$rul de se"ven(iere 4vir%ula5 permite construirea unei expresii ca o list[ de alte expresii. xpresiile din list[ se evaluea$[ de la st*nga la dreapta. ?aloarea =i tipul ]ntregii expresii este dat de ultima expresie din list[. 'e exemplu, ]n urma execu\iei secven\ei de program%
. . . . . int x=:,y=3,z,K; . . . . . z=.K=xGy,x9y0; z va primi valoarea 1*.

xplica\ia este urm[toarea% se evaluea$[ mai ]nt*i expresia K=xGy, apoi expresia x9y. Ie$ultatul evalu[rii expresiei x9y este 1*, iar ]ntreaga expresie .K=xGy,x9y0 va primi aceast[ valoare care se va atribui lui z. &ractic, operatorul virgul[ ofer[ o modalitate elegant[ de a scrie mai multe expresii ]n secven\[, sub forma compact[ a unei singure expresii. }n exemplul de mai sus, expresia
z=.K=xGy,x9y0;

]nlocuie=te secven\a
K=xGy; z=x9y;

7peratorii C,D,E,5,?,si*eo", <,-F vor fi pre$enta\i mai pe larg ]n capitolele unde pre$en\a lor este necesar[% operatorul AB la instru"(iuni "$ndi(i$nale , parante$ele p[trate [ =i ] la tipul de date tabl$u , >,< =i sizeof la p$interi , J =i !C la tipurile de date stru"t =i uni$n. )PERAT)RI ARITMETI!I
9,>,F,1,!!,99.

Aimbajul C are urm[torii $perat$ri aritmeti"i% !,

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

46

Semnifica\ia lor re$ult[ din #abelul ..5 =i din pre$entarea f[cut[ anterior operatorilor 99 =i !!. }n plus vom face urm[toarele observa\ii% aplicat unor operan$i ]ntregi operatorul F va produce doar partea ]ntreag[ a ]mp[r\irii< de exemplu, secven\a%

. . . int x,y; x=:; y=xF(; . . .

va produce valoarea 3 pentru y. operatorul 1 aplicat unor operan$i ]ntregi furni$ea$[ restul ]mp[r\irii acelor ]ntregi< de exemplu, secven\a%
. . . int x,y x=:; y=x1(; . . .

produce pentru y valoarea y=1, adic[ restul ]mp[r\irii lui : la (.

)PERAT)RI RELA.I)NALI 'I L)=I!I

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

47

)perat$rii rela(i$nali din limbajul C sunt% G, C, G=, C=, ==, D=. Semnifica\ia lor re$ult[ din #abelul ..5. }n urma evalu[rii unei expresii ]n care intervin operatori rela\ionali re$ult[ valoarea * pentru fals =i 1 pentru adevarat. &rogramul de mai jos afi=ea$[ valorile anun\ate ]n comentariile al[turate%

&fi$area "alorilor unor e presii ]n care inter"in operatori rela\ionali


#include "stdio.h" #include "conio.h" void main(void) { "loat x=0, !int"("#n !int"("#n !int"("#n !int"("#n !int"("#n !int"("#n ,etch(); &

y=(.3; xHy a!e xH=y a!e xFy a!e xF=y a!e x==y a!e xA=y a!e

valoa!ea valoa!ea valoa!ea valoa!ea valoa!ea valoa!ea

$d",xHy) ; $d",xH=y); $d",xFy) ; $d",xF=y); $d",x==y); $d",xA=y);

45154 45154 45054 45054 45054 45154

)perat$rii l$%i"i din C sunt%


D << II

(@ logic S) logic SA@ logic

+odul de ac\iune al acestor operatori este pre$entat ]n #abelul 1.1. "abelul 3.3 /abla "alorilor de ade"[r pentru operatori logici
a = a ?? = a GG = Aa

* * 1 1

* 1 * 1

* * * 1

* 1 1 1

1 1 * *

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

48

Observa\ii: !in /abelul 0.1 rezult[ c[ operatorii logici << $i DD au o prioritate mai mic[ dec't operatorii rela\ionali. !in acest moti"#
.$Cd0

e presia aG=bDD$Cd e ec(i"alent[ cu .aG=b0DD e presia aCb<<$G=d e ec(i"alent[ cu

.aCb0<<.$G=d0

Concluzia este c[ ]n astfel de situa\ii prezen\a parantezelor este op\ional[. - ist[ ]ns[ cazuri ]n care parantezele sunt absolut necesare% de e emplu, dac[ dorim s[ neg[m e presia aC3 "om scrie D.aC30 $i nu DaC3. - presia D.aC30 "a returna corect "aloarea * sau 1 func\ie de m[rimea lui a, ]n timp ce e presia DaC3 are totdeauna "aloarea * (datorit[ priorit[\ii mai mari a operatorului D fa\[ de C se e"alueaz[ mai ]nt'i Da care poate fi * sau 1% oricare ar fi "aloarea lui a, rezult[ ]n final "aloarea *). !ac[ ]ntr2o e presie format[ din operanzi lega\i prin operatorul DD , iar "aloarea primului operand este 1, "aloarea e presiei este 1 ("ezi /abelul 3.2 ) $i ceilal\i operanzi nu se mai e"alueaz[. !ac[ ]ntr2o e presie format[ din operanzi lega\i prin operatorul <<, primul operand ia "aloarea *, "aloarea e presiei este * iar ceilal\i operanzi nu se mai e"alueaz[. !eoarece prezen\a parantezelor nu reduce "iteza de e ecu\ie a e presiilor, ele pot fi folosite, al[turi de spa\ii, la cre$terea gradului de lizibilitate a unui program. )at[ dou[ e presii ec(i"alente#
a=$GdDDdC=$<<aG3; a = .$Gd0 DD .dC=$0 << .aG30;

-ste e"ident c[ cea de a doua e presie este mai u$or de citit.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

49

)PERAT)RI LA NI,EL DE &IT )perat$rii la nivel de bit din C permit programatorului s[ manevre$e bi\ii apar\in*nd unor valori de tip "#ar sau int !ei nu se aplic[ tipurilor de date fl$at, d$uble sau l$n% d$uble". Aceasta este una din acele facilit[\i care apropie limbajul C de nivelul limbajelor de asamblare. 7peratorii la nivel de bit sunt% < S) pe bit I SA@ pe bit H SA@ exclusiv pe bit E (@ pe bit !complement fa\[ de 1" CC deplasare dreapta !s#ift dreapta" GG deplasare st*nga !s#ift st*nga" +odul de ac\iune al primilor E operatori pe bit e re$umat ]n #abelul 1.E. "abelul 3.) /abla "alorilor de ade"[r pentru operatorii pe bit &,|,^ $i ~
a = a ? = a . = a I = Ja

* * 1 1

* 1 * 1

* * * 1

* 1 1 1

* 1 1 *

1 1 * *

Se observ[ c[ aHb ia valoarea 1 numai dac[ bi\ii a =i b sunt diferi\i. Asem[narea dintre #abelul 1.1 =i #abelul 1.E nu trebuie s[ ne induc[ ]n eroare. 7peratorii logici tratea$[ valorile * =i 1 ale operan$ilor ca pe valori logice, iar operatorii pe bit tratea$[ operan$ii ca succesiuni de bi\i.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

50

S[ consider[m dou[ valori x=# =i y=3) =i repre$ent[rile lor ]n ba$a (, adic[ x=**** *1*1 =i y=**1* *1**. Avem%
**** *1*1 **1* *1** x<y= **** *1** **** *1*1 **1* *1** xHy= **1* ***1 **** *1*1 **1* *1** xIy= **1* *1*1 **** *1*1 Ex= 1111 1*1*

Observa\ii: 3peratorul & reprezint[ o modalitate de a elimina un bit (de a2l face egal cu *) sau de a re\ine bi\ii care ne intereseaz[ (opera\ie de mascare ). }n opera\iile de transmitere a datelor, bitul superior (cel mai din st'nga) al unui octet este considerat de cele mai multe ori bit de paritate . Printr2o opera\ie de setare la 1 a acestui bit sau de anulare a sa, se poate ob\ine un num[r par sau impar de bi\i ]n octetul respecti" func\ie de con"en\ia de paritate acceptat[ (paritatea poate fi par[ sau impar[). .tilizarea parit[\ii, permite "erificarea corectitudinii octetului transmis. &r[t[m mai *os cum se poate modifica bitul de paritate#

Exemplu: 4. &nularea bitului de paritate al unui octet.


1*** *1*1 < *111 1111 **** *1*1
2.

Setarea la "aloarea 1 a bitului de paritate a unui octet.


**** *1*1 I 1*** **** 1*** *1*1

3bser"[m c[ anularea bitului de paritate s2a f[cut prin 5]nmul\ire6 cu num[rul 1(: (*111 1111 ]n baza (),

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

51

iar setarea la "aloarea 1 a aceluia$i bit prin 6adunare6 cu num[rul 1(8 (1*** **** ]n baza (). !atorit[ posibilit[\ii de a modifica "alorile bi\ilor, operatorii pe bit se folosesc mai ales ]n proiectarea programelor de interfa\[ cu dispoziti"e periferice. 3 alt[ aplica\ie interesant[ se refer[ la codificarea $i decodificarea unui fi$ier. 3 modalitate simpl[ este folosirea operatorului E, pornind de la obser"a\ia c[ E.Ex0=x, pentru x ]ntreg arbitrar. !eci, dac[ e ist[ un program de codificare, la prima sa rulare to\i bi\ii nuli de"in 1, iar to\i bi\ii de 1 de"in nuli ( codificarea ). ,a o nou[ rulare este e"ident c[ se ob\ine fi$ierul ini\ial (decodificarea ). 3 posibilitate mai puternic[ de codificare $i decodificare este operatorul H. }n acest caz pentru aceste opera\ii se folose$te o c(eie. 7elu'nd e emplul cu "alorile x=**** *1*1 $i y=**1* *1**
**** *1*1 **1* *1** xHy= **1* ***1

s[ presupunem c[ y este c(eia. !ac[ ]ntre codificarea ob\inut[ .xHy0 $i c(eia y efectu[m din nou opera\ia H se ob\ine rezultatul ini\ial x (decodificarea).
**1* ***1 **1* *1** .xHy0Hy= **** *1*1

6orma general[ a $perat$ril$r de deplasare este% variabila GG nu'ar_intre/, pentru deplasare la st*nga =i variabila CC nu'ar intre/, pentru deplasare la dreapta.

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

52

Aici, nu'ar_intre/ se refer[ la num[rul de po$i\ii cu care vor fi deplasa\i spre st*nga, respectiv spre dreapta bi\ii variabilelor. 'eplasarea bi\ilor spre un cap[t sau altul poate produce pierderea unui num[r de bi\i de la respectiva extremitate. Cu ce se completea$[ bi\ii r[ma=i liberi; 'ac[ deplasarea este spre st8n%a , bi\ii liberi din dreapta se completea$[ cu *. Exemplu . S[ consider[m declara\ia
unsi/ned $har x=:<

(um[rul : este repre$entat ]n ba$a ( ca **** *111. Atunci, xGG1 va produce **** 111*. 'ac[ vom continua cu xGG# se va ob\ine 11** **** ceea ce arat[ pierderea unui bit. 'ac[ deplasarea este spre dreapta , bi\ii liberi din st*nga se completea$[ automat cu * numai dac[ num[rul este f[r[ semn. 'ac[ num[rul este negativ, din neccesitatea de a conserva semnul !repre$entat ]n bitul cel mai semnificativ cu 1", bi\ii liberi din st*nga se completea$[ cu 1. Exemplu 2 S[ consider[m x=!9. Iepre$entarea sa ]n binar se face folosind "$dul "$mplementar fa([ de +. Acesta se ob\ine adun*nd la "$mplementul fa([ de 6 al num[rului valoarea 1. 'eci, valoarea !9 se va ob\ine ca E991. Suita de opera\ii ]n binar este urm[toarea%
9 E9 E991 !9

se repre$int[ prin este 1111 este 1111 se repre$int[ prin

**** 1**1 *11* *111 1111 *111

}n consecin\[, \in*nd cont de preci$area f[cut[ mai sus


xCC( va produce 1111 11*1

Observa\ii. !eplasarea spre st'nga cu n pozi\ii ec(i"aleaz[ cu o ]nmul\ire a "ariabilei cu 2n, iar

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

53

deplasarea spre dreapta cu n pozi\ii ec(i"aleaz[ cu ] mp[r\ire a "ariabilei cu 2n. &ceste deplas[ri (opera\ii shift) sunt mai rapide dec't opera\iile corespunz[toare de ]nmul\ire sau ]mp[r\ire cu 2n. Exemplu: 'ac[ x=: atunci%
xGG1 va produce **** 111* adic[, :x(1=1"

'ac[ x=!8, atunci xCC( va produce ---- ---0 adic[, !(=!8F((.

)N,ER*II DE TIP IMPLI!ITE


Aimbajul C ofer[ posibilitatea de a construi expresii cu date de tipuri diferite. 'in acest motiv exist[ un set de reguli de conversie a operan$ilor la tipul operandului cel mai :tare:. Aceste reguli sunt cunoscute sub numele de avansare de tip !t>pe pr$m$ti$n". )at[ setul de reguli%

?ariabile de tip "#ar =i s#$rt se convertesc la tipul int. !ac[ un operand este l$n% d$uble &tunci al doilea este convertit la l$n% d$uble< &ltfel dac[ un operand este d$uble &tunci al doilea e convertit la d$uble< &ltfel dac[ un operand este fl$at &tunci al doilea e convertit la fl$at< &ltfel dac[ un operand este unsi%ned l$n% &tunci al doilea e convertit la unsi%ned l$n%<

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

54

&ltfel dac[ un operand este l$n% &tunci al doilea e convertit la l$n%< &ltfel dac[ un operand este unsi%ned &tunci al doilea este convertit la unsi%ned .

)N,ER*II DE TIP E?PLI!ITE 4)PERAT)RUL !A*T5


)perat$rul de "$nversie expli"it[ !"ast" ac\ionea$[ temporar, for\*nd sc9imbarea tipului expresiei la care se refer[. 6orma general[ a operatorului este%
.tip0expresie;

unde tip este tipul la care dorim s[ se fac[ conversia expresiei. 'e exemplu, re$ultatul evalu[rii expresiei
.float0iF(;

unde i a fost definit prin


int i=3;

este 1.#. 'ac[ ]n acelea=i condi\ii se evalua expresia iF(< re$ultatul ar fi fost trunc9iat la 1 !se ]mp[r\eau doi ]ntregi". # S# ' C7(#I7A @26 }n C exist[ tipurile fundamentale de date% a" c9ar, int, float, double, void b" c9ar, integer, real, double, void c" c9ar, int, float, double, nul, boolean d" c9aracter, string, real, void @2+ +odificatorii de semn

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

55

a" sc9imb[ semnul unei expresii b" sc9imb[ semnul numai pentru valori ]ntregi c" au ca efect interpretarea diferit[ din punct de vedere al semnului, a informa\iei memorate ] ntr,o anumit[ $on[ @2@ 'eclara\iile =i
$har x; si/ned $har x;

a" sunt ec9ivalente b" sunt gre=ite c" sunt corecte @2A 'eclara\iile =i

short int x; int x;

a" sunt ec9ivalente b" sunt gre=ite c" sunt corecte @2; 'eclara\ia este b" este c) este d) este
a)

ec9ivalent[ cu float x;float y; gre=it[ ec9ivalent[ cu x,yBfloat; ec9ivalent[ cu real x,y;


$har $h=%&%,L;

float x,y;

@2: Ainia de program are semnifica\ia% a) variabila $h ia valori de la & la L b) variabila $h este de tip "#ar =i este ini\iali$at[ cu valoarea %&%, iar variabila L este de tip "#ar c) tipul de date "#ar ia valori de la & la L

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

56

@2B2 Ainiile de program a" sunt ec9ivalente b" sunt corecte =i compatibile c" sunt corecte =i incompatibile @2C Secven\a de program afi=ea$[%
a0 x=1* $0 x=1* int x=1*,y=(*,z=#,K=:; printf.8?n x=1i y=1i z=1d8,x,y0; y=(* y=(* z=# $onst ore_zi=("; int ore_zi=(";

b" date de ie=ire nedefinite @2D Secven\a de program%


int x=1*,y=(*,z=#,K=:; printf.8?n x=1d y=1i8,x,y,z0; afi=ea$[ x=1* y=(* afi=ea$[ x=1* y=(* z=#

a) b)

c" este gre=it[

@267 )nstruc\iunea printf45 de mai jos afi=ea$[


printf.8?nuuD?taurul ?n!are i'portantaD80;

a0 ?nuuD?taurul?n!are i'portantaD b0 taurul n!are i'portantaD $0 uuDaurul !are i'portantaD d0 uuD aurul !are i'portantaD

@266 Secven\a de program afi=ea$[


int i=1*,M=(*; printf.8?n i=1i,M=1i8,M,i0;

a0 i=1*, M=(* b0 i=(*, M=1* $0 i=1*1 M=(*1

@26+ Secven\a de program


int i=1*,M=(*; printf.8?n i=1i,M=1M8,i,M0;

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

57

afi=ea$[ i=1*,M=(* b" este gre=it[ c) afi=ea$[ i=11*,M=1(*


a)

@26@ Secven\a de program


$har a=%N%; printf.8?n a=1d8,a0;
a) b) c) d)

este gre=it[ deoarece 1d este descriptor pentru tipul int, nu pentru tipul "#ar este corect[ =i afi=ea$[ codul ASC)) al caracterului N este corect[ =i afi=ea$[ codul ASC)) al caracterului a este corect[ =i afi=ea$[ caracterul N
float x=3(.:#; printf.8?n x=1e,x=1f8,x,x0;

@26A Secven\a de program este gre=it[ deoarece argumentul x se repet[ este corect[ =i va afi=a x=3(.:#,x=3(.:# este corect[ =i va afi=a
x=3.(:#***e9*1,x=3(.:#****

a) b) c)

@26; Secven\a de program afi=ea$[%


a0 "39
b) c)

int x="39; printf.8?n 1o8,x0;

num[rul "39 scris ]n ba$a 8 num[rul "39 scris ]n ba$a 1)


int x=1*11; printf.8?n 1x8,x0;

@26: Secven\a de program afi=ea$[% a) valoarea lui x ]n binar b) valoarea lui x ]n 9exa$ecimal c) valoarea lui x ]n octal @26B Secven\a de program

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

58

a) b)

c" este gre=it[

int x=1(; float y=31."(; printf.8?n x=1f y=1d8,x,y0; afi=ea$[ x=1( y=31."( afi=ea$[ x=1(.* y=31

@26C Secven\a de program


float x=1*.#; printf.8?n x=1!1*.#f8,x0; afi=ea$[ x=!1*.# afi=ea$[ x=1*.#****

a) b)

c" este gre=it[

@26D Secven\a de program


float x=1*.#; printf.8?n x=11*.#8,x0; afi=ea$[ x=1*.# afi=ea$[ x= 1*.#**** afi=ea$[ x=1*.#**** float x; s$anf.81f8,x0; float x; s$anf.81f8,<x0;

a) b) c)

@2+7 'espre secven\ele de program =i

se poate afirma c[% a" sunt corecte =i au acela=i efect b" prima secven\[ este corect[ =i a doua incorect[ c" prima secven\[ este incorect[ =i a doua corect[ @2+6 Secven\a de program
a" b"

c" este gre=it[

printf.81.3s8,8ab$de80; afi=ea$[ ab$ afi=ea$[ ab$de

@2++ 'ac[ =irul care trebuie citit de la tastatur[ este ab$def atunci secven\a

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

59

a" b"

c"

este gre=it[, deoarece variabila sir nu e precedat[ de operatorul < este gre=it[, deoarece =irul de intrare are ) caractere, iar descriptorul 1s prevede doar 3 caractere este corect[, dar se citesc doar caracterele ab$
s$anf.81d;1f;1s8,<x,<y,sir0;

s$anf.813s8,sir0;

@2+@ Secven\a de program a" este gre=it[, deoarece descriptorii de format sunt desp[r\i\i prin semnul < b" este gre=it[, deoarece variabila sir nu e precedat[ de operatorul < c" este corect[ =i reali$ea$[ corect citirea dac[ datele din fluxul de intrare sunt desp[r\ite prin semnul < @2+A 7peratorii ]n C pot fi% a" unari, binari b" unari, binari, ternari c" unari, binali, termali @2+; 7peratorii 9 =i ! pot fi% a" numai unari b" numai binari c" unari sau binari @2+: Secven\a de program%
float x; int i; x=3".(1; i=x;

este gre=it[ deoarece se atribuie valoarea real[ din x variabilei ]ntregi i b" este corect[ c" este corect[, iar i va primi valoarea 3"
a"

@2+B Secven\a de program

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

60

int i; float x; i=3"; x=i;

este gre=it[, deoarece se atribuie valoarea ] ntreag[ din i variabilei reale x b" este corect[ c" este corect[, iar x va primi valoarea 3" convertit[ ]n virgul[ mobil[.
a"

@2+C Ainia de program


J=.&=5>b0>h;

este eronat[ deoarece con\ine operatorul de atribuire = de dou[ ori b" este corect[ c" este corect[ =i este ec9ivalent[ cu secven\a de program
a"

&=5>b; J=&>h;

@2+D Ainia de program


a=b=$=1;

a" este corect[ =i e ec9ivalent[ cu secven\a


a=1; b=1; $=1;

b" este corect[ =i e ec9ivalent[ cu secven\a


1=a=b=$;

c" este gre=it[ deoarece operatorul de atribuire apare de mai multe ori @2@7 xpresia
x9=1;

a" este b" este c" este d" este

gre=it[ corect[ =i ec9ivalent[ cu x=x91< corect[ =i ec9ivalent[ cu x99< corect[ =i ec9ivalent[ cu 99x<

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

61

@2@6

xpresia
y=!!x;

a" este gre=it[ b" este corect[ =i ec9ivalent[ cu secven\a c" este corect[ =i ec9ivalent[ cu secven\a
y=x; y=x!1; x=x!1; y=x;

@2@+

xpresia
y=x!!;

a" este gre=it[ b" este corect[ =i ec9ivalent[ cu secven\a c" este corect[ =i ec9ivalent[ cu secven\a
y=x; x=x!1; x=x!1; y=x;

@2@@ }n urma execu\iei secven\ei de program%


int i,M; i=19; M=iF";

a" b" c"

M ia valoarea " M ia valoarea ".:# M ia valoarea # int i,M; i=19; M=i1";

@2@A }n urma execu\iei secven\ei de program%

a" b" c"

M ia valoarea 3 M ia valoarea " M ia valoarea ".:#

@2@; 'ac[ a,b,$,d sunt variabile numerice atunci expresia .aGb0II.$Cd0 se poate scrie%
a" b" aGbII$Cd aG.bII$0Cd

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

62

c"

$CdIIaGb int x=3,y=",a,b,z; s$anf.81i 1i8,<a,<b0; z=.yCx0II.aGb0;

@2@: }n secven\a de program

variabila z va lua a"


b"

c"

o valoare nedefinit[ valoarea 1 o valoare care depinde de a =i b


int x=3,y=",a,b,z; s$anf.81i 1i8,<a,<b0; z=.xCy0<<.aGb0;

@2@B }n secven\a de program

variabila z va lua a"


b" c"

o valoare nedefinit[ valoarea * o valoare care depinde de a =i b


int a=3,b=",x,y,z; z=.x=a9b,y=x0;

@2@C }n secven\a de program

a" b" c"

x ia valoarea : y ia valoarea : z ia valoarea :

@2@D 7peratorii pe bit se aplic[ valorilor * sau 1 pe care le iau anumite variabile de tip int b" variabilelor de tip "#ar =i int c" variabilelor de tip fl$at =i d$uble
a"

@2A7 'ac[ doi bi\i nota\i a =i b au valorile a=1 =i b=1 atunci%


a" b" c"

aIb ia valoarea 1 a<b ia valoarea 1 aHb ia valoarea *

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

63

d"

Ea ia valoarea *

@2A6 'ac[ doi bi\i nota\i a =i b au valorile a=1 =i b=* atunci%


a" b" c" d"

aIb ia valoarea 1 a<b ia valoarea * aHb ia valoarea 1 Eb ia valoarea 1 int x=19(; printf.8?n x=18, xGG10;

@2A+ Secven\a de program afi=ea$[


a0 91 b0 19( $0 38"

@2A@ Complementul fa\[ de 1 al num[rului ]ntreg i se ob\ine ca%


a0 Ei b0 1!i

@2AA Complementul fa\[ de ( al num[rului ]ntreg i se ob\ine ca%


a0 Ei91 b0 Ei!1 $0 (!i

@2A; 7pera\ia xGG3 ec9ivalea$[ cu%


a"
b) c) d)

o o o o o o o o

]nmul\ire a lui x cu 3 ]mp[r\ire a lui x la 3 ]nmul\ire a lui x cu (3 imp[r\ire a lui x cu (3 ]nmul\ire a lui x cu ( ]mp[r\ire a lui x la ( ]nmul\ire a lui x cu (( imp[r\ire a lui x cu ((

@2A: 7pera\ia xCC( ec9ivalea$[ cu%


a"
b) c) d)

Capitolul 3 - Expresii n C. Funcii de intrare/ieire uzuale pentru consol

64

@2AB Secven\a de program


int i=:; float x; x=.float0iF"; printf.8?n x=1f8,x0; . . . . .

a"
b" c"

este gre=it[ este corect[ =i afi=ea$[ x=1.:#**** este corect[ =i afi=ea$[ x=1

78SP.NS.7) 1.-,a 1.3,b 1.--,b 1.-3,b 1..-,a 1..3,b, c d 1.1-,b 1.13,b 1..,c 1.2,c 1.-.,a 1.-2,c 1...,c 1..2,b, c 1.1,a, c 1.4,b 1.-1,b 1.-4,b 1..1,c 1..4,b, c 1.E,c 1.H,a 1.-E,c 1.-H,b 1..E,b 1..H,a 1.5,a 1.-0,d 1.-5,b 1..0,c 1..5,c 1.10,b, c, 1.15,a, c 1.1H,b 1.EE,a

1.1.,c 1.11,a 1.1E,a 1.12,b 1.14,a, b, c 1.E0,a, b, c, d 1.E-,a, b, c, d 1.E.,c 1.E1,a 1.E5,c 1.E3,d 1.E2b

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

  • Instructiuni Instalare
    Instructiuni Instalare
    Document2 pagini
    Instructiuni Instalare
    Barosz
    Încă nu există evaluări
  • Tipuri de Traductoare
    Tipuri de Traductoare
    Document20 pagini
    Tipuri de Traductoare
    alexandra_dutescu
    100% (2)
  • Sub
    Sub
    Document3 pagini
    Sub
    Barosz
    Încă nu există evaluări
  • Versiondog CH
    Versiondog CH
    Document7 pagini
    Versiondog CH
    Barosz
    Încă nu există evaluări
  • Sesiune Examene-1
    Sesiune Examene-1
    Document1 pagină
    Sesiune Examene-1
    Barosz
    Încă nu există evaluări
  • Sub
    Sub
    Document3 pagini
    Sub
    Barosz
    Încă nu există evaluări
  • Versiondog - AP - Ro
    Versiondog - AP - Ro
    Document27 pagini
    Versiondog - AP - Ro
    Barosz
    Încă nu există evaluări
  • Plante
    Plante
    Document1 pagină
    Plante
    Barosz
    Încă nu există evaluări
  • Capitol Ul 13
    Capitol Ul 13
    Document17 pagini
    Capitol Ul 13
    Barosz
    Încă nu există evaluări
  • ADA Layout Manual
    ADA Layout Manual
    Document8 pagini
    ADA Layout Manual
    Annemarie Hansen
    Încă nu există evaluări
  • Adresgfha Service Samsung
    Adresgfha Service Samsung
    Document1 pagină
    Adresgfha Service Samsung
    Barosz
    Încă nu există evaluări
  • Functionare Turbosuflanta
    Functionare Turbosuflanta
    Document3 pagini
    Functionare Turbosuflanta
    Alex
    Încă nu există evaluări
  • Capitol Ul 12
    Capitol Ul 12
    Document17 pagini
    Capitol Ul 12
    Barosz
    Încă nu există evaluări
  • Capitol Ul 11
    Capitol Ul 11
    Document14 pagini
    Capitol Ul 11
    Barosz
    Încă nu există evaluări
  • Capitol Ul 7
    Capitol Ul 7
    Document26 pagini
    Capitol Ul 7
    Barosz
    Încă nu există evaluări
  • Capitol Ul 5
    Capitol Ul 5
    Document16 pagini
    Capitol Ul 5
    Barosz
    Încă nu există evaluări
  • Capitol Ul 9
    Capitol Ul 9
    Document13 pagini
    Capitol Ul 9
    Barosz
    Încă nu există evaluări
  • Capitol Ul 10
    Capitol Ul 10
    Document20 pagini
    Capitol Ul 10
    Barosz
    Încă nu există evaluări
  • Capitol Ul 8
    Capitol Ul 8
    Document51 pagini
    Capitol Ul 8
    Barosz
    Încă nu există evaluări
  • Capitol Ul 6
    Capitol Ul 6
    Document18 pagini
    Capitol Ul 6
    Barosz
    Încă nu există evaluări
  • Capitol Ul 1
    Capitol Ul 1
    Document8 pagini
    Capitol Ul 1
    Barosz
    Încă nu există evaluări
  • Capitol Ul 4
    Capitol Ul 4
    Document38 pagini
    Capitol Ul 4
    Barosz
    Încă nu există evaluări
  • Capitol Ul 2
    Capitol Ul 2
    Document13 pagini
    Capitol Ul 2
    Barosz
    Încă nu există evaluări
  • Capitolul 3
    Capitolul 3
    Document21 pagini
    Capitolul 3
    baratkyy5555
    100% (1)
  • Capitolul 1 - Cibernetica
    Capitolul 1 - Cibernetica
    Document36 pagini
    Capitolul 1 - Cibernetica
    alexandru_roman_9
    Încă nu există evaluări
  • Capitolul 4 ISSC
    Capitolul 4 ISSC
    Document15 pagini
    Capitolul 4 ISSC
    Barosz
    Încă nu există evaluări
  • Teorie Masurare Debite
    Teorie Masurare Debite
    Document38 pagini
    Teorie Masurare Debite
    Razvan Preda
    Încă nu există evaluări
  • Reprez Grafica
    Reprez Grafica
    Document1 pagină
    Reprez Grafica
    Barosz
    Încă nu există evaluări
  • Mat A
    Mat A
    Document1 pagină
    Mat A
    Barosz
    Încă nu există evaluări