-1

例:私は200ドルの残高を持っていて、初めて$ 12ドルを払うと、残りは188ドルです(これは動作します)が、2ドルをもう一度払うと186ドルになります。私が得る答えは174 $です。 私はプロジェクトで多型と抽象クラスを使用しました。私はそれをデバッグし、私が作成したforeachステートメントが問題だが、私はそれを修正することができませんでした。 私は、次のループのためにそれをクリアせずにあなたのトランザクションを反復処理しているあなたのforeachループではデータベースクラスC#:Windowsフォームを使用したATMシステム引き出しボタンを修正するにはどうすればよいですか?お金は2回差し引かれます

public class BankDatabase 
{ 
    private Account[] account; 
    public BankDatabase() 
    { 
     account = new Account[3]; 
     account[0] = new Account(1000, 1111, 200, 100); 
     account[1] = new Account(1001, 2222, 400, 500); 
     account[2] = new Account(1002, 3333, 100, 700); 
    } 
    private Account GetAccount(int account_number) 
    { 
     foreach (Account currentAccount in account) 
     { 
      if (currentAccount.AccountNum == account_number) 
       return currentAccount; 
     } 
     return null; 
    } 
    public bool Validation(int user_accnum, int user_pin) 
    { 
     Account user = GetAccount(user_accnum); 
     if (user != null) 
      return user.verification(user_pin); 
     else 
      return false; 
    } 
    public decimal GetAvailableBalance(int user_accum) 
    { 
     Account user = GetAccount(user_accum); 
     return user.AvailableBalance; 
    } 
    public decimal GetTotalBalance(int user_accum) 
    { 
     Account user = GetAccount(user_accum); 
     return user.TotalBalance; 
    } 
    public decimal Credit(int user_accum, decimal amount) 
    { 
     Account user = GetAccount(user_accum); 
     return user.Credit(amount); 
    } 
    public decimal Debit(int user_accum, decimal amount) 
    { 
     Account user = GetAccount(user_accum); 
     return user.debit(amount); 
    } 
} 


class Account 
{ 
    private int accountnum; 
    private int pin; 
    private decimal availablebalance; 
    private decimal totalbalance; 

    public Account() 
    { 

    } 
    public Account(int accountnum, int pin, decimal availablebalance, decimal totalbalance) 
    { 

     this.accountnum = accountnum; 
     this.pin = pin; 
     this.availablebalance = availablebalance; 
     this.totalbalance = totalbalance; 
    } 
    public int AccountNum 
    { 
     get 
     { 
      return accountnum; 
     } 
    } 
    public int PIN 
    { 
     get 
     { 
      return pin; 
     } 
    } 
    public decimal AvailableBalance 
    { 
     get 
     { 
      return availablebalance; 
     } 
    } 
    public decimal TotalBalance 
    { 
     get 
     { 
      return totalbalance; 
     } 
    } 

    public decimal Credit(decimal amount) 
    { 
     return availablebalance = availablebalance + amount; 
    } 

    public decimal debit(decimal amount) 
    { 
     return availablebalance = availablebalance - amount; 
    } 

    public bool verification (int userpin) 
    { 
     return (userpin == PIN); 
    } 
} 

public class Withdraw : Transaction 
{ 
    private decimal amount; 
    decimal t2; 
    public Withdraw() 
    { } 
    public Withdraw(int accountnum, BankDatabase database, decimal amount) : base(accountnum, database) 
    { 
     this.amount = amount; 
    } 
    public decimal Amount 
    { 
     get 
     { 
      return amount; 
     } 
    } 
    public override string ToString() 
    { 
     return "Withdrawn amount is= " + t2; 
    } 
    public override decimal balance() 
    { 
     decimal availablebalance = DataBase.GetAvailableBalance(accountnum); 
     if(amount<=availablebalance) 
     { 
      t2 = DataBase.Debit(accountnum, amount); 

     } 
     return t2; 
    }  
} 


public abstract class Transaction 
{ 
    protected int accountnum; 
    private BankDatabase database; 
    public Transaction() 
    { 

    } 
    public Transaction(int accountnum,BankDatabase database) 
    { 
     this.accountnum = accountnum; 
     this.database = database; 
    } 
    public int AccountNum 
    { 
     get 
     { 
      return accountnum; 
     } 
    } 
    public BankDatabase DataBase 
    { 
     get 
     { 
      return database; 
     } 
    } 
    public abstract decimal balance(); 
    public override string ToString() 
    { 
     return "Account Number" + accountnum; 
    } 
} 

private void withdraw_button_Click(object sender, EventArgs e) 
    { 
     transaction.Add(new Withdraw(Form1.accountnumber, database, with_amount)); 
     foreach (Transaction trans in transaction)  
     {  
      label2.Text = "Withdraw" + trans.balance().ToString(); 
     } 
    } 
+0

トランザクションをクリアしていない可能性があり、foreachループが繰り返しています。コードを完全に見ていないのですが、メソッドの最後にトランザクションをクリアすれば良いはずです。 – gilliduck

+0

そのwithdraw_Clickイベントハンドラ内の_transaction_変数のデータ型は何ですか?これは 'List 'ですか?あなたはそれをどこで定義しますか?あなたは私たちに多くのコードを示しましたが、おそらくあなたは最も重要な部分を示していませんでした – Steve

+0

私は、Withdraw.Balance()が変更を適用するための奇妙な場所のようだと言います。私は、トランザクションが仮想アプライ()または同様のものを持つことを期待していました。アカウントはクレジットを持ちます(デビットは単に負の値です)。Withdrawは実際に変更を加えるためにアカウントに依存します。バランスは単に引き出しの「一部」とは思われません。 – SoronelHaetir

答えて

1

を入れるのを忘れていました。実際には、トランザクションを積み重ねて毎回繰り返すことになります。何らかの形でtransactionをクリアすると、問題が解決するはずです。

関連する問題