c程序设计实验八.pdf
实验八1实验目的(1)初步学会指针数组的定义与使用方法。(2)了解指向一维数组的指针变量的概念,能用指向一维数组的指针变量按行处理二维数组的问题。(3)理解返回指针值函数的概念、定义格式,学会用返回指针值函数处理字符串问题。(4)理解函数指针与函数指针变量的概念,学会用函数指针变量处理不同函数数学计算问题。2实验要求(1)编写实验程序(2)在 VC+运行环境中,输入源程序;(3)编译运行源程序;(4)输入测试数据进行程序测试;(5)写出实验输入数据与运行结果。3实验内容(1)定义一个二维字符数组 s380及指针数组 p3,用 cin.getline(si,80)输入 3 个字符串到二维数组 3 行中,然后用指针数组 p 对字符串进行降序排列(要求用擂台法),最后用指针数组 p 输出排序后的结果,用字符数组 s 输出排序前的三个字符串。实验数据:Visual C+,Visual Basic,Delphi(2)输入一个二维数组 a33,设计一个函数,用指向一维数组的指针变量和二维数组的行数作为函数的参数,求出平均值、最大值和最小值,并输出。实验数据:10,25,90,80,70,35,65,40,55(3)设计程序,用函数指针变量完成两个操作数的加、减、乘、除、取余运算。实验数据:10+20 10-5 10*15 10 /2 10%3 (4)设计一个用梯形法求定积分的通用函数,被积函数的指针、积分的上限、积分的下限和积分的区间等分数作为函数的参数。分别求出下列定积分的值。dxxxs213)ln(1(1 dxxs412)11(2 dxxxexsx312)sin(13 4解答参考(1)#include#include void main(void)char s380;char*p3=s0,s1,s2;char *pc;int i,j,k;coutInput 3 String:endl;for(i=0;ipi;for(i=0;i2;i+)k=i;for(j=i+1;j3;j+)if(strcmp(pi,pj)0)k=j;if (k!=i)pc=pi;pi=pk;pk=pc;for(i=0;i3;i+)coutpiendl;for(i=0;i3;i+)coutsiendl;程序运行结果:Input 3 String:Visual Basic Visual C+Delphi Visual C+Visual Basic Delphi Visual Basic Visual C+Delphi(3)解:#include int add(int x,int y)return x+y;int sub(int x,int y)return x-y;int mul(int x,int y)return x*y;int div(int x,int y)return x/y;int res(int x,int y)return x%y;void main(void)int x,y;char operate;int(*f)(int,int);coutinput three 0 endendl;coutInput x operate y=xoperatey;switch(operate)case+:f=add;break;case-:f=sub;break;case*:f=mul;break;case/:f=div;break;case%:f=res;break;default:return;coutxoperatey=(*f)(x,y)endl;程序运行结果:input three 0 end Input x operate y=10+20 10+20=30 10-5 10-5=5 10*15 10*15=150 10/2 10/2=5 10%3 10%3=1 0 0 0(3)方法一:用指向一维数组的指针变量和二维数组的行数作为函数的参数#include float ave(float(*p)3,float*max,float*min)float sum=0;int i,j;for(i=0;i3;i+)for(j=0;j3;j+)sum+=(*p)j;if(*max(*p)j)*min=(*p)j;p+;return sum/9;void main(void)float a33,max,min,average;int i,j;coutInput Data:;for(i=0;i3;i+)for(j=0;jaij;max=min=a00;average=ave(a+0,&max,&min);coutave=averagen;coutmax=maxn;coutmin=minn;方法二:用数组名为函数参数,在函数内用指向一维数组的指针变量,求出平均值、最大值和最小值,并输出。解:#include void fun(float a33)float max,min,sum=0,(*p)3;int i,j;max=min=a00;for(i=0;i3;i+)p=a+i;for(j=0;j3;j+)sum+=(*p)j;if(max(*p)j)min=(*p)j;coutave=sum/9nmax=maxnmin=minendl;void main(void)float b33;int i,j;coutInput Data:;for(i=0;i3;i+)for(j=0;jbij;fun(b);程序运行结果:Input Data:10 25 90 80 70 35 65 40 55 ave=52.2222 max=90 min=10(4)分析:由高等数学可知,badxxf)(的定积分值等于由曲线 y=f(x)、直线 x=a、x=b、y=0所围曲边梯形的面积s,如下图所示。现将曲边梯形划分成 n 个小曲边梯形s0、s1、s2、sn-1。每个曲边梯形的高均为 h=(ba)/n,用矩形近似曲边梯形后各曲边梯形的面积近似为:s0=y0*h s1=y1*h s2=y2*h sn-1=yn-1*h s=s0+s1+s2+sn-1=(y0+y1+y2+yn-1)*h=(f(x0)+(f(x1)+f(x2)+f(xn-1)*h x0=a,xn=b,xi=a+i*h 用梯形法求定积分面积的公式为:10)(niihhiafs 其中:a、b 分别为积分的下、上限,n 为积分区间的分隔数,h=(ba)/n,h 为积分步长;f(x)为被积函数。程序编写如下:#include#include float f1(float x)图 用梯形法求定积分面积 y y=f(x)yn-1 y2 yn y1 y0 s0 s1 s2 sn-1 x=a x=b x0 x1 x2 x3 xn-1 xn x return(1+log(x)+x*x*x);float f2(float x)return(1/(1+x*x);float f3(float x)return(x+exp(x)/(1+sin(x)+x*x);float integral(float(*f)(float),float a,float b,int n)float y,h;int i;y=0;h=(b-a)/n;for(i=0;in;i+)y+=f(a+i*h);return(y*h);void main(void)couts1=integral(f1,1,2,1000)endl;couts2=integral(f2,-1,4,1000)endl;couts3=integral(f3,1,3,1000)endl;程序运行结果:s1=5.13245 s2=2.11232 s3=3.31222