Sari la conținut
EduCamp
Titularizare 2023 Teorie 15 puncte ✓ GRATUIT

Subiectul I, cerința 1

Datele de tip real

Tipul double și reprezentarea lui pe 8 octeți, patru constante reale scrise în forme diferite, operatorii și funcțiile predefinite pentru date reale și programul care calculează distanța dintre două puncte și mijlocul segmentului.

Limbajul de programare ales este C++.

Tipul real ales

Tipul real ales este double. O valoare de tip double se reprezintă în memorie în virgulă mobilă, pe 8 octeți. Valorile nenule ale tipului au, în valoare absolută, ordinul de mărime cuprins între 1,7·10⁻³⁰⁸ și 1,7·10³⁰⁸.

Pe lângă double, limbajul C++ are tipul real float, cu valorile reprezentate pe 4 octeți, și tipul long double, cu precizia cel puțin egală cu a tipului double.

Patru declarări cu inițializare

În C++, o constantă reală se scrie în forma uzuală sau în formatul exponențial, numit și științific. În forma uzuală, punctul desparte partea întreagă de partea zecimală. Formatul exponențial adaugă după număr litera e sau E, urmată de exponentul puterii lui 10.

DeclarațiaParticularitatea constanteiValoarea
double a = 3.75;forma uzuală: partea întreagă și partea zecimală sunt despărțite prin punct, nu prin virgulă3,75
double b = -.5;partea întreagă lipsește, iar constanta începe cu punctul zecimal−0,5
double c = 7.;partea zecimală lipsește; punctul face din 7 o constantă reală, nu una întreagă7
double d = 1.2e-10;format exponențial, cu exponent negativ1,2·10⁻¹⁰ = 0,00000000012

În format exponențial, valoarea numărului se obține înmulțind numărul scris înaintea literei e cu 10 la puterea scrisă după ea. Litera poate fi și majusculă, iar exponentul poate avea semn: -2.67E+8 reprezintă −267 000 000.

Doi operatori

Operatorul de împărțire, /. Se aplică atât operanzilor întregi, cât și celor reali, dar funcționează diferit. Pentru doi operanzi întregi, rezultatul este câtul împărțirii întregi. Este suficient ca unul dintre operanzi să fie real pentru ca împărțirea să fie reală.

int n = 7;
double x = 7;
cout << n / 2;      // 3    - impartire intreaga
cout << x / 2;      // 3.5  - impartire reala
cout << n / 2.0;    // 3.5  - impartitorul este o constanta reala

Operatorul de conversie explicită, (tip). Transformă valoarea unei expresii în tipul scris între paranteze. Aplicat unei valori reale, cu tipul int, păstrează numai partea întreagă a acesteia. Aplicat unui operand întreg, cu tipul double, face ca împărțirea să fie reală.

double y = 3.75;
int a = 10, b = 4;
cout << (int)y;             // 3
cout << (double)a / b;      // 2.5

Trei funcții predefinite

Funcțiile matematice sunt declarate în fișierul antet cmath, care se include la începutul programului cu #include <cmath>.

FuncțiaPrototipulEfectulExemplu
sqrtdouble sqrt(double x);furnizează rădăcina pătrată a lui x, pentru x ≥ 0sqrt(2.25) are valoarea 1.5
fabsdouble fabs(double x);furnizează valoarea absolută a numărului real xfabs(-3.2) are valoarea 3.2
floordouble floor(double x);furnizează cel mai mare întreg mai mic sau egal cu x, ca valoare realăfloor(1.2) are valoarea 1, iar floor(-1.2) are valoarea −2

Exemplu de utilizare în rezolvarea unei probleme

Enunțul

Se citesc de la tastatură patru numere reale, reprezentând coordonatele carteziene (xA, yA) și (xB, yB) ale punctelor A și B din plan. Să se afișeze pe ecran distanța dintre cele două puncte și coordonatele mijlocului M al segmentului AB, cu câte două zecimale.

Exemplu: pentru datele 1 2 4 6 se afișează AB = 5.00 și, pe linia următoare, M(2.50, 4.00).

Descrierea soluției în limbaj natural

Coordonatele se memorează în variabile de tip double, fiindcă pot avea parte zecimală. Tot de tip double sunt și rezultatele: distanța și coordonatele mijlocului pot fi numere reale chiar dacă punctele au coordonate întregi.

Distanța dintre puncte se calculează cu formula

AB = √((xB − xA)² + (yB − yA)²),

în care pătratele se obțin cu funcția pow, iar rădăcina pătrată cu funcția sqrt.

Coordonatele mijlocului sunt mediile aritmetice ale coordonatelor capetelor:

xM = (xA + xB) / 2, yM = (yA + yB) / 2.

Suma coordonatelor este de tip double, deci împărțirea la 2 este împărțire reală.

Rezultatele se afișează cu două zecimale, stabilite prin manipulatorii fixed și setprecision(2).

Implementarea

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

int main() {
    double xA, yA, xB, yB, d, xM, yM;

    cin >> xA >> yA >> xB >> yB;

    d = sqrt(pow(xB - xA, 2) + pow(yB - yA, 2));
    xM = (xA + xB) / 2;
    yM = (yA + yB) / 2;

    cout << fixed << setprecision(2);
    cout << "AB = " << d << "\n";
    cout << "M(" << xM << ", " << yM << ")";

    return 0;
}

Pentru datele din exemplu, AB = √((4 − 1)² + (6 − 2)²) = √(9 + 16) = √25 = 5, iar mijlocul are coordonatele xM = (1 + 4) / 2 = 2,5 și yM = (2 + 6) / 2 = 4.

Rezolvarea se poate citi pe educamp.ro, la adresa de mai sus.

Actualizat: 22 septembrie 2026