2016-10-07 3 views
0

В настоящее время я работаю над простым java-проектом, который конвертирует выбранную валюту в выбранную валюту. Кажется, у меня проблема с операторами if/elseif, потому что всякий раз, когда я запускаю метод для выполнения соответствующих математических вычислений, исходная переменная остается прежней. Первоначально я попытался запустить логическую операцию со строкой, введенной пользователем («USD», «EUR») с помощью метода .equals, но я столкнулся с той же проблемой.Java - Конвертация валюты с IF/ElSEIF в классе

Вот часть моего метода, когда я думаю, что ошибка возникает (весь метод для ясности добавлен **):

 public double doMath(double USD, double CAD, double GBP, double YEN, double EUR, double CHF, int ogCurrency, int newCurrency, double howMuch){ 
    if (ogCurrency == 2){ 
     if (newCurrency == 1){ 
      howMuch = howMuch * CAD; 
     } 
     else if (newCurrency == 3){ 
      howMuch = howMuch * GBP; 
     } 
     else if (newCurrency == 6){ 
      howMuch = howMuch * YEN; 
     } 
     else if (newCurrency == 4){ 
      howMuch = howMuch * EUR; 
     } 
     else if (newCurrency == 5){ 
      howMuch = howMuch * CHF; 
     } 
    } 
    else if (ogCurrency == 1){ 
     howMuch = howMuch/CAD; 
     if (newCurrency == 2){ 
      howMuch = howMuch * USD; 
     } 
     else if (newCurrency == 3){ 
      howMuch = howMuch * GBP; 
     } 
     else if (newCurrency == 6){ 
      howMuch = howMuch * YEN; 
     } 
     else if (newCurrency == 4){ 
      howMuch = howMuch * EUR; 
     } 
     else if (newCurrency == 5){ 
      howMuch = howMuch * CHF; 
     } 
    } 
    else if (ogCurrency == 3){ 
     howMuch = howMuch/GBP; 
     if (newCurrency == 1){ 
      howMuch = howMuch * USD; 
     } 
     else if (newCurrency == 2){ 
      howMuch = howMuch * CAD; 
     } 
     else if (newCurrency == 6){ 
      howMuch = howMuch * YEN; 
     } 
     else if (newCurrency == 4){ 
      howMuch = howMuch * EUR; 
     } 
     else if (newCurrency == 5){ 
      howMuch = howMuch * CHF; 
     } 
    } 
    else if (ogCurrency == 6){ 
     howMuch = howMuch/YEN; 
     if (newCurrency == 1){ 
      howMuch = howMuch * USD; 
     } 
     else if (newCurrency == 3){ 
      howMuch = howMuch * GBP; 
     } 
     else if (newCurrency == 2){ 
      howMuch = howMuch * CAD; 
     } 
     else if (newCurrency == 4){ 
      howMuch = howMuch * EUR; 
     } 
     else if (newCurrency == 5){ 
      howMuch = howMuch * CHF; 
     } 
    } 
    else if (ogCurrency == 4){ 
     howMuch = howMuch/EUR; 
     if (newCurrency == 1){ 
      howMuch = howMuch * USD; 
     } 
     else if (newCurrency == 3){ 
      howMuch = howMuch * GBP; 
     } 
     else if (newCurrency == 6){ 
      howMuch = howMuch * YEN; 
     } 
     else if (newCurrency == 2){ 
      howMuch = howMuch * CAD; 
     } 
     else if (newCurrency == 5){ 
      howMuch = howMuch * CHF; 
     } 
    } 
    else if (ogCurrency == 5){ 
     howMuch = howMuch/CHF; 
     if (newCurrency == 1){ 
      howMuch = howMuch * USD; 
     } 
     else if (newCurrency == 3){ 
      howMuch = howMuch * GBP; 
     } 
     else if (newCurrency == 6){ 
      howMuch = howMuch * YEN; 
     } 
     else if (newCurrency == 4){ 
      howMuch = howMuch * EUR; 
     } 
     else if (newCurrency == 2){ 
      howMuch = howMuch * CAD; 
     } 
    } 
    /*else{ 
     System.out.println("Something didn't add up"); 
    }*/ 
    return howMuch; 

& & основной, если это поможет

public static void main(String[] args) { 
     double USD = 1.00; 
     double CAD = 1.31; // canadian dollar 
     double YEN = 101.20; // jap yen 
     double GBP = 0.77; // british pound 
     double EUR = 0.89; // euro 
     double CHF = 0.97; // swiss franc 
    // initiate object of class 
    CurrencyConverter converterBasic; 

    // assigning default values to fractionsBasic 
    converterBasic = new CurrencyConverter(1, 1, 1.00); 


    // new scanner for fetching input, premade class Scanner creating object in to run method(parameters/gets input from System.in) 

    Scanner in = new Scanner(System.in); 


    System.out.print("Enter your starting currency #(1: CAD, 2: USD, 3: GBP, 4: EUR, 5: CHF, 6: YEN): "); 
    int ogCurrency; 
    ogCurrency = in.nextInt(); 
    converterBasic.setOgCurrency(ogCurrency); 


    System.out.print("Enter your desired currency please #(1: CAD, 2: USD, 3: GBP, 4: EUR, 5: CHF, 6: YEN): "); 
    int newCurrency; 
    newCurrency = in.nextInt(); 
    converterBasic.setNewCurrency(newCurrency); 

    System.out.print("Enter how much cash you have please: "); 
    double howMuch; 
    howMuch = in.nextDouble(); 
    converterBasic.setHowMuch(howMuch); 


    // use appropriate methods defined in class to compute conversion 
    converterBasic.doMath(USD, CAD, GBP, YEN, EUR, CHF, ogCurrency, newCurrency, howMuch); 

    // print appropriate output formatted using printf 

    System.out.printf(converterBasic.toString()); 

ли кто-нибудь то, что проблема с этим случайно, это определенно прямо под моим носом. Большое спасибо заранее, я с нетерпением жду вашей мудрости.

+2

как это даже скомпилировано, в вашем doMath нет оператора возврата, вы не добавили полный код –

+0

@JynXXedRabbitFoot извините, но это просто неправильно. Java является чистым басом по значению ([«Когда вызывается метод или конструктор (§15.12), ** значения фактических выражений аргументов инициализируют вновь созданные переменные параметра **, каждый из объявленного типа, перед выполнением тело метода или конструктора. "] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.1)). – Turing85

ответ

0

Ваш метод предполагает, что параметр передается по ссылке, однако Java передает значение.

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

void modify(Foo foo){ 
    foo.setValue("new value");//accepted and valid 
    foo = new Foo("new Value");//will create a local object 
           //and will not alter the original object 
} 

В вашем методе howMuch = howMuch*a; создает новый объект и, следовательно, не ссылается на исходное значение.

Таким образом, вы не можете манипулировать объектом метода Nonutable class внутри, так как для неизменяемого класса, изменяющего его значение, требуется создание нового Object. Все классы-оболочки java.lang пакет неизменны: Boolean, Byte, характер, Double, Float, Integer, Long, Short, String source

Таким образом, вы можете сделать что-то вроде этого

double howMuch; 
howMuch = in.nextDouble(); 
converterBasic.setHowMuch(howMuch); 
converterBasic.setHowMuch(converterBasic.doMath(USD, CAD, GBP, YEN, EUR, CHF, ogCurrency, newCurrency, howMuch)); 

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

+0

Спасибо, это мне очень помогло, мне просто пришлось объявить новую переменную, чтобы присвоить значения вне метода, или изменить их, как вы сказали ^^ – toliot

+0

@toliot Я рад, что это помогло ... можно проголосовать за ответ как полезный .. :) – 100rabh

+0

@toliot Вы можете поддержать ответ, если он вам помог, это поможет другим найти легко – 100rabh

0

http://ideone.com/g0ECVT Is Java "pass-by-reference" or "pass-by-value"?

Java передавать аргументы по значению.

+0

Хорошо, но я пытаюсь проверить, равен ли исходный номер валюты (значение) списку, который я заполнил для if/elseif (по сравнению с другим значением). поэтому, если пользователь вводит 1 для доллара США, то валюта оператора if = 1; должен работать, не так ли? – toliot

+0

Проблема не в ваших сравнениях. Проблема в том, что вы отбрасываете результат метода 'doMath()'. Вам нужно сохранить результат в переменной. – puhlen

0

Я бы использовал перечисление лично.

Попробуйте это.

import java.text.NumberFormat; 
import java.util.Currency; 
import java.util.Locale; 
import java.util.Scanner; 

public class Solution 
{ 

    public static void main(String[] args) 
    { 
    ConversionFactor ogCurrency; 
    ConversionFactor newCurrency; 
    String currencies = " #(1: CAD, 2: USD, 3: GBP, 4: EUR, 5: CHF, 6: YEN): "; 
    Scanner in = new Scanner(System.in); 

    System.out.print("Enter your starting currency" + currencies); 
    ogCurrency = ConversionFactor.values()[in.nextInt()]; 

    System.out.print("Enter your desired currency " + currencies); 
    newCurrency = ConversionFactor.values()[in.nextInt()]; 

    System.out.print("Enter how much cash you have please: "); 
    double onHand; 
    onHand = in.nextDouble(); 
    in.close(); 
    onHand = onHand/ogCurrency.value; 
    onHand = onHand * newCurrency.value; 

    Currency currentCurrency = Currency.getInstance(Locale.getDefault()); 
    NumberFormat currencyFormatter = NumberFormat 
     .getCurrencyInstance(Locale.getDefault()); 

    System.out.println(Locale.getDefault().getDisplayName() + ", " 
     + currentCurrency.getDisplayName() + ": " 
     + currencyFormatter.format(onHand)); 
    } 

    public enum ConversionFactor 
    { 
    CAD(1.31), USD(1.0), GBP(.77), EUR(.89), CHF(.97), YEN(101.2); 
    ConversionFactor(double value) 
    { 
     this.value = value; 
    } 

    double value; 
    } 
} 
Смежные вопросы