Proste programy w C++ – pole trójkąta

niedziela, 19 lutego 2012 15:18
Drukuj
Ocena użytkowników: / 3
SłabyŚwietny 


Kolejny program napisany w środowisku Microsoft Visual C++

Tym razem napiszemy program obliczający pole trójkąta mając dane trzy boki: a, b, c. W tym celu skorzystamy ze znanego wzoru Herona:  , gdzie p = (a+b+c)/2

Nie sprawdzamy czy użytkownik wprowadza właściwe dane. Jednakże w tym przypadku istnieje konieczność skorzystania z liczb zmiennoprzecinkowych typu double , nie jak dotychczas całkowitych typu int. Wynika to z faktu, iż w przypadku dzielenia, np. 9/2=4,5 powstaje liczba zmiennoprzecinkowa, której nie wyświetlimy prawidłowo, korzystając z typu int. Dodatkowo wynik po pierwiastkowaniu również nie musi okazać się liczbą całkowitą. Daje nam to także możliwość podawania programowi liczb zmiennoprzecinkowych. Zatem teraz będziemy korzystać z nowego specyfikatora %lf (dotychczas wykorzystywaliśmy %d), który pozwoli nam wyświetlać i pobierać liczby zmiennoprzecinkowe o podwójnej precyzji (typ double).

Ponieważ we wzorze na pole pojawia się pierwiastek i chcemy z niego skorzystać, musimy do programu wprowadzić bibliotekę zawierającą funkcję pierwiastka, wystarczy nam pierwiastek kwadratowy: sqrt, funkcja ta znajduje się w bibliotece math.h lub cmath.

Pojawia się także dodatkowy problem, bardziej natury estetycznej. Może się okazać, że wynik posiada wiele cyfr po przecinku, np. 3, 4532167812 jeżeli nie potrzebujemy znać tak dużej dokładności, chcemy by wynik wyglądał ładniej, np. wyświetliły się tylko 4 cyfry po przecinku, w tym przypadku 3, 4532 wprowadzimy następujące ograniczenie "%0.4lf". Cyfra zapisana po kropce ( .4) określa ile cyfr po przecinku chcemy wyświetlić. Zapisane cyfry przed kropką określają natomiast ile cyfr przed przecinkiem chcemy wyświetlać, np. %10.4lf będzie oznaczać, że chcemy, aby program pokazywał nam tylko 10 cyfr przed przecinkiem i 4 po, a także w przypadku gdy nie ma tych dziesięciu cyfr zostawia tyle znaków. Wprowadzanie ograniczenia wyświetlania cyfr przed przecinkiem w tym przypadku wydaje się jednak bezsensowne. Wprowadzenie zera powoduje natomiast wyświetlenie wszystkich cyfr.

Przejdźmy do napisania programu, wtedy wszystko okaże się bardziej zrozumiałe.

#include "stdafx.h"
#include
<math.h> // tu znajduje się funkcja sqrt
#include
<stdlib.h> // tu znajduje się funkcja system
#include
<stdio.h> // tu znajdują się funkcje printf i scanf
double
a,b,c,p; // definiujemy zmienne - boki trójkąta oraz zmienną pomocniczą p

int _tmain(int argc, _TCHAR* argv[])

{
       printf("Program obliczajacy pole trojkata, wykorzystujac wzor Herona \n");
       printf("Podaj dlugosc boku trojkata, a= "); /*użytkownik jest proszony o podanie długości boku trojkata*/
       scanf("%lf", &a);
       printf("Podaj dlugosc boku trojkata, b= ");
       scanf("%lf", &b);
       printf("Podaj dlugosc boku trojkata, c= ");
      
scanf("%lf", &c);
      
p=(a+b+c)/2.0; /* zapis 2.0 a zamiast 2 spowodowany jest korzystaniem z liczb zmiennoprzecinkowych, świadomie została użyta wartość 2.0 oznaczająca wartość zmiennoprzecinkową, natomiast wartość 2 może być interpretowana przez niektóre kompilatory jako wartość całkowita – może to generować trudne do znalezienia błędy */

       printf("Pole trojkata wynosi = %0.4lf \n", sqrt(p*(p-a)*(p-b)*(p-c)));
       system("pause");

       return 0;
}