博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
验证上课时间是否重复
阅读量:4981 次
发布时间:2019-06-12

本文共 5196 字,大约阅读时间需要 17 分钟。

前言


第一次写文章,感觉压力很大,文字表述能力不足希望大家见谅,本人最近在搞一个学校的B/S项目需要放在android的定制PAD上,主要功能是展示班级的课程情况。需要建立一个上课时间表。本人开发的思想永远是,操作简单,使用方便,大家开心,教学成本也低下。

 

解题思路

 


既然是简单方便,就模拟下环境,学校的课程永远都是每天都一样的,换句话来说,只要设置了第一天的每节课的上下课时间后,等同于有了一周的上下课时间。

图1

每个学校都有自己的库,这样只要管理员设置一次,就只要在表格里面填写这个班上那节课就行了。

经过一番严重的踢皮球后,本人踢不过他们,只能把所有的判断全写在接口里面。也就是接口访问我后,我直接返回当前的PAD的状态,状态有三种。

1.日常模式:展示的是一个班级的主要页面

2.上课模式:上那节课,那个老师上课。

3.紧急模式:发生什么重大事件,优先级最高。

由此可以说明,上课的时间,如果有重叠,则系统会发生错误。我们不能把制造bug的权利留给用户,必须要留给开发者自己。

 

问题来了

 


时间是间断性的,而且没有任何规律,我们的用户是很任性的,他经常会把不合理的做法说成是一个bug,丢给卖家。(具体参考淘宝卖家的心酸)

来思考下可能会出现的bug。

时间交叉。譬如第一节课8:00~8:45。如图1

任性的老师们来了:先给你简单的一道题:填了一个时间为,8:30。那么好,和第一个判断发现,时间上有交叉啊。打回!提示来了。

少了时间两个字,不重要,任性哥看到这个哭丧的脸,看看,哎:的确事写错了。结束了么?没有,又来了。

填了一个上课时间为8:50~12:00。

这个判断时间跨度就很长了。

图2

这种情况,不好判断啊。谁有好的办法?

有人说,这个时间不合理。老师不会这样设置的,告诉各位看客,以本人对老师的理解,这种情况完全可能出现,一旦出现,系统没有判断到就直接是老板、领导们一次次深刻的问话。

当然还有跟夸张的会发生,譬如开始时间在第一节课前,结束时间为中午了,判断就是另一种情况了。

为了不让领导和老板们浪费口水,为了把创造bug的权利从客户手里无情的夺过来,我想了一个能判断任何情况的方法。

真相只有一个

 


再回来看,上课是以分钟为单位的,也是以天来计算的。那么一天就是24个小时,每个小时60分钟,也就是,00:00~23:59.

换算成网格也就是个24X60的二维数组。看下图

用.net来实现也就是初始化整个过程。

1 private int[,] TimeInt = new int[24, 60] 2  3 #region 初始化网格 4         private void InitTime() 5         { 6             for (int i = 0; i <= 23; i++) 7             { 8                 for (int y = 0; y <= 59; y++) 9                 {10                     TimeInt[i, y] = 0;11                 }12             }13         }14         #endregion

都是0了,那么把这棋盘上已经有的时间点给占领。

 

一节课,从8:00~8:45也就是45分钟,也就是占第8行的,第1到第45个格子,那么我把数据改成1.

