PowerPoint 演示文稿

Similar documents
主要内容 函数的定义 声明与调用 函数间的参数传递 函数嵌套与内联函数 形参带缺省值的函数与函数重载 数据的作用域 预编译处理与多文件结构 C++ 系统函数 2

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

chap07.key

第三章 函数

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

《C语言程序设计》教材习题参考答案

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

第五讲 数组 一维数组 二维数组 数组作为函数参数

新版 明解C++入門編

C++ 程序设计 笔记 * 潘建瑜 2019 年 6 月 9 日 * 本笔记仅供课堂教学使用

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

第五讲 C++程序的结构

数学分析(I)短课程 [Part 2] 4mm 自然数、整数和有理数

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

06-statement

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

没有幻灯片标题

Microsoft PowerPoint - 10 模板 Template.pptx

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

内 容 提 要 指 针 持 久 动 态 内 存 分 配 字 符 串 ( 字 符 数 组 ) 2

FY.DOC

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

<4D F736F F F696E74202D2043D3EFD1D4BFCEBCFE2D362DBAAFCAFD2E BBCE6C8DDC4A3CABD5D>

幻灯片 1

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D>

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

c_cpp

Microsoft PowerPoint - CPP-Ch ppt [兼容模式]

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

C/C++语言 - C/C++数据

Microsoft Word - 第05章 函数

网C试题(08上).doc

Microsoft Word - 第3章.doc

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

C/C++程序设计 - 字符串与格式化输入/输出

Microsoft Word - 第3章.doc

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

勤 學 * 卓 越 * 快 樂 成 長 本 校 在 老 師 群 策 群 力 共 同 討 論 下, 型 塑 了 學 校 願 景 : 勤 學 卓 越 快 樂 成 長 ( 一 ) 勤 學 運 用 真 的 力 量 培 養 勤 學, 以 語 文 教 為 基 礎 紮 根 ( 二 ) 卓 越 利 用 美 的 感

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

第3章.doc

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

WHUST 2017 Div.2 Day 3.5 C++ 标准模版库

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Guava学习之Resources

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1

02

C++ 程序设计 实验 1 - 参考答案 MASTER 2017 年 5 月 21 日 1

PowerPoint 演示文稿

9.2 构造函数和析构函数 类的组合 结构体与联合体 类的 UML 描述 第十讲 类与对象 (II) 面向对象进阶 对象的生存期 静态成员 友元关系

Microsoft PowerPoint - 01_Introduction.ppt

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

PowerPoint 演示文稿

谈谈数学素质的培养

Chapter12 Derived Classes

IP Encoder 1 channel.book

PowerPoint 演示文稿

(Microsoft Word - 136\260g\270\364\252\272\267s\256Q.doc)

酒 神 (长篇小说)

避孕篇

Microsoft Word - C++CodeRule94.doc

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

untitled

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

_汪_文前新ok[3.1].doc

《C语言程序设计》第2版教材习题参考答案

重 要 声 明 长 城 证 券 股 份 有 限 公 司 编 制 本 报 告 的 内 容 及 信 息 来 源 于 陕 西 东 岭 工 贸 集 团 股 份 有 限 公 司 提 供 的 证 明 文 件 以 及 第 三 方 中 介 机 构 出 具 的 专 业 意 见 长 城 证 券 对 报 告 中 所 包

Microsoft PowerPoint - string_kruse [兼容模式]

C 1

《C语言程序设计》教材习题参考答案

(Microsoft Word - 4\244\353.doc)

新・解きながら学ぶC言語

untitled

Microsoft PowerPoint - 0 C复习.ppt [兼容模式]

求出所有的正整数 n 使得 20n + 2 能整除 2003n n 20n n n 20n n 求所有的正整数对 (x, y), 满足 x y = y x y (x, y) x y = y x y. (x, y) x y =

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

提纲 1 联编与多态性 2 用虚函数实现多态 3 虚函数的工作原理 4 纯虚函数与抽象类 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

新版 明解C言語入門編

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

北京大学

新・明解C言語入門編『索引』

C/C++语言 - 运算符、表达式和语句

Microsoft PowerPoint - 概率统计Ch02.ppt [Compatibility Mode]

