哈工大C语言课程设计.docx
《哈工大C语言课程设计.docx》由会员分享,可在线阅读,更多相关《哈工大C语言课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
哈工大C语言课程设计
HarbinInstituteofTechnology
课程设计说明书(论文)
课程名称:
C语言课程设计
设计题目:
音乐程序与波特图
院系:
航天学院控制科学与工程系
班级:
设计者:
学号:
指导教师:
设计时间:
哈尔滨工业大学教务处
哈尔滨工业大学课程设计任务书
姓名:
院(系):
专业:
班号:
任务起至日期:
年月日至年月日
课程设计题目:
已知技术参数和设计要求:
工作量:
工作计划安排:
同组设计者及分工:
指导教师签字___________________
年月日
教研室主任意见:
教研室主任签字___________________
年月日
*注:
此任务书由课程设计指导教师填写。
题目一
1.1题目详细描述:
播放音乐程序,实现了自选音乐曲目和直接使用键盘弹奏,而且可以在曲目播放结束后循环选择乐曲。
1.2
程序设计思路及流程图:
是
1.3程序清单及注释:
#include
#include
#include
#include
#include
#include
#defineN116
#defineN28
#defineN44
#defineN82
#defineN161
#defineEND0
voidplaymusic(intn,int*c);
voidtypemusic();
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,S=10
};
typedefenumNOTESSONG;
SONGsong1[]={C0,N4+N2,E0,N4,G0,N2,G0,N2,A0,N1,G0,N1,E0,N4+N2,
C0,N4,G0,N1/3,G0,N1/3,G0,N1/3,E0,N1,C0,N1,G10,N1/3,G10,N1/3,
G10,N1/3,G10,N1/3,G10,N1/3,G10,N1/3,C0,N1,END,END};
SONGsong2[]={A0,N2,B0,N2,C1,N1+N2,B0,N2,C1,N1,E1,N1,B0,N1+N1,S,N1,E0,N1,
A0,N1+N2,G0,N2,A0,N1,C1,N1,G0,N1+N1,S,N1,E0,N2,E0,N2,F0,
N1+N2,E0,N2,F0,N1,C0,N1,E0,N1+N1,S,N1,C1,N2,C1,N2,B0,N1+N2,370,
N2,F0,N1,B0,N1,B0,N1+N2,S,N1,A0,N2,B0,N2,C1,N1+N2,B0,N2,C1,N1,
E1,N1,B0,N1+N2,END,END};
intmain()
{
intm,n,c=1;
charb='y';
while(b=='y')
{
printf("Hello,whatdoyouwanttodobythisprogram?
\n");
printf("1.Listentomusic.-------Press1\n");
printf("2.Playmusicbyyourself.-------Press2\n");
scanf("%d",&m);
while(m!
=1&&m!
=2&&m!
=3)/*选择方式*/
{
printf("Youtypedwrong!
Donotpushmearound.:
(\n");
scanf("%d",&m);
}
if(m==1)
{
printf("Ihavetwomusics,chooseone!
(Press1/2)\n");
scanf("%d",&n);
while(n!
=1&&n!
=2)
{
printf("Youtypedwrong!
Donotpushmearound.:
(\n");
scanf("%d",&n);
}
playmusic(n,&c);
}
elseif(m==2)
{
typemusic();
}
getchar();
printf("Doyouwanttocontinue?
(y/n)\n");
scanf("%c",&b);
}
return0;
}
voidplaymusic(intn,int*c)
{
intnote=0,fre,dur,control;
chard;
clock_tgoal;
if(n==1)
{
while(song1[note]!
=END)
{
fre=*c*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;
}
}else
{
while(song2[note]!
=END)
{
fre=*c*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;
}
}
getchar();
printf("Doyouwanttoraise/lowerthefrequency?
Pressr/l\nIfyoudonotwantpressn\n");
scanf("%c",&d);
if(d=='r')
*c*=2;
elseif(d=='l')
*c*=0.5;
elseif(d=='n')
*c=*c;
}
voidtypemusic()
{
charch;
clock_tgoal;
intfre=0,control,dur=2;
printf("Playyourownmusic!
\n(YoucanplayonthekeyboardbypressingZ-M,A-J,Q-U,1-7)\n");
printf("Ifyouareboredpress/\n");
do
{
ch=getch();
if(ch=='/');
else
{
switch(ch)
{
case'z':
fre=C10;break;
case'x':
fre=D10;break;
case'c':
fre=E10;break;
case'v':
fre=F10;break;
case'b':
fre=G10;break;
case'n':
fre=A10;break;
case'm':
fre=B10;break;
case'a':
fre=C0;break;
case's':
fre=D0;break;
case'd':
fre=E0;break;
case'f':
fre=F0;break;
case'g':
fre=G0;break;
case'h':
fre=A0;break;
case'j':
fre=B0;break;
case'q':
fre=C1;break;
case'w':
fre=D1;break;
case'e':
fre=E1;break;
case'r':
fre=F1;break;
case't':
fre=G1;break;
case'y':
fre=A1;break;
case'u':
fre=B1;break;
case'1':
fre=C2;break;
case'2':
fre=D2;break;
case'3':
fre=E2;break;
case'4':
fre=F2;break;
case'5':
fre=G2;break;
case'6':
fre=A2;break;
case'7':
fre=B2;break;
default:
printf("Youtypedwrong!
Donotpushmearound.:
(\n");
}
}
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();/*clock()是计时函数,而与其相关的数据类型是clock_t,返回当前程序占用的CPU时间,用clock()返回的值除于CLOCK_PER_SEC常量可以得到当前程序的运行时间,单位是秒*/
while(goal>clock());
if(dur)
outportb(0x61,control);
}while(ch!
='/');
}
1.4程序运行结果及自评:
1.5程序调试中遇到过的问题及解决办法
在编辑弹奏的程序时,没有弄明白延时函数,无法让按键发声,后来明白了延时函数的原理,把时长设成4,就可以了,还有就是按/时直接退出,后来把if放到前面,就解决了。
题目二
2.1题目详细描述:
2.2
程序设计思路及流程图:
2.3程序清单及注释:
#include
#include
#include
#include
floatdata1(floatk,floatm);
floatdata2(floatk,floatm);
voiddrawpic1();
voiddrawpic2();
voiddrawpic3();
voidh1(floatz,floatx1,intm);
voidh2(floatz,floatx1,intm);
intmain()
{
inta;
charc='y';
while(c=='y')/*重复选择*/
{
printf("G(jw)=1/(1-w^2*T^2+2ζjwT\n");
printf("ChoosetheBodeDiagram:
\n");
printf("1.Magnitude(dB)\n");
printf("2.Phase(deg)\n");
printf("3.Both\n");
scanf("%d",&a);/*选择画图*/
while(a!
=1&&a!
=2&&a!
=3)/*试错*/
{
printf("Donotpushmearound.:
(");
scanf("%d",&a);
}
if(a==1)
drawpic1();/*画第一个*/
elseif(a==2)
drawpic2();/*画第二个*/
else
{
drawpic3();/*画两个*/
}
getch();
closegraph();
clrscr();
getchar();
printf("Doyouwanttocontinue?
(y/n)\n");
scanf("%c%*c",&c);
}
return0;
}
floatdata1(floatk,floatm)/*计算第一个函数*/
{
floats,w;
s=sqrt((1/((1-k*k)*(1-k*k)+4*m*m*k*k)));
w=20*log10(s);
returnw;
}
floatdata2(floatk,floatm)/*第二个*/
{
floats,w,a;
s=-atan(2*m*k/(1-k*k));
w=s*(180/3.1415926);
if(w>0)
w=w-180;
w*=0.8;
returnw;
}
voiddrawpic1()
{
intdriver=DETECT,mode,x00,x11,y00,y11,m,y01,y02,y03;
floatx1,x2,xstep,ystep,k;
charstt[10],str[]="0.1--blue0.3--green0.5--indigo0.7--red0.9--violet";
doublevalue;
initgraph(&driver,&mode,"");
setbkcolor(9);
setcolor(63);
x00=100,y00=60,x11=x00+512,y11=y00+150;
setlinestyle(0,1,1);
rectangle(x00,y00,x11,y11);/*矩形框*/
m=y00+50;
x1=x00;
xstep=(x11-x00)/512;
ystep=(y11-y00)/3;
settextstyle(0,0,1);
for(k=0;k<=4;k++)/*横轴*/
{
value=0.01*pow(10,k);
gcvt(value,3,stt);
outtextxy(x00+xstep*128*k,y11+8,stt);
}
for(k=0;k<=3;k++)/*纵轴*/
{
value=50-50*k;
gcvt(value,3,stt);
outtextxy(x00-35,y00+ystep*k,stt);
}
x00=100,y00=60,x11=x00+512,y01=y00+150;
for(k=0;k<=9;k++)/*优化坐标系,标注刻度*/
{
line(x00+log10(k+1)*(x11-x00)/4,y00,x00+log10(k+1)*(x11-x00)/4,y00+3);
line(x00+log10(k+1)*(x11-x00)/4,y01,x00+log10(k+1)*(x11-x00)/4,y01-3);
line((x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y00,(x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y00+3);
line((x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y01,(x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y01-3);
line((x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y00,(x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y00+3);
line((x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y01,(x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y01-3);
line((x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y00,(x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y00+3);
line((x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y01,(x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y01-3);
}
setcolor
(1);/*画图*/
setlinestyle(0,1,3);
h1(0.1,x1,m);
setcolor
(2);
h1(0.3,x1,m);
setcolor(3);
h1(0.5,x1,m);
setcolor(4);
h1(0.7,x1,m);
setcolor(5);
h1(0.9,x1,m);
setcolor(63);
outtextxy(x00-70,y00-30,str);
}
voiddrawpic2()
{
intdriver=DETECT,mode,x00,x11,y00,y11,m,y01,y02,y03;
floatx1,x2,xstep,ystep,k;
charstt[10],str[]="0.1--blue0.3--green0.5--indigo0.7--red0.9--violet";
doublevalue;
initgraph(&driver,&mode,"");
setbkcolor(9);
setcolor(63);
x00=100,y00=60,x11=x00+512,y11=y00+150;
setlinestyle(0,1,1);
rectangle(x00,y00,x11,y11);
m=y00;
x1=x00;
xstep=(x11-x00)/512;
ystep=(y11-y00)/4;
settextstyle(0,0,1);
for(k=0;k<=4;k++)/*横轴*/
{
value=0.01*pow(10,k);
gcvt(value,3,stt);
outtextxy(x00+xstep*128*k,y11+8,stt);
}
for(k=0;k<=4;k++)/*纵轴*/
{
value=-50*k;
gcvt(value,3,stt);
outtextxy(x00-35,y00+ystep*k,stt);
}
x00=100,y00=60,x11=x00+512,y01=y00+150;
for(k=0;k<=9;k++)/*优化坐标系,标注刻度*/
{
line(x00+log10(k+1)*(x11-x00)/4,y00,x00+log10(k+1)*(x11-x00)/4,y00+3);
line(x00+log10(k+1)*(x11-x00)/4,y01,x00+log10(k+1)*(x11-x00)/4,y01-3);
line((x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y00,(x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y00+3);
line((x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y01,(x11-x00)/4+x00+log10(k+1)*(x11-x00)/4,y01-3);
line((x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y00,(x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y00+3);
line((x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y01,(x11-x00)/4*2+x00+log10(k+1)*(x11-x00)/4,y01-3);
line((x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y00,(x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y00+3);
line((x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y01,(x11-x00)/4*3+x00+log10(k+1)*(x11-x00)/4,y01-3);
}
setcolor
(1);/*画图*/
setlinestyle(0,1,3);
h2(0.1,x1,m);
setcolor
(2);
h2(0.3,x1,m);
setcolor(3);
h2(0.5,x1,m);
setcolor(4);
h2(0.7,x1,m);
setcolor(5);
h2(0.9,x1,m);
setcolor(63);
outtextxy(x00-70,y00-30,str);
}
voiddrawpic3()
{
intd