C语言课程设计钟表设计.docx
《C语言课程设计钟表设计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计钟表设计.docx(19页珍藏版)》请在冰点文库上搜索。
C语言课程设计钟表设计
C程序实践课程设计报告
课题名称:
钟表设计
*************
学号:
1071
专业:
电子信息科学与技术
班级:
信息09-2班
***********
第一章课程设计的目的和要求
1.1C语言课程设计的目的
加深对讲授内容的理解,尤其是一些语法规定。
通过课程设计,自然地、熟练地掌握。
熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。
学会上机调试程序。
通过编程最终使程序运行结果为电脑屏幕显示模拟时钟,并正常运行显示表针时间。
1.2C语言课程设计实现的要求
能模拟机械钟表行走;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;要准确地利用数字显示日期和时间并且可以根据用户的需求更改当前时间(指针式时钟与数字式时钟实现同步更改);数字式时钟的时间显示与指针式时钟显示一致;可以通过上下键改变当前的时、分、秒;改的时间是小时、分钟、还是秒数;通过Tab键切换按Esc时程序退出。
第二章课程设计的任务内容
要熟练掌握C语言的基本知识:
数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。
用C语言实现一个模拟时钟转动程序;Graphics函数库。
提出总体方案的设计思想和原理,绘制程序流程图和描述程序的功能,并说明程序的特点和难点。
能模拟机械钟表行走;要准确地利用数字显示日期和时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致;按任意键时程序退出。
模拟时钟是一种集计时器和时钟显示于一体的程序。
编写一个指针式时钟程序,此程序在屏幕正中有一个指针式钟面,窗口标题以数字方式显示日期和时间。
指针式的时钟表盘为椭圆形或圆形,并且圆周上有分布均匀的12个刻度,刻度要求显示清楚,钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动要求具有规律性,且为顺时针。
数字钟显示时间的格式是年月日时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步,且两个时钟所显示的时间与计算机的系统时间一致。
第三章详细设计说明
程序系统的结构
图功能模块图
3.1.1实验设备及环境:
(软、硬件环境)
WindowsXP操作系统
WinTCIDEC语言开发环境
模块描述
3.2.1指针式时钟
指针式的时钟表盘为圆形,并且圆周上有分布均匀的12个较大刻度和六十个较小的刻度,刻度显示清楚,分别表示小时、分钟和秒数钟面上有长度不相同的指针,即时针、分针、秒针,指针的运动具有规律性,为顺时针。
3.2.2数字式时钟
数字钟显示时间的格式是时分秒,小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步,且两个时钟所显示的时间与计算机的系统时间一致。
输出项
数字式时钟输出“%d时%d分%d秒”。
算法
#define宏定义部分定义变量。
利用函数circle(a,b,c)定义圆即表盘及轴心,其中(a,b)为圆心坐标,c为半径。
利用函数setbkcolor、setcolor设置颜色。
gettime(t)获取电脑时间进行显示sound()、delay()函数设置表针走动声音对应走动刻度。
应用c语言库函数进行表盘及颜色的的处理,编写表针运算函数,及表针影像颜色覆盖处理详见程序注释。
不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。
计算指针端点(x,y)的公式如下:
x=圆心x坐标指针长度*cos(指针方向角)y=圆心y坐标指针长度*sin(指针方向角)注重,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可以跨越圆心,因此一个指针需要计算两个端点。
三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用消息来处理指针的运动。
流程图
图程序流程图
函数说明
绘制小时的圆点:
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<>TurbeC中重要的函数库,VisualC++和DevC++都不支持(VC和DEV都支持C项目)Graphics,可怜我上网找了半天终于找到了合适的IDEWinTc
本程序中的指针式时钟和数字式时钟的绘制都要靠它的
例如:
intdriver,mode=0,i,j;
driver=DETECT;/*自动检测显示设备*/
initgraph(&driver,&mode,"");/*初始化图形系统*/
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<>标准的C的输入输出流函数主要用它来控制字符串的某些操作
3.#include<>数学函数库,一些数学计算的公式的具体实现是放在里。
4.#include<>就是最早黑白界面下的操作使用的一些方法和接口的函数库
第四章课程设计心得与体会
经过一个半学期对《C课程设计》的学习,我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。
通过课程设计,一方面是为了检查我们一个半学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。
通过对模拟时钟的设计进一步的巩固了用C编写程序,并且有利于更好的掌握程序设计语言!
同时也认识到了结构化语言的不足之处,为我们以后学习面向对象语埋下伏笔。
在模拟时钟的编写过程中也体会到了做事情一顶要细心、认真。
更加知道了要掌握好基础知识。
还有体会到了成功的感觉!
通过本项课程设计也培养了我独立思考、综合运用所学有关相应知识的能力,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
C语言是程序员使用率第二高的语言,仅次于面向对象的Java语言,是使用率最高的面向结构的编程语言。
它功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
通过这次的程序设计更加了解了语言设计的好处和其可用性!
在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!
在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!
在设计过程中的一次次设计错误增加了我放弃的想法!
不过经过自己的独立思考和同学的帮助终于完成了课程设计!
在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!
都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!
为以后的工作打下良好的知识基础和技能基础!
附录:
/*电子时钟源代码*/
#include<>
#include<>
#include<>
#include<>
#include<>
#include<>
#definePI/*定义常量*/
#defineUP0x4800/*上移↑键:
修改时间*/
#defineDOWN0x5000/*下移↓键:
修改时间*/
#defineESC0x11b/*ESC键:
退出系统*/
#defineTAB0xf09/*TAB键:
移动光标*/
/*函数声明*/
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结构类型的数组*/
main()
{
intdriver,mode=0,i,j;
driver=DETECT;/*自动检测显示设备*/
initgraph(&driver,&mode,"");/*初始化图形系统*/
errorcode=graphresult()/*为防止图形初始化时发生异常出现错误时将出现有好的提示界面*/
if(errorcode!
=grOk)/*图形初始化时出现错误*/
{
printf("Graphicserror:
%s/n",grapherrormsg(errorcode));
printf("Pressanykeytohalt:
");
getch();
exit
(1);/*returnwitherrorcode*/
}
setlinestyle(0,0,3);/*设置当前画线宽度和类型:
设置四点宽点线线
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;
}
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);/*画主体框架的边直线*/
/*arc(intx,inty,intstangle,intendangle,intradius)*/
arc(82,62,90,180,12);
arc(558,62,0,90,12);
setlinestyle(0,0,3);
arc(82,418,180,279,12);
setlinestyle(0,0,3);
arc(558,418,270,360,12);/*画主体框架的边角弧线*/
setcolor(15);
outtextxy(300,53,"CLOCK");/*显示标题*/
setcolor(7);
rectangle(342,72,560,360);/*画一个矩形,作为时钟的框架*/
setwritemode(0);/*规定画线的方式。
mode=0,则表示画线时将所画位置的原来信息覆盖*/
setcolor(15);
outtextxy(433,75,"CLOCK");/*时钟的标题*/
setcolor(7);
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){
setlinestyle(0,0,3);
circle(i,j,1);/*以(i,y)为圆心,1为半径画圆*/
}
setcolor(15);
line(424,315,424,325);/*在运行电子时钟前先画一个光标*/
/*绘制表示小时的圆点*/
for(i=0,m=0,h=0;i<=11;i++,h++)
{
x=100*sin((h*60+m)/360*PI)+451;
y=200-100*cos((h*60+m)/360*PI);
setlinestyle(0,0,4);i_hour;
m=t[0].ti_min;
x=50*sin((h*60+m)/360*PI)+451;/*时针的x坐标值*/
y=200-50*cos((h*60+m)/360*PI);/*时针的y坐标值*/
line(451,200,x,y);/*在电子表中绘制时针*/
x1=80*sin(m/30*PI)+451;/*分针的x坐标值*/
y1=200-80*cos(m/30*PI);/*分针的y坐标值*/
line(451,200,x1,y1);/*在电子表中绘制分针*/
digitclock(408,318,digithour(h));/*在数字时钟中,显示当前的小时值*/
digitclock(446,318,digitmin(m));/*在数字时钟中,显示当前的分钟值*/
setwritemode
(1);
/*规定画线的方式,如果mode=1,则表示画线时用现在特性的线
与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定
的线进行异或后的结果。
因此,当线的特性不变,进行两次画线操作相当于没有
画线,即在当前位置处清除了原来的画线*/
for(count=2;k!
=ESC;){/*开始循环,直至用户按下ESC键结束循环*/
setcolor(12);/*淡红色*/
sound(500);/*以指定频率打开PC扬声器,这里频率为500Hz*/
delay(700);/*发一个频率为500Hz的音调,维持700毫秒*/
sound(200);/*以指定频率打开PC扬声器,这里频率为200Hz*/
delay(300);
i_sec;
m=t[0].ti_min;
h=t[0].ti_hour;
x2=98*sin(s/30*PI)+451;/*秒针的x坐标值*/
y2=200-98*cos(s/30*PI);/*秒针的y坐标值*/
line(451,200,x2,y2);
/*绘制秒针*/
/*利用此循环,延时一秒*/
while(t[0].ti_sec==s&&t[0].ti_min==m&&t[0].ti_hour==h)
{gettime(t);/*取得系统时间*/
if(bioskey
(1)!
=0){
k=bioskey(0);
count=keyhandle(k,count);
if(count==5)count=1;
}
}
setcolor(15);
digitclock(485,318,digitsec(s)+1);/*数字时钟增加1秒*/
setcolor(12);/*淡红色*/
x2=98*sin(s/30*PI)+451;
y2=200-98*cos(s/30*PI);
line(451,200,x2,y2);
/*用原来的颜色在原来位置处再绘制秒针,以达到清除当前秒针的目的*/
/*分钟处理*/
if(t[0].ti_min!
=m){/*若分钟有变化*/
/*消除当前分针*/
setcolor(15);/*白色*/
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
/*绘制新的分针*/
m=t[0].ti_min;
digitclock(446,318,digitmin(m));/*在数字时钟中显示新的分钟值*/
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
}
/*小时处理*/
if((t[0].ti_hour*60+t[0].ti_min)!
=(h*60+m)){/*若小时数有变化*/
/*消除当前时针*/
setcolor(15);/*白色*/
x=50*sin((h*60+m)/360*PI)+451;/*50:
时钟的长度(单位:
像素),451:
圆心的x坐标值*/
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
/*绘制新的时针*/
h=t[0].ti_hour;
digitclock(408,318,digithour(h));
x=50*sin((h*60+m)/360*PI)+451;
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
}
}
}
intkeyhandle(intkey,intcount)/*键盘控制*/
{switch(key)
{caseUP:
timeupchange(count-1);/*因为count的初始值为2,所以此处减1*/
break;
caseDOWN:
timedownchange(count-1);/*因为count的初始值为2,所以此处减1*/
break;
caseTAB:
setcolor(15);
clearcursor(count);/*清除原来的光标*/
drawcursor(count);/*显示一个新的光标*/
count++;
break;
}
returncount;
}
inttimeupchange(intcount)/*处理光标上移的按键*/
{
if(count==1){
t[0].ti_hour++;
if(t[0].ti_hour==24)t[0].ti_hour=0;
settime(t);/*设置新的系统时间*/
}
if(c