清华大学C 课件

上传人:我*** 文档编号:146152724 上传时间:2020-09-27 格式:PPT 页数:69 大小:483KB
返回 下载 相关 举报
清华大学C 课件_第1页
第1页 / 共69页
清华大学C 课件_第2页
第2页 / 共69页
清华大学C 课件_第3页
第3页 / 共69页
清华大学C 课件_第4页
第4页 / 共69页
清华大学C 课件_第5页
第5页 / 共69页
点击查看更多>>
资源描述

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

1、第六章 函数、递推与递归,函数的概念、定义、调用和返回 带自定义函数的程序设计 递推算法 递归思想及算法实现,内 容 要 点,为什么需要函数? 满足实际应用需求,6.1 函数,函数是组成 C/C+ 程序的基础 C/C+ 库中已经为用户提供了许多标准库函数 用户可以根据自己的需要选用合适的库函数 如果没有所需函数,用户可自己定义和编写一些函数,函数概述,函数是模块化的基本单位 主调函数与被调函数 程序、源文件与函数关系 程序中各模块关系, int main() int a, b, sum; sum = Add( a, b ); / 函数调用 ,int Add( int x, int y ) ;

2、/ 函数声明,int Add( int x, int y ) / 函数定义 / 函数体取代函数声明尾部的分号,要使用C+函数,必须 完成如下工作: 提供函数定义 提供函数声明(原型) 调用函数,函数定义:有返回值的函数 没有返回值的函数(void函数),void functionName (parameterList) /没有返回值 return; / 可选 ,typeName functionName (parameterList) /有返回值 return value; ,【任务6.1】素数判定,思路:设计一个函数 int checkprime(int a) , 负责检查 a 是否为素数:

3、 如果是素数,该函数返回 1; 否则,该函数返回 0。,#include #include using namespace std; int main( ) int a=0; cout a; if ( checkprime(a) ) / 函数调用 cout a 是素数 endl; else cout a 不是素数 endl; return 0; ,int checkprime( int n); / 函数声明,int checkprime(int n) / 函数定义,n为形式参数 int k=0; for (k = 2; k = sqrt(n); k = k+1) if (n % k = 0)

4、/ 如果 n 能被k整除则返回0 return 0; return 1; / n 不能被k整除则返回1 ,函数原型 int checkprime(int n);,提高算法效率 只要在 1 和 n 之间存在一个因子就可终止,并返回 n 不是素数 若 n 可被 2 整除,不需检验其它数,程序终止并返回 n 不是素数;若否,则所有偶数都不是因子,程序只需检验奇数 程序不必检验因子一直到 n,只需到sqrt(n)即可,int checkprime( int n ) int i; if( n % 2 = 0 ) return 0; for( i = 3; i = sqrt(n); i += 2 ) if

5、( n % i = 0 ) return 0; return 1; ,问题1:本算法效率? 每次迭代都需要计算平方根,很费时,问题2:本算法正确性? n=1 n=2 时结果错误,int checkprime( int n ) int limit, i; limit = sqrt(n); if( n % 2 = 0 ) return 0; for( i = 3; i = limit; i += 2 ) if( n % i = 0 ) return 0; return 1; ,问题:本算法正确性? 浮点数的存储有误差,程序的正确性依赖于机器的表示精度,int checkprime( int n )

6、 int limit, i; limit = sqrt(n) + 1; if( n % 2 = 0 ) return 0; for( i = 3; i = limit; i += 2 ) if( n % i = 0 ) return 0; return 1; ,改进后的正确函数:,函数定义: int checkprime( int n ) checkprime 为函数名 int 是函数返回值的数据类型 n 为函数的形式参数,形式参数也要定义其数据类型,形式参数的特点: 定义函数时放在函数名后的括号中 函数未被调用时不占内存空间 函数被调用时系统为其分配内存空间 函数调用结束后释放内存空间 作用

7、域限定在函数内,属于局部变量,函数声明(原型): 例:int checkprime( int n) ; 要放在主函数之前,告诉系统有自定义的函数可以被调用。,函数原型确保: 编译器正确处理函数返回值 编译器检查使用的参数数目是否正确 编译器检查使用的参数类型是否正确,函数调用: 一个函数在调用子函数时,要将实在参数赋给形式参数。 实在参数是一个具有确定值的表达式。,例如:if ( checkprime(a) ),实在参数的个数及类型应与形式参数一致, 赋值时前后对应关系不能改变。,int checkprime( int n ) ,如何设计(定义)函数? 函数名称 参数 返回值,求整数的绝对值

