![]() |
Autor artykułu: mgr Jerzy Wałaszek, wersja1.0 |
©2010 mgr
Jerzy Wałaszek
|
Mamy dany dowolny trójkąt o bokach równych a, b i c:

Obliczamy parametr p równy połowie obwodu tego trójkąta:

Aby obliczyć pole tego trójkąta, stosujemy wzór Herona:

Poniższy program oblicza pole trójkąta o znanych długościach
boków:
Przykładowe dane dla programu:
a = 1
b = 1
c = 1.4142 (wpisując c, zwróć uwagę na wpisanie
kropki po 1, a nie przecinka!)
S = 0.5000
// Wzór Herona - wersja nr 1
// (C)2010 I LO w Tarnowie
//------------------------
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
double a,b,c,p,S;
// ustawiamy strumień cout do pracy z liczbami rzeczywistymi
cout << fixed << setprecision(4);
cout << "Obliczanie pola trojkata wzorem Herona\n"
"======================================\n\n";
// odczytujemy długości boków
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
cout << "c = "; cin >> c;
// Obliczamy pole trójkąta
p = (a + b + c) / 2;
S = sqrt(p * (p-a) * (p-b) * (p-c));
// wyświetlamy wyniki
cout << "\n------------\n\n"
"S = " << S << endl;
return 0;
}
|
Często trójkąt będzie zadany współrzędnymi wierzchołków A, B i C.

Danymi wejściowymi będą współrzędne:
dla wierzchołka A: xA, yA
dla wierzchołka B: xB, yB
dla wierzchołka C: xC, yC
Aby rozwiązać to zadanie, musimy umieć policzyć odległość pomiędzy dwoma punktami na płaszczyźnie kartezjańskiej:

Poprowadźmy prostą równoległą do osi OX, aby przechodziła przez punkt A, oraz prostą równoległą do osi OY, aby przechodziła przez punkt B:

Proste te wyznaczą nam trójkąt prostokątny:

W trójkącie prostokątnym obowiązuje twierdzenie Pitagorasa:

Zatem poszukiwany bok c możemy wyliczyć ze wzoru:

Aby rozwiązać ten nowy problem, musimy wyznaczyć długości odcinków a i b. W tym celu rzutujemy prostopadle punkty A i B na osie OX i OY:

Na osiach otrzymamy współrzędne tych punktów: A (xA,yA) i B (xB,yB). Poszukiwane długości są długościami przedziałów a: (xA,xB) i b (yA,yB). Długość przedziału obliczamy, odejmując od jego końca początek. Zatem:

Odległości te wstawiamy do wzoru na c, otrzymując ostatecznie:

W przypadku naszego trójkąta należy obliczyć odległości pomiędzy wierzchołkami:

Obliczenia te będą wymagały trzykrotnego zastosowania wzoru na odległość pomiędzy dwoma punktami. Powtarzające się obliczenia lepiej umieścić w funkcji. Znamy już jedną funkcję - main(). Programista może tworzyć w programie swoje własne funkcje. Funkcja jest fragmentem programu, który można wielokrotnie wykorzystywać. Definicja funkcji w języku C++ wygląda następująco:
typ_wyniku nazwa(argumenty)
{
treść funkcji
return wartość_zwracana;
}
typ_wyniku określa rodzaj informacji, którą funkcja zwraca. Może to być jeden ze znanych nam typów int, unsigned lub double.
nazwa - dowolna nazwa wymyślana przez programistę. Zasady tworzenia nazw funkcji są identyczne jak dla zmiennych. Nazwa umożliwia odwołanie się do funkcji w programie.
argumenty - informacja przekazywana do funkcji. Argumenty mają postać listy:
typ nazwa, typ nazwa, ...
treść funkcji - tutaj umieszczamy instrukcje C++, które są niezbędne do wykonania zadania realizowanego przez funkcję.
return wartość_zwracana - tutaj określamy, co funkcja zwraca jako swój wynik. Wartość zwracana jest dowolnym wyrażeniem. Komputer oblicza jego wartość i zwraca jako wynik działania funkcji.
Poniższy program odczytuje współrzędne trzech wierzchołków, oblicza odległości pomiędzy nimi i na tej podstawie wylicza pole trójkąta zdefiniowanego przez te wierzchołki.
Dane wejściowe dla programu:

