Trójkąty i wzór Herona

0

Witam, to znów ja! :) Tym razem zadanie przedstawia się następująco: t testów, w każdym n przypadków liczb a,b,c (boków trójkąta), których pole mam obliczyć (każdy przypadek zsumować) i podać wynik (*k/10 występuje, ponieważ w treści są podane długości boków w centymetrach, k - zużycie kredy w kg/m^2, a wynik ma być w gramach) zaokrąglony do najbliższej liczby całkowitej. Niestety program nie zawsze wypisuje poprawne odpowiedzi, ktoś ma pomysł dlaczego?

#include <stdio.h>
#include <math.h>

int main(void){
	int a,b,c,t,n,wypisz;
	double k,wynik,pole,p;
	
	scanf("%d",&t);
	while(t--){
		scanf("%d%lf",&n,&k);
		wynik=0.0;
		while(n--){
		scanf("%d%d%d",&a,&b,&c);
		if(a+b>=c&&a+c>=b&&b+c>=a){
		p=(a+b+c)/2;
		pole=sqrt(p*(p-a)*(p-b)*(p-c));
		wynik+=pole;
		}
		}
		wynik=wynik*k/10;
		wypisz=(int)(wynik+(0.5));
		printf("%d\n",wypisz);
	}
	return 0;
} 
1
if(a+b>c && a+c>b && b+c>a)

Jeśli masz małe błędy, to moze jest to wina arytmetyki, tzn niedokładnie liczy, bo jest tu dosc sporo działań.

p=(a+b+c)/2;

w tym wypadku p zawsze bedzie liczbą całkowitą (przykład: 7 17 11), bo jesli w działaniu masz choc jedną zmienną całkowitą, wynik bedzie całkowity.
Popraw na

p=(a+b+c);
p/=2;
1
#include <stdio.h>
#include <math.h>
 
int main()
  {
   int a,b,c,t,n;
   double k,p;
   scanf("%d",&t);
   while(t--)
     {
      scanf("%d%lf",&n,&k);
      while(n--)
        {
         scanf("%d%d%d",&a,&b,&c);
         p=(a+b+c)/2.0;
         printf("%d\n",(int)(sqrt(p*(p-a)*(p-b)*(p-c))*k/10+0.5));
        }
     }
   return 0;
  }
0

Tak jest! Jak zwykle, po paru poprawkach wskazanych przez was, program zadziałał ;]
Dziękuję!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.