Proste zadanie - gdzie jest błąd?

0

Program ma za zadanie obliczyć promień okręgu wpisanego w trójkąt (z dokładnością do 3 miejsc po przecinku), którego boki podane są na wejściu. Automatyczne testy sprawdzające program niestety zwracają komunikat Wrong Answer dla kilku testów (niestety nie wiem, jakie to dane). Czy macie jakiś pomysł co tu jest źle? (coś na pewno jest).

 
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cmath>

using namespace std;

double Heron(double a, double b, double c){
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}

int main()
{
    double a,b,c,r;
    
    cin >> a >> b >> c;
    r = 2*Heron(a,b,c)/(a+b+c);
      
    printf("Promien okraglego stolu wynosi: %.3f\n", r);
      
    system("PAUSE");
    return 0;
}
0

Hmm, mi tam działa, dla wartości a,b,c takich jak np 10 10 10, albo 200 200 100.
system("PAUSE") niepotrzebne, wywal, moze bedzie dzialac :)

No i wypadałoby sprawdzic, czy z danych 3 bokow mozna ulozyc trojkat, moze dla takich wartosci tez sprawdza :)

Edit: jak podaje dane niecałkowite to wywala. Jak trzy dane nie mogą stworzyć trójkąta to wyrażenie podpierwiastkowe może wyjść ujemne, a jak wiadomo, w obrębie liczb rzeczywistych nie można policzyć pierwiastka z liczby ujemnej. Zrób spr danych, wywal system("PAUSE") i sprawdz.

0

Hmm jeśli działa dla wartości całkowitych to pewnie jest błąd. Ale nie w kodzie lecz w komputerze. Wynika to z zaokrąglania przez komputer wartości do 3 miejsca po przecinku. Poczytaj o błędach względnych i bezwzględnych. Występują najczęściej przy dodawaniu i odejmowaniu np. Najprościej zobrazować to na przykładzie dodawania liczb ułamkowych od 1/2 do 1/n. Napisz program który będzie dodawał najpierw wszystkie po kolei, później najpierw parzyste, później nieparzyste i sumował, oraz np który będzie dodawał najpierw co 3 wartość, a później resztę. W zależności od tego czy użyjesz do tego zmiennej double, czy float i jak duża wartość podstawisz za n, błąd będzie mniejszy lub większy, a wyniki tych obliczeń będą się od siebie różniły. W skrócie chodzi o nadmiar i niedomiar. Niedoszli tegoroczni maturzyści z mojej szkoły odpadli właśnie na tym jak im nauczyciel dał za zadanie zrobienia programu który wydaje resztę w jak największych nominałach. Dla wartości całkowitych wszystko działało gorzej było jak przeszli na ułamki. Okazało się że nie ma żadnego błędu w ich rozumowaniu ani w kodzie, tylko występuje właśnie błąd. Prawdopodobnie jest tak też w twoim przypadku.

0

Treść zadania zakłada, że podane dane są prawidłowe, także oto się nie muszę martwić. To są testy online, u mnie widać tylko wynik, także to kwestia serwera. Widziałem, że inni mieli wszystkie testy zaliczone, u mnie pojawiły się błędy w tym zadaniu.

0

Ale jesteś pewien że ten wynik jest w 100 % dokładny? Błędy są rzędu tysięcznych i po prostu twój program (bo widzę że operacje na ułamkach przeprowadza) zwraca wynik powiedzmy 0.756 zamiast 0.755. Tu nie chodzi o to, że podane dane na wejściu są prawidłowe czy nie tylko o to, że komputer popełnia błąd (choć sam o tym nie wie). Daj link do zadania i tego testu co sprawdza je online.

0

Zakładam że może wystarczyć:
printf("%.3f\n", r);
no i oczywiście bez system("pause");

0

niestety, to nie kwestia tego tekstu na wyjściu. Jest on wymagany, poza tym przechodzę część testów, tylko przy kilku się wysypuje.

0

Przy double gdzie na mantyse przeznaczone sa az 52 bity bledy nie maja w zasadzie prawa wystepowac na poczatkowych miejscach po przecinku. Predzej bedzie to spowodowane nieodpowiednim ustawieniem wyswietlania i automatycznym zaokraglaniem wyniku.

Edit. Z tego co pamietam(nie jestem pewien) precyzja double jest do 16 cyfr znaczacych, czyli duzo wiecej niz potrzeba.

0

W funkcji printf wartość zmiennej typu double ciągiem znaków

%lf

long float

0

Spróbuj to:

#include <stdio.h>
#include <math.h>
 
int main()
  {
   double a,b,c;
   scanf("%lf%lf%lf",&a,&b,&c);
   printf("Promien okraglego stolu wynosi: %.3lf\n",sqrt((-a+b+c)*(a-b+c)*(a+b-c)/(a+b+c))/2);
   return 0;
  }
0

niestety, rozwiązanie podane przez kolegę wyżej daje takie same efekty :(

tu jest link do zadania, może coś przeoczyłem. http://tnij.org/qvyz

0

Oczywiście że przeoczyłeś:

Podana będzie dowolna liczbą pokoi. Każdy pokój jest reprezentowany przez trzy liczby rzeczywiste

#include <stdio.h>
#include <math.h>
 
int main()
  {
   double a,b,c;
   while(scanf("%lf%lf%lf",&a,&b,&c)==3) printf("Promien okraglego stolu wynosi: %.3lf\n",sqrt((-a+b+c)*(a-b+c)*(a+b-c)/(a+b+c))/2);
   return 0;
  }
0

eh.. chyba za daleko od monitora siedzę. Dzięki :P

0

Coś o stosowaniu precyzji w cout:
http://www.cplusplus.com/reference/iostream/ios_base/precision/

Coś o trójkącie:
(do zaimplementowania weryfikacji przed obliczeniami)

Trójkąt - figura geometryczna mająca 3 boki. Jeden z boków nazywamy podstawą, a dwa pozostałe ramionami, przy czym suma długości ramion musi być większa od długości podstawy ( warunek trójkąta ). - www.MATMA.prv.pl

1 użytkowników online, w tym zalogowanych: 0, gości: 1