Sunteți pe pagina 1din 7

Lucrarea № 2

Tema: Operatori, operanzi, expresii.


Scopul lucrării: Utilizarea corectă a operatorilor, construcț ia corectă a
expresiilor cu respectarea regulilor de conversie implicită şi conversie forţată a
datelor.
Indicaţii şi sugestii de lucru:
Funcţiile matematice, cum ar fi pow( x, y), sin( x ) ş.a. au prototipul lor în fişierul
<math.h>.
Funcţia pow( x, y ) calculează xy şi are prototipul double pow( double x, double
y ). Funcţia sin( x ) calculează valoarea funcţiei sinus de unghiul x exprimat în
radiani. Ea are prototipul double sin( double x ); Toate funcțiile trigonometrice
presupun argumentul exprimat în radiani. Pentru a transforma gradele în
radiani se înmulțesc gradele cu 𝜋/180, unde constanta 𝜋 =3.14159265358979.
1
Media geometrică a numerelor a1, a2, ... , an este (𝑎1 ∙ 𝑎2 ∙ … ∙ 𝑎𝑛 )𝑛
O expresie este formată din unul sau mai mulţi operanzi legaţi între ei prin
operatori. Un operator este o operaţie care trebuie efectuată asupra unei sau
mai multor date. Un operand este o constantă, un nume de variabilă, un apel
de funcţie etc. La evaluarea unei expresii se ţine seama de prioritatea
operatorilor, asociativitatea lor şi de regula conversiilor implicite. Ordinea
efectuării operaţiilor poate fi schimbată cu ajutorul parantezelor rotunde, care
au cea mai mare prioritate. Regula conversiilor implicite este următoarea. Mai
întâi toţi operanzii de tip char, short int şi enum din expresie sunt convertiţi spre
tipul int. Apoi, dacă operatorul este aplicat la doi operanzi de acelaşi tip, atunci
se execută operaţia respectivă şi rezultatul va avea acelaşi tip. Dacă operatorul
este aplicat la doi operanzi de tip diferit, atunci operandul de tip ”mai mic” este
convertit spre tipul ”mai mare” al celuilalt operand şi apoi este executată
operaţia. Rezultatul va avea tipul ”mai mare”. În ordine descrescătoare
”mărimea” tipurilor este: long double, double, float, unsigned long, long,
unsigned int, int ( în ordine descrescătoare după numărul de octeţi necesari
pentru a păstra în memorie o valoare de tipul respectiv ).

Conversii explicite, expresii cast. Pentru a converti în mod explicit un operand


la tipul necesar, se foloseşte construcţia ( tip ) operand. De exemplu, (int) x
convertește operandul x spre tipul int.
Operatorii de relaţie sunt: < - mai mic, <= - mai mic sau egal, > - mai mare,
>= - mai mare sau egal.
Operatorii de egalitate sunt: == - egal, != - diferit.
Operatorii logici sunt: ! – negarea logică, && - şi logic, || - sau logic. Ei se
definesc în felul următor. !a are valoarea 0 ( false ), dacă a are o valoare diferită
de 0, şi are valoarea 1( true ), dacă a are valoarea 0. a&&b are valoarea 1, atunci
şi numai atunci, când şi a şi b au valori diferite de 0. a||b are valoarea 0 atunci
şi numai atunci, când şi a şi b au valoarea 0.

Rezultatul unui operator logic, operator de relaţie sau operator de egalitate este
1 (true) sau 0 (false) şi are tipul int.
Operatorii logici pe biţi sunt: ~ - complement faţă de 1, << - deplasare la
stânga, >> - deplasare la dreapta, & - şi logic pe biţi, ^ - sau exclusiv logic
pe biţi, | - sau logic pe biţi. Aceşti operatori se aplică la operanzi de tip int.
Exemple de programe:
Exemplul 2.1. Programul citește două numere şi apoi le afişează în ordine
crescătoare.
#include <stdlib.h>
#include <stdio.h>
int main()
{ float a,b;
scanf(“%f %f”,&a,&b);
printf(“Numerele citite: %f\t%f\n”,a,b);
printf(“Numerele ordonate: %f\t%f”, a>b ? b : a, a>b ? a: b );
return 0; }

Exemplul 2.2. Programul citeşte trei cifre şi apoi determină dacă numărul
format din aceste trei cifre este divizibil prin trei.
#include <stdlib.h>
#include <stdio.h>
int main()
{ unsigned a,b,c;
scanf(“%u %u %u”,&a,&b,&c);
(a+b+c)%3==0 ? printf(“Da”) : printf(“Nu”);
; return 0; }

