萬年歷課程設(shè)計_第1頁
萬年歷課程設(shè)計_第2頁
萬年歷課程設(shè)計_第3頁
萬年歷課程設(shè)計_第4頁
萬年歷課程設(shè)計_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計設(shè)計說明書萬年歷的實現(xiàn)學(xué)生姓名袁春艷學(xué)號1018014081班級計本103班成績指導(dǎo)教師曹記東數(shù)學(xué)與計算機科學(xué)學(xué)院2012 年 9 月 8 日數(shù)據(jù)結(jié)構(gòu)課程設(shè)計評閱書題 目萬年歷的實現(xiàn)學(xué)生姓名袁春艷學(xué)號1018014081成績: 教師簽名: 年 月 日成績: 教師簽名: 年 月 日總成績: 室主任簽名:年月日注:指導(dǎo)教師成績60%,答辯成績40%,總成績合成后按五級制記入。課程設(shè)計任務(wù)書20122013學(xué)年第1學(xué)期專業(yè): 計算機科學(xué)與技術(shù) 學(xué)號: 1018014081 姓名: 袁春艷 課程設(shè)計名稱: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 設(shè)計題目: 萬年歷的實現(xiàn) 完成期限:自 2012 年 8 月

2、27 日至 2012 年 9 月 8 日共 2 周設(shè)計依據(jù)、要求及主要內(nèi)容(可另加附頁):運用C/ C+結(jié)構(gòu)體、函數(shù)、數(shù)據(jù)結(jié)構(gòu)等基知識,按以下要求編程實現(xiàn)萬年歷的功能:1) 闡述設(shè)計思想,畫出流程圖;2) 輸入任一年,判斷該年是否為閏年; 輸入年月日計算該日為當(dāng)年的那一天;3)輸入任一年,顯示該年的日歷,日歷包括陽歷、農(nóng)歷、節(jié)氣;4). 說明測試方法,寫出完整的運行結(jié)果,較好的界面設(shè)計.設(shè)計要求:1)問題分析和任務(wù)定義:根據(jù)設(shè)計題目的要求,充分地分析和理解問題,明確問題要求做什么?(而不是怎么做?)限制條件是什么?確定問題的輸入數(shù)據(jù)集合。2)邏輯設(shè)計:對問題描述中涉及的操作對象定義相應(yīng)的數(shù)據(jù)類

3、型,并按照以數(shù)據(jù)結(jié)構(gòu)為中心的原則劃分模塊,定義主程序模塊和各抽象數(shù)據(jù)類型。邏輯設(shè)計的結(jié)果應(yīng)寫出每個抽象數(shù)據(jù)類型的定義(包括數(shù)據(jù)結(jié)構(gòu)的描述和每個基本操作的功能說明),各個主要模塊的算法,并畫出模塊之間的調(diào)用關(guān)系圖;3)詳細(xì)設(shè)計:定義相應(yīng)的存儲結(jié)構(gòu)并寫出各函數(shù)的偽碼算法。在這個過程中,要綜合考慮系統(tǒng)功能,使得系統(tǒng)結(jié)構(gòu)清晰、合理、簡單和易于調(diào)試,抽象數(shù)據(jù)類型的實現(xiàn)盡可能做到數(shù)據(jù)封裝,基本操作的規(guī)格說明盡可能明確具體。詳細(xì)設(shè)計的結(jié)果是對數(shù)據(jù)結(jié)構(gòu)和基本操作做出進(jìn)一步的求精,寫出數(shù)據(jù)存儲結(jié)構(gòu)的類型定義,寫出函數(shù)形式的算法框架;4)程序編碼:把詳細(xì)設(shè)計的結(jié)果進(jìn)一步求精為程序設(shè)計語言程序。同時加入一些注解和斷

