版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> C 語 言</b></p><p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 2011年 6月 15 日</p><p> 設(shè)計(jì)題目:萬年歷</p><p> 學(xué)生姓名:</p><p> 學(xué)生學(xué)號:</p><p> 專業(yè)班級:
2、數(shù)學(xué)與應(yīng)用數(shù)學(xué)一班</p><p> 學(xué)院名稱:數(shù)學(xué)與計(jì)量經(jīng)濟(jì)學(xué)院</p><p> 同組人姓名:</p><p> 指導(dǎo)老師:</p><p><b> 1 需求分析</b></p><p><b> 問題描述</b></p><p> 我們需
3、要實(shí)現(xiàn)萬年歷的功能,那么如何實(shí)現(xiàn)這個(gè)功能呢?我們都很清楚,普通年份和閏年是有區(qū)別的,那么該怎么區(qū)分這種一天的差別對于萬年歷日期現(xiàn)實(shí)的影響呢?而且已知一個(gè)日期,那么我們怎么能夠知道它是星期幾?是不是需要一個(gè)參照物來比較呢?而且還有很多關(guān)于萬年歷的美化問題,占位符的考慮等等。另外我們還必須判斷輸入的萬年歷是否合法,這也需要一個(gè)子函數(shù)來實(shí)現(xiàn)。好吧,至于基礎(chǔ)的判斷閏年也是不在話下了。</p><p><b>
4、 輸入數(shù)據(jù)要求</b></p><p> 我們要考慮三種情況,這三種情況下是不能夠?qū)崿F(xiàn)這個(gè)萬年歷的功能的:</p><p> /*如果給定的日期中年份部分為非正數(shù)*/</p><p> if(date.year<=0)</p><p> printf("年份不符合要求!\n"</p>
5、<p> printf("請重新輸入 )</p><p> /*如果給定的日期中月份部分為負(fù)數(shù),為0或者大于12*/</p><p> if(date.month>12||date.month<1)</p><p> printf("月份不符合要求!\n");</p><p>
6、printf("請重新輸入");</p><p> getchar();</p><p><b> exit(0);</b></p><p> /*如果給定的日期中天數(shù)部分為非正數(shù),或者大于31*/</p><p> a[2]=28+leap(date.year);</p>&l
7、t;p> if(date.day>a[date.month]||date.day<1)</p><p> printf("日期不符合要求!\n");</p><p> printf("請重新輸入");</p><p> getchar();</p><p><b>
8、 exit(0);</b></p><p><b> 輸出數(shù)據(jù)要求</b></p><p> 根據(jù)輸入數(shù)據(jù),輸出數(shù)據(jù)必須嚴(yán)格的按照占位符進(jìn)行邏輯的策劃,然后得知一行萬年歷的日期的占位符是38個(gè)占位符,于是空格占位符和字符顯示出來的那些占位符就需要有一個(gè)限定使得其不凌亂特別應(yīng)該注意空格符的占位。</p><p><b>
9、 開發(fā)環(huán)境和工具</b></p><p> 開發(fā)環(huán)境:WINDOWS 7</p><p> 開發(fā)工具:Dev-C++ 4.9.9.2</p><p><b> 成員分工</b></p><p> 葉磊:主調(diào)模塊、萬年歷功能實(shí)現(xiàn)、數(shù)據(jù)測試、注釋編寫</p><p> 胡凡:總
10、體設(shè)計(jì)、主調(diào)模塊、備忘錄功能實(shí)現(xiàn)、注釋編寫</p><p><b> 2 總體設(shè)計(jì)</b></p><p><b> 2.1總體設(shè)計(jì)思路</b></p><p><b> 設(shè)計(jì)思路</b></p><p> 考慮到日期與備忘的一一對應(yīng),采用結(jié)構(gòu)體來解決該題成為一個(gè)可行的
11、思路。首先,定義結(jié)構(gòu)體類型,使得年月日與備忘直接綁定在一起。通過程序中這一臨時(shí)存放數(shù)據(jù)的變量,使用文件的讀寫功能向文件中寫入文件以及讀出信息以暫時(shí)使用。</p><p> 針對日歷的輸出,首要考慮的是當(dāng)月1日的輸出位置,即需要求出該月1日是星期幾。針對這個(gè)問題,我們以2011年1月1日為基點(diǎn),求所求日期與基點(diǎn)距離的天數(shù)之差,之后根據(jù)除以7取的余數(shù)來看星期。選擇2011年1月1日為基點(diǎn),是因?yàn)槠錆M足計(jì)算的兩個(gè)條件
12、:1.該日正好為年首,使得計(jì)算相差天數(shù)的計(jì)算變得更為簡單。2.該日正好是星期六,使得相差的天數(shù)除以7所取出來的余數(shù)正好按日歷從左至右顯示(我們輸出的日歷從左往右依次為星期日、一、二、三、四、五、六)。我們考慮2011年前與后的兩種情況。2011年后所需的即為正常余數(shù),2011年前的則需要用7減去得到的余數(shù)才是所欲要的值。之后經(jīng)過一定的輸出格式即可將日歷輸出。</p><p> 針對備忘錄的編寫,考慮到定義了一個(gè)
13、結(jié)構(gòu)體使得年月日與備忘相連,因此可以將年月日與備忘一同存入文件??紤]到萬年備忘錄的龐大,為了節(jié)省時(shí)間和空間,我們想出了一個(gè)算法:在添加寫入文件時(shí),一律將數(shù)據(jù)內(nèi)容寫入文件末尾(即使用ab+追加模式);而當(dāng)讀取文件時(shí),則將文件內(nèi)的年月日與外部參數(shù)輸入的年月日相比較,不相同則位置指針下移,一直到年月日相同或者無法讀取為止。這樣編寫可以避免考慮年份的上限大小(因?yàn)槿绻x一個(gè)二維數(shù)組,雖然也可以將日期和備忘一一對應(yīng),但是這樣的話處理這個(gè)數(shù)組的上
14、限就不好操作了。如果數(shù)組開太大會(huì)直接影響運(yùn)行速度),而且在存入的備忘不太多的情況下在時(shí)間和空間上都可以節(jié)省(空間只跟存入的備忘數(shù)目有關(guān),而不是直接開很大的數(shù)組,這樣即使年份很大也不會(huì)對空間大小有什么影響)。另外,我們設(shè)計(jì)了備忘修改功能、備忘刪除(單日或全部),使得操作可以更人性化。</p><p> 最后,在自學(xué)了命令行參數(shù)之后,我們用argc和*argv[]將主函數(shù)寫出,并且用getopt函數(shù)來處理接收的參數(shù)
15、并返回命令選項(xiàng)。之后便可以通過返回的命令選項(xiàng)用switch語句選擇所需要實(shí)現(xiàn)的功能。</p><p> 以上即為我們對該課題的總體設(shè)計(jì)思路。</p><p><b> 數(shù)據(jù)存儲(chǔ)</b></p><p> 將年月日與對應(yīng)的備忘放于同一結(jié)構(gòu)體變量中,在使用文件讀寫時(shí)作為一個(gè)整體使用,也方便了添加功能、修改功能、刪除功能的實(shí)現(xiàn)。</p&g
16、t;<p><b> 2.2模塊結(jié)構(gòu)圖</b></p><p> 根據(jù)需求將系統(tǒng)劃分為四個(gè)功能模塊,函數(shù)之間的調(diào)用關(guān)系如圖2.1所示。</p><p> 圖2.1 晚年備忘錄的模塊結(jié)構(gòu)圖</p><p> 1)Main:主函數(shù)。</p><p> 2)leap:閏年判斷。</p>&
17、lt;p> 3)checkDate:檢查日期合法性</p><p> 4)show_calender:顯示當(dāng)日的日歷(未輸入日時(shí)顯示當(dāng)月1日的日歷)。</p><p> 5)memo_read:備忘的讀取。</p><p> 6)memo_written:備忘的寫入。</p><p> 7)memo_modify:備忘的修改。
18、</p><p> 8)memo_delete:備忘的刪除(當(dāng)日)。</p><p> 9)memo_delete_all:備忘的刪除(全部)。</p><p><b> 2.3模塊說明</b></p><p> (以從上至下,從左至右的順序說明)</p><p> MathPath模塊
19、</p><p> 函數(shù)原型:int main(int argc,char *argv[])</p><p> 功 能:主函數(shù)</p><p> 輸入?yún)?shù):argc——int類型,表示錄入?yún)?shù)的個(gè)數(shù)</p><p> *argv[]——char類型,各元素記錄各種錄入字符串的首地址</p><p> 輸
20、出參數(shù):0——int類型,返回給系統(tǒng)一個(gè)值,說明程序正常終止</p><p><b> leap模塊</b></p><p> 函數(shù)原型:int leap(int t_year)</p><p> 功 能:閏年判斷</p><p> 輸入?yún)?shù):t_year——int類型,表示需要判斷閏年的年份</p&
21、gt;<p> 輸出參數(shù):1——int類型,如果是閏年則返回1;</p><p> 0——int類型,如果是非閏年則返回0;</p><p> 3. checkDate模塊</p><p> 函數(shù)原型:void checkDate()</p><p> 功 能:檢查輸入年月日的合法性</p><
22、;p> 輸入?yún)?shù):year——int類型,表示年份</p><p> month——int類型,表示月份</p><p> day——int類型,表示日期</p><p><b> 輸出參數(shù):無</b></p><p> 4. show_calender模塊</p><p> 函
23、數(shù)原型:void show_calender()</p><p> 功 能:顯示日歷</p><p> 輸入?yún)?shù):date.year——int類型,表示年份</p><p> date.month——int類型,表示月份</p><p> date.day——int類型,表示日期</p><p><
24、b> 輸出參數(shù):無</b></p><p> 5. memo_read模塊</p><p> 函數(shù)原型:void memo_read()</p><p> 功 能:從文件讀取備忘</p><p> 輸入?yún)?shù):date.year——int類型,表示年份</p><p> date.mo
25、nth——int類型,表示月份</p><p> date.day——int類型,表示日期</p><p><b> 輸出參數(shù):無</b></p><p> 6. memo_written模塊</p><p> 函數(shù)原型:void memo_written ()</p><p> 功
26、 能:將備忘寫入文件</p><p> 輸入?yún)?shù):date.year——int類型,表示年份</p><p> date.month——int類型,表示月份</p><p> date.day——int類型,表示日期</p><p><b> 輸出參數(shù):無</b></p><p> 7
27、. memo_modify模塊</p><p> 函數(shù)原型:void memo_modify ()</p><p> 功 能:修改備忘</p><p> 輸入?yún)?shù):date.year——int類型,表示年份</p><p> date.month——int類型,表示月份</p><p> date.da
28、y——int類型,表示日期</p><p><b> 輸出參數(shù):無</b></p><p> 8. memo_delete模塊</p><p> 函數(shù)原型:void memo_delete ()</p><p> 功 能:刪除備忘(當(dāng)日)</p><p> 輸入?yún)?shù):date.ye
29、ar——int類型,表示年份</p><p> date.month——int類型,表示月份</p><p> date.day——int類型,表示日期</p><p><b> 輸出參數(shù):無</b></p><p> 9. memo_delete_all模塊</p><p> 函數(shù)原型
30、:void memo_delete_all ()</p><p> 功 能:刪除備忘(全部)</p><p><b> 輸入?yún)?shù):無</b></p><p><b> 輸出參數(shù):無</b></p><p><b> 3 詳細(xì)設(shè)計(jì)</b></p>&l
31、t;p> 為了實(shí)現(xiàn)輸入日期知道其為星期幾的功能,我們必須的選取一個(gè)參照日期“以2011年1月1日星期六為基點(diǎn)”那么如何知道我們想要知道的日期時(shí)星期幾呢?“計(jì)算某月第一天距離基點(diǎn)的天數(shù)除以7取余*/</p><p> ”于是有“*加上整年的天數(shù)*” “加上整月的天數(shù)”“ 計(jì)算某月第一天是星期幾”這就可以判斷出來距離我們鎖定的那天是有多少天,再利用上述的方法來進(jìn)行計(jì)算,這是/*當(dāng)某年不低于2011年*/的情
32、況,還有/*當(dāng)某年低于2011年*/的情況,其邏輯和這好似一樣的,同理。于是就判斷出了是星期幾。那么關(guān)于輸出,printf("\n\t\t Sun Mon Tue Wed Thu Fri Sat\n\t\t ");</p><p> /*輸出一定數(shù)量的空格*/這是重點(diǎn),一行有占位符38格/*當(dāng)一行已輸出38個(gè)位數(shù)的時(shí)候換行(除每行開頭的一堆空格外)*/這樣就可以看到
33、 </p><p> 這樣的輸出格式。然后判斷輸入是否合法以及判斷是否是閏年都在課本上有過交代。</p><p><b> 4 測試結(jié)果及分析</b></p><p> 為了檢驗(yàn)該程序的可行性以及正確性,我們選擇了幾組有代表的測試數(shù)據(jù),與實(shí)際結(jié)果符合得很好。測試數(shù)據(jù)如下:</p><p> 選擇了2011
34、年前的一天。我們選擇了1949年10月1日,預(yù)期結(jié)果為星期一,先查看其備忘,預(yù)期結(jié)果為“該日暫無備忘!”。之后添加備忘“中華人民共和國成立!”下面為測試時(shí)所截的圖。</p><p> 在“命令提示行”中輸入?yún)?shù)</p><p><b> 敲回車,得到結(jié)果:</b></p><p> 該日添加備忘“中華人民共和國成立!”。下為參數(shù)輸入:&l
35、t;/p><p> d.敲回車后提示輸入備忘。輸入備忘。</p><p><b> 按回車后</b></p><p> 敲回車,得到成功信息,并輸出修改后的日歷及備忘。</p><p> 還需要測試年份大于2011年的日期??紤]到這份日歷為萬年歷,于是測試兩份數(shù)據(jù):大于一萬年和小于一萬年。以下測試小于一萬年的數(shù)據(jù):2
36、012年12月24日,先添加備忘“世界末日?”再修改為“不可能是世界末日!”,最后刪除該日備忘。</p><p><b> 輸入?yún)?shù)(添加)</b></p><p><b> 添加備忘</b></p><p><b> 添加成功信息</b></p><p><b&g
37、t; 輸入?yún)?shù)(修改)</b></p><p><b> 輸入修改內(nèi)容</b></p><p><b> 修改成功</b></p><p><b> 輸入?yún)?shù)(刪除)</b></p><p><b> 確認(rèn)刪除后</b></p&
38、gt;<p> 最后測試一組大于一萬年的日期:999999年9月9日.測試功能:添加功能、全部刪除功能。</p><p><b> 輸入?yún)?shù)</b></p><p><b> 輸入備忘</b></p><p><b> 添加成功</b></p><p>
39、 輸入?yún)?shù)(刪除全部)</p><p><b> 確認(rèn)刪除后</b></p><p> 至此,數(shù)據(jù)測試完畢。所有的測試結(jié)果均與實(shí)際符合得很好,驗(yàn)證了該程序的正確性。</p><p><b> 5 總結(jié)</b></p><p><b> 1 算法與程序總結(jié)</b><
40、/p><p> 本程序定義了結(jié)構(gòu)體類型,將年月日和備忘聯(lián)系起來,在寫入和讀取的過程中均作為一個(gè)整體,并且在將寫入的內(nèi)容始終寫在文件的末尾,而不是定義一一對應(yīng)的備忘數(shù)組,節(jié)省了時(shí)間和空間。</p><p> 由于課題要求使用命令行參數(shù),所以,沒有使用菜單來實(shí)現(xiàn)功能,而是使用命令選項(xiàng)來選擇所需要執(zhí)行的功能。而由于使用了命令行參數(shù),因此該程序必須在DOS環(huán)境下運(yùn)行(命令提示行)。</p&g
41、t;<p> 萬年歷部分,采用定基點(diǎn)求相差的天數(shù)取7的余來確定當(dāng)月首日是星期幾,從而得到所需要的日歷。</p><p><b> 2 改進(jìn)方案</b></p><p><b> 我們</b></p><p><b> 附錄</b></p><p> 以下
42、為我們小組該課題的最終代碼:</p><p> /*-------------------------------我是分割線-------------------------------*/</p><p> /*命令行功能選項(xiàng)*/</p><p> /*-d:顯示當(dāng)月日歷和當(dāng)日備忘*/</p><p> /*-i:顯示當(dāng)月日歷和添加
43、當(dāng)日備忘*/ </p><p> /*-m:顯示當(dāng)月日歷和修改當(dāng)日備忘*/ </p><p> /*-g:刪除當(dāng)日備忘*/</p><p> /*-t:刪除全部備忘*/</p><p> /*-------------------------------我是分割線-------------------------------*/<
44、;/p><p><b> /*頭文件*/ </b></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include<conio.h></p><p> #include<
45、;unistd.h> /*調(diào)用getopt函數(shù)*/</p><p> /*-------------------------------我是分割線-------------------------------*/</p><p> /*定義全局變量(各月所含天數(shù))*/ </p><p> int a[]={0,31,0,31,30,31,30,31
46、,31,30,31,30,31};</p><p> /*定義全局變量(已獲取的備忘個(gè)數(shù))*/</p><p> int count_memo;</p><p> /*定義結(jié)構(gòu)體*/ </p><p> struct date_message</p><p><b> {</b><
47、/p><p> int year; /*年*/ </p><p> int month; /*月*/ </p><p> int day; /*日*/ </p><p> char memo[300]; /*備忘*/ </p><p>
48、}date={1,1,1,"\0"};</p><p> /*-------------------------------我是分割線-------------------------------*/</p><p><b> /*主函數(shù)*/ </b></p><p> int main(int argc,char *
49、argv[]) </p><p><b> {</b></p><p><b> /*函數(shù)聲明*/ </b></p><p> void checkDate(); /*檢查日期合法性*/</p><p> void show_calender();
50、 /*顯示日歷*/</p><p> void memo_written(); /*寫入備忘*/</p><p> void memo_modify(); /*修改備忘*/ </p><p> void memo_delete(); /*刪除當(dāng)日備
51、忘*/</p><p> void memo_delete_all(); /*刪除全部備忘*/</p><p> void memo_read(); /*讀取備忘*/</p><p><b> /*定義變量*/ </b></p><p> char choi
52、ce;</p><p> /*使用getopt函數(shù)分析命令行參數(shù),識別選項(xiàng)*/</p><p> while((choice=getopt(argc,argv,"d:i:m:g:t"))!=-1) </p><p> { /*選項(xiàng)*/ </p><p> switch(choice)
53、 </p><p> { /*選項(xiàng)為d時(shí),顯示當(dāng)月日歷和當(dāng)日備忘*/</p><p> case 'd':/*調(diào)用atoi函數(shù),將字符型數(shù)字轉(zhuǎn)化為整型*/ </p><p> date.year=atoi(argv[2]); </p><p>
54、 /*如果沒有輸入月份則不賦值*/ </p><p> if(atoi(argv[3])!=0)date.month=atoi(argv[3]);</p><p> /*如果沒有輸入日期則不賦值*/</p><p> if(atoi(argv[4])!=0)date.day=atoi(argv[4]); </p><p&
55、gt; /*檢查日期合法性*/ </p><p> checkDate(); </p><p> /*顯示當(dāng)日日歷*/ </p><p> show_calender(); </p><p> /*顯示備忘*/ </p><p> memo_r
56、ead(); </p><p><b> break;</b></p><p> /*選項(xiàng)為i時(shí),顯示當(dāng)月日歷和添加當(dāng)日備忘*/</p><p> case 'i':date.year=atoi(argv[2]);</p><p> date.month=at
57、oi(argv[3]);</p><p> if(atoi(argv[4])!=0)date.day=atoi(argv[4]);</p><p> checkDate();</p><p> show_calender();</p><p> memo_read();</p><p> printf(&qu
58、ot;請輸入要添加的備忘\n"); </p><p><b> /*寫入備忘*/</b></p><p> memo_written(); </p><p> /*添加之后*/ </p><p> printf("添加之后的日歷與對應(yīng)的備忘為\n")
59、; </p><p> show_calender();</p><p> memo_read();</p><p><b> break;</b></p><p> /*選項(xiàng)為m時(shí),顯示當(dāng)月日歷和修改當(dāng)日備忘*/ </p><p> case 'm
60、9;:date.year=atoi(argv[2]);</p><p> date.month=atoi(argv[3]);</p><p> if(atoi(argv[4])!=0)date.day=atoi(argv[4]);</p><p> checkDate();</p><p> show_calender();</
61、p><p> memo_read();</p><p> /*如果該日無備忘,則給出提示*/</p><p> if(count_memo==0)</p><p><b> {</b></p><p> printf("無法修改,因?yàn)樵撊諢o備忘。\n如需添加備忘,請使用備忘添加功能
62、\n"); </p><p><b> break;</b></p><p><b> }</b></p><p><b> /*修改備忘*/</b></p><p> memo_modify(); </p><p>
63、 /*修改之后*/ </p><p> printf("修改之后的日歷為\n"); </p><p> show_calender();</p><p> memo_read();</p><p><b> break;</b></p><p>
64、; /*選項(xiàng)為g時(shí),刪除當(dāng)日備忘*/</p><p> case 'g':date.year=atoi(argv[2]);</p><p> date.month=atoi(argv[3]);</p><p> if(atoi(argv[4])!=0)date.day=atoi(argv[4]);</p><p>
65、checkDate(); </p><p> show_calender();</p><p> memo_read(); </p><p> memo_delete(); </p><p> show_calender(); </p><p> memo_read(
66、); </p><p><b> break;</b></p><p> /*選項(xiàng)為t時(shí),刪除全部備忘*/</p><p> case 't':memo_delete_all(); </p><p><b> getch();</b></p><p>
67、;<b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> printf("\t\t Please any key to continue…………"); </p><p>&
68、lt;b> getch();</b></p><p> system("cls");</p><p> return 0; </p><p><b> }</b></p><p> /*-------------------------------我是分割線----
69、---------------------------*/</p><p> /*顯示當(dāng)月日歷*/</p><p> void show_calender()</p><p><b> {</b></p><p> /*函數(shù)調(diào)用聲明*/</p><p> int leap(int t_y
70、ear);</p><p><b> /*定義函數(shù)*/</b></p><p> int sum=0,count=0,i,t,temp_year,temp_month,temp_day=-1;</p><p><b> /*輸出年月日*/</b></p><p> printf("
71、\n\t\t\t\t%d年%d月",date.year,date.month);</p><p> if(date.day!=0)printf("%d日\n",date.day);</p><p> else printf("1日\n");</p><p> /*計(jì)算某月第一天是星期幾,以2011年1月1日星期
72、六為基點(diǎn),計(jì)算某月第一天距離基點(diǎn)的天數(shù)除以7取余*/</p><p> /*當(dāng)某年不低于2011年*/ </p><p> if(date.year>=2011)</p><p><b> { </b></p><p> /*加上整年的天數(shù)*/ </p><p> for(t
73、emp_year=2011;temp_year<date.year;temp_year++)</p><p> sum+=365+leap(temp_year);</p><p> a[2]=(leap(date.year)==1)?29:28;</p><p> /*加上整月的天數(shù)*/ </p><p> for(temp_m
74、onth=1;temp_month<date.month;temp_month++)</p><p> sum+=a[temp_month];</p><p> /*計(jì)算某月第一天是星期幾*/ </p><p> t=(sum%7>0)?sum%7:(sum%7+7);</p><p><b> }</b
75、></p><p> /*當(dāng)某年低于2011年*/ </p><p> if(date.year<2011)</p><p><b> {</b></p><p> /*加上整年的天數(shù)*/ </p><p> for(temp_year=2011;temp_year>d
76、ate.year+1;temp_year--)</p><p> sum+=365+leap(temp_year-1);</p><p> a[2]=(leap(date.year-1)==1)?29:28;</p><p> /*加上整月的天數(shù)*/ </p><p> for(temp_month=12;temp_month>
77、=date.month;temp_month--)</p><p> sum+=a[temp_month];</p><p> /*計(jì)算某月第一天是星期幾*/ </p><p> t=(sum%7>=0)?(7-sum%7):(-sum%7);</p><p><b> }</b></p>
78、<p> /*輸出當(dāng)月日歷*/ </p><p> printf("\n\t\t Sun Mon Tue Wed Thu Fri Sat\n\t\t ");</p><p> /*輸出一定數(shù)量的空格*/</p><p> for(i=1;i<=5*t-2;i++)</p><p
79、><b> {</b></p><p> printf(" ");</p><p> /*計(jì)數(shù)一行中已輸出多少個(gè)位數(shù)*/</p><p><b> count++;</b></p><p><b> }</b></p><
80、p> /*逐行輸出日歷中的日期部分*/</p><p> for(temp_day=1;temp_day<=a[date.month];temp_day++)</p><p><b> {</b></p><p> /*如果有輸入日期則特別標(biāo)出*/</p><p> if(temp_day==dat
81、e.day)</p><p><b> {</b></p><p> if(date.day<10)printf("\b[%d] ",date.day);</p><p> else printf("\b[%d] ",date.day);</p><p><
82、b> }</b></p><p> /*普通日期無特別表示*/</p><p> else printf("%-5d",temp_day);</p><p><b> /*計(jì)數(shù)增加*/</b></p><p><b> count+=5;</b><
83、;/p><p> /*當(dāng)一行已輸出38個(gè)位數(shù)的時(shí)候換行(除每行開頭的一堆空格外)*/</p><p> if(count==38)</p><p><b> {</b></p><p> printf("\n ");</p><p>
84、;<b> count=3;</b></p><p><b> }</b></p><p><b> }</b></p><p> printf("\n");</p><p><b> }</b></p>&l
85、t;p> /*-------------------------------我是分割線-------------------------------*/</p><p><b> /*備忘讀取*/</b></p><p> void memo_read()</p><p><b> {</b></p&g
86、t;<p> /*定義文件指針*/</p><p><b> FILE *fp;</b></p><p><b> /*定義變量*/</b></p><p><b> int i;</b></p><p> struct date_message tem
87、p={0,0,0,"\0"};</p><p> /*總是在讀取備忘之前令備忘數(shù)歸零*/</p><p> count_memo=0;</p><p><b> /*打開文件*/</b></p><p> if((fp=fopen("calender.txt","
88、ab+"))==NULL)</p><p><b> {</b></p><p> printf("\t\t\t\t打開文件失敗\t\t\t\t\n");</p><p><b> return;</b></p><p><b> }</b>
89、;</p><p> /*查找文件中是否有相同的日期*/ </p><p><b> while(1) </b></p><p><b> { </b></p><p> /*文件讀到不能讀取為止*/ </p><p> if(fread(&temp,
90、sizeof(struct date_message),1,fp)!=1)break;</p><p> /*如果文件該位置的時(shí)間與所求時(shí)間相同*/</p><p> if((temp.year==date.year)&&(temp.month==date.month)&&(temp.day==date.day))</p><p>
91、;<b> {</b></p><p> /*當(dāng)天備忘個(gè)數(shù)的計(jì)數(shù)*/</p><p> count_memo++;</p><p> for(i=0;i<300;i++) </p><p> date.memo[i]=temp.memo[i];</p><p> printf(&
92、quot;\n\t\t\t備忘%d:%s\n",count_memo,date.memo); </p><p><b> } </b></p><p><b> }</b></p><p> /*如果沒有相同日期的話*/ </p><p> if(count_memo==0)&
93、lt;/p><p> printf("\t\t\t\t該日暫無備忘\n\n");</p><p> printf("\n");</p><p> fclose(fp);</p><p><b> } </b></p><p> /*----------
94、---------------------我是分割線-------------------------------*/</p><p><b> /*備忘寫入*/</b></p><p> void memo_written()</p><p><b> {</b></p><p> /*定
95、義文件指針*/</p><p><b> FILE *fp;</b></p><p><b> /*打開文件*/</b></p><p> if((fp=fopen("calender.txt","ab+"))==NULL)</p><p><b&
96、gt; {</b></p><p> printf("\n\t\t\t\t 打開文件失敗\n\n\t\t\t ");</p><p><b> return;</b></p><p><b> }</b></p><p><b> /*輸入備忘*
97、/</b></p><p> scanf("%s",date.memo);</p><p><b> /*寫入備忘*/</b></p><p> if(fwrite(&date,sizeof(struct date_message),1,fp)==1)</p><p><
98、;b> {</b></p><p> system("cls"); </p><p> printf("\n\t\t\t\t 備忘存入成功\n\n\t\t\t ");</p><p><b> }</b></p><p><b> else
99、</b></p><p><b> {</b></p><p> system("cls"); </p><p> printf("\n\t\t\t\t 備忘存入失敗\n\n\t\t\t ");</p><p><b> }</b><
100、;/p><p> fclose(fp);</p><p><b> } </b></p><p> /*-------------------------------我是分割線-------------------------------*/</p><p><b> /*備忘修改*/</b>&
101、lt;/p><p> void memo_modify()</p><p><b> {</b></p><p> /*定義文件指針*/</p><p><b> FILE *fp;</b></p><p><b> /*定義變量*/</b><
102、;/p><p> int i=0,t,count=0;</p><p> struct date_message temp;</p><p><b> /*打開文件*/</b></p><p> if((fp=fopen("calender.txt","rb+"))==NULL
103、)</p><p><b> {</b></p><p> printf("\n\n\n\n\n\n\n\n\n\t\t\t 打開文件失敗\n\n");</p><p><b> return;</b></p><p><b> }</b>&
104、lt;/p><p> printf("請輸入要修改第幾條備忘\n"); </p><p> /*輸入需要修改第幾條備忘*/</p><p> scanf("%d",&t);</p><p> if(!(t>0&&t<=count_memo))</p>
105、<p><b> {</b></p><p> printf("輸入錯(cuò)誤!該次操作失敗\n!");</p><p><b> getch();</b></p><p> system("cls");</p><p><b> e
106、xit(0);</b></p><p><b> }</b></p><p> printf("請輸入要修改的內(nèi)容\n"); </p><p><b> /*輸入備忘*/</b></p><p> scanf("%s",&date.
107、memo);</p><p> /*在文件中尋找該日期*/</p><p><b> while(1)</b></p><p><b> { </b></p><p> /*移動(dòng)指針位置*/</p><p> fseek(fp,i*sizeof(struct
108、date_message),0);</p><p> /*到文件無法讀取時(shí)退出*/</p><p> if(fread(&temp,sizeof(struct date_message),1,fp)!=1)break;</p><p> /*如果文件中的時(shí)間與所求時(shí)間相同*/</p><p> if((temp.year==d
109、ate.year)&&(temp.month==date.month)&&(temp.day==date.day))</p><p><b> {</b></p><p> /*備忘計(jì)數(shù)+1*/</p><p><b> count++;</b></p><p>
110、; /*對應(yīng)上同一個(gè)備忘的時(shí)候*/</p><p> if(count==t)</p><p><b> { </b></p><p> fseek(fp,i*sizeof(struct date_message),0);</p><p><b> /*覆蓋*/</b></p&
111、gt;<p> fwrite(&date,sizeof(struct date_message),1,fp);</p><p><b> break;</b></p><p><b> }</b></p><p><b> } </b></p><
112、p><b> i++; </b></p><p><b> }</b></p><p> printf("\n\t\t\t\t 修改成功!\n\n");</p><p><b> getch();</b></p><p> system(&q
113、uot;cls");</p><p> fclose(fp);</p><p><b> } </b></p><p> /*-------------------------------我是分割線-------------------------------*/</p><p> /*當(dāng)日備忘刪除*/
114、</p><p> void memo_delete()</p><p><b> {</b></p><p> /*定義文件指針*/</p><p><b> FILE *fp;</b></p><p><b> /*定義變量*/</b>&l
115、t;/p><p> int i=0,t,choice,count=0;</p><p> struct date_message temp1={0,0,0,"\0"};</p><p> struct date_message temp2;</p><p><b> /*確認(rèn)信息*/</b><
116、;/p><p> printf("確認(rèn)要?jiǎng)h除當(dāng)日備忘嗎(y/n)? "); </p><p> /*如果輸入y的話刪除*/ </p><p> if(!(getchar()=='y'||'Y'))</p><p><b> { </b></p>
117、<p> printf("未刪除該日任何備忘\n"); </p><p><b> getch();</b></p><p> system("cls");</p><p><b> exit(0);</b></p><p><b>
118、; }</b></p><p> printf("(1)刪除單條備忘 or (2)刪除當(dāng)日所有備忘?\n請輸入1或2進(jìn)行選擇\n");</p><p> scanf("%d",&choice);</p><p> switch(choice)</p><p><b>
119、; {</b></p><p> case 1:printf("請輸入要?jiǎng)h除第幾條備忘\n"); </p><p> /*輸入要?jiǎng)h除第幾條備忘*/</p><p> scanf("%d",&t);</p><p> if(!(t>0&&t<=co
120、unt_memo))</p><p><b> {</b></p><p> printf("輸入錯(cuò)誤!該次操作失?。?quot;);</p><p><b> getch();</b></p><p> system("cls");</p>&l
121、t;p><b> exit(0);</b></p><p><b> } </b></p><p><b> /*打開文件*/</b></p><p> if((fp=fopen("calender.txt","rb+"))==NULL)&l
122、t;/p><p><b> {</b></p><p> printf("打開文件失敗\n\n");</p><p><b> return;</b></p><p><b> }</b></p><p> /*在文件中查找輸入
123、的年月日的信息*/</p><p><b> while(1)</b></p><p><b> {</b></p><p> fseek(fp,i*sizeof(struct date_message),0);</p><p> if((fread(&temp2,sizeof(st
124、ruct date_message),1,fp))!=1)break;</p><p> if((temp2.year==date.year)&&(temp2.month==date.month)&&(temp2.day==date.day))</p><p><b> {</b></p><p><b
125、> count++;</b></p><p> if(count==t)</p><p><b> { </b></p><p> fseek(fp,i*sizeof(struct date_message),0);</p><p> /*將空的覆蓋上去*/</p><
126、;p> fwrite(&temp1,sizeof(struct date_message),1,fp);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b
127、> i++; </b></p><p><b> }</b></p><p> printf("單條備忘刪除成功!\n");</p><p><b> getch(); </b></p><p> system("cls");&
128、lt;/p><p> fclose(fp);</p><p><b> break;</b></p><p> case 2:/*打開文件*/</p><p> if((fp=fopen("calender.txt","rb+"))==NULL)</p><
129、p><b> {</b></p><p> printf("打開文件失敗\n\n");</p><p><b> return;</b></p><p><b> }</b></p><p> /*在文件中查找輸入的年月日的信息*/</
130、p><p><b> while(1)</b></p><p><b> {</b></p><p> fseek(fp,i*sizeof(struct date_message),0);</p><p> if(fread(&temp2,sizeof(struct date_messa
131、ge),1,fp)!=1)break;</p><p> if((temp2.year==date.year)&&(temp2.month==date.month)&&(temp2.day==date.day)) </p><p><b> { </b></p><p> fseek(fp,i*si
132、zeof(struct date_message),0);</p><p> fwrite(&temp1,sizeof(struct date_message),1,fp);</p><p><b> } </b></p><p><b> i++;</b></p><p>&l
133、t;b> }</b></p><p> printf("當(dāng)日所有備忘刪除成功!\n");</p><p><b> getch(); </b></p><p> system("cls");</p><p> fclose(fp);</p>
134、<p><b> break;</b></p><p> default:printf("輸入錯(cuò)誤!操作失敗!");</p><p><b> getch();</b></p><p> system("cls");</p><p><
135、;b> exit(0);</b></p><p><b> }</b></p><p><b> } </b></p><p> /*-------------------------------我是分割線-------------------------------*/</p>&
136、lt;p> /*全部備忘刪除*/</p><p> void memo_delete_all()</p><p><b> {</b></p><p> /*定義文件指針*/</p><p><b> FILE *fp;</b></p><p><b&g
137、t; /*定義變量*/</b></p><p><b> int i=0;</b></p><p> struct date_message temp1={0,0,0,"\0"};</p><p> struct date_message temp2;</p><p><b&
138、gt; /*確認(rèn)信息*/</b></p><p> printf("確認(rèn)要?jiǎng)h除當(dāng)日備忘嗎(y/n)? "); </p><p> /*如果輸入y的話刪除*/</p><p> if(!(getchar()=='y'||'Y'))</p><p><b> {
139、 </b></p><p> printf("未刪除任何備忘\n"); </p><p><b> getch();</b></p><p> system("cls");</p><p><b> exit(0);</b></p
140、><p><b> }</b></p><p><b> /*打開文件*/</b></p><p> if((fp=fopen("calender.txt","wb+"))==NULL)</p><p><b> {</b></
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言課程設(shè)計(jì)--萬年歷
- 萬年歷c語言課程設(shè)計(jì)
- c語言課程設(shè)計(jì)--萬年歷
- c語言課程設(shè)計(jì)萬年歷系統(tǒng)
- C語言課程設(shè)計(jì)--萬年歷.doc
- c語言課程設(shè)計(jì)--萬年歷系統(tǒng)
- c語言課程設(shè)計(jì)——萬年歷的設(shè)計(jì)
- c語言課程設(shè)計(jì)--大賽評分、萬年歷
- c語言課程設(shè)計(jì)--多功能萬年歷
- c++萬年歷課程設(shè)計(jì)
- c++課程設(shè)計(jì)--萬年歷
- 萬年歷c++課程設(shè)計(jì)
- 《c++課程設(shè)計(jì)》萬年歷
- 萬年歷c++課程設(shè)計(jì)
- 萬年歷課程設(shè)計(jì)--萬年歷電子時(shí)鐘
- 萬年歷課程設(shè)計(jì)
- 萬年歷課程設(shè)計(jì)
- 萬年歷課程設(shè)計(jì)
- 萬年歷課程設(shè)計(jì)
- 萬年歷課程設(shè)計(jì)
評論
0/150
提交評論