码迷,mamicode.com
首页 > 编程语言 > 详细

c语言日历系统的设计与部分实现

时间:2014-04-30 15:22:04      阅读:427      评论:0      收藏:0      [点我收藏+]

标签:des   c   tar   t   sp   art   tab   ble   int   type   table   

c语言实现日历系统,sqlite保存数据库,发现问题不少,特别是数据库的设计,另外,c语言的字符拼接问题也很蛋疼,问题起源如下:

起源:在日历中有个功能就是可以设置重复的事件,比如我在日历中加入一个
事件,然后可以设置这个事件按天,或者按星期,或者按月,或者按年重复提醒。
如果每个事件都是一条记录的话,肯定不可行,会导致过多的记录。但如果
是所有重复事件加个标志位使它成为一条记录的话也有个问题。就是需求中在
这一系列重复事件中我可以单独改一个事件而不影响其他事件。举个例子,我建一个事件,然后指定
这个事件在2008年12月份中的每天的12点,那我在日历中12月的每一天都可以看到这个
事件,然后我可以单独修改12月22日的事件而不影响其他的事件。这样肯定不能用一条记录。
想请教下数据库该如何设计,可以参考google日历的事件重复功能,功能差不多

解决方案:

分析如下:
1、你设计的不是闹钟,所以预订时间是没什么作用的,只是一个显示属性而已。
2、按天实际上就是按星期或者按月。。。,只是发生的日期点是“周1、周2。。。、周日”
3、实际有效的设定是按周、按月、按年。
4、日历上的每天都要按上面的周期得到属性值,比如今天是“周日”、“28日”、“12月28日”

设计如下:
1、t_memo 备忘录主表:
id int 主键
userid  int 表示属于哪个用户
begindate  date  起始日期(设定开始日期)
enddate    date  结束日期(如果为空表示一直有效,不过为了编程方便,最好是放入一个非常大的日期,比如2099年12月31日)
memomessage  varchar  备忘录内容
alarmtime  time  闹钟时间
type     int  (1表示按周、2表示按月、3表示按年。。。)
2、t_schedule 定时表
id int 主键
memoid  int  外键关联备忘录主表的主键 
validdate varchar  有效日期(按周就存入1/2/3/.../7,按月就1/2/....31/,按年就存入0101/0102/....1231)

编程(以月历方式):
从当月1号开始,计算每天的周值、月值、年值(要跟定时表的validdate匹配)
到数据库中查找满足条件的memomessage,SQL可能会是:
select m.* from t_memo m,t_schedule s
where m.id=s.memoid and begindate<=:today and enddate>=:today
and ((m.type=1 and s.validdate=:weekvalue) or (m.type=2 and s.validdate=:monthvalue) or (m.type=3 and s.validdate=:yearvalue))

 

 

 

本人采用c语言进行实现,只采用了一张表,简化了主从表查询,也达到了类似的效果

表设计如下:

create table if not exists mytimetable(id integer primary key autoincrement,startTime datetime,endTime datetime,alarmtime datetime,eventDes varchar(128),repeatOption int,validdate varchar(256))"

 

 

 

 

 

 

 

c语言日历系统的设计与部分实现,码迷,mamicode.com

c语言日历系统的设计与部分实现

标签:des   c   tar   t   sp   art   tab   ble   int   type   table   

原文地址:http://www.cnblogs.com/pengkelian/p/3699476.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!