Cum calculam aria unui trapez oarecare daca se cunosc laturile trapezului?

Problema se poate gasi pe site pbinfo#Arie trapez

Cerința

Se dau lungimile laturilor unui trapez ABCD cu AB||CD. Aflati aria acestuia.

Date de intrare

Programul citește de la tastatură lungimile laturilor AB, BC, CD, AD.

Date de ieșire

Programul va afișa pe ecran numărul A reprezentand aria trapezului, cu 2 zecimale exacte, daca trapezul este valid, altfel se afiseaza mesajul Imposibil.

Restricții și precizări

  • 1 ≤ AB, BC, CD, AD ≤ 1000

Aria trapezului poate fi calculata in general cu formula bine cunoscuta (baza mare + baza mica) x inaltimea / 2.

In acest caz insa nu cunoastem inaltimea trapezului ci laturile sale neparalele.

O metoda ar fi sa determinam efectiv inaltimea trapezului, dar se cunoaste in literatura de specialitate si o formula de calcul a ariei unui trapez in functie de toate cele patru laturi ale sale. Este o relatie mai rar utilizata.

aria=(a+b)/2 *sqrt(c*c-m*m) unde m=((b-a)*(b-a)+c*c-d*d)/(2*(b-a))

Aceasta metoda o vom aborda in rezolvarea acestei probleme.

Textul problemei cere de asemenea tiparirea rezultatului final cu 2 zecimale exacte adica fara rotunjire.

Pentru aceasta stiind ca numarul final obtinut in variabila arie va fi un numar real, il convertim la un numar intreg in variabila ajutatoare ariel . De fapt luam partea intreaga a numarului real obtinut ca arie.

Folosim un artificiu de calcul in care inmultim si impartim cu 100 pentru a putea retine primele 2 zecimale fara a permite rotunjirea lor automata.

Aria unui trapez oarecare a carui laturi se cunosc, va fi calculata astfel conform cerintelor problemei.


#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main()
{
    double a,b,c,d;
    cin >> b >> d >> a >> c;
    // aria=(a+b)/2 *sqrt(c*c-m*m)
    // m=((b-a)*(b-a)+c*c-d*d)/(2*(b-a))
    double m=((b-a)*(b-a)+c*c-d*d)/(2*(b-a));
    double n=c*c-m*m;

    if(b!=a && n>0){
        double arie=(a+b)/2 *sqrt(n);
        long long ariel=arie;
        arie=ariel+(int)((arie-ariel)*100)/100.0;
        cout << setprecision(2) << fixed << arie<< endl;
    }else{
        cout << "Imposibil"<< endl;
    }
    return 0;
}

Daca cauti mai multe probleme rezolvate de pe site pbinfo, poti sa mai gasesti pe site-ul nostru in categoria Invata cu noi.
Te asteptam cu intrebari si sugestii pe aceasta tema!

Lasă un răspuns