質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

Javaの銀行口座プログラムのユーザーの入金履歴と出金履歴の表示の仕方について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,455

amareno

score 14

 前提・実現したいこと

Javaを用いて簡単な銀行口座のプログラムを作っています。ユーザーがDepositを選択するとユーザーの好きな額を入金し、withdrawalを選択すると好きな額を引き下ろし、output balanceを選択するとその時の口座に入っているお金を表示し、Output all depositsを選択するとその時までの入金履歴を表示し、Output all withdrawalsを選択するとその時までの出金履歴を表示します。現在、入金履歴と出金履歴の仕方がよく分からなくこちらで質問させて頂きました。
下記のコードでdeposit.lengthとwithdrawal.lengthが0だと思うので入金履歴と出金履歴が表示されないのだと思います。そしてcountDpとcountWdのカウントの仕方が間違えていると思います。正しくするにはどのようにすれば良いでしょうか?教えて頂きたいです。
このプログラムの問題文にarrayを使えと書いてあるのでarrayを使う前提でお願いします。

 該当のソースコード

import java.util.Scanner;
import java.io.*;
import java.io.FileNotFoundException;
import java.io.PrintWriter;

class Account {
    private float balance;

    private int countDp;
    private int countWd;

    float[] deposit = new float[10];
    float[] withdrawal = new float[10];

    Scanner input = new Scanner(System.in);

    public Account() {
        balance = 0;
        countDp = 0;
        countWd = 0;
    }

    private float[] enhanceArray(float[] array) {
        float[] newArray = new float[array.length + 10];
        for (int i = 0; i < array.length; i++) {
            newArray[i] = array[i];
        }
        return newArray;
    }


    public float depositing() {
        System.out.println("Enter the amount you would like to deposit: ");

        float depositAmount = input.nextFloat();

        if (countDp == deposit.length) {
            deposit = enhanceArray(deposit);
        }
        deposit[countDp] = depositAmount;
        balance += depositAmount;

        countDp += 1;
        return balance;
    }

    public float withdrawing() {
        System.out.println("Enter the amount you would like to withdraw: ");

        float withdrawalAmount = input.nextFloat();

        if (balance >= withdrawalAmount) {
            if (countWd == deposit.length) {
                withdrawal = enhanceArray(withdrawal);
            }
            withdrawal[countDp] = withdrawalAmount;
            balance -= withdrawalAmount;
            countWd += 1;
        } else {
            System.out.println("Less balance, transaction failed.");
        }

        return balance;
    }

    public float balanceOfAccount() {
        return balance;
    }

    public void outputAllDeposits() {

        System.out.println("Outputting all your deposits:");

        for (int i = 0; i < countDp; i++) {
            deposit[i] = input.nextFloat();

            if(deposit[i] >= 0.0f) {
                System.out.println("$" + deposit[i]);
            }
        }
    }

    public void outputAllWithdraws() {
        System.out.println("Outputting all your withdrawals:");

        for (int i = 0; i < countWd; i++) {
            withdrawal[i] = input.nextFloat();

            if(withdrawal[i] >= 0.0f) {
                System.out.println("$" + withdrawal[i]);
            }
        }
    }

    public void outputToTextFile() {
        try {
            PrintWriter pw = new PrintWriter("bankAcount.txt");

            pw.println("Your balance: " + balanceOfAccount());

            pw.println("Outputting all your withdrawals:");

            for (int i = 0; i < withdrawal.length; i++) {
                withdrawal[i] = input.nextFloat();

                if(withdrawal[i] >= 0.0f) {
                    pw.println(withdrawal[i]);
                }
            }

            pw.println("Outputting all your deposits:");

            for (int i = 0; i < deposit.length; i++) {
                deposit[i] = input.nextFloat();

                if(deposit[i] >= 0.0f) {
                    pw.println(deposit[i]);
                }
            }

            pw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

public class Main {

    public static void main(String[] args) throws Exception{
        int choice = 0;
        Account account = new Account();

        Scanner in = new Scanner(System.in);


        do {
            System.out.println("**************************************\n" +
                    "* Bank Account Program:              *\n" +
                    "*    Enter # to run program or Quit  *\n" +
                    "*    1)  Make a Deposit              *\n" +
                    "*    2)  Make a Withdrawal           *\n" +
                    "*    3) Output balance               *\n" +
                    "*    4) Output all deposits          *\n" +
                    "*    5) Output all withdrawals       *\n" +
                    "*    6) Quit                         *\n" +
                    "**************************************\n");

            choice = in.nextInt();

            switch (choice) {
                case 1:
                    account.depositing();
                    break;
                case 2:
                    account.withdrawing();
                    break;
                case 3:
                    System.out.println("Your balance is " + account.balanceOfAccount());

                    break;
                case 4:

                    account.outputAllDeposits();
                    break;
                case 5:
                    account.outputAllWithdraws();
                    break;

                case 6:
                    System.out.println("Thank you for using this Bank.");
                    break;

                    default:
                        break;
            }
        } while(choice != 6);

        account.outputToTextFile();
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

履歴を出力する以前の話で、そもそも履歴の記録ができていません。
履歴を記録すると思われる配列は長さが0のままノータッチなので、何も記録できません。
なおカウント自体は間違っていないのですが、それも使われないままになっています。

配列を使って履歴を記録していくことになるのですが、配列はListのように長さを自在に変えることができません。次のように対処します。

  • 適当な長さの配列を作っておき、そこに履歴を記録していく
  • カウンターは、記録数の管理及び記録する位置の管理に使う
  • 長さが足りなくなったら長さを適当に大きくした配列を作り、内容をコピーしたものを新たに使う

とりあえず配列は次のように長さ10で初期化しておきます。

    float[] deposit = new float[10];
    float[] withdrawal = new float[10];


足りなくなった場合に使う、長さを10足してコピーするメソッドも用意しておきます。

private float[] enhanceArray(float[] array) {
    float[] newArray = new float[array.length + 10];
    for (int i = 0; i < array.length; i++) {
        newArray[i] = array[i];
    }
    return newArray;
}


それで、例えば入金のメソッドは次のようにします。

public float depositing() {
    System.out.println("Enter the amount you would like to deposit: ");
    float depositAmount = input.nextFloat();

    if (countDp == deposit.length) {
        deposit = enhanceArray(deposit);
    }
    deposit[countDp] = depositAmount;
    balance += depositAmount;

    countDp += 1;
    return balance;
}


出力時は、配列の長さまで出力しようとすると、履歴の入っていない要素まで使うことになるので、入金だったらcountDp未満までforでまわせばいいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/19 06:15

    詳しい回答ありがとうございます。swordoneさんの回答を参考にコードを書いてみたのですがまだ入金履歴と出金履歴が表示されず困っています

    public void outputAllDeposits() {

    System.out.println("Outputting all your deposits:");

    for (int i = 0; i < countDp; i++) {
    deposit[i] = input.nextFloat();

    if(deposit[i] >= 0.0f) {
    System.out.println("$" + deposit[i]);
    }
    }
    }

    上記のコードのdeposit[i] = input.nextFloat();の部分、input.nextFloat()ではなく別の何かにするべきでしょうか?

    キャンセル

  • 2018/11/19 11:25

    むしろそれいらないのでは?

    キャンセル

  • 2018/11/19 15:37

    すいません、気がつきませんでした。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる