C语言课程设计钟表设计_第1页
C语言课程设计钟表设计_第2页
C语言课程设计钟表设计_第3页
C语言课程设计钟表设计_第4页
C语言课程设计钟表设计_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#第一章课程设计的目的和要求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进制,指针式的时钟和数字式的时钟显示的时间同步,且两个时钟所显示的时间与计算机的系统时间一致。输出项数字式时钟输出“%4时%4分%4秒”。算法#define宏定义部分定义变量。利用函数circle(d,b,c)定义圆即表盘及轴心,其中(a,b)为圆心坐标,c为半径。利用函数setbkcolor、setcolor设置颜色。gettime(t)获取电脑时间进行显示sound()、delay()函数设置表针走动声音对应走动刻度。应用c语言库函数进行表盘及颜色的的处理,编写表针运算函数,及表针影像颜色覆盖处理详见程序注释。不论何种指针,每次转动均以n/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键定位需要修改内容的位置,然后通过按光标上移或下移键来修改当前时间。它的主要工作如下:调用digitclock(intx,inty,intclock函数,在数字时钟r指定位置显示时、分、秒,其中digithour(doubleh)、intdigithou「(doubleh)和digitsec(doubles)用于完成数值的型向int型转换。调用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结构类型的数组*/接口#includev>TurbeC中重要的函数库,VisualC++和DevC++都不支持(VC和DEV都支持C项目)Graphics,可怜我上网找了半天终于找到了合适的IDEWinTc本程序中的指针式时钟和数字式时钟的绘制都要靠它的例如:intdriver,mode=0,i,j;driver=DETECT;/*自动检测显示设备*/initgraph(&driver,&mode,"");/*初始化图形系统*/setlinestyle(0,0,3);/*设置当前画线宽度和类型:设置三点宽实线*/setbkcolor(O);/*用调色板设置当前背景颜色*/setcolor(9);/*设置当前画线颜色*/line(82,430,558,430);line(70,62,70,4l8);line(82,50,558,50);line(570,62,570,4l8);line(70,62,570,62);line(76,56,297,56);line(340,56,564,56);/*画主体框架的边直线*/#includev>标准的C的输入输出流函数主要用它来控制字符串的某些操作#includev>数学函数库,一些数学计算的公式的具体实现是放在里。#include<>就是最早黑白界面下的操作使用的一些方法和接口的函数库第四章课程设计心得与体会经过一个半学期对《C课程设计》的学习,我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。通过课程设计,一方面是为了检查我们一个半学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。通过对模拟时钟的设计进一步的巩固了用C编写程序,并且有利于更好的掌握程序设计语言!同时也认识到了结构化语言的不足之处,为我们以后学习面向对象语埋下伏笔。在模拟时钟的编写过程中也体会到了做事情一顶要细心、认真。更加知道了要掌握好基础知识。还有体会到了成功的感觉!通过本项课程设计也培养了我独立思考、综合运用所学有关相应知识的能力,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!C语言是程序员使用率第二高的语言,仅次于面向对象的Java语言,是使用率最高的面向结构的编程语言。它功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。通过这次的程序设计更加了解了语言设计的好处和其可用性!在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过自己的独立思考和同学的帮助终于完成了课程设计!在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!为以后的工作打下良好的知识基础和技能基础!附录:/*电子时钟源代码*/#include<>#include<>#include<>#include<>#include<>#include<>#definePI/*定义常量*/#defineUP0x4800/*上移f键:修改时间*/#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(O);/*规定画线的方式。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*6O+m)/36O*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(count==2){t[0].ti_min++;if(t[0].ti_min==60)t[0].ti_min=0;settime(t);/*设置新的系统时间*/}if(count==3){t[0].ti_sec++;if(t[0].ti_sec==60)t[0].ti_sec=0;settime(t);/*设置新的系统时间*/}}inttimedownchange(intcount)/*处理光标下移的按键*/{if(cou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论