- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
03--函数
展开查看详情
1 .C++语言程序设计 第三章 函数 信息工程学院 王红平 Email:cugwhp@qq.com
2 .C++语言程序设计 本章主要内容 3.1函数的定义和调用 – 函数间的参数传递 3.2内联函数 3.3带默认形参值的函数 3.4函数重载 3.5C++系统函数 2
3 .C++语言程序设计 函 3.1.1函数的定义 数 的 函数是面向对象程序设计中,对功能的 定 抽象 义 函数声明的语法形式 与 类型标识符 函数名(形式参数表) 使 { 若无参数,写void 语句序列 用 } 是被初始化的内部 变量,寿命和可见 性仅限于函数内部 若无返回值,写void 3
4 .C++语言程序设计 3.1.1函数的定义 函 数 的 形式参数表 定 type1 name1, type2 name2, ..., typen 义 namen 与 函数的返回值 使 – 由 return 语句给出,例如: 用 return 0 – 无返回值的函数(void类型),不必写 return语句。 4
5 .C++语言程序设计 函 3.1.2函数的调用 数 调用前先声明函数原型: 的 – 在调用函数中,或程序文件中所有函数之 定 外,按如下形式说明: 义 类型标识符 被调用函数名 (含类型说明的形参表); 与 调用形式 使 函数名(实参列表) 用 嵌套调用 – 函数可以嵌套调用,但不允许嵌套定义。 递归调用 – 函数直接或间接调用自身。 5
6 .C++语言程序设计 例3-1编写一个求x的n次方的函数 函 数 #include <iostream> 的 using namespace std; double power (double x, int n); 定 void main(void) { 义 cout << "5 to the power 2 is " 与 } << power(5,2) << endl; 使 double power (double x, int n) { 用 double val = 1.0; while (n--) val = val*x; return(val); } 6
7 .C++语言程序设计 例3-1编写一个求x的n次方的函数 函 数 的 定 运行结果: 义 与 5 to the power 2 is 25 使 用 7
8 .C++语言程序设计 函 例3-2 数制转换 数 的 题目: 定 输入一个8位二进制数,将其转换 义 为十进制数输出。 与 使 例如:1101 = 1(23) + 1(22) + 0(21) + 1(20) 用 2 = 13 10 所以,如果输入1101,则应输出13 8
9 .#include <iostream> using namespace std; double power (double x, int n); void main(void) { int i; int value = 0; char ch; cout << "Enter an 8 bit binary number "; for (i = 7; i >= 0; i--) { cin >> ch; if (ch == '1') value += int(power(2,i)); } cout <<"Decimal value is "<<value<<endl; } double power (double x, int n) { 运行结果: double val = 1.0; Enter an 8 bit binary number while (n--) val *= x; 01101001 return(val); Decimal value is 105 } 9
10 .C++语言程序设计 函 例3-3编写程序求π的值 数 的 16 arctan 1 4 arctan 1 5 239 定 义 其中arctan用如下形式的级数计算: 与 x 3 x 5 x 7 使 arctan( x ) x 3 5 7 用 直到级数某项绝对值不大于10 为止; -15 π和x均为double型。 10
11 .#include<iostream> using namespace std; void main() { double a,b; double arctan(double x) ; //函数原型声明 a=16.0*arctan(1/5.0) ; b=4.0*arctan(1/239.0) ; //注意:因为整数相除结果取整, //如果参数写1/5,1/239,结果就都是0 cout<<"PI="<<a-b<<endl; } 11
12 .double arctan(double x) { int i; double r,e,f,sqr; sqr=x*x; r=0; e=x; i=1; while(e/i>1e-15) { f=e/i; r=(i%4==1)? r+f : r-f ; e=e*sqr; i+=2; } 运行结果: return r ; PI=3.14159 } 12
13 .C++语言程序设计 函 例3-4 数 的 寻找并输出11~999之间的数m,它满足m、 m2和m3均为回文数。 定 – 回文:各位数字左右对称的整数。 义 例如:11满足上述条件 与 112=121,113=1331。 使 分析: 用 – 10取余的方法,从最低位开始,依次取出该数 的各位数字。按反序重新构成新的数,比较与 原数是否相等,若相等,则原数为回文。 13
14 .#include <iostream> using namespace std; void main() { bool symm(long n); long m; for(m=11; m<1000; m++) if (symm(m)&&symm(m*m)&&symm(m*m*m)) cout<<"m="<<m<<" m*m="<<m*m <<" m*m*m="<<m*m*m<<endl; } 14
15 .bool symm(long n) { long i, m; i=n ; m=0 ; while(i) { m=m*10+i%10; i=i/10 ; } return ( m==n ); } 15
16 .运行结果: m=11 m*m=121 m*m*m=1331 m=101 m*m=10201 m*m*m=1030301 m=111 m*m=12321 m*m*m=1367631 16
17 .C++语言程序设计 函 例3-5 数 计算如下公式,并输出结果: 的 SIN (r ) SIN ( s) 当r s 定 2 2 2 2 k 1 义 SIN (r * s) 当r s 2 2 2 与 使 其中r、s的值由键盘输入。SIN x的近-6 用 似值按如下公式计算,计算精度为10 : 2 n 1 x x3 x5 x7 x SINx (1)n1 1! 3! 5! 7! n 1 (2n 1)! 17
18 .#include <iostream> #include<cmath> using namespace std; void main() { double k,r,s; double tsin(double x); cout<<"r="; cin>>r; cout<<"s="; cin>>s; if (r*r<=s*s) k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s)) ; else k=tsin(r*s)/2; cout<<k<<endl; } 18
19 .double tsin(double x) { double p=0.000001,g=0,t=x; int n=1; do { g=g+t; n++; t=-t*x*x/(2*n-1)/(2*n-2); }while(fabs(t)>=p); return g; 运行结果: r=5 } s=8 1.37781 19
20 .C++语言程序设计 函 例3-6投骰子的随机游戏 数 游戏规则是:每个骰子有六面,点数分别为1、2、 的 3、4、5、6。游戏者在程序开始时输入一个无符号整 定 数,作为产生随机数的种子。 义 每轮投两次骰子,第一轮如果和数为7或11则为胜, 与 游戏结束;和数为2、3或12则为负,游戏结束;和数 为其它值则将此值作为自己的点数,继续第二轮、第 使 三轮...直到某轮的和数等于点数则取胜,若在此前出 用 现和数为7则为负。 由rolldice函数负责模拟投骰子、计算和数并输出 和数。 20
21 .#include <iostream> #include <cstdlib> using namespace std; int rolldice(void); void main() { int gamestatus,sum,mypoint; unsigned seed; cout<<"Please enter an unsigned integer:"; cin>>seed; //输入随机数种子 srand(seed); //将种子传递给rand() sum=rolldice(); //第一轮投骰子、计算和数 21
22 .switch(sum) { case 7: //如果和数为7或11则为胜,状态为1 case 11: gamestatus=1; break; case 2: //和数为2、3或12则为负,状态为2 case 3: case 12: gamestatus=2; break; default: //其它情况,游戏尚无结果,状态为0,记下点数,为下一轮做准备 gamestatus=0; mypoint=sum ; cout<<"point is "<<mypoint<<endl; break; } 22
23 . while ( gamestatus==0 ) //只要状态仍为 0,就继续进行下一轮 { sum=rolldice(); if(sum==mypoint) //某轮的和数等于点数则取胜,状态置为1 gamestatus=1 ; else if ( sum==7 ) //出现和数为7则为负,状态置为2 gamestatus=2; } //当状态不为0时上面的循环结束,以下程序段输出游戏结果 if( gamestatus==1 ) cout<<"player wins\n"; else cout<<"player loses\n"; } 23
24 . rand 函数原型:int rand(void); 所需头文件:<cstdlib> 功能和返回值:求出并返回一个伪随机数 srand 函数原型:void srand(unsigned int seed); 参数:seed产生随机数的种子。 所需头文件:<cstdlib> 功能:为使rand()产生一序列伪随机整数而设 置起始点。使用1作为seed参数,可以重新 初化rand()。 24
25 .int rolldice(void) { //投骰子、计算和数、输出和数 int die1,die2,worksum; die1=1+rand()%6; die2=1+rand()%6; worksum=die1+die2; cout<<"player rolled "<<die1<<'+'<<die2<<'='<<worksum<<endl; return worksum; } 25
26 .运行结果2: Please enter an unsigned integer:23 player rolled 6+3=9 point is 9 player rolled 5+4=9 player wins 26
27 .C++语言程序设计 函 函数调用的执行过程 数 的 main() 保存: ③ fun() 定 ① ② 返回地址 当前现场 义 ④ 调fun() 与 ⑦ 使 ⑥ 恢复: ⑤ 用 结束 主调程序现场 返回 返回地址 27
28 .C++语言程序设计 函 嵌套调用 数 的 main{} fun1() fun2() 定 ① ② ③ ④ 义 调fun1() 调fun2() ⑤ 与 ⑨ ⑦ 使 结束 ⑧ 返回 ⑥ 返回 用 28
29 .C++语言程序设计 例3-6 输入两个整数,求平方和。 函 数 的 #include <iostream> 声 using namespace std; 明 void main(void) 与 { int a,b; 使 int fun1(int x,int y); 用 cin>>a>>b; cout<<"a、b的平方和:" <<fun1(a,b)<<endl; } 29