計(jì)算機(jī)科學(xué)與技術(shù)程序設(shè)計(jì)語言課程設(shè)計(jì)萬年歷系統(tǒng)_第1頁
計(jì)算機(jī)科學(xué)與技術(shù)程序設(shè)計(jì)語言課程設(shè)計(jì)萬年歷系統(tǒng)_第2頁
計(jì)算機(jī)科學(xué)與技術(shù)程序設(shè)計(jì)語言課程設(shè)計(jì)萬年歷系統(tǒng)_第3頁
計(jì)算機(jī)科學(xué)與技術(shù)程序設(shè)計(jì)語言課程設(shè)計(jì)萬年歷系統(tǒng)_第4頁
計(jì)算機(jī)科學(xué)與技術(shù)程序設(shè)計(jì)語言課程設(shè)計(jì)萬年歷系統(tǒng)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、數(shù)學(xué)與計(jì)算機(jī)學(xué)院 課程設(shè)計(jì)說明書 課 程 名 稱: 計(jì)算機(jī)科學(xué)與技術(shù)程序設(shè)計(jì)語言-課程設(shè)計(jì) 課 程 代 碼: 8404091 題 目: 萬年歷系統(tǒng) 年級(jí)/專業(yè)/班: 09 級(jí)軟件工程 1 班 學(xué) 生 姓 名: 學(xué) 號(hào): 開 始 時(shí) 間: 2010 年 12 月 24 日 完 成 時(shí) 間: 2011 年 01 月 06 日 課程設(shè)計(jì)成績: 學(xué)習(xí)態(tài)度及平 時(shí)成績(30) 技術(shù)水平與實(shí)際 能力(20) 創(chuàng)新(5)說明書撰寫質(zhì)量(45) 總 分 (100) 指導(dǎo)教師簽名: 年 月 日 目 錄 1 1 引引 言言 .1 1 1.1 問題的提出 .1 1.2 國內(nèi)外研究的現(xiàn)狀.1 1.3 任務(wù)與分析.1

2、2 2 程序的主要功能程序的主要功能 .3 3 2.1 顯示功能.3 2.2 自動(dòng)翻頁功能 .3 2.3 查詢功能.3 2.4 幫助功能.3 2.5 退出功能.3 3 3 程序運(yùn)行平臺(tái)程序運(yùn)行平臺(tái) .4 4 4 4 總體設(shè)計(jì)總體設(shè)計(jì) 圖圖 4.14.1 流程圖流程圖 .5 5 5 5 程序代碼明細(xì)程序代碼明細(xì) .6 6 6 6 模塊分析模塊分析 .1111 6.1 系統(tǒng)日期模塊 .11 6.2 打印模塊 .11 6.3 閏年判斷模塊.12 6.4 查詢模塊 .12 6.5 菜單模塊 void mainmenu(int year,int month,int day)/主菜單 .12 6.6 關(guān)鍵

3、代碼 .13 7 7 系統(tǒng)測試系統(tǒng)測試 首先進(jìn)入首先進(jìn)入 vc+6.0vc+6.0,打開工程,打開工程 person.dswperson.dsw,然后進(jìn)入源程序,接著選擇,然后進(jìn)入源程序,接著選擇 buildbuild 下的下的 executeexecute person.exeperson.exe 即可即可, ,也可以不打開工程,直接雙擊也可以不打開工程,直接雙擊 personperson 文件夾下文件夾下 的的 debugdebug 或或 releaserelease 子文件夾下的子文件夾下的 person.exeperson.exe 文件即可運(yùn)行程序。文件即可運(yùn)行程序。 7.17.1 進(jìn)

4、入程序進(jìn)入程序 . .1414 8 8 結(jié)論結(jié)論 .1717 1 1 引引 言言 1.1 問題的提出問題的提出 萬年歷是我國古代傳說中最古老的一部太陽歷。為紀(jì)念歷法編撰者萬年功績,便將 這部歷法命名為“萬年歷” 。而現(xiàn)在所使用的萬年歷,實(shí)際上就是記錄一定時(shí)間范圍內(nèi) (比如 100 年或更多)的具體的日期的年歷,方便有需要的人查詢使用。怎樣在電腦 上顯示萬年歷以便查詢,是一個(gè)很普遍的需求。 附: 萬年歷算星期幾 :只要隨便說出公元幾幾年幾月幾日就可以馬上算出是星 期幾。 只要計(jì)算出日的代碼,月份代碼,年份代碼。三個(gè)加起來除以七的余數(shù)就是星期幾, (如余數(shù)是三,則就是星期三)。 日的代碼計(jì)算:日的

