模擬時鐘轉(zhuǎn)動程序_第1頁
模擬時鐘轉(zhuǎn)動程序_第2頁
模擬時鐘轉(zhuǎn)動程序_第3頁
模擬時鐘轉(zhuǎn)動程序_第4頁
模擬時鐘轉(zhuǎn)動程序_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、東南大學(xué)C語言課程設(shè)計報告課程名稱: 計算機綜合課程設(shè)計 學(xué) 院: 土木工程學(xué)院 設(shè)計題目: 模擬時鐘轉(zhuǎn)動程序 級 別: B級 學(xué)生姓名: 韋信丞 學(xué) 號: 05114419 同組學(xué)生: 學(xué) 號: 指導(dǎo)教師: 郭恒寧 2015年 9 月 1 日C語言課程設(shè)計任務(wù)書模擬時鐘轉(zhuǎn)動程序一、課程設(shè)計的內(nèi)容1、能模擬機械鐘表行走2、還要準確利用數(shù)字顯示日期和時間3、在屏幕上顯示一個活動時鐘4、按任意鍵時程序退出。二、課程設(shè)計應(yīng)完成的工作、 編寫完成相應(yīng)題目的程序、 編寫課程設(shè)計報告,課程設(shè)計報告應(yīng)該包含以下部分) 需求分析:包括設(shè)計題目、設(shè)計要求以及系統(tǒng)功能需求分析) 總體設(shè)計:包括系統(tǒng)總體設(shè)計框架和系

2、統(tǒng)功能模塊圖) 詳細設(shè)計:包括主要功能模塊的算法設(shè)計思路以及對應(yīng)的工作流程圖) 調(diào)試分析過程描述:包括測試數(shù)據(jù)、測試輸出結(jié)果以及對程序測試過程中存在問題進行思考(主要問題的出錯現(xiàn)象、出錯原因、解決方法及其效果等,相應(yīng)效果截圖) 總結(jié):課程設(shè)計完成了哪些主要功能,是否有擴展功能?還有哪些地方需要改進?課程設(shè)計的學(xué)習(xí)與體會?有哪些合理化建議?) 附錄:主要原程序代碼含必要的注釋、 答辯:在實驗室建立程序運行環(huán)境,并在指導(dǎo)教師的監(jiān)督下,獨立解決問題,運行程序和回答教師的提問。四、應(yīng)收集的資料及其主要參考文獻 譚浩強程序設(shè)計(第四版),北京:清華大學(xué)出版社,2010年6月 陳清華 朱紅 . C語言課程

3、設(shè)計案例精選與編程指導(dǎo)(第一版),南京:東南大學(xué)出版社,2003年6月 顧小晶 . 實用C語言簡明教程(第一版),北京:中國電力出版社,2003年9月目錄. 設(shè)計目的與要求4. 總體設(shè)計5. 詳細設(shè)計6 3.1畫出鐘表的輪廓3.2獲取系統(tǒng)時間.調(diào)試分析7.總結(jié)10.附錄(程序)11.答辯記錄(正文處留出適當(dāng)空白)15.指導(dǎo)教師意見(正文處留出適當(dāng)空白)16. 目的與要求 要求:1、能模擬機械鐘表行走2、還要準確利用數(shù)字顯示日期和時間3、在屏幕上顯示一個活動時鐘4、按任意鍵時程序退出。設(shè)計總體要求:Ø 采用模塊化程序設(shè)計;Ø 鼓勵可視化編程;Ø 源程序中應(yīng)有足夠的注

