2016-03-21 7 views
0

私は自分でJavaを学習しており、方法を学んだだけです。私は私のプログラムのコンパイルこの練習にKeychains for SaleKeychain Shop - 現在のキーチェーンの値変数が正しく更新されていない - Java

// Exercise 109 
    import java.util.Scanner; 

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

       int selection, currentKeychains = 0, price = 10; 

       System.out.println("Welcome to the Keychain Shop!\n"); 

       do { 
        System.out.println("Select 1, 2, 3, or 4"); 
        System.out.println("1. Add Keychains"); 
        System.out.println("2. Remove Keychains"); 
        System.out.println("3. View Order"); 
        System.out.println("4. Checkout"); 

        System.out.print("\nWhat would you like to do? "); 
        selection = keyboard.nextInt(); 
        System.out.println(); 

        if (selection == 1) { 
         System.out.println("You now have " + add_keychains(currentKeychains) + " keychains."); 
         System.out.println(); 
        } 
        else if (selection == 2) { 
         System.out.println("You now have " + remove_keychains(currentKeychains) + " keychains."); 
         System.out.println(); 
        } 
        else if (selection == 3) { 
         view_order(currentKeychains, price); 
         System.out.println(); 
        } 
        else if (selection == 4) { 
         checkout(currentKeychains, price); 
        } 
       } while (selection != 4); 
      } 

      public static int add_keychains(int currentKeychains) { 
       Scanner keyboard = new Scanner(System.in); 
       System.out.print("You have " + currentKeychains + " keychains. How many would you like to add? "); 
       int keychainsAdded = keyboard.nextInt(); 

       currentKeychains += keychainsAdded; 

       return currentKeychains; 
      } 

      public static int remove_keychains(int currentKeychains) { 
       Scanner keyboard = new Scanner(System.in); 
       System.out.print("You have " + currentKeychains + " keychains. How many would you like to remove? "); 
       int keychainsRemoved = keyboard.nextInt(); 

       currentKeychains -= keychainsRemoved; 

       return currentKeychains; 
      } 

      public static void view_order(int currentKeychains, int price) { 
       System.out.println("You are currently buying " + currentKeychains + " keychains."); 
       System.out.println("Each keychain costs $" + price + "."); 

       int totalCost = currentKeychains * price; 
       System.out.println("Your current total is $" + totalCost); 
      } 

      public static void checkout(int currentKeychains, int price) { 
       Scanner keyboard = new Scanner(System.in); 
       System.out.print("Please enter your name: "); 
       String name = keyboard.nextLine(); 
       System.out.println("You have bought " + currentKeychains + " keychains."); 

       int totalCost = currentKeychains * price; 
       System.out.println("Your total is $" + totalCost); 
       System.out.println("Thanks for shopping with us today, " + name + "."); 
      } 
    } 

を試みたが、それは適切に(私が欠けている何かがあると知っているが、それを把握することはできません)currentKeychainsを追跡しません。

ユーザーがメニューから「1.キーチェーンを追加」を選択すると、追加するキーチェーンの数を入力するよう求められます。この数値は、currentKeychains(0から始まる)に格納されている値に加算されます。したがって、2を入力すると、currentKeychainsには2が保持されます。次に、メニューが再び表示され、ユーザーの次の選択が尋ねられます。ユーザーがキーチェーンを追加するかキーチェーンを削除することを選択した場合、currentKeychainsの値は再び0になります(2にする必要があります)。私はこれを解決する方法を理解していません。私が見たり理解していないことがあります。また、私はScanner keyboard = new Scanner(System.in);をプログラムで4回、メインで1回、add_keychains()で1回、remove_keychains()で1回、checkout()で1回コーディングする必要がありました。一度タイプして、すべてのメソッドがスキャナクラスを使用できるようにする方法はありますか?ヘルプは大歓迎です!

答えて

1

intはJavaのプリミティブ型です。つまり、参照ではなく値渡しとなります*。あなたはadd_keychainscurrentKeychains += keychainsAddedを実行すると、それだけでcurrentKeychainsローカルコピーを修正 - それは、その変数のmainのコピーには影響しません。変更を永続化する場合は、次のいずれかを実行してください。

  • currentKeychainsをクラス変数として追加する必要があります。 private static int currentKeychainsを開き、そのパラメータをメソッドから削除します。
  • intの代わりにIntegerを使用してください。値を設定できるIntegerオブジェクトへの参照が渡されます。

慣用の方法は前者です。クラス変数に内部状態を保つことは、一般的には行かなくてはなりません。

+0

パラメータを保持して変更を永続的に保つ方法はありますか?プライベートとは何ですか? – camelCoder

+0

これらのパラメータではありません。私はいくつかの選択肢で私の答えを更新します。 'private'は*他のクラスがその変数にアクセスできないと述べている*アクセス修飾子*です。アクセス修飾子についてはかなり早くに学ぶでしょう。 –

関連する問題