lucrarea3

12
L UCRAREA 3 1.Operatori Operatorii sunt elementele care permit efectuarea diferitelor operaţii între obiecte. În C există două mari tipuri de operatori: unari sau binari. Un operator unar se aplică unui singur operand iar un operator binar se aplică la doi operanzi. Operatorul binar se aplică la operandul care îl precede imediat şi la care îl urmează imediat. Operatorii limbajului C nu pot avea ca operanzi şiruri de caractere. Operatorii limbajului C pot fi grupaţi în mai multe clase: operatori aritmetici, operatori relaţionali, operatori logici. 1.1 Operatori aritmetici Operatorii aritmetici se utilizează la efectuarea calculelor cu date de diferite tipuri predefinite. Aceştia sunt: a) operatori unari + (adunare) şi - (scădere); b) operatori binari multiplicativi * (înmulţire), / (împărţire)şi % (restul împărţirii întregi); c) operatori binari aditivi + şi -. Operatorii unari sunt mai prioritari decât cei binari, iar operatorii multiplicativi sunt mai prioritari decât cei aditivi. Operatorul unar + nu are nici un efect. Operatorul unar – are ca efect negativarea valorii operandului pe care-l precede. Pentru operatori binari formatul operaţiilor este următorul: operand1 operator binar operand2. Aplicaţie

Upload: burican-bogdan-alexandru

Post on 18-Sep-2015

212 views

Category:

Documents


0 download

DESCRIPTION

info

TRANSCRIPT

OPERATORI

Lucrarea 3

1.Operatori

Operatorii sunt elementele care permit efectuarea diferitelor operaii ntre obiecte.

n C exist dou mari tipuri de operatori: unari sau binari.

Un operator unar se aplic unui singur operand iar un operator binar se aplic la doi operanzi. Operatorul binar se aplic la operandul care l precede imediat i la care l urmeaz imediat.

Operatorii limbajului C nu pot avea ca operanzi iruri de caractere.

Operatorii limbajului C pot fi grupai n mai multe clase: operatori aritmetici, operatori relaionali, operatori logici.

1.1 Operatori aritmetici

Operatorii aritmetici se utilizeaz la efectuarea calculelor cu date de diferite tipuri predefinite. Acetia sunt:

a) operatori unari + (adunare) i - (scdere);

b) operatori binari multiplicativi * (nmulire), / (mprire)i % (restul mpririi ntregi);

c) operatori binari aditivi + i -.

Operatorii unari sunt mai prioritari dect cei binari, iar operatorii multiplicativi sunt mai prioritari dect cei aditivi.

Operatorul unar + nu are nici un efect.

Operatorul unar are ca efect negativarea valorii operandului pe care-l precede.

Pentru operatori binari formatul operaiilor este urmtorul:

operand1 operator binar operand2.

Aplicaie

S se scrie un program care citete valoarea lui x, calculeaz valoarea polinomului a(x) = 3x20 - 6x16 + 8x9 - 7x5 + 1 i afieaz rezultatul. Calculele se fac n virgul flotant dubl precizie.

Pentru ridicarea la putere se va apela funcia pow cu prototipul:

double pow(double x, double y); , definit n fiierul math.h. Rezultatul ridicrii la putere va fi tot de tipul double.

#include

#include

main()

{

double x;

printf(tastati valoarea lui x = );

scanf(%lf, &x);

printf(x=%g\ta(x)=%g\n, x, 3*pow(x,20)-6*pow(x,16)+8*pow(x,9)-7*pow(x,5)+1);}

S se scrie un program care citete valoarea variabilei X i a coeficienilor polinomului:

q(x) = c4*x4 + c3*x3 + c2*x2+c1*x +c0,

calculeaz valoarea polinomului q(x) i afieaz rezultatul. Calculele se fac n virgul flotant dubl precizie.

Calculul valorii unui polinomului q(x) se poate face folosind funcia de bibliotec poly (definit n math.h) cu formatul urmtor:

double poly(double x, int n, double c]).

Aceast funcie returneaz valoarea polinomului de grad n, pentru valoarea lui x, coeficenii polinomului fiind c[0], c[1], c[2], ... , c[n]; c[0] este termenul liber.

