前言
第一次写文章,感觉压力很大,文字表述能力不足希望大家见谅,本人最近在搞一个学校的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(ListlistInfo) 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
很好,完成了!还没实战使用希望没问题。当然我觉得有点笨这个方法,原理和围棋一样,希望各位看客可以留点意见。