清华大学C 课件9(最新课件)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020-11-19
3
函数概述
• 函数是模块化的基本单位 • 主调函数与被调函数 • 程序、源文件与函数关系 • 程序中各模块关系
main
fun1
fun2
fun3
2020-11-19
fun4
fun5
program
main (){} fun1 (){} fun2 (){}
fun3 (){} fun4 (){} fun5 (){}
if( n % i == 0 ) return 0;
} return 1; }
2020-11-19
问题:本算法正确性? 浮点数的存储有误差,程序的正确性依赖于机器的表示精度
11
改进后的正确函数:
int checkprime( int n ) { int limit, i; limit = sqrt(n) + 1;
2020-11-19
7
#include <iostream>
#include <cmath>
using namespace std;
int checkprime( int n); int main( )
/Biblioteka Baidu 函数声明
{ int a=0;
cout << "请输入一个整数:a=";
cin >> a;
if ( checkprime(a) )
12
函数定义: int checkprime( int n ) checkprime 为函数名 int 是函数返回值的数据类型 n 为函数的形式参数,形式参数也要定义其数据类型
形式参数的特点: ✓ 定义函数时放在函数名后的括号中 ✓ 函数未被调用时不占内存空间 ✓ 函数被调用时系统为其分配内存空间 ✓ 函数调用结束后释放内存空间 ✓ 作用域限定在函数内,属于局部变量
void functionName (parameterList) { ……
return; // 可选 }
//没有返回值
2020-11-19
6
【任务6.1】素数判定
思路:设计一个函数 int checkprime(int a) , 负责检查 a 是否为素数: 如果是素数,该函数返回 1; 否则,该函数返回 0。
问题2:本算法正确性? n=1 n=2 时结果错误
2020-11-19
10
int checkprime( int n ) { int limit, i; limit = sqrt(n); if( n % 2 == 0 )
return 0; for( i = 3; i <= limit; i += 2 ) {
2020-11-19
13
函数声明(原型): 例:int checkprime( int n) ;
要放在主函数之前,告诉系统有自定义的函数可以被调用。
函数原型确保: ✓ 编译器正确处理函数返回值 ✓ 编译器检查使用的参数数目是否正确 ✓ 编译器检查使用的参数类型是否正确
2020-11-19
14
函数调用: 一个函数在调用子函数时,要将实在参数赋给形式参数。 实在参数是一个具有确定值的表达式。
2020-11-19
9
int checkprime( int n ) {
int i; if( n % 2 == 0 )
return 0; for( i = 3; i <= sqrt(n); i += 2 ) { if( n % i == 0 )
return 0; } return 1; }
问题1:本算法效率? 每次迭代都需要计算平方根,很费时
if( n % 2 == 0 ) return 0;
for( i = 3; i <= limit; i += 2 ) {
if( n % i == 0 ) return 0;
} return 1; }
if( n <= 1 ) return 0; if( n == 2 ) return 1;
2020-11-19
例如:if ( checkprime(a) )
调用时
17
17
实在参数 a
形式参数 n
实在参数的个数及类型应与形式参数一致, 赋值时前后对应关系不能改变。
2020-11-19
要使用C++函数,必须 完成如下工作: ✓ 提供函数定义 ✓ 提供函数声明(原型) ✓ 调用函数
5
函数定义:有返回值的函数 没有返回值的函数(void函数)
typeName functionName (parameterList) { ……
return value; }
//有返回值
第六章函数、递推与递归 清华大学
2020-11-19
1
内容要点
➢ 函数的概念、定义、调用和返回 ➢ 带自定义函数的程序设计 ➢ 递推算法 ➢ 递归思想及算法实现
2020-11-19
2
6.1 函数 为什么需要函数?—— 满足实际应用需求
✓ 函数是组成 C/C++ 程序的基础 ✓ C/C++ 库中已经为用户提供了许多标准库函数 ✓ 用户可以根据自己的需要选用合适的库函数 ✓ 如果没有所需函数,用户可自己定义和编写一些函数
{ if (n % k == 0)
// 如果 n 能被k整除则返回0
return 0; }
return 1;
// n 不能被k整除则返回1
}
2020-11-19
有何问题?
8
• 函数原型 int checkprime(int n);
提高算法效率 只要在 1 和 n 之间存在一个因子就可终止,并返回 n 不是素数 若 n 可被 2 整除,不需检验其它数,程序终止并返回 n 不是素数;若否,则所有偶数都不是因子,程序只需 检验奇数 程序不必检验因子一直到 n,只需到sqrt(n)即可
4
……
int Add( int x, int y ) ; int main() {
int a, b, sum; …… sum = Add( a, b ); …… }
// 函数声明 // 函数调用
int Add( int x, int y ) // 函数定义 { …… …… } // 函数体取代函数声明尾部的分号
// 函数调用
cout << a << "是素数" << endl;
else
cout << a << "不是素数" << endl;
return 0;
}
int checkprime(int n)
// 函数定义,n为形式参数
{ int k=0;
for (k = 2; k <= sqrt(n); k = k+1)