C語言課程設(shè)計(jì)萬年歷打印.doc_第1頁
C語言課程設(shè)計(jì)萬年歷打印.doc_第2頁
C語言課程設(shè)計(jì)萬年歷打印.doc_第3頁
C語言課程設(shè)計(jì)萬年歷打印.doc_第4頁
C語言課程設(shè)計(jì)萬年歷打印.doc_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、溫馨提示程序語言:C、 C+、 C#、 Python ( 紅色字體表示本課設(shè)使用的程序設(shè)計(jì)語言)圖形功能選項(xiàng):Win32 控制臺程序(黑框、文本界面)、 Win32 程序、 MFC、 WinForm 、DirectX10 ( 黑體標(biāo)明表示本課設(shè)的程序圖形類別,默認(rèn)為 非圖形界面Win32 控制臺程序)數(shù)據(jù)結(jié)構(gòu):基礎(chǔ)類型、數(shù)組 、鏈表、雙向鏈表、搜索樹(非平衡二叉樹)、平衡二叉樹、鏈表與平衡二叉樹相結(jié)合、堆棧、隊(duì)列、串、圖(黑體標(biāo)明表示本課設(shè)使用的數(shù)據(jù)結(jié)構(gòu) )C+語言項(xiàng):STL庫(黑體標(biāo)明 表示使用C+的STL庫)編譯環(huán)境:Windows 7 64 位旗艦版(Linux 及其他環(huán)境請謹(jǐn)慎下載)集

2、成開發(fā)環(huán)境:Visual C+ 6.0 、 DEVC+ 、 CodeBlocks 、 Visual Studio 2015 均可通過編譯。 (若 無法通過編譯運(yùn)行,則會用淺藍(lán)色字體表示)分多 頭文件 編譯: 否 (所有代碼基本都包含在一個文件內(nèi),如需試驗(yàn)頭文件功能,請自行參考相關(guān)文獻(xiàn))內(nèi)容說明:1 、 課設(shè)題目及預(yù)覽內(nèi)容將在第二頁開始展示。2 、代碼行數(shù):333 行3 、 目錄 所示內(nèi)容,本文基本涵蓋,如無內(nèi)容,會在本頁進(jìn)行說明。4 、 附錄 絕對包含 用戶使用手冊及 程序完整源代碼和詳細(xì)注釋。5 、 如需下載其他 頭文件(例如DirectX 需另行配置),本文會在此進(jìn)行說明。6 、 本文撰寫

3、內(nèi)容僅供學(xué)習(xí)參考,另外,由于本人水平有限,編寫之處難免存在錯誤和紕漏,懇請各位老師或同學(xué)批評指正。題目:萬年歷顯示功能要求:(1)輸入一個年份,輸出是在屏幕上顯示該年的日歷。假定輸入的年份在 問。(2)輸入年月,輸出該月的日歷。(3)輸入年月日,輸出距今天還有多少天,星期幾,是否是公歷節(jié)日。1940-2040 年之功能(二):功能(三):課程設(shè)計(jì)報(bào)告課 題:學(xué) 院:專 業(yè):學(xué)生姓名:學(xué) 號:指導(dǎo)老師:20XX年XX月XX日目錄摘要萬年歷的主要功能是通過C 語言編程實(shí)現(xiàn)查詢某年的日歷情況,并且可以查詢某年月的 日歷情況,還可以對某年月日進(jìn)行計(jì)算距今的天數(shù)和判斷是否為公歷節(jié)日,其功能和代碼滿足人性

4、化設(shè)計(jì)和良好的編程規(guī)范要求。關(guān)鍵詞:萬年歷,C 語言編程,人性化設(shè)計(jì)1總體設(shè)計(jì)1.1 需求分析系統(tǒng)將以用戶輸入的信息進(jìn)行功能的選擇,提供某年日歷的輸出、某年某月日歷的輸出 和距今天數(shù)的輸出及節(jié)假日的判斷這大三功能。1.2 功能流程圖本程序主要通過獲取屏幕輸入,然后進(jìn)行字符串處理,選擇相應(yīng)的功能執(zhí)行,最后打印 輸出信息。功能流程圖如下:1.3 功能模塊圖2 詳細(xì)設(shè)計(jì)2.1 數(shù)據(jù)結(jié)構(gòu)建立日歷信息結(jié)構(gòu)體,結(jié)構(gòu)體成員變量包括月末、月初星期幾、屏幕信息左半邊日歷是否打印完畢。typedef struct calendar int month_end; /月末最后一天的數(shù)字int first_day;/月

