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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

11、歷函數(shù)其核心語(yǔ)句為:for(i=0;i<12;i+)days=calcuDays(nowYear,i+1,1); weeknumber=calcuWeek(days); /計(jì)算該年一月一日為星期幾 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)月的一號(hào),將其移動(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ù),比較簡(jiǎn)單int calcuday(int year,int month,int day) /計(jì)算某年某月某日為該年的第幾天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; /存儲(chǔ)閏年每月天數(shù)int noleapDay12=31,28,31,30,31,30,31,31,30,31,30,31; /存儲(chǔ)非閏年每月天數(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)/ 計(jì)算總天數(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) / 計(jì)算星期幾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); /計(jì)算該年一月一日為星期幾 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)月的一號(hào),將其移動(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萬(wàn)年歷查詢系統(tǒng)n"); printf("n*"); printf("n0.退出"); printf("n1.查詢某年是否是閏年"); printf("n2.打印某年的年歷"); printf("n3.查詢某年某月某日為該年的那一天及星期幾"); printf("n*n"); printf("n請(qǐng)選擇:");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) /計(jì)算某年某月某日為該年的第幾天int i,totalday=0,mon=0; /mon為月份累積的天數(shù)for(i=1;i<month;i+ ) if(checkL

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

23、uDays(nowYear,nowMonth,nowDay); / 計(jì)算總天數(shù)weekNo=calcuWeek(days); / 計(jì)算星期幾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("選擇有誤!請(qǐng)重新選擇:");scanf("%d",&a);if(a=0) /如果a=0,則退出 printf("退出系統(tǒng),謝謝使用!nn");break;if(a=1) /如果a=1,則輸入年份判斷是否為閏年printf("請(qǐng)輸入需要查詢的年份:");scanf("%d",&year);while(year<=0) /檢驗(yàn)?zāi)攴莸暮戏ㄐ詐rintf("輸入的年份有誤!請(qǐng)重新輸入

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論