精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究
面向对象的锻炼非常重要,初学者一般不太好找练习,找到练习又不太好认真动手练习,锐英源软件有C#在线教育,欢迎考虑加入,指导思路和动手,耐心认真把关教学。
这个ATM模拟程序主要包含四个类:Bank,ATM,Account和Program。我们在学习他人的代码时,要从程序入口Main函数开始。
在这个程序里,Program为主类。
Bank bank = new Bank(“XYZ银行”);
ATM atm = new ATM(bank);
atm.Start();
ATM机属于银行,所以在开始时需要初始化银行,我们再新建一个ATM机,在ATM机存在以后才能使程序正常开始。
存款、取款、查询余额和修改密码为用户可选择的操作项,选择后再进入对应的功能。在每一级操作完成后,都可以选择退出返回上一级操作,直至第一次用户选择处。在这个程序中,开户和登录为两个同一级的循环,成功操作则向下进行,失败则返回循环开始处重新进入循环。
while (true)
{
// 主界面
PrintLogo();
Console.WriteLine(" 1. 开户 ");
Console.WriteLine(" 2. 登录 ");
Console.WriteLine("----------------------------------------------");
Console.WriteLine("");
Console.Write("你的选择(回车结束):");
string code = Console.ReadLine();
// quit system
if (code == quitCode)
return;
if (code == "1") // 开户
OpenAccount();
else if (code == "2") // 登陆
LoginAccount();
}
首先来看这个程序的整体逻辑。用户首先需要选择开户或者登录的操作,如果是新用户,则需要通过输入账户名和密码来开户;如果已有账户,则可以直接登录账户进入到下一步管理账户。
while (true)
{
// 管理帐号界面
PrintLogo();
Console.WriteLine(" 1. 存款 ");
Console.WriteLine(" 2. 取款 ");
Console.WriteLine(" 3. 查询余额 ");
Console.WriteLine(" 4. 修改密码 ");
Console.WriteLine(" 5. 退出 ");
Console.WriteLine("----------------------------------------------");
Console.WriteLine("");
Console.Write("你的选择(回车结束):");
string code = Console.ReadLine();
decimal amount;
bool succeed;
switch (code)
{
case "1":
amount = InputNumber("\n输入存款数目:");
succeed = account.Deposit(amount);
if (succeed)
{
Print("存入", amount, account);
}
else
{
Console.WriteLine("存款失败!");
}
Pause();
break;
case "2":
amount = InputNumber("\n输入取款数目:");
succeed = account.Withdraw(amount);
if (succeed)
{
Print("取出", amount, account);
}
else
{
Console.WriteLine("取款失败!");
}
Pause();
break;
case "3":
Print(account);
Pause();
break;
case "4":
string oldPassword = Input("当前密码(回车结束):");
string newPassword = Input("新密码(回车结束):");
succeed = account.ChangePassword(oldPassword, newPassword);
if (succeed)
Console.WriteLine("密码修改成功!");
else
Console.WriteLine("密码修改失败!");
Pause();
break;
case "5":
return;
default:
break;
}
}
在取款这一部分有一点需要注意的是,用户输入取款数目之后Account类会首先用一个if条件语句进行判断,若输入值大于余额或者为负值时,取款操作不能正常进行。
public bool Withdraw(decimal amount)
{
if (amount > balance || amount <= 0)
return false;
balance -= amount;
return true;
}
public bool Withdraw(double amount)
{
return Withdraw((decimal)amount);
}
public bool Withdraw(int amount)
{
return Withdraw((decimal)amount);
}
public bool Withdraw(decimal amount, out decimal balance)
{
bool succeed = Withdraw(amount);
balance = this.balance;
return succeed;
}
在取款方法中,我们可以注意到,有三个参数类型不同、但都名为Withdraw的方法,这里体现了Withdraw方法的重载,形式为参数个数相同,但参数类型不同的重载。存款部分也是类似的,存在三种重载,decimal型、double型、int型,最终都会返回为decimal型。
在这存款、取款、查询余额或者修改密码操作完成后,会重新返回这一层循环的入口,可以选择进入下一层循环。若选择退出,则这一层循环结束,跳出循环,返回程序开始ATM.Start()处。