#include

#include

main()

{

double x, c[5];

printf(valoarea lui x= );

scanf(%lf,&x);

printf(coeficentii polinomului \n);

printf(c0 = );

scanf(%lf, &c[0]);

printf(c1 = );

scanf(%lf, &c[1]);

printf(c2 = );

scanf(%lf, &c[2]);

printf(c3 = );

scanf(%lf, &c[3]);

printf(c4 = );

scanf(%lf, &c[4]);

printf(x = %g \t q(x)=%g \n, x, poly(x,4,c));

}

1.1.1. Regula conversiilor implicite

Aceast regul se aplic la evaluarea expresiilor. Ea acioneaz atunci cnd un operator binar se aplic la doi operanzi de tipuri diferite.

n cazul n care un operator se aplic la doi operanzi de tipuri diferite, operandul de tip inferior se convertete spre tipul superior al celuilalt operand i rezultatul este de tip superior. Ordinea operanzilor este urmtoarea: long double, double, float, unsigned long, long, unsigned int.

Regula conversiilor implicite are n vedere i nite conversii generale independente de operatori. Ea se aplic n mai muli pai.

nainte de toate se convertesc operanzii de tip char n tipul int.

Dac operatorul curent se aplic la operanzi de acelai tip, atunci se execut operatorul respectiv, iar tipul rezultatului coincide cu tipul comun al operanzilor. Dac rezultatul aplicrii operatorului reprezint o valoare n afara limitelor tipului respectiv, atunci rezultatul este eronat (are loc o "depire').

1.2. Operatori de relaie

Operatorii de relaie sunt:

=- mai mare sau egal.

Ei au aceeai prioritate care este mai mic dect a operatorilor aditivi.

O expresie de forma: E1 operator_de _relaie E2, poate avea valoarea 1 dac relaia este adevrat i 0 n caz contrar.

Aplicaie

S se scrie un program care citete dou numere, primul este de tip int, iar al doilea este de tip double. Programul afieaz valoarea 2 dac numrul flotant este mai mare dect cel ntreg i 1 n caz contrar.

#include

main()

{

int i;

double f;

scanf("%d %lf", &i, &f);

printf("i=%d \t f=%f \t %d \n", i, f, (f > i) + 1);

}

1.2.1. Operatori egalitate

Operatori de egalitate sunt doi:

= =- egal;

!=- diferit.

Ei au aceeai prioritate care este imediat mai mic dect cea a operatorilor de relaie .

O expresie de forma: E1 operator_de _relaie E2, poate avea valoarea 1 dac relaia este adevrat i 0 n caz contrar.

1.3. Operatori logici

Acetia sunt:

!- negaie logic (operator unar);

&&- i logic;

||- sau logic.

Negaia logic are aceeai proprietate ca i ceilali operatori unari ai limbajului C. De altfel, toi operatorii unari au aceeai prioritate care este imediat mai mare dect cea a operatorilor multiplicativi.

Expresia: ! a are valoarea zero (fals) dac a are o valoare diferit de zero i valoarea unu dac a are valoarea zero.

Operatorul && are prioritatea mai mic dect cei de egalitate. O expresie de forma: E1&&E2 are valoarea 1, dac expresiile E1 i E2 sunt ambele diferite de zero.

Operatorul || are prioritatea imediat mai mic dect operatorul &&. Expresia E1|| E2 are valoarea zero, dac ambele expresii E1 i E2 la care se aplic operatorul || au valoarea zero.

Aplicaie

S se scrie un program care citete un numr i afieaz unu dac numrul respectiv aparine intervalului [-1000, 1000] i zero n caz contrar.

Dac notm cu a numrul citit, atunci el trebuie s satisfac simultan relaiile:

a>=-1000

i

a=-1000)&&(a i) + 1);

}1.3.1. Operatori logici pe biiOperatorii logici pe bii sunt:

~- complement fa de unu (operator unar);

>- deplasarea dreapta;

&-i logic pe bii;

^- sau exclusiv logic pe bii;

|- sau logic pe bii.

