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

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com