C#练习:使用委托实现信用卡用户定时还款功能
基本思路
本项目实现了定时还款功能,在用户还款日不足五天时进行自动提醒,当到达还款日时系统自动扣除用户账户余额,若余额不足则纳入黑名单。
核心步骤
1)定义委托与事件
由于需要进行提醒和扣款,本文将其分为两个事件来定义。
class Delegate
{
//定义委托
public delegate void MeDelegate(People people);
//定义事件
//还款日小于5天的时候定时通知还款日
public event MeDelegate Notification_event;
//到达还款日,直接扣款
public event MeDelegate Payback_event;
public void Notify(People people)
{
if (Notification_event != null)
{
Notification_event(people);
}
}
public void Payback(People people)
{
if(Payback_event != null)
{
//触发事件
Payback_event(people);
}
}
}
2)定义People类
用户具有姓名,账户余额,欠款金额和换款日期这四个属性,利用C#中的学到的“属性”来进行私有变量的set和get。
class People
{
//用户姓名
private string name;
//所剩账户余额
private int remain_money;
// 所需还款金额
private int owe_money;
//还款日期
private int payday;
public People(string name,int remain_money,int owe_money,int payday)
{
this.name = name;
this.remain_money = remain_money;
this.owe_money = owe_money;
this.payday = payday;
}
//利用属性实现get,set
public string Name
{
get { return name; } set { name = value; }
}
public int Remain_money
{
get { return remain_money; } set { remain_money = value; }
}
public int Owe_money
{
get { return owe_money; } set { owe_money = value; }
}
public int Payday
{
get { return payday; } set { payday = value; }
}
}
3)定义银行类
实现5天提醒与自动扣款
class Bank
{
public void Do_Notify(People people)
{
Console.WriteLine(" {0}您好,目前距还款日不足5天,请及时缴纳还款{1}元,谢谢!", people.Name, people.Owe_money);
}
public void Do_Payback(People people)
{
Console.WriteLine(" {0}您好,还款日已到,还款将自动扣除,正在操作中...", people.Name);
if (people.Remain_money < people.Owe_money) { Console.WriteLine(" 余额不足,恶意欠款,您的账户已被拉黑!"); }
else{
people.Remain_money = people.Remain_money - people.Owe_money;
people.Owe_money = 0;
Console.WriteLine(" 欠款已还清,目前余额为{0}元,欠款情况为{1}元",people.Remain_money,people.Owe_money);
}
}
}
4)主函数
分别建立三个用户,并观察其运行结果
static void Main(string[] args)
{
//控制输出的编码格式
Console.OutputEncoding = Encoding.GetEncoding("gb2312");
People p1 = new People("ZesongWang", 1000, 200, 13);
People p2 = new People("小夫", 200, 30, 11);
People p3 = new People("胖虎", 10, 1000, 15);
Bank bank1 = new Bank();
Delegate objDelegate1 = new Delegate();
Delegate objDelegate2 = new Delegate();
objDelegate1.Notification_event += bank1.Do_Notify;
objDelegate2.Payback_event += bank1.Do_Payback;
for(int i = 1; i <= 20; i++)
{
Console.WriteLine("****今天是第{0}天****", i);
Console.WriteLine("");
if (p1.Payday - i < 5 && p1.Payday - i > 0) objDelegate1.Notify(p1);
if (p2.Payday - i < 5 && p2.Payday - i > 0) objDelegate1.Notify(p2);
if (p3.Payday - i < 5 && p3.Payday - i > 0) objDelegate1.Notify(p3);
if (p1.Payday == i) objDelegate2.Payback(p1);
if (p2.Payday == i) objDelegate2.Payback(p2);
if (p3.Payday == i) objDelegate2.Payback(p3);
}
}
5)实验结果
可以看出,在第7天时小夫开始收到还款提醒。在第9天时ZesongWang开始收到还款提醒,在第11天时胖虎开始收到还款提醒。小夫和ZesongWang的欠债均已还清,胖虎由于余额不足被拉黑。
完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace homework_bank
{
class Delegate
{
//定义委托
public delegate void MeDelegate(People people);
//定义事件
//还款日小于5天的时候定时通知还款日
public event MeDelegate Notification_event;
//到达还款日,直接扣款
public event MeDelegate Payback_event;
public void Notify(People people)
{
if (Notification_event != null)
{
Notification_event(people);
}
}
public void Payback(People people)
{
if(Payback_event != null)
{
//触发事件
Payback_event(people);
}
}
}
class People
{
//用户姓名
private string name;
//所剩账户余额
private int remain_money;
// 所需还款金额
private int owe_money;
//还款日期
private int payday;
public People(string name,int remain_money,int owe_money,int payday)
{
this.name = name;
this.remain_money = remain_money;
this.owe_money = owe_money;
this.payday = payday;
}
//利用属性实现get,set
public string Name
{
get { return name; } set { name = value; }
}
public int Remain_money
{
get { return remain_money; } set { remain_money = value; }
}
public int Owe_money
{
get { return owe_money; } set { owe_money = value; }
}
public int Payday
{
get { return payday; } set { payday = value; }
}
}
class Bank
{
public void Do_Notify(People people)
{
Console.WriteLine(" {0}您好,目前距还款日不足5天,请及时缴纳还款{1}元,谢谢!", people.Name, people.Owe_money);
}
public void Do_Payback(People people)
{
Console.WriteLine(" {0}您好,还款日已到,还款将自动扣除,正在操作中...", people.Name);
if (people.Remain_money < people.Owe_money) { Console.WriteLine(" 余额不足,恶意欠款,您的账户已被拉黑!"); }
else{
people.Remain_money = people.Remain_money - people.Owe_money;
people.Owe_money = 0;
Console.WriteLine(" 欠款已还清,目前余额为{0}元,欠款情况为{1}元",people.Remain_money,people.Owe_money);
}
}
}
class Program
{
static void Main(string[] args)
{
//控制输出的编码格式
Console.OutputEncoding = Encoding.GetEncoding("gb2312");
People p1 = new People("ZesongWang", 1000, 200, 13);
People p2 = new People("小夫", 200, 30, 11);
People p3 = new People("胖虎", 10, 1000, 15);
Bank bank1 = new Bank();
Delegate objDelegate1 = new Delegate();
Delegate objDelegate2 = new Delegate();
objDelegate1.Notification_event += bank1.Do_Notify;
objDelegate2.Payback_event += bank1.Do_Payback;
for(int i = 1; i <= 20; i++)
{
Console.WriteLine("****今天是第{0}天****", i);
Console.WriteLine("");
if (p1.Payday - i < 5 && p1.Payday - i > 0) objDelegate1.Notify(p1);
if (p2.Payday - i < 5 && p2.Payday - i > 0) objDelegate1.Notify(p2);
if (p3.Payday - i < 5 && p3.Payday - i > 0) objDelegate1.Notify(p3);
if (p1.Payday == i) objDelegate2.Payback(p1);
if (p2.Payday == i) objDelegate2.Payback(p2);
if (p3.Payday == i) objDelegate2.Payback(p3);
}
}
}
}
实验总结
这次实验很有意思,委托与事件是C#中新学到的知识点,比较生疏。这次实验参考了不少资料,通过这次作业的练习我对委托和事件的理解更加透彻一些了。
其使用也非常的灵活,在这个例子里面设置了两个事件,利用提醒和扣款这两个带参函数定义事件,最后将用户作为参数传入触发事件即可完成自动的提醒与扣款。
进一步改进
1)在此程序中用户无法主动进行还款,只能等到还款日到来自动扣除。接下来可以增加一个主动还款功能。
2)由于对手动输入的日期格式不好处理,本文直接用整型数进行了代替。以后可以尝试和窗体结合,利用split分割有结构的字符串,更好的处理日期这一因素。
gitee地址
https://gitee.com/Wangzesonga/windows/tree/master/
created by ZesongWang