using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 模拟银行_19_4_30
{
class account//普通账户
{
//字段--私有
//private string name;//用户名--实际--卡号
//private decimal balance;//账户余额--decimal为钱的类
//为了在继承中使用,我们加protected保护权限来供普通用户和子类继承使用
protected string name;//用户名--实际--卡号
protected decimal balance;//账户余额--decimal为钱的类
////无参构造方法--实际不能这样,无参用于教学理论
//public account()
//{
// name = "mary";
// balance = 2000;//余额
//}
//有参构造方法
public account(string name, decimal balance)
{
this.name = name;
this.balance = balance;
}
//当子类的查询和父类的不一样要重写,p116页
//子类要重写父类的方法,父类必须定义为虚方法:在void前加virtual关键字
//查询账户的功能
public virtual void cx()
{
//输出账户的相关信息
Console.WriteLine("操作成功!{0}的操作余额为{1}元。",name,balance);
}
//存款的功能
public void ck()
{
//提示用户存多少钱
Console.WriteLine("{0}用户,您要存多少钱?",name);
decimal amt = decimal.Parse(Console.ReadLine());
//计算
balance += amt;//balance=balance+ant
Console.WriteLine("存款成功!");
//查询
cx();
}
//取款,无参无返回值
public virtual void qk()
{
//提示用户取款多少钱
Console.WriteLine("{0}用户,您要取款多少钱?", name);
decimal amt = decimal.Parse(Console.ReadLine());
//取款判断
if (amt > balance)
{
Console.WriteLine("余额不足,操作失败");
return;
}
//判断可以取款
balance -= amt;
Console.WriteLine("取款成功");
//查询
cx();
}
//按cw按两下tab输出
//if一下tab快捷if框架
//其他快捷键自己设置
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 模拟银行_19_4_30
{
class vip:account//vip可以透支,继承account类---格式。子类:父类
{
//父类权限允许范围内的,子类都可以继承..父类私有部分,子类不能继承,即不能使用
//
//添加子类自己的特性
//透支的额度--私有
private decimal debt;
//构造方法不能被继承
//实例化子类对象的时候,首先调用父类的构造方法,在调用子类自由的构造方法
//子类的无参构造方法
//子类完成默认值的设置,包括父类的字段
//(1)p106页隐式调用父类的构造方法
//public vip()
//{
// debt = 1000;
//}
//(2)显式调用父类的构造方法
//public vip()
// : base()//base关键字可以引用父类的对象;
//{
// debt = 1000;
//}
//(3)如果父类没有无参构造方法,可以指定调用有参构造方法
public vip()
: base("李四",4000)
{ debt =1000; }
//有参构造方法
//子类要对所有的字段完成赋值,显示调用父类的构造方法
public vip(string name,decimal balance,decimal debt):base(name,balance)//父类的n个字段,自己的m个字段(m+n)(m)在对n个字段一一赋值
{
this.debt = debt;
}
//子类可以继承父类的方法,该对象直接使用
//分析,存款操作,子类和父类完全一致,所以继承就可以
//重写父类的方法cx():关键字 override
public override void cx()
{
base.cx();//base关键字引用父类的对象,base.cx()就是调用父类的cx()方法
//这样就为了,子类的该方法是在父类的方法基础上有新的内容
//自定义子类新的功能,,所以现在大量的方法用继承来更新
Console.WriteLine("您当前的透支额度为{0}元",debt);
}
//取款分析
//(1)取款金额>余额+透支金额,不能完成操作
//(2)取款金额>余额+透支金额,多余部分在透支额度里面减去
// (3)取款金额<余额,余额=取款金额,透支额度不变
// 分析结果,需要重写父类虚方法,子类方法要完全自定义
public override void qk()
{
//询问
Console.WriteLine("{0}用户要取多少钱",name);
decimal amt = decimal.Parse(Console.ReadLine());
//(1)取款金额>余额+透支金额,不能完成操作
if (amt > balance + debt)
{
Console.WriteLine( "余额和透支额度不足,操作失败");
return;
}
//(2)取款金额>余额+透支金额,多余部分在透支额度里面减去
else if (amt > balance)
{
debt = debt + balance - amt;
}
// (3)取款金额<余额,余额=取款金额,透支额度不变
else
{
balance -= amt;
}
Console.WriteLine("取款成功");
//查询
cx();
}
//子类还可以有自己的新方法--名字可以和父类不一样
//5.28为了写入,要重写输出格式方法
public override string ToString()
{
return name + "\t" + balance + "\t" + debt;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//打开系统流文件
using System.IO;
namespace 模拟银行_19_4_30
{
class Program
{
//在主方法外部定义全局变量
static Dictionary<string, vip> Ls = new Dictionary<string, vip>();//定义为静态就不用类来访问
//static Dictionary<string,account> Is = new Dictionary<string, account>();
static public string filePath = "d:\\vip.txt";//双斜线“\\”
static void Main(string[] args)
{
////5.28更新:1、多账户的存取--泛型--
//一级菜单中的创建账户--循环--注意类型
vip vi = null;
//vip a=new vip("张三",3000,3000);
//Ls.Add("张三",a);
//vip b = new vip("李四", 4000, 4000);
//Ls.Add("李四", b);
//vip c = new vip("王五", 5000, 5000);
//Ls.Add("王五",c);
////一级菜单中的登陆,二级菜单是对单个账户进行操作
//if (Ls.ContainsKey("李四"))
//{
// vi = Ls["李四"];
//}
//////提示:第一个pwd是字段,第二个是输入的密码
//////&& :短路与,先判断第一个条件为假则后续不做(短路),满足再判断第二个条件
////if (Ls.ContainsKey(name)&&Ls[name].pwd==pwd)
////{
//// vi = Ls[name];
//// //显示二级菜单
////}
////2、存储到文件
////打开io流——创建文件流——创建写入器————遍历写入——关闭写入器和文件流
////创建文件流
//FileStream fs = new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write);//(参数(至少写前两个):文件路径,文件打开模式filemode,文件的访问方式fileaccess,文件的共享方式fileshare)
////创建写入器
//StreamWriter sw = new StreamWriter(fs);
////遍历集合把每一个对象写到文件中去
//foreach (vip p in Ls.Values)//hash中key是name
//{
// //每找到一个就写入
// sw.WriteLine(p.ToString());
//}
////关闭写入器
//sw.Close();
////关闭文件流
//fs.Close();
//3、从文件中读出来放到泛型里,重复的不能注册(故注释了)
//实际应用中应该用循环来读取指定的name
//创建文件流
FileStream fs1 = new FileStream(filePath, FileMode.Open, FileAccess.Read);
//创建读入器
StreamReader sr = new StreamReader(fs1);
string data = sr.ReadLine();//定义个字符串
string[] str;//字符串数组
str = data.Split('\t');
vi = new vip(str[0], decimal.Parse(str[1]), decimal.Parse(str[2]));
//添加到泛型里面
Ls.Add(str[0], vi);
//关闭读入器
sr.Close();
//关闭文件流
fs1.Close();
//只能对一个账户处理
//account vi=new account("张三",3000);
//account vi = new account();
//菜单--循环选择
string choice;
//vip vi=new vip();
//vip vi=new vip("王五",5000,2000);
while (true)
{
//界面
Console.WriteLine("--------------------------------------------------------------------------------");
Console.WriteLine(" 欢迎使用银行账户系统 ");
Console.WriteLine(" 版本:BetaV1.0");
Console.WriteLine("--------------------------------------------------------------------------------");
Console.WriteLine(" 请选择服务功能 ");
Console.WriteLine(" 1.存钱 ");
Console.WriteLine(" 2.取钱 ");
Console.WriteLine(" 3.查询余额 ");
Console.WriteLine(" 4.退出系统 ");
Console.WriteLine("--------------------------------------------------------------------------------");
//提示输入选择的数字
Console.WriteLine("请选择操作的数字(1--3)");
choice = Console.ReadLine();
switch (choice)
{
case "1": vi.ck(); break;
case "2": vi.qk(); break;
case "3": vi.cx(); break;
case "4": break;
default: Console.WriteLine("菜单选择错误");break;
}
if (choice=="4")
{
Console.WriteLine("欢迎下次光临");
break;
}
}//循环结束
//停止看结果
Console.ReadLine();
}
}
}