xa = 1
ya = 1
xb = 2
yb = 1
xc = 1
yc = 2
S = 0.5000
// Wzór Herona - wersja nr 2
// (C)2010 I LO w Tarnowie
//------------------------
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
// Oblicza odległość pomiędzy dwoma punktami
double odcinek(double xa,double ya,double xb,double yb)
{
return sqrt((xb-xa)*(xb-xa) + (yb-ya)*(yb-ya));
}
int main()
{
double xa,ya,xb,yb,xc,yc;
double a,b,c,p,S;
// ustawiamy strumień cout do pracy z liczbami rzeczywistymi
cout << fixed << setprecision(4);
cout << "Obliczanie pola trojkata wzorem Herona\n"
"======================================\n\n";
// odczytujemy współrzędne wierzchołków
cout << "xa = "; cin >> xa;
cout << "ya = "; cin >> ya;
cout << endl;
cout << "xb = "; cin >> xb;
cout << "yb = "; cin >> yb;
cout << endl;
cout << "xc = "; cin >> xc;
cout << "yc = "; cin >> yc;
cout << endl;
// obliczamy długości boków trójkąta
a = odcinek(xa,ya,xb,yb);
b = odcinek(xb,yb,xc,yc);
c = odcinek(xc,yc,xa,ya);
// Obliczamy pole trójkąta
p = (a + b + c) / 2;
S = sqrt(p * (p-a) * (p-b) * (p-c));
// wyświetlamy wyniki
cout << "\n------------\n\n"
"S = " << S << endl;
return 0;
}
|
Na koniec dodamy do programu test na trójkąt prostokątny. Jeśli trójkąt jest trójkątem prostokątnym, to powinien spełniać jeden z warunków:

Dlaczego jeden z trzech, a nie pierwszy? Otóż nie wiemy, które z boków a, b i c są przyprostokątnymi i przeciwprostokątną. Dlatego musimy przetestować wszystkie trzy możliwości. Wystarczy, że jedna z nich będzie spełniona, aby trójkąt był prostokątny. Pamiętamy jednakże, iż liczb zmiennoprzecinkowych NIE WOLNO przyrównywać do siebie. Dlatego będziemy badać ich różnice:

// Wzór Herona - wersja nr 3
// (C)2010 I LO w Tarnowie
//------------------------
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
// Oblicza odległość pomiędzy dwoma punktami
double odcinek(double xa,double ya,double xb,double yb)
{
return sqrt((xb-xa)*(xb-xa) + (yb-ya)*(yb-ya));
}
int main()
{
double xa,ya,xb,yb,xc,yc;
double a,b,c,p,S;
// ustawiamy strumień cout do pracy z liczbami rzeczywistymi
cout << fixed << setprecision(4);
cout << "Obliczanie pola trojkata wzorem Herona\n"
"======================================\n\n";
// odczytujemy współrzędne wierzchołków
cout << "xa = "; cin >> xa;
cout << "ya = "; cin >> ya;
cout << endl;
cout << "xb = "; cin >> xb;
cout << "yb = "; cin >> yb;
cout << endl;
cout << "xc = "; cin >> xc;
cout << "yc = "; cin >> yc;
cout << endl;
// obliczamy długości boków trójkąta
a = odcinek(xa,ya,xb,yb);
b = odcinek(xb,yb,xc,yc);
c = odcinek(xc,yc,xa,ya);
// Obliczamy pole trójkąta
p = (a + b + c) / 2;
S = sqrt(p * (p-a) * (p-b) * (p-c));
// wyświetlamy wyniki
cout << "\n------------\n\n"
"S = " << S << endl << endl;
// sprawdzamy, czy trójkąt jest prostokątny
double ak,bk,ck,EPS;
ak = a * a;
bk = b * b;
ck = c * c;
EPS = 0.00001;
if((fabs(ak+bk-ck) < EPS) || (fabs(bk+ck-ak) < EPS) || (fabs(ck+ak-bk) < EPS))
cout << "Trojkat jest prostokatny\n\n";
return 0;
}
|
![]() | I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe