2014-10-08 4 views
2

Целью программы является получение двух пользовательских входов для доли, получение оператора от пользователя, а затем получение еще двух пользовательских входов для второй фракции. Программа должна проверить, что числа, используемые в обеих фракциях, находятся в диапазоне от 0 до 99 и имеют ненулевой знаменатель. Программа также должна убедиться, что пользователь вводит действительный оператор (-, +, *, /).Java-программа для вычисления фракций

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

1  1  3 
--- + --- = --- 
4  8  8 

Вот код, я так далеко, любая помощь будет высоко ценится, потому что мои знания для использования Java минимальна:

import java.util.Scanner; 
public class FractionCalculator { 
public static void main(String[] args) { 
Scanner in = new Scanner(System.in); 

int n1; 
int n2; 
int d1; 
int d2; 
int n; 
int d; 
char o; 
int m1,m2; 
int tempN1, tempN2; 
int lcm, x; 

System.out.println("Enter a numerator for fraction 1: "); 
n1 = in.nextInt(); 
System.out.println("Enter a denominator for fraction 1: "); 
d1 = in.nextInt(); 

if (d1 > 0) { 
    System.out.println(); 
} else { 
    System.out.println("Invalid denominator"); 
    System.exit(0); 
} 

System.out.println("Enter an operator: "); 
o = in.next().toCharArray()[0]; 
System.out.println("Enter a numerator for fraction 2: "); 
n2 = in.nextInt(); 
System.out.println("Enter a denominator for fraction 2: "); 
d2 = in.nextInt(); 

if (d2 > 0) { 
    System.out.println(); 
} else { 
    System.out.println("Invalid denominator"); 
    System.exit(0); 
} 


switch(o){ 
    case '*': 
     n = n1 * n2; 
     d = d1 * d2; 
     break; 

    case '/': 
     n = n1 * d2; 
     d = n2 * d1; 
     break; 

    case '+': 
     int max=n1>d1?n1:d1; 
     int min=n1<d1?n1:d1; 
     for(int i=1;i<=min;i++) 
      x=max*i; 
      if (x%min==0) 
      lcm=x;  
     tempN1=n1*m1; 
     tempN2=n2*m2; 
     m1=lcm/d1; 
     m2=lcm/d2; 
     n = tempN1 + tempN2; 
     d = lcm; 
     break; 

    case '-': 
     n = tempN1 - tempN2; 
     d = lcm; 
     break; 
    default: 
     System.out.println("Illegal Operator: "+ o); 
     break; } 
} 
} 
+1

домашнее задание много ?? – jgr208

+0