5、代碼最簡單,就是它本身,是幾號(hào)就是幾。 月份代碼計(jì)算:月份代碼也很簡單,下面有十二個(gè)數(shù):144725736146,分 別代表一至十二月份每個(gè)月的代碼。比如,九月份的代碼為6。 (據(jù)來賓介紹,他 是用逆推的方法,計(jì)算出這 12 個(gè)月份代碼的,即知道 某年某月某日 是星期幾,反 過來推算月份代碼。 年份代碼計(jì)算:年份代碼相對(duì)比較復(fù)雜,先記住2000 年對(duì)應(yīng)的年份代碼 是 4,這是基礎(chǔ)代碼,牢記即可。假如大于2000 年,比如 2010 年,則對(duì)應(yīng)的年 份代碼是( 20102000)4=22,再用基數(shù)代碼 4 減去 2 倍的商加上余數(shù)再 加 1。即 422+2+1=3,則 2010 年對(duì)應(yīng)的年份代碼

6、為 3。如果沒有余數(shù),即潤年, 則余數(shù)后面的 1 也不用加。比如 2008 年,對(duì)應(yīng)的年份代碼為 0。 1.2 國內(nèi)外研究的現(xiàn)狀國內(nèi)外研究的現(xiàn)狀 萬年歷已經(jīng)在我們生活中隨處可見,基本功能的萬年歷很早就出現(xiàn)了,現(xiàn)在已經(jīng)進(jìn) 入到多元化的設(shè)計(jì)時(shí)代了。現(xiàn)在的萬年歷不單單可以查詢?nèi)諝v還帶有許多的拓展功能, 如黃歷,星座,節(jié)日等等。 1.3 任務(wù)與分析任務(wù)與分析 要求:模仿現(xiàn)實(shí)生活中的掛歷。 當(dāng)前頁以系統(tǒng)當(dāng)前日期的月份為準(zhǔn)顯示當(dāng)前月的每一天(顯示出日及對(duì)應(yīng)的星期幾)。 當(dāng)系統(tǒng)日期變到下一月時(shí),系統(tǒng)自動(dòng)翻頁到下一月 分析: 1 1:難點(diǎn)在于判斷星期,但根據(jù)蔡勒公式,可以很容易地有年月日推斷出星期: nday

7、=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nday%7; 其中 year:要查詢的年份 nday:從該年的一月一日起到該天的天數(shù) w:得出的星期數(shù),w=0 表示星期天。 在打印月歷時(shí),只要知道第一天的星期,就可以依次輸入后面的日期,通過定長度 輸出日期,在遇到某天時(shí)星期六時(shí),就換行輸出,因此可以按照月歷的格式輸出。 對(duì)于初始輸入當(dāng)前月歷,可以通過中的 time 和 localtime 函數(shù)取出系統(tǒng) 時(shí)間進(jìn)行初始化。 time_t timer; struct tm* gmt; time( gmt=localtime( gmt 就是一

8、個(gè)時(shí)間結(jié)構(gòu)體,可以從中取出年月日。 2 2:閏年的判斷,能被 4 整除但不能被 100 整除,或者能被 400 整除的年份為閏年, 否則為平年。日期的查詢,就是直接打印改天所在月份的月歷。 3 3:判斷日期是否合法,可以先判斷年月日是否有小于 0 的值,月和日是否有超出 最大值 12 和 31 ,如果通過此判斷合法,再判斷是否時(shí)閏年,如果時(shí)閏年,則判 斷二月份是否滿足要求,閏年二月份不能超過 29 天,平年二月份不能超過 28 天。 在查詢過程中,如果發(fā)現(xiàn)輸入不合法或者不滿足輸入要求,則要求重新輸入。 2 2 程序的主要功能程序的主要功能 查詢?nèi)f年歷 2.1 顯示功能顯示功能 能夠顯示以系統(tǒng)當(dāng)

9、前時(shí)間為準(zhǔn)的日歷。 2.2 自動(dòng)翻頁功能自動(dòng)翻頁功能 能夠隨系統(tǒng)時(shí)間改變而自動(dòng)翻頁到下一頁。 2.3 查詢功能查詢功能 能夠查詢?nèi)我饽攴莺驮路莸娜f年歷。 2.4 幫助功能幫助功能 提供程序使用的說明。 2.5 退出功能退出功能 隨時(shí)退出程序。 3 3 程序運(yùn)行平臺(tái)程序運(yùn)行平臺(tái) vc+6.0。 具體操作如下:新建行編輯器工程,然后按照要求編寫代碼,再編譯,鏈接,執(zhí) 行等。要是出現(xiàn)報(bào)錯(cuò),就依次查找錯(cuò)誤行,分析報(bào)錯(cuò)原因并修改。 4 4 總體設(shè)計(jì)總體設(shè)計(jì) 圖 4.1 流程圖 圖 4.2 功能模塊 1、日期顯示 2、日期查詢 3、幫助文件 4、退出程序 2、日期查詢 1、日期顯示 3、幫助文件 4、程序

