第6章函数实验_第1页
第6章函数实验_第2页
第6章函数实验_第3页
第6章函数实验_第4页
第6章函数实验_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 函数实验本章概要c语言函数的应用学习目标掌握c函数的功能、应用及编写认知函数的定义变量的作用域与生存期能力函数的定义与调用函数的参数传递函数的嵌套调用和递归调用变量的存储类别学习中的难点数组名字作函数参数函数的递归调用时程序的执行顺序静态变量在程序中的作用本章涉及的英语词汇英文词汇中文名function函数function prototype函数原型parameter参数variable scope变量作用域global variable全局变量local variable局部变量static storage class静态存储类型auto storage class动态存储类型6.1

2、实验目的1掌握函数定义的方法。2 掌握函数实参与形参的对应关系,以及“值传递”的方式。3 了解函数的嵌套调用和递归调用的方法。4 了解全局变量和局部变量、动态变量、静态变量的概念和使用方法。6.2实验内容 6.2.1函数程序设计1改错题(1)下列程序的功能为:求三角形面积,请纠正程序中存在的错误,使程序实现其功能,程序以文件名sy6_1.c存盘。#include math.h #include stdio.harea(float,float,float); void main()float a,b,c;printf(请输入三角形的三个边长值:n); scanf(%f%f%f,a,b,c); i

