2014-09-22 5 views
0

Я вовне в курсе Java, и мое назначение - написать программу, которая занимает 3 стороны треугольника и возвращает тип, а также область. Стороны должны быть целыми числами в соответствии с листом задания, поэтому он испытывает боль, испытывая его и приходящий с целыми коэффициентами, чтобы соответствовать каждому типу.Код Java Возвращает 0 для области треугольника

В любом случае, реальная проблема, с которой я сталкиваюсь, иногда дает мне правильную область, а иногда и нет. 6/8/10, например, возвращает область 0.

Любые идеи/общие советы по улучшению источника? Для меня пока что вроде спагетти, но я немного ограничен в том, что мне разрешено использовать только то, что мы рассматривали в классе.

package trianglesides; 
import javax.swing.*; 
/* 
This program will receive three numbers from a user describing the lengths of 
the sides of a triangle. It will return and display the type of triangle and 
the area. 
*/ 
public class triangle_Sides { 
    public static void main(String[] args) { 
     int side1 = Integer.parseInt(JOptionPane.showInputDialog 
      ("Enter the integer length of side 1")); 
     int side2 = Integer.parseInt(JOptionPane.showInputDialog 
      ("Enter the integer length of side 2")); 
     int side3 = Integer.parseInt(JOptionPane.showInputDialog 
      ("Enter the integer length of side 3")); 
     int s = (side1 + side2 + side3)/2; 
     double area = Math.sqrt(s*(s-side1)*(s-side2)*(s-side3)); 
     if (side1 >= (side2 + side3) || 
      side2 >= (side1 + side3) || 
      side3 >= (side1 + side2)) { 
      JOptionPane.showMessageDialog(null, "That's no triangle."); 
     } 
     else { 
/*Equilateral*/ 
     if ((side1 == side2) && (side2 == side3)) { 
      JOptionPane.showMessageDialog(null, "This is an equilateral triangle with an area of " + area); 
     } 
/*Right and isosceles*/ 
     else if ((side1*side1) == ((side2*side2) + (side3*side3)) || 
       (side2*side2) == ((side1*side1) + (side3*side3)) || 
       (side3*side3) == ((side2*side2) + (side1*side1))) { 
      if (side1 == side2 || 
       side2 == side3 || 
       side3 == side1){ 
       JOptionPane.showMessageDialog(null, "This is right and isosceles triangle with an area of " + area); 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "This is a right triangle with an area of " + area); 
      } 
     } 
/*Obtuse and isosceles*/ 
     else if ((side1*side1) > ((side2*side2) + (side3*side3)) || 
       (side2*side2) > ((side1*side1) + (side3*side3)) || 
       (side3*side3) > ((side2*side2) + (side1*side1))) { 
      if (side1 == side2 || 
       side2 == side3 || 
       side3 == side1){ 
       JOptionPane.showMessageDialog(null, "This is obtuse and isosceles triangle with an area of " + area); 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "This is an obtuse triangle with an area of " + area); 
      } 
     } 
/*Acute and isosceles*/ 
     else if ((side1*side1) < ((side2*side2) + (side3*side3)) || 
       (side2*side2) < ((side1*side1) + (side3*side3)) || 
       (side3*side3) < ((side2*side2) + (side1*side1))) { 
      if (side1 == side2 || 
       side2 == side3 || 
       side3 == side1){ 
       JOptionPane.showMessageDialog(null, "This is acute and isosceles triangle with an area of " + area); 
      } 
      else { 
       JOptionPane.showMessageDialog(null, "This is an acute triangle with an area of " + area); 
      } 
     } 
     } 
    } 
} 

ответ

1

Это происходит потому, что переменная s не может быть целым типом

Изменить

int s = (side1 + side2 + side3)/2; 

в

double s = (side1 + side2 + side3)/2.0; 
+0

извините, но я не смог достать вас – Nabin

+0

Nice. Спасибо, это было глупо. – hunsbct

+0

@ user3491551 Вы можете отметить отметку, если она ответит – Nabin

1
int s = (side1 + side2 + side3)/2; 

Integer округление будет ро и половинки вниз. Это не то, что вы хотите. Разделите на 2.0 и положите результат в double.

Math.sqrt(s*(s-side1)*(s-side2)*(s-side3)) 

Вы делаете этот продукт в целочисленной арифметике, которая будет обертываться, а не терять точность. Это не то, что вы хотите. Кроме того, это famously not the expression of Heron's formula you want on computers.

Для сравнения, вы можете сделать лучше, сначала отсортировав стороны. Помимо этого, для меня это выглядит довольно разумным кодом. Вы можете подумать о том, чтобы часть «читать ввод и делать вывод» была отделена от части «делать вычисления», чтобы вы могли легче отлаживать и тестировать вычисления.

+0

Gotcha, спасибо! – hunsbct