C語言課程設計萬年歷打印.doc_第1頁
C語言課程設計萬年歷打印.doc_第2頁
C語言課程設計萬年歷打印.doc_第3頁
C語言課程設計萬年歷打印.doc_第4頁
C語言課程設計萬年歷打印.doc_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

5、初星期幾0周日 1周一 int printFinished; /打印完畢則為1 ,沒打印完成則為0Calendar ;建立年月日信息結構體,結構體成員變量包括年份、月份、天數。typedef struct date int year;int month;int day;Date ;2.2 函數功能設計本萬年歷系統主要分為三大功能,分別是打印某年日歷、打印某年某月日歷、打印距今天數和判斷是否節假日,故分別設計三個函數實現三大功能,如下所示。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() 函數開始判斷是否打印了6 和 12 月份的日歷打印某月日歷結束圖 2.2 程序流程圖(二)是否secondFun() 函數開始判斷是否月末的天數打印某月某日的日歷結束圖 2.3 程序流程圖(三)thirdFun() 函數開始判斷是否節假日3調試分析3.1程序測試運行程序之后,會進入主界面,如圖 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主界面圖隨后,可分別通過輸入年、年月、年月日實現三個功能的輸出,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計算距今天數圖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、該程序每次運行,只能執行一次,不能重復選擇功能,屬于設計缺陷。2、對年份的不規范輸入,可能出現與預期結果不一致的情況,如圖 3.5所示,理論應該 輸出12345年的日歷,然而只是輸出了 12345年5月的日歷,屬于程序漏洞。圖3.5 BUG展示圖4 總結與體會這個課程設計的難度在于打印輸出日歷,在設計過程中遇到問題,可以說是困難重重,因為畢竟是第一次做的,難免會遇到各種各樣的問題,同時在設計過程中我也發現了自己的不足之處,對以前所學過的知識理解的不夠深刻,掌握的不夠牢固。通過這次課程設計之后,我覺得以前學過的知識

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

11、,附錄用戶使用手冊1 、根據屏幕提示,輸入即可。2 、輸入年份,例如2018 年,則會打印2018 年的日歷。3 、 輸入年月,例如 2018 10(也可以嘗試其他的分隔符,例如 2018,10 ) , 則會打印2018年 10 的日歷。4、輸入年月日,例如2018 10 1 (同上) ,則會輸出距今的天數和輸出具體的節假日。程序源代碼#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)/宏函數,判斷是否為閏年#define TWELVEMONTH 12/數組大小#pragma warning (disable :4996)/消除 Visual Stdio 編譯環境的安全警告,其他編譯環境可刪除/ 結構體定義區/typedef struct calendar int month_end; /月末最后一天的數字int first_day;/月初星期幾0周日1周一 int printFinished;/打印完畢則為1 ,沒打印完成則為0Calendar ;typedef struct dateint year;in

13、t month;int day;Date ;/ 函數聲明區/void judgmentLeapYear( int year, Calendar *cal); /判斷閏年int calculateWeeks( int y, int m, int d);/計算該年月日是周幾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 ); /計算日期之間的間隔天數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);/調整閏年平年2月的天數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月來計算w = y + y / 4 + c / 4 - 2 * c + 13 * ( month + 1) / 5 + day - 1;/蔡勒公式while (w < 0) w += 7; /確保余數為正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) /左邊打印完畢則補齊空格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) /右邊打印完畢則補齊空格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');/ 將光標跳到本行的開頭,消除多余的打印字符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' ;/用于存儲節日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" ); /國際婦女節else if (3 = d1.month && 12 = d1.day)strcpy(festival, "Arbor Day" );/植物節else if (4 = d1.month && 5 = d1.day)strcpy(festival, "Qingming Festival" );/清明節else if (5 = d1.month && 1 = d1.day)strcpy(festival, "Labor Day&q

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

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

溫馨提示

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

評論

0/150

提交評論