1  #region 课程表的课的填入 2         ///  3         /// 课程表的课的填入 4         ///  5         private void InitCourseTable(List
listInfo) 6 { 7 if (listInfo != null && listInfo.Count > 0) 8 { 9 listInfo.ForEach(x =>10 {11 #region 先计算用了多少个网格,结束时间减去开始时间12 var timer = x.EndDateTime - x.StartDateTime;13 int Minute = timer.TotalMinutes.ToInt();//获取分钟14 int Xint = x.StartTime.Split(':')[0].ToInt();15 int Yint = x.StartTime.Split(':')[1].ToInt();16 Xint--; //坐标轴-117 #endregion18 19 #region 将网格改成1 20 for (int i = 0; i < Minute; i++)//执行多少次21 {22 TimeInt[Xint, Yint] = 1;//1表示占领了23 Yint++;//Y坐标加一24 if (Yint == 60)//表示升级了25 {26 Xint++;27 Yint = 0;28 }29 }30 #endregion31 });32 }33 }34 #endregion

开始时间为string,类似于08:00.但为了方便计算,写了个索引器,日期为今天

#region 开始上课时间,时间字段        ///         /// 开始上课时间        ///         public DateTime StartDateTime        {            get            {                return Convert.ToDateTime(DateTime.Now.ToShortDateString() + " " + StartTime);            }        }        #endregion        #region 下课时间,时间字段        ///         /// 开始上课时间        ///         public DateTime EndDateTime        {            get            {                return Convert.ToDateTime(DateTime.Now.ToShortDateString() + " " + EndTime);            }        }        #endregion

这样,该有课的时间点,都为1了,只要判断新加入的格子里是不是有人住了。

#region 判断课程表能否添加        private bool CreateCourseTable(CourseTableEntity x)        {            bool returnBool = true;//是否可以            #region 先计算用了多少个网格,结束时间减去开始时间            var timer = x.EndDateTime - x.StartDateTime;            int Minute = timer.TotalMinutes.ToInt();//获取分钟            int Xint = x.StartTime.Split(':')[0].ToInt();            int Yint = x.StartTime.Split(':')[1].ToInt();            Xint--; //坐标轴-1            #endregion            #region 将网格改成0            for (int i = 0; i < Minute; i++)//执行多少次            {                #region 判断是否是1                if (TimeInt[Xint, Yint] == 1)                {                    returnBool = false;                    break;                }                #endregion                Yint++;//Y坐标加一                if (Yint == 60)//表示升级了                {                    Xint++;                    Yint = 0;                }            }            #endregion            return returnBool;        }        #endregion

OK,判断好了,但有个问题,修改怎么办呢?原理很简单,只要把原来你的格子,改成0就行了。、

#region 修改课程表把自己原来的课程表时间改成0        private void UpdateCourseTable(CourseTableEntity x)        {            #region 先计算用了多少个网格,结束时间减去开始时间            var timer = x.EndDateTime - x.StartDateTime;            int Minute = timer.TotalMinutes.ToInt();//获取分钟            int Xint = x.StartTime.Split(':')[0].ToInt();            int Yint = x.StartTime.Split(':')[1].ToInt();            Xint--; //坐标轴-1            #endregion            #region 将网格改成0            for (int i = 0; i < Minute; i++)//执行多少次            {                TimeInt[Xint, Yint] = 0;//1表示占领了                Yint++;//Y坐标加一                if (Yint == 60)//表示升级了                {                    Xint++;                    Yint = 0;                }            }            #endregion        }        #endregion

很好,完成了!还没实战使用希望没问题。当然我觉得有点笨这个方法,原理和围棋一样,希望各位看客可以留点意见。

 

 

转载于:https://www.cnblogs.com/wearetian/p/6591032.html

你可能感兴趣的文章
sass学习笔记-安装
查看>>
Flask (二) cookie 与 session 模型
查看>>
修改添加网址的教程文件名
查看>>
[BZOJ 1017][JSOI2008]魔兽地图DotR(树形Dp)
查看>>
裁剪图片
查看>>
数据结构实习 problem L 由二叉树的中序层序重建二叉树
查看>>
VS中展开和折叠代码
查看>>
如何确定VS编译器版本
查看>>
设置PL/SQL 快捷键
查看>>
个人阅读作业7
查看>>
转载:深入浅出Zookeeper
查看>>
GMA Round 1 新程序
查看>>
node anyproxy ssi简易支持
查看>>
PHP函数 ------ ctype_alnum
查看>>
HDU 1102 Constructing Roads
查看>>
多线程之ThreadLocal类
查看>>
OC语言description方法和sel
查看>>
C#中得到程序当前工作目录和执行目录的五种方法
查看>>
python 迭代器与生成器
查看>>
[django]form的content-type(mime)
查看>>