моя геометрическая программа (вычисление площади и объема сфер, цилиндров и конусов)

#java

#java

Вопрос:

 public class Geometry {

public static void main(String[] args) {
    input(0.0, 0.0);
    sphereVolume(0.0, 0.0);
    sphereSurface(0.0, 0.0);
    cylinderVolume(0.0, 0.0);
    cylinderSurface(0.0, 0.0);
    coneVolume(0.0, 0.0);
    coneSurface(0.0, 0.0);
    output(0.0, 0.0);
}
/**
 * @param radius
 * @param height
 */
public static void input(double radius, double height) {

    Scanner sc = new Scanner(System.in);

    System.out.print("Enter radius r: ");
    radius = sc.nextInt();

    System.out.print("Enter height h: ");
    height = sc.nextInt();
}

public static double sphereVolume(double radius, double height) {
    double volume = (4 / 3) * Math.PI * Math.pow(radius, 3.0);
    return volume;
}

public static double sphereSurface(double radius, double height) {
    double surface = 4 * Math.PI * Math.pow(radius, 2.0);
    return surface;
}

public static double cylinderVolume(double radius, double height) {
    double volume = Math.PI * Math.pow(radius, 2.0) * height;
    return volume;
}

public static double cylinderSurface(double radius, double height) {
    double surface = 2 * Math.PI * radius * height   2 * Math.PI * Math.pow(radius, 2.0);
    return surface;
}

public static double coneVolume(double radius, double height) {
    double volume = (1 / 3) * Math.PI * Math.pow(radius, 2.0) * height;
    return volume;
}

public static double coneSurface(double radius, double height) {
    double surface = Math.PI * radius * (radius   Math.pow(( Math.pow(radius, 2.0)   Math.pow(height, 2.0)), .5));
    return surface;
}

public static void output(double radius, double height) {
    System.out.printf("Volume of sphere: %fn", sphereVolume(0.0, 0.0));
    System.out.printf("Surface area of Sphere: %fn", sphereSurface(0.0, 0.0));
    System.out.printf("Volume of cylinder: %fn", cylinderVolume(0.0, 0.0));
    System.out.printf("Surface area of cylinder: %fn", cylinderSurface(0.0, 0.0));
    System.out.printf("Volume of cone: %fn", coneVolume(0.0, 0.0));
    System.out.printf("Surface area of cone: %fn", coneSurface(0.0, 0.0));
}
 

Моя проблема в том, что мой результат каждый раз равен 0.0, независимо от ввода. Я уверен, что это, вероятно, что-то простое, но, похоже, я не могу в этом разобраться. Не могли бы вы мне помочь? Большое спасибо 🙂 Я ценю ваше время.

Редактировать

Итак, я все еще получаю 0.0 для своего вывода, хотя я изменил свой код следующим образом:

     public static void output(double radius, double height) {
    System.out.printf("Volume of sphere: %.13fn", sphereVolume(radius, height));
    System.out.printf("Surface area of Sphere: %.13fn", sphereSurface(radius, height));
    System.out.printf("Volume of cylinder: %.13fn", cylinderVolume(radius, height));
    System.out.printf("Surface area of cylinder: %.13fn", cylinderSurface(radius, height));
    System.out.printf("Volume of cone: %.13fn", coneVolume(radius, height));
    System.out.printf("Surface area of cone: %.13fn", coneSurface(radius, height));
}
 

Когда я вызываю свои функции в main(), выглядит так:

 public static void main(String[] args) {
    input(0.0, 0.0);
    sphereVolume(0.0, 0.0);
    sphereSurface(0.0, 0.0);
    cylinderVolume(0.0, 0.0);
    cylinderSurface(0.0, 0.0);
    coneVolume(0.0, 0.0);
    coneSurface(0.0, 0.0);
    output(0.0, 0.0);
}
 

Нужно ли мне делать что-то другое здесь?

Ответ №1:

Вы делите целые числа:

 public static double coneVolume(double radius, double height) {
    double volume = (1 / 3) * Math.PI * Math.pow(radius, 2.0) * height;
    return volume;
}
 

Целочисленное деление округляет в Java. Следовательно, 1 / 3 вычисляется до 0.

Измените его на:

 double volume = (1. / 3.) * Math.PI * Math.pow(radius, 2.0) * height;
 

Вот другое явление:

 double volume = (4 / 3) * Math.PI * Math.pow(radius, 3.0);
 

изменить на:

 double volume = (4. / 3.) * Math.PI * Math.pow(radius, 3.0);
 

Редактировать :

Вы также вызываете все свои функции с 0.0 помощью . Поэтому, конечно, результаты будут равны нулю.

 System.out.printf("Volume of sphere: %fn", sphereVolume(0.0, 0.0));
System.out.printf("Surface area of Sphere: %fn", sphereSurface(0.0, 0.0));
System.out.printf("Volume of cylinder: %fn", cylinderVolume(0.0, 0.0));
System.out.printf("Surface area of cylinder: %fn", cylinderSurface(0.0, 0.0));
System.out.printf("Volume of cone: %fn", coneVolume(0.0, 0.0));
System.out.printf("Surface area of cone: %fn", coneSurface(0.0, 0.0));
 

РЕДАКТИРОВАТЬ: еще одно предложение

Вероятно, вам не нужны все эти Math.pow() вызовы, поскольку все они вызываются с помощью 2 или 3. Я бы сказал, что это, вероятно, более лаконично и читаемо (и быстрее?) чтобы просто сделать:

 radius * radius   height * height
 

вместо

 Math.pow(radius, 2.0)   Math.pow(height, 2.0)
 

ПРАВКА 2: дополнительные исправления:

Измените свой main на это. И избавьтесь от input функции:

 public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    System.out.print("Enter radius r: ");
    double radius = sc.nextInt();

    System.out.print("Enter height h: ");
    double height = sc.nextInt();

    output(radius, height);
}
 