5、初星期幾0周日 1周一 int printFinished; /打印完畢則為1 ,沒打印完成則為0Calendar ;建立年月日信息結(jié)構(gòu)體,結(jié)構(gòu)體成員變量包括年份、月份、天數(shù)。typedef struct date int year;int month;int day;Date ;2.2 函數(shù)功能設(shè)計(jì)本萬年歷系統(tǒng)主要分為三大功能,分別是打印某年日歷、打印某年某月日歷、打印距今天數(shù)和判斷是否節(jié)假日,故分別設(shè)計(jì)三個函數(shù)實(shí)現(xiàn)三大功能,如下所示。void firstFun( int year, Calendar cal); /第一功能void secondFun( int year, int mont

6、h , Calendar cal);/第二功能void thirdFun( int year, int month , int day); /第三功能各程序流程圖如下:圖 2.1 程序流程圖(一)是否firstFun() 函數(shù)開始判斷是否打印了6 和 12 月份的日歷打印某月日歷結(jié)束圖 2.2 程序流程圖(二)是否secondFun() 函數(shù)開始判斷是否月末的天數(shù)打印某月某日的日歷結(jié)束圖 2.3 程序流程圖(三)thirdFun() 函數(shù)開始判斷是否節(jié)假日3調(diào)試分析3.1程序測試運(yùn)行程序之后,會進(jìn)入主界面,如圖 3.1所示。圖3.2打印某年日歷圖具體如圖3.23.4所示。I 4b pirtl.

7、冒他期丁 /妁 .1M浦E 1-J Jha CailjfnidaLr af 而,1HIU FRI MF949&*NfisY irt 1112ia 警01 1 IM la r.7 t IB匕,,W 1112 13;“口 THd rn: EfliT H MHHzn wy'-I'll IIILi I H, till 12 vum nw! JIA 融-iJ26寸lh 7 e it11"VkD 1HU FRI SfflE V KIM HM|r» Iwi nW圖3.1主界面圖隨后,可分別通過輸入年、年月、年月日實(shí)現(xiàn)三個功能的輸出,re us dd-iy he 號

8、 左m E.unC.lnuc .The year 2018Month 7皿 C:ndows5ystem2cjndTxe一.k 一一Please input the yotiA uhose calendair outo knou:2B18 7圖3.4計(jì)算距今天數(shù)圖Press key to continue圖3.3打印某年月日歷圖廛 C:wi ndcwisystem32cmd.exePlease input theThe output is 65youi' whose calendar you uant to knov:2B18 10 1 dajis dwayMonday , Nation

9、al Day.Pres anv key tocontinue .3.2程序缺陷1、該程序每次運(yùn)行,只能執(zhí)行一次,不能重復(fù)選擇功能,屬于設(shè)計(jì)缺陷。2、對年份的不規(guī)范輸入,可能出現(xiàn)與預(yù)期結(jié)果不一致的情況,如圖 3.5所示,理論應(yīng)該 輸出12345年的日歷,然而只是輸出了 12345年5月的日歷,屬于程序漏洞。圖3.5 BUG展示圖4 總結(jié)與體會這個課程設(shè)計(jì)的難度在于打印輸出日歷,在設(shè)計(jì)過程中遇到問題,可以說是困難重重,因?yàn)楫吘故堑谝淮巫龅模y免會遇到各種各樣的問題,同時在設(shè)計(jì)過程中我也發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解的不夠深刻,掌握的不夠牢固。通過這次課程設(shè)計(jì)之后,我覺得以前學(xué)過的知識

10、要重新溫習(xí)才能夠達(dá)到查漏補(bǔ)缺的效果。我會在今后的日子里,努力學(xué)好程序設(shè)計(jì),成為一名出色的工程師。最后, 這次的課程設(shè)計(jì)終于得以圓滿完成。其中, 我在設(shè)計(jì)中也遇到了許許多多的問題,但在老師的指導(dǎo)和同學(xué)們的幫助下得到了解決,總的來說還不是這個程序還不是很完善,但我不會放棄繼續(xù)完善這份程序,我會在課余時間里繼續(xù)修改完善這份程序。在此,感謝所有幫助過我的同學(xué)和指導(dǎo)老師。參考文獻(xiàn)1 譚浩強(qiáng)著.C 程序設(shè)計(jì)(第四版).北京:清華大學(xué)出版社,20102 林銳著.高質(zhì)量C 編程指南.北京:電子工業(yè)出版社,200120093 Stephen A.Maguire. 編程精粹:編寫高質(zhì)量C 語言代碼.人民郵電出版社

11、,附錄用戶使用手冊1 、根據(jù)屏幕提示,輸入即可。2 、輸入年份,例如2018 年,則會打印2018 年的日歷。3 、 輸入年月,例如 2018 10(也可以嘗試其他的分隔符,例如 2018,10 ) , 則會打印2018年 10 的日歷。4、輸入年月日,例如2018 10 1 (同上) ,則會輸出距今的天數(shù)和輸出具體的節(jié)假日。程序源代碼#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#define isPrime (year) (year%4=0&a