3、f(a+bc&a+cb&b+ca) printf(area=%fn,area(a,b,c); area(float a,float b,float c) float s,area_s; s=(a+b+c)/2.0; area_s=sqrt(s*(s-a)*(s-b)*(s-c);return(area_s);(2)下列程序的功能为:输入n个-100100间的整数,输入数据不对则重输,并计算其中的正整数之和,请纠正程序中存在的错误,使程序实现其功能,程序以文件名sy6_2.c存盘。#include#define n 10int sum(int x,int n) int i=0,s=0; whil

4、e (i0) s=s+xi; i+; return s; void main()int i=0,s,an,flag=1; do printf(enter %d numbers (-100=n=100) n,i+1); scanf(%d,&ai); while(flag) if(-100=ai)&(ai=100) flag=1; else printf(data wrong! again input.n); printf(%dn, ai); scanf(%d,&ai); i+; while (in); s=sum(a,n); printf( sum=%dn,s);(3)下列程序的功能为:求整数n

5、的阶乘,请纠正程序中存在的错误,使程序实现其功能,程序以文件名sy6_3.c存盘。#includeint fun(int n)static int p=1; p=p*n; return p;void main()int n,i; int f=0; printf(input member: ); scanf(%d,&n); for(i=1;i=n;i+) f=f*fun(i); printf(%d!=%dn,n,f);2程序填空(1)下列程序的功能为:输出如下图形, 请填写适当的符号或语句,使程序实现其功能,程序以文件名sy6_4.c存盘。 1 222 33333 4444444 5555555

6、55 66666666666 7777777777777 66666666666 555555555 4444444 33333 222 1#includevoid a(int i)int j,k; for(j=1;j=30-i;j+) printf(%c, ); for(k=1;k= ;k+) printf( ); printf(n);void main() int i; for(i=1;i=1;i-) ; (2)下列程序的功能为:编一判断质数的函数,验证歌德巴赫猜想:任何大于2的偶数均可表示为两个素数的和。例如:4=2+2(特例,仅此一个),6=3+3,8=3+5,。程序要求输入任一偶数,

7、输出6到该数范围内的各个满足条件的组合。请填写适当的符号或语句,使程序实现其功能,程序以文件名sy6_5.c存盘。#include stdio.h int isprime(int m) /判别m是否为质数 for(int i=2;m%i!=0;i+); return ( ); void main() int n,x,a,b; scanf(%d,&x); for(n=6;n=x;n+=2) for(a=3;a=n/2;a+=2)if( ) b=n-a; if( ) printf(“%d=%d+%d”,n,a,b); ; /退出a循环,判别下一个n的组合 (3)下列程序的功能为:用梯形法求积分:分

8、析:n等分积分区间a,b,每一个小梯型的面积和即近似为f(x)在a,b的积分值。即将求积分转化求和。 图6-1请填写适当的符号或语句,使程序实现其功能,程序以文件名sy6_6.c存盘。#include stdio.h#include math.hdouble f(double x) return ;double integral(double a,double b,int n) int sum;double h=(b-a)/n; sum=(f(a)+f(b)/2; int x=a+h; for(int i=1;i=n) if(n=n)num+;return;elsezou(n+1);zou(n

9、+2);zou(n+3);main()printf(ninput n:);scanf(%d,&n);zou(0);printf(%dn,num);getch();diy 修改范例源程序,使其能输出每一种走法的轨迹。范例2用递归算法绘制图6-2所示的图形。 图6-2#includevoid circle6(float, float, float, int, float, float);void main() int gmode,gdriver=detect,i; float ra = 2, rb = 3.3; initgraph(&gdriver,&gmode,c:tc); circle6(32

10、0, 240, 80, 0, ra, rb); getch(); closegraph();void circle6(float x, float y, float r, int z, float ra, float rb) float dx, dy; int i; circle(x, y, r); if(r 5) return; for(i = 0; i y?x:y;return(z);a. 3 b. 2.8 c. 2 d. 1【分析】 max函数定义时没有加类型说明符,默认函数值的类型为整形,虽然与return语句中表达式的值(实型)不一致,以函数类型为准,即为整形,把实型转换为整型(即2

11、.8转换为2)。因此本题的正确答案为c。4 下面关于函数调用的说法不正确的是 。a. 函数可以嵌套调用b. 函数可以调用自身,形成递归调用c. 在主调函数中对被调用的函数作声明是必须的d. 如果调用无参函数,则实参可以没有,但是括号不能省略【分析】在主调函数中对被调用函数作声明不是必须的,例如:当被调用函数定义在主调函数之前,就不需要声明。因此本题的正确答案为c。5下面程序的运行结果为 。f(int x,int y)int m;if (xy) m=x-y;if (x=y) m=y-x;return(m);main()int i=5;int c;c=f(i+,i-);printf(%d,c);

12、a. -1 b. 0 c. 2 d. 1【分析】 f(i+,i-)等价于f(5,6)。因此本题的正确答案为d。6 下面程序的运行结果是 。void swap(int x,int y)int t; t=x;x=y;y=t;printf(%d,%d ,x,y); main() int a=1,b=2; swap(a,b);printf(%d,%dn,a,b); a. 1,2 1,2 b. 2,1 1,2 c. 2,1 2,1 d. 1,2 2,1【分析】此题考核了函数调用的过程中,实参变量对形参变量的数据传递是单向传递的,故而在swap函数中形参x和y的值发生了变化,但是实际参数a和b的值并未变化

13、。因此本题的正确答案为b。7 已知如下函数add及float s5,avg; 语句不正确。float add(float array,int n)int i;float sum;sum=0;for (i=0;in;i+)sum=sum+arrayi;return(sum);a. printf(%7.2f,add(s,3);b. printf(%7.2f,add(s,5);c. printf(%7.2f,add(s,5);d. avg=add(s,5)/5;【分析】此题考核了数组作为函数参数。因此本题的正确答案为c。8 执行下列程序,运行结果为 。int p=1,q=5;int f1(int a

14、)p=p+q;return(a+p);int f2(int a)p=a*2;return(p);main()int c;c=f1(f2(3);printf(f1(f2(3)=%d,p=%d,q=%d,c,p,q);a. f1(f2(3)=12,p=6,q=5 b. f1(f2(3)=12,p=1,q=5c. f1(f2(3)=17,p=11,q=5 d. f1(f2(3)=17,p=6,q=5【分析】此题考核了全局变量和局部变量的概念,难点在于求p 的值,p和q是全局变量,在调用函数f2和f1后,p的值都会发生变化,依次为6、11。因此本题的正确答案为c。9 将上题中的f2函数做如下修改,则运

15、行结果为 。int f2(int a)int p;p=a*2;return(p);a. f1(f2(3)=12,p=6,q=5 b. f1(f2(3)=12,p=1,q=5c. f1(f2(3)=17,p=11,q=5 d. f1(f2(3)=17,p=6,q=5【分析】此题与上题的不同之处在于,在函数f2中定义了p,这样全局变量p在函数f2中就不起作用了,f2中的p就是只在f2中有效的局部变量了。 因此本题的正确答案为a。10 下面关于局部变量和全局变量的说法正确的是 。a. 在main函数中定义的变量是全局变量b. 在任何函数中定义的变量都是局部变量c. 所有的全局变量都是在程序运行期间根

16、据需要动态分配存储空间的d. 所有的局部变量都是在程序运行期间根据需要动态分配存储空间的【分析】答案a不正确,在main中定义的变量也是局部变量,c不对,全局变量是静态存储方式,d不正确,局部变量有些是动态存储方式,有些是静态存储方式,如用static声明的局部变量就是静态存储方式。因此本题的正确答案为b。11 程序运行结果是 。f(int a)static int c=5;c+;return(a+c);main()int i;for (i=0;i=2;i+)printf(%d ,f(i);a. 6 6 6 b. 6 7 8 c. 8 8 8 d. 6 8 10【分析】此题考核了静态变量的概念

17、,函数f中静态变量c,在每次函数调用结束后,它并不释放,依然保留着上次调用函数结束时的值。因此本题的正确答案为d。12c语言规定,函数返回值的类型是由 。a return语句中的表达式类型所决定b 调用函数时的主调函数类型所决定c 调用函数时系统临时决定d 在定义该函数时所指定的函数类型所决定【分析】函数返回值通常是指通过函数调用而使主调函数能得到的一个确定的值,是通过函数中的return语句获得的,值的类型应当在定义函数时指定,在c语言中,凡不加类型说明的函数,自动按整型处理。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类

18、型决定返回值的类型。所以,正确答案为:d。13该程序的执行结果是 #include stdio.hfunc(int a,int b) static int m=0,i=2; i+=m+1; m=i+a+b; return (m);main() int k=4,m=1,p; p=func(k,m); printf(%d,p); p=func(k,m); printf(,%dn,p);a8,15b8,16c8,17d8,8 分析 fun函数中的m和i都是静态变量,在整个程序运行期间,静态局部变量占据着永久性的存储单元,即使退出函数以后,下次再进入改函数时,静态局部变量仍使用原来的存储单元。第1次调

19、用时m置初值0,i置初值2,退出该函数时m和i不会释放存储空间,以后再调用func时,不再给m和i置初值,直接使用它们以前的结果。所以本题答案为:c14有以下程序 #include stdio.h#include string.hmain() char a7=a00a00; int i,j; i=sizeof(a); j=strlen(a); printf(%d %dn,i,j); 程序运行后的输出结果是_。a2 2b7 6c7 2d6 2【分析】数组的字节大小=数组元素个数*字符类型的字节数;数组a包含了7个字符,故sizeof函数求出的大小为7个字节,而表示字符串的数组长度以碰到的第一个0

20、作为结束符,题目中strlen(a)求出的长度不包含字符0,故求出结果为2。【答案】c15以下程序的输出结果是_。 #include stdio.h main() int i, k, a10, p3; k5; for(i0;i10;i+) ai=i; for(i0;i3;i+) pi=ai*(i+1); for(i0;i3;i+) k+=pi*2; printf(%dn,k);a20b21c22d23【分析】for(i0;i=ap&pn) _(1)_; for (i=p-1; in; i+) (2) ; return (n-1) ;3以下程序的作用是_。void inv(int x,int n

21、) int temp,i,j,m=(n-1)/2; for (i=0;i=m;i+) j=n-1-i; temp=xi; xi=xj; xj=temp; return; main() int i,a10=3,7,9,11,0,6,7,5,4,2; printf( the original array : n); for (i=0;i10;i+) printf(%5d,ai); printf(n); inv(a,10); printf( the current array : n); for (i=0;i10;i+) printf(%5d,ai); printf(n);4运行下列程序,其输出结果

22、为 。# define max 10int amax, i ;sub1 ( ) for (i=0; imax; i+) ai=i+i ;sub2 ( ) int amax, i ,max ; max=5; for (i=0; imax; i+) ai=i ;sub3 (int a ) int i ; for (i=0; imax; i+) printf(%d ,ai); printf(n);main ( ) sub1( ); sub3(a); sub2( ); sub3(a);5运行下列程序,其输出结果为 。 void prtlist( int n ) if ( n = 0 ) printf(

23、 %d , n ); else printf( %d , n ); prtlist( n-1 ); printf( %d , n ); prtlist( n-1 ); main() prtlist(2);6运行下列程序,其输出结果为 。 #include int run(int a) printf(%d, %dn, a0, a1); if(a0=1) return a1+run(a+2); else if(a0=2) return -a1+run(a+2); else return 0; main() int a=1, 100, 2, 30, 1, 50, 0, 0; printf(resul

24、t=%dn, run(a); 7运行下列程序,其输出结果为 。int a=4; int f(int n) int t=0; static int a=5; if(n%2) int a=6; t+=a+; else int a=7 ;t+=a+; return t+a+; main() int s=a,i=0; for(;i2;i+) s+=f(i); printf (“%dn”,s); 8下面程序中的函数f功能是:有三个参数,依次为整型数组a,数组容量n和待查数据x;函数从数组的a0到an-1中查找x,若找到则返回该元素的下标值,否则返回-1。请纠正程序中存在的错误(程序中有3处错误),使程序

25、实现其功能。#1 main()#2 int b=1,2,3,4,5,6,7,8,9,10;#3 printf(%dn,f(b,10,5); #4 f(int a,n,x)#5 int k;#6 for (k=1;k=n;k+)#7 if (ak=x) return k;#8 else return (-1); 9下面程序中的递归函数f(n)功能是:求下列级数的前n项之和:2+4+6+2n(n为正整数)。请纠正程序中存在的错误(程序中有4处错误),使程序实现其功能。#1 int f(int n)#2 if (n=1) return 2;#3 else return f(2*n); #4 main

26、()#5 long sum;#6 int n;#7 scanf(%d,n);#8 sum=f(2*n);#9 printf(sum=%ldn,sum); 10编写一个程序实现如下功能:调用名为tj的函数,求一个二维数组中正数、负数的代数和,以及零的个数。11编写一个程序实现如下功能:调用一个名为gm的函数,函数道实现简单的加密。加密方法如下:先定义一张字母加密对照表:原字母 a b c d e i k , w加密后字母 d w k , i a b c e 将需要加密的一行文字输入加密程序,程序根据加密表中的对应关系,可以简单地将输入的文字加密输出,对于表中未出现的字符则不加密12编写程序验证以

27、下说法:输入一个4位数,该数四个位置上的数码不全相等,由这4个数码组成最大数和最小数,它俩相减,得新4位数。反复作以上运算,最后总是得6174。 要求如下(下面的函数名为建议函数名):用函数 int isnumberequal(int number) 检查输入的整数number各数码是否不全相等,全相等返回值为1否则为0; 用函数(void ntos (int number, int c) )把四位数整数number各位数码分存到数组c 用函数( void sort (int a )对4个元素的数组a排序(升序或降序都可以); 由输入整数分解排序后的数组得到最大值和最小值:int getmax

28、n(int a ) 返回值为最大值 int getminn(int b ) 返回值为最小值讨论题1为什么使用函数?2函数的参数起什么作用?定义函数时怎样确定参数与返回值?3函数中的功能应该是相对独立还是依赖于函数外的数据?4在什么情况下用静态变量?什么情况下使用全局变量(外部变量)?二者在占用内存上的区别是什么?5下面程序中的两个return是否正确?有什么作用?可以去掉吗?数组名作函数参数有什么作用?main() voidmodify(int p); intmarks=85,92,95,88; modify(marks); printf(“marks1=%d”, marks1; return

29、0; voidmodify(intp) p1-=10; return; 6.6自我测试填空题1下列程序的功能为:polyv计算多项式的值,多项式每项的系数与幂次方依次放在整数数组a中,系数为0时表示多项式结束,如数组3,2,100,1,60,0,0,0表示多项式:3x2+100x+60。请填写适当的符号或语句,使程序实现其功能函数#include float polyv( int a, float x ) float s=0,v; int i,j; for ( i = 0; (1) ; i+=2 ) v = 1; for ( j = 0; j ai+1; (2) ) v *= x; s +=

30、(3) ; return s;main() int a= 3,2,100,1,60,0,0,0 ; printf( %fn, polyv(a,1.0) );/* 运行后将输出:163.000000*/读程序,写结果1运行下列程序,其输出结果为 。 #include void prt(int a,int n,int x,int y) int ct1,ct2,i,j; for (i=0;in;i+) ct1=ct2=0;for (j=0;ji;j+)if (ai=aj)ct1+;for (j=i+1;jn;j+)if (ai=aj)ct2+;if (ct1=x & ct2=y)printf(%6d,ai); printf(n); main() int a10=11,25,18,19,18,25,18,12,12,11; prt(a,10,0,1); 2运行下列程序,其输出结果为 。 void prt(int n) int i; if(n=1) printf (1*1=1n); else prt(n-1); for(i=1; i=n; i+) printf (%d*%d=%dt, n, i, i*n); printf (n); mai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论