Возможный дубликат [Пропуск nextLine() после использования nextInt()] (http://stackoverflow.com/questions/13102045/skipping-nextline-after-use-nextint) – StackFlowed

+0

@ jgr208 Вопросы домашней работы являются технически приемлемыми, если они следуют обычным советам по StackOverflow. По общему признанию, формулировка этого вопроса может быть немного широкой, поскольку фактическое «заявление о вопросе» является немного двусмысленным. –

ответ

0

Может быть, вы хотите, чтобы ввести ООП (объектно-ориентированное программирование):

Q x = new Q(1, 4); 
Q y = new Q(1, 8); 
Q z = x.plus(y); 
System.out.println("%s + %s = %s%n", x, y, z); 

(1/4) + (1/8) = (3/8) 

public class Q { 
    final int numerator; 
    final int denominator; 

    public Q(int numerator, int denominator) { 
     int g = gcd(numerator, denominator); 
     this.numerator = numerator/g; 
     this.denominator = denominator/g; 
    } 

    @Override 
    public String toString() { 
     return String.format("(%d/%d)", numerator, denominator); 
    } 

    public Q plus(Q rhs) { 
     return new Q(numerator * rhs.denominator + rhs.numerator * denominator, 
      denominator * rhs.denominator); 
    } 
0

Одна часть проблемы: у вас есть какая-то логика, что вам нужно выполнить как для '+' и '-', но так, как вы написали, он будет выполнен только '+' для:

switch(o){ 
    ... other cases 
    case '+': 
     ... logic to compute lcm and other things 
     n = tempN1 + tempN2; 
     d = lcm; 
     break; 

    case '-': 
     n = tempN1 - tempN2; 
     d = lcm; 
     break; 

Когда пользователь вводит '-', программа не войдет в часть под case '+'. Это означает, что tempN1, tempN2 и lcm не будут установлены. Если вы получаете ошибки от компилятора о неинициализированных переменных, это одна из причин.

Один из способов, чтобы написать код, который выполняется для нескольких случаев:

switch(o){ 
    ... other cases 
    case '+': 
    case '-': 
     ... whatever logic will apply to both cases 
     if (o == '+') { 
      ... whatever logic will apply to + only 
     } else { 
      ... whatever logic will apply to - only 
     } 
     ... if you have more logic for both cases, you can put it here 
     break; 

То есть, когда у вас есть более одного case прямо рядом друг с другом, без кода между ними, следующий код применяется к несколько случаев. (Это происходит из-за «падения». Фактически он идет на case '+', а затем, поскольку в коде case '+' нет , он проходит через до case '-'.Но не рекомендуется использовать провал, кроме случаев, когда нет кода вообще, как в приведенном выше)

0

UPDATE:.

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

import java.math.BigInteger; 
import java.util.Scanner; 

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

     int n1; 
     int n2; 
     int d1; 
     int d2; 
     int n = 0; 
     int d; 
     char o; 

     System.out.println("Enter a numerator for fraction 1: "); 
     n1 = in.nextInt(); 
     System.out.println("Enter a denominator for fraction 1: "); 
     d1 = in.nextInt(); 

     if (d1 > 0) { 
      System.out.println(); 
     } else { 
      System.out.println("Invalid denominator"); 
      System.exit(0); 
     } 

     System.out.println("Enter an operator: "); 
     o = in.next().toCharArray()[0]; 
     System.out.println("Enter a numerator for fraction 2: "); 
     n2 = in.nextInt(); 
     System.out.println("Enter a denominator for fraction 2: "); 
     d2 = in.nextInt(); 

     if (d2 > 0) { 
      System.out.println(); 
     } else { 
      System.out.println("Invalid denominator"); 
      System.exit(0); 
     } 

     switch (o) { 
      case '*': 
       n = n1 * n2; 
       d = d1 * d2; 

       break; 

      case '/': 
       n = n1 * d2; 
       d = n2 * d1; 

       break; 

      case '+': 
      case '-': 

       d = gcd(d1, d2); 

       n1 *= d/d1; 
       n2 *= d/d2; 

       if(o == '+') { 
        n = n1 + n2; 
       } 
       else if(o == '-') { 
        n = n1 - n2; 
       } 

       break; 
      default: 
       System.out.println("Illegal Operator: " + o); 
       return; 
     } 

     System.out.printf(" %d  %d  %d\n", n1, n2, n); 
     System.out.printf("--- %c --- = ---\n", o); 
     System.out.printf(" %d  %d  %d\n", d1, d2, d); 
    } 

    private static int gcd(int d1, int d2) { 
     BigInteger gcd = new BigInteger(String.valueOf(d1)).gcd(new BigInteger(String.valueOf(d2))); 
     return gcd.intValue(); 
    } 
} 
+0

Причина, по которой возникают ошибки «неинициализированной переменной», заключается в том, что логика ошибочна. Добавляя исходные значения бумаги над проблемой вместо ее решения. Когда есть неинициализированные переменные ошибки, ** первое, что вам нужно сделать, это проверить свою логику **. _Then_ при необходимости добавить инициализатор. – ajb

+0

@ajb Я хотел сказать: «Вы должны инициализировать некоторые вар ...». Я обновил свой ответ, объяснив, почему я инициализировал их до 0. Но я упомянул, что его логика не была правильной. –

+0

@ajb Я не понимаю, какова правильная логика, можете ли вы дать мне некоторое представление о правильной логике для назовите меня в правильном направлении? –