4、言,使程序中邏輯概念清楚;5)程序調(diào)試與測試:采用自底向上,分模塊進(jìn)行,即先調(diào)試低層函數(shù)。能夠熟練掌握調(diào)試工具的各種功能,設(shè)計測試數(shù)據(jù)確定疑點,通過修改程序來證實它或繞過它。調(diào)試正確后,認(rèn)真整理源程序及其注釋,形成格式和風(fēng)格良好的源程序清單和結(jié)果;6)結(jié)果分析:程序運行結(jié)果包括正確的輸入及其輸出結(jié)果和含有錯誤的輸入及其輸出結(jié)果。算法的時間、空間復(fù)雜性分析;7)編寫課程設(shè)計報告;以上要求中前三個階段的任務(wù)完成后,先將設(shè)計說明書的草稿交指導(dǎo)老師面審,審查合格后方可進(jìn)入后續(xù)階段的工作。設(shè)計工作結(jié)束后,經(jīng)指導(dǎo)老師驗收合格后將設(shè)計說明書打印裝訂,并進(jìn)行答辯。指導(dǎo)教師(簽字): 教研室主任(簽字):批準(zhǔn)日

5、期: 2012年 8 月 27 日摘 要設(shè)計了一個萬年歷軟件,該萬年歷具有如下的三大功能:輸入任一年,判斷該年是否為閏年;輸入任一年,顯示該年的日歷;輸入年月日計算該日為當(dāng)年的那一天,及該日為星期幾。本萬年歷采用Visual C+6.0工具作為軟件開發(fā)環(huán)境,運用了C語言、函數(shù)、數(shù)據(jù)結(jié)構(gòu)等基礎(chǔ)知識,該萬年操作簡單,界面清晰,易為用戶所接受。關(guān)鍵詞:萬年歷;閏年;平年;查詢目 錄1 課題描述12 需求分析23 概要設(shè)計34 詳細(xì)設(shè)計65 程序編碼86 程序調(diào)試與測試147 結(jié)果分析178 總結(jié)19參考文獻(xiàn)201 課題描述 運用C語言及數(shù)據(jù)結(jié)構(gòu)等的基礎(chǔ)知識,按以下要求編程實現(xiàn)萬年歷的功能:1)輸入任

6、一年,判斷該年是否為閏年; 2)輸入任一年,顯示該年的日歷; 3)輸入年月日計算該日為當(dāng)年的那一天;4)判斷輸入的合法性;5)說明測試方法,,寫出完整的運行結(jié)果,較好的界面設(shè)計。2 需求分析要求1):閏年的判斷。首先應(yīng)該判斷輸入年份是否合法,如果輸入年份合法,則利用閏年的判斷規(guī)則判斷該年是否為閏年。閏年的判斷規(guī)則是如果輸入的年份能被4整除且不能夠被100整除,則該年肯定是閏年。在既能被4,也能被100整除的年份中,還能被400整除的也是閏年,否則是平年。要求2):輸出某年的年歷。輸出時首先應(yīng)判斷該年是否為閏年,閏年二月29天,平年二月28天,還應(yīng)注意該年每月的天數(shù)。難點在于星期的判斷。計算方法

7、為平年一年有365天,閏年一年為366天,從公元元年開始算起至該年的某月某日,總天數(shù)累加和除7取余及為星期幾。(注余數(shù)為0時,代表星期天)要求3):判斷輸入是否合法??梢韵扰袛噍斎氲哪攴菔欠裥∮?,再次判斷月份是否有小于零或超出12,如果通過此判斷合法,再判斷天數(shù),各月的天數(shù)不能小于零或超過其應(yīng)有的天數(shù)。( 例如果該年是閏年,二月份不能超過29天,如果是該年平年,二月份不能超過28天;無論平年閏年,6月份的天數(shù)都不能超過30天) 在查詢過程中,如果發(fā)現(xiàn)輸入不合法或者不滿足輸入要求,則要求重新輸入。3 概要設(shè)計 首先建立幾個具有以下功能的子函數(shù):閏年的判斷、計算總天數(shù)、計算星期、打印年歷、計算需

