Проблема в логике программы

167
06 ноября 2017, 20:02
package com.company;
import java.util.Scanner;
public class Main {
    static double ul;
    static double sum;
    static double num;
    static double denom = 1;
    static double k = 0;

    public static double e(double x, double n) {
        if (n >= 0) {

            if (n == 0) {
                    sum = 1;
            } else if (n == 1) {
                    sum = 1 + x;
            } else {
                for (k = 2; k <= n; k++) {
                    num = num * Math.pow(x, k);
                    denom = denom * (denom + 1);
                    ul = num / denom;
                    sum = sum + ul;
                }
                return sum;
            }
        return sum;
        } else {
            System.out.println("Invalid value of k");
            System.out.println("Please, restart the program and try again");
        }
        return sum;
    }

    public static double sinus(double x, double n) {
        if (n >= 0){
                if (n == 0) {
                    sum = x;
                } else {
                    for (k = 1; k <= n; k++) {
                        num = num * Math.pow(x, 2 * k - 1);
                        denom = denom * (2 * n - 1) * (2 * n);
                        if (k % 2 == 0) {
                            ul = num / denom;
                        } else {
                            ul = (-1) * (num / denom);
                        }
                        sum = sum + ul;
                    }
                   return sum;
                }
                return sum;
            }
        else {
            System.out.println("Invalid value of k");
            System.out.println("Please, restart the program and try again");
        }
        return sum;
   }


   public static double cosinus(double x, double n) {
        if (n >= 0){

                if (n == 0) {
                    sum = 1;
                } else {
                    for (k = 0; k <= n; k++) {
                        num = num * Math.pow(x, 2 * k);
                        denom = denom * (2 * n - 1) * (2 * n);
                        if (k % 2 == 0) {
                            sum = num / denom;
                        } else {
                            sum = (-1) * (num / denom);
                        }
                    }
                    return sum;
                }
            }
            else {
                System.out.println("\n" + "Invalid value of n");
                System.out.println("Please, restart the program and try again");
            }
        return sum;
    }
    public static void main(String[] args) {
        Scanner value = new Scanner(System.in);
        byte d;
        double x;
        double n;
        System.out.println("Choose which function you want calculate: " + "\n");
        System.out.println("1. e^x");
        System.out.println("2. sin(x)");
        System.out.println("3. cos(x)" + "\n");
            d = value.nextByte();
                if (d == 1){
                    System.out.println("Enter value of x: ");
                    x = value.nextDouble();
                    System.out.println("Enter value of n: ");
                    n = value.nextDouble();
                    e(x,n);
                }
                else if (d == 2){
                    System.out.println("Enter value of x: ");
                    x = value.nextDouble();
                    System.out.println("Enter value of n: ");
                    n = value.nextDouble();
                    sinus(x,n);
                }
                else if (d == 3){
                    System.out.println("Enter value of x: ");
                    x = value.nextDouble();
                    System.out.println("Enter value of n: ");
                    n = value.nextDouble();
                    cosinus(x,n);
                }
                else {
                    System.out.println("You type wrong number of function, try one more time");
                }
        System.out.println("\n" + "Your answer is: "+ "\n" + sum);
    }
}
Answer 1

Я не знаю, что вы хотите получить, но есть несколько важных моментов, которые стоит учитывать.

Во-первых, тип double не имеет смысла сравнивать с 0 или 1, как это делаете вы. Поскольку этот тип является приблизительным значением, то такое сравнение даст непредсказуемый результат. Объясняю, почему так. Предположим мы завели переменную такого типа и присвоили ей цифру 3. В памяти на самом деле не записывается 3, в данном случае может быть записано 3,00000000000000000000, а может 3,000000000000000001. Это называется приблизительное значение, отсюда видно, что сравнение тут некорректно.

Во-вторых, ваше выражение num = num * ... всегда дает ноль, поскольку данная переменная изначально инициализирована 0, а умножение на 0 дает 0. Дальше все вычисления бессмысленны, везде результат будет 0.

