機械時鐘程序報告 本科畢業(yè)設(shè)計(論文)
《機械時鐘程序報告 本科畢業(yè)設(shè)計(論文)》由會員分享,可在線閱讀,更多相關(guān)《機械時鐘程序報告 本科畢業(yè)設(shè)計(論文)(27頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 課 程 設(shè) 計 報 告 課程名稱 C語言程序設(shè)計 課題名稱 機械時鐘的設(shè)計 專 業(yè) 電子信息 班 級 學(xué) 號 姓 名 指導(dǎo)教師 湖南工程學(xué)院 課 程 設(shè) 計 任 務(wù) 書 課程名稱 C語言程序設(shè)計 課 題 機械時鐘設(shè)計
2、 專業(yè)班級 學(xué)生姓名 學(xué) 號 指導(dǎo)老師 審 批 一、設(shè)計內(nèi)容與設(shè)計要求 1. 設(shè)計內(nèi)容:機械時鐘系統(tǒng) 在屏幕上實現(xiàn)一個機械時鐘,并且能夠通過鍵盤上的按鍵完成時間的修改。 目 錄 1.需求分析 1 2程序總體設(shè)計 1 3.程序詳細(xì)設(shè)計 2 4.程序運行結(jié)果 11 5.參考資料 13 6.總結(jié)體會 13 7.
3、程序源代碼 13 4 機械時鐘程序報告 一、 需求分析 根據(jù)老師的要求,要在屏幕上顯示一個機械時鐘并且顯示當(dāng)前的數(shù)字時鐘以及日歷。根據(jù)老師的要求,本程序要顯示機械時鐘就必須通過畫圖函數(shù)將機械表畫出來。另外,本程序還用到延時函數(shù),實現(xiàn)秒針,分針,時針的轉(zhuǎn)動。樹立起總體思想就開始設(shè)計整個程序。 二、 程序總體設(shè)計 本程序包含了一個主函數(shù)和六個子函數(shù),主函數(shù)完成初始化時間(獲取系統(tǒng)時間)以及時鐘與日歷的進制,同時還是調(diào)節(jié)六個子函數(shù)共同完成整個程序功能的實現(xiàn)。六個子函數(shù)分別完成顯示機械表針和數(shù)字時鐘、顯示界面上的文字、顯示日歷、做表盤、做刻度以及重新設(shè)置程序的時間與日歷。 流
4、程圖如下:主函數(shù),獲取系統(tǒng)時間,完成時鐘日歷進制,設(shè)置畫圖窗口。 做表盤,做刻度,做畫圖界面上一些無需變化的文字。 畫表針,顯示數(shù)字時鐘,顯示日歷 延時一秒。時鐘的秒數(shù)加一,并按時間進制控制其他時間項目 輸入現(xiàn)在的時間,并將該程序時鐘的時間改成輸入的時間 擦去表針,擦去數(shù)字時針,擦去日歷上回隨時間變化的東西。 按r鍵,進入修改界面 三、 程序的詳細(xì)設(shè)計 1、畫表盤、做刻度、顯示界面上一些無需改動的文字 void fun2()//做表盤 { setcolor(WHITE); circle(220,240,180); circle(220,240,170); ci
5、rcle(220,240,2); circle(220,240,110); } void fun3()//做刻度 {int i,ix,iy,ix1,iy1; double i1; for(i=0;i<60;i++) {i1=i*PI/30; ix=int(220+165*sin(i1)); iy=int(240-165*cos(i1)); ix1=int(220+105*sin(i1)); iy1=int(240-105*cos(i1)); setcolor(WHITE); if(i%15==0) {bar(ix-5,iy-5,ix+5,iy+5
6、);} else circle(ix,iy,2); if(i%5==0) {circle(ix1,iy1,5); circle(ix,iy,5);} } } void fun4()//做界面上的文字 { char s1[]={"機械時鐘"}, s2[]={"按r鍵重設(shè)時間"}, s3[]={"按其他鍵退出"}, s4[]={"制作人——楊自然"}; setfont(50,40,"黑體"); setcolor(RED); outtextxy(80,0,s1); setfont(22,16,"宋體"); setcolor(BL
7、UE); outtextxy(420,250,s2); outtextxy(420,300,s3); setcolor(BLUE); setfont(18,12,"宋體"); outtextxy(400,455,s4); } 設(shè)計簡單的表盤,即四個半徑分別為2,110,170,180的同心圓。做刻度,在半徑為110的圓盤上標(biāo)出1到12點的位置,用半徑為5小圓圈表示。在半徑為170的圓盤上用標(biāo)出1到12點的位置,用半徑分別為2和五的同心圓表示,在1到六十的刻度上用半徑為2的小圓圈表示,在3、6、9、12點的位置用邊長為10的填充正方形表示。另外,在畫圖界面上顯示一些必要的
8、文字。 2、畫表針,顯示數(shù)字時鐘,顯示日歷 void fun1(int h,int m,int s) //畫時鐘、分鐘、秒鐘,顯示數(shù)字時鐘 {double h1,m1,s1; int hx,hy,mx,my,sx,sy; s=s%60; m=m%60; h=h%24; s1=s*PI/30; m1=m*PI/30; h1=(h%12)*PI/6+m*PI/360; hx=int(220+100*sin(h1)); hy=int(240-100*cos(h1)); mx=int(220+140*sin(m1)); my=int(240-140*cos(m1));
9、 sx=int(220+160*sin(s1)); sy=int(240-160*cos(s1)); setlinestyle(PS_SOLID, NULL, 2); setcolor(RED); line(220,240,sx,sy); setlinestyle(PS_SOLID, NULL, 6); setcolor(LIGHTGRAY); line(220,240,mx,my); setlinestyle(PS_SOLID, NULL, 10); setcolor(WHITE); line(220,240,hx,hy); TCHAR str1[5],str2[
10、5],str3[5]; setfont(20,18,"宋體"); _stprintf(str1,"%d",s); _stprintf(str2,"%d",m); _stprintf(str3,"%d",h); setfont(20,16,"宋體"); if(h>9) { outtextxy(450,200,str3); } else { outtextxy(450,200,"0"); outtextxy(465,200,str3); } outtextxy(490,200,":"); if(m>9) { outtextxy(510,200,str2); }
11、 else { outtextxy(510,200,"0"); outtextxy(525,200,str2); } outtextxy(550,200,":"); if(s>9) { outtextxy(570,200,str1); } else { outtextxy(570,200,"0"); outtextxy(585,200,str1); } } void fun5(int d,int e,int f,int g) //日歷的顯示 { char c1[]={"年"}, c2[]={"月"}, c3[]={"日"}; setfont(30
12、,22,"宋體"); TCHAR str1[5],str2[5],str3[5]; _stprintf(str1,"%d",d); _stprintf(str2,"%d",e); _stprintf(str3,"%d",f); setfont(35,25,"宋體"); setcolor(RED); outtextxy(440,70,str1); outtextxy(550,70,c1); setfont(20,18,"宋體"); setcolor(WHITE); if(e<10) {outtextxy(445,120,0); outtextxy(465,120,st
13、r2);} else outtextxy(445,120,str2); outtextxy(480,120,c2); if(f<10) {outtextxy(520,120,0); outtextxy(540,120,str3);} else outtextxy(520,120,str3); outtextxy(560,120,c3); setcolor(CYAN); switch(g) { case 1: outtextxy(460,160,"星期一"); break; case 2: outtextxy(460,160,"星期二"); break
14、; case 3: outtextxy(460,160,"星期三"); break; case 4: outtextxy(460,160,"星期四"); break; case 5: outtextxy(460,160,"星期五"); break; case 6: outtextxy(460,160,"星期六"); break; case 7: outtextxy(460,160,"星期日"); break; } } 通過獲取的系統(tǒng)時間,計算出個表針的角度以及表針的終點,畫出表針,并設(shè)置不同的大小、長度與顏色,以便用戶的區(qū)分。在機械時鐘的
15、右側(cè),顯示出從系統(tǒng)獲得的日歷。 3、修改部分 void fun6(int *a,int *b,int *c,int *d,int *e,int *f,int *g) //重新設(shè)定時間日期 { int m,n; printf("請問你是要修改時間還是修改日期\n"); printf("*************************************\n"); printf("* 修改時間請按“1”,然后回車 *\n"); printf("* 修改日期請按“2”,然后回車 *\n"); printf("* 退出請按“3”,然后回
16、車 *\n"); printf("*************************************\n"); scanf("%d",&m); switch(m) { case 1: { printf("請輸入當(dāng)前是幾點幾分幾秒,用逗號隔開\n"); scanf("%d,%d,%d",a,b,c); printf("請問是否繼續(xù)修改日期\n"); printf("**********************************\n"); printf("*繼續(xù)修改請按“1”,退出請按“2”*\n"); printf("**********
17、************************\n"); scanf("%d",&n); if(n==2) { break; } } case 2: { printf("請輸入當(dāng)前是哪年哪月哪日星期幾,用逗號隔開\n"); scanf("%d,%d,%d,%d",d,e,f,g); break; } } } 通過使用指針,更該當(dāng)前時鐘程序的當(dāng)前時間與日歷,并將其反饋到主函數(shù)。 4、主函數(shù) void main() //主函數(shù) 獲取系統(tǒng)時間 給各個函數(shù)傳送相關(guān)的時間信息 {int a=0,b=0,c=0,d,e,f,g
18、,h=1; SYSTEMTIME t; GetLocalTime(&t); a=t.wHour; b=t.wMinute; c=t.wSecond; d=t.wYear; e=t.wMonth; f=t.wDay; g=t.wDayOfWeek; initgraph(640, 480); fun3(); fun2(); fun4(); setwritemode(R2_XORPEN); while(h==1) { fun1(a,b,c); fun5(d,e,f,g); Sleep(1000); fun1(a,b,c);
19、 fun5(d,e,f,g); c++; if(c%60==0) { b++; } if(b%60==0) { a++; } if(a%24==0) { f++;g++; } if(((e%2==1&&e<8)||(e%2==0&&e>7))&&f==31)//日歷進制 { e++; } if(((e%2==0&&e<8)||(e%2==1&&e>7))&&f==30) { e++; } if(((e%2==1&&e<8)||(e%2==0&&e>7))&&f>31) { f=f%31; } if(((e%2==0&&e<8)||(e
20、%2==1&&e>7))&&f>30) { f=f%30; } char str; if(kbhit()!=0) {str=getch(); if(str==r||str==R) { closegraph(); fun6(&a,&b,&c,&d,&e,&f,&g); initgraph(640, 480); fun3(); fun2(); fun4(); setwritemode(R2_XORPEN); } else { h++; closegraph(); } e=e%12; } } } 主函數(shù),獲取系統(tǒng)時間,完成各個函數(shù)之
21、間的數(shù)據(jù)交換,實現(xiàn)各個函數(shù)之間所要求的功能。 四、 程序的運行結(jié)果 1、 時鐘界面,在設(shè)置的畫圖窗口中顯示出機械時鐘,數(shù)字時鐘,日歷,以及其他一些文字說明。運行圖如下: 上圖即為運行程序是的結(jié)果 2、 當(dāng)運行程序后按r鍵,程序立刻進入時間修改界面,運行圖如下: 輸入上圖數(shù)字后,回車,可得下圖 該圖為修改后機械時鐘的界面。 五、 參考資料 C語言程序設(shè)計方法 鄧文心 張宏烈主編 哈爾濱工業(yè)大學(xué)出版社出版 六、 總結(jié)體會 本次程序設(shè)計按照老師的要求是未完成一個機械時鐘的現(xiàn)實,由于我所學(xué)C語言知識的局限,基本不知道該從何下手。但是我根據(jù)程序的要求首先從簡單地方開
22、始入手,即搜集此次程序設(shè)計需要用到的庫函數(shù)。于是我從網(wǎng)絡(luò)上找到了延時是函數(shù)Sleep(),并且知道C語言上有一個畫圖函數(shù)庫,其頭文件是graphics.h,該頭文件沒有包含在我所使用的VC里面,經(jīng)過經(jīng)一步的搜索,我從網(wǎng)上得知知要在VC上安裝EasyX程序即可使我使用的VC能夠正常的使用畫圖函數(shù)庫里的函數(shù),我半信半疑的按照網(wǎng)上的說法做了,并達到了預(yù)期的效果。 其實,我在一開始便在網(wǎng)上搜到了一個機械時鐘的模板,但是由于畫圖函數(shù)庫不能通過,模板也不能運行。但是,自我安裝了EasyX程序后我在網(wǎng)上搜的程序已經(jīng)能夠正常運行,這使我非常欣喜。我瀏覽了一下模板程序,其實,我主要是看了它的一些注釋和一些特殊
23、的函數(shù),然后我便開始編程了。 我在圖書館接了一本《C語言程序設(shè)計》,那本書講的是在TC上編譯的,但是里面有一章專門講的是C語言畫圖,里面提到了許多用于畫圖的庫函數(shù),我仔細(xì)的看了那一章,體會了那些函數(shù)的用法,到此,我的前期準(zhǔn)備工作算是做完了。 老實說,此次程序設(shè)計我感覺像是對畫圖函數(shù)的一種深刻的理解吧。基本上我做的一切都建立在畫圖界面上。或許是因為準(zhǔn)備充分,很快,我就完成了機械時鐘的設(shè)計,并開始設(shè)計其他東西。 一天老師檢查成果,聽到我說參考了網(wǎng)上的模板,不怎么高興,說如果什么都去網(wǎng)上查不自己動腦想想,怎么能得到進步了,于是便對我提了進一步的要求,即顯示數(shù)字時鐘與日歷,還要完成時鐘日歷的修改
24、功能。在完成機械時鐘后這些好像對我來說不是什么難題了,不久我便完成了整個程序的設(shè)計。
在本次的程序設(shè)計中,我的確收益匪淺。通過對C語言的進一步了解,我開始明白我在書上學(xué)到的知識是十分有限的,要想提高自己的編程能力,不僅要扎實C語言的基礎(chǔ),同時還要更多閱讀其他的相關(guān)資料,豐富自己的知識,這樣在編程方面才可能得到進一步的提高。
七、 源程序
#include
25、fun1(int h,int m,int s) //畫時鐘、分鐘、秒鐘,顯示數(shù)字時鐘 {double h1,m1,s1; int hx,hy,mx,my,sx,sy; s=s%60; m=m%60; h=h%24; s1=s*PI/30; m1=m*PI/30; h1=(h%12)*PI/6+m*PI/360; hx=int(220+100*sin(h1)); hy=int(240-100*cos(h1)); mx=int(220+140*sin(m1)); my=int(240-140*cos(m1)); sx=int(220+160*sin(s1)); sy
26、=int(240-160*cos(s1)); setlinestyle(PS_SOLID, NULL, 2); setcolor(RED); line(220,240,sx,sy); setlinestyle(PS_SOLID, NULL, 6); setcolor(LIGHTGRAY); line(220,240,mx,my); setlinestyle(PS_SOLID, NULL, 10); setcolor(WHITE); line(220,240,hx,hy); TCHAR str1[5],str2[5],str3[5]; setfont(20,18,"宋
27、體"); _stprintf(str1,"%d",s); _stprintf(str2,"%d",m); _stprintf(str3,"%d",h); setfont(20,16,"宋體"); if(h>9) { outtextxy(450,200,str3); } else { outtextxy(450,200,"0"); outtextxy(465,200,str3); } outtextxy(490,200,":"); if(m>9) { outtextxy(510,200,str2); } else { outtextxy(510,200,
28、"0"); outtextxy(525,200,str2); } outtextxy(550,200,":"); if(s>9) { outtextxy(570,200,str1); } else { outtextxy(570,200,"0"); outtextxy(585,200,str1); } } void fun4()//做界面上的文字 { char s1[]={"機械時鐘"}, s2[]={"按r鍵重設(shè)時間"}, s3[]={"按其他鍵退出"}, s4[]={"制作人——楊自然"}; setfont(50,40,"黑體")
29、; setcolor(RED); outtextxy(80,0,s1); setfont(22,16,"宋體"); setcolor(BLUE); outtextxy(420,250,s2); outtextxy(420,300,s3); setcolor(BLUE); setfont(18,12,"宋體"); outtextxy(400,455,s4); } void fun5(int d,int e,int f,int g) //日歷的顯示 { char c1[]={"年"}, c2[]={"月"}, c3[]={"日"}; set
30、font(30,22,"宋體"); TCHAR str1[5],str2[5],str3[5]; _stprintf(str1,"%d",d); _stprintf(str2,"%d",e); _stprintf(str3,"%d",f); setfont(35,25,"宋體"); setcolor(RED); outtextxy(440,70,str1); outtextxy(550,70,c1); setfont(20,18,"宋體"); setcolor(WHITE); if(e<10) {outtextxy(445,120,0); outtextxy(465
31、,120,str2);} else outtextxy(445,120,str2); outtextxy(480,120,c2); if(f<10) {outtextxy(520,120,0); outtextxy(540,120,str3);} else outtextxy(520,120,str3); outtextxy(560,120,c3); setcolor(CYAN); switch(g) { case 1: outtextxy(460,160,"星期一"); break; case 2: outtextxy(460,160,"星期二");
32、 break; case 3: outtextxy(460,160,"星期三"); break; case 4: outtextxy(460,160,"星期四"); break; case 5: outtextxy(460,160,"星期五"); break; case 6: outtextxy(460,160,"星期六"); break; case 7: outtextxy(460,160,"星期日"); break; } } void fun2()//做表盤 { setcolor(WHITE); circle(220,2
33、40,180); circle(220,240,170); circle(220,240,2); circle(220,240,110); } void fun3()//做刻度 {int i,ix,iy,ix1,iy1; double i1; for(i=0;i<60;i++) {i1=i*PI/30; ix=int(220+165*sin(i1)); iy=int(240-165*cos(i1)); ix1=int(220+105*sin(i1)); iy1=int(240-105*cos(i1)); setcolor(WHITE); if
34、(i%15==0) {bar(ix-5,iy-5,ix+5,iy+5);} else circle(ix,iy,2); if(i%5==0) {circle(ix1,iy1,5); circle(ix,iy,5);} } } void fun6(int *a,int *b,int *c,int *d,int *e,int *f,int *g) //重新設(shè)定時間日期 { int m,n; printf("請問你是要修改時間還是修改日期\n"); printf("*************************************\n");
35、printf("* 修改時間請按“1”,然后回車 *\n"); printf("* 修改日期請按“2”,然后回車 *\n"); printf("* 退出請按“3”,然后回車 *\n"); printf("*************************************\n"); scanf("%d",&m); switch(m) { case 1: { printf("請輸入當(dāng)前是幾點幾分幾秒,用逗號隔開\n"); scanf("%d,%d,%d",a,b,c); printf("請問是否繼續(xù)修改日期\n");
36、 printf("**********************************\n"); printf("*繼續(xù)修改請按“1”,退出請按“2”*\n"); printf("**********************************\n"); scanf("%d",&n); if(n==2) { break; } } case 2: { printf("請輸入當(dāng)前是哪年哪月哪日星期幾,用逗號隔開\n"); scanf("%d,%d,%d,%d",d,e,f,g); break; } } } void
37、 main() //主函數(shù) 獲取系統(tǒng)時間 給各個函數(shù)傳送相關(guān)的時間信息 {int a=0,b=0,c=0,d,e,f,g,h=1; SYSTEMTIME t; GetLocalTime(&t); a=t.wHour; b=t.wMinute; c=t.wSecond; d=t.wYear; e=t.wMonth; f=t.wDay; g=t.wDayOfWeek; initgraph(640, 480); fun3(); fun2(); fun4(); setwritemode(R2_XORPEN); while(h==1) {
38、 fun1(a,b,c); fun5(d,e,f,g); Sleep(1000); fun1(a,b,c); fun5(d,e,f,g); c++; if(c%60==0) { b++; } if(b%60==0) { a++; } if(a%24==0) { f++;g++; } if(((e%2==1&&e<8)||(e%2==0&&e>7))&&f==31)//日歷進制 { e++; } if(((e%2==0&&e<8)||(e%2==1&&e>7))&&f==30) { e++; } if(((e%2==1&&e
39、<8)||(e%2==0&&e>7))&&f>31) { f=f%31; } if(((e%2==0&&e<8)||(e%2==1&&e>7))&&f>30) { f=f%30; } char str; if(kbhit()!=0) {str=getch(); if(str==r||str==R) { closegraph(); fun6(&a,&b,&c,&d,&e,&f,&g); initgraph(640, 480); fun3(); fun2(); fun4(); setwritemode(R2_XORPEN); } else { h++; closegraph(); } e=e%12; if(e==0) e=12; } } } 23
- 溫馨提示:
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)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案