8、要查詢的日期是當(dāng)年第幾天及星期幾。 程序劃分為三個功能模塊:閏年的判斷、打印年歷、日期的查詢,如圖3.1所示:閏年的判斷打印年歷日期查詢?nèi)f年歷查詢系統(tǒng)圖3.1 功能模塊圖主函數(shù)與建立的子函數(shù)及各子函數(shù)之間的調(diào)用關(guān)系,如圖3.2所示:主函數(shù)日期查詢函數(shù)打印年歷函數(shù)閏年判斷函數(shù)菜單函數(shù)計算星期函數(shù)修改日期計算總天數(shù)函數(shù)閏年判斷函數(shù)圖3.2 模塊調(diào)用關(guān)系圖1) 、求閏年流程圖如圖3.3所示:開始 4整除?100整除?400整除?“1”“0”是否否是是否結(jié)束圖3.3判斷閏年流程圖開始 2)、打印年歷流程圖如圖3.4所示:輸入年份 年份判斷 否是輸出年歷結(jié)束圖3.4打印年歷關(guān)系圖3)、 整體程序主要流程

9、圖如圖3.5所示:while循環(huán)查詢某年是否為閏年輸出某一年的年歷查詢某一天為星期幾,及其為該年的第幾天 是否為0結(jié)束是否開始圖3.5 整個程序流程圖4 詳細(xì)設(shè)計建立兩個整型數(shù)組leapDay12與noleapDay12分別存儲閏年與平年的每月天數(shù);int checkLeapyear(int Year)判斷閏年的函數(shù) 其核心語句為:if(Year%4=0&&Year%100!=0|Year%400 = 0)return true;elsereturn false;int calcuDays(int year,int month,int day) 計算總天數(shù)函數(shù)其核心語句為:fo