В-третьих, старайтесь избегать дублирующего кода, выносить его отдельно. Это сделает код понятнее и компактнее. Кроме того его еще и редактировать будет удобнее, поскольку корректировка одного вынесенного метода , исправляет работу всего кода, к нему обращающегося.

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

В-пятых, Ваши методы возвращают значение , которыми вы не пользуетесь... это странно и неправильно.

Итого... предлагаю подправить код. Я не знаю, что Вы хотели, но в таком виде это смотрится немного лучше и понятнее. Дальше сможете ошибку и сами найти, а заодно подумаете над дальнейшим рефакторингом.

import java.util.Scanner;
public class Main {
    public static double e(String x, String n) {
        if ("0".equals(n)) return 1;
        if ("1".equals(n)) return Double.valueOf(x);
        double denom = 1, sum = 0, num = 1, u1;
        Double doubleOfX = Double.valueOf(x);
        Double doubleOfN = Double.valueOf(n);
        for (int k = 2; k <= doubleOfN; k++) {
            num = num * Math.pow(doubleOfX, k);
            denom = denom * (denom + 1);
            u1 = num / denom;
            sum = sum + u1;
        }
        return sum;
    }
    public static double sinus(String x, String n) {
        if ("0".equals(n)) return Double.valueOf(x);
        double denom = 1, sum = 0, num = 1, u1;
        Double doubleOfX = Double.valueOf(x);
        Double doubleOfN = Double.valueOf(n);
        for (int k = 1; k <= doubleOfN; k++) {
            num = num * Math.pow(doubleOfX, 2 * k - 1);
            denom = denom * (2 * doubleOfN - 1) * (2 * doubleOfN);
            if (k % 2 == 0) u1 = num / denom;
            else u1 = (-1) * (num / denom);
            sum = sum + u1;
        }
        return sum;
    }
    public static double cosinus(String x, String n) {
        if ("0".equals(n)) return 1;
        double denom = 1, sum = 0, num = 1;
        Double doubleOfX = Double.valueOf(x);
        Double doubleOfN = Double.valueOf(n);
        for (int k = 0; k <= doubleOfN; k++) {
            num = num * Math.pow(doubleOfX, 2 * k);
            denom = denom * (2 * doubleOfN - 1) * (2 * doubleOfN);
            if (k % 2 == 0) sum = num / denom;
            else sum = (-1) * (num / denom);
        }
        return sum;
    }
    private static boolean detectValue(String x, String n) {
        try {
            Double.valueOf(x);
            return Double.valueOf(n) >= 0;
        } catch (NumberFormatException e) {
            return false;
        }
    }
    public static void main(String[] args) {
        Scanner value = new Scanner(System.in);
        byte d;
        String x;
        String n;
        System.out.println("Choose which function you want calculate: " + "\n");
        System.out.println("1. e^x");
        System.out.println("2. sin(x)");
        System.out.println("3. cos(x)" + "\n");
        d = value.nextByte();
        System.out.println("Enter value of x: ");
        x = value.next();
        System.out.println("Enter value of n: ");
        n = value.next();
        String result;
        if (detectValue(x, n)) {
            switch (d) {
                case 1:
                    result = "\n" + "Your answer is: " + "\n" + e(x, n);
                    break;
                case 2:
                    result = "\n" + "Your answer is: " + "\n" + sinus(x, n);
                    break;
                case 3:
                    result = "\n" + "Your answer is: " + "\n" + cosinus(x, n);
                    break;
                default:
                    result = "You type wrong number of function, try one more time";
            }
        } else result = "Invalid input value\nPlease, restart the program and try again";
        System.out.println(result);
    }
}
READ ALSO
Доступ к страннице только по ссылке

Доступ к страннице только по ссылке

Как обеспечить доступ к странице только по ссылке переданной администратором? Извиняюсь что сразу не обрисовал вопрос четкоИсправлясь

166
jpa relations OneToMany ManyToOne

jpa relations OneToMany ManyToOne

Всем доброго времениЕсть рабочий

174
C# WPF DataGrid сортировка

C# WPF DataGrid сортировка

Как сделать чтобы последняя строка в DataGrid не сортировался вместе с остальными? На пример все строки сортируются по возрастанию, а последняя...

345