实验4 指针
实验4 指针
一、实验目的
(1)通过实验进一步掌握指针的概念,会定义和使用指针变量;
(2)能够正确使用数组的指针和指向数组的指针变量;
(3)能够正确使用字符串的指针和指向字符串的指针变量;
(4)能正确使用指向函数的指针变量。
二、实验内容
写出实现下述两个问题的程序并调试
(1)将一个3×3的矩阵转置,用一函数实现这一计算(在函数中只能使用指
针变量)。
在主函数中用scanf()函数输入以下矩阵元素:
1 3 5
7 9 11
13 15 17
将数组名作为函数的参数,在执行函数的过程中实现矩阵转置,函数调用结束后,在主程序中输出已转置的矩阵。
(2)用一个函数实现两个字符串的比较,即自己写一个strcmp函数,函数原
型为:
int strcmp(char *p1,char *p2);
?两个串相等时,返回0
?p1>p2时,返回值>0
?p1 三、实验指导 问题1提示: 本题目要求编程实现矩阵的转置,并且在实现这一操作时只能使用指针,因此解决这一问题时,应注意下面几个问题: ?数组名是一个指针变量,但该指针变量是一个常量; ?int a[10]中的a 的类型等同于int *p定义的指针变量p; ?int a[10][5]中定的a的类型等同于int (*p)[5]; 问题2提示: ?字符串本质上就是一个一维字符数组(串尾附加了一个’\0’); ?字符串可用一个指向字符串的字符指针操作; ?串相等是指两串字符个数相等、且每个字符都相等; ?不相等时,以第一对不相等字符的大小决定。 四、预习题 选择题 1.变量的指针,其含义是指该变量的。 A)值B)地址C)名D)一个标志 2.已有定义int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是。 A)k=*ptr1+*ptr2 B)ptr2=k C)ptr1=ptr2 D)k=*ptr1*(*ptr2) 3.若有说明:int *p,m=5,n;以下程序段正确的是。 A)p=&n ; B)p = &n ; scanf(“%d”,&p); scanf(“%d”,*p); C)scanf(“%d”,&n); D)p = &n ; *p=n ; *p = m ; 4.已有变量定义和函数调用语句:int a=25;print_value(&a);下面函数的输出结果是。 void print_value(int *x) { printf(“%d\n”,++*x); } A)23 B)24 C)25 D)26 5.若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项 是。 A)p1=&m; p2=&p1 ; B)p1=&m; p2=&n; *p1=*p2 ; C)p1=&m; p2=p1 ; D)p1=&m; *p1=*p2 ; 6.若有语句:int *p,a=4;和p=&a;下面均代表地址的一组选项是。A)a,p,*&a B)&*a,&a,*p C)*&p,*p,&a D)&a,&*p,p 7.下面判断正确的是。 A)char *a=”china”; 等价于char *a; *a=”china” ; B)char str[10]={“china”}; 等价于char str[10]; str[ ]={“china”;} C)char *s=”china”; 等价于char *s; s=”china” ; D)char c[4]=”abc”,d[4]=”abc”; 等价于char c[4]=d[4]=”abc” ; 8.下面程序段中,for循环的执行次数是。 char *s="\ta\018bc" ; for ( ; *s!='\0' ; s++) printf("*") ; A)9 B)7 C)6 D)5 9.下面能正确进行字符串赋值操作的是。 A)char s[5]={“ABCDE”}; B)char s[5]={‘A’,’B’,’C’,’D’,’E’}; C)char *s ; s=”ABCDE” ; D)char *s; scanf(“%s”,s) ; 10.下面程序段的运行结果是。 char *s=”abcde” ; s+=2 ; printf(“%d”,s); A)cde B)字符’c’ C)字符’c’的地址D)不确定 11.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是。 A)c=*p1+*p2 B)p2=c C)p1=p2 D) c=*p1*(*p2) 12.设有程序段:char s[ ]=”china”; char *p ; p=s ;则下面叙述正确的 是。 A)s和p完全相同 B)数组s中的内容和指针变量p中的内容相等 C)s数组长度和p所指向的字符串长度相等 D)*p与s[0]相等 13.以下与库函数strcpy(char *p1,char *p2)功能不相等的程序段 是。 A)strcpy1(char *p1,char *p2) { while ((*p1++=*p2++)!=’\0’) ; } B)strcpy2(char *p1,char *p2) { while ((*p1=*p2)!=’\0’) { p1++; p2++ } } C)strcpy3(char *p1,char *p2) { while (*p1++=*p2++) ; } D)strcpy4(char *p1,char *p2) { while (*p2) *p1++=*p2++ ; } 14.下面程序段的运行结果是。 char a[ ]=”language” , *p ; p=a ; while (*p!=’u’) { printf(“%c”,*p-32); p++ ; } A)LANGUAGE B)language C)LANG D)langUAGE 15.若有语句:char s1[ ]=”string”,s2[8],*s3,*s4=”string2”;则库函数strcpy的正确调用是。 A)strcpy(s1,”string2”); B)strcpy(s4,”string1”); C)strcpy(s3,”string1”); D)strcpy(s2,s1); 16.以下与库函数strcmp(char *s,char *t)功能相等的程序段 是。 A)strcmp1(char *s,char *t) { for ( ; *s++=*t++; ) if (*s==’\0’) return 0 ; return (*s-*t) ; } B)strcmp2(char *s,char *t) { for ( ; *s++=*t++; ) if (!*s) return 0 ; return (*s-*t) ; } C)strcmp3(char *s,char *t) { for ( ; *t==*s; ) { if (!*t) return 0 ; t++ ; s++ ; } return (*s-*t) ; } D)strcmp4(char *s,char *t) { for ( ; *s==*t; s++, t++ ) if (!*s) return 0 ; return (*t-*s) ; } 17.以下说明不正确的是。 A)char a[10]=”china” ; B)char a[10],*p=a; p=”china”; C)char *a; a=”china” ; D)char a[10],*p; p=a=”china”; 18.设有说明语句:char a[]=”It is mine”;char *p=”It is mine”;则以下不正确的叙述是。 A)a+1表示的是字符t的地址 B)p指向另外的字符串时,字符串的长度不受限制 C)p变量中存放的地址值可以改变 D)a中只能存放10个字符 19.若已定义char s[10];则在下面表达式中不表示s[1]的地址 是。 A)s+1 B)s++ C)&s[0]+1 D)&s[1] 20.若有定义:int a[5],*p=a;则对a数组元素的正确引用是。A)*&a[5] B)a+2 C)*(p+5) D)*(a+2) 21.若有定义:int a[5],*p=a;则对a数组元素地址的正确引用是。A)p+5 B)*a+1 C)&a+1 D)&a[0] 22.若有定义:int a[2][3];则对a数组的第i行第j列元素值的正确引用 是。 A)*(*(a+i)+j) B)(a+i)[j] C)*(a+i+j) D)*(a+i)+j 23.若有定义:int a[2][3];则对a数组的第i行第j列元素地址的正确引用 是。 A)*(a[i]+j) B)(a+i) C)*(a+j) D)a[i]+j 24.若有程序段:int a[2][3],(*p)[3]; p=a;则对a数组元素地址的正确引用 是。 A)*(p+2) B)p[2] C)p[1]+1 D)(p+1)+2 25.若有程序段:int a[2][3],(*p)[3]; p=a;则对a数组元素的正确引用 是。 A)(p+1)[0] B)*(*(p+2)+1) C)*(p[1]+1) D)p[1]+2 26.在C程序中,指针变量能够赋值或 值。 27.在C语言中,数组名是一个不可改变的,不能对它进行 赋值运算。 28.若有定义语句:int a[4]={0,1,2,3},*p;p=&a[1];则++(*p)的值 是。 29.若有定义:int a[2][3]={2,4,6,8,10,12};则*(&a[0][0]+2*2+1)的值 是,*(a[1]+2)的值是。 30若有程序段: int *p[3],a[6],i; for (i=0; i<3; i++) p[i]=&a[2*i] ; 则*p[0]引用的是a数组元素,*(p[1]+1)引用的是a数组元 素。 程序填空题 1.下面函数的功能是从输入的十个字符串中找出最大的那个串,请填(2)空使程序完整。 void fun(char str[10][81],char **sp) { int i; *sp = 【1 】; for (i=1; i<10; i++) if (strlen (*sp) 【2 】; } 2.下面函数的功能是将一个整数字符串转换为一个整数,例如:”-1234”转换为1234,请填(3)空使程序完整。 int chnum(char *p) { int num=0,k,len,j ; len = strlen(p) ; for ( ; 【1 】; p++) { k=【2 】; j=(--len) ; while (【3 】) k=k*10 ; num = num + k ; } return (num); } 3.下面函数的功能统计子串substr在母串str中出现的次数,请填(3)空使程序完整。 int count(char *str, char *substr) { int i,j,k,num=0; for ( i=0; 【1 】; i++) for (【2 】, k=0; substr[k]==str[j]; k++, j++) if (substr [【3 】]==’\0’) { num++ ; break ; } return (num) ; } 4.下面函数的功能是用递归法将一个整数存放到一个字符数组中,存放时按逆序存放,如483存放成“384”,请填(2)空使程序完整。 void convert(char *a, int n) { int i ; *a=【1 】; if ((i=n/10)!=0) convert(【2 】,i); } 5.下面函数的功能是用递归法求数组中的最大值及下标值,请填(2)空使程序完整。 void findmax(int *a,int n,int i,int *pk) { if (i if (a[i]>a[*pk]) 【1 】; findmax(【2 】) ; } } 6.下面函数的功能是将两个字符串s1和s2连接起来,请填(3)空使程序完整。 void conj(char *s1,char *s2) { char *p=s1 ; while (*s1) 【1 】; while (*s2) { *s1=【2 】; s1++,s2++; } *s1=’\0’ ; 【3 】; } 实验名称:龙格反例的数值实验 实验目的与要求: 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 函数的定义与调用(下)