清华大学c--课件第3章

上传人:n**** 文档编号:93572098 上传时间:2019-07-24 格式:PPT 页数:70 大小:652.54KB
返回 下载 相关 举报
清华大学c--课件第3章_第1页
第1页 / 共70页
清华大学c--课件第3章_第2页
第2页 / 共70页
清华大学c--课件第3章_第3页
第3页 / 共70页
清华大学c--课件第3章_第4页
第4页 / 共70页
清华大学c--课件第3章_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《清华大学c--课件第3章》由会员分享,可在线阅读,更多相关《清华大学c--课件第3章(70页珍藏版)》请在金锄头文库上搜索。

1、第三章 函数,清华大学 郑 莉,C+语言程序设计,2,本章主要内容,函数的定义和调用 函数间的参数传递 内联函数 带默认形参值的函数 函数重载 C+系统函数 深度探索,3,函数的定义,函数是面向对象程序设计中,对功能的抽象 函数定义的语法形式 类型标识符 函数名(形式参数表) 语句序列 ,函数的声明与使用,是被初始化的内部变量,寿命和可见性仅限于函数内部,若无返回值,写void,4,函数的定义,形式参数表 name1, name2, ., namen 函数的返回值 由 return 语句给出,例如: return 0 无返回值的函数(void类型),不必写return语句。,函数的声明与使用,

2、5,函数的调用,调用前先声明函数: 若函数定义在调用点之前,则无需另外声明; 若函数定义在调用点之后,则需要在调用函数前按如下形式声明函数原型: 类型标识符 被调用函数名(含类型说明的形参表); 调用形式 函数名(实参列表) 嵌套调用 函数可以嵌套调用,但不允许嵌套定义。 递归调用 函数直接或间接调用自身。,函数的声明与使用,6,例3-1编写一个求x的n次方的函数,#include using namespace std; /计算x的n次方 double power(double x, int n) double val = 1.0; while (n-) val *= x; return v

3、al; int main() cout “5 to the power 2 is “ power(5, 2) endl; return 0; ,函数的声明与使用,7,运行结果: 5 to the power 2 is 25,例3-1编写一个求x的n次方的函数,函数的声明与使用,8,例3-2 数制转换,题目: 输入一个8位二进制数,将其转换为十进制数输出。 例如:11012=1(23)+1(22)+0(21)+1(20)=1310 所以,如果输入1101,则应输出13,函数的声明与使用,#include using namespace std; /计算x的n次方 double power (do