並 責 成 各 里 幹 事 下 里 服 勤 宣 導 病 媒 防 治 知 識, 協 助 各 家 戶 清 除 病 媒 孳 生 源 ( 積 水 容 器 ), 降 低 棲 群 密 度, 預 防 傳 染 病 之 發 生, 以 確 保 民 眾 身 體 健 康 及 居 家 生 活 品 質 訂 定 每 月 最 後

《计算概论》课程 第十九讲 C 程序设计语言应用

ch02_Basic

}; "P2VTKNvTAnYNwBrqXbgxRSFQs6FTEhNJ", " " string imagedata; if(0!= read_image("a.jpg",imagedata)) { return -1; } string rsp; ytopen_sdk m_sd

C/C++ - 函数

untitled

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

PowerPoint 演示文稿

Microsoft Word - 第3章.doc

迅速在两个含有大量数据的文件中寻找相同的数据

Transcription:

第四讲 函数

目录页 华东师范大学数学科学学院 School of Mathematical Sciences, ECNU Contents 1 2 函数基础 数据的作用域 3 预编译与多文件结构 4 C++ 库函数

目录页 华东师范大学数学科学学院 School of Mathematical Sciences, ECNU Contents 1 函数基础 1 函数基础 2 数据的作用域 3 预编译与多文件结构 函数的定义 声明与调用 函数间的参数传递 函数嵌套 内联函数 4 C++ 系统函数

函数的定义 函数是程序设计中, 对功能的抽象, 是 C++ 的基本模块 C++ 程序是由函数构成的 ( 一个或多个函数 ) C++ 程序必须有且只能有一个 main 函数 函数的定义 类型标识符函数名 ( 形式参数表 ) { 语句 } 函数体 函数头 NOTE 类型标识符指明本函数的类型, 即函数返回值的类型, 若没有返回值, 可用 void 4

形式参数表 形式参数列表类型标识符变量, 类型标识符变量,...... 形式参数 ( 简称形参 ) 需要指定数据类型 有多个形参时, 用逗号隔开, 每个形参需单独指定数据类型 如果函数不带参数, 则形参可以省略, 但小括号不能省 形参只在函数内部有效 int my_max(int x, int y) // OK int my_max(int x, y) // ERROR 函数返回值 通过 return 语句给出, 如 : return x 若没有返回值, 可以不写, 也可以写不带表达式的 return 5

函数的调用 函数调用前须先声明 类型标识符函数名 ( 形式参数表 ); 可以在主调函数中声明, 也可以在所有函数之外声明 有时也称为函数原型 函数的调用方式 函数名 ( 实参数列表 ) 被调函数可以出现在表达式中, 此时必须要有返回值 主调函数与被调函数 被调函数在主调函数后定义, 须在调用前声明 被调函数在主调函数前定义, 则主调函数中可以直接调用 6

函数定义举例 ex04_fun_01.cpp int my_max(int x, int y) { if (x>y) return x; else return y; } double my_power(double x, int k) { double y = 1.0; ex04_fun_02.cpp for (int i=1; i<=k; i++) y = y * x; } return y; 7

函数的调用过程 int main() {... fun1();... fun2();... } int fun1() {... fun3();... } int fun2() {... } int fun3() {... } 8

函数的调用举例 例 : 输入一个二进制数, 输出相应的十进制数 ex04_bin2dec.cpp 思考 如何计算 1111 1111 1111 1111 对应的十进制数?( 提示 : 字符数组 ) 例 : 利用 sin 函数的 Taylor 展开计算 sin(pi/2) 的值 ( 直到级数某项的绝对值小于 10-15 为止 ) 3 5 7 2k 1 x x x x k 1 x sin( x) = + + = ( 1) 1! 3! 5! 7! (2k 1)! k= 1 思考 利用上面的公式计算 sin(41*pi/2), 结果如何? ex04_mysin.cpp 9

函数的调用举例 例 : 找出 11~999 之间的数 m, 满足 m m 2 和 m 3 均为回文数 分析 : 利用除以 10 取余的方法, 从最低位开始, 依次取出该数的各位数字 按反序重新构成新的数, 比较与原数是否相等, 若相等, 则原数为回文数 NOTE ex04_huiwen.cpp 回文数 : 各位数字左右对称的整数, 如 11,121,1331 10