12、mp;&year%100!=0)|(year%400=0)/宏函數(shù),判斷是否為閏年#define TWELVEMONTH 12/數(shù)組大小#pragma warning (disable :4996)/消除 Visual Stdio 編譯環(huán)境的安全警告,其他編譯環(huán)境可刪除/ 結(jié)構(gòu)體定義區(qū)/typedef struct calendar int month_end; /月末最后一天的數(shù)字int first_day;/月初星期幾0周日1周一 int printFinished;/打印完畢則為1 ,沒打印完成則為0Calendar ;typedef struct dateint year;in

13、t month;int day;Date ;/ 函數(shù)聲明區(qū)/void judgmentLeapYear( int year, Calendar *cal); /判斷閏年int calculateWeeks( int y, int m, int d);/計(jì)算該年月日是周幾void firstFun( int year, Calendar cal);/第一功能void secondFun( int year, int month , Calendar cal); /第二功能void thirdFun( int year, int month , int day); /第三功能int dateDif

14、f( struct date mindate , struct date maxdate ); /計(jì)算日期之間的間隔天數(shù)int main(void)Calendar calTWELVEMONTH = 31 , /1 月 28 , /2月 31 , /3月 30 , /4月 31 , /5月 30 , /6月 31 , /7月 31 , /8月 30 , /9月 31 , /10月 30 , /11 月 31 /12月; /初始化月份int year = 2000, month = 0, day = 0;int fun = 0;char calendar30 = '0' ; /用

15、來處理輸入printf( "Please input the your whose calendar you want to know:" );fgets(calendar, 30, stdin );year = atoi(calendar);/得到年份if (calendar4 != '0')month = atoi(calendar + 4); /得到月份if (strlen(calendar) >= 8)day = atoi(calendar + strlen(calendar) - 2);if (0 != year && 0 =

16、 month && 0 = day)fun = 1;elsefun = 0 = day ? 2 : 3;judgmentLeapYear(year, &cal1);/調(diào)整閏年平年2月的天數(shù)int i = 0;for (i = 0; i < TWELVEMONTH ; i+)cali.first_day = calculateWeeks(year, i + 1, 1);switch (fun) case 1:firstFun(year, cal); break;case 2:secondFun(year, month, cal); break;case 3:thir

17、dFun(year, month, day); break ;return 0;void judgmentLeapYear( int year, Calendar *cal)if (year % 4 = 0) && ( year % 100 != 0) | ( year % 400 = 0) cal ->month_end = 29;elsecal ->month_end = 28;int calculateWeeks( int year, int month , int day)int c, w, y;y = year % 100; /年如 2015 即年是 15