8、int abs(int x) return ; ,求两个正整数的最小公倍数 int lcm(int x, int y) ,计算n! unsigned long Factorial(int n) ,求Fibonacci数列的第n项 unsigned long Fibonacci(int n) ,求一元二次方程的根 ? Compute(double a, double b, double c) ? ,判断a是否为素数 int checkPrime(int n) ,计算整型数组元素的和 int Sum( ? ) ,将数组元素排序 ? Sort( ? ) ? ,编写函数 Add,求两个整数之和,int

9、 Add( int x, int y ) int t; t = x + y; return t; ,函数定义示例:Add 函数,int Add( int x, int y ) return x+y; ,编写函数 Compare,比较两个整型数据 x、y 的大小。若 x 等于 y 返回 0,若 x 大于 y 返回 1,若 x 小于 y 返回 -1,int Compare( int x, int y ) int t; if( x = y ) t = 0; else if( x y ) t = 1; else t = -1; return t; ,函数定义示例: Compare函数,; 多条 ret

10、urn 语句 int Compare( int x, int y ) if( x = y ) return 0; else if( x y ) return 1; else return -1; ,编写函数 Swap,互换两个整型数据 x、y 的值,void Swap( int x, int y ) int t; t = x; x = y; y = t; return; / 没有返回值只需直接写return语句 ,函数定义示例:Swap 函数,int IsDigit( char c ) if( c = 0 ,int IsDigit( char c ) if( c = 48 ,函数定义示例:Is

11、Digit 函数,char TransformIntoUpperCase( char c ) if( c = a ,函数定义示例: TransformIntoUpperCase 函数,编写函数 IsLeapYear,判断某个给定年份是否为闰年,int IsLeapYear( int year ) return year % 4 = 0 ,函数定义示例: IsLeapYear 函数,int mysqrt(int x) int i=1,sum=0,count=0; while (sum=x) sum+=i; count+; i+=2; return count-1; ,求整数的平方根,取其整数部分

12、,思考:参数的有效性、合法性判断应 放在函数里? 放在主程序里?,int mysqrt(int x) int i=0; while (i*i=x) i+; return i-1; ,函数定义示例: 我的平方根函数, int main() int times; char ch; coutch; while (ch!=q) couttimes; n_chars(ch, times); coutch; coutBye!n; return 0; ,例:字符串输出,void n_chars(char, int);,void n_chars(char c, int n) while (n- 0) cout

13、c; coutn; , double cube(double x); int main() double p,q; p = 1.2; q = cube(p); coutp=pendl; cout实参p的地址是 ,例:, int main() int x, y; cinx; ciny; coutx“ “yendl; (1) Swap( x, y ); coutx“ “yendl; (4) return 0; ,例:互换两个整数,输入:10 20,输出: 10 20 (1) 10 20 (2) 20 10 (3) 10 20 (4),函数调用栈框架:,值传递与数据互换问题,值传递:值复制操作 将实

14、际参数值复制给形式参数 此过程单向不可逆 复制完成后,形参与实参没有任何关联,如何解决数据值互换问题? 使用全局变量作为函数通信的手段 使用指针传递变量的地址,缺点: 将全局变量作为函数调用环境的一部分, 没有在函数声明头部显式给出来,不易理解 代码逻辑。, int a, b; /* 全局变量,保证所有函数都可以访问到 */ void Swap(); /* 不再需要函数参数 */ int main() cina; cinb; couta“ “bendl; Swap(); couta“ “bendl; return 0; ,void Swap() int temp; couta“ “bendl;

15、 temp = a; a = b; b = temp; couta“ “bendl; return; ,输出: 10 20 10 20 20 10 20 10,【任务6.2】给歌手打分,定义int Max( int a,int b)函数,返回a,b中的大者 定义int Min( int a,int b)函数,返回a,b中的小者 定义整型变量p,用以保存 N个数中的最大值 定义整型变量q,用以保存 N个数中的最小值 定义一个整型变量 sum 做累加用 最终得分: (sum-p-q) / (N-2),# include #include using namespace std; int Max( int , int ); int Min( int , int ); int main( ) int p = 0; int q = 100; int sum = 0,x = 0; int i = 1; for ( i = 1; i x ; p = Max( x, p ) ; q = Min( x, q ) ; sum =

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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