第十章函数程序设计二.docx
- 文档编号:2164253
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:23
- 大小:23.75KB
第十章函数程序设计二.docx
《第十章函数程序设计二.docx》由会员分享,可在线阅读,更多相关《第十章函数程序设计二.docx(23页珍藏版)》请在冰点文库上搜索。
第十章函数程序设计二
第十章:
函数程序设计
(二)
实验时间:
2009年5月4日实验地点:
实验人:
专业:
班级:
实验题目:
函数程序设计
(二)
实验目的:
掌握递归函数的使用;更好区分各种变量类型。
实验过程:
例子:
例7.6用弦截法求方程x3-5x2+16x-80=0的根。
#include
floatf(floatx)
/*定义f函数,以实现f(x)=x3-5x2+16x-80*/
{floaty;
y=((x-5.0)*x+16.0)*x-80.0;
return(y);
}
floatxpoint(floatx1,floatx2)
/*定义xpoint函数,求出弦与x轴交点*/
{floaty;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return(y);
}
floatroot(floatx1,floatx2)
/*定义root函数,求近似根*/
{inti;
floatx,y,y1;
y1=f(x1);
do
{x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)/*f(x)与f(x1)同符号*/
{y1=y;
x1=x;}
else
x2=x;
}while(fabs(y)>=0.0001);
return(x);
}
main()/*主函数*/
{
floatx1,x2,f1,f2,x;
do
{
printf(“inputx1,x2:
\n”);
scanf(“%f,%f”,&x1,&x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf(“arootofequationis%8.4f”,x);
}
***例7.9hanoi(汉诺)塔问题
voidmove(charx,chary)
{
printf(“%c---->%c\n”,x,y);
}
voidhanoi(intn,charone,chartwo,charthree)
/*将n个盘从one座借助two座,移到three座*/
{
if(n==1)move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
intm;
printf(“inputthenumberofdiskes:
”);
scanf(“%d”,&m);
printf(“Thesteptomoving%3ddiskes:
\n”,m);
hanoi(m,′a′,′b′,′c′);
}
例7.10有两个数组a、b,各有10个元素,将它们对应地逐个相比(即a[0]与b[0]比,a[1]与b[1]比……)。
如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次为不同的值),则认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的次数。
main()
{intlarge(intx,inty);/*函数声明*/
inta[10],b[10],i,n=0,m=0,k=0;
printf(“enterarraya:
\n”);
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
printf(“\n”);
printf(“enterarrayb:
\n”);
for(i=0;i<10;i++)
scanf(“%d”,&b[i]);
printf(“\n”);
for(i=0;i<10;i++)
{if(large(a[i],b[i])==1)n=n+1;
elseif(large(a[i],b[i])==0)m=m+1;
elsek=k+1;}
printf(“a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]
if(n>k)printf(“arrayaislargerthanarrayb\n”);
elseif(n printf(“arrayaissmallerthanarrayb\n”); else printf(“arrayaisequaltoarrayb\n”); } large(intx,inty) {intflag; if(x>y)flag=1; elseif(x elseflag=0; return(flag); } 例7.11有一个一维数组score,内放10个学生成绩,求平均成绩。 floataverage(floatarray[]) {inti; floataver,sum=array[0]; array[2]=array[2]+100; for(i=1;i<10;i++) sum=sum+array[i]; aver=sum/10; return(aver); } main() {floatscore[10],aver; inti; printf(“input10scores: \n”); for(i=0;i<10;i++) scanf(“%f”,&score[i]); printf(“\n”); aver=average(score); printf(“averagescoreis%5.2f”,score[2]); printf(“averagescoreis%5.2f”,aver); } 例7.13 用选择法对数组中10个整数按由小到大排序。 所谓选择法就是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。 共比较9轮。 voidsort(intarray[],intn) {inti,j,k,t; for(i=0;i {k=i; for(j=i+1;j if(array[j] t=array[k]; array[k]=array[i]; array[i]=t;}} main() {inta[10],i; printf(“enterthearray\n”); for(i=0;i<10;i++) scanf(“%d”,&a[i]); sort(a,10); printf(“thesortedarray: \n”); for(i=0;i<10;i++) printf(“%d”,a[i]); printf(“\n”); } 比较: 1)对于n个元素,原汁原味的”冒泡排序”算法要做的比较次数是固定的: (n -1)*n/2次的比较。 交换次数呢? 如果一开始就是排好序的数据,则交换次数为0。 一般情况下为3*(n-1)*n/4;最惨时(逆序)为3* (n-1)*n/2。 2)同冒泡排序一样,选择排序的外层循环要进行n-1次,而内层为n/2次,所以总比较次数为: (n-1)*n/2。 交换次数最好时为: 3*(n-1),最坏时为n^2/4+3*(n-1)。 例7.14有一个3×4的矩阵,求所有元素中的最大值。 解此题的算法是: 先使变量max的初值为矩阵中第一个元素的值,然后将矩阵中各个元素的值与max相比,每次比较后都把”大者”存放在max中,全部元素比较完后,max的值就是所有元素的最大值。 max_value(intarray[][4]) {inti,j,max; max=array[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++) if(array[i][j]>max)max=array[i][j]; return(max); } main() {inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}; printf(“maxvalueis%d\n”,max_value(a)); } 例7.15有一个一维数组,内放10个学生成绩,写一个函数,求出平均分,最高分和最低分。 floatMax=0,Min=0;/*全局变量*/ floataverage(floatarray[],intn)/*定义函数,形参为数组*/ {inti; floataver,sum=array[0]; Max=Min=array[0]; for(i=1;i {if(array[i]>Max)Max=array[i]; elseif(array[i] sum=sum+array[i]; } aver=sum/n; return(aver); } main() {floatave,score[10]; inti; for(i=0;i<10;i++) scanf(“%f”,&score[i]); ave=average(score,10); printf(“max=%6.2f\nmin=%6.2f\naverage=%6.2f\n”,Max,Min,ave); } 例7.16外部变量与局部变量同名。 inta=3,b=5;/*a,b为外部变量*/ max(inta,intb)/*a、b为局部变量*/ {intc; c=a>b? a: b; return(c); } main() {inta=8;/*a为局部变量*/ printf(“%d”,max(a,b)); } 例7.17考察静态局部变量的值。 f(inta) {autointb=0;自动变量当执行第二次时b=0; staticintc=3;静态变量当执行第二次时c=4 b=b+1; c=c+1; return(a+b+c); } main() {inta=2,i; for(i=0;i<3;i++) printf(“%d”,f(a)); } 例7.18打印1到5的阶乘值。 intfac(intn) {staticintf=1; f=f*n; return(f); } main() {inti; for(i=1;i<=5;i++) printf(“%d! =%d\n”,i,fac(i)); } 例7.20用extern声明外部变量,扩展程序文件中的作用域。 intmax(intx,inty)/*定义max函数*/ {intz; z=x>y? x: y; return(z); } main() {externA,B;/*外部变量声明*/即让程序到该程序外去找相应的AB的值 printf(“%d”,max(A,B)); } intA=13,B=-8;*/定义外部变量*/ 例7.21用extern将外部变量作用域扩展到其他文件。 本程序的作用是给定b的值,输入A和m,求A×b和Am的值。 文件file1.c中的内容为: intA;/*定义外部变量*/ main() {intpower(int);/*对调用函数作声明*/ intb=3,c,d,m; printf("enterthenumberaanditspowerm: \n"); scanf("%d%d",&A,&m); c=A*b; printf("%d*%d=%d\n",A,b,c); d=power(m); printf("%d*%d=%d",A,m,d); } 文件file2.c中的内容为: externA;/*声明A为一个已定义的外部变量*/ power(intn); {inti,y=1; for(i=1;i<=n;i++) y*=A; return(y); } 例7.22有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该字符删去。 用外部函数实现。 File1.c(文件1) main() {externenter_string(charstr[80]); externdelete_string(charstr[],charch); externprint_string(charstr[]); charc; charstr[80]; enter_string(str); scanf("%c",&c); delete_string(str,c); print_string(str); } file2.c(文件2) #include enter_string(charstr[80])/*定义外部函数*/ {gets(str);} file3.c(文件3) delete_string(charstr[],charch) {inti,j; for(i=j=0;str[i]! ='\0';i++) if(str[i]! =ch) str[j++]=str[i]; str[j]='\0';} file4.c(文件4) print_string(charstr[]) {printf("%s",str); } 总结: static与extern在单文件程序与多文件程序中的应用。 补充: 选择题 1.若有以下函数定义: intfun() { staticintk=0; return++k; } 以下程序段运行后屏幕输出为(D) inti; for(i=1;i<=5i++) fun(); printf(“%d”,fun());第六次调用 A.0B.1C.5D.6 2.以下程序运行后屏幕输出为(D) #include〈stdio.h〉 inta=2,b=3; intmax(inta,intb) { intc; c=a>b? a: b; return(c); } main() { inta=4; printf(“%d”,max(a,b)); } A.2,3B.2C.3D.4 看程序: 1、关于static,观察运行结果 #include voidfactorial() { staticlongn=1; staticintm=1; printf(“NO.%d%d! is%d\n”,m,m,n); m++; n*=m; } main() { intk=1; while(k++<=10)factorial(); }自增自减运算符比关系运算符高级循环九次 2、关于extern,观察结果 #include main() { autointm=0; doublex=1.001; externinttimes; settimes(); for(;m printf(“x=%f”,x); } inttimes; settimes() { times=10; } 3、关于变量的作用域 #include chara[]=“generala”,b[]=“localb”; main() { voidx(); chara[]=“locala(0)”; x(); printf(“main: %sand%s\n”,a,b);locala(0)localb } voidx() { chara[]=“locala (1)”,c[]=“localc (1)”; { charc[]=“localc (2)”; printf(“%s,%sand%s\n”,a,b,c);locala (1),localb,localc (2) } printf(“x(): %s,%sand%s\n”,a,b,c);locala (1),localb,localc (1) } 4、嵌套调用的例子 #include main() { doublecal_e(intn); intn; printf(“pleaseinputapositivenumber”); scanf(“%d”,&n); printf(“eis%lf\n”,cal_e(n)); } doublecal_e(intn) { doublefac_v(intn); doublee=1; while(n)e+=fac_v(n--);循环语句 return(e); } doublefac_v(intm) { doublev=1.0; while(m)v/=m--;循环语句 return(v); } 5、实参是二维数组名,形参是一维数组 doublefmax(doublearray[],intarrlen) { doublet; inti; t=array[0]; for(i=1;i {printf(“%d,%f\n”,i,array[i]); if(t return(t); } main() {intk; doublea[4][5]={{1,1},{2,2,2},{3,3,3,3},{4,4,4,4,4}}; k=printf(“themaxis%f\n”,fmax(a,20));k? printf(“%d”,k);} 6、实参与形参是数组名 main() { intinverse(charstr[]); charstr[100]; printf(“inputstring: ”); scanf(“%s”,str);abcdestrlen(str)=5 inverse(str); printf(“inversestring: %s\n”,str); } intinverse(charstr[]) { chart; inti,j; for(i=0,j=strlen(str);i {t=str[i]; str[i]=str[j-1]; str[j-1]=t; } } 7、二维数组的应用 voidmain() {inti,j,s=0,l,v[3],a[5][3]; printf(“inputscore\n”); for(i=0;i<3;i++) {for(j=0;j<5;j++) {scanf(“%d”,&a[j][i]);111112222233333 s=s+a[j][i]; } v[i]=s/5;v[0]=1v[1]=2v[2]=3 s=0; } l=(v[0]+v[1]+v[2])/3; printf(“math: %d\nclanguag: %d\ndbase: %d\n”, v[0],v[1],v[2]); printf(“total: %d\n”,l); } 8、利用递归函数,实现如下运算: 1(n=0) f(n,x)=n(n=1) ((2*n-1)*n*f((n-1),x)-(n-1)*f((n-2),x))/n(n>1) 编制程序如下: main() {inti,x,n; floatp(int,int); printf(“\ninputn&x\n”); scanf(“%d%d”,&n,&x); printf(“n=%d,x=%d\n”,n,x); for(i=0;i<=n;i++) printf(“P%d(%d)=%6.2f\n”,i,x,p(i,x)); } floatp(intn,intx) { if(n==0) return (1); elseif(n==1) return(x);此处的x代表主函数中的x elsereturn(((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n); } 第九章预处理命令 选择题: 1.若有定义: #definePI3,则表达式PI*2*2的值为(A) A.12B.4C.3D.不确定 2.以下叙述中,正确的是(A) A、宏展开不占用运行时间,只占用编译时间 B、预编译处理命令行必须以分号结束 C、一个源程序只能有一个预编译处理命令行 D、使用带参数的宏定义时,应该说明每个参数的数据类型 3、以下的叙述中不正确的是(C) A、宏展开不占用运行时间,只占用编译时间 B、宏名无类型 C、宏名必须用大写字母表示 D、预处理命令行都必须以#号开始 4.以下叙述中,正确的是(B) A."#define PRICE=30"定义了30等价的符号常量PRICE B.预编译处理命令行都必须以"#"开头 C.宏名只能是含大写字母和数字字符 D.在程序的一行上可以书写几个有效的宏定义 5.下面程序的输出结果是(C) #include〈stdio.h〉 #defineONE1 #defineTWOONE+1 #defineTHREETWO+1 voidmain() { printf(“%d\n”,THREE-ONE); } A.产生错误,B.1C.2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十 函数 程序设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)