实验4 指针、数组与函数
1.
题目描述:
编写一个程序,可以根据用户输入的不同值,建立不同长度的整型数组。给这个数组赋值,并求其所有元素之和。请填空使程序完整,并在计算机上调试程序,以测试填入的部分是否正确。
代码:
#include
using namespace std;
int main()
{
int n,i,sum=0,*p;
cin>>n; //输入一个整数n
p=new int[n]; //创建一个含有n个整数的整数数组
for(i=0;i cin>>*p; for(i=0;i sum=sum+*(p+i); cout< delete p[]; //删除动态数组p return 0; } 2.普通参数 题目描述:输入日期的年份和月份,求该月有多少天。要求编写函数int daynum(int year,int month),求出以year为年份、以month为月份的某个月的天数。以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。 代码: //通过日期求某月的天数。 #include using namespace std; int main() { int daynum(int year,int month); int y,m,d; cin>>y>>m; if(y<1900 || y>=3000 || m<1 || m>12) { cout<<"输入错误!"< return 0; } d=daynum(y,m); //以y、m作实参调用函数,求出该月的天数 cout<<"此月的天数为"< return 0; } int daynum(int year,int month) { int days; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days=31; break; case 4: case 6: case 9: case 11: days=30; break; case 2: if(year%4==0&&year%100!=0 || year%400==0) days=29; else days=28; break; } return days; } 3.字符数组参数 题目描述:编写一个函数,用来求字符串s的任意子串。函数原型为 void SubString ( char s[ ] , int start , int len , char d[ ] ) ; 其中s是原字符串,d用来存放s中从第start个字符开始(1≤start≤strlen(s) ),长度为len 的子串。以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。 代码: #include using namespace std; int main( ) { void SubString(char s[ ], int start, int len, char d[ ]); char s[81],d[81]; int m,n; gets(s); //输入一个字符串的值存放在字符数组s中,以回车结束 //cout<<"从第m个字符开始(m≥1)取n个字符构成的子串。请依次输入m、n的值:"; cin>>m>>n; if(m>strlen(s) || n>strlen(s) || m+n>strlen(s)+1) { cout<<"m、n值超过了范围!\n"; return 0; } SubString(s,m,n,d); cout< return 0; } //从s中第start个字符开始取出长度为len的子串放入d中 void SubString(char s[ ], int start, int len, char d[ ]) { int k,j; for(j=0,k=start-1;j<=k;j++,k++) d[j]=s[k]; d[len]='\0'; } 4.嵌套调用 题目描述:验证哥德巴赫猜想:对任意输入的正整数n,验证6~n以内的偶数都可分解为两个素数(质数)之和。以下程序中,函数bool divide(int n)是用来将偶数n分解为两个质数的;若分解成功,则返回true;否则返回false。函数bool IsPrime(int m)是用来判断m是否为质数的;若是,则函数返回true;否则返回false。请在计算机上调试以下程序,补足其中的空格。 代码: #include #include using namespace std; int main() { bool divide(int n); int i,n; cin>>n; if(n<6) { cout<<"输入数据出错\n"; return 0; } for(i=6;i<=n;i+=2) if(divide(i)== 0) //对i进行分解,并判断分解是否成功 { cout<<"猜想错误\n"; return 0; } return 0; } bool divide(int n) { bool IsPrime(int n); int i,m; for(i=3;i<=n/2;i++) { if(!IsPrime(i)) continue; m=n-i; if(IsPrime(m)) break; //若m是素数,则分解已成功,结束该循环} if(i>n/2) return false; cout< return true; } bool IsPrime(int m) { int p,i; p=sqrt(m); for(i=2;i<=p;i++) if(m%i==0) return false; return true; } 5. 递归调用 题目描述:用递归方法求n的阶乘n!,递归公式为 1 (n等于0或1) n!= n×(n-1)! (n大于1) 要求编写递归函数int fact(int n); 以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。 代码: #include using namespace std; int main() { int fact(int n); int n,f; //cout<<"请输入整数n(n≥0):"; cin>>n; f=fact(n); cout< return 0; } //求阶乘 int fact(int n) { int f; if(n==0 || n==1) f=1; else f=fact(n-1)*n; return f; } 6. 数组参数 题目标题:统计一组数中的奇数之和 时间限制:1000MS 内存限制:32768KB 题目描述:统计输入的10个整数中所有奇数之和。要求编写函数int oddsum(int array[ ],int num),求出数组array中前num个整数中的奇数之和,并将结果作为函数值返回。要求主函数必须先输出这10个数,再输出求出的奇数之和。 输入描述:输入10个整数。 输出描述:输出其中奇数之和。 样例输入:97 48 23 17 45 59 90 75 49 92 样例输出:365 7. 嵌套调用 题目标题:求两数的最大公约数和最小公倍数。 时间限制:1000MS 内存限制:32768KB 题目描述:求两个正整数的最大公约数和最小公倍数。要求,写一个函数求最大公约数:int GCD(int a,int b),再写一个函数求最小公倍数:int LCM(int a,int b)。其中最大公约数函数GCD的算法:可以参考《实验预习1》中程序填空题5中的算法,也可以使用辗转相除法。最小公倍数函数LCM的算法:a、b的最小公倍数等于a*b/a、b的最大公约数。要求:最小公倍数函数LCM中嵌套调用函数GCD,以求a、b的最大公约数。 输入描述:分别输入2个整数。 输出描述:当输入的数据不是正整数时,显示“ERROR!”;当输入的数据都是正整数时,依次输出最大公约数x和最小公倍数y,两个数据之间用一个空格隔开。 样例输入: 12 18 样例输出: 6 36 8.数组参数 题目标题:字符串中小写字母转换成大写字母 时间限制:1000MS 内存限制:32768KB 题目描述:编写函数int f (char s[ ]),将字符串中所有的小写字母转换成对应的大写字母,其他字符不变,并统计被转换字母的个数,将其作为函数值返回。要求主函数中输入该字符串,最后输出转换后的新字符串,和转换字母的个数。 输入描述:输入一个字符串。 输出描述:两行,第一行输出转换后的新字符串,第二行输出被转换的小写字母个数。 样例输入: ser34GHj 样例输出: SER34GHJ 4 9.指针参数 题目标题:统计字符串中某字符出现的次数 时间限制:1000MS 内存限制:32768KB 题目描述:输入一个字符串s和一个字符ch,统计并输出字符ch在字符串s中出现的总次数。改写要求:编写一个函数,求字符指针p所指向的字符串中,字符ch出现的次数,并将该结果作为函数值返回。函数原型为 int CountChar ( char* p, char ch ) ; 输入描述:输入一个字符串后按回车键,再输入一个字符后回车。(提示:输入字符串用gets(s),s为存放字符串的字符数组) 输出描述:输出为一个正整数,表示字符ch出现的总次数。 样例输入: bb a 样例输出: 实验名称:龙格反例的数值实验 实验目的与要求: 1、了解切比雪夫多项式零点插值; 2、运用切比雪夫多项式零点插值法避免龙格现象。 3、与等距节点构造插值多项式比较。 实验内容: 龙格反例的数值实验 在区间[–5,5 ]上分别取11阶切比雪夫多项式的零点 22 )12(cos 5π+=k x k ( k = 0,1,2,……,10) 和等距节点作插值结点,计算函数211)(x x f +=在结点处的值 y k = f (x k )。构造插值多项式L 10(x ), ∑==10 010)()(k k k y x l x L 其中,∏≠=--=n k j j j k j k x x x x x l 0)()()(。取自变量点 t k = – 5 + 0.05k ( k =0,1,…,201),分别计算切比雪夫零点、等距节点插值多项式L k (x )和被插值函数f (x )在离散点t k ( k =0,1,…,201)上的值,并绘出三条曲线比较。 实验环境与器材: 9#505机房、《数值分析》 实验过程(步骤)或程序代码: function y=Lagrange(x,n,xx,yy) sum=0; %初始化 for k=1:n+1 lk=1; %初始化 for i=1:n+1 if k~=i lk=lk*(x-xx(i))/(xx(k)-xx(i)); end end sum=lk*yy(k)+sum; end y=sum; clc clear for i=1:11 %下标只能从1开始 x1(i)=-5+10*(i-1)/10; x2(i)=5*cos((2*i-1)*pi/22); y1(i)=1/(1+x1(i)*x1(i)); y2(i)=1/(1+x2(i)*x2(i)); %y1,y2分别是在两种节点处得到的函数值 end h=0.05; for k=1:202 x3(k)=-5+(k-1)*h; y11(k)=Lagrange(x3(k),10,x1,y1); y22(k)=Lagrange(x3(k),10,x2,y2); y(k)=1/(1+x3(k)*x3(k)); %y11,y22分别为利用切比雪夫零点和等距节点构造出的插值多项式在离散点处的值 end plot(x3,y11,'r'); hold on plot(x3,y22,'g'); hold on plot(x3,y,'b') %被插值函数在离散点处值的曲线图 hold on xlabel('-5<=x<=5'); ylabel('y'); legend('f(x)=1/(1+x^2)','等距节点插值多项式','切比雪夫多项式零点插值多项式'); xlim([-5,5]) 实验结果与分析: 实验四 MATLAB 程序设计 1.实验目的 (1)熟练掌握MATLAB 的程序流程控制结构。 (2)掌握M 文件的结构,M 函数文件编写、使用。 (3)熟练掌握函数调用和参数传递。 2.实验仪器 (1)Matlab6.5应用软件安装版 一套 (3)PC 机 一台 3. 实验原理 依据MA TLAB 的编程的原理,编写M 函数文件,调用M 函数文件,完成曲线绘制。 4. 实验步骤 (1)利用for 、while 控制语句和sum 指令求和。 (2)使用MA TLAB 函数文件绘图。 (3)利用置换指令绘制脉冲响应曲线. (4)利用feval 指令实现指定的函数。 5. 实验报告内容(选做其中两题) (1)分别用for 和while 循环语句计算∑==630i i 2 K 的程序,再写出一种避免循环的计算程序。 (提示:可考虑利用MA TLAB 的sum (X,n )函数,实现沿数组X 的第n 维求和。)保存为M 文件. (2)将课本例4-8子函数编程及调用演示,三个子图上的圆和多边形绘制在同一坐标系中。并保存为M 文件。保存输出结果图。 (3)利用置换指令subs(X,new),例4-18中的脉冲响应在t=[0,18]的曲线。并保存为M 文件。保存输出结果图。 (4)试利用feval ()指令计算F(x)+F 2(x),其中F 可取‘sin ’、‘cos ’。(提示:先编写以个M 函数function y=trif(F,x)实现F(x)+F 2(x)的计算,在编写调用函数完成F 为‘sin ’、‘cos ’的计算),并保存为M 文件。(指定完成sin(pi/2)+sin(pi/2)^2; cos(pi/3)+cos(pi/3)^2) 实验四 函数文件 1.定义一个函数文件,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数文件。 函数文件: function [e,ln,s,c]=plural(x) e=exp(x); ln=log(x); s=sin(x); c=cos(x); End 命令文件: x=input('请输入一个复数:'); [e,ln,s,c]=plural(x); e ln s c 运行结果: 请输入一个复数:3+4i e = -13.1288 -15.2008i ln = 1.6094 + 0.9273i s = 3.8537 -27.0168i c = -27.0349 - 3.8512i 2.一物理系统可用下列方程组来表示: ? ?????????????=??????????????????????????----g g m m N N a a m m m m 2121212111001cos 000sin 00cos 0sin 0sin cos θθ θθ θθ 从键盘输入m 1、m 2和θ的值,求N a a 121、、和N 2的值。其中g 取9.8,输入 θ时以角度为单位。 函数文件: function [a1,a2,N1,N2]=physis(m1,m2,t) g=9.8; A=[m1*cos(t*pi/180),-m1,-sin(t*pi/180),0;... m1*sin(t*pi/180),0,cos(t*pi/180),0;... 0,m2,-sin(t*pi/180),0;... 0,0,-cos(t*pi/180),1]; B=[0;m1*g;0;m2*g]; 实验四 用窗函数法设计FIR 数字滤波器 实验项目名称:用窗函数法设计FIR 数字滤波器 实验项目性质:验证性实验 所属课程名称:数字信号处理 实验计划学时:2 一. 实验目的 (1)掌握用窗函数法设计FIR 数字滤波器的原理与方法。 (2)熟悉线性相位FIR 数字滤波器的特性。 (3)了解各种窗函数对滤波特性的影响。 二. 实验容和要求 (1) 复习用窗函数法设计FIR 数字滤波器一节容,阅读本实验原理,掌握设计步骤。 (2) 用升余弦窗设计一线性相位低通FIR 数字滤波器,截止频率 rad c 4 π ω= 。窗口长度N =15,33。要求在两种窗口长度情况下,分别求出()n h ,打印出相应的幅频特性和相频特性曲线,观察3dB 带宽和20dB 带宽。总结窗口长度N 对滤波器特性的影响。 设计低通FIR 数字滤波器时,一般以理想低通滤波特性为逼近函数()ωj e H ,即 ()?????≤<≤=-π ωωωωωα ω c c j j d ,,e e H 0 其中2 1 -= N α ()() ()[]() a n a n d e e d e e H n h c j j j j d d c c --= = = ??- -- πωωπ ωπ ωαωω ωαωπ π ωsin 2121 (3) 33=N ,4πω=c ,用四种窗函数设计线性相位低通滤波器,绘制相应的幅频特性曲线,观察3dB 带宽和20dB 带宽以及阻带最小衰减,比较四种窗函数对滤波器特性的影响。 三. 实验主要仪器设备和材料 计算机,MATLAB6.5或以上版本 四. 实验方法、步骤及结果测试 如果所希望的滤波器的理想的频率响应函数为()ωj d e H ,则其对应的单位脉冲响应为 ()()ωπ ω ωπ πd e e H n h j j d d ?- = 21 (4.1) 窗函数设计法的基本原理是用有限长单位脉冲响应序列()n h 逼近 ()n h d 。由于()n h d 往往是无限长序列,而且是非因果的,所以用窗函数() n ω将()n h d 截断,并进行加权处理,得到: ()()()n n h n h d ω= (4.2) ()n h 就作为实际设计的FIR 数字滤波器的单位脉冲响应序列,其频率 响应函数()ωj e H 为 ()()n j N n j e n h e H ωω ∑-==1 (4.3) 式中,N 为所选窗函数()n ω的长度。 我们知道,用窗函数法设计的滤波器性能取决于窗函数()n ω的类型及窗口长度N 的取值。设计过程中,要根据对阻带最小衰减和过渡带宽度的 实验四数组、指针与字符串 1.实验目的 1.学习使用数组 2.学习字符串数据的组织和处理 3.学习标准C++库的使用 4.掌握指针的使用方法 5.练习通过Debug观察指针的内容及其所指的对象的内容 6.联系通过动态内存分配实现动态数组,并体会指针在其中的作用 7.分别使用字符数组和标准C++库练习处理字符串的方法 2.实验要求 1.编写并测试3*3矩阵转置函数,使用数组保存3*3矩阵。 2.使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能。 3.编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。 4.使用string类定义字符串对象,重新实现上一小题。 5.定义一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。Display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性。实现并测试这个类。 6.定义包含5个元素的对象数组,每个元素都是Employee类型的对象。 7. (选做)修改实验4中的选做实验中的people(人员)类。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。其中“出生日期”定义为一个“日期”类内嵌对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。在测试程序中定义people类的对象数组,录入数据并显示。 3.实验内容及实验步骤 1.编写矩阵转置函数,输入参数为3*3整形数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入、输出。程序名:lab6_1.cpp。 2.改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。通过Debug观察指针的内容及其所指的对象中的内容。程序名:lab6_2.cpp。 3.编程实现两字符串的连接。定义字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用cout语句显示输出。程序名:lab6_3.cpp。用cin实现输入,注意,字符串的结束标志是ASCII码0,使用循环语句进行字符串间的字符拷贝。 4.使用string类定义字符串对象,编程实现两字符串的连接。在string类中已重载了运算符“+=”实现字符串的连接,可以使用这个功能。程序名:lab6_4.cpp。 5.在employee.h文件中定义Employee类。Employee类具有姓名、街道地址、城市和邮编等私有数据成员,在成员函数中,构造函数用来初始化所有数据成员;display()中使用cout显示 一、实验项目名称 函数 二、实验目的 1.掌握C函数的定义方法、函数的调用方法、参数说明以及返回值。掌握实参与形参的对应关系以及参数之间的“值传递”的方式;掌握函数的嵌套调用及递归调用的设计方法; 2.掌握全局变量和局部变量、动态变量与静态变量的概念和使用方法; 3.在编程过程中加深理解函数调用的程序设计思想。 三、实验内容 1.多模块的程序设计与调试的方法; 2.函数的定义和调用的方法; 3.用递归方法进行程序设计。 具体内容: 1.编写一个函数primeNum(int num),它的功能是判别一个数是否为素数。如果num 是素数,返回该数;否则返回0值。 要求: (1)在主函数输入一个整数num,调用该函数后,输出num是否是素数的信息。输出格式为:num is prime或num is not prime。 (2)分别输入以下数据:0,1,2,5,9,13,59,121,运行程序并检查结果是否正确。 2.编写函数computNum( int num),它的功能是计算任意输入的一个正整数的各位数字之和,结果由函数返回(例如:输入数据是123,返回值为6)。 要求:num由主函数输入,调用该函数后,在主函数内输出结果。 3.编写函数,mulNum(int a,int b),它的功能是用来确定a和b是否是整数倍的关系。如果a是b的整数倍,则函数返回值为1,否则函数返回值为0。 要求: (1)在主函数中输入一对数据a和b,调用该函数后,输出结果并加以相应的说明。例如:在主函数中输入:10,5 ,则输出:10 is multiple of 5. (2)分别输入下面几组数据进行函数的正确性测试:1与5、5与5、6与2、6与4、20与4、37与9等,并对测试信息加以说明。 4.编写一个计算组合数的函数combinNum(int m,int n)。计算结果由函数返回。 计算组合数的公式是: c(m,n)=m!/(n!*(m-n)!) 要求: (1)从主函数输入m和n的值。对m>n、m 实验4 函数的定义与调用(下) Visual C++控制台应用程序设计 一、实验目的 1、掌握变量的分类、作用域、生存期、存储类别; 2、掌握递归函数的定义以及调用方法; 3、掌握函数的重载。 二、实验内容 Visual C++控制台应用程序设计 要求:(1)自己独立编写出完整程序,注意书写格式,熟练掌握程序的结构; (2)按照正确的步骤进入vc++环境,在自己创建的工程中录入源程序,消除语法错误,编译、连接程序; (3)运行程序,输入数据观察结果。 1、分析并写出下列程序的执行结果。 #include 数值分析实验四(龙格函数)
实验四 MATLAB程序设计
实验4函数文件
实验四 用窗函数法设计FIR数字滤波器
C上机实验报告实验四
C语言实验四实验报告——函数
C++ 实验4 函数的定义与调用(下)