Exemplul 2.3. Programul evaluează expresiile !a&&b, !c||d, !e&&f||!f&&e.


#include <stdlib.h>
#include <stdio.h>
int main()
{ int a,b; float c,d; double e,f;
scanf(“%d %d”,&a,&b);
printf(“\na=%-d\tb=%-d\t!a&&b=%-d\n\n”, a,b, !a&&b);
scanf(“%f %f”,&c,&d);
printf(“\nc=%-f\td=%-f\t!c||d=%-d\n\n”, c,d, !c||d);
scanf(“%lf %lf”,&e,&f);
printf(“\ne=%-lf\tf=%-lf\t!e&&f||!f&&e=%-d”, e,f, !e&&f||!f&&e);
; return 0; }

Exemplul 2.4. Programul determină n=max(a,b,c), calculând d=max(a,b) şi apoi


n=max(d,c) pentru trei numere date a, b, c. Însă programul propus în continuare
dă un rezultat greşit, chiar imprevizibil. De ce?! Modificaţi programul pentru a
obţine rezultatul corect.
#include <stdlib.h>
#include <stdio.h>
int main( )
{ unsigned a=5,b=2,c=3,d,n;
printf(“a=%-u\tb=%-u\tc=%-u\t max(a,b)=%-u\tmax(a,b,c)=
%u”,a,b,c,d=a>b?a:b,n=d>c?d:c);
getch();
}

Exemplul 2.5. Programul citeşte două numere întregi şi testează operatorii<< şi


>>.Testaţi programul pentru x=1, u=4; x=2, u=8; x=3, u=5; x=216, u=214; x=-1,
u=-1; x=-2, u=-2; x=-4, u=-4; x=-5, u=-5; Interpretați rezultatele.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{ long x,y; int u,w;
printf(“Introdu x si u ”);
scanf(“%ld %d”,&x,&u);
w=u<<2; printf(“u=%-d\t%-d<<2=%-d\n”,u,u,w);
y=x>>2; printf(“x=%-ld\t%-ld>>2=%-ld\n”,x,x,y);
return 0; }

Exemplul 2.6. Programul citeşte un număr întreg s şi determină cel mai mic
număr impar care nu este mai mic decât s.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{ int s;
scanf(“%d”,&s);
printf(“s=%-d\ts|1=%-d”, s, s|1 );
return 0; }

