题目
程序设计题:请使用委托实现信用卡用户定时还款功能
本题的应用场景解释:用户有一张信用卡,信用卡有一个总额度;每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的;用户有若干储蓄卡,可选择某张储蓄卡进行还款;还款是指从储蓄卡中划走信用卡的月消费总额到信用卡;如果储蓄卡余额不足则还款动作不成功。
程序设计
1.储蓄类设计
/// <summary>
/// 储蓄卡类
/// </summary>
public class DepositCard
{
public string name;
private double money;
public DepositCard(string name, double money)
{
this.name = name;
this.money = money;
}
public DepositCard(string name) : this(name, 0)
{
}
/// <summary>
/// 获取余额
/// </summary>
/// <returns>余额</returns>
public double getDepositMoney()
{
return this.money;
}
/// <summary>
/// 设置余额
/// </summary>
/// <param name="r">余额</param>
public void setDepositMoney(double r)
{
this.money = r;
}
}
/// <summary>
/// 储蓄卡集合类
/// </summary>
public class DepositCards
{
public DepositCard[] Dc;
public int n;
public DepositCards(DepositCard[] Dc, int n)
{
this.n = n;
this.Dc = Dc;
}
}
2.银行卡类
/// <summary>
/// 信用卡类
/// </summary>
class CreditCard
{
//持有人名
public string name;
//信用卡额度
public const double CreditCardmax = 3000;
//信用卡欠款
public double _CredMoney;
//还款日期
public int DueDay;
//绑定储蓄卡集合
public DepositCards Dc;
public CreditCard(string name, double Credmoney, int DueDay, DepositCards Dc)
{
this.name = name;
this.CredMoney = Credmoney;
this.DueDay = DueDay;
this.Dc = Dc;
}
public double CredMoney
{
get { return _CredMoney; }
//还款金额限制
set {
if (value < 0 || value > CreditCardmax)
{
Console.WriteLine("=========================");
Console.WriteLine("{0}的还款金额错误最大为{1}请重新输入:", this.name,CreditCardmax);
while( !double.TryParse(Console.ReadLine(),out value))
{
Console.WriteLine("{0}的还款金额错误最大为{1}请重新输入:", this.name, CreditCardmax);
}
}
_CredMoney = value; }
}
/// <summary>
/// 还款函数
/// </summary>
public void Repaym()
{
int a = Dc.n;
for(int i = 0; i < a; i++)
{
if (this.Dc.Dc[i].getDepositMoney() > this.CredMoney)
{
Console.WriteLine("今天是{0}", DateTime.Now);
Console.WriteLine("用户{0}已还款。",this.name);
Console.WriteLine("还款账户{0}账户余额{1}。",this.Dc.Dc[i].name,this.Dc.Dc[i].getDepositMoney());
this.Dc.Dc[i].setDepositMoney(this.Dc.Dc[i].getDepositMoney() - this.CredMoney);
Console.WriteLine("信用额度为{0} ", CreditCardmax);
Console.WriteLine("还款金额{0}。", this.CredMoney);
Console.WriteLine("还款后余额{0}。", this.Dc.Dc[i].getDepositMoney());
Console.WriteLine();
return;
}
}
Console.WriteLine("今天是{0}", DateTime.Now);
Console.WriteLine("还款人{0}", this.name);
Console.WriteLine("还款金额{0}。", this.CredMoney);
Console.WriteLine("账户余额不足, 请即时充值。");
return;
}
/// <summary>
/// 无需还款函数
/// </summary>
public void Norepaym()
{
Console.WriteLine("今天是{0}。", DateTime.Now);
Console.WriteLine("用户{0}未到还款日期,无需还款", this.name);
Console.WriteLine();
}
}
3.扣款委托类
/// <summary>
/// 扣款委托类
/// </summary>
public class RepayDelegate
{
/// <summary>
/// 扣款委托
/// </summary>
public delegate void RepayMoney();
public event RepayMoney Dorepay;
/// <summary>
/// 执行事件
/// </summary>
public void NotifyRepay()
{
if (Dorepay != null)
{
Console.WriteLine("=========================");
Dorepay();
}
}
}
4.主函数实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cprojeket
{
class main
{
static void Main(string[] args)
{
//银行还款
//1.创建储蓄卡集合
DepositCard D1 = new DepositCard("工商银行", 1000);
DepositCard D2 = new DepositCard("农业银行", 2000);
DepositCard[] Dc = { D1, D2};
DepositCards cards = new DepositCards(Dc,2);
//2.创建信用卡对象
CreditCard C1 = new CreditCard("小明", 1010, 1, cards);
CreditCard C2 = new CreditCard("小红", 2000, 22, cards);
List<CreditCard> creditCards = new List<CreditCard>();
creditCards.Add(C1);
creditCards.Add(C2);
//创建委托
RepayDelegate RD = new RepayDelegate();
//判断时间
foreach (CreditCard creditCard in creditCards)
{
if (creditCard.DueDay == int.Parse(DateTime.Now.ToString("yyyy-mm-dd").Split('-')[2]))
{
//事件添加
RD.Dorepay += new RepayDelegate.RepayMoney(creditCard.Repaym);
}
else
{
RD.Dorepay += new RepayDelegate.RepayMoney(creditCard.Norepaym);
}
}
//事件执行
RD.NotifyRepay();
Console.ReadKey();
}
}
}
输出结果
代码地址