举例 : 随机数 例 : 随机数的生成需包含头文件 cstdlib seed=11; srand(seed); % 设置种子 x=rand(); % 返回一个随机整数 rand(): 返回一个 0 ~ RAND_MAX 之间的伪随机整数 srand(seed): 设置种子 如不设定, 默认种子为 1 相同的种子对应相同的伪随机整数 每次执行 rand() 后, 种子会自动改变, 但变化规律是固定的 ex04_rand_01.cpp 思考 如何生成 [a, b] 之间的随机整数? 如何生成 [0, 1] 之间的随机小数? ex04_rand_02.cpp ex04_rand_03.cpp 11

举例 : 计时函数 例 : 计时函数 :clock #include <ctime> 需包含头文件 ctime...... clock_t t0, t1; double totaltime;...... t0 = clock();...... t1 = clock(); totaltime=(double)(t1 - t0) / CLOCKS_PER_SEC; ex04_time_01.cpp NOTE clock(): 返回进程启动后所使用的 cpu 总滴答数 ( 毫秒 ) 12

举例 : 计时函数 例 : 计时函数 :time #include <ctime> 需包含头文件 ctime...... time_t t0, t1; t0 = time(null); // t0 = time(0)...... t1 = time(null); t = t1 - t0; ex04_time_02.cpp NOTE time(null): 返回从 1970 年 1 月 1 日 0 时 0 分 0 秒至今的总秒数 clock 以滴答 ( 毫秒 ) 为单位,time 以秒为单位 13

猜数游戏 例 : 猜数游戏由计算机随机产生 [1,100] 之间的一个整数, 然后由用户猜测这个数 要求根据用户的猜测情况给出不同的提示 : 如果猜测的数大于产生的数, 则显示 Larger; 小于则显示 Smaller; 等于则显示 You won! 同时退出游戏 用户最多有 7 次机会 ex04_game.cpp Tips: 如何生成每次都不同的随机整数? srand(time(null)); // srand(time(0)) x = rand(); 14

函数的参数传递机制 传递方式一 : 值传递 形参只在函数被调用时才分配存储单元, 调用结束即被释放 实参可以是常量 变量 表达式 函数 ( 名 ) 等, 但它们必须要有确定的值, 以便把这些值传送给形参 实参和形参在数量 类型 顺序上应严格一致 传递时是将实参的值传递给对应的形参, 即单向传递 形参获得实参传递过来的值后, 便与实参脱离关系, 即此后形参的值的改变不会影响实参的值 15

举例 int main() {...... x = 3.0; n = 2; y = my_power(x, n);...... } double my_power(double x, int k) {...... } ex04_fun_11.cpp 思考 编写一个函数, 交换两个整数的值 ex04_fun_12.cpp 16

函数的参数传递机制 : 引用 传递方式二 : 引用传递 引用是一种特殊类型的变量, 可看作是变量的别名 通过引用传递, 可以实现在改变形参值的同时改变实参值 引用的声明 : & ex04_ref_01.cpp int a; int & ra = a; // 声明一个指向 a 的引用 a = 3; cout << "a=" << a << endl; ra = 5; // ra 和 a 共享同一个存储空间 cout << "a=" << a << endl; 17

引用 NOTE 声明一个引用时必须初始化, 指向一个存在的对象 引用一旦初始化就不能改变, 即不能再指向其它对象 若引用作为形参, 则调用函数时才会被初始化, 此时形参是实参的一个别名, 对形参的任何操作也会直接作用于实参 void swap_new(int & a, int & b) { int t = a; a = b; b = t; } int main() { int x = 5, y = 8; cout << "x=" << x << ", y=" << y << endl; ex04_ref_02.cpp } swap_new(x, y); cout << "x=" << x << ", y=" << y << endl; 18

函数的嵌套 函数可以嵌套调用, 但不能嵌套定义 函数也可以递归调用 ( 函数可以直接或间接调用自己 ) 例 : 利用右边的公式计算阶乘 : n! 1 ( n = 0) = nn ( 1)! ( n> 0) ex04_factorial.cpp NOTE 对同一个函数的多次不同调用中, 编译器会给函数的形参和局部变量分配 不同的存储空间, 它们互不影响 19

