C語言課程設計報告萬年歷打印_第1頁
C語言課程設計報告萬年歷打印_第2頁
C語言課程設計報告萬年歷打印_第3頁
C語言課程設計報告萬年歷打印_第4頁
C語言課程設計報告萬年歷打印_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

溫馨提示程序語言:C、C++、C*、Python〔紅色字體表示本課設使用的程序設計語言〕圖形功能選項:Win32控制臺程序〔黑框、文本界面〕、Win32程序、MFC、WinForm、Direct*10〔黑體標明表示本課設的程序圖形類別,默認為非圖形界面Win32控制臺程序〕數(shù)據(jù)構造:根底類型、數(shù)組、鏈表、雙向鏈表、搜索樹〔非平衡二叉樹〕、平衡二叉樹、鏈表與平衡二叉樹相結合、堆棧、隊列、串、圖〔黑體標明表示本課設使用的數(shù)據(jù)構造〕C++語言項:STL庫〔黑體標明表示使用C++的STL庫〕編譯環(huán)境:Windows764位旗艦版〔Linu*及其他環(huán)境請慎重下載〕集成開發(fā)環(huán)境:VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可通過編譯。〔假設無法通過編譯運行,則會用淺藍色字體表示〕分多頭文件編譯:否〔所有代碼根本都包含在一個文件,如需試驗頭文件功能,請自行參考相關文獻〕容說明:1、課設題目及預覽容將在第二頁開場展示。2、代碼行數(shù):333行3、目錄所示容,本文根本涵蓋,如無容,會在本頁進展說明。4、附錄絕對包含用戶使用手冊及程序完整源代碼和詳細注釋。5、如需下載其他頭文件〔例如Direct*需另行配置〕,本文會在此進展說明。6、本文撰寫容僅供學習參考,另外,由于本人水平有限,編寫之處難免存在錯誤和紕漏,懇請各位教師或同學批評指正。題目:萬年歷顯示功能要求:輸入一個年份,輸出是在屏幕上顯示該年的日歷。假定輸入的年份在1940-2040年之間。輸入年月,輸出該月的日歷。輸入年月日,輸出距今天還有多少天,星期幾,是否是公歷節(jié)日。運行截圖:功能〔一〕:功能〔二〕:功能〔三〕:課程設計報告課題:學院:專業(yè):學生:**:指導教師:20**年**月**日目錄摘要31總體設計31.1需求分析31.2功能流程圖31.3功能模塊圖32詳細設計32.1數(shù)據(jù)構造32.2函數(shù)功能設計33調(diào)試分析33.1程序測試33.2程序缺陷34總結與體會3參考文獻3附錄3摘要萬年歷的主要功能是通過C語言編程實現(xiàn)查詢*年的日歷情況,并且可以查詢*年月的日歷情況,還可以對*年月日進展計算距今的天數(shù)和判斷是否為公歷節(jié)日,其功能和代碼滿足人性化設計和良好的編程規(guī)要求。關鍵詞:萬年歷,C語言編程,人性化設計1總體設計1.1需求分析系統(tǒng)將以用戶輸入的信息進展功能的選擇,提供*年日歷的輸出、*年*月日歷的輸出和距今天數(shù)的輸出及節(jié)假日的判斷這大三功能。1.2功能流程圖本程序主要通過獲取屏幕輸入,然后進展字符串處理,選擇相應的功能執(zhí)行,最后打印輸出信息。功能流程圖如下:開場開場輸入處理輸入信息判斷年月日年月日運算,計算距今的天數(shù)年月運算,準備打印*年*月日歷年運算,準備打印*年日歷輸出完畢圖1.1功能流程圖1.3功能模塊圖提示信息提示信息打印*年日歷模塊打印*年*月日歷模塊計算距今天數(shù)和判斷節(jié)日模塊圖1.2功能模塊圖2詳細設計2.1數(shù)據(jù)構造建立日歷信息構造體,構造體成員變量包括月末、月初星期幾、屏幕信息左半邊日歷是否打印完畢。typedefstructcalendar{intmonth_end; //月末最后一天的數(shù)字intfirst_day;//月初星期幾0周日1周一intprintFinished; //打印完畢則為1,沒打印完成則為0}Calendar;建立年月日信息構造體,構造體成員變量包括年份、月份、天數(shù)。typedefstructdate{intyear;intmonth;intday;}Date;2.2函數(shù)功能設計本萬年歷系統(tǒng)主要分為三大功能,分別是打印*年日歷、打印*年*月日歷、打印距今天數(shù)和判斷是否節(jié)假日,故分別設計三個函數(shù)實現(xiàn)三大功能,如下所示。voidfirstFun(intyear,Calendarcal[]); //第一功能voidsecondFun(intyear,intmonth,Calendarcal[]); //第二功能voidthirdFun(intyear,intmonth,intday); //第三功能各程序流程圖如下:圖圖2.1程序流程圖〔一〕是否firstFun()函數(shù)開場判斷是否打印了6和12月份的日歷打印*月日歷完畢圖圖2.2程序流程圖〔二〕是否secondFun()函數(shù)開場判斷是否月末的天數(shù)打印*月*日的日歷完畢圖圖2.3程序流程圖〔三〕thirdFun()函數(shù)開場判斷是否節(jié)假日打印信息完畢計算距今天數(shù)3調(diào)試分析3.1程序測試運行程序之后,會進入主界面,如圖3.1所示。圖3.1主界面圖隨后,可分別通過輸入年、年月、年月日實現(xiàn)三個功能的輸出,具體如圖3.2~3.4所示。圖3.2打印*年日歷圖圖3.3打印*年月日歷圖圖3.4計算距今天數(shù)圖3.2程序缺陷1、該程序每次運行,只能執(zhí)行一次,不能重復選擇功能,屬于設計缺陷。2、對年份的不規(guī)輸入,可能出現(xiàn)與預期結果不一致的情況,如圖3.5所示,理論應該輸出12345年的日歷,然而只是輸出了12345年5月的日歷,屬于程序漏洞。圖3.5BUG展示圖4總結與體會這個課程設計的難度在于打印輸出日歷,在設計過程中遇到問題,可以說是困難重重,因為畢竟是第一次做的,難免會遇到各種各樣的問題,同時在設計過程中我也發(fā)現(xiàn)了自己的缺乏之處,對以前所學過的知識理解的不夠深刻,掌握的不夠結實。通過這次課程設計之后,我覺得以前學過的知識要重新溫習才能夠到達查漏補缺的效果。我會在今后的日子里,努力學好程序設計,成為一名出色的工程師。最后,這次的課程設計終于得以圓滿完成。其中,我在設計中也遇到了許許多多的問題,但在教師的指導和同學們的幫助下得到了解決,總的來說還不是這個程序還不是很完善,但我不會放棄繼續(xù)完善這份程序,我會在課余時間里繼續(xù)修改完善這份程序。在此,感所有幫助過我的同學和指導教師。參考文獻[1]譚浩強著.C程序設計〔第四版〕.:清華大學,2010[2]林銳著.高質(zhì)量C編程指南.:電子工業(yè),2001[3]StephenA.Maguire.編程精粹:編寫高質(zhì)量C語言代碼.人民郵電,2009附錄用戶使用手冊1、根據(jù)屏幕提示,輸入即可。2、輸入年份,例如2018年,則會打印2018年的日歷。3、輸入年月,例如201810〔也可以嘗試其他的分隔符,例如2018,10〕,則會打印2018年10的日歷。4、輸入年月日,例如2018101〔同上〕,則會輸出距今的天數(shù)和輸出具體的節(jié)假日。程序源代碼*include<stdio.h>*include<stdlib.h>*include<time.h>*include<string.h>*defineisPrime(year)((year%4==0&&year%100!=0)||(year%400==0)) //宏函數(shù),判斷是否為閏年*defineTWELVEMONTH12 //數(shù)組大小*pragmawarning(disable:4996) //消除VisualStdio編譯環(huán)境的平安警告,其他編譯環(huán)境可刪除////構造體定義區(qū)//typedefstructcalendar{intmonth_end; //月末最后一天的數(shù)字intfirst_day;//月初星期幾0周日1周一intprintFinished; //打印完畢則為1,沒打印完成則為0}Calendar;typedefstructdate{intyear;intmonth;intday;}Date;////函數(shù)聲明區(qū)//voidjudgmentLeapYear(intyear,Calendar*cal); //判斷閏年intcalculateWeeks(inty,intm,intd); //計算該年月日是周幾voidfirstFun(intyear,Calendarcal[]); //第一功能voidsecondFun(intyear,intmonth,Calendarcal[]); //第二功能voidthirdFun(intyear,intmonth,intday); //第三功能intdateDiff(structdatemindate,structdatema*date); //計算日期之間的間隔天數(shù)intmain(void){Calendarcal[TWELVEMONTH]={ {31}, //1月 {28}, //2月 {31}, //3月 {30}, //4月 {31}, //5月 {30}, //6月 {31}, //7月 {31}, //8月 {30}, //9月 {31}, //10月 {30}, //11月 {31} //12月 }; //初始化月份intyear=2000,month=0,day=0;intfun=0;charcalendar[30]={'\0'}; //用來處理輸入printf("Pleaseinputtheyourwhosecalendaryouwanttoknow:"); fgets(calendar,30,stdin); year=atoi(calendar); //得到年份if(calendar[4]!='\0') month=atoi(calendar+4); //得到月份if(strlen(calendar)>=8) day=atoi(calendar+strlen(calendar)-2);if(0!=year&&0==month&&0==day) fun=1;elsefun=0==day"2:3; judgmentLeapYear(year,&cal[1]); //調(diào)整閏年平年2月的天數(shù)inti=0;for(i=0;i<TWELVEMONTH;i++) cal[i].first_day=calculateWeeks(year,i+1,1);switch(fun){case1:firstFun(year,cal);break;case2:secondFun(year,month,cal);break;case3:thirdFun(year,month,day);break; }return0;}voidjudgmentLeapYear(intyear,Calendar*cal){if(((year%4==0)&&(year%100!=0))||(year%400==0))cal->month_end=29;elsecal->month_end=28;}intcalculateWeeks(intyear,intmonth,intday){intc,w,y; y=year%100;//年如2015即年是15年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;//確保余數(shù)為正w%=7;returnw;}voidfirstFun(intyear,Calendarcal[]){ printf("|===================TheCalendarofYear%d====================|\n",year);intmonth=1;for(month=1;month<=TWELVEMONTH/2;month++){ printf("|%dSUNMONTUEWEDTHUFRISAT%2dSUNMONTUEWEDTHUFRISAT|\n",month,month+6);intright=1,left=1;inti=0;for(right=1,left=1;1;left++){if(1==left){ //左邊首日打印printf("|");for(i=0;i<calculateWeeks(year,month,left);i++) printf("");; printf("%4d",left);if(6==calculateWeeks(year,month,left)){ //既是首日也是周六printf(""); } }elseif(left==cal[month-1].month_end){ //左邊月末打印printf("%4d",left);for(i=0;i<6-calculateWeeks(year,month,left);i++) printf(""); printf("");cal[month-1].printFinished=1; //月末,則表示左邊日歷打印完畢 }elseif(6==calculateWeeks(year,month,left)&&left<=cal[month-1].month_end){ //左邊日歷的周六,則開場打印右邊的日歷printf("%4d",left);for(i=0;i<6-calculateWeeks(year,month,left);i++) printf(""); printf(""); }elseif(1==cal[month-1].printFinished){ //左邊打印完畢則補齊空格for(i=0;i<8;i++) printf(""); printf(""); }elseprintf("%4d",left);if(6==calculateWeeks(year,month,left)&&left<=cal[month-1].month_end||cal[month-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|"); right++;break; } }elseif(right==cal[month-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; }elseif(6==calculateWeeks(year,month+6,right)&&right<=cal[month-1+6].month_end){ //右邊日歷的周六,則開場打印左邊的日歷printf("%4d|\n|",right); right++;break; }elseif(cal[month-1+6].printFinished){ //右邊打印完畢則補齊空格for(i=0;i<7;i++) printf(""); printf("|\n|"); right++;break; }elseprintf("%4d",right); } }if(cal[month-1].printFinished&&cal[month-1+6].printFinished){ putchar('\r'); // 將光標跳到本行的開頭,消除多余的打印字符break; } } } putchar('|');inti=0;for(i=0;i<65;i++) putchar('='); putchar('|'); putchar('\n');}voidsecondFun(intyear,intmonth,Calendarcal[]){ printf("|======TheYear%dMonth%d=====|\n",year,month); printf("|%dSUNMONTUEWEDTHUFRISAT|\n",month);inti=1,j=1;for(i=1;i<=cal[month-1].month_end;i++){if(1==i){ //首日打印printf("|");for(j=0;j<calculateWeeks(year,month,i);j++) printf(""); printf("%4d",i);if(6==calculateWeeks(year,month,i)){ //既是首日也是周六printf("|\n|"); } }elseif(6==calculateWeeks(year,month,i)){ //周六換行printf("%4d|\n|",i); }elseif(i==cal[month-1].month_end){ //月末printf("%4d",i);for(j=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');}voidthirdFun(intyear,intmonth,intday){time_tt;structtm*timeinfo;Dated1={year,month,day};Dated2;charch[20]={'\0'}; //用于存儲周幾charfestival[20]={'\0'}; //用于存儲節(jié)日intiDayNum=0; time(&t); //獲取今天的日期timeinfo=localtime(&t); d2.year=timeinfo->tm_year+1900; d2.month=timeinfo->tm_mon+1; d2.day=timeinfo->tm_mday; iDayNum=(dateDiff(d1,d2));switch(calculateWeeks(d1.year,d1.month,d1.day)) {case0:strcpy(ch,"Sunday");break;case1:strcpy(ch,"Monday");break;case2:strcpy(ch,"Tuesday");break;case3:strcpy(ch,"Wednesday");break;case4:strcpy(ch,"Thursday");break;case5:strcpy(ch,"Friday");break;case6:strcpy(ch,"Saturday");break; }if(1==d1.month&&1==d1.day) strcpy(festival,"Newyear'sDay"); //元旦elseif(3==d1.month&&8==d1.day) strcpy(festival,"InternationalWomen'sDay"); //國際婦女節(jié)elseif(3==d1.month&&12==d1.day) strcpy(festival,"ArborDay"); //植物節(jié)elseif(4==d1.month&&5==d1.day) strcpy(festival,"QingmingFestival"); //清明節(jié)elseif(5==d1.month&&1==d1.day) strcpy(festival,"LaborDay"); //勞動節(jié)elseif(5==d1.month&&4==d1.day) strcpy(festival,"YouthDay"); //青年節(jié)elseif(6==d1.month&&1==d1.day) strcpy(festival,"Children'sDay"); //兒童節(jié)elseif(7==d1.month&&1==d1.day) strcpy(festival,"PartyBuilding"); //建黨節(jié)elseif(8==d1.month&&1==d1.day) strcpy(festival,"ArmyDay"); //建軍節(jié)elseif(9==d1.month&&3==d1.day) strcpy(festival,"AntiJapaneseWarVictoryDay"); //抗日戰(zhàn)爭勝利紀念日elseif(9==d1.month&&10==d1.day) strcpy(festival,"Teachersday"); //教師節(jié)elseif(10==d1.month&&1==d1.day) strcpy(festival,"NationalDay"); //國慶節(jié)elsestrcpy(festival,"NoFestival"); //非節(jié)日printf("Theoutputis%ddaysawaytoday,%s,%s.\n\n",iDayNum,ch,festival);}intdateDiff(structdatemindate,structdatema*date){intdays=0,j,flag;constintprimeMonth[][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,3

溫馨提示

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

評論

0/150

提交評論