《第三章 函数 CUMT》由会员分享,可在线阅读,更多相关《第三章 函数 CUMT(68页珍藏版)》请在金锄头文库上搜索。
1、1,C+ 语言程序设计,张 磊 博士 副教授 ,2,第三章 函数,3,3.1 函数的声明和调用 3.2函数间的参数传递 3.3内联函数 3.4带默认形参值的函数 3.5函数重载 3.6C+系统函数,4,3.1函数的声明和调用,函数,函数是程序设计中,对功能的抽象 C+ 程序是由函数构成的(一个或多个函数) C+程序必须有且只能有一个 main 函数,函数的声明,5,形式参数表,形式参数表(形参)要指定数据类型 有多个形参时,用逗号隔开,每个形参需单独指定数据类型 如果函数不带参数,则形式参数可以省略,但括号不能省 形参只有在函数内部有效/可见,类型标识符 变量, 类型标识符 变量, . . .
2、 . . .,函数返回值 通过 return 语句给出,如 return x; 若没有返回值,可以不写 return 或写不带表达式的 return;,int my_max(int x, int y) / OK int my_max(int x, y) / ERROR,6,函数定义举例,#include using namespace std; int my_max(int x, int y) if (xy) return x; else return y; int main() int m, n; cout m n; cout max( m , n )= my_max(m,n) endl;
3、system(pause); return 0; ,例:,ex_fun_01.cpp,7,函数的调用,函数调用前须先声明,类型标识符 函数名(形式参数表),可以在调用函数中,或程序文件中所有函数之外声明,ex_fun_02.cpp,8,/ 函数的调用 #include using namespace std; double my_power(double x, int k); int main() double x; x = my_power(3,3) + my_power(4,4); cout 33 + 44 = x endl; system(pause); return 0; double
4、 my_power(double x, int k) double y = 1.0; for (int i=1; i=k; i+) y = y * x; return y; ,例:,9,函数的调用过程,int main() . fun1(); . fun2(); . ,int fun1() . fun3(); . ,int fun2() . ,int fun3() . ,10,函数的调用举例,例:输入一个二进制数,输出相应的十进制数,ex_fun_03.cpp,思考:如何计算 1111 1111 1111 1111 对应的十进制数?,思考:利用上面的公式计算 sin(41*pi/2),结果如何
5、?,11,/ 输入一个二进制数,输出相应的十进制数 #include using namespace std; int my_power2(int k); / compute 2k int main() long x, x0; int y=0, k=0, t; cout x; x0 = x; while (x != 0) t = x % 10; if (t=1) y = y + my_power2(k); x = x / 10; k = k + 1; cout 二进制数 x0 对应的十进制数为 y endl;,例:,12,system(pause); return 0; int my_powe
6、r2(int k) / compute 2k int y = 1; for (int i=1; i=k; i+) y = y * 2; return y; ,例:,13,/ 利用 Taylor 展开计算 sin 函数的值 #include #include using namespace std; const double tol = 1e-15; / tolerance double my_power(double x, int k); / compute (-1)(k-1) * xk / k! int main() double x, y=0.0, t; int k = 1; cout x
7、; t = x; while ( fabs(t) = tol) / fabs - absolute value,例:,14, y = y + t; k = k + 1; t = my_power(x, k); cout sin( x )= y endl; cout 自带函数计算出来的值为: sin(x) endl; system(pause); return 0; / compute (-1)(k-1) * x(2k-1) / (2k-1)! double my_power(double x, int k) double y, z; int i; y = x;,15,for (i=2; i=k
8、; i+) z = -(x/(2*i-2) * (x/(2*i-1); y = y * z; return y; ,16,函数的调用举例,例:找出 11999 之间的数 m,满足 m、m2 和 m3 均为回文数,ex_fun_05.cpp,分析:利用除以10取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文数,回文数:各位数字左右对称的整数,如 11,121,1331,17,/ 回文数 #include using namespace std; int main() bool symm(long n); / 函数声明 long m;
9、 for(m=11; m1000; m+) if (symm(m) ,例:,18,bool symm(long n) / 判别是否回文数 long i, m; i=n; m=0; while(i) m = m*10 + i%10; i = i/10; return ( m=n ); ,19,函数的嵌套调用,函数的嵌套调用,函数可以嵌套调用,但不能嵌套定义 函数也可以递归调用(函数可以直接或间接调用自己),注意:对同一个函数的多次不同调用中,编译器会给函数的形参和局部变量分配不同的空间,它们互不影响,20,/ 计算阶乘 / 普通方式和递归方式 #include using namespace s
10、td; const double tol = 1e-15; / tolerance int my_prod1(int n); / 普通方式 int my_prod2(int n); / 递归方式 int main() int n, y; cout n; y = my_prod1(n); cout 普通方式: n != y endl; y = my_prod2(n);,例:,21,cout 递归方式: n != y endl; system(pause); return 0; int my_prod1(int n) / 普通方式 int y = 1; for (int i=1; i=n; i+)
11、 y = y * i; return y; int my_prod2(int n) / 递归方式 if (n=0) return 1; else return n*my_prod2(n-1); ,例:,22,/ 利用 Taylor 展开计算 sin 函数的值 / 递归方式 #include #include using namespace std; const double tol = 1e-15; / tolerance double my_power(double x, int k); / compute (-1)(k-1) * xk / k! int main() double x, y
12、=0.0, t; int k = 1; cout x; t = x;,例:,23,while ( fabs(t) = tol) / fabs - absolute value y = y + t; k = k + 1; t = my_power(x, k); cout sin( x )= y endl; cout 自带函数计算出来的值为: sin(x) endl; system(pause); return 0; ,例:,24,/ compute (-1)(k-1) * x(2k-1) / (2k-1)! double my_power(double x, int k) double z; i
13、f (k=1) return x; else z = -(x/(2*k-1) * (x/(2*k-2); return z*my_power(x,k-1); ,例:,25,举例:随机数,随机数的生成,seed=11; srand(seed); % 设置种子 x=rand(); % 返回一个随机整数,ex_rand_01.cpp,rand():返回一个 0 RAND_MAX 之间的伪随机整数 srand(seed):设置 seed 为种子。如不设定,默认种子为 1 相同的种子对应相同的伪随机整数,26,/ 生成随机数1 #include using namespace std; int main
14、() int seed, x; cout seed; srand(seed); x = rand(); cout x= x endl; cout seed= seed , RAND_MAX= RAND_MAX endl; system(pause); return 0; ,例:,27,/ 随机数 2 #include using namespace std; int main() int seed, x; int a, b; a = 10; b = 20; seed=111; srand(seed); x = rand()%(b+1-a) + a; cout x= x endl; system
15、(pause); return 0; ,例:,28,/ 随机数 3 #include using namespace std; int main() int seed; double x; srand(9000); x = double(rand()/RAND_MAX; cout x= x endl; system(pause); return 0; ,例:,29,举例:计时函数,#include . . . . . . clock_t t0, t1; double totaltime; . . . . . . t0 = clock(); . . . . . . t1 = clock(); totaltime=(double)(t1 - t0) / CLOCKS_PER_SEC;,clock():返回进程启动后所使用的cpu总毫秒数 需要包含头文件 ctime,ex_time_01.cpp,30,/ 计时函数的使