Aceti operatori se aplic la operanzi de tip ntreg. Ei se execut bit cu bit i operanzii se extind la 16 bii dac este necesar.

Complementul fa de unu are aceeai proprietate ca ceilali operatori unari. el schimb fiecare bit al operandului cu zero i fiecare bit zero al acestuia cu 1.

Operatorul > realizeaz o deplasare la dreapta a valorii primului su operand cu un numr de poziii binare egal cu valoarea celui de-al doilea operand al su. Aceast operaie este echivalent cu o mprire cu puteri ale lui 2.

1.4. Operatorii de atribuire

Operatorul de atribuire, n forma cea mai simpl, se noteaz prin caracterul "=". El se utilizeaz n expresii de forma:

v=(expresie),

unde v este o variabil simpl, refereniaz un element de tablou sau de structur.

Operatorul de atribuire are prioritate mai mic dect toi operatorii pe care i-am ntlnit pn n prezent. Acest operator are ca efect atribuirea valorii expresiei aflat n dreapta semnalului de atribuire variabilei v.

La atribuire se face i o conversie dac este necesar. Astfel, valoarea expresiei din dreapta semnalului de atribuire se va converti spre tipul variabilei din stnga lui nainte de a se face atribuirea, dac cele dou tipuri sunt diferite.

Pentru operatorii de atribuire, n afara semnului = se mai poate folosi i succesiunea de caractere:

op=

unde op este un operator binar aritmetic sau logic pe bii. Deci op poate fi unul din operatorii:

/, % ,* ,-, +, , &, ^, | .

aceast construcie se folosete pentru a face prescurtri.

Expresia v op = expresie

este echivalent cu expresia de atribuire:

v=vop(expresie).

1.5. Operatori de incrementare i decrementare

Aceti operatori sunt unari i au aceeai prioritate ca i ceilali operatori unari ai limbajului C.

Operatorul de incrementare se noteaz ++, iar cel de decrementare se noteaz cu - -.

Operatorul de incrementare mrete valoare operandului su cu 1, iar cel de decrementare micoreaz valoarea operandului su cu 1.

Aceti operatori pot fi: prefixai (++operand sau - -operand) sau postfixai (operand++ sau operand - -).

n situaia n care un operator de incrementare sau decrementare este prefixat, se folosete valoarea operandului la care s-a aplicat operatorul respectiv.

n cazul n care un operator de incrementare sau decrementare este postfixat, se folosete valoarea operandului dinaintea aplicrii operatorului respectiv.

Exemplu:

Presupunem c valoarea x are valoarea 3. Dac considerm expresia expresia de atribuire y =++x atunci lui y i se atribuie valoarea 4 ( la atribuire se folosete valoarea incrementat).

Dac utilizm expresia de atribuire y=x++, atunci lui y i se atribuie valoarea 3 ( valoarea dinaintea incrementrii).

1.5. Operatorul de forare a tipului sau de conversie explicit

(expresie cast)

Putem s specificm conversia valorii unui operand spre un tip dat folosind o construcie de forma:

(tip) operand.

ntr-o astfel de construcie (tip) este un operator unar (operator de forare a tipului sau de conversie explicit) iar valoarea operandului se convertete spre tipul indicat n paranteze.

Aceast construcie o vom numi expresie cast.

Exemplu:

Presupunem c funcia f are un parametru de tip double. Fie declaraia:

int n;

Atunci, pentru a apela f cu parametrul n, este necesar ca, n s se converteasc spre double. Acest lucru se poate realiza printr-o atribuire:

double x;

. . .

f(x=n);

Un alt mod mai simplu de conversie a parametrului ntreg spre tipul double este utilizarea unei expresii cast:

f((double)n).

Operatorul (tip) fiind unar, are aceeai prioritate ca i ceilali operatori ai limbajului C.

1.6. Operatorul dimensiune

Dimensiunea n octei a unei date sau a unui tip se poate determina folosind operatorul sizeof. El poate fi folosit sub forma:

sizeof data sau sizeof(data)

sau

sizeof(tip)unde data poate fi:

un nume de variabil simpl;

un nume de tablou;