10、結(jié)束 進(jìn)入程序 顯示日歷 月歷顯示 日期查詢?nèi)掌谂袛嗳掌诖蛴¢c年判斷 5 5 程序代碼明細(xì)程序代碼明細(xì) #include #include #include #include int year,month,day;/全局變量記錄時(shí)間 int daysofmonth212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31, 30,31; int runyear(int year)/判斷是否是閏年 int flag=0; if(year%400=0|(year%4=0 return flag; struct tm*

11、getday()/從系統(tǒng)取得當(dāng)前時(shí)間 time_t timer; struct tm* gmt; time( gmt=localtime( return gmt; int dayexame(int year,int month,int day)/檢查日期是否正確 if(year0|month12|day31) return 0; switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day31)return 0;break; case 4: case 6: case 9: case 11: if(d

12、ay30)return 0;break; default: if(runyear(year) else if(runyear(year)=0 return 1; int getwday(int year,int month,int day)/取得星期 int nday=0,nday,i,w; for(i=0;imonth-1;i+) nday+=daysofmonthrunyear(year)i; nday+=day; nday=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nday%7; return w; void printcal

13、ender(int year,int month,int day)/打印月歷 int i; int w; int n; int nowday=1; char wday74=sun,mon,tue,wed,thu,fri,sat; printf( %d 年%d 月%d 日n,year,month,day); printf(*n); for(i=0;i7;i+) printf(%5s,wdayi); printf(n); w=getwday(year,month,nowday);/找到第一天的星期 n=daysofmonthrunyear(year)month-1; switch(w)/放置第一天

14、 case 0:printf(%5d,nowday);break; case 1:printf(%10d,nowday);break; case 2:printf(%15d,nowday);break; case 3:printf(%20d,nowday);break; case 4:printf(%25d,nowday);break; case 5:printf(%30d,nowday);break; default:printf(%35dn,nowday); nowday+; for(i=1;i2)f=1; while(f=1);pr switch(*menu) case 1: syste

15、m(cls);/清屏 printcalender(year,month,day); backmenu();/實(shí)現(xiàn)任意鍵返回主菜單 mainmenu(year,month,day); break; case 2: system(cls); checkcalender(); backmenu(); mainmenu(year,month,day); break; case 3: system(cls); printf(在主菜單中輸入相應(yīng)的數(shù)字就可以完成以下功能:nn); printf(* 1、顯示今天所在月的月份nn); printf(* 2、輸入日期,判斷該年是否是閏年,并顯示所在月份的月歷nn

16、); printf(* 3、顯示功能及操作方法nn); printf(* 4、退出程序nn); backmenu(); mainmenu(year,month,day); break; case 4:system(cls);printf(程序已退出!n);exit(0); default:printf(%c輸入錯(cuò)誤!n,7);flag=1; while(flag); void main() struct tm *gmt=getday(); year=gmt-tm_year+1900; month=gmt-tm_mon+1; day=gmt-tm_mday; printcalender(year

17、,month,day);/用系統(tǒng)時(shí)間進(jìn)行初始化,打印當(dāng)前月歷 backmenu(); mainmenu(year,month,day); 6 6 模塊分析模塊分析 6.16.1 系統(tǒng)日期模塊系統(tǒng)日期模塊 struct tm* getday()/從系統(tǒng)取得當(dāng)前時(shí)間 time_t timer; struct tm* gmt; time( gmt=localtime( return gmt; 6.26.2 打印模塊打印模塊 void printcalender(int year,int month,int day)/打印月歷 int i; int w; int n; int nowday=1; ch

18、ar wday74=sun,mon,tue,wed,thu,fri,sat; printf( %d 年%d 月%d 日n,year,month,day); printf(*n); for(i=0;i7;i+) printf(%5s,wdayi); printf(n); w=getwday(year,month,nowday);/找到第一天的星期 n=daysofmonthrunyear(year)month-1; switch(w)/放置第一天 case 0:printf(%5d,nowday);break; case 1:printf(%10d,nowday);break; case 2:p

19、rintf(%15d,nowday);break; case 3:printf(%20d,nowday);break; case 4:printf(%25d,nowday);break; case 5:printf(%30d,nowday);break; default:printf(%35dn,nowday); nowday+; for(i=1;in;i+) w=getwday(year,month,nowday); printf(%5d,nowday); if(w=6)/如果是星期六則換行打印 puts(n); nowday+; printf(n*nn); 6.36.3 閏年判斷模塊閏年判

20、斷模塊 閏年的判斷,能被 4 整除但不能被 100 整除,或者能被 400 整除的年份為閏年, 否則為平年。日期的查詢,就是直接打印改天所在月份的月歷。 int runyear(int year)/判斷是否是閏年 int flag=0; if(year%400=0|(year%4=0 return flag; 6.46.4 查詢模塊查詢模塊 void checkcalender()/查詢?nèi)諝v int year,month,day; system(cls); printf(請輸入你要查詢的日期(格式為年月日,如 2010 12 12):); scanf(%d%d%d, while(!dayexa

21、me(year,month,day) /如果日期輸入不正確,則重新輸入 printf(%c 你輸入的日期錯(cuò)誤,請重新輸入:,7); scanf(%d%d%d, 6.56.5 菜單模塊菜單模塊 void mainmenu(int year,int month,int day)/主菜單 char menu100; int flag=0; printf(*主菜單*n); printf(*1、日歷顯示 *n); printf(*2、日歷查詢 *n); printf(*3、幫助 *n); printf(*4、退出 *n); printf(*n) 6.66.6 關(guān)鍵代碼關(guān)鍵代碼 struct tm* ge

22、tday(); 該函數(shù)用以取得系統(tǒng)的時(shí)間。該函數(shù)沒有參數(shù),返回值類型為 struct tm*,是一個(gè)包含時(shí)間的結(jié)構(gòu)體。 int dayexame(int year,int month,int day); 該函數(shù)用以判斷輸入的年份是否合法,參數(shù)為要判斷的年月日,返回值為 1 表示該日期合法,為 0 表示不合法。 int getwday(int year,int month,int day); 該函數(shù)用以根據(jù)一個(gè)日期推斷星期,參數(shù)為要判斷的年月日。返回值為整型,123456 分別表示星 期一到星期六,0 表示星期天。 void checkcalender(); 該函數(shù)用以顯示要查詢的日期的月歷,無

23、參數(shù)和返回值, 。 void inline backmenu(); 該函數(shù)為內(nèi)聯(lián)函數(shù),用以實(shí)現(xiàn)完成某項(xiàng)功能后按任意字符鍵返回主菜單,無參數(shù)和返回值, void mainmenu(int year,int month,int day); 該函數(shù)參數(shù)為系統(tǒng)日期,無返回值,用戶在該函數(shù)執(zhí)行時(shí)可以選擇功能。 7 7 系統(tǒng)測試系統(tǒng)測試 首先進(jìn)入 vc+6.0,打開工程 person.dsw,然后進(jìn)入源程序,接著選擇 build 下的 execute person.exe 即可,也可以不打開工程,直接雙擊 person 文件夾下的 debug 或 release 子文件夾下的 person.exe 文件即

24、可運(yùn)行程序。 7.1 進(jìn)入程序 7.2 按任意字符返回主菜單 在鍵盤上輸入任意字符,進(jìn)入主菜單 7.3 1 號(hào)功能 顯示系統(tǒng)時(shí)間 7.4 2 號(hào)功能 輸入 2011 1 5 得到 2011 年 1 月 5 日的日歷 輸入 1 111 1(測試對(duì)錯(cuò)誤日期的判斷) 提示錯(cuò)誤信息,要求重新輸入 7.5 3 號(hào)功能 得到提示信息 7.6 4 號(hào)功能 成功退出 8 結(jié)論 此程序是自己所寫的第一個(gè)功能比較完整的能實(shí)現(xiàn)一定的實(shí)際功能的程序,代 碼比較短,不到 200 行,實(shí)現(xiàn)的功能有顯示當(dāng)前日歷,進(jìn)行某天的查詢,閏年的判 斷,日期的合法性判斷,簡單的提示信息。然后在程序編寫過程中,遇到了一些細(xì) 節(jié)性的問題,

25、比如在亂輸入的情況下,有時(shí)會(huì)出現(xiàn)程序崩潰,后來通過修改,修正 了漏洞。到寫報(bào)告為止,漏洞基本被找出,并得到修正。通過寫這個(gè)程序,我對(duì)程 序的健壯性有了更深的認(rèn)識(shí),也更加注意程序的細(xì)節(jié)問題。 完成程序的編寫,決不意味著萬事大吉。你認(rèn)為萬無一失的程序,實(shí)際上機(jī)運(yùn) 行時(shí)可能不斷出現(xiàn)麻煩。如編譯程序檢測出一大堆錯(cuò)誤。有時(shí)程序本身不存在語 法錯(cuò)誤,也能夠順利運(yùn)行,但是運(yùn)行結(jié)果顯然是錯(cuò)誤的。開發(fā)環(huán)境所提供的編譯 系統(tǒng)無法發(fā)現(xiàn)這種程序邏輯錯(cuò)誤,只能靠自己的上機(jī)經(jīng)驗(yàn)分析判斷錯(cuò)誤所在。程 序的調(diào)試是一個(gè)技巧性很強(qiáng)的工作,對(duì)于初學(xué)者來說,盡快掌握程序調(diào)試方法是 非常重要的。有時(shí)候一個(gè)消耗你幾個(gè)小時(shí)時(shí)間的小小錯(cuò)誤,

26、調(diào)試高手一眼就看出 錯(cuò)誤所在。 通過這次為數(shù)不多的幾天計(jì)算機(jī)實(shí)踐學(xué)習(xí),我了解了一些關(guān)于 c 語言的知識(shí),理 解鞏固了我 c 語言的理論知識(shí),這對(duì)我將來到社會(huì)工作將會(huì)有莫大的幫助。同時(shí) 它讓我知道,只要你努力,任何東西都不會(huì)太難。 最后小結(jié):程序設(shè)計(jì)過程有如何解決實(shí)際問題,從解決實(shí)際問題的角度,我們 可以這樣來看:首先要了解這個(gè)問題的基本要求,即輸入、輸出、完成從輸入到 輸出的要求是什么;其次,從問題的要害入手,從前到后的解決問題的每個(gè)方面, 即從輸入開始入手,著重考慮如何從輸入導(dǎo)出輸出,在這個(gè)過程中,可確定所需 的變量、數(shù)組、函數(shù),然后確定處理過程算法。可得最后結(jié)論。 附附 錄(可選)錄(可選

27、) 附錄 1 源程序清單 #include #include #include #include int year,month,day; int daysofmonth212=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31, 30,31; int runyear(int year) int flag=0; if(year%400=0|(year%4=0 return flag; struct tm* getday() time_t timer; struct tm* gmt; time( gmt=localti

28、me( return gmt; int dayexame(int year,int month,int day) if(year0|month12|day31) return 0; switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day31)return 0;break; case 4: case 6: case 9: case 11: if(day30)return 0;break; default: if(runyear(year) else if(runyear(year)=0 retu

29、rn 1; int getwday(int year,int month,int day) int nday=0,nday,i,w; for(i=0;imonth-1;i+) nday+=daysofmonthrunyear(year)i; nday+=day; nday=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nday%7; return w; void printcalender(int year,int month,int day) int i; int w; int n; int nowday=1; char wday74=sun,mon,tue,wed,thu,fri,sat; printf( %d 年%d 月%d 日n,year,month,day); printf(*n); for(i=0;i7;i+) printf(%5s,wdayi); printf(n); w=getwday(year,month,nowday); n=days

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論