3.2.1. Operatorii aritmetici

2019/01/21 in Programare in C

Operatorii aritmetici se utilizeaza la efectuarea calculelor cu date de diferite tipuri predefinite. Acestia sunt:

  1. operatorii unari + si -;
  2. operatorii binari multiplicativi: *, / si %;
  3. operatorii binari aditivi: + si -.

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

Operatorii unari au aceeasi prioritate. Ei se asociaza de la dreapta spre stanga.

Operatorii multiplicativi au aceeasi prioritate.

Operatorii aditivi au aceeasi prioritate.

Operatorii binari se asociaza de la stanga la dreapta.

Operatorul unar + nu are niciun efect.

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

Operatorul * reprezinta operatorul de inmultire al operanzilor la care se aplica.

Operatorul / reprezinta operatorul de impartire a valorii operandului pe care il precede la valoarea operandului care il urmeaza. In cazul in care ambii operanzi sunt intregi (int, unsigned sau long) se realizeaza o impartire intreaga, adica rezultatul impartirii este partea intreaga a catului.

Operatorul % se aplica numai la operanzi intregi si are ca rezultat restul impartirii intregi a valorilor operanzilor sai.

Operatorii binari + si - reprezinta operatiile obisnuite de adunare si scadere din matematica.

Exemple:

1. 1234 si +1234 sunt expresii care au aceeasi valoare si acelasi tip.

Prima se reduce la operandul 1234, care este o constanta de tip int.

A doua se compune din operandul 1234, la care se aplica operatorul unar +, care nu are niciun efect.

2. -1234 este o expresie care se compune din operandul 1234 la care se aplica operatorul unar de negativare.

3. 7/3

Deoarece operanzii sunt intregi, se realizeaza impartirea intreaga a lui 7 la 3. Se obtine valoarea 2 de tip int.

4. 7%3

Expresia are ca valoare restul impartirii lui 7 la 3, deci are valoarea 1.

5. -7%3

Expresia are ca valoare restul impartirii lui -7 la 3, deci are valoarea -1.

Exercitii:

3.1. Sa se scrie un program care citeste valoarea lui x, calculeaza valoarea polinomului p(x)=3x2-8x+7 si afiseaza rezultatul. Variabila x este de tip intreg.

#include <stdio.h>

main()
{
    int x;

    printf("tastati valoarea lui x=");
    scanf("%d", &x);
    printf("x=%d\tp(x)=%d\n", x, 3*x*x - 8*x + 7);
}

Observatii:

La cel de-al doilea apel printf s-a folosit secventa escape '\t' pentru a separa x de rezultatul lui p(x).

Rezultatul calculului este incorect daca cel putin un rezultat partial depaseste intervalul valorilor de tip int [-32768, 32767].

In general, daca operanzii unui operator binar au acelasi tip t, atunci rezultatul aplicarii operatorului are tipul t. In cazul in care rezultatul este in afara intervalului de valori corespunzator tipului t, rezultatul aplicarii operatorului este eronat.

Daca un operator binar se aplica la operanzi de tipuri diferite, se aplica regula conversiilor implicite.

3.2. Sa se scrie un program care citeste valoarea lui x, calculeaza valoarea polinomului f(x)=3,5x3-9,8x+3,7 si afiseaza rezultatul. Calculele se fac in flotanta dubla precizie.

#include <stdio.h>

main()
{
    double x;

    printf("tastati valoarea lui x=");
    scanf("%lf", &x);
    printf("x=%g\tf(x)=%lf\n", x, 3.5*x*x*x - 9.8*x + 3.7);
}

Observatie: Constantele flotante 3.5, 9.8 si 3.7 se considera de tip double.

3.3. Sa se scrie un program care citeste valoarea lui x, calculeaza valoarea polinomului a(x)=3x20-6x16+8x9-7x5+1 si afiseaza rezultatul. Calculele se fac in flotanta dubla precizie.