un nume de structur;

referirea la un element de tablou (variabil cu indici);

referirea la elementul unei structuri.

Tip poate fi:

un cuvnt sau cuvintele cheie ale unui tip predefinit;

o construcie care definete un tip.

Operatorul dimensiune (sizeof) fiind unar, are aceeai prioritate ca i ceilali operatori ai limbajului C.

Exemplu:

int x;

sizeof x are valoarea 2, deoarece pentru variabila x se aloc 2 octei.

long double y[7];

sizeof y[3];

- are valoarea 10;

sizeof y;

- are valoarea 70.

1.7. Operatorul adres

Operatorul adres este unar i se noteaz prin caracterul &. El se aplic pentru a determina adresa de nceput a zonei de memorie alocat unei date. n forma cea mai simpl, acest operator se utilizeaz n construcii de forma:

&nume

unde nume este numele unei variabile simple sau a unei structuri.

Menionm c n cazul n care nume este numele unui tablou, atunci acesta are ca valoare chiar adresa de nceput a zonei de memorie alocat tabloului respectiv. Deci n acest caz nu se mai utilizeaz operatorul &.

1.8. Operatorii parantez

Parantezele rotunde se utilizeaz fie pentru a include o expresie, fie la apelul funciilor.

Acestea au prioritate maxim.

Operanzii obinui prin includerea unei expresii ntre paranteze impun anumite limite asupra operatorilor. De exemplu, nu se pot aplica operanzii de incrementare , decrementare sau adres asupra unor expresii ntre paranteze.

Exemple de cazuri eronate:

(i+1)++ ;

(x+y);

&(x+y).

Parantezele ptrate includ expresii care reprezint indici. Ele se numesc operatori de indexare.

1.9. Operatori condiionali

Operatorii condiionali permit construirea unor expresii a cror valoare s depind de valoarea unei condiii.

Prin condiie nelegem o expresie care poate avea dou valori: adevrat sau fals. n limbajul C, o condiie se reprezint printr-o expresie oarecare.

Ea are valoarea adevrat dac este diferit de zero i fals n caz contrar.

Numim expresie condiional, o expresie a crei valoare i tip este dependent de valoarea unei condiii.

O expresie condiional are formatul:

E1?E2:E3

unde: E1, E2, E3 sunt expresii.

Aceast expresie condiional se evalueaz astfel:

Se determin valoarea expresiei E1.

Dac E1 are o valoare diferit de zero (are valoarea adevrat), atunci valoarea i tipul expresiei condiionale coincide cu valoarea i tipul expresiei E2. Altfel (adic E1 are valoarea zero) valoarea i tipul expresiei condiionale coincide cu valoarea i tipul expresiei E1.

Operatorii condiionali ? i : se folosesc totdeauna mpreun i n ordinea indicat n formatul expresiei condiionale.

Ei au o prioritate mai mic dect prioritatea operatorului sau logic (||) i imediat mai mare dect prioritatea operatorilor de atribuire.

De exemplu putem scrie: v=E1?E2:E3

Aplicaie

S se scrie un program care citete dou numere i afieaz maximul dintre ele.

#include

main()

{

double a,b;

scanf("%lf %lf", &a, &b);

printf("a= %g\t b=%g\tmax(a,b)=%g\n",a,b,a>b?a:b);

}S se scrie un program care citete valoarea variabilei x i afieaz valoarea funciei f(x) definit ca mai jos:

#include

main()

{

double x;

scanf("%lf", &x);

printf("x= %g \t f(x) =%g\n ", x, x0?4*x*x-8:2));

}

2.Aplicaii

1. S se realizeze un program care s permite introducerea a dou numere ntregi de la tastatur. Programul va afia rezultatul corect al nmulirii celor dou numere.

2. S se realizeze un program care s permite introducerea a dou numere ntregi de la tastatur. Programul va afia rezultatul corect al mpririi celor dou numere.

3. S se realizeze un program care s permit introducerea a dou numere de la tastatur. Programul va afia rezultatul 1 dac cele dou numere au acelai semn i rezultatul 0 dac cele dou numere a semne diferite.

_1076847156.unknown