递归 factorial(4) Step 9: return 24 Step 8: return 6 return 4 * factorial(3) Step 0: executes factorial(4) Step 1: executes factorial(3) return 3 * factorial(2) Step 7: return 2 return 2 * factorial(1) Step 2: executes factorial(2) Step 3: executes factorial(1) Step 6: return 1 return 1 * factorial(0) Step 4: executes factorial(0) Step 5: return 1 return 1 20

举例 : 汉诺塔问题 有三根针 A B C; A 针上有 N 个大小不同的盘子, 大的在下, 小的在上 ; 把这 N 个盘子从 A 针移到 C 针, 在移动过程中可以借助 B 针 ; 要求 :(1) 每次只允许移动一个盘,(2) 在移动过程中在三根针上的盘子都要保持大盘在下, 小盘在上 数学归纳 A B C 法 21

举例 : 汉诺塔 A B C A B C A B C A B C A B C 22

举例 : 汉诺塔 分析 : 该问题可分解为下面三个步骤 : (1) 将 A 上 n-1 个盘子移到 B 针上 ( 借助 C 针 ); (2) 把 A 针上剩下的一个盘子移到 C 针上 ; (3) 将 n-1 个盘子从 B 针移到 C 针上 ( 借助 A 针 ); 上面三个步骤包含两种操作 : 1 将多个盘子从一个针移到另一个针上, 这是一个递归的过程, 我们用 hanoi 函数实现 2 将 1 个盘子从一个针上移到另一针上, 该过程用 move 函数实现 ex04_hanoi.cpp 23

内联函数 内联函数声明与使用 定义与普通函数一样, 只需加关键字 inline 编译时在调用处用函数体进行替换 使用内联函数能节省参数传递 控制转移等开销, 从而提高代码的执行效率 ex04_inline.cpp NOTE 内联函数通过应该功能简单 规模小 使用频繁 内联函数体内不建议使用循环语句和 switch 语句 有些函数无法定义成内联函数, 如递归调用函数等 24

目录页 华东师范大学数学科学学院 School of Mathematical Sciences, ECNU Contents 2 数据的作用域 1 函数基础 2 数据的作用域 3 预编译与多文件结构 4 C++ 系统函数 什么是作用域, 局部作用域 局部变量, 全局变量 作用域解析运算符, 命名空间 生存期, 静态变量 形参的缺省值, 函数重载

作用域 数据的作用域 : 数据在程序中有效的区域 C++ 中常见的作用域 函数原型作用域 局部作用域 ( 函数, 语句块等 ) 命名空间作用域 类作用域 26

函数原型作用域 函数原型作用域 : 函数原型声明时形参的作用范围 int my_max(int x, int y); x, y 的作用域仅限于形参列表的左右括号之间 NOTE 在函数原型声明时可省略变量名, 但类型不能省! 27

局部作用域 函数体内声明的变量, 作用域从声明开始, 到声明所在的 语句块结束为止 double my_power(double x, int k) { if (k==1) return x; else { double y = 1.0; for (int i=1; i<=k; i++) y = y * x; return y; } } NOTE 语句块 : 一对大括号括起来的部分 x, k 的作用域 y 的作用域 i 的作用域 ex04_var_local.cpp 28

局部变量与全局变量 每个变量都有作用域, 即在程序中哪些地方可以使用该变量 函数定义时的形参和函数中定义的变量, 均为局部变量, 只在该函数内有效 ; 语句块中定义的变量是局部变量, 只在该语句块中有效 ; for 循环初始语句中定义的变量是局部变量, 只在 for 循环中有效 ; 在所有函数外定义的变量为全局变量, 在它后面定义的函 数中均可以使用 ; 若要在它前面定义的函数中使用该全局变量, 则需声明其为外部变量, 即 : extern 类型名变量名 ex04_var_01.cpp ex04_var_02.cpp 29

局部变量与全局变量 若局部变量与全局变量同名, 则优先使用局部变量! #include<iostream> using namespace std; int k = 2; // 全局变量 int main() { int i=5, x; // 局部变量 x=i+k; cout << "x=" << x << "\n" << endl; ex04_var_03.cpp { } int k=16; // 局部变量 x=i+k; cout << "x=" << x << "\n" << endl; } x=i+k; cout << "x=" << x << "\n" << endl; 30

