Преобразователь дроби в десятичную (и наоборот)

У меня есть 2 части кода, первая из которых преобразует дробь в десятичную, а вторая - преобразует десятичную дробь в дробь.

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

import java.util.*;

public class ExcerciseEleven  {

    public static void main (String[] args) {
        Scanner sc = new Scanner (System.in);

        System.out.println("Enter Numerator: ");
        int numerator = sc.nextInt();
        System.out.println("Enter Denominator: ");
        int denominator = sc.nextInt();
        if (denominator == 0) {
            System.out.println("Can't divide by zero");
        }
        else {
            double fraction = (double)numerator / denominator;
            System.out.println(fraction);
        }
    }
}


public class Fractions {

    public static void main(String args[]) {

        double decimal;
        double originalDecimal;
        int LIMIT = 12;
        int denominators[] = new int[LIMIT + 1];
        int numerator, denominator, temp;
        int MAX_GOODNESS = 100;

        // Get a number to be converted to a fraction
        if (args.length == 1) {
            decimal = Double.valueOf(args[0]).doubleValue();
        } else {
            // No number was given, so just use pi
            assert args.length == 0; 
            decimal = Math.PI;
        }
        originalDecimal = decimal;

        // Display the header information
        System.out.println("-------------------------------------------------------");
        System.out.println("Program by David Matuszek");
        System.out.println("Input decimal number to be converted: " + decimal);
        System.out.println();

        // Compute all the denominators
        System.out.println("All computed denominators:");
        int i = 0;
        while (i < LIMIT + 1) {
            denominators[i] = (int)decimal;
            System.out.print(denominators[i] + "  ");
            decimal = 1.0 / (decimal - denominators[i]);
            i = i + 1;
        }
        System.out.println();
        System.out.println();

        // Compute the i-th approximation
        int last = 0;
        while (last < LIMIT) {

            // Print out the denominators used in this computation
            System.out.print("Using these " + (last + 1) + " denominators: ");
            for (int j = 0; j <= last; j++) {
                System.out.print(denominators[j] + "  ");
            }
            System.out.println();

            // Initialize variables used in computation
            numerator = 1;
            denominator = 1;
            temp = 0;

            // Do the computation
            int current = last;
            while (current >= 0) {
                denominator = numerator;
                numerator = (numerator * denominators[current]) + temp;
                temp = denominator;
                current = current - 1;
            }
            last = last + 1;

            // Display results
            double value = (double)numerator/denominator;
            int goodness = denominators[last];
            double error = 100 * Math.abs(value - originalDecimal) / originalDecimal;

            System.out.print("fraction = " + (int)numerator + "/" +
                             (int)denominator);
            System.out.print(", value = " + value);
            System.out.print(", goodness = " + goodness);
            System.out.println(", error = " + (int)error + "%");
            System.out.println();

            // Exit early if we have reached our goodness criterion
            if (Math.abs(goodness) > MAX_GOODNESS) break;
        }        
    }
}

person Jimmy Huang    schedule 19.10.2015    source источник
comment
Что именно должна делать ваша комбинированная программа?   -  person PM 77-1    schedule 19.10.2015
comment
Я думал, что он может определить ввод как двойной или дробный и преобразовать его в другой.   -  person Jimmy Huang    schedule 19.10.2015
comment
Вы можете использовать à RegEx, я думаю, или проверить, содержит ли ввод ´.´ или ´/´ с contains()   -  person Yassin Hajaj    schedule 19.10.2015
comment
Если вы так думали, вы также думали, что мы прочитаем ваши мысли, чтобы узнать это?   -  person Andreas    schedule 19.10.2015
comment
@YassinHajaj Регулярное выражение является излишним, и проверку символа лучше выполнять с помощью indexOf.   -  person Andreas    schedule 19.10.2015
comment
Ты прав, Андреас. Как всегда :).   -  person Yassin Hajaj    schedule 19.10.2015


Ответы (1)


Если бы я делал все это в одном приглашении, я бы сделал два статических метода Fraction.TryParse() и использовал бы встроенный метод Double.TryParse(), если decimal.TryParse возвращает true, тогда у вас действительно есть десятичное число. Если он возвращает false, то у вас есть Fraction, поэтому вы должны использовать ту же строку, которую вы передали в Decimal.TryParse() в Fraction.TryParse(). Конечно, вам понадобятся некоторые проверки работоспособности в вашем методе Fraction.TryParse(). Подсказка может выглядеть примерно так:

Enter Decimal/Fraction: 3.14
Enter Decimal/Fraction: 1 + 1/2
Enter Decimal/Fraction: 1 1/2
Enter Decimal/Fraction: 1 (1/2)

Видите ли, если вы хотите, чтобы все это было в одной строке, вам нужен способ разграничения символов, например, пробел, скобки или просто знак +, который был бы математически точен. Если все это находится в одной строке, это также немного упрощает вашу программу, потому что у вас нет нескольких подсказок для одного объекта. Ввод «1 (1/2)» не является технически математически точным, но вы можете увидеть, как данные должны быть структурированы, вы просто не можете быть математически жесткими с этой подсказкой.

Здесь я использую полуторную дробь, в вашей реализации нет реализации смешанных чисел, но вы можете просто ввести 1/2 или что-то в этом роде, только обычные дроби.

person Cameron Block    schedule 31.10.2015