4、uble x, int n); int main() int value = 0; cout = 0; i-) char ch; cin ch; if (ch = 1) value += static_cast(power(2, i); cout “Decimal value is “ value endl; return 0; double power (double x, int n) double val = 1.0; while (n-) val *= x; return val; ,运行结果: Enter an 8 bit binary number 01101001 Decimal

5、 value is 105,9,10,例3-3编写程序求的值,其中arctan用如下形式的级数计算: 直到级数某项绝对值不大于10-15为止;和x均为double型。,函数的声明与使用,#include using namespace std; double arctan(double x) double sqr = x * x; double e = x; double r = 0; int i = 1; while (e / i 1e-15) double f = e / i; r = (i % 4 = 1) ? r + f : r - f; e = e * sqr; i += 2; re

6、turn r; ,11,int main() double a = 16.0 * arctan(1 / 5.0); double b = 4.0 * arctan(1 / 239.0); /注意:因为整数相除结果取整,如果参数写1/5,1/239,结果就都是0 cout “PI = “ a - b endl; return 0; ,运行结果: PI=3.14159,12,13,例3-4,寻找并输出11999之间的数m,它满足m、m2和m3均为回文数。 回文:各位数字左右对称的整数。 例如:11满足上述条件 112=121,113=1331。 分析: 采用除以10取余的方法,从最低位开始,依次取

7、出该数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。,函数的声明与使用,#include using namespace std; /判断n是否为回文数 bool symm(unsigned n) unsigned i = n; unsigned m = 0; while (i 0) m = m * 10 + i % 10; i /= 10; return m = n; ,14,int main() for(unsigned m = 11; m 1000; m+) if (symm(m) ,15,运行结果: m=11 m*m=121 m*m*m=1331 m=10

8、1 m*m=10201 m*m*m=1030301 m=111 m*m=12321 m*m*m=1367631,16,17,例3-5,计算如下公式,并输出结果: 其中r、s的值由键盘输入。sin x的近似值按如下公式计算,计算精度为10-6:,函数的声明与使用,#include #include /对C+标准库中数学函数的说明 using namespace std; const double TINY_VALUE = 1e-10; double tsin(double x) double g = 0; double t = x; int n = 1; do g += t; n+; t = -

9、t * x * x / (2 * n - 1) / (2 * n - 2); while (fabs(t) = TINY_VALUE); return g; ,18,int main() double k, r, s; cout r; cout 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; return 0; ,运行结果: r=5 s=8 1.37781,19,20,例3-6投骰子的随机游戏,每个骰子有六面,点数分别为1、2

10、、3、4、5、6。游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子。 每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束;和数为2、3或12则为负,游戏结束;和数为其它值则将此值作为自己的点数,继续第二轮、第三轮.直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负。 由rolldice函数负责模拟投骰子、计算和数并输出和数。,函数的声明与使用,rand 函数原型:int rand(void); 所需头文件: 功能和返回值:求出并返回一个伪随机数 srand 函数原型:void srand(unsigned int seed); 参数:seed产生随机数的种子。 所需头文件

11、: 功能:为使rand()产生一序列伪随机整数而设置起始点。使用1作为seed参数,可以重新初化rand()。,21,#include #include using namespace std; /投骰子、计算和数、输出和数 int rollDice() int die1 = 1 + rand() % 6; int die2 = 1 + rand() % 6; int sum = die1 + die2; cout “player rolled “ die1 “ + “ die2 “ = “ sum endl; return sum; ,22,enum GameStatus WIN, LOSE

12、, PLAYING ; int main() int sum, myPoint; GameStatus status; unsigned seed; cout seed;/输入随机数种子 srand(seed);/将种子传递给rand() sum = rollDice(); /第一轮投骰子、计算和数,23,switch (sum) case 7: /如果和数为7或11则为胜,状态为WIN case 11: status = WIN; break; case 2: /和数为2、3或12则为负,状态为LOSE case 3: case 12: status = LOSE; break; defau

13、lt: /其它情况,游戏尚无结果,状态为PLAYING,记下点数,为下一轮做准备 status = PLAYING; myPoint = sum; cout “point is “ myPoint endl; break; ,24,while (status = PLAYING) /只要状态仍为PLAYING,就继续进行下一轮 sum = rollDice(); if (sum = myPoint) /某轮的和数等于点数则取胜 status = WIN; else if (sum = 7) /出现和数为7则为负 status = LOSE; /当状态不为PLAYING时上面的循环结束,以下程序

14、段输出游戏结果 if (status = WIN) cout “player wins“ endl; else cout “player loses“ endl; return 0; ,25,运行结果2: Please enter an unsigned integer:23 player rolled 6 + 3 = 9 point is 9 player rolled 5 + 4 = 9 player wins,26,27,嵌套调用,函数的声明与使用,main 调fun1() 结束,fun1() 调fun2() 返回,fun2() 返回,28,例3-6 输入两个整数,求平方和。,#incl

15、ude using namespace std; int fun2(int m) return m * m; int fun1(int x,int y) return fun2(x) + fun2(y); ,函数的声明与使用,int main() int a, b; cout a b; cout “The sum of square of a and b: “ fun1(a, b) endl; return 0; 运行结果: Please enter two integers(a and b): 3 4 The sum of square of a and b: 25,29,30,递归调用,函数直接或间接地调用自身,称为递归调用。 递归过程的两个阶段: 递推: 4!=43!3!=32!2!=21!1!=10!0!=1 未知 已知 回归: 4!=43!=243!=32!=62!=21!=21!=10!=10!=1 未知 已知,函数的声明与使用,31,例3-8 求n!,分析:计算n!的公式如下: 这是一个递归形式的公式,应该用递归函数实现。,函数的声明与使用,源程序: #include using namespace std; unsigned fac(int n) unsigned f; if (n = 0) f = 1; else f =

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号