作用域解析运算符 作用域解析运算符 :: 若存在同名的局部变量和全局变量, 则缺省自动引用局部变 量, 若需引用全局变量, 可在变量名前加 :: #include<iostream> using namespace std; int i = 2; // 全局变量 int main() { int i=5; // 局部变量 { int i=7; // 局部变量 cout << "i=" << i << endl; // i=7 } cout << "i=" << i; // i=5 cout << " 全局变量 i=" << ::i; // 引用全局变量,i=2 } 31 ex04_var_global.cpp

命名空间 大型程序通常由不同模块组成, 不同模块中的类和函数可能存在重名 为解决这个问题,C++ 引入命名空间概念 命名空间的定义 namespace 命名空间名 { ( 命名空间内的各种声明, 包括函数声明, 类声明等 ) } 命名空间内的元素, 可以是类 函数 变量等, 均称为名字 命名空间的使用 :using 可以将命名空间中的所有名称都导入到当前作用域中 也可以只导入指定的某个名称 32

命名空间举例 namespace mynames { int k = 10; double pi = 3.14; int my_max(int x, int y); double my_power(double x, int k); } example using namespace mynames; // 导入 mynames 中的所有名字 using mynames::my_max; // 只导入 my_max mynames::my_power(1.2,3); // 直接使用 mynames 中的 my_power 函数 ex04_namespace_01.cpp ex04_namespace_02.cpp ex04_namespace_03.cpp 33

标准命名空间 标准库的所有函数 类 对象等, 都在 std 命名空间中 using namespace std; // 导入标准命名空间中所有名字 example using std::cout; // 只导入标准命名空间中的 cout example ex04_namespace_04.cpp 34

生存期 静态生存期 : 生存期与程序的运行期相同, 即一直有效 动态生存期 : 当对象所在的程序块执行完后即消失 静态变量和全局变量 : 静态生存期 动态变量 : 动态生存期 NOTE 局部变量缺省为动态变量 35

静态变量 static 类型名变量名 ; static int i=5; // 静态变量声明 example 静态变量的特点 静态局部变量不会随函数的调用结束而消失, 下次调用该函数时, 该变量会保持上次调用后的值! 没有初始化的静态变量会自动赋初值 0 静态变量只初始化一次! ex04_var_static.cpp 36