18、年c = year / 100; /年份前兩位如 2015即 20if (month = 1 | month = 2) /判斷月份是否為1或 2y-;month += 12;/某年的1、 2月要看作上一年的13、 14月來計(jì)算w = y + y / 4 + c / 4 - 2 * c + 13 * ( month + 1) / 5 + day - 1;/蔡勒公式while (w < 0) w += 7; /確保余數(shù)為正w %= 7;return w;void firstFun( int year, Calendar cal)printf( "|=The Calendar of

19、Year %d=|n" , year);int month = 1;for (month = 1; month <= TWELVEMONTH / 2; month+) printf( "| %d SUN MON TUE WED THU FRI SAT %2d SUN MON TUE WEDTHU FRI SAT |n" , month, month + 6);int right = 1, left = 1;int i = 0;for (right = 1, left = 1; 1; left+) if (1 = left) /左邊首日打印printf( &q

20、uot;|");for (i = 0; i < calculateWeeks( year, month, left); i+) printf( "");printf( "%4d", left);if (6 = calculateWeeks( year, month, left) /既是首日也是周六 printf( "");else if (left = calmonth - 1.month_end) /左邊月末打印printf( "%4d", left);for (i = 0; i < 6 -

21、 calculateWeeks( year, month, left); i+) printf( "");printf( "");cal month - 1.printFinished = 1;/月末,則表示左邊日歷打印完畢else if (6 = calculateWeeks( year, month, left) && left <= calmonth -1.month_end) /左邊日歷的周六,則開始打印右邊的日歷printf( "%4d", left);for (i = 0; i < 6 - ca

22、lculateWeeks( year, month, left); i+) printf( "");printf( "");else if (1 = calmonth - 1.printFinished) /左邊打印完畢則補(bǔ)齊空格for (i = 0; i < 8; i+) printf( "");printf( " ");elseprintf( "%4d", left);if (6 = calculateWeeks( year, month, left) && left

23、<= calmonth - 1.month_end | calmonth - 1.printFinished) for (; right+) if (1 = right) /右邊首日打印for (i = 0; i < calculateWeeks( year, month + 6, right); i+)printf( "");printf( "%4d" , right);if (6 = calculateWeeks( year, month + 6, right) /既是首日也是周六printf(" |n|");righ

24、t+;break;else if (right = calmonth - 1 + 6.month_end) /右邊月末打印printf( "%4d" , right);for (i = 0; i < 6 - calculateWeeks( year, month + 6, right); i+) printf( "");printf( " |n|");cal month - 1 + 6.printFinished = 1; /月末,則表示右邊日歷打印完畢right+;break ;else if (6 = calculateWe

25、eks( year, month + 6, right) && right <= calmonth - 1 + 6.month_end) /右邊日歷的周六,則開始打印左邊的日歷printf( "%4d |n|", right);right+;break ;else if (calmonth - 1 + 6.printFinished) /右邊打印完畢則補(bǔ)齊空格for (i = 0; i < 7; i+)printf( "");printf( " |n|");right+;break ;elseprintf(

26、 "%4d" , right);if (calmonth - 1.printFinished&& calmonth - 1 + 6.printFinished) putchar( 'r');/ 將光標(biāo)跳到本行的開頭,消除多余的打印字符break;putchar( '|');int i = 0;for (i = 0; i < 65; i+)putchar( '=');putchar( '|');putchar( 'n');void secondFun( int year, i

27、nt month , Calendar cal)printf( "|=The Year %d Month %d=|n", year, month );printf( "| %d SUN MON TUE WED THU FRI SAT |n" , month);int i = 1, j = 1;for (i = 1; i <= calmonth - 1.month_end; i+) if (1 = i) /首日打印 printf( "|");for (j = 0; j < calculateWeeks( year, mont

28、h , i); j+) printf( "");printf( "%4d" , i);if (6 = calculateWeeks( year, month , i) /既是首日也是周六printf( " |n|");else if (6 = calculateWeeks( year, month , i) /周六換行 printf("%4d |n|", i);else if (i = calmonth - 1.month_end) /月末printf( "%4d" , i);for (j =

29、0; j < 6 - calculateWeeks( year, month , i); j+) printf( "");printf( " |n" );elseprintf( "%4d" , i);putchar( 'r');putchar( '|');for (i = 0; i < 32; i+)putchar( '=');putchar( '|');putchar( 'n');void thirdFun( int year, int mo

30、nth , int day) time_t t;struct tm * timeinfo;Date d1 = year, month ,day ;Date d2;char ch20 = '0' ;/用于存儲周幾char festival20 = '0' ;/用于存儲節(jié)日int iDayNum = 0;time(&t);/獲取今天的日期timeinfo = localtime(&t);d2.year = timeinfo->tm_year + 1900;d2.month = timeinfo->tm_mon + 1;d2.day = t

31、imeinfo->tm_mday;iDayNum = (dateDiff(d1, d2);case 0:strcpy(ch, case 1:strcpy(ch, case 2:strcpy(ch, case 3:strcpy(ch, case 4:strcpy(ch, case 5:strcpy(ch, case 6:strcpy(ch, switch (calculateWeeks(d1.year, d1.month, d1.day) "Sunday" ); break;"Monday" ); break;"Tuesday"

32、); break ;"Wednesday" ); break ;"Thursday" ); break;"Friday" ); break;"Saturday" ); break;if (1 = d1.month && 1 = d1.day)strcpy(festival, "New year's Day" ); /元旦else if (3 = d1.month && 8 = d1.day)strcpy(festival, "Internatio

33、nal Women's Day" ); /國際婦女節(jié)else if (3 = d1.month && 12 = d1.day)strcpy(festival, "Arbor Day" );/植物節(jié)else if (4 = d1.month && 5 = d1.day)strcpy(festival, "Qingming Festival" );/清明節(jié)else if (5 = d1.month && 1 = d1.day)strcpy(festival, "Labor Day&q

34、uot; );/勞動節(jié)else if (5 = d1.month && 4 = d1.day)strcpy(festival, "Youth Day" );/青年節(jié)else if (6 = d1.month && 1 = d1.day)strcpy(festival, "Children's Day" );/兒童節(jié)else if (7 = d1.month && 1 = d1.day)strcpy(festival, "Party Building" );/建黨節(jié)else if

35、(8 = d1.month && 1 = d1.day) strcpy(festival, "Army Day" );/建軍節(jié)else if (9 = d1.month && 3 = d1.day)strcpy(festival, "Anti Japanese War Victory Day" ); / 抗日戰(zhàn)爭勝利紀(jì)念日else if (9 = d1.month && 10 = d1.day)strcpy(festival, "Teachers day" );/教師節(jié)else if (10 = d1.month && 1 = d1.day)strcpy(

溫馨提示

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

評論

0/150

提交評論