C#模拟银行窗口模拟系统(控制台)

Posted nepu_hua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#模拟银行窗口模拟系统(控制台)相关的知识,希望对你有一定的参考价值。

源码下载

模拟内容

模拟银行的业务处理过程,银行有三个窗口,每天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进入系统。如图所示。

在这里插入图片描述

进入系统后,系统显示银行的业务处理情况。如图所示。
在这里插入图片描述

以上是关于C#模拟银行窗口模拟系统(控制台)的主要内容,如果未能解决你的问题,请参考以下文章

c++队列银行业务模拟

《C#零基础入门之百识百例》(五十八)接口 -- 模拟银行存储

C#窗体模拟银行家算法

求解C++模拟银行排队问题

使用多线程模拟一个银行叫号窗口

银行排队模拟(生产者-消费者模拟)