4、釋;Ø 學(xué)生可自行增加新功能模塊(視情況可另外加分);Ø 必須上機調(diào)試通過;Ø 注重算法運用,優(yōu)化存儲效率與運算效率;Ø 需提交源程序(含有注釋)及相關(guān)文件(數(shù)據(jù)或數(shù)據(jù)庫文件); (cpp文件、txt或dat文件等)Ø 提交設(shè)計報告書,具體要求見以下說明。課程設(shè)計報告要求: 需求和規(guī)格說明:問題描述:題目要解決的問題是什么? 設(shè)計 設(shè)計思路:主要算法思想。 總體設(shè)計:程序設(shè)計組成框圖、N-S流程圖。 詳細設(shè)計:模塊功能說明(如函數(shù)功能、入口及出口參數(shù)說明,函數(shù)調(diào)用關(guān)系描述等)。 調(diào)試與測試:調(diào)試過程中遇到的主要問題,是如何解決的;對設(shè)計和編碼的

5、回顧討論和分析;改進設(shè)想;經(jīng)驗和體會等。附錄:源程序清單和結(jié)果。如果題目規(guī)定了測試數(shù)據(jù),則結(jié)果要包含這些測試數(shù)據(jù)和運行輸出,當(dāng)然還可以含其他測試數(shù)據(jù)和運行輸出;清單中應(yīng)有足夠的注釋。. 總體設(shè)計畫出鐘表模擬時鐘轉(zhuǎn)動程序讓時針,分針,秒針隨著系統(tǒng)的時間動起來獲取系統(tǒng)時間并畫出時針,分針,秒針首先,先畫出個鐘的大致輪廓。從輸出數(shù)字到畫出外輪廓,到標(biāo)出短線到畫出時針、分針、秒針。這個輪廓就已經(jīng)完成了。然后,為了更加這個鐘的實用性。就通過獲取系統(tǒng)時間來結(jié)合實際意義,這是最簡單,最好的方法。從應(yīng)用上,它顯示的是實際的時間,增強了可用性;從編程上,不用再復(fù)雜地再編一個更新時間的函數(shù),減少程序的篇幅、復(fù)雜性

6、和編程者的工作量。接著順帶利用時間的變量名來畫時針,分針,秒針。最后,為了讓時針,分針,秒針讓觀察者看起來是連續(xù)的變化,即形象地模擬真實的機械鐘表那樣運動,就用函數(shù)讓時針,分針,秒針跟著時間一齊走動。. 詳細設(shè)計1. 畫出鐘表的輪廓:1)鐘表的外輪廓 circle(320,240,189); circle(320,240,180);2)畫出鐘內(nèi)的短線x1=180*sin(i*6*pi/180)+320; y1=180*cos(i*6*pi/180)+240; x2=(180-l)*sin(i*6*pi/180)+320; y2=(180-l)*cos(i*6*pi/180)+240; line

7、(x1,y1,x2,y2);3)畫出時針、分針、秒針i=now.sec; j=now.min; k=now.hour; dx3=l3*sin(i*6*pi/180); dy3=l3*cos(i*6*pi/180); dx2=l2*sin(j*6*pi/180+i*6*pi/180/60); dy2=l2*cos(j*6*pi/180+i*6*pi/180/60); dx1=l1*sin(k*pi/6+j*pi/360); dy1=l1*cos(k*pi/6+j*pi/360);line(x1,y1,x1+dx3,y1-dy3); line(x1,y1,x1+dx2,y1-dy2); line(

8、x1,y1,x1+dx1,y1-dy1);2. 獲取系統(tǒng)時間:time(&rawtime);t=localtime(&rawtime);now.sec=t->tm_sec;now.min=t->tm_min;now.hour=t->tm_hour;now.year=t->tm_year;now.mon=t->tm_mon;now.day=t->tm_mday;now.week=t->tm_wday;. 調(diào)試分析在VC環(huán)境中,已經(jīng)將graphics算法刪除了,所以在一開始就發(fā)現(xiàn)在編譯的時候出現(xiàn)了graphicsh.h頭文件無法識別的錯誤。

