Как отформатировать вывод при вычислениях с массивами?

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

System.out.printf("Numerator for the first fraction: ");
f1 [0] = input.nextInt();
System.out.printf("Denominator for the first fraction: ");
f1[1] = input.nextInt();
System.out.printf("Numerator for the second fraction: ");
f2[0] = input.nextInt();
System.out.printf("Denominator for the second fraction: ");
f2[1] = input.nextInt();
System.out.printf("Enter the operation (+, -, *, /): ");
op = input.next();

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

public static int[] addFractions(int[] f1, int[] f2) {
    int[] result = new int[2];
    result[0] = (f1[0] * f2[1]) + (f2[0] * f1[1]);
    result[1] = f1[1] * f2[1];

    return simplifyFraction(result); //simplifyFraction is just a method that simplifies the numbers using gcd
}  

Вот что я использую для печати ответа.

addFractions(f1,f2);
        System.out.printf("%d/%d %s %d/%d = %s",f1[0],f1[1],op,f2[0],f2[1],Arrays.toString(addFractions(f1,f2)));

Мой ответ, однако, выглядит так:

1/2 + 1/2 = [1, 1]

Что я делаю не так? Я хочу, чтобы мой вывод отображался как «1/1». Я могу справиться с остальной логикой, чтобы просто вывести числитель, если знаменатель равен 1, я просто не могу его правильно отформатировать.


person VersaceVerac    schedule 20.07.2017    source источник
comment
Почему бы не вернуть строку для преобразования [1,1] в строку, содержащую 1/1   -  person Adam    schedule 20.07.2017
comment
Вы публикуете хорошие вопросы для новичка; мой голос за это.   -  person GhostCat    schedule 25.07.2017


Ответы (3)


Просто сделайте, как показано ниже

Решение 1

int[] answer = addFractions(f1,f2);
System.out.printf("%d/%d %s %d/%d = %d/%d", f1[0], f1[1], op, f2[0], f2[1], answer[0], answer[1]));

Он использует ту же идею, которую вы использовали для печати операндов.

Решение 2 (лучше, чем решение 1)

Кроме того, вы можете использовать пользовательский форматтер.

public String formatFraction(int[] fraction){
  String result;
  if(fraction[1] == 1){
    result = String.valueOf(fraction[0]);
  }else{
    result = fraction[0] + "/" + fraction[1];
  }
  return result;
} 

и вызовите его в методе печати

System.out.printf("%d/%d %s %d/%d = %s", f1[0], f1[1], op, f2[0], f2[1], formatFraction(formatFraction));

[ и ] печатаются, потому что он печатает массив, поэтому он печатает каждый его элемент внутри [ ], разделенный ,.

person luizfzs    schedule 20.07.2017
comment
Идеальный! Благодарю вас! - person VersaceVerac; 20.07.2017
comment
Нет проблем, @VersaceVerac Если это действительно помогло, не могли бы вы принять это как ответ на вопрос? :) - person luizfzs; 20.07.2017

Другое решение для представления как [1/1]

просто заменить

Arrays.toString(addFractions(f1,f2))

с

Arrays.toString(addFractions(f1,f2)).replaceAll(", ", "/")

для представления [1, 1] до [1/1]

person Rakib Hasan    schedule 20.07.2017

И ответ, выходящий за рамки текущей проблемы: дроби, конечно, можно рассматривать как массив целых чисел с двумя элементами.

Но здесь настоящий объектно-ориентированный ответ: вы создаете класс, представляющий дроби. Нравиться:

public class Fraction {
  private final int numinator;
  private final int denominator;

  public Fraction(int numinator) {
    this(numinator, 1);
  }

  public Fraction(int numinator, int denominator) {
    this.numinator = numinator;
    if (denominator == 0) throw new IllegalArgumentException("Cant create fraction with 0 denominator");
    this.denominator = denominator;
  }

а затем вы можете реализовать методы в этом классе для печати, сравнения или операций, таких как plus(), minus(), ....

person GhostCat    schedule 25.07.2017