C语言小项目实践——日历程序

完整代码包已经上传至我的down,修改请保留原作者注释
http://download.csdn.net/detail/xuptacm/9835030
炫迈日历计划研究报告

1.引言
日常生活中我们往往会忘记很多需要去安排的事情,比如拿快递,忘记候车时间,这往往让人特别懊恼。人们苦于忘记事情,但是却缺少帮助自己的软件,所以这时就需要一个好帮手来帮助你记住它,它忠诚可靠不犯错,是你最好的帮手。
1.1 项目的背景,研究的目的和意义

背景:经过日常生活调查我们发现,目前人们的操作系统下的日程管理缺少应用程序,而且实现的功能过于简单,没有一个好用的进程安排软件。大多数日历程序仅仅实现了显示时间目的。缺乏日程管理,待办事项,个性化闹钟等功能,所以我们觉得现在大多数日历功能还不够完善,做得还不够人性化。因此我们想尝试改进面向对象的日历程序,使其功能更人性化,提供的服务更齐全。

1.2 项目的目前研究现状

此项目现阶段还处于初级阶段,需要进一步优化,具体实施将等到所学知识的进一步健全以及对项目有进一步的认识,并且主打移动端,但是目前只开发部分桌面端功能
目前完成了
1.日历的基本显示 (完成)
2.日历的查询与随机更改年份月份 (完成)
3.星期显示 (完成)
4.背景音乐 (完成)
5.欢迎基础菜单 (完成)
6.史前今日 (完成)
7.节日与节假日查询 (未完成)
8.百度一下 (完成)
9.日常管理与待办事项 (未完成)
10.个性化皮肤设计 (完成)
11.个性化私人定制闹钟 (未完成)
12.个人生活管家 (APP未完成)
13.情景智能(智能识别短消息“火车票短息”“快递短息”或是日程安排,自动建立闹钟或是进程) (APP未完成)

2.系统的技术可行性
已经完成功能
日历的显示,日历的查询与随机更改年份月份,查询某一天的星期,包括古代,近代,现代,与未来某天的日历

 背景音乐与欢迎菜单,通过EasyX制作操作界面,在纯c语言中制作图形欢迎界面,并且在日历显示端加入背景音乐,可以播放音乐,能作为媒体音乐播放器使用

未完成功能
1.全鼠标操作界面,通过鼠标操作,在c环境下编写鼠标操作界面。 全透明皮肤,嵌入进桌面端,并且只有双击才可选择
2.史前今日功能,设想在用户随机选择某年某月某日,利用Windows环境下API编程调用百度插件将用户点击的日期通过百度进行搜索,让用户了解古时的今天有那些事情发生。
3.百度一下功能,如上。
4.日常管理与待办事项,用户点击日历中的某天,弹出设定闹钟时间与记事本,并且在日期下方显示出来待办事项。用户能够轻松的查看今天的待办事项与闹钟时间
5.个性化皮肤设计,桌面的背景显示皮肤可以用户自定义。
6.个性化定制闹钟,用户自己设定时间与事务,进行闹钟提醒,还可以个人定制闹钟铃声以及声音渐进,不会过于突兀。
7.个人生活管家,今天的运动量,今天的应该摄入的卡路里计算,以及身高体重,计算KPI身材匀称指数,相应的安排每个月的运动量以及卡路里指数(主要在APP中实现)
8.情景智能 智能识别短消息“火车票短息”“快递短息”进行日程安排,自动建立闹钟或是进程,例如收到火车票短信,“订单号E1824654629,刘 先生\女士, 您已购10月24日D234车(次)8车(厢)西安站19:20开,请刘锐钢 先生尽快换取纸质车票。”这时,读取到 姓名 + 日期 + 时间 + 站点 +车次 生成日程在日历中 并且建立提前两个小时的闹钟,方便用户。
同样的读取快递短息 “订单号E1824654629,顺丰快递 单号178 请您在13.30前到西区天桥领取您的快递” 识别短息 快递公司名 + 单号 + 时间。
并且生成进程卡,设定提前20分钟的闹钟。