In acest exemplu intervin puteri mari ale lui x. Pentru a evita expresii de forma: x*x*...*x, unde x sa se repete de 20 de ori, vom apela la functia pow care realizeaza ridicarea la putere. Ea are prototipul in fisierul math.h si acesta este:

double pow(double x, double y);

La revenire se returneaza xy, rezultatul fiind de tip double.

#include <stdio.h>
#include <math.h>

main()
{
    double x;

    printf("tastati valoarea lui x=");
    scanf("%lf", &x);
    printf("x=%g\ta(x)=%g\n", x, 3.0*pow(x,20.0) - 6.0*pow(x,16.0) + 8.0*pow(x,9.0) - 7.0*pow(x,5.0) + 1.0);
}

3.4. Sa se scrie un program care citeste valoarea variabilei x si a coeficientilor polinomului q(x)=c4*x4+c3*x3+c2*x2+c1*x+c0, calculeaza valoarea polinomului q(x) si afiseaza rezultatul. Calculele se fac in flotanta dubla precizie.

#include <stdio.h>
#include <math.h>

main()
{
    double x, c[5];

    printf("tastati valoarea lui x=");
    scanf("%lf", &x);
    printf("coeficientii polinomului q(x)\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\tq(x)=%g\n", x, c[4]*pow(x,4) + c[3]*pow(x,3) + c[2]*pow(x,2) + c[4]*x+c[0]);
}

3.5. Sa se scrie un program care citeste cu ecou de la tastatura o litera mica si o afiseaza ca litera mare.

Conversiile literelor mici in litere mari se realizeaza simplu in cazul utilizarii codurilor ASCII. Codurile ASCII ale literelor mici se afla in intervalul [97, 122], iar ale literelor mari in intervalul [65, 90]. Aceste coduri corespund literelor in ordine alfabetica:

Litera mica Codul ASCII Litera mare Codul ASCII
a 97 A 65
b 98 B 66
c 99 C 67
...
z 122 Z 90

Codul ASCII al unei litere mari se obtine din codul ASCII al literei mici corespunzatoare, scazand valoarea 32. Deci, daca variabila lit are ca valoare codul ASCII al unei litere mici, atunci expresia: lit-32 are ca valoare codul ASCII al literei mari corespunzatoare.

De obicei, diferenta 32 dintre codurile ASCII ale aceleiasi litere se exprima mai sugestiv prin expresia: 'a'-'A'.

Aceasta expresie are doi operanzi care sunt constante caracter, deci fiecare are tipul int. Inseamna ca tipul expresiei de mai sus este int. In acest fel, codul ASCII al literei mari se obtine cu ajutorul expresiei: lit-('a'-'A'), care se scrie mai simplu lit-'a'+'A'.

#include <conio.h>

main()
{
    putch(getche()-'a'+'A');
}

Observatie: In acest program se presupune ca se tasteaza la terminal o litera mica.

3.6. Sa se scrie un program care citeste cu ecou de la tastatura o litera mare si o afiseaza ca litera mica.

In acest caz codul literei mari se aduna cu valoarea 32, adica cu diferenta 'a'-'A'.

#include <conio.h>

main()
{
    putch(getche()+'a'-'A');
}

3.7. Sa se scrie un program care citeste un numar ce reprezinta aria unei suprafete exprimata in jugare. Se cere sa se exprime aria respectiva in hectare, prajini patrate si stanjeni patrati.

Avem regula:

1 jugar = 576 prajini patrate = 1600 stanjeni patrati = 5745,6415 m2

#include <stdio.h>

main()
{
    double aria;

    printf("Aria in jugare este:");
    scanf("%lf\n", &aria);
    printf("aria = %g hectare\n", aria*0.57456415);
    printf("aria = %g prajini\n", aria*576);
    printf("aria = %g stanjeni\n", aria*1600);
}

3.2.2. Regula conversiilor implicite