实验六函数 (2学时)
一、实验目的
1.掌握C语言函数的定义、声明以及函数的调用方法。
2.掌握函数实参与形参的对应关系以及主调函数和被调函数之间的“值传递”的方式。3.熟练掌握数组作为函数参数的用法。
4.掌握函数的嵌套调用和递归调用的方法。
5.掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
6.学习对多文件程序的编译和运行。
二、实验重点
1.掌握函数定义、函数调用的方法。
2.掌握函数实参与形参的对应关系以及主调函数和被调函数之间的“值传递”的方式。
三、实验难点
1.掌握函数实参与形参的对应关系以及主调函数和被调函数之间的“值传递”的方式。2.掌握函数的嵌套调用和递归调用的方法。
四、实验内容及步骤
1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。
解题思路:
(1)判断素数的函数名为Prime。
(2)传递参数为int类型的变量。
(3)输出格式为:
* is a prime!或者* is not a prime!(*代表输入的整数)
参考程序如下:
#include
void Prime( int num )
{
int i;
int flag=0;
for( i=2;i { if( num%i==0 ) { flag=1; break; } } if( flag==0 ) printf("%d is a prime!\n",num); else printf("%d is not a prime!\n",num); } void main( ) { int num; printf("Please input a num:"); scanf("%d",&num); Prime(num); } 2.写一个函数,用“冒泡法”对输入的10个整数由小到大排序,并将排序后的结果输出到屏幕上。 解题思路: (1)排序的函数名为Sort。 (2)排序前的输入和排序后的输出都在主函数中完成。 (3)使用数组作为函数参数。 (4)使用“冒泡法”排序。 参考程序如下: #include void Sort( int num[] ) { int i,j; int temp; for( i=0;i<=8;i++ ) { for( j=0;j<9-i;j++ ) { if( num[j]>num[j+1] ) { temp=num[j]; num[j]=num[j+1]; num[j+1]=temp; } } } } void main( ) { int num[10]; int i; printf("Please input 10 numbers:"); for( i=0;i<10;i++ ) scanf("%d",&num[i]); Sort(num); printf("the sorted numbers:"); for( i=0;i<10;i++ ) printf("%d ",num[i]); } 3.写一函数,使给定的一个二维数组(5×5)转置,即行列互换。 解题思路: (1)使用5×5的二维数组存放数据。 (2)矩阵转置的函数名为Turn。 (3)转置前后的输入输出都应在主函数中完成。 (4)使用数组作为函数参数. 参考程序如下: #include void Turn( int num[5][5] ) { int i,j; int temp; for( i=0;i<5;i++ ) { for( j=i;j<5;j++ ) { temp=num[i][j]; num[i][j]=num[j][i]; num[j][i]=temp; } } } void main( ) { int num[5][5]={{1,2,3,4,5},{2,3,4,5,1},{3,4,5,1,2},{4,5,1,2,3},{5,1,2,3,4}}; int i,j; printf("Before array be turned:\n"); for( i=0;i<5;i++ ) { for( j=0;j<5;j++ ) printf("%2d ",num[i][j]); printf("\n"); } Turn(num); printf("After array be turned:\n"); for( i=0;i<5;i++ ) { for( j=0;j<5;j++ ) printf("%2d ",num[i][j]); printf("\n"); } } 4.写一函数,使输入的字符串逆序存放,在主函数中输入和输出字符串。 解题思路: (1)字符串逆序的函数名为Reverse。 (2)逆序前输入和逆序后的输出都应在主函数中完成。 (3)使用数组作为函数参数。 (4)需要使用strlen函数得到字符串长度,需要在源文件头部加入#include #include #include void Reverse( char str[] ) { int length; int i; char temp; length=strlen(str); for( i=0;i { temp=str[i]; str[i]=str[length-1-i]; str[length-1-i]=temp; } } void main( ) { char str[50]; printf("Please input a string:"); scanf("%s",str); Reverse(str); printf("After reversed is %s\n",str); } 5.写一函数,求字符串的长度,并编写主函数。 解题思路: (1)求字符串长度的函数名为:Count (2)可利用字符串结束的标志'\0'来判断字符串是否已经到串尾。 (3)输出格式为:The length of string is *!(*代表字符串的长度)。 (4)使用数组作为函数参数。 参考程序如下: #include int Count( char str[] ) { int i; for( i=1;str[i]!='\0';i++ ); return i; } void main( ) { char str[10]; int length; printf("Please input the string:"); scanf("%s",str); length=Count(str); printf("The length of string is %d!\n",length); } 五、课后作业 1.运行课本中第八章的例8.2,通过此题了解简单的函数定义及程序运行过程。 2.阅读以下程序,分析程序完成的功能,然后上机验证结果。 (1) #include void main( ) { void f(float,float); float x,y; scanf("%f,%f",&x,&y); f(x,y); } void f(float a ,float b) { float c; if(a>b) c=a+b; else c=a-b; printf("%f",c); } 【分析提示】该程序通过函数f,对形式参数为a,b进行相应运算。通过该题目验证自定义函数的定义、调用、参数传递、返回值之间的关系。 请思考:如果将该函数定义为带返回值的类型,该程序应该如何改变? (2) #include void func( ); void main( ) { int x=5,y=0; printf("x=%5d y=%5d \n",x,y); func( ); printf(" x=%5d y=%5d \n",x,y); func( ); } void func( ) { static int x=4; int y=10; x=x+2; y=y+x; printf(" x0=%5d y0=%5d \n",x,y); } 请思考:分析该程序的运行结果并给出简单解释。 3.运行课本第8章中的例8.9,通过此题了解函数的递归调用的原理及应用方法。 4.(选做题)某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求: (1)计算每个学生的总分和平均分。 (2)按总分成绩由高到低排出成绩的名次,若成绩相同,姓名按字典顺序由低到高排出名次。(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分。 (4)任意输入一个学号,能够查找出该学生在班组中的排名及其考试分数。 解题思路:用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。(1)用函数编程实现计算每个学生的总分。 (2)用函数编程实现按总分由高到低对学生成绩排序。注意:排序时,一维数组sum元素的变化应连同二维数组score及一维数组num和aver一起变化。 (3)用函数编程实现查找学号为K的学生在班级中的排名及相关成绩等信息,找不到时返回-1值。 六、总结 1.总结函数的功能。 2.总结模块化程序设计的优点。 3.总结在解题过程中遇到的问题及解决方法。 实验8 函数(一)实验目的: 1、理解自定义函数过程的定义与调用方法; 2、掌握自定义函数的定义与调用方法; 3、理解函数中的参数的作用; 实验内容: 1、编写一函数Fabonacci(n),其中参数n代表第n 次的迭代。While循环 def fib(n): if n==1 or n==2: return 1 a=1 b=1 i=2 while True: c=a+b a=b b=c i+=1 #第i次迭代,也就就是第i个数 if i==n: return c break def main(): n=input("Enter a number of generation:") print fib(n) main() 或者用for循环 def fib(n): a=1 b=1 c=0 if n==1 or n==2: return 1 else: for i in range(3,n+1): c=a+b a=b b=c return c def main(): n=input("enter n:") print fib(n) main() 2、编写一函数Prime(n),对于已知正整数n,判断该数就是否为素数,如果就是素数,返回True,否则返回 False。 def prime(n): if n<2: return False a=0 for i in range(1,n+1): if n%i==0: a+=1 if a>2: return False else: return True def main(): n=input("Enter a number:") print prime(n) main() Or: def prime(n): if n<2: return False if n==2: return True for i in range(2,n): if n%i==0: return False return True def main(): n=input("Enter a number:") print prime(n) main() 上机实验十函数与程序结构 学号姓名 一.目的要求 1.掌握函数声明、定义和调用的基本方法 2.掌握用递归函数解决问题的方法。 3.掌握局部变量与全局变量的作用域区别 4.掌握数组作为函数参数的基本方法。 二.实验内容 【实验题1】 分析如下: Line 2中的变量k是_全局_变量;而Line 10中的k是__局部_变量。程序输出结果是k=1,k=1,k=1 。 如果将第10行改为“static int k=1;变量,程序输出结果是k=1,k=2,k=1 。 如果将第10行改为“k=1; ”,该k变量,程序输出结果是k=1,k=1,k=2 。 如果将第10行改为空语句“; ”后,,程序输出结果是k=1,k=2,k=3 。 【实验题2】程序填空:输入一个整数n (1≤n≤10),再输入n个整数,将它们按升序排列后输出。 程序分析_选择法: (1)由于n最大是10,需要定义一个长度为10的整型数组a; (2)整个排序只需要确定前n-1个元素(a[0] ~a[n-2]),最后一个元素a[n-1]无需另外处理; (3)在确定a[i](i=0,1,…,n-2)时,先将a[i]本身看成最小,即令k=i, 并将a[k]与后面的元素a[j](j=i+1, i+2, …, n-1)一一比较, 如果a[j]< a[k],则更新k的值:k =j。找出对应于下标i的最小元素a[k]后,交换a[i]与a[k]。(4)上述排序算法的代码: 运行程序,输入n: 5,输入5个整数:23 -9 14 0 -3,显示结果为: 如果是按从大到小的降序排列,语句行Line 13 应改为:if(a[k]> a[j] ) k=j; [思考题]程序填空: 将上述的程序用函数调用的方式去实现。定义一个sort()函数来实现数组的排序;在main()函数中调用sort()函数来实现数组的排序,并将结果输出。 实验6过程、函数和程序包 姓名:学号: 专业:班级: 同组人:无实验日期:2013/7/21 【实验目的与要求】 ?掌握过程的创建与调用 ?掌握PL/SQL函数的编写与调用 ?熟悉程序包的使用 【实验内容与步骤】 6.0.实验准备工作:PL/SQL程序文件的编辑与执行 1.使用文档编辑器编辑以下文件,并保存为aa.sql: 2.以scott身份登录,在SQ L Plus中执行@aa命令运行程序: 注:测试时,文件名请用全名(即包含路径,如:@c:\aa) 给出运行结果: 6.1.存储过程 1.最简单的存储过程编写与执行 (1)创建测试表 drop table Exam_Table; create table Exam_Table( e_id number(5), e_name varchar2(20), e_salary number(8,2) ); (2)创建存储过程 create or replace procedure insert_salary (v_id number,v_name varchar2,v_salary number) is begin insert into Exam_Table values (v_id,v_name,v_salary); commit; dbms_output.put_line('数据插入成功'); end; / (3) 执行(调用)存储过程 exec insert_salary(6,'g',2000); (4)查询执行结果 select * from Exam_Table; 给出执行的最后结果: 2.参数的使用:in/out/in out参数 阅读以下程序,理解不同类型参数使用的不同,运行程序,给出运行结果。 (1) 用两个参数:in ,out 传入一个姓名,输出:某某人你好: create or replace procedure mp(v_in varchar2,v_out out varchar2) is begin v_out:=v_in||'你好'; end; declare v_name varchar2(10); begin mp('scott',v_name); dbms_output.put_line(v_name); end;--输出:scott你好 给出运行结果: 实验项目:函数的应用 实验目的: (1)掌握函数的定义和调用方法 (2)练习重载函数的使用 (3)练习使用系统函数 (4)使用debug调试功能,使用step into追踪到函数内部。 实验任务: 1.编写重载函数MAX1可分别求取两个整数,三个整数,两个双精度,三个双精度数的最大值。 2.用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。 实验步骤: 1.分别编写四个同名的函数max1,实现函数重载,在main()中测试函数功能。 int max1(int x, int y) { return (x>y?x:y); } int max1(int x, int y, int z) { int temp1=max1(x,y); return (y>z?y:z); } double max1(double x, double y) { return (x>y?x:y); } double max1(double x, double y, double z) { double temp1=max1(x,y); return (y>z?y:z); } void main() { int x1, x2; double d1, d2; x1 = max1(5,6); x2 = max1(2,3,4); d1 = max1(2.1, 5.6); d2 = max1(12.3, 3.4, 7.8); cout << "x1=" < C语言程序设计实验教学(7) 【实验目的】函数是C程序的基本组成部分,学习函数的设计和调用是很重要的。实验目的是掌握函数的定义、变量的作用域和函数的调用。 【实验要求】实际应用程序通常是由多个函数构成的,要求将常见的功能模块用函数形式实现,并学会在主函数或其他函数中调用定义的函数。要学会函数声明。 【实验课时】6.0 【实验内容】 编写函数fun(n),n为三位自然数,判断n是否为水仙花数,是返回1,否返回0。编写main 函数,输入一个数num,调用fun(num)函数,并输出函数的返回值。 #include "stdio.h" int fun(int n) {int a,b,c; a=n%10; b=n/10%10; c=n/100; if(a*a*a+b*b*b+c*c*c==n) return(1); else return(0);} main() {int num; scanf("%d",&num); while(num<100||num>=1000) {printf("please enter the num again! (num>=100&&num<1000) \n"); scanf("%d",&num);} if(fun(num)==1) printf(" yes \n"); else printf(" no \n");} 编写函数ss(n), 判断n是否为素数,是返回1,否返回0。编写main函数,输入一个数num,调用ss(num)函数,并输出函数的返回值。 #include "stdio.h" int ss(int n) {int i; for(i=2;i 实验二函数的应用 一、实验目的 1、掌握函数的定义和调用方法。 2、掌握函数实参与形参的对应关系。 3、掌握函数嵌套调用和递归调用的方法。 二、实验内容与步骤 1、写一个判断素数的函数,在主函数中输入一个整数,输出是否是素数的信息。 2、编写重载函数Max可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。 3、递归函数与非递归函数。 编写一个函数,求从n个不同的数中取r个数的所有选择的个数。其个数值为:n! C r n= r!*(n-r)! 其中:n!=n*(n-1)*(n-2)* (1) 要求: (1)分别用递归和非递归两种方式完成程序设计; (2)主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入0 0时,程序结束; (3)能检查输入数据的合法性,要求n>=1并且n>=r; (4)注意整数能存放的数据范围有限,如何解决? 提示: (1)可以用double数据类型来存放函数的计算结果。 (2)递归结束条件: 如果r=0,则C(n,r)=1; 如果r=1, 则C(n,r)=n。 测试数据: 输入:5 3 输出:10 输入:10 20 输出:Iput Invalid1 输出:50 3 输出:19600 输入:0 0 程序结束 思考问题: (1)对各种数据类型的字长是否有了新的认识? (2)递归函数的书写要点是什么? (3)递归和非递归函数各有哪些好处? 4、求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数,用另一个函 数求最小公倍数。 要求: 两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后再和两个整数一起作为实参传递给函数2,以求出最小公倍数,再返回到主函数输出最大公约数和最小公倍数。 实验6 函数 班级:学号: 姓名:日期: 一、实验目的 (1)掌握定义函数的方法; (2)掌握函数实参与形参的对应关系,以及“值传递”的方式; (3)掌握函数的嵌套调用和递归调用的方法; (4)掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法; (5)学习对多文件的程序编译和运行。 二、实验内容 1.阅读下面程序,写出程序运行结果,并且上机进行验证。 (1)a1.cpp 变量的虚实耦合,实现的是值传递,是单向传递 #include "stdio.h" int swap(int a,int b) { int c,s; c=a; a=b; b=c; s=a+b; return s; } void main() { int a,b,s; a=3;b=4; s=swap(a,b); printf("a=%d b=%d s=%d\n",a,b,s); } (2)a2.cpp 将十进制数26的各位数字相乘 #include "stdio.h" int fun(int num) { int k=1; do { k*=num %10; / num/=10; }while(num); return(k); } void main() { int n=26; printf("%d\n",fun(n)); } (3)a3.cpp 变量的作用域,当在函数内定义了与全局变量同名的局部变量时,全局变量被屏蔽#include "stdio.h" int a=3,b=5,c; void f(int b) { c=a+b; printf("%d %d %d\n",a,b,c); } void main() { int a=8; f(3); printf("%d %d %d\n",a,b,c); } (4)a4.cpp 递归,将十进制11转换为二进制 #include "stdio.h" void dtob(int n) { int i; 实验六 高层绘图操作 实验目的: 1. 掌握绘制二维图形的常用函数 2. 掌握绘制三维图形的常用函数 3. 掌握绘制图形的辅助操作 实验内容: 1. 1. 设x x x y cos 2^1sin 35.0????? ? ++=,在π 2~ 0=x 区间取101点,绘制函数曲 线。 x=0:pi/100:2*pi; y=(0.5+3*sin(x)./(1+x..^2)).*cos(x); plot(x,y); 2. 已知2 1x y = ,)2cos(2x y =,213y y y ?=,完成下列操作: (1) 在同一坐标系下用不同的颜色和线型绘制三条曲线。 (2) 以子图形式绘制三条曲线。 (3) 分别用条形图、阶梯图、杆图和填充图绘制三条曲线。 (1).在同一坐标系下用不同的颜色和线型绘制三条曲线。 x=0:pi/1000:2*pi; y1=x.^2; y2=cos(2*x); y3=y1.*y2; plot(x,y1,'r',x,y2,'b-.',x,y3,'k--'); (2). 以子图形式绘制三条曲线。 x=0:pi/10:2*pi; y1=x.^2; subplot(2,2,1);plot(x,y1,'r'); title('y1=x^2'); y2=cos(2*x); subplot(2,2,2);plot(x,y2,'b-.'); title('y2=cos(2*x)'); y3=y1.*y2; subplot(2,2,3);plot(x,y3,'k--'); title('y3=y1.*y2'); (3). 分别用条形图、阶梯图、杆图和填充图绘制三条曲线。x=0:pi/10:2*pi; y1=x.^2; subplot(2,2,1);bar(x,y1,'r'); title('y1=x^2'); subplot(2,2,2);stairs(x,y1,'r'); title('y1=x^2'); subplot(2,2,3);stem(x,y1,'r'); title('y1=x^2'); subplot(2,2,4);fill(x,y1,'r'); 实验4 函数的应用 【实验目的】 1掌握函数声明、定义和调用的方法; 2了解函数调用的实参与形参的传递,以及参数默认值的设置。 3掌握重载函数的实现方法。 4理解递归和嵌套函数的概念、定义与调用。 【实验内容】 ⒈分别输入整数半径和实数半径,使用函数重载计算圆的面积。 #include ⒊编写程序,求)! (!!m n m n C m n -= #include Matlab 课后实验题答案 实验一 MATLAB 运算基础 1. 先求下列表达式的值,然后显示MATLAB 工作空间的使用情况并保存全部变量。 (1) 0 12 2sin851z e =+ (2) 221 ln(1)2z x x = ++,其中2120.45 5i x +??=??-?? (3) 0.30.330.3sin(0.3)ln , 3.0, 2.9,,2.9,3.022a a e e a z a a --+= ++=-- (4) 22 42011 122123t t z t t t t t ?≤=-≤?-+≤ ,其中t =0:0.5:2.5 解: M 文件: z1=2*sin(85*pi/180)/(1+exp(2)) x=[2 1+2*i;-.45 5]; z2=1/2*log(x+sqrt(1+x^2)) a=-3.0:0.1:3.0; z3=(exp(0.3.*a)-exp(-0.3.*a))./2.*sin(a+0.3)+log((0.3+a)./2) t=0:0.5:2.5; z4=(t>=0&t<1).*(t.^2)+(t>=1&t<2).*(t.^2-1)+(t>=2&t<3) .*(t.^2-2*t+1) 2. 已知: 1234413134787,2033657327A B --???? ????==???? ????-???? 求下列表达式的值: (1) A+6*B 和A-B+I (其中I 为单位矩阵) (2) A*B 和A.*B (3) A^3和A.^3 (4) A/B 及B\A (5) [A,B]和[A([1,3],:);B^2] 解: M 文件: A=[12 34 -4;34 7 87;3 65 7];B=[1 3 -1;2 0 3;3 -2 7]; A+6.*B A-B+eye(3) A*B A.*B A^3 A.^3 A/B B\A [A,B] [A([1,3],:);B^2] 3. 设有矩阵A 和B 1234 53 166789101769,11 121314150 23416171819209 7021222324254 1311A B ???? ????-??? ?????==-??? ? ???????????? (1) 求它们的乘积C 。 (2) 将矩阵C 的右下角3×2子矩阵赋给D 。 (3) 查看MATLAB 工作空间的使用情况。 解:. 运算结果: E=(reshape(1:1:25,5,5))';F=[3 0 16;17 -6 9;0 23 -4;9 7 0;4 13 11]; C= E*F H=C(3:5,2:3) C = 93 150 77 实验十函数应用 一?实验目的 1.掌握函数的定义和调用; 2.理解形参和实参的使用和传值调用; 3.理解函数声明的使用; 4.掌握函数的嵌套调用; 5.了解函数的嵌套与递归调用,掌握递归函数的编写规律; 6.了解数组元素、数组名作函数参数。 二?实验学时数 2学时 三?实验步骤 (一)阅读程序 1.#include x=x-y; printf("%d,%d\n",x,y); 3.#include 实验八函数 【目的与要求】 1.掌握C语言函数的定义方法、函数的声明及函数的调用方法。 2.了解主调函数和被调函数之间的参数传递方式。 【上机内容】 【一般示例】 【例1】将打印18个"*"组成星形线定义为一个返回值和形参列表都为空的函数,通过主函数调用它。 #include #include 数学实验练习六:函数 一、1)写一个 MATLAB 函数 piFun01.m 来计算下列级数: f(n) = 4*(1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...) 其中 n 为函数的输入,代表上述级数的项数,级数和 f(n) 则是函数的输出。 解:function f=pifun01(n) f=0; for i=1:n f=f+4*(-1)^(i+1)/(2*i-1); end >> piFun01(100000) ans = 3.1416 2)使用 tic 和 toc 指令来测量 piFun01(100000) 的计算时间。如果你不知道如何使用这两个指令,请使用 help tic 及 help toc 来查出它们的用法。我的旧计算机是 Pentium 450MHz,所得的计算时间约为 2 秒。请说明你的计算机规格以及其计算时间。 解:function f=pifun01(n) tic f=0; for i=1:n f=f+4*(-1)^(i+1)/(2*i-1); end f=toc 二、写一个 MATLAB 的递归函数 fibo.m 来计算 Fibonacci 数列, 其定义如下: fibo(n+2) = fibo(n+1)+fibo(n) 此数列的启始条件如下: fibo(1) = 0, fibo(2) = 1. a) fibo(25) 的返回的值是多少? 解:function f=fibo(n) if n==1 f=0; elseif n==2 f=1; else f=fibo(n-1)+fibo(n-2); end >> clear >> fibo(25) ans = 46368 b)使用 tic 和 toc 指令来测量 fibo(25) 的计算时间。我的计 算机是 Pentium 2GHz,所得的计算时间约为 3.35 秒。请说明你的计算机规格以及其计算时间。 解: function f=fibo(n) tic if n==1 f=0; elseif n==2 f=1; else f=fibo(n-1)+fibo(n-2); end 课程名称:结构化程序设计与C语言开课实验室:年月日 一、实验目的 用C语言编写和调试函数的程序。从而对函数的定义、调用、全局变量的灵活运用有比较深入的了解。 二、内容及结果 1、程序一素数函数 1)程序要求:写一个判断是否是素数的函数,在主函数输入一个整数,调用它后输出结果。2)代码: #include return 1; } int main() { int prime(int n); int n; printf("Please enter n:"); scanf("%d\n",&n); if(prime(n)==1) printf("%d is a prime number",int(n)); else printf("%d is not a prime number",int(n)); } 3)运行截图: 2、程序二用递归方法求n阶勒让德多项式的值 1)程序要求: 递归公式为: 当n=0,= ) (x P n 1 当n=1, = ) (x P n x; 当n>=1, = ) (x P n((2n-1)x-P n-1(x)-(n-1)P n-2 )x))/n 2)代码: #include #include 实验六 用窗函数法设计 FIR 滤波器 一、实验目的 (1) 掌握用窗函数法设计FIR 数字滤波器的原理和方法。 (2) 熟悉线性相位FIR 数字滤波器特性。 (3) 了解各种窗函数对滤波特性的影响。 二、实验原理 滤波器的理想频率响应函数为H d (e j ω ),则其对应的单位脉冲响应为: h d (n) = ?-π π ωωωπ d e e H n j j d )(21 窗函数设计法的基本原理是用有限长单位脉冲响应序列h(n)逼h d (n)。由于h d (n)往往是无 限长序列,且是非因果的,所以用窗函数。w(n)将h d (n)截断,并进行加权处理: h(n) = h d (n) w(n) h(n)就作为实际设计的FIR 数字滤波器的单位脉冲响应序列,其频率响应函数H(e j ω )为: H(e j ω ) = ∑-=-1 )(N n n j e n h ω 如果要求线性相位特性,则h (n )还必须满足: )1()(n N h n h --±= 可根据具体情况选择h(n)的长度及对称性。 用窗函数法设计的滤波器性能取决于窗函数w(n)的类型及窗口长度N 的取值。设计过程中,要根据对阻带最小衰减和过渡带宽度的要求选择合适的窗函数类型和窗口长度N 。 三、实验步骤 1. 写出理想低通滤波器的传输函数和单位脉冲响应。 2. 写出用四种窗函数设计的滤波器的单位脉冲响应。 3. 用窗函数法设计一个线性相位FIR 低通滤波器,用理想低通滤波器作为逼近滤波器,截止频率ωc =π/4 rad ,选择窗函数的长度N =15,33两种情况。要求在两种窗口长度下,分别求出h(n),打印出相应的幅频特性和相频特性曲线,观察3dB 带宽和阻带衰减; 4 用其它窗函数(汉宁窗(升余弦窗)、哈明窗(改进的升余弦窗)、布莱克曼窗) 设计该滤波器,要求同1;比较四种窗函数对滤波器特性的影响。 四、实验用MATLAB 函数 可以调用MATLAB 工具箱函数fir1实现本实验所要求的线性相位FIR-DF 的设计,调用一维快速傅立叶变换函数fft 来计算滤波器的频率响应函数。 C++语言程序设计实验答案-函数的应用 实验03函数的应用(2学时) (第3章函数) 一、实验目的 (1) 掌握函数的定义和调用方法。 (2) 练习重载函数的使用。 (3) 练习使用系统函数。 (4) 学习使用Visual Studio 2010的调试功能,使用“逐语句”追踪到函数内部。 二、实验任务 3_1(习题3-8)编写一个函数把华氏温度转换为摄氏温度,转换公式为:C=(F-32)*5/9。 3_2 编写重载函数Max1可分别求取2个整数、3个整数、2个双精度数、3个双精度数的最大值。 3_3 使用系统函数pow(x, y)计算x y的值,注意包含头文件cmath。 3_4(习题3-13)用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。 三、实验步骤 1.(编程,习题3-8)把华氏温度转换为摄氏温度。 编写函数float Convert(float TempFer),参数和返回值都为float类型,实现算法 C=(F-32)*5/9,在main()函数中实现输入、输出。程序名:lab3_1.cpp。 ★程序及运行结果:(注意:定义的函数头是float Convert(float TempFer)) //lab3_1(习题3-8) #include 度的值是"< 实验六 函数 一、实验目的 1.掌握自定义函数的一般结构及定义函数的方法。 2.掌握形参、实参、函数原型等重要概念。 3.掌握函数声明、函数调用的一般方法。 4. 了解函数的嵌套调用以及函数的递归调用的格式。 二、实验预习 1 .理解为什么要在程序中引入函数?函数的引入对程序的整体结构有什么样的影响? 2. 函数的定义格式,理解函数的类型说明符根据什么来确定? 3. 充分理解函数实参和形参的联系和区别,掌握单向值传递的意义。 4. 了解针对不同返回类型的函数返回值的应用,尤其是有无return 语句的区别。 5. 掌握函数调用与函数声明的格式,了解什么情况下需要进行函数声明?什么情况下不需要? 6. 了解函数嵌套调用和递归调用的原理及使用原则。 三、实验内容 (一)阅读并调试下列程序,根据要求给出程序结果。 1.求三角形面积函数。 ⑴ 编程分析 ① 设三角形边长为a 、b 、c ,面积area 的算法是s=(a+b+c)/2, area=))()((c s b s a s s --- ,其中 显然,要计算三角形面积,需要用到三个参数,面积函数的返回值的数据类型应为实型。 ② 尽管main()函数可以出现在程序的任何位置,但为了方便程序阅读,通常将主函数放在程序的开始位置,并在它之前集中进行自定义函数的原型声明。 ⑵ 参考程序 /* 定义和使用求三角形面积函数的程序 */ #include "math.h" #include "stdio.h" float area(float,float,float); /*函数的声明*/ void main() { float a,b,c; printf("请输入三角形的三个边长值:\n") scanf("%f,%f,%f",&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a&&a>0.0&&b>0.0&&c>0.0) printf("Area=%-7.2f\n",area(a,b,c)); /* 以下是计算任意三角形面积的函数 */ float area(float a,float b,float c) { float s,area_s; s=(a+b+c)/2.0; 实验三 函数的应用(2学时) 一、实验目的 1.掌握函数的定义和调用方法。 2.练习重载函数的使用。 3.练习函数模板的使用。 4.练习使用系统函数。 5.学习使用VC++的debug调试功能,使用step into追踪到函数内部。 二、实验任务 1.编写一个函数把华氏温度转换为摄氏温度,转换公式为..C=(F一32)*5/9。 2.编写重载函数Maxl可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。 3.使用重载函数模板重新实现上小题中的函数Maxl。 4.使用系统函数pow(X,y)计算芷的值,注意包含头文件math·h。 5.用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。 三、实验步骤 1.编写函数float Convert(float TempFer),参数和返回值都为float类型,实现算法C=(F一32)*5/9,在main()函数中实现输入、输出。程序名:lab3_1.cpp。 2.分别编写四个同名函数maxl,实现函数重载,在main()函数中测试函数功能。程序名:lab3_2.cpp。 3.使用函数模板实现求任意类型数的最大值,针对不同的参数个数,编写两个同名 函数模板maxl,其参数个数不同,实现函数重载,在main()函数中测试函数功能。程序名:lab3_3.cpp。 4.在main()函数中提示输入两个整数x、y,使用cin语句得到x、y的值,调用 pow(x,y)函数计算x的Y次幂的结果,再显示出来。程序名.1ab3_4.cpp。 5.编写递归函数int fib(int n),在主程序中输入n的值,调用fib函数计算 Fibonacci级数。公式为fib(n)=fib(n一1)+fib(n一2),n>2;fib(1)=fib(2)=1。 使用if语句判断函数的出口,在程序中用cout语句输出提示信息。程序名: lab3_5.cpp。 6.使用debug中的Step Into追踪到函数内部,观察函数的调用过程,参考程序 如下: //lab3_5 #include 实验六自定义函数 实验目的:熟悉Matlab自定义函数的定义和调用方法 实验内容: 2. 编写程序,在主程序中提示用户输入一组数字,编写子程序文件 find_div2.m找出能被2整除的数字,find_max_min.m找出输入数字中的最大值和最小值之和,find_averag求出输入数字的平均值,sort_number对数字进行排序,在主程序中调用子程序并且把上述结果输出。例如输入的数字为1,2,3,4,5,要求输出格式为:输入数字中能被2整除的数为:2,4 输入数字中最大值与最小值之和为:5+1=6 输入数字的平均值为:3 输入数字从大到小排序为:5,4 3,2,1 主程序: clear,clc s=input('请输入一组数字:','s'); x=str2num(s); find_div2(x); find_max_min(x); find_averag(x); sort_number(x); 子程序: function find_div2(x) b=length(x); for i=1:b A(i)=x(i); end c=find(rem(A,2)==0); A=A(c); disp(['输入数字中能被2整除的数为:',num2str(A)]) 子程序: function find_max_min(x) a=max(x); b=min(x); c=a+b; disp(['输入数字中最大值与最小值之和为:',num2str(a),'+',num2str(b),'=',num2str(c) 子程序: function find_averag(x) a=mean(x); disp(['输入数字的平均值为: ',num2str(a)]) 子程序: f unction sort_number(x) a=sort(x); b=fliplr(a); disp(['输入数字从大到小排序为:',num2str(b)]) 1. 编一个带有函数的程序。在main() 函数中输入一个字符串(长度<20),调用函数fun 将该字符串中的所有字符按ASCII 码升序排序,然后再输出排序后的字符串。例如,输入edcba,则应输出abcde.。 #include <> #include <> int main() { void fun(char x[],int y); int i; char c[20]; printf("Please input chars:\n"); gets(c); i=strlen(c); fun(c,i); return 0; } void fun(char x[],int y) { int i,j; char c; for(i=0;i 2. 下面程序的功能是依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串;(如:abcd123efg456变为123456)。 修改该程序,要求将红色部分用一个函数来实现。 #i nclude "" mai n() { char s[15]; int i,j; scan f("%s",s); for (i=0,j=0; s[i]!='\0'; i++) { s[j]=s[i]; j++; } s[j]='\0'; printf("\nThe result:"); prin tf("%s",s); } #in clude <> int main() { void fun(char x[]); char s[15]; printf("Input chars to fill s[15]:\n"); scanf("%s",s);Python 实验8 函数1
浙师大 C语言 实验10函数2+答案
实验6+过程_函数和程序...
实验2:函数的应用
实验(7)-函数-参考答案
实验二 函数的应用
实验6函数习题及答案
实验六 高层绘图操作答案
实验4-1 函数的应用的答案
MATLAB程序设计及应用(第二版)课后实验答案
实验十函数应用答案
实验八 函数含答案
matlab 实验6 函数及其调用
C语言:函数的应用实验报告
实验六、用窗函数法设计FIR滤波器分析解析
C++语言程序设计实验答案-函数的应用
实验六 函数
实验三 函数的应用
实验六 自定义函数
实验答案--函数