形参的缺省值 函数在定义时, 可以预先给形参设定一个值 ( 即缺省值 ), 函数被调用时, 如给定实参, 则采用实参值, 否则就可以采用这个预先给定的缺省值 好处 : 调用时可以不提供或提供部分实参 int add(int x=5, int y=6) { return x+y; } example int main() { add(10,20); //10+20 add(); //5+6 add(10); //10+6 } 37

如何给形参设定缺省值 问题 : 如果有多个形参, 有的带缺省值, 有的不带, 怎么处理? 形参缺省值按照从右向左顺序声明 带缺省值的形参, 其右面不能有不带缺省值的形参 ( 在函数调用时, 实参与形参的配对是按从左向右的顺序进行的 ) int add(int x, int y=5, int z=6); // 正确 example int add(int x=1, int y=5, int z); // 错误 int add(int x=1, int y, int z=6); // 错误 38

设定缺省值的位置 问题 : 缺省值是在函数声明时设定, 还是在函数定义时设定? 同一作用域中, 哪个在前就由哪个设定, 后面的不能再设定 ( 若先声明, 后定义, 则声明时设定, 定义时就不能再设定, 反之亦然 ) 不同作用域中的声明, 可设定不同的缺省值 int add(int x=5, int y=6); int main() { add(); // 调用在实现前 } int add(int x=5,int y=6) { return x+y; } int main() { int add(int x, int y) { return x+y; } example 注意 : 这里不能再出现缺省形参! } add(); // 调用在实现后 ex04_defaultvalue_01.cpp ex04_defaultvalue_02.cpp ex04_defaultvalue_03.cpp 39

函数重载 C++ 允许功能相近的函数在相同的作用域内采用相同的函数名, 从而形成重载, 方便使用, 便于记忆 两个以上的函数, 具有相同的函数名, 但形参的个数或类型不同, 调用时, 编译器会根据实参和形参的最佳匹配, 自动 确定调用哪一个函数, 这就是函数重载 int add(int x, int y) // 整数的加法 { return x + y; } ex04_overload.cpp double add(double x, double y) // 浮点数的加法 { return x + y; } 40

函数重载 重载函数的形参必须不同 : 个数不同或类型不同 int add(int x, int y); double add(double x, double y); int add(int x, int y); int add(int x, int y, int z); example 形参类型不同 形参个数不同 如果函数名相同, 形参个数与类型也相同, 则无论函数返回值的类型是否相同, 编译时会认为语法错误! 不要将功能不同的函数定义为重载函数! 在使用带有默认形参的重载函数时, 要注意防止二义性! int add(int x, int y=1); int add(int x); add(10); //??? example 41

目录页 华东师范大学数学科学学院 School of Mathematical Sciences, ECNU Contents 3 预编译与多文件结构 1 函数基础 2 数据的作用域 3 预编译与多文件结构 4 C++ 系统函数 头文件 符号常量 条件编译 多文件结构 外部变量, 外部函数

编译预处理 加入头文件 #include < 文件名 > // 按标准方式导入头文件, // 即在系统目录中寻找指定的文件 #include 文件名 // 先在当前目录中寻找, 然后再按标准方式搜索 常用的头文件 iostream iomanip cmath ctime cstdlib fstream 基本输入输出操纵符数学函数计时函数 abs,rand,srand,system,... 文件操作 43

编译预处理 定义符号常量 #define PI 3.14159 // 定义符号常量 #undef PI // 删除由 #define 定义的符号常量 NOTE 在很多情况下可以由 const 实现该功能 #define 还可以用来定义带参数的宏, 但也可以用内联函数取代 44

条件编译 #if 常量表达式 程序正文 #endif // 当 常量表达式 非零时编译 #if 常量表达式 程序正文 #else 程序正文 #endif // 当 常量表达式 非零时编译 // 否则编译这段程序 45

条件编译 #if 常量表达式 1 程序正文 #elif 常量表达式 2 程序正文 #elif 常量表达式 3 // 当 常量表达式 1 非零时编译 // 否则, 当 常量表达式 2 非零时编译 程序正文 // 否则, 当 常量表达式 3 非零时编译...... #else 程序正文 #endif // 否则编译这段程序 46

条件编译 #ifdef 标识符程序正文 #else 程序正文 #endif // 当 标识符 已由 #define 定义时编译 // 否则编译这段程序 #ifndef 标识符 程序正文 // 当 标识符 没有定义时编译 #else 程序正文 #endif // 否则编译这段程序 47

多文件结构 一个程序可以由多个文件组成, 编译时可以使用工程 / 项目来 组合 若使用命令行编译, 则需要同时编译 48

外部变量和外部函数 如果需要用到其它文件中定义的变量和函数, 则需要用 extern 声明其为外部变量和外部函数 extern 类型名变量名 ; extern 函数声明 ; 49

目录页 华东师范大学数学科学学院 School of Mathematical Sciences, ECNU Contents 4 C++ 系统函数 1 函数基础 2 数据的作用域 3 预编译与多文件结构 标准 C++ 函数 ( 库函数 ) 非标准 C++ 函数 函数举例 : 定积分近似计算 4 C++ 系统函数

C++ 系统函数 系统函数分类 标准 C++ 函数 ( 库函数 ): 各类头文件中定义的函数 (cmath, ctime,...) 参见 http://www. cppreference.com 非标准 C++ 函数 : 操作系统或编译环境提供的函数 NOTE C++ 的系统库中提供了几百个函数可供程序员直接使用 使用库函数时要包含相应的头文件函数, 如 cmath 充分使用库函数不仅可以大大减少编程工作量, 还可以提高代码的可靠性和执行效率 ex04_cmath.cpp 51

函数举例 : 定积分近似计算 例 : 计算定积分 的近似值 bb SS = ff xx ddxx = llllll xx iiff xx ii aa xx ii 00 hh = bb aa nn 0 ππ 2 sin xx dxx nn = llllll nn ii=11 hhff xx ii nn bb aa = llllll nn nn ii=11 ff xx ii srand(time(0)); for(int i=1; i<=n; i++) { x = a + length*double(rand())/rand_max; S = S + sin(x); } cout << "S=" << length/n*s << endl; ex04_integral.cpp 52

上机作业 1) 编写两个函数, 分别求两个正整数的最大公约数与最小公倍数, 要求用递归方 法计算最大公约数, 最小公倍数则可以通过调用最大公约数实现 在主函数中计算 2012 与 1509 的最大公约数与最小公倍数 ( 函数名分别为 gcd 和 lcm, 程序取名 hw04_01.cpp) int gcd(int x, int y) int lcm(int x, int y) 2) 编写函数, 判断一个整数是否为素数, 并在主函数中找出三位数中所有的素数, 在屏幕上输出时每行输出 8 个 ( 程序取名 hw04_02.cpp) bool is_prime(int n) 3) 编写函数, 判断给定的年份是否为闰年, 并在主函数中输出 21 世纪 (2001 至 2099 年 ) 中所有的闰年, 每行输出 5 个 ( 程序取名 hw04_03.cpp) ( 闰年 : 能被 400 整除 ; 或者能被 4 整除但不能被 100 整除 ) bool is_leap_year(int year) 53

