习题3及其解答(第二版)doc.doc
第3章 函数3.1 选择题1以下正确的函数原型为( d )。(a) f1( int x; int y ); (b) void f1( x, y );(c) void f1( int x, y ); (d) void f1( int, int );2有函数原型 void fun2( int ); 下面选项中,不正确的调用是( c )。(a) int x = 21; fun2( x );(b) int a = 15; fun2( a*3 ); (c) int b = 100; fun2( &b );(d) fun2( 256 );3有函数原型 void fun3( int * ); 下面选项中,正确的调用是( c )。(a) double x = 2.17; fun3( &x );(b) int a = 15 ; fun3( a*3.14 ); (c) int b = 100; fun3( &b );(d) fun3( 256 );4有函数原型 void fun4( int & ); 下面选项中,正确的调用是( c )。(a) int x = 2.17; fun4( &x );(b) int a = 15; fun4( a*3.14 );(c) int b = 100; fun4( b );(d) fun4( 256 ) ;5有声明 int fun5( int ); int (*pf)(int) = fun5; 下面选项中,正确的调用是( c )。(a) int a=15; int n=fun5(&a); (b) int a = 15; cout<<(&pf)(a);(c) cout<<(*pf)( 256 ); (d) cout << *pf( 256 );6在VC中,假设定义一个函数的返回类型为void,以下表达正确的选项是( c )。(a) 函数返回值需要强类型转换(b) 函数不执行任何操作(c) 函数本身没有返回值(d) 函数不能修改实际参数的值7函数参数的默认值不允许为( c )。(a) 全局常量(b) 直接常量(c) 局部变量(d) 函数调用8使用重载函数编程序的目的是( a )。(a) 使用相同的函数名调用功能相似的函数(b) 共享程序代码(c) 提高程序的运行速度(d) 节省存贮空间9以下的描述中( b )是错误的。(a) 使用全局变量可以从被调用函数中获取多个操作结果(b) 局部变量可以初始化,假设不初始化,那么系统默认它的值为0(c) 当函数调用完后,静态局部变量的值不会消失(d) 全局变量假设不初始化,那么系统默认它的值为010以下选项中,( c )的具有文件作用域。(a) 语句标号(b) 局部变量(c) 全局变量(d) 静态变量3.2 阅读以下程序,写出执行结果1. #include <iostream.h>#include <math.h>int f( int ) ;void main() int i; for( i = 0; i < 3; i + ) cout << f( i ) << endl;int f( int a ) int b = 0 , c = 1; b +; c+; return ( a + pow( b, 2 ) + c ); 【答案】 3 4 52. void func(int a, int b, int c = 3, int d = 4 );#include <iostream.h>void main() func( 10, 15, 20, 30 ); func( 10, 11, 12 ); func( 12, 12 );void func( int a, int b, int c, int d ) cout << a << 't' << b << 't' << c << 't' << d << endl; 【答案】 10 15 20 30 10 11 12 4 12 12 3 43. #include <iostream.h>void func( int, int, int * ) ;void main() int x, y, z; func( 5, 6, &x ); func( 7, x, &y ); func( x, y, &z ); cout << x << " ," << y << ", "<< z << endl;void func( int a , int b , int *c ) b += a ; *c = b a ; 【答案】 6, 6, 64. #include <iostream.h>void func( int, int, int & );void main() int x=0 , y=1 , z=2; func( 1 , 2 , x ); func( x + y , y , y ); func( z , x + y , z ); cout << x << " ," << y << ", "<< z << endl ;void func( int a , int b , int &c ) b += a ; c = b a ; 【答案】 2, 1, 35. #include <iostream.h>int f2( int, int );int f1( int a , int b ) int c ; a += a ; b += b ; c = f2( a+b , b+1 ); return c;int f2( int a , int b ) int c ; c = b % 2 ; return a + c;void main() int a = 3 , b = 4; cout << f1( a , b ) << endl;【答案】 156. #include <iostream.h>int age( int n ) int f; if( n = 1 ) f = 10 ; else f = age( n-1 ) + 2; return f ;void main() cout << "age : " << age( 5 ) << endl; 【答案】 age:187. #include <iostream.h>int f1( int a , int b ) return a + b ; int f2( int a ,int b ) return a b ; int f3( int( *t )( int , int ) , int a , int b ) return ( *t )( a, b ) ; void main() int ( *p )( int, int ); p = f1 ;cout << f3( p, 4, 8 ) << endl; p = f2 ;cout << f3( p, 8, 4 ) << endl;【答案】 12 48. #include <iostream.h>int sub( int, int );int a = 1 ;void main() int m = 1, n = 2, f; f = sub( m, n ); cout << a << 't' << f << endl; f = sub( m, n ) ; cout << a << 't' << f << endl; int sub( int c, int d ) static int m = 2, n = 5 ; cout << m << 't' << n << 't' << endl; a = + a ; c = m + ; d = n +; return c + d ; 【答案】2 52 73 63 93.3 思考题1函数的作用是什么?如何定义函数?什么叫函数原型?2什么叫函数值的返回类型?什么叫函数的类型?如何通过指向函数的指针调用一个已经定义的函数?请写一个验证程序说明。3 什么叫形式参数?什么叫实际参数?C+函数参数有什么不同的传递方式?请写一个验证程序说明。4C+函数通过什么方式传递返回值?当一个函数返回指针类型时,对返回表达式有什么要求?假设返回引用类型时,是否可以返回一个算术表达式?为什么?5变量的生存期和变量作用域有什么区别?请举例说明。6静态局部变量有什么特点?编写一个应用程序,说明静态局部变量的作用。7在一个语句块中能否访问一个外层的同名局部变量?能否访问一个同名的全局变量? 如果可以,应该如何访问?请写一个验证程序说明。3.4 编程题1已经知道 , 其中sh为双曲正弦函数,即。编一程序,输入x的值,求y的值。【解答】#include <iostream.h>#include <math.h> double sh( double t );void main() double x,y; cout << "x=" cin >> x; y = sh( 1+sh(x) )/( sh( 2*x )+sh( 3*x ) ); cout << "y=" << y << endl;double sh( double t ) return ( exp( t )-exp( -t ) )/2; 2输入m、n和p的值,求s = 的值。注意判断运算中的溢出。【解答】#include <iostream.h>#include <math.h>double f( long k,long num );void main() long m,n,p; double s,f1,f2,f3; cout << "m,n,p=" cin>>m>>n>>p; f1=f( 1,m ); f2=f( 3,n ); f3=f( 5,p ); if (f1 && f2 && f3 ) s = ( f1 + f2) /f3; cout << "s=" << s << endl; else cout<<"溢出!n"double f( long k,long num ) long i; double sum=0; for( i=1; i<=num && sum<2147483647; i+ ) sum = sum + pow( i,k ); if (i<=num) return 0; /溢出时返回0 return sum;3输入a,b和c的值,编写一个程序求这三个数的最大值和最小值。要求把求最大值和最小值编写成函数,并使用指针或引用作为形式参数把结果返回函数main。【解答】1使用指针参数#include<iostream.h>void fmaxmin( float,float ,float ,float *,float * );void main() float a,b,c,max,min; cout << "a,b,c = " cin >> a >> b >> c; fmaxmin( a,b,c,&max,&min ); cout << "max=" << max << endl; cout << "min=" < <min << endl;void fmaxmin( float x,float y,float z,float *p1,float *p2 ) float u,v; if ( x>y ) u = x; v = y; else u = y; v = x; ; if ( z>u ) u = z; if ( z<v ) v = z; *p1 = u; *p2 = v;2使用引用参数#include<iostream.h>void fmaxmin( float,float ,float ,float& ,float& );void main()float a,b,c,max,min;cout << "a,b,c="cin >> a >> b >> c;fmaxmin( a,b,c,max,min );cout << "max=" << max << endl;cout << "min=" << min << endl;void fmaxmin( float x,float y,float z,float &p1,float &p2 ) float u,v; if ( x>y ) u = x; v = y; else u = y; v = x; ; if ( z>u ) u = z; if ( z<v ) v = z; p1 = u; p2 = v;4用线性同余法生成随机数序列的公式为: rk = ( multiplier * rk-1 + increment ) % modulus序列中的每一个数rk,可以由它的前一个数rk-1计算出来。例如,如果有:rk = ( 25173 * rk-1 + 13849 ) % 65536可以产生 65536个各不相同的整型随机数。设计一个函数作随机数生成器,生成一位或两位数的随机数。利用这个随机数生成器,编写一个小学生四那么运算的练习程序:3 ·可以进行难度选择。一级难度只用一位数,二级难度用两位数;4 ·可以选择运算类型,包括加、减、乘、除等;5 ·给出错误提示;6 ·可以统计成绩。【解答】函数Rand用于生成指定范围的随机整数。主函数为了使用户正确输入计算难度和运算符,用了两个while循环。for循环出10道题让用户计算,每答对一道题加10分。最外层的while循环控制练习的开始,使得用户可以反复练习,直至键入N或n。#include <iostream.h>int Rand(int,int); /生成指定范围的随机数void main() int w,i,r,t = 0; char op; int a,b,d; while(1) /练习开始 cout<<"现在开始?( Y 或 N )n" ; cin>>answer; if (answer='N'|answer='n') break;while(1) cout << "请输入难度( 1或2 ):" cin >> w; if ( w != 1 && w != 2 ) cout << "输入难度错误,重新输入!" << endl; else break ; while(1) cout << "请输入运算类型( +,-,*,/ ):" ; cin >> op; if ( op != '+' && op != '-' && op != '*' && op != '/' ) cout << "输入运算符错误,重新输入!" << endl; else break; /出10道题,每题10分for( i=1; i<=10; i+ ) while(1) if( w = 1 ) a = Rand(0,10); b = Rand(0,10); elseif( w = 2 ) a = Rand(10,100); b = Rand(10,100); if ( op = '-' ) if ( a<b ) continue ; /使被减数大于减数 if ( op = '/' ) if ( int( a / b ) != (a / b) ) continue; /只做结果为整数的除法 break; cout << a << op << b << '=' cin >> d; switch ( op ) case '+': r = a + b; break; case '-': r = a - b; break; case '*': r = a * b; break; case '/': r = a / b; break; if ( r = d ) cout << "你算对了,加10分!" << endl; t = t + 10; else cout << "你算错了!" << endl; cout << "你的成绩是:" << t << "分" << endl;int Rand(int m, int n) static int r;/静态变量保留上一个随机数 do r = ( 25173*r + 13849 ) % 65536 ; while (r<m|r>=n); return r;5已经知道勒让德多项式为编一程序,从键盘上输入x和n的值,使用递归函数求p(x)的值。【解答】#include <iostream.h>float p( float x,int n );void main() int n;float x; cout << "please input x and n:" cin >> x >> n; cout << "p(" << x << "," << n << ")=" << p( x,n ) <<endl;float p( float x,int n ) float t1,t2; if( n = 0 ) return 1; else if( n = 1 ) return x; else t1 = ( 2*n-1 )*p( x,n-1 ); t2 = ( n-1 )*p( x,n-2 ); return ( t1-t2 )/n; 6把以下程序中的print()函数改写为等价的递归函数。#include <iostream.h>void print( int w ) for( int i = 1 ; i <= w ; i + ) for( int j = 1 ; j <= i ; j + ) cout << i << " " ; cout << endl ; void main() print( 5 ) ; 运行显示:1 2 23 3 34 4 4 45 5 5 5 5【解答】#include <iostream.h>void print(int w) int i; if( w ) print( w-1 ); for( i=1; i<=w; i+ ) cout << w << " " cout << endl; void main() print( 5 );7已经知道用梯形法求积分的公式为:,其中h = ( ba ) / n,n为积分区间的等分数,编程序求如下积分的值。要求把求积分公式编写成一个函数,并使用函数指针作为形式参数。调用该函数时,给定不同的被积函数作为实际参数求不同的积分。 【解答】#include <iostream.h>#include <math.h>double f1( double x ) return 4 / ( 1 + x*x ); double f2( double x ) return sqrt( 1 + x*x ); double f3( double x ) return sin( x ); double trap( double( *fun )( double x ), double a,double b,long n ) double t,h; int i; t = ( ( *fun )(a) + ( *fun )( b ) ) / 2.0; h = ( b a ) / n; for( i=1; i<=n-1; i+ ) t += ( *fun )( a + i * h ); t *= h; return t;void main() double t1,t2,t3; t1 = trap( f1,0,1,10000 ); cout << "t1=" << t1 << endl; t2 = trap( f2,1,2,10000 ); cout << "t2=" << t2 << endl; t3 = trap( sin,0,3.14159265/2,10000 ); cout << "t3=" << t3 << endl;8编写一个程序,包含三个重载的display函数和一个主函数。要求第一个函数输出double值,前面用字符串“a double:引导,第二个函数输出一个int值,前面用字符串“a int:引导,第三个函数输出一个char字符值,前面用字符串“a char:引导,在主函数中分别用double、int和char型变量作为实参调用display函数。 【解答】#include <iostream.h>void display( double d ) cout << "a double:" << d << endl; void display( int i ) cout << "a int:" << i << endl; void display( char c ) cout << "a char:" << c << endl; void main() double d = 1.5; int i = 100; char c = 'a' display( d ); display( i ); display( c );9使用重载函数编程序分别把两个数和三个数从大到小排列。【解答】#include <iostream.h>void sort( float x,float y );void sort( float x,float y,float z );void main() sort( 5.6, 79 ); sort( 0.5, 30.8, 5.9 );void sort(float x,float y) if ( x>y ) cout << x << 't' << y << endl; else cout << y << 't' << x << endl;void sort( float x,float y,float z ) float t; if( y<z ) t = y; y = z; z = t; if( x<z ) t = x; x = z; z = t; if( x<y ) t = x; x = y ;y = t; cout << x << 't' << y << 't' << z << 't' << endl;10给定求组合数公式为:,编一程序,输入m和n的值,求的值。注意优化算法,降低溢出可能。要求主函数调用以下函数求组合数:int Fabricate( int m, int n ) ;/返回的值Fabricate函数内又须调用Multi函数:int Multi( int m, int n ) ;/ 返回 m × m-1 × × n程序由4个文件组成。头文件存放函数原型作为调用接口;其他3个cpp文件分别是main、Fabricate和Multi函数的定义。【解答】/Fabricate.h#ifndef FABRICATE_H #define FABRICATE_Hint Fabricate( int m,int n );int Multi( int m, int n );#endif/main.cpp#include <iostream.h>#include "Fabricate.h"void main() int m ,n; cout << "input m and n:" cin >> m >> n; cout << "Fabricate(" << m << "," << n << ")=" << Fabricate( m, n ) << endl;/Fabricate.cpp#include "Fabricate.h"int Fabricate( int m, int n ) return Multi( m, m n + 1 ) / Multi( n, 1 );/Multi.cppint Multi( int m, int n )int i, t = 1; for( i=n; i<=m; i+ ) t = t * i; return t;