模拟时钟转动程序课程设计报告Word文件下载.docx
《模拟时钟转动程序课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《模拟时钟转动程序课程设计报告Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
1.1C语言课程设计的目的
加深对讲授内容的理解,尤其是一些语法规定。
通过课程设计,自然地、熟练地掌握。
熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。
学会上机调试程序。
通过编程最终使程序运行结果为电脑屏幕显示模拟时钟,并正常运行显示表针时间。
1.2C语言课程设计实现的要求
能模拟机械钟表行走;
在屏幕上显示一个活动时钟;
程序界面设计合理,色彩得体大方,显示正确;
各指针运动规律正确;
要准确地利用数字显示日期和时间并且可以根据用户的需求更改当前时间(指针式时钟与数字式时钟实现同步更改);
数字式时钟的时间显示与指针式时钟显示一致;
可以通过上下键改变当前的时、分、秒;
改的时间是小时、分钟、还是秒数;
通过Tab键切换按Esc时程序退出。
第二章课程设计的任务内容
要熟练掌握C语言的基本知识:
数据类型(整形、实型、字符型、指针、数组、结构等);
运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);
程序结构(顺序结构、判断选择结构、循环结构);
大程序的功能分解方法(即函数的使用)等。
用C语言实现一个模拟时钟转动程序;
Graphics函数库。
提出总体方案的设计思想和原理,绘制程序流程图和描述程序的功能,并说明程序的特点和难点。
要准确地利用数字显示日期和时间;
按任意键时程序退出。
模拟时钟是一种集计时器和时钟显示于一体的程序。
编写一个指针式时钟程序,此程序在屏幕正中有一个指针式钟面,窗口标题以数字方式显示日期和时间。
指针式的时钟表盘为椭圆形或圆形,并且圆周上有分布均匀的12个刻度,刻度要求显示清楚,钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动要求具有规律性,且为顺时针。
数字钟显示时间的格式是年月日时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步,且两个时钟所显示的时间与计算机的系统时间一致。
第三章详细设计说明
3.1程序系统的结构
图3.1功能模块图
3.1.1实验设备及环境:
WindowsXP操作系统
WinTCIDEC语言开发环境
Hp笔记本
3.2模块描述
3.2.1指针式时钟
指针式的时钟表盘为圆形,并且圆周上有分布均匀的12个较大刻度和六十个较小的刻度,刻度显示清楚,分别表示小时、分钟和秒数钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动具有规律性,为顺时针。
3.2.2数字式时钟
数字钟显示时间的格式是时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步,且两个时钟所显示的时间与计算机的系统时间一致。
3.3输出项
数字式时钟输出“%d时%d分%d秒”。
3.4算法
#define宏定义部分定义变量。
利用函数circle(a,b,c)定义圆即表盘及轴心,其中(a,b)为圆心坐标,c为半径。
利用函数setbkcolor、setcolor设置颜色。
gettime(t)获取电脑时间进行显示sound()、delay()函数设置表针走动声音对应走动刻度。
应用c语言库函数进行表盘及颜色的的处理,编写表针运算函数,及表针影像颜色覆盖处理详见程序注释。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x,y)的公式如下:
x=圆心x坐标指针长度*cos(指针方向角)y=圆心y坐标指针长度*sin(指针方向角)注重,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可以跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用消息来处理指针的运动。
3.5流程图
图3.2程序流程图
绘制小时的圆点:
x=100*sin((h*60+m)/360*PI)+451;
y=200-100*cos((h*60+m)/360*PI);
绘制表示分钟或秒钟的圆点:
x=100*sin(m/30*PI)+451;
y=200-100*cos(m/30*PI);
由于表是顺时针转动,我们的角度习惯上使用逆时针,所以我们使用自己校正后的角度值,从12点开始,按顺时针重新排列三角函数值,加入对角度正负的校正。
1、程序与处理
包括加载头文件,定义常量、变量、结构体数组和函数原型声明。
主函数main()
main()函数主要实现了对电子时钟的初始化工作,及clockhandle()函数的调用。
main()
{
intdriver,mode=0,i,j;
driver=DETECT;
/*自动检测显示设备*/
initgraph(&
driver,&
mode,"
"
)/*初始化图形系统*/
setlinestyle(0,0,3);
/*设置当前画线宽度和类型:
设置三点宽实线*/
setbbcolor(0);
/*用调色板设置当前背景颜色*/
setcolor(9);
/*设置当前画线颜色*/
……
2、在电子表的左边打印帮助提示信息,相当于软件的使用说明。
3、时钟按键控制模块
在电子时钟中,按键控制模块最主要的工作就是必须能读取用户按键,对按键值进行判断,并调用相应函数来执行相关操作。
intkeyhandle(intkey,intcount)/*键盘控制*/
4、数字时钟处理模块
在数字时钟处理模块中,主要实现数字时钟的显示和数字时钟的修改。
其中,在数字时钟的修改中,用户可先按Tab键定位需要修改内容的位置,
然后通过按光标上移或下移键来修改当前时间。
它的主要工作如下:
(1)调用digitclock(intx,inty,intclock)函数,在数字时钟r指定位置显示时、分、秒,其中digithour(doubleh)、
intdigithour(doubleh)和digitsec(doubles)用于完成数值的型向int型转换。
(2)调用drawcursor(intcount)、clearcursor(intcount)函数来完成旧光标的擦除和新光标的绘制。
首先定义一些时钟常用的宏和定义处理时钟的一些函数及保存数据的变量:
intkeyhandle(int,int);
/*键盘按键判断,并调用相关函数处理*/
inttimeupchange(int);
/*处理上移按键*/
inttimedownchange(int);
/*处理下移按键*/
intdigithour(double);
/*将double型的小时数转换成int型*/
intdigitmin(double);
/*将double型的分钟数转换成int型*/
intdigitsec(double);
/*将double型的秒钟数转换成int型*/
voiddigitclock(int,int,int);
/*在指定位置显示时钟或分钟或秒钟数*/
voiddrawcursor(int);
/*绘制一个光标*/
voidclearcursor(int);
/*消除前一个光标*/
voidclockhandle();
/*时钟处理*/
doubleh,m,s;
/*全局变量:
小时,分,秒*/
doublex,x1,x2,y,y1,y2;
坐标值*/
structtimet[1];
/*定义一个time结构类型的数组*/
1.#include<
graphics.h>
TurbeC中重要的函数库,VisualC++6.0和DevC++都不支持(VC和DEV都支持C项目)Graphics,可怜我上网找了半天终于找到了合适的IDEWinTc
本程序中的指针式时钟和数字式时钟的绘制都要靠它的
例如:
intdriver,mode=0,i,j;
driver=DETECT;
initgraph(&
);
/*初始化图形系统*/
setlinestyle(0,0,3);
/*设置当前画线宽度和类型:
setbkcolor(0);
/*用调色板设置当前背景颜色*/
setcolor(9);
line(82,430,558,430);
line(70,62,70,418);
line(82,50,558,50);
line(570,62,570,418);
line(70,62,570,62);
line(76,56,297,56);
line(340,56,564,56);
/*画主体框架的边直线*/
2.#include<
stdio.h>
标准的C的输入输出流函数主要用它来控制字符串的某些操作
3.#include<
math.h>
数学函数库,一些数学计算的公式的具体实现是放在math.h里。
4.#include<
dos.h>
就是最早黑白界面下的操作使用的一些方法和接口的函数库
3.8调试结果(在多次尝试截屏无果后,痛下决定用相机拍下来了)
图3.3运行结果
第四章软件使用说明
4.1软件使用说明及出现的问题
在WinTC中新建一个cpp源文件,
然后输入代码。
运行后显示一个正在行走的机械时钟。
机械时钟下方为数字式时钟,可根据需要修改当前时间,该程序全屏显示,在屏幕的左半边为操作提示(Tab:
CursorMove;
Up:
Time++;
Down:
Time--;
ESC:
QuittheSystem;
)和一句警示语:
Nothingismoreimportantthantime,可根据提示进行你想要的操作。
按ESC退出。
4.2运行结果
图4.1运行结果
第五章课程设计心得与体会
经过一个半学期对《C课程设计》的学习,我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。
通过课程设计,一方面是为了检查我们一个半学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。
通过对模拟时钟的设计进一步的巩固了用C编写程序,并且有利于更好的掌握程序设计语言!
同时也认识到了结构化语言的不足之处,为我们以后学习面向对象语埋下伏笔。
在模拟时钟的编写过程中也体会到了做事情一顶要细心、认真。
更加知道了要掌握好基础知识。
还有体会到了成功的感觉!
通过本项课程设计也培养了我独立思考、综合运用所学有关相应知识的能力,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
由于C程序设计语言是近年在国内外得到迅速推广应用的一种语言。
据51CTO2010的语言排行榜,C语言是程序员使用率第二高的语言,仅次于面向对象的Java语言,是使用率最高的面向结构的编程语言。
它功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
通过这次的程序设计更加了解了语言设计的好处和其可用性!
在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!
在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!
在设计过程中的一次次设计错误增加了我放弃的想法!
不过经过自己的独立思考和同学的帮助终于完成了课程设计!
完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!
只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!
也让我懂得了要想成功首先就必须有很强的自信心!
懂得了自己以后要在做任何事情时都要自信!
当自己都不相信自己能够成功时还可能会获得成功吗?
在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!
都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!
为以后的工作打下良好的知识基础和技能基础!
教材及参考书
序号
书名
编者
出版社
版本
1
C语言课程设计案例精编
姜灵芝、
余健
清华大学
2008.1
2
郭翠英
中国水利水电出版社
2004.3
3
C语言程序设计
田祥宏主编
西安电子科技大学出版社
2007.12
附录二:
/*电子时钟源代码*/
#include<
#include<
string.h>
conio.h>
#definePI3.1415926/*定义常量*/
#defineUP0x4800/*上移↑键:
修改时间*/
#defineDOWN0x5000/*下移↓键:
#defineESC0x11b/*ESC键:
退出系统*/
#defineTAB0xf09/*TAB键:
移动光标*/
/*函数声明*/
{
添加内容:
/*为防止图形初始化时发生异常出现错误时将出现有好的提示界面*/
errorcode=graphresult()
if(errorcode!
=grOk)/*图形初始化时出现错误*/
printf("
Graphicserror:
%s/n"
grapherrormsg(errorcode));
Pressanykeytohalt:
getch();
exit
(1);
/*returnwitherrorcode*/
}
/*setlinestyle(0,0,3);
函数名:
setlinestyle
功能:
设置当前画线宽度和类型
用法:
voidfarsetlinestyle(intlinestyle,unsignedpattern,intwidth);
linestyle为整数型,用来定义所画直线类型
pattern为无符号整数型,该参数在需要用户自定义线型时使用,如果是使用系统预定义的线型则参数取0值
width为整数型,用来指定所画直线的粗细
SOLID_LINE
0
实线
DOTTED_LINE
1
点线
CNTER_LINE
2
中心线
DASHED_LINE
3
虚线
USERBIT_LINE
4
用户自定义线型
此处我稍作修改:
*/
设置四点宽点线线
setbkcolor(0);
/*可以让用户选择系统支持的颜色作为背景色*/
intbkcol,maxcolor,x=10,y=10;
charIsOK;
maxcolor=getmaxcolor();
for(bkcol=0;
bkcol<
=maxcolor;
bkcol++)
/*清理屏幕*/
cleardevice();
/*设置新的背景色*/
setbkcolor(bkcol);
/*outputamesssage*/
if(bkcol==WHITE)
setcolor(EGA_BLUE);
sprintf(msg,"
Backgroundcolor:
%d"
bkcol);
outtextxy(x,y,msg);
IsOK=getch();
if(IsOK==’Y’)
break;
line(82,430,558,430);
line(70,62,70,418);
line(82,50,558,50);
line(570,62,570,418);
line(70,62,570,62);
line(76,56,297,56);
line(340,56,564,56);
/*arc(intx,inty,intstangle,intendangle,intradius)*/
arc(82,62,90,180,12);
arc(558,62,0,90,12);
arc(82,418,180,279,12);
arc(558,418,270,360,12);
/*画主体框架的边角弧线*/
setcolor(15);
outtextxy(300,53,"
CLOCK"
/*显示标题*/
setcolor(7);
rectangle(342,72,560,360);
/*画一个矩形,作为时钟的框架*/
setwritemode(0);
/*规定画线的方式。
mode=0,则表示画线时将所画位置的原来信息覆盖*/
outtextxy(433,75,"
/*时钟的标题*/
line(392,310,510,310);
line(392,330,510,330);
arc(392,320,90,270,10);
arc(510,320,270,90,10);
/*绘制电子动画时钟下的数字时钟的边框架*/
/*绘制数字时钟的时分秒的分隔符*/
setcolor(5);
for(i=431;
i<
=470;
i+=39)
for(j=317;
j<
=324;
j+=7){
circle(i,j,1);
/*以(i,y)为圆心,1为半径画圆*/
line(424,315,424,325);
/*在运行电子时钟前先画一个光标*/
/*绘制表示小时的圆点*/
for(i=0,m=0,h=0;
=11;
i++,h++){
setlinestyle(0,0,4);
//在指针式时钟周围显示数字,使更易读数
circle(x,y,2);
setlinestyle(0,0,1);
x=110*sin((h*60+m)/360*PI)+451;
//在半径的延伸处显示圆点代表的小时
y=200-110*cos((h*60+m)/360*PI);
if(h==0)
{h=12;
charbuffer1[10];
outtextxy(x,y,buffer1);
sprintf(buffer1,"
%d"
h);
outtextxy(x,y,buffer1);
h=0;
//不要忘记将h再次赋值为0
else
//将表示小时的圆点用更大的圆点与画出
/*绘制表示分钟或秒钟的圆点*/
for(i=0,m=0;
=59;
m++,i++){
circle(x,y,1);
/*在电子表的左边打印帮助提示信息*/
setcolor(4);
outtextxy(184,125,"
HELP"
outtextxy(182,125,"
outtextxy(140,185,"
TAB:
Cursormove"