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ția | Particularitatea constantei | Valoarea |
|---|---|---|
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 negativ | 1,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ția | Prototipul | Efectul | Exemplu |
|---|---|---|---|
sqrt | double sqrt(double x); | furnizează rădăcina pătrată a lui x, pentru x ≥ 0 | sqrt(2.25) are valoarea 1.5 |
fabs | double fabs(double x); | furnizează valoarea absolută a numărului real x | fabs(-3.2) are valoarea 3.2 |
floor | double 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.