10、r(i=1;i<year;i+ ) if(checkLeapyear(i) days+= 366; /閏年加366天 else days+= 365; /平年加365天for(j=1;j<month;j+ ) if(checkLeapyear(year)mon=mon+leapDayj-1;elsemon = mon+noleapDayj-1;days=days+mon+day; int calcuWeek(int totalDays) / 計算星期函數(shù)其核心語句為:weeknumber=totalDays%7;void outputyear(int nowYear ) / 打印年

11、歷函數(shù)其核心語句為:for(i=0;i<12;i+)days=calcuDays(nowYear,i+1,1); weeknumber=calcuWeek(days); /計算該年一月一日為星期幾 if (checkLeapyear(nowYear) monthDay = leapDayi; /如果該年為閏年,采用閏年每月天數(shù)elsemonthDay = noleapDayi; /如果該年為平年,采用平年每月天數(shù) printf( "-%4d年%02d月-n",nowYear,i+1 );printf( "%-5s%-5s%-5s%-5s%-5s%-5s%-5

12、sn","天","一","二","三","四","五","六" );for(j=1;j<=monthDay;j+)if(j=1) /如果天數(shù)為當(dāng)月的一號,將其移動到它的星期下并打印for(k=0;k<weeknumber;k+) printf("%-5s"," ");printf("%-5d",j);if(weeknumber%7=6 ) /如果星期數(shù)為星期六,換行print

13、f("n");weeknumber=calcuWeek(days+j); /求下一天的星期數(shù)printf("n");void outputmenu() / 打印系統(tǒng)菜單函數(shù)int checkhefa(int year,int month,int day ) / 輸入合法性檢查函數(shù),比較簡單int calcuday(int year,int month,int day) /計算某年某月某日為該年的第幾天void Outputday(int nowYear,int nowMonth,int nowDay) /打印某年某日星期幾及其該年的第幾天函數(shù)void m

14、ain() /主函數(shù)調(diào)用其它函數(shù)5 程序編碼#include <stdio.h>#include <stdlib.h>#define true 1#define false 0int leapDay12=31,29,31,30,31,30,31,31,30,31,30,31; /存儲閏年每月天數(shù)int noleapDay12=31,28,31,30,31,30,31,31,30,31,30,31; /存儲非閏年每月天數(shù)int checkLeapyear(int Year) / 判斷是否閏年if(Year%4=0&&Year%100!=0|Year%400

15、 = 0)return true;elsereturn false;int calcuDays(int year,int month,int day)/ 計算總天數(shù)int i,j;int days=0,mon=0;for(i=1;i<year;i+ ) if(checkLeapyear(i) days+= 366; /閏年加366天 else days+= 365; /平年加365天for(j=1;j<month;j+ ) if(checkLeapyear(year)mon=mon+leapDayj-1;elsemon = mon+noleapDayj-1;days=days+mo

16、n+day; /總天數(shù)return days;int calcuWeek(int totalDays) / 計算星期幾int weeknumber;weeknumber=totalDays%7; /天數(shù)除7取余為星期 return weeknumber;void outputyear(int nowYear ) / 打印年歷int i,monthDay,days,weeknumber,j,k;for(i=0;i<12;i+)days=calcuDays(nowYear,i+1,1); weeknumber=calcuWeek(days); /計算該年一月一日為星期幾 if (checkL

17、eapyear(nowYear) monthDay = leapDayi; /如果該年為閏年,采用閏年每月天數(shù)elsemonthDay = noleapDayi; /如果該年為平年,采用平年每月天數(shù) printf( "-%4d年%02d月-n",nowYear,i+1 );printf( "%-5s%-5s%-5s%-5s%-5s%-5s%-5sn","天","一","二","三","四","五","六" );for

18、(j=1;j<=monthDay;j+)if(j=1) /如果天數(shù)為當(dāng)月的一號,將其移動到它的星期下并打印for(k=0;k<weeknumber;k+) printf("%-5s"," ");printf("%-5d",j);if(weeknumber%7=6 ) /如果星期數(shù)為星期六,換行printf("n");weeknumber=calcuWeek(days+j); /求下一天的星期數(shù)printf("n");void outputmenu() / 打印系統(tǒng)菜單 printf(

19、"t萬年歷查詢系統(tǒng)n"); printf("n*"); printf("n0.退出"); printf("n1.查詢某年是否是閏年"); printf("n2.打印某年的年歷"); printf("n3.查詢某年某月某日為該年的那一天及星期幾"); printf("n*n"); printf("n請選擇:");int checkhefa(int year,int month,int day ) / 輸入合法性檢查if(year<=

20、0) /如果輸入年份小于零,輸入的年份不合法 printf("輸入年份不合法!n"); return false; if(month<=0|month>12) /如果輸入月份小于零或大于12,輸入的月份不合法 printf("輸入月份不合法!n"); return false; if(day<=0|(day>leapDaymonth-1&&checkLeapyear(year) /如果該年為閏年,輸入的天數(shù)小于零或大于該年該月所應(yīng)有的天數(shù),輸入的天數(shù)不合法printf("輸入天數(shù)不合法!n");

21、return false;if(day<=0|(day>noleapDaymonth-1&&!checkLeapyear(year)/如果該年為平年,輸入的天數(shù)小于零或大于該年該月所應(yīng)有的天數(shù),輸入的天數(shù)不合法printf("輸入天數(shù)不合法!n");return false;return true;int calcuday(int year,int month,int day) /計算某年某月某日為該年的第幾天int i,totalday=0,mon=0; /mon為月份累積的天數(shù)for(i=1;i<month;i+ ) if(checkL

22、eapyear(year)mon=mon+leapDayi-1; /如果該年為閏年,月份累積的天數(shù)為其上幾個月的天數(shù)和elsemon=mon+noleapDayi-1; /如果該年為平年,月份累積的天數(shù)為其上幾個月的天數(shù)和totalday=mon+day;return totalday;void Outputday(int nowYear,int nowMonth,int nowDay) /打印某年某日星期幾int totalday,weekNo,days;totalday=calcuday(nowYear,nowMonth,nowDay); /計算某年某月某日為該年的第幾天days=calc

23、uDays(nowYear,nowMonth,nowDay); / 計算總天數(shù)weekNo=calcuWeek(days); / 計算星期幾switch (weekNo)case 0:printf("%-4d年%-2d月%-2d日是星期天,并且是這一年的第%-2d天!",nowYear,nowMonth,nowDay,totalday);break;case 1:printf("%-4d年%-2d月%-2d日是星期一,并且是這一年的第%-2d天!",nowYear,nowMonth,nowDay,totalday);break;case 2:printf

24、("%-4d年%-2d月%-2d日是星期二,并且是這一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 3:printf("%-4d年%-2d月%-2d日是星期三,并且是這一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 4:printf("%-4d年%-2d月%-2d日是星期四,并且是這一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 5:

25、printf("%-4d年%-2d月%-2d日是星期五,并且是這一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;case 6:printf( "%-4d年%-2d月%-2d日是星期六,并且是這一年的第%-2d天!n",nowYear,nowMonth,nowDay,totalday);break;printf("nn");void main() /主函數(shù)int year,a,month,day;while(1)outputmenu(); /調(diào)用菜單函數(shù) scanf("

26、%d",&a);while(a<0|a>3)printf("選擇有誤!請重新選擇:");scanf("%d",&a);if(a=0) /如果a=0,則退出 printf("退出系統(tǒng),謝謝使用!nn");break;if(a=1) /如果a=1,則輸入年份判斷是否為閏年printf("請輸入需要查詢的年份:");scanf("%d",&year);while(year<=0) /檢驗?zāi)攴莸暮戏ㄐ詐rintf("輸入的年份有誤!請重新輸入

27、:");scanf("%d",&year);if(checkLeapyear(year)printf("%-4d年是閏年!nn",year);elseprintf("%-4d年是平年!nn",year);if(a=2) /如果a=2,則輸入年份并打印該年年歷printf("請輸入需要查詢的年份:");scanf("%d",&year);while(year<=0) printf("輸入的年份有誤!請重新輸入:");scanf("%d&

28、quot;,&year);outputyear(year); /調(diào)用Outputyear函數(shù)if(a=3) /如果a=3,則輸入年月日判斷改日為該年的第幾天及星期數(shù)printf("請輸入年月日(格式為YYYY-MM-DD):");scanf("%d-%d-%d",&year,&month,&day);while(!checkhefa(year,month,day) /檢驗?zāi)暝氯盏暮戏ㄐ裕绻缓戏?,就重新輸入printf("輸入錯誤!請重新輸入年月日(格式為YYYY-MM-DD):n");scanf(&

29、quot;%d-%d-%d",&year,&month,&day);Outputday(year,month,day); /調(diào)用Outputday函數(shù)6 程序調(diào)試與測試1)進(jìn)入程序后顯示主界面,如圖6.1。圖6.1程序菜單界面顯示圖2) 理論結(jié)果:-2小于0,不合法,應(yīng)重新輸入,2012能被4整除,且不能被100整除,應(yīng)為閏年。運行結(jié)果:進(jìn)入主菜單后,按數(shù)字1,輸入年份,判斷年份的合法性。如果年份不合法,則重新輸入,如果年份合法,顯示該年是閏年還是平年,如圖6.2。圖6.2閏年判斷運行結(jié)果圖3) 理論結(jié)果:-4小于0,不合法,應(yīng)重新輸入,2014年是平年,二月應(yīng)有28天,并且翻閱日歷,2014年一月一日為星期三。運行結(jié)果:在主菜單界面選擇數(shù)字2,輸入年份,判斷年份的合法性。如果輸入年份不合法,則重新輸入,如果輸入年份合法,則打印該年的年歷,如圖6.3。圖6.3 打印年歷結(jié)果圖4)理論結(jié)果:2012年二月沒有30天,理應(yīng)重新輸入,2012年9月5日查閱日歷,其為星期三,并且經(jīng)計算,它為該年的第249天。運行結(jié)果:在主菜單界面選擇數(shù)字3,輸入年月日,判斷輸入的合法性。年月日中不能有小于等于零的,月份中不能有大于12的,無論平年閏年,每月的天數(shù)都不能大于該月應(yīng)有的天數(shù),如果輸入不合法,則重新輸入,如果輸入合法,則顯示該年該月該日為星期幾,及該

溫馨提示

  • 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

提交評論