上机作业 4) 编写程序, 用 while 实现猜数游戏 ( 可在示例程序 ex04_game.cpp 上修改, 程序取名 hw04_04.cpp) 5) Emirp 数 : 如果一个素数反转后仍然是素数, 则称这个素数为 emirp 数 如 13 是素数, 反转后 31 也是素数, 故 13 和 31 都是 emirp 数 编写程序, 输出前 100 个 emirp 数, 每行输出 5 个 ( 程序取名 hw04_05.cpp) 要求 : 先编写两个函数 :is_prime 和 reverse, 分别用于判断素数和计算反序数 bool is_prime(int n) int reverse(int n) 6) 梅森素数 : 如果一个素数可以写成 2 p -1 的形式, 则称该素数为梅森素数 编写程序, 找出所有 p<32 的梅森 (Mersenne) 素数, 并以如下形式输出 2 3 3 7 5 31...... ( 注意优化循环次数, 程序取名 hw04_06.cpp) 思考 : 如果条件改为 p<64, 程序怎么编? 54

上机作业 7) 3n+1 问题 : 给定一个正整数 n, 不断按照下面的规律进行运算 : 如果当前数是偶数, 则下一个数为当前数除以 2, 如果当前数为奇数, 则下一个数为当前数乘 3 加 1 整个过程直到当前数是 1 为止 这样形成的数列的长度称为数 n 的链数 如 : 从 3 开始, 得到的数列为 :3, 10, 5, 16, 8, 4, 2, 1, 所以整数 3 的链数为 8 (a) 编写一个函数 ( 函数名 num_chain ), 计算给定的正整数的链数 ; (b) 找出 [90, 100] 中, 链数最大的那个数 ( 程序取名 hw04_07.cpp) int num_chain(int n) // 使用循环计算链数 8) 使用递归实现上面问题中的函数 num_chain ( 主程序取名 hw04_08.cpp) 9) 编写函数, 用递归方法计算 Fibonacci 数, 并在主函数中计算第 40 个 Fibonacci 数 ( 程序取名 hw04_09.cpp) long fibo(int n) 55

上机作业 10) 给定一个正整数, 使用递归方法找出其所有的素数因子 ( 程序取名 hw04_10.cpp ) void prime_factor(int n) 提示 : 先找出最小的素数因子, 然后除以这个数, 得到商, 再找商的最小素数因子, 以此类推, 构成递归 注意递归的出口 只要在屏幕上输出这些素数因子, 不用保存 例如,84 的所有素数因子为 2,2,3,7 56

上机作业 11) 蒙特卡洛 (Monte Carlo) 投点法计算定积分的近似值 选定一个简单大区域 : 要求覆盖阴影部分, 且容易计算面积 ; 往这个大区域中随机投点 ( 假 定投 N 个点 ), 统计落在阴影 部分的点的个数 ( 设为 M 个 ) 计算阴影部分面积的近似值 y 2 sin xx dxx 0 ππ 程序取名 hw04_11.cpp f( x) SS = MM NN 大区域的面积 S b = f ( x) dx a o a b x 57