模拟内容
模拟银行的业务处理过程,银行有三个窗口,每天8点开门,12点关门,银行业务主要包括两种:存钱和取钱,每件业务的处理时间为3~5分钟。
分析银行的具体业务办理情况,通过随机数生成并模拟银行业务办理事件处理过程,分析各个窗口的排队长短,编写程序最终实现完整处理过程,建立“银行窗口模拟系统”。
1.如果程序开始运行时产生的随机时间在8-12点之间,则运行该程序,否则提示银行已关门;
2.程序开始运行时,随机产生当时银行存在的人数,及三个窗口的排列情况,并按其先后顺序排序1,2,3……;
3.随机产生每个窗口正在办理业务的情况,包括存钱和取钱,及其每个窗口正在办理业务所剩余的时间,并表示出来;
4.程序运行中随机产生每个时刻进来的人数,并进行排列;
5.假如第一个人处理完业务,则队列依次前移;
6.假如到了12点,系统提示银行停止办理业务。
模拟思路
使用数据结构中的队列存放银行的所有客户,使用c#中的random类的对象生成随机数产生随机时间,使用c#中的Datetime类进行时间与字符串之间的转换和时间的比较和运算,只有产生的随机时间在8:00-12:00之间才能进入系统,使用c#中的System.Threading.Timer线程计时器实现定时执行三个窗口的处理业务的过程,最后使用c#的StreamWriter类将业务的具体信息写入到文件。
编程实现
首先定义几个全局变量,分别为银行初始人数,初始生成的随机时间,之后的时间都在次基础上增加,直到银行的关门时间12:00,一个队列模拟银行的排队队列,一个定时器对象定时执行三个窗口的函数。
public static int peoplenum = 30;//银行初始人数
public static string time;//生成的初始随机时间
public static Queue<string> queue = new Queue<string>();//排队队列
public static Timer myTimer;//定时器对象
编些一个函数模拟银行的欢迎界面。
//欢迎界面
public static void welcome()
{
Console.WriteLine("\t\t 银行业务模拟与离散事件模拟程序系统");
Console.WriteLine("------------------------------------------------");
Console.WriteLine("温馨提示:");
Console.WriteLine("开门时间:早上8点,关门时间:早上12点");
Console.WriteLine("------------------------------------------------");
}
编写函数用于比较当前随机生成的时间是否在银行的上班时间,如果在就询问用户是否需要进入系统,如果用户选择是则开始模拟银行的业务处理流程。
//比较随机时间是否在8:00-12:00
public static void cmpTime()
{
time = getDate();
string starttime = "08:00:00";
string endtime = "12:00:00";
DateTime rantime = Convert.ToDateTime(time);
DateTime stime = Convert.ToDateTime(starttime);
DateTime etime = Convert.ToDateTime(endtime);
Console.Write("当前时间是:"+time);
if (rantime > stime && rantime < etime)
{
Console.WriteLine("是否要进入系统?(输入yes进入系统,输入其他内容退出系统)" );
string str = System.Console.ReadLine();
if (str == "yes")
{
Console.WriteLine("你已进入系统,下面是当前业务处理情况:");
Console.WriteLine("------------------------------------------------");
}
else {
Console.WriteLine("欢迎下次光临!\n");
System.Environment.Exit(0);
}
}
else
{
Console.WriteLine(",银行已关门!!!\n" );
System.Environment.Exit(0);
}
}
1号窗口窗口处理业务的的代码实现,生成一个2-4的随机数模拟办理业务的分钟数,生成一个0-59的随机数用于模拟办理业务的秒数。将生成的分秒数转换成datetime对象,拿初始时间加上办理业务时间得到当前时间。将银行下班时间与当前时间比较,如果当前时间大于下班时间则提示银行已办理业务。之后再用字符串拼接用户办理业务的信息。打印并写入文件。其余两个窗口与该窗口类似。
public static void windows1(object state) {
Random ra = new Random();
int option = ra.Next(0,2);//用于随机存款和取款业务
int minite = ra.Next(2,5);//生成每位客户办理业务的分钟数
int second = ra.Next(0,59);//生成每位客户办理的秒数
string costtime = "00:" + itos((int)minite) +":"+ itos((int)second);
string pretime = time;
DateTime curtime = Convert.ToDateTime(time);
DateTime time1= curtime.AddMinutes(minite);
time= time1.AddSeconds(second).ToLongTimeString();
string massage,massage1;
DateTime ctime = Convert.ToDateTime(time);
DateTime time2 = Convert.ToDateTime("12:00:00");
if (ctime >= time2)
{
Console.WriteLine("银行已停止办理业务!!!");
System.Environment.Exit(0);
}
if (option==1) {
//存钱业务
string pos = queue.Dequeue();
massage = pretime + ","+pos+"号客户在1号窗口办理存款业务,"+time+"该客户离开"+",花费了"+costtime+"秒";
massage1 = "第"+pos+"号客人信息:\n"+"到达银行时间:"+pretime+"\n离开银行时间:"+time+"\n所花费的时间:"+costtime+"\n办理存款的窗口:1";
}
else {
//取钱业务
string pos = queue.Dequeue();
massage = pretime + "," + pos + "号客户在1号窗口办理取款业务," + time + "该客户离开" + ",花费了" + costtime + "秒";
massage1 = "第" + pos + "位客户信息:\n" + "到达银行时间:" + pretime + "\n离开银行时间:" + time + "\n所花费的时间:" + costtime + "\n办理取款的窗口:1";
}
Console.WriteLine(massage );
try
{
write1(massage1);
}
catch (System.IO.IOException e)
{
Console.WriteLine("读写异常");
}
}
编写函数模拟银行某时刻随机进入10-20人,往排队队列中随机添加10-20个数。
public static void addpeople(object state) {
Random ra = new Random();
int comepeople = ra.Next(10,20);
for (int i=0;i<comepeople;i++) {
queue.Enqueue(i+peoplenum+"");
}
Console.WriteLine(time +"进入了"+comepeople+"人");
peoplenum += comepeople;
}
系统主函数。将初始的30个人放入队列,定时器设定一定的延时和时间间隔执行三个窗口办理业务的函数。
static void Main(string[] args)
{
welcome();
cmpTime();
for (int i = 0; i < peoplenum; i++)//将初始的30人加入队列
{
queue.Enqueue(i + "");
}
myTimer = new System.Threading.Timer(new TimerCallback(windows1), null, 1500, 2000);
myTimer = new System.Threading.Timer(new TimerCallback(windows2), null, 1000, 3000);
myTimer = new System.Threading.Timer(windows3, null, 500, 5000);
myTimer = new System.Threading.Timer(addpeople, null, 1000, 8000);
while (myTimer != null)
{
Thread.Sleep(0);
Console.ReadLine();
}
编写函数返回字符串拼接的随机生成的时间。
public static string getDate(){
Random ra = new Random();
int hour = ra.Next(23); //随机生成小时
int minute = ra.Next(60); //随机生成分钟
int second = ra.Next(60); //随机生成秒
return itos(hour) + ":" + itos(minute) + ":" + itos(second);
}
时分秒不够两位的补0,转换成字符串。
public static string itos(int num){
string Num = num + "";
if (Num.Length== 1)
{
return "0" + Num;
} else{
return Num;
}
}
将拼接的字符串写入txt文件。
public static void write1(string str)
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"H:Bank1.txt", true))
{
file.WriteLine(str);
}
}
public static void write2(string str)
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"H:Bank2.txt", true))
{
file.WriteLine(str);
}
}
运行结果
随机生成的时间不在8:00-12:00之间,系统提示银行已关门。如图所示。
生成的随机时间处于8:00-12:00之间,系统询问是否进入系统,输入yes进入系统。如图所示。
进入系统后,系统显示银行的业务处理情况。如图所示。
转载:https://blog.csdn.net/qq_45968259/article/details/116461895