C语言程序设计报告刘祥.docx
- 文档编号:24797696
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:40
- 大小:24.94KB
C语言程序设计报告刘祥.docx
《C语言程序设计报告刘祥.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告刘祥.docx(40页珍藏版)》请在冰豆网上搜索。
C语言程序设计报告刘祥
C语言模拟示波器
《C语言程序设计》课程设计
学院名称:
贵州航天职业技术学院
学生姓名:
刘祥
专业班级:
08级计算机网络技术
指导老师:
陈美成
完成日期:
2010年1月10日
一、摘要:
本程序功能相对简单,外观框架也相对简单,用户利用圆形的按钮实现各种功能的简单操作,通过调用小组成员所各自完成的功能函数的调用实现整体程序效果。
针对人类的视觉特点利用重画算法实现各种信号波模拟。
本程序组长刘祥,小组成员王晓水,粟泽清,程远航共同完成。
二、关键字
1,示波器2,振幅3,周期4,调幅
三、正文部分
1、引言:
对于本次课程设计虽然做得不理想,但它的确是我们的第一次所编写的程序,为了这个程序,小组成员付出了很大的努力。
虽然曾经有过要放弃的想法,但是最终还是坚持了下来并完成了该程序。
在本程序中实现了用户使用按钮对各种功能的操作。
同过网络的手段有网络上获得程序所需的字库文件“HZK16”,并在程序中编写简单的函数对字库文件进行操作,因而实现了汉字的正常显示。
通过本次课程设计,使我们更加了解了C语言的重要性,又由其中明白了我们曾经的学习的不足,导致现在做程序出现非常多的漏洞而不能解决。
因此我们要在以后的学习生活中要更加努力,争取能写出更好的程序。
2、算法分析:
(1)运用for循环和if语句的嵌套实现按钮中半径实线按照一定的角度旋转(Q=i/180.0*Pi),
然后通过旋转的度数作为控制参数控制各种波的变化情况。
(2)鼠标的支持这一功能主要使用了中断处理来完成。
(3)汉字显示本身图形模式只能支持点阵汉字,于是我们写了一个函数来获取汉字所对应的汉字字库的点阵(1,0)然后,通过putpixel()将为1点打印使之显示出来。
从而完成汉字的显示问题。
(4)测量功能的实现这一部分功能主要靠点击两个按钮来先选取坐标,而这两个按钮是以文字的形式存在的,并结合坐标变换来实现。
(5)主框架主要实现方法就是:
先分析该界面主要有哪些模块组成,并找出这些模块的共性。
然后,抽象为一个,再通过函数重用,函数递归调用完成整个主界面的打造。
由此页可看出该程序通过各种法对程序源码进行了许多优化。
3技术难点及解决的方案:
难点1:
在对函数进行重调用和各个图形模块的重条用时间很难协调,造成程序的漏洞突出。
解决方法:
在一个循环内部先将画点或画线的颜色设为与背景是相同,接着将上次具有其它颜色的图像用背景颜色所覆盖,马上在后一位置上又画一个与它一样的图形,然后调用系统的一个delay()来延时。
难点2:
主界面各种函数的编写和如何配合其它功能函数的显示与调用。
解决方法:
编写一个能够利用递归的约束条件,通过对各种可能或者限定的条件进行判断,当满足某个条件或者不符合某个条件时执行相应的函数调用或者跳出某个函数。
难点3:
各种波形产生产生函数的编写与调用。
解决方法:
充分利用互联网的优势,多多查阅相关资料,对相应的程序代码进行分析与仿
最终做到能够产生简单的波形。
通过就是应用周期性去完成。
首先,绘出前一个周期的行
状,之后所有图像全由周期性完成。
4、功能框图和程序流程图:
(1),shiboqi.c
开始
Main2();
Graphics();
Ini();
(2)、Function.c
inta=0,b=0,c=0,a_old=0,b_old=0;
c==0
GetMouse(&a,&b,&c);
a<0
b<0
a>getmaxx()-R
b>getmaxy()-R
a!
=a_old||b!
=b_old
putimage(a_old,b_old,ball,0);
a_old=a;b_old=b;
*x=a;*y=b;*z=c;
putpixel(x+8*j+k,y+i,colour);
k++
k<8
k=0
s+=2;
i++
i<16
i=0
qh=*s-0xa0;
printf("Cantopenhzk16!
");
fclose(fp);
*s
(fp=fopen("hzk16","rb"))==NULL
FILE*fp;
unionREGSinregs,outregs;
inti,dr=r/5;
i=0
i<=360
Q=i/180.0*Pi;
i%90==0
setcolor(7);
setcolor(3);
r==30
sprintf(buf,"%d",i);
line(x+r*cos(Q),y+r*sin(Q),x+(r-dr)*cos(Q),y+(r-dr)*sin(Q));
i+=18
r>10
x=(int)(i-left)/scale;
j++
j<=down
j=up
inti,j,x,y;
inti;
i=151
i<=400
i+=8
i=117
i<=370
i+=8
setcolor(3);
Q=i/180.0*Pi;
i%90==0
setcolor
(2);
i+=18
i<=360
i=0
inti,dr=r/8;
inti;
i=130
i<=410
i+=30
hanzi16(200,55,"波型选择",2);
(x-241)*(x-241)+(y2-275)*(y2-275)<=120*120&&(x-241)*(x-241)+(y2-275)*(y2-275)<=120*120
y1=A*sin(2*Pi/T*(x+Dx))+275+Dy;
x+=1
x<=393
x=110
doublex,y1,y2;
inti;
i=151
i<=400
i+=8
i=117
i<=370
i+=8
x>=110+Dx+T/2+i*T&&x<=110+Dx+T+i*T
k=-2*A/(T/2);
k=2*A/(T/2);
k=-2*A/(T/2);
(int)(x+240-(110+Dx))%(int)T==0
(x-241)*(x-241)+(y1-275)*(y1-275)<=120*120&&(x-241)*(x-241)+(y2-275)*(y2-275)<=120*120
x+1>=110+Dx+T/2+i*T&&x+1<=110+Dx+T+i*T
k=2*A/(T/2);
x+1>=110+Dx+i*T&&x+1<110+Dx+T/2+i*T
x>=110+Dx+i*T&&x<110+Dx+T/2+i*T
x++
x<=393
x=110+Dx
inti=0;
flag_net==1
setcolor(0);
delay(200);
x1>=370
x1=x2;
(x1-241)*(x1-241)+(y1-275)*(y1-275)<=120*120&&(x2-241)*(x2-241)+(y2-275)*(y2-275)<=120*120
flag*=-1;
nosound();
!
kbhit()
intx1=110,x2,d,y1=0,y2,flag=1;
inti,j,x,y;
j=up
j<=down
x=(int)(i-left)/scale;
j++
flag_net==1
setcolor(0);
delay(200);
x1>=370
x1=x2;
(x1-241)*(x1-241)+(y1-275)*(y1-275)<=120*120&&(x2-241)*(x2-241)+(y2-275)*(y2-275)<=120*120
flag*=-1;
nosound();
!
kbhit()
intx1=110,x2,d,y1=0,y2,flag=1;
5、主要操作界面:
四,结论:
1、通过各个组员的不懈努力,我们最终将此程序调试完成,在此过程中我们也都曾有过放弃的念头,最终还是坚持了下来,但给程序造成了很大的漏洞。
2、在程序代码的编写过程中遇到了相当大的问题,就连简单的使用中断调用鼠标,波形的产生等等都很难解决,只能利用网络的优势,通过查阅资料,和分析别人所编写的程序代码,一步一步做到现在程序所能表现出的效果。
3、本程序只能简单的模拟示波器功能,对波模拟信号的的操作方面有很大的缺陷,甚至有的地方没有完成。
4、通过本次的课程设计,使我们了解到团队合作的重要性,只有团队成员共同的努力,才能达到共同的目标。
5、本项目的设计用到了许多方面的知识,有的是我们从书本上学不到,这就需要自己去寻找问题的解决方法,每解决一个问题我们就会多一份收获,要不断培养自我学习的能力。
C语言的功能十分强大,在日后的时间里我们也还需花时间深入学习C语言。
6、通过这次课程设计,我看到了自己的许多不足之处,许多知识都没掌握好,自己的编程能力有了提升。
程序设计不是一件容易的事情,要花费大量的精力,无论做什么事情都要有充分的准备,才会事半功倍,编写程序要耐心,细心,才不会犯一些小错误,提高工作效率。
五、本程序数据字典(各函数说明):
#defineR15//半径
#definePi3.1415926//定义∏符号常量
#defineMID_X320//屏幕中点的横坐标
#defineMID_Y275//屏幕中点的纵坐标
#defineMAX_X640//屏幕最大横坐标
#defineMAX_Y480//屏幕最大纵坐标
#defineMIN_X0//屏幕最小横坐标
#defineMIN_Y0//屏幕最小纵坐标
#defineRAND30//知随机数的范围(0-29)
intColor_Wave=2;//波的默认颜色
intcolor[150][150];//用了存要复制的图形各点颜色
intflag_net=0;//是否有网格
voidInit(void)//初始化图形模式
voidOutnumxy(intx,inty,floatvalue)//输出数据
voidGetMouse(int*x,int*y,int*key)//返回鼠标按键
voidVisbileMouse()//显示光标
voidMouse(float*x,float*y,int*z)//返回光标的坐标值
voidhanzi16(intx,inty,char*s,intcolour)//输出汉字
voidDrawxy(intcolor1,intcolor2)//画坐标系
voidSin(floatA,floatT,floatDx,floatDy,intcolor)//画正弦波
voidRECT(floatA,floatT,floatDx,floatDy,intcolor)//画方波
voidANGLE(floatA,floatT,floatDx,floatDy,intcolor)//画三角
voidCIRCLE_BUTTON(intx,inty,intr)//画旋钮
voidCIRCLE_SHOW(intx,inty,intr)//画环
voidWORD(intx,inty,char*ch,intcolor)//也是汉字输出
voidUP(void)//界面上边部分
voidRIGHT(void)//界面右边部分
voidSELF(void)//界面右边部分
voidCLOSE(intx,inty)//画大长方体
voidWAVE_TYPE_MENU(void)//下拉菜单中各种波型
voidDRAW_BG(void)//画背景
voidGET_PICCOLOR(intleft,intup,intright,intdown)//返回要复制的图形各点颜色
voidCOPY_PICXY(intleft,intup,intright,intdown,floatscale)//复制图片
voidINTRUDUCE_MYSELF(void)//自我介绍
voidINTRUDUCE_PRODUCE(void)//示波器介绍
voidBEGIN(void)//产生随机波
voidDOMAMIC_WAVE(void)//动态波
voidMIAN2(void)//类主函数
六、附录(源代码)
#include
#include
#include
#include
#include
#include
#include
#include
voidMIAN2(void);
#defineR15
#definePi3.1415926
#defineMID_X320
#defineMID_Y275
#defineMAX_X640
#defineMAX_Y480
#defineMIN_X0
#defineMIN_Y0
#defineRAND30
intColor_Wave=2;
intcolor[150][150];
intflag_net=0;
voidInit(void)
{
intgd=DETECT,gm=0;
initgraph(&gd,&gm,"");
}
voidOutnumxy(intx,inty,floatvalue)
{
charbuf[20];
sprintf(buf,"%f",value);
outtextxy(x,y,buf);
}
voidGetMouse(int*x,int*y,int*key)
{
unionREGSinregs,outregs;
inregs.x.ax=3;
int86(0x33,&inregs,&outregs);
*x=outregs.x.cx;
*y=outregs.x.dx;
*key=outregs.x.bx;
}
voidVisbileMouse()
{
unionREGSinregs,outregs;
inregs.x.ax=0x01;
int86(0x33,&inregs,&outregs);
}
voidMouse(float*x,float*y,int*z)
{
inta=0,b=0,c=0,a_old=0,b_old=0;
int*ball;
ball=malloc(imagesize(a,b,a+R,b+R));
getimage(a,b,a+R,b+R,ball);
while(c==0)
{
GetMouse(&a,&b,&c);
if(a<0)a=0;
if(b<0)b=0;
if(a>getmaxx()-R)a=getmaxx()-R;
if(b>getmaxy()-R)b=getmaxy()-R;
if(a!
=a_old||b!
=b_old)
{
putimage(a_old,b_old,ball,0);
getimage(a,b,a+R,b+R,ball);
setcolor(15);
setlinestyle(0,0,1);
line(a,b,a+R,b+R/2);
line(a,b,a+R/2,b+R);
line(a+R,b+R/2,a+R/2,b+R);
line(a+R*3/4,b+R*3/4,a+R,b+R);
}
a_old=a;b_old=b;
}
*x=a;*y=b;*z=c;
putimage(a,b,ball,0);
free(ball);
}
voidhanzi16(intx,inty,char*s,intcolour)
{
FILE*fp;
charbuffer[32];
registeri,j,k;
unsignedcharqh,wh;
unsignedlonglocation;
if((fp=fopen("hzk16","rb"))==NULL)
{
printf("Cantopenhzk16!
");
getch();
exit(0);
}
while(*s)
{
qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*32L;
fseek(fp,location,SEEK_SET);
fread(buffer,32,1,fp);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((buffer[i*2+j]>>(7-k))&0x1)!
=NULL)
putpixel(x+8*j+k,y+i,colour);
s+=2;
x+=16;
}
fclose(fp);
}
voidDrawxy(intcolor1,intcolor2)
{
inti;
setcolor(color1);
setlinestyle(0,0,1);
line(110,275,370,275);
line(241,150,241,400);
setcolor(color2);
for(i=151;i<=400;i+=8)
line(238,i,244,i);
for(i=117;i<=370;i+=8)
line(i,272,i,278);
}
voidSin(floatA,floatT,floatDx,floatDy,intcolor)
{
doublex,y1,y2;
if(T==0)
T=0.001;
setcolor(color);
for(x=110;x<=393;x+=0.1)
if(T>0&&A>0)
{
y1=A*sin(2*Pi/T*(x+Dx))+275+Dy;
/*y2=A*sin(2*Pi/T*(x+1+Dx))+275+Dy;*/
if((x-241)*(x-241)+(y1-275)*(y1-275)<=120*120&&(x-241)*(x-241)+(y1-275)*(y1-275)<=120*120)
line(x,y1,x+1,y1+1);
}
}
voidRECT(floatA,floatT,floatDx,floatDy,floatcolor)
{
floati,j,x,y,y1,y2,X,Y,dx=110,dy=275+Dy;
if(T==0)
T=0.001;
setcolor(color);
for(i=0;i<=360;i++)
{
x=(int)i%(int)T;
X=x+(int)(i/T)*T+dx+Dx;
if(X>150&&X<485)
{
if(fabs(x)<10e-1)
{
y1=-A+dy;
y2=A+dy;
if((X-241)*(X-241)+(y1-275)*(y1-275)<=120*120&&(X-241)*(X-241)+(y1-275)*(y1-275)<=120*120&&(X-241)*(X-241)+(y2-275)*(y2-275)<=120*120&&(X-241)*(X-241)+(y2-275)*(y2-275)<=120*120)
line(X,-A+dy,X,A+dy);
/*if(-A+dy<23&&A+dy<250)
line(X,23,X,A+dy);
elseif(-A+dy>23&&A+dy>250)
line(X,-A+dy,X,250);
elseif(-A+dy<23&&A+dy>250)
line(X,23,X,250);
else
line(X,-A+dy,X,A+dy);*/
}
elseif(x>0&&x y=A; elseif(fabs(x-T/2)<10e-1) { y1=-A+dy; y2=A+dy; if((X-241)*(X-241)+(y1-275)*(y1-275)<=120*120&&(X-241)*(X-241)+(y1-275)*(y1-275)<=120*120&&(X-241)*(X-241)+(y2-275)*(y2-275)<=120*120&&(X-241)*(X-241)+(y2-275)*(y2-275)<=120*120) line(X,-A+dy,X,A+dy); /*if(-A+dy<23&&A+dy<250) line(X,23,X,A+dy); elseif(-A+dy>23&&A+dy>250) line(X,-A+dy,X,250); elseif(-A+dy<23&&A+dy>250) line(X,23,X,250); else line(X,-A+dy,X,A+dy);*/ } elseif(x>T/2&&x<=T) y=-A; Y=y+dy; } if((X-241)*(X-241)+(Y-275)*(Y-275)<=120*120&&(X-241)*(X-241)+(Y-275)*(Y-275)<=120*120) line(X,Y,X+1,Y); } } voidANGLE(floatA,floatT,floatDx,floatDy,floatcolor) { floati,x,y,X,dx=110,dy=275+Dy; if(T==0) T=0.001; setcolor(color); for(i=0;i<=400;i++) { x=(int)i%(int)T; if(x>=0&&x y=2*A/T*x-A/2+dy; elseif(x>=T/2&&x<=T) y=-2*A/T*x+3*A/2+dy; X=x+(int)(i/T)*T+dx+Dx; if((X-241)*(X-241)+(y-275)*(y-275)<=120*120&&(X-241)*(X-241)+(y-275)*(y-275)<=120*120) line(X,y,X+1,y+1); } } voidjuchibo(floatA,floatT,floatDx,floatDy,floatcolor) { floati,x,y,X,Y,y1,y2,dx=110,dy=275+Dy; setcolor(color); if((int)T==0) T=0.00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 报告