哈工大C语言课程设计说明书.docx
- 文档编号:7490556
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:21
- 大小:258.78KB
哈工大C语言课程设计说明书.docx
《哈工大C语言课程设计说明书.docx》由会员分享,可在线阅读,更多相关《哈工大C语言课程设计说明书.docx(21页珍藏版)》请在冰豆网上搜索。
哈工大C语言课程设计说明书
HarbinInstituteofTechnology
课程设计说明书(论文)
课程名称:
C语言课程设计
设计题目:
音乐、滤波、计时器
院系:
班级:
设计者:
学号:
指导教师:
设计时间:
哈尔滨工业大学教务处
哈尔滨工业大学课程设计任务书
姓名:
院(系):
专业:
班号:
任务起至日期:
课程设计题目:
1.编制音乐程序,曲目自选,不要重复。
2.在数据测量和传输过程中,由于有强干扰或意外情况,可能会丢掉数据或出现有较大误差的数据—奇异项。
应找出奇异项,去掉并补充一个合适的值。
可用预测的方法找出奇异项,最简单的方法是一阶差分法。
根据具体情况确定一个允许误差限M
编写处理奇异项的程序;生成一组包含奇异项的数据,画出曲线;
将数据用处理奇异项程序处理,并画出去除奇异项后数据的曲线。
3.编写计时器。
已知技术参数和设计要求:
一、音乐程序
1.音乐程序可实现按键发声,模拟弹钢琴的过程,并设置乐谱供弹奏。
2选择歌曲播放功能。
3.最后要求有一个简单友好的菜单界面,并具有一定容错能力。
2、滤波程序
1.生成一组包含奇异项的数据,画出曲线;
2.编写处理奇异项的程序,将数据用处理奇异项程序处理
3.画出去除奇异项后数据的曲线。
三、计时器程序
1.要求尽可能设计出较为酷炫的界面。
工作量:
一周
工作计划安排:
1.研究老师给出的例程序,弄清硬件功能,设计音乐程序流程框图与滤波程序流程框图。
2.完成音乐程序的按键发声部分的程序编写以及滤波程序生成奇异项的程序编写。
3.完成音乐程序播放音乐的程序编写以及滤波程序的图形生成的编写。
4.完成音乐程序菜单部分的程序编写以及滤波程序为曲线部分的编写。
5.修改优化及调试程序。
6.加分程序计时器的编写
同组设计者及分工:
单人
指导教师签字___________________
年月日
教研室主任意见:
教研室主任签字___________________
年月日
*注:
此任务书由课程设计指导教师填写。
题目一
1.1题目详细描述:
编制音乐程序,曲目自选,不要重复。
音乐程序可实现有一个简单友好的菜单界面,并具有一定容错能力,进而选择歌曲播放功能,按键发声模拟弹钢琴的过程并设置乐谱供弹奏。
1.2程序设计思路及流程图:
题目要求编写一个程序,包括可以直接弹奏、播放乐谱等功能。
直接弹奏功能初步设计思路是运用BIOS.H头文件中的BIOSKEY函数。
bioskey()的函数原型在bios.h中bioskey()完成直接键盘操作,cmd的值决定执行什么操作。
cmd=0:
当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。
它返回一个16位的二进制数,包括两个不同的值。
。
各键状态存放在返回值的低8位字节中的特性,来检测键盘是否按下以及按下时的键值。
播放乐谱功能初步设计思路是通过设定音调的频率控制speaker发声,而音长控制部分由clock_t()控制时间。
1.3程序清单及注释:
#include
#include
#include
#include
#include
#include
#defineN164
#defineN232
#defineN416
#defineN88
#defineN164
#defineEND0
voidlistenmusic(void);
voidPlaymusic(void);
enumNOTES{
C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,
C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,
C1=523,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,
C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1976,X0=25000,};
/*上面定义音调,下面是两首乐谱*/
typedefenumNOTESSONG;
SONGsong1[]={X0,N4,X0,N4,X0,N8,G10,N8,C0,N8,D0,N8,E0,N4,G10,N4,F0,N8,
E0,N8,D0,N8,C0,N8,B10,N8,B10,N4,G0,N8,G0,N4,G0,N4,C0,N4,
E10,N4,D0,N8,C0,N8,B10,N8,A10,N8,A10,N8,B10,N4,G0,N4,G0,N4,
G0,N4,F10,N4,C0,N4,B10,N8,B10,N8,A10,N8,G10,N4,C0,N4,C0,N4,
C0,N4,F0,N8,E0,N8,F0,N8,E0,N8,F0,N4,E0,N4,D0,N4,D0,N4,D0,N4,
X0,N8,G0,N8,C0,N8,D0,N8,E0,N4,G10,N4,F0,N8,E0,N8,D0,N8,C0,
N8,B10,N8,B10,N8,G0,N8,G0,N4,G0,N4,C0,N4,E10,N4,D0,N8,C0,N8,
B10,N8,A10,N8,A0,N8,G0,N8,G0,N4,X0,N8,C0,N8,A0,N4,F0,N8,E0,N8,
D0,N4,E0,N8,F0,N8,G0,N4,E0,N4,C0,N4,X0,N8,A0,N8,END,END};
SONGsong2[]={G10,N4,F0,N8,E0,N8,E0,N4,E0,N4,E10,N8,D0,N8,B10,N8,C0,N8,C0,N8,
C0,N4,X0,N8,C0,N8,A0,N8,G0,N8,E0,N8,D0,N4,C0,N8,D0,N4,D0,N4,D0,
N4,D0,N4,G10,N4,F0,N8,E0,N8,E0,N8,G0,N4,C0,N8+N16,C0,N8,D0,N8,C0,
N8,C0,N4+N8,G0,N8+N8,A10,N4,F0,N4,E0,N4,G0,N8,E0,N8,D0,N4,D0,N4,
D0,N4,D0,N4,X0,N8,G10,N8,F0,N8,E0,N8,E10,N8,E0,N4,E0,N8,E10,N8,D0,
N8,D0,N8,C0,N8,C0,N8,C0,N4,X0,N8,G10,N8,A0,N8,E0,N8,D0,N4,C0,N8,D0,
N4,D0,N4,D0,N4,D0,N4,D0,N4,F0,N8,E0,N8,E0,N8+N16,F0,N8,A10,N8,B10,N8,
C0,N4,E0,N8,A0,N8,A10,N8,D0,N8,C0,N8,C0,N4,C0,N4,C0,N4,C0,N8+N16,E0,
N8,G0,N8,E0,N8,G0,N8,E0,N8,D0,N8,E0,N4,G0,N8,E0,N8,D0,N8,C0,N8,C0,
N4,C0,N4,C0,N4,X0,N8,A0,N8,A0,N8,G0,N8,E0,N8,G0,N4,E0,N8,D0,N4,D0,
N4,D0,N4,D0,N8,C0,N8,D0,N8,C0,N8,D0,N8,C0,N8,A0,N4,C0,N4,A0,N8,G0,
N8,D0,N8,E0,N8,E0,N8+N16,E0,N8,END,END};
voidmain()
{
inta;
printf("************\n");
printf("****************************************\n");
printf("*************1.listenmusic*************\n");
printf("***********2.playmusic***********\n");
printf("*********3.exit*********\n");
printf("**************\n");
printf("***********************************\n");
printf("******\n");
printf("**\n");
/*菜单界面,以下是选择功能*/
do{
scanf("%d",&a);
if(a==1)
{listenmusic();}
if(a==2)
{printf("youmustwanttoplayasong,sofollowthismusicscore.\n");
printf("************\n");
printf("****************************************\n");
printf("*************tfdddesuaaa*************\n");
printf("***********ahgdsasssstf***********\n");
printf("*********ddgaasaagyfdgd*********\n");
printf("*******sssstjdsassss*******\n");
printf("***********************************\n");
printf("******\n");
printf("**\n");
printf("youcanpressptoexit.\n");
Playmusic();}
if(a==3)
{break;}
else
{printf("***youpresswrong!
tryagain.***\n");
}
}while(a!
=1&&a!
=2&&a!
=3);
}
voidlistenmusic(void)
{
intnote=0,fre,dur,control,m;
clock_tgoal;
printf("************\n");
printf("****************************************\n");
printf("*************1.Leftrighthand*************\n");
printf("***********2.longtimenosee***********\n");
printf("*********3.anypressexit*********\n");
printf("**************\n");
printf("***********************************\n");
printf("******\n");
printf("**\n");
scanf("%d",&m);
if(m==1)
{
while(song1[note]!
=END)
{
fre=song1[note];
dur=song1[note+1];
if(kbhit())break;/*按键退出*/
if(fre)
{/*若频率值fre非0*/
outportb(0x43,0xb6);/*初始化2号定时器*/
fre=(unsigned)(1193180L/fre);
/*计算计数初值*/
outportb(0x42,(char)fre);/*先写计数初值的低8位*/
outportb(0x42,(char)(fre>>8));/*再写计数初值的高8位*/
control=inportb(0x61);/*读0x61的状态*/
outportb(0x61,control|0x03);/*将第0位,第1位置1,使喇叭发声*/
}
goal=(clock_t)dur+clock();/*计算发音时间*/
while(goal>clock());
if(dur)
{
outportb(0x61,control);
note+=2;}
}
}
if(m==2)
{
while(song2[note]!
=END)
{
fre=song2[note];
dur=song2[note+1];
if(kbhit())break;
if(fre)
{/*若频率值fre非0*/
outportb(0x43,0xb6);/*初始化2号定时器*/
fre=(unsigned)(1193180L/fre);
/*计算计数初值*/
outportb(0x42,(char)fre);/*先写计数初值的低8位*/
outportb(0x42,(char)(fre>>8));/*再写计数初值的高8位*/
control=inportb(0x61);/*读0x61的状态*/
outportb(0x61,control|0x03);/*将第0位,第1位置1,使喇叭发声*/
}
goal=(clock_t)dur+clock();
while(goal>clock());
if(dur)
outportb(0x61,control);
note+=2;
}
}
}
voidPlaymusic(void)
{
intfre;
intcontrol;
charc;
do{
c=bioskey(0);
switch(c)
{
case'q':
/*分辨大小写*/
case'Q':
fre=C10;
sound(fre);/*发声*/
delay(100);/*延时*/
nosound();/*静音*/
break;
case'w':
case'W':
fre=D10;
sound(fre);
delay(100);
nosound();
break;
case'e':
case'E':
fre=E10;
sound(fre);
delay(100);
nosound();
break;
case'r':
case'R':
fre=F10;
sound(fre);
delay(100);
nosound();
break;
case't':
case'T':
fre=G10;
sound(fre);
delay(100);
nosound();
break;
case'y':
case'Y':
fre=A10;
sound(fre);
delay(100);
nosound();
break;
case'u':
case'U':
fre=B10;
sound(fre);
delay(100);
nosound();
break;
}
}while(c!
='p'&&c!
='P');/*按下p退出*/
}
1.4程序运行结果及自评:
1.输入1,可通过按键选择播放音乐。
2.输入2,可弹奏钢琴曲。
3.输入3,退出。
自评:
程序基本功能可以实现,但没实现返回菜单界面,尚需优化。
1.5程序调试中遇到过的问题及解决办法
1.无法播放按键对应音符。
解决办法:
用bioskey函数检查按键对应键值,修改二维数组,使之可以播放。
2.乐谱的编写,因之前没学过基本的乐谱知识,无法根据歌曲的简谱编写乐曲,然后去学,发现并不难。
3.如何简便控制发声;sound(以指定频率打开PC扬声器),nosound(关闭PC扬声器),delay函数(将程序的执行暂停一段时间(毫秒))实现钢琴的发声。
4.弹琴时由于输入法的问题可能大小写不能发声;
5.其中还有一些问题,比如两个函数合在一起后变量混乱,以及程序运行过程逻辑错误。
都是慢慢修改。
题目二
2.1题目详细描述:
在数据测量和传输过程中,由于有强干扰或意外情况,可能会丢掉数据或出现有较大误差的数据—奇异项。
应找出奇异项,去掉并补充一个合适的值。
可用预测的方法找出奇异项,最简单的方法是一阶差分法。
根据具体情况确定一个允许误差限M
编写处理奇异项的程序;生成一组包含奇异项的数据,画出曲线;
将数据用处理奇异项程序处理,并画出去除奇异项后数据的曲线。
2.2程序设计思路及流程图:
坐标轴,坐标值和曲线可以图形函数画出;
对于含奇异项的数据组,可用预测的方法找出奇异项,最简单的方法是一阶差分法。
根据具体情况确定一个允许误差限M编写处理奇异项的程序。
2.3程序清单及注释:
#include
#include
#include
#include
#include
voiddatadeal(int*p,inta);
main()
{
intdriver=DETECT,mode,x00,x11,y00,y11,m,j,n,d;
intdata[256],x1,x2,xstep,ystep,k=0;
charstt[10];
doublevalue;
initgraph(&driver,&mode,"");
printf("pleaseintputerrorrange");/*输入误差范围*/
scanf("%d",&j);
srand(time(0));
for(k=0;k<255;k++)/*生成规律的数据*/
{
data[k]=30*log(k+1);
}
/*for(k=0;k<255;k++)
{data[k]=fabs(120*sin(2.0*3.1415926/64.0*k));
}*/
n=rand()%100;/*增加奇异项*/
data[n]=rand()%100;
d=rand()%100;
data[d]=rand()%100;
x00=100,y00=60,x11=x00+512,y11=y00+384;
rectangle(x00,y00,x11,y11);/*画矩形框*/
m=(y00+y11)/2;
line(x00,m,x11,m);/*画中间分界线*/
xstep=(x11-x00)/16;/*单位长度32*/
ystep=(y11-y00)/8;/*单位长度48*/
for(k=0;k<=16;k++)
{
line(x00+xstep*k,y11,x00+xstep*k,y11+5);/*画横坐标刻度线*/
value=xstep*k/2;
gcvt(value,3,stt);
outtextxy(x00+xstep*k-8,y11+8,stt);/*标刻度值*/
}
for(k=0;k<=8;k++)
{
line(x00-5,y00+ystep*k,x00,y00+ystep*k);/*画纵坐标刻度线*/
}
for(k=0;k<=4;k++)
{value=ystep*k/1;
gcvt(value,3,stt);
outtextxy(x00-24,y11-ystep*k-8,stt);/*标刻度值*/
outtextxy(x00-24,m-ystep*k-8,stt);
}
x1=x00;
setcolor
(2);
for(k=0;k<255;k++)
{
x2=x1+2;/*每隔两个分辨率画两点连线*/
line(x1,m-data[k],x2,m-data[k+1]);
x1=x2;}
x1=x00;
datadeal(data,j);/*数据处理及之后显示图像*/
for(k=0;k<255;k++)
{
x2=x1+2;
line(x1,y11-data[k],x2,y11-data[k+1]);
x1=x2;}
getch();
closegraph();
}
voiddatadeal(int*p,inta)/*找奇异项并代换*/
{
intk=0,predict,b=0;
for(k=1;k<255;k++)
{
b=(p[k]-p[k-1]);
predict=p[k]+b;
if(fabs(p[k+1]-predict)>a)
{
p[k+1]=predict;
}
}
}
2.4程序运行结果及自评:
1.可以通过输入数据的变化来改变曲线的形状
2.有奇异项和无奇异项的差别较明显
3.自评:
由于数据已经自行生成,无法从外界输入,误差范围不能设置太小,由于找奇异项的算法有缺漏导致误差范围太小时改奇异项曲线错误。
图形结尾处的多余线无法控制。
2.5程序调试中遇到过的问题及解决办法
1.如何弄出一个有规律一点的含奇异项的数组;先采用数组存入一系列有规律数字,如1-255.在用随机数赋予其中某项随机值成为奇异项;
2.数据输入单调,图形结果只有直线。
采用数学库函数,对数据进行处理使多样化。
题目三
3.1题目详细描述:
采用画图方法做出倒计时计时器。
3.2程序设计思路及流程图:
从10到1分别采用十个图形来显示,图形与图形之间用清屏和延时函数处理,圈圈的渐进效果也由延时函数实现
3.3程序清单及注释:
#include
#include
#include
#include
#include
#definePI3.1415926
intmain()
{
intdriver=DETECT,mode;
/*int,x_hour=200,x_minute=150;*/
initgraph(&driver,&mode,"c:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈工大 语言 课程设计 说明书