9、我上網(wǎng)查閱了相關(guān)回答,得知了安裝graphics算法的方法,即通過EasyX插件來安裝該頭文件。解決了這個問題,便可以調(diào)用圖形處理的函數(shù)。再后來,發(fā)現(xiàn)書本教程主要面向的是TC環(huán)境,所以在獲取時間這個問題上,教材運用的是gettime和getdate函數(shù),這兩個函數(shù)在VC環(huán)境下是不能運用的,網(wǎng)上也沒有對這兩個函數(shù)進行補充的安裝插件,所以只能從用其他函數(shù)代替這個方向著眼解決。于是我查找了關(guān)于VC環(huán)境中獲取系統(tǒng)時間的函數(shù),發(fā)現(xiàn)了需要學(xué)習(xí)幾個知識點,首先是time_t類型,這個類型是一種整型,表示從1900年1月1日0:00:00時(這個知識點是在網(wǎng)上查閱到的,網(wǎng)上寫的是1970年1月1日0:00:0

10、0,但從運行結(jié)果上看是1900年)到當(dāng)前系統(tǒng)時刻的秒數(shù),用到的函數(shù)是time_t time(time_t *)函數(shù),其返回值就是time_t類型,返回值儲存到指針?biāo)傅牡刂罚ɑ蛘哒f直接是一個地址)中。當(dāng)然這還不夠,還需要將這秒數(shù)轉(zhuǎn)化成直觀的時間格式,這就用到了struct tm localtime(time_t *rawtime)函數(shù),將time_t類型格式化成struct tm類型(系統(tǒng)預(yù)定義了的結(jié)構(gòu)體),再將格式化了的數(shù)據(jù)傳到我自己定義的結(jié)構(gòu)體便于利用,這便解決了在VC環(huán)境下獲取系統(tǒng)時間的問題。獲取時間問題解決后,就到怎么實現(xiàn)時間的遞進,一開始我是想用循環(huán)結(jié)構(gòu),每次循環(huán)都將秒加一,然后再編

11、出秒一直到年的遞進規(guī)則,最后,在每個循環(huán)結(jié)束時,都將程序暫停執(zhí)行一秒(VC環(huán)境中用的是void Sleep(int millisecond)函數(shù))。首先這本身就很復(fù)雜了,更復(fù)雜的還是閏年的確定上。由于辨別是否是閏年的程序要相當(dāng)?shù)亻L,從程序的簡便化出發(fā)就排除了引入系統(tǒng)自動辨別閏年的程序模塊,一開始我考慮的是系統(tǒng)的運行時間不會很長,可以通過程序運行前向用戶詢問今年是否是閏年。再后來一想,一個好用的系統(tǒng),除了功能多樣化以外,還需要自動化,所以我一直想解決這個非自動化的缺陷。后來我一想,為什么一定要自己編寫出時間的變化呢?系統(tǒng)本身就是在變化的,為什么不直接利用系統(tǒng)時間的變化來帶動程序時間的變化呢?因此

12、,我就將獲取系統(tǒng)時間步驟放到了for循環(huán)中,這樣利用同步直接實現(xiàn)了時間的正確遞變。在改變了思路的時候,我又想到,由于獲得的時間的毫秒級數(shù)據(jù)與程序開始運行時刻有關(guān),這就導(dǎo)致了程序時間與系統(tǒng)時間就有了毫秒級的誤差,我就想能否將原來思路中用到的Sleep函數(shù)刪掉,通過頻率很高地獲取時間來達到顯示精準的時間的目的。于是我就嘗試把Sleep(1000);語句刪掉,然后運行。結(jié)果令我比較失望,由于系統(tǒng)執(zhí)行for循環(huán)的速度并不很快,就造成了圖像顯示的頻閃,非常不美觀,索性就留下了Sleep(1000);語句,毫秒級的誤差應(yīng)用上也不需要消除。還有一個問題是模擬時鐘圖像的變化問題,即實現(xiàn)簡單動畫化,剛開始,我想