2.1 系统的简要描述
功能:日历的基本功能,进程管理,情景智能,短息识别,智能闹钟
2.2 系统采用的技术、特点
这次我们打算用Java语言和Swift来开发这个程序,这主要是因为程序会更多的应用在移动端。每个人都有智能手机,但是个人的日程却没有一个很好的软件来进行管理,这是一片别人未发现的宝藏,有着很强很强的商业性,但是由于项目只是初级阶段,小组人员技术有限,我们只是学习了C语言,但是需要时间和人力进行开发,缺少的就是时间,但是项目的可行性是毋庸置疑的,项目复杂度也适中,最终会使用到哪些技术也要在实践的过程中去获得结论

2.3 技术可行性评价

桌面端EasyX以前我们曾在学C语言时触过一个小的项目,那时做的是一个图书管理系统,了解了c语言中EasyX代码的编写,但是对其中的一些思想有所了解。但那时由于没有数据库的知识,所以系统还不算复杂。我们又添加了许多其他的功能,所以会复杂一些。而且那时完全是为了练手,所以界面比较粗糙,而我们做的这套系统是面向用户的,所以界面必然会做得友好一些,这必然也会增加程序开发的难度。任何项目的开发都不会没有难度,我觉得只要认真思考,并借助各种资源,花时间我们能够最终开发出这套程序来

  1. 结论意见(能否承担该项目/条件具备承担该项目)
    虽然此项目存在一定的技术难度,但我们对项目要达到的目标十分清楚,对所要开发系统将要实现的功能也非常了解。而且有一些成品(例如华为公司智能终端产品,但是其功能较为单一用户友好度也并不高)作为参考,并且在项目的实施过程中我们能够获得帮助,我认为只要我们能够认真思考、仔细规划、明确分工,我们可以承担此项目的开发