Комментарии:

1. Аааа, я знал, что это что-то простое. РЕДАКТИРОВАТЬ — Ну, я только что изменил это, и у меня все еще та же ошибка.

2. @eleven357: Тогда вы, вероятно, все еще выполняете деление int, но где-то в другом месте. Почему бы не попробовать выполнить небольшую отладку, чтобы выяснить, где возникает ваша ошибка. Должен помочь отладчик или, в противном случае, инструкции println.

3. Вы также вызываете свои функции с 0.0 помощью . Я только что отредактировал это в своем ответе.

4. Как мне вызвать мои функции с моими входными значениями для радиуса и высоты?

5. Я только что отредактировал его в своем ответе. Изучите ее, и вы поймете, почему она должна работать. (Хотя я ее не тестировал.)

Ответ №2:

Я не специалист по Java, но разве вы не должны хранить входные данные в каких-то глобальных переменных? Затем использовать эти переменные в качестве аргументов для ваших вызовов функций вместо 0.0? Например, этот код:

 public static void output(double radius, double height) {
    System.out.printf("Volume of sphere: %fn", sphereVolume(0.0, 0.0));
    System.out.printf("Surface area of Sphere: %fn", sphereSurface(0.0, 0.0));
    System.out.printf("Volume of cylinder: %fn", cylinderVolume(0.0, 0.0));
    System.out.printf("Surface area of cylinder: %fn", cylinderSurface(0.0, 0.0));
    System.out.printf("Volume of cone: %fn", coneVolume(0.0, 0.0));
    System.out.printf("Surface area of cone: %fn", coneSurface(0.0, 0.0));
}
 

просто распечатает результаты этих вызовов функций с 0.0 в качестве входных данных, а не радиус / высота пользовательского ввода.

И, да, целочисленная математика не помогает.

Ответ №3:

Вы вводите ввод вручную и полагаетесь на свой Scanner ? Если да, то это ваша проблема. Значения из Scanner присваиваются вашим параметрам в input() и фактически нигде не сохраняются.

Все ваши другие методы вызываются с нулевыми входными данными, для которых выходные 0.0 данные фактически будут правильными (хотя это не означает, что у вас нет ошибок).

Ответ №4:

Создайте класс Cylinder; класс имеет атрибуты radius и height . В нем есть методы, которые вычисляют площадь поверхности цилиндра, называемую surfaceArea, и метод вычисления объема в дополнение к необходимым методам set и get

Примечание: для вычислений используйте следующие формулы: объем = (pi) r ^ 2 * h, где h — высота. площадь поверхности цилиндра = 2 * pi * радиус * радиус 2 * pi * радиус * высота Цилиндр — высота: с плавающей точкой — радиус: с плавающей точкой <> Цилиндр (r: с плавающей точкой, h: с плавающей точкой) объем () : с плавающей точкой Площадь поверхности () : с плавающей точкой setRad ( r: с плавающей точкой) getRad() : float setHeight(h: float) getHeight(): float

Комментарии:

1. Добро пожаловать в stackoverflow. Этот вопрос старый и на него уже был дан ответ. Как правило, лучше не воскрешать устаревшие темы, если ваш ответ не вносит что-то существенно новое или отличное от предыдущих ответов.

Ответ №5:

когда вы используете double, это должно быть sc.nextDouble() .

 public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.print("Enter radius r: ");
double radius = sc.nextDouble();

System.out.print("Enter height h: ");
double height = sc.nextDouble();
}