Probleme de rezolvat:
Elaboraţi programe pentru sarcinile ce urmează. Salvaţi programele pe server.
2.0. Introduceţi şi verificaţi, lansând la execuţie, programele din exemplele 2.1 -
2.6.
2.1. Programul citeşte un număr x de tip float, calculează y = 3.5x3 -3.5x2 + 3.5x
- 3.5 şi afişează valorile pentru x, y.
2.2. Programul citeşte un număr x de tip int, calculează p = 3x2 + 7x + 17 şi
afişează valorile pentru x, p.
Încercaţi pentru x = 1, 10, 100, 1000. Explicaţi de ce unele rezultate nu sunt
corecte.
2.3. Programul citeşte un număr x de tip double, calculează a = x19 + x15 + x9 +
x5+1 şi afişează valorile pentru x și a.
Folosiţi funcţia pow(x,y) pentru a calcula xy.
Încercaţi pentru x=1, 10, 100, 1000. Explicaţi de ce unele rezultate nu sunt
corecte.
2.4. Programul citeşte argumentul x şi coeficienţii c0, c1, c2, c3, c4 de tip double
ai polinomului q = c4x4 + c3x3 + c2x2 + c1x + c0, calculează valoarea polinomului
q şi afişează valorile lui x şi q.
2.5. Programul citeşte cu ecou o literă minusculă ( majusculă ) şi apoi o afişează
ca literă majusculă ( minusculă ).
Ce se întâmplă dacă tastaţi un caracter diferit de litera cerută?
2.6. Programul citeşte două numere întregi şi afişează numerele citite şi media
lor geometrică ce are două zecimale.
2.7. Programul citeşte valoarea unui unghi exprimată în grade, minute şi
secunde prin trei numere întregi g, m, s şi afişează valoarea unghiului în radiani
şi valoarea funcției sinus de unghiul respectiv.
Folosiţi funcţia sin( x ).
2.8. Programul citeşte un număr n de tip int şi altul r de tip double şi afişează
0, dacă r>n şi -1 în caz contrar. Folosiți operatorul condițional.
2.9. Programul citeşte un număr w şi afişează 2000, dacă 1000 < = w < = 2000
şi 1000 în caz contrar. Folosiți operatorul condițional.
2.10. Programul citeşte un număr întreg care semnifică un an calendaristic şi
afişează 1, dacă anul e bisect şi 0 în caz contrar. Folosiţi operatorul condițional
Anul e bisect, dacă se împarte fără rest la 4 şi nu se împarte la 100 sau, dacă se
împarte fără rest la 400.
2.11. Programul citeşte un număr întreg ce semnifică un an calendaristic şi
afişează anul şi numărul de zile din anul respectiv. Folosiţi operatorul
condițional.
2.12. Programul citeşte un număr x, calculează 5x2 + 4.5x, 5x2 + 4.5x + 3.5 şi
(5x2 + 4.5x - 1.5) / (5x2 + 4.5x + 1.5) şi apoi afișează valorile lui x şi ale expresiilor
respective.
2.13. Programul citeşte un număr x, calculează x15, x25, x35, x45 şi afişează
rezultatele. Unele rezultate pot fi greşite. Explicaţi de ce.
2.14. Programul citeşte un număr x, afişează x, [ x ] – partea întreagă, { x }–
partea fracţionară şi valorile expresiilor 8x2 - 2x + 4, 8[x]2 - 2[x] + 4, 8{x}2 -2{x} +
4.
2.15. Programul citeşte un număr întreg nenegativ şi apoi afişează numărul citit
şi rădăcina pătrată din el.
Folosiţi funcţia sqrt( x ).
2.16. Programul citeşte un număr întreg n şi apoi afişează valoarea fracţiei (n -
1) / (n + 1) cu 13 semne zecimale.
2.17. Programul citeşte două numere şi apoi îl afişează pe cel mai mare.
Folosiţi operatorul condițional.
2.18. Programul citeşte două numere şi apoi afişează cel mai mare din modulele
lor.
Folosiţi operatorul condițional.
2.19. Programul citeşte un număr x şi apoi afişează z = 4x2 + 9x - 2000, dacă x
< 0, z = 2000, dacă x = 0 şi z = 4x2 - 2000, dacă x > 0.
Folosiţi operatorul condițional.
Întrebări de control:
2.1. Ce este o expresie, un operand, un operator; ce operatori cunoaşteţi?
2.2. Ce este o expresie logică? Ce valori poate avea o expresie logică şi care este
tipul lor?
2.3. Explicaţi regula conversiilor implicite.
2.4. Ce este o expresie cast? Explicaţi operatorul de conversie explicită.
2.5. Explicaţi cum se utilizează operatorii sizeof şi &.
2.6.Explicaţi cum se utilizează operatorii condiţionali ? şi : .
2.7. Ce specificatori de format se folosesc pentru a citi şi a scrie date de tip
caracter şi şiruri de caractere?
2.8. Ce specificatori de format se folosesc pentru a citi şi a scrie date întregi?
2.9. Ce specificatori de format se folosesc pentru a citi şi a scrie date numerice
flotante de precizie ordinară ( tipul float )?
2.10. Ce specificatori de format se folosesc pentru a citi şi a scrie date numerice
flotante de precizie dublă ( tipul double )?
2.11. Ce specificatori de format se folosesc pentru a citi şi a scrie date numerice
flotante de tipul long double?
2.12. Ce tip au constantele: ‘c’, 3, 3.14, 3.14l, “3.14”?
2.13. Ce este prototipul unei funcţii, unde şi cum se foloseşte?
2.14. În care fişier se află prototipurile funcţiilor pow( x, y ), poly( x, n, c[ ] ), cos(
x ), sqrt( x )?
2.15. Care este diapazonul pentru valorile de tip: int, long, unsigned, long
unsigned?
2.16. Care este diapazonul pentru valorile de tip: float, double, long double?
2.17. Care este diapazonul pentru valorile de tip: char, unsigned char?
2.18. Cum se evaluează expresia ( Pi < 2 )+3.4 şi care este tipul valorii acestei
expresii, dacă pi este de tipul float?
2.19. Fie unsigned int x; long y; Cum se evaluează expresia x + y?
2.20. Fie char c; c=’R’ + ’b’ - ‘B’; Care este tipul valorii calculate şi ce va
afişa printf ( “%d”, c );?
2.21. Fie int x = 2, y; y = x++; x = --y; Care este valoarea lui x?
2.22.Fie const int x = 3.14, y = 2.72; x = y; Care sunt valorile lui x şi y şi ce tip
au?
2.23.Fie int x = 1; x = 5, x = 4, x = 3, x = 2; Care-i valoarea lui x?
2.24. Fie int n = 1, m = 2, t = 3, z = 4; t = n/m; z = n%m; Care sunt valorile lui t
şi z?
2.25. Explicaţi cum lucrează funcţiile abs( ), ceil( ), floor( ). Utilizaţi help-ul.

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