#include "ymd.h"
#include"stdio.h"
#include <graphics.h>
#include <conio.h>
#include "windows.h"
#pragma comment (lib,"Winmm.lib")
// 主函数
int main()                                                      
{
    char add;
    tm *t;                                      // 在 time.h 中有定义为一个结构体
    time_t Clock;                               // 在 time.h 中有定义为一个结构体
    Time tm;                                    // 结构体 tm

    initgraph(1024, 512);
    IMAGE img;
    loadimage(NULL,"menu.jpg");
    putimage(0,0,&img); 
    Sleep(1200);
    // 初始化
    Init();                                                         

    // 获取结构体 Clock 的参数
    time(&Clock);   

    // 获取时间
    t = localtime(&Clock);                                          

    tm.year = t->tm_year + 1900;                // 当前系统时间所处年份
    tm.month = t->tm_mon + 1;                   // 获取系统时间所在月份
    tm.yearFlag = tm.year;                      // 标记当前年份份
    tm.monthFlag = tm.month;                    // 标记当前月份

    // 绘制星期
    DrawWeek();                                 

    // 绘制当月的日历
    DrawDate(tm);                                                   

    // 主循环
    while(1)                                                        
    {

        // 从键盘获取按键
        add = getch();                                              

        // 计算现在的年月
        CalDate(tm, add);                                           

        // 判断年月是否更改, 改则进入 if 语句
        if (DateFlag(tm.year, tm.yearFlag, tm.month, tm.monthFlag))  
        {
            // 清除屏幕
            cleardevice();

            // 从新绘制星期
            DrawWeek();

            // 从新绘制当月日历
            DrawDate(tm);

            tm.yearFlag = tm.year;              // 更改新标记年份
            tm.monthFlag = tm.month;            // 更改新标记月份
        }
            mciSendString("open 天命.mp3 alias mymusic",NULL,0,NULL); 
            mciSendString("play mymusic",NULL,0,NULL);
    }

    // 返回
    return 0;
}`
#include "ymd.h"

int x1[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};                       // 闰年的每月天数
int x2[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};                       // 平年的每月天数

char *Week[] = {"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};   // 定义星期
char num[3];                                                                            // 定义 num 字符串
char xy[30];                                                                                // 定义 xy 字符串,

// 初始化
void Init()                                                                            
{
    // 初始化绘图窗口
    initgraph(640, 640);
    setbkcolor(BLUE);
    cleardevice();
}

// 绘制星期
void DrawWeek()                                                                        
{
    char str[7];
    int x1 = 0;

    for (int i = 0; i < 7; i++)
    {
        sprintf(str, "%s", Week[i]);
        outtextxy(120 + x1, 100, str);
        x1 += 60;
    }
}

// 计算现在的年月
void CalDate(Time& tm, char x)                                                         
{

    switch(x)
    {
        case 'q':   tm.year++;              break;
        case 'w':   tm.year += 10;          break;
        case 'e':   tm.year += 100;         break;
        case 'r':   tm.year += 1000;        break;
        case 't':   if (tm.month < 12)      tm.month++;         break;
        case 'a':   if (tm.year > 0)        tm.year--;          break;
        case 's':   if (tm.year >= 10)      tm.year -= 10;      break;
        case 'd':   if (tm.year >= 100)     tm.year -= 100;     break;
        case 'f':   if (tm.year >= 1000)    tm.year -= 1000;    break;
        case 'g':   if (tm.month > 1)       tm.month--;         break;
    } 
}

// 判断年份和月份是否更改
bool DateFlag(int y1, int y2, int m1, int m2)                                          
{
    return (y1 != y2 || m1 != m2);
}

// 判断是闰年还是平年
bool CalYear(int year)                                                         
{ 
    return ((year % 4 == 0 && year % 10 != 0) || year % 400 == 0);
} 

// 绘制当月日历
void DrawDate(Time &tm)                                                                 
{
    int y = 0, z = 0;
    int s;

    sprintf(xy, "这是公元 %d 年 %d 月的日历", tm.year, tm.month);
    outtextxy(200, 30, xy);
    sprintf(xy, "增加年月,分别为Q(加1年).W(加10年).E(加100年).R(加1000年).T(加1月)", tm.year, tm.month);
    outtextxy(80, 50, xy);
    sprintf(xy, "减小年月,分别为A(减1年).S(减10年).D(减100年).F(减1000年).G(减1月)", tm.year, tm.month);
    outtextxy(80, 70, xy);
    s = (5 + (tm.year + 1) + (tm.year - 1 ) / 4 - (tm.year - 1) 
        / 100 + (tm.year - 1) / 400) % 7;

    if (CalYear(tm.year))                       // 如果当月前年份是闰年
    {
        for (int i = 1; i < tm.month; i++)
        {
            s = (x1[i] + s) % 7;
        }

        if (s / 6 != 1)
        {
            y = (s + 1) * 60;
        }

        for (i = 1; i <= x1[tm.month]; i++)
        { 
            sprintf(num, " %d ", i);
            outtextxy(140 + y, 150 + z, num);
            y += 60;
            if ((i + s) % 7 == 6 && (i + s) >= 6)
            {
                z += 85;
                y = 0;
            }
        } 
    }
    else                                     // 如果当前年份不是闰年
    {
        for (int i = 1; i < tm.month; i++)
        {
            s = (x2[i] + s) % 7;
        }

        if (s / 6 != 1)
        {
            y = (s + 1) * 60;
        }

        for (i = 1; i <= x2[tm.month]; i++)
        { 
            sprintf(num, " %d ", i);
            outtextxy(140 + y, 150 + z, num);
            y += 60;
            if ((i + s) % 7 == 6)
            {
                z += 85;
                y = 0;
            }           
        } 
    }
}
/********************************************
 * 程序名称: 炫迈日历                       *
 * 编译环境: vc++6.0 + EasyX(beta)          *
 ********************************************/

#ifndef ymd_h
#define ymd_h


#include <iostream>
#include <graphics.h>
#include <conio.h>
#include <string>
#include <time.h>
#include <windows.h>
#pragma comment (lib,"Winmm.lib")
using namespace std;

struct Time                                     // 定义了一个结构体
{
    int year, month;                            // 年月
    int yearFlag, monthFlag;                    // 用来标记年月是否改变
};


void Init();                                    // 绘制初始图形界面
void DrawWeek();                                // 绘制星期
bool CalYear(int year);                         // 判断是闰年还是平年
void DrawDate(Time &tm);                        // 绘制当月日历
void CalDate(Time& tm, char x);                 // 计算现在的年月
bool DateFlag(int y1, int y2, int m1, int m2);  // 判断年份和月份是否更改


extern char *Week[];                            // 声明 Week 字符串数组
extern int x1[13];                              // 声明 x1 整数数组
extern int x2[13];                              // 声明 x2 整数数组
extern char num[3];                             // 声明 num 字符串
extern char xy1[5];                             // 声明 xy 字符串

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YULIU_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值