13、采用的是異或劃線法刪掉前一秒的圖像,即通過setwritemode(1);語句設(shè)定劃線模式,在這個模式下,如果先畫了一條曲線,那么再有在相同位置再畫一條一模一樣的曲線的命令,即完全重合時,那么就是刪除這條曲線的意思。但是實際運行過程中,發(fā)現(xiàn)采用了這種變化方法的時分秒針的圖像在顯示屏上根本沒有顯示,只有不采用這種方法畫出的鐘表輪廓得以顯示。(如下圖1)我一開始是想繼續(xù)按這思路解決這個問題的,但是我又想,課題中有數(shù)字日歷及時鐘的顯示要求,這種字符串圖形通過這種方式是否能清楚呢?最后我決定還是換個方法,決定用cleardevice()函數(shù)對整個屏幕圖像進行清零,再把所有畫圖的內(nèi)容全都放在循環(huán)里,果然

14、程序便能順利正確地運行起來。(如下圖2) 圖1圖2剩下的難題就只剩下數(shù)字時鐘和日歷的顯示了,我查閱了教材,輸出字符串的函數(shù)有兩種,一種是void far outtextxy(int x,int y,char *str),還有一種void moveto(int x,int y)搭配void far outtext(char *str),但是是要想實現(xiàn)字符串加上變量的數(shù)據(jù)輸出,就必須通過int sprintf(char *str,char *format,variable-list)先格式化format內(nèi)容到指針str所指的數(shù)組里(該數(shù)組要足夠大),然后通過上述兩個方法輸出str所指的數(shù)組里的內(nèi)容

15、,這次問題解決得很順利,一次就能成功執(zhí)行該功能。. 總結(jié)在這次模擬時鐘轉(zhuǎn)動程序設(shè)計中,我遇到了很多困難,通過查資料,向同學(xué)、學(xué)長、老師請教,才一一得到解決。我發(fā)現(xiàn)平時自學(xué)到的知識太少了,“書到用時方恨少”,今后我要把更多時間用在基礎(chǔ)學(xué)習(xí)上,利用課余時間多看課外書籍,拓寬知識面。C語言的設(shè)計必須結(jié)合實際,充分考慮界面友好等人性化設(shè)置,這就要求我們要多觀察,敢創(chuàng)新。另外上機實驗是必不可少的,理論的東西學(xué)得再好,不結(jié)合實驗區(qū)驗證始終只能停留在理論階段。通過此次實戰(zhàn)演練,我還學(xué)到很重要的一點,就是要虛心請教他人,個人的力量總是有限的,只有發(fā)揮眾人的智慧才能把任務(wù)完成的更好,這在今后的工作中也是相當(dāng)重要

16、的。最后,感謝郭恒寧老師的指導(dǎo)。. 附錄#include<graphics.h>#include<conio.h>#include<math.h>#include<windows.h>#include<time.h>#include<stdlib.h>#include<stdio.h>#define pi 3.141592653struct timeint sec; int min; int hour; int year; int mon; int day;int week; now;int main()voi

17、d lunkuo();int gdriver=VGA,gmode=VGAHI;double x1=320,y1=240,dx1,dx2,dy1,dy2,dx3,dy3,i,j,k;int l1=100,l2=150,l3=160;char ch,s200;time_t rawtime;struct tm *t;initgraph(&gdriver,&gmode,"d:clydeturboc2");/圖形初始化for(;!(kbhit();)/一旦有鍵盤按鍵按下,終止循環(huán)lunkuo();/畫出輪廓 time(&rawtime); t=localtim

18、e(&rawtime); now.sec=t->tm_sec; now.min=t->tm_min; now.hour=t->tm_hour; now.year=t->tm_year; now.mon=t->tm_mon; now.day=t->tm_mday; now.week=t->tm_wday;/獲取時間 i=now.sec; j=now.min; k=now.hour; dx3=l3*sin(i*6*pi/180); dy3=l3*cos(i*6*pi/180); dx2=l2*sin(j*6*pi/180+i*6*pi/180/60); dy2=l2*cos(j*6*pi/180+i*6*pi/180/60); dx1=l1*sin(k*pi/6+j*pi/360); dy1=l1*cos(k*pi/6+j*pi/360); line(x1,y1,x1+dx3,y1-dy3); line(x1,y1,x1+dx2,y1-dy2); l

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論