c语言大学实用教程第5章函数.ppt
《c语言大学实用教程第5章函数.ppt》由会员分享,可在线阅读,更多相关《c语言大学实用教程第5章函数.ppt(79页珍藏版)》请在三一办公上搜索。
1、第5章 函数与程序结构,C语言大学实用教程,内容提要,函数定义、函数调用、函数原型、函数返回值难点:函数的参数传递与返回值 全局变量、自动变量、静态变量、寄存器变量难点:变量的作用域与存储类型 结构设计与模块化 代码风格问题,程序设计的艺术,程序设计方式A.诸葛亮型的主函数1986年IBM在OS/360的研究结果:大多数有错误的函数都大于500行B.功能单一,规模较小的若干个函数各司其职1991年对148,000行代码的研究表明:小于143行的函数比更长的函数更容易维护,程序设计的艺术,三国演义中有这样一段描写:懿问曰:“孔明寝食及事之烦简若何?”使者曰:“丞相夙兴夜寐,罚二十以上皆亲览焉。所
2、啖之食,日不过数升。”懿顾谓诸将曰:“孔明食少事烦,其能久乎?”此话音落不久,诸葛亮果然病故于五丈原。“事无巨细”,“事必躬亲”管理学的观点是极其排斥这种做法的,认为工作必须分工,各司其职其中的思想,在程序设计里也适用,程序设计的艺术,结构化程序设计有两大最高级的艺术算法设计艺术结构设计艺术C语言为程序的结构提供了两样武器函数和模块函数(function)是结构设计的最基本单位“一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。”Geoffrey James的编程之道,数学函数(1),自变量,因变量,函数名,数学函数(2),一个自变量,一个因变量,两个自变量,一个因变量,数学函数(3
3、),自变量,因变量,数学函数(4),一个变量二个变量N个变量,一个变量二个变量N个变量,自变量与因变量的关系,数学函数(5),集合A,关系,集合B,程序设计中的函数,程序设计中的函数不局限于计算计算类,如打印阶乘表的程序判断推理类,如排序、查找,用函数解决问题的要点,分而治之函数把较大的任务分解成若干个较小的任务,并提炼出公用任务复用程序员可以在其他函数的基础上构造程序,而不需要从头做起信息隐藏设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚,C中的函数(Function),说明:一个源程序文件由一个或多个函数组成。C程序的执行从main函数开始,
4、调用其他函数后流程回到main函数,在main函数中结束整个程序运行。所有函数都是平行的,即函数定义时是互相独立的,一个函数并不从属于另一个函数。,例2.1:一个简单的C程序例子,#include/*函数功能:计算两个整数相加之和 入口参数:整型数据a和b 返回值:整型数a和b之和*/int Add(int a,int b)return(a+b);/*主函数*/main()int x,y,sum=0;printf(Input two integers:);scanf(%d%d,/*输出x和y相加之和*/,并列的两个函数其中一个是程序的入口,程序注释,函数的分类,标准函数,即库函数 用户自定义函
5、数,函数定义(definition),返回值类型 函数名(类型 参数1,类型 参数2,)函数体return 表达式;如果没有参数,则应该用void注明函数的返回值只有一个如果不需要返回值,则应该用void定义返回值类型返回值类型与return语句配合当函数执行到return语句时,就中止函数的执行,返回到调用它的地方函数内部可以定义只能自己使用的变量,称内部变量。参数表里的变量也是内部变量,函数的返回值是通过函数中的 return 语句获得的。,函数参数,函数参数:形参(形式参数):在定义函数时,定义函数名后面括号中的变量名实参(实际参数):在主调函数中调用一个函数,调用函数名后面括号中的参数
6、(或表达式),实参,形参,实参的数量必须与形参相等,对应的类型必须匹配;实参与形参有各自的存储空间,所以形参值的改变不会影响实参;参数的类型没有限制,也可以定义没有参数的函数;,函数调用(call),从实参到形参是单向值传递调用函数时,必须提供所有的参数(且必须是已赋值的)特例,printf和scanf是采用变长变量表定义的函数,所以变量的个数不固定。提供的参数个数、类型、顺序应与定义时相同,例5.1a 计算两个整数的平均数,/*函数功能:计算平均数 函数入口参数:整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值:平均数*/int Average(int x,int y)int
7、result;result=(x+y)/2;return result;,例5.1b 使用了Average函数的main(),main()int a=12;int b=24;int ave;ave=Average(a,b);printf(Average of%d and%d is%d.n,a,b,ave);,函数调用(call),有返回值时放到一个数值表达式中如 c=max(a,b);作为另一个函数调用的参数如 c=max(max(a,b),c);printf(%dn,max(a,b);无返回值时函数调用表达式如 display(a,b);,函数原型(prototype),返回值类型 函数名(
8、类型 参数1,类型 参数2,);调用一个函数之前,先要对其返回值类型、函数名和参数进行声明(declare)(不声明也能使用,但运行结果可能不稳定)有助于编译器进行类型检查除了末尾分号外,声明的语法格式与函数定义的首部完全一致;,例5.1,#include int Average(int x,int y);/*声明Average()函数*/main()int a=12;int b=24;int ave=Average(a,b);printf(Average of%d and%d is%d.n,a,b,ave);/*函数功能:计算平均数 函数入口参数:整型x,存储第一个运算数 整型y,存储第二个
9、运算数 函数返回值:平均数*/int Average(int x,int y)int result;result=(x+y)/2;return result;,例5.1,int Average(int x,int y);/*声明Average()函数*/main()/*主函数*/int ave=Average(a,b);/*调用函数Average*/int Average(int x,int y)/*自定义函数Average*/,例5.1,#include/*函数功能:计算平均数 函数入口参数:整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值:平均数*/int Average(i
10、nt x,int y)int result;result=(x+y)/2;return result;main()int a=12;int b=24;int ave=Average(a,b);printf(Average of%d and%d is%d.n,a,b,ave);,当返回值为整型或者函数定义在函数调用前面时,可以省略原型,main()a();,a 函数b();return;,b函数return;,在被调函数中,又调用了函数-嵌套调用,函数的嵌套调用,循序渐进式编程实验4:小学生加法考试题,通过输入两个加数给学生出一道加法运算题,输入答案正确:right错误:Not correct!
11、Try again!,循序渐进式编程实验4:小学生加法考试题,void Print(int flag)if(flag)printf(Right!n);else printf(Not correct!n);,实验4:小学生加法考试题,/*函数功能:计算两整型数之和,如果与用户输入的答案相同,则返回1,否则返回0 函数参数:整型变量a和b,分别代表被加数和加数 函数返回值:当a加b的结果与用户输入的答案相同时,返回1,否则返回0*/int AddTest(int a,int b)int answer;printf(%d+%d=,a,b);scanf(%d,main()int a,b,answer;
12、printf(Input a,b:);scanf(%d,%d,do while(answer=0);,实验4:小学生加法考试题,main()answer=AddTest(a,b);Print(answer,chance);,chance=0;do chance+;while(answer=0,实验4:小学生加法考试题,srand(time(NULL);error=0;score=0;for(i=0;i10;i+)a=rand()%10+1;b=rand()%10+1;answer=AddTest(a,b);Print(answer);if(answer=1)score=score+10;els
13、e error+;,实验4:小学生加法考试题,作业,P162,5.7,5.8,软件测试,测试通过运行测试用例找出软件中的Bug测试的目的发现更多的Bug测试人员的主要任务站在使用者的角度,通过不断使用和攻击,尽量多的找出Bug如何提高可测试性(tesability)一条语句写一行才容易测试,软件测试,测试只能证明程序有错,不能证明程序无错,测试的重要性测试人员水平越高,找到Bug的时间就越早,软件就越容易修复,产品发行就越稳定越大型的软件开发,测试人员占整个软件产品团队的总人数的比重就越大,甚至一半以上成功的测试在于发现迄今为止尚未发现的Bug,软件测试方法的分类,从代码和用户使用的角度分类覆
14、盖性测试从代码特性的角度(即内部)出发的测试单元测试,功能测试,提交测试,基本验证测试,回归测试使用测试从用户的角度(即外部)出发的测试配置测试,兼容性测试,性能测试,Alpha和Beta测试,强力测试,文档和帮助文件测试,软件测试方法的分类,第2种分类方法白盒测试(结构测试)在完全了解程序的结构和处理过程的情况下,按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作黑盒测试(功能测试)不考虑程序内部的结构和处理过程,软件测试方法的分类,第3种分类方法手工测试依靠人力来查找Bug自动测试编写一些测试工具,让他们自动运行来查找Bug优点:快,广泛缺点:只能检查一些最重要的问
15、题,如内存泄漏、死机等,无法发现一般性的日常错误,而且编写测试工具的工作量很大,程序中常见的出错原因,编译错误指在编译过程中发现的错误,通常属于语法错误,即编写的语句不符合C语言的语法规则。Undefined symbol xxx 标识符xxx未定义Expression syntax error 表达式语法错误Too few parameter in call 函数调用时的实参少于函数的形参,程序中常见的出错原因,运行错误指在程序运行时发生的错误往往是由于语义上的错误造成的,即语句虽然合乎语法,但要求计算机去做不该做或做不到的事情。例如当用0做除数时,运行后将显示“Division by ze
16、ro”错误提示信息,并立即返回编辑屏幕。查看运行结果时,可在User screen(用户屏幕)上看到给出的错误提示信息。,程序中常见的出错原因,逻辑错误程序中有逻辑错时,不影响程序运行并得到运行结果,只是运行结果不正确。比较隐蔽,出错后不易查找。累加求和运算时,累加和变量忘记了赋初值;累乘运算时,累乘变量初值赋值为0;函数声明时的返回值数据类型与实际返回的数据类型不一致,导致自动类型转换数组下标越界(即超出了定义的范围);程序中存在死循环;,调试的基本方法,“粗分细找”定位大致的范围:归纳、推理、二分、排除缩减输入数据设法找到能导致失败的最小输入 采用注释的办法切掉一些代码减少有关的代码区域,
17、调试无误后再将它们打开注释,即采用分而治之的策略将问题局部化 利用调试工具逐条语句跟踪插入打印语句观看屏幕输出结果,44,VC+6.0中的调试功能项及快捷键,程序调试实例 例5.11,#include int Factorial(int x);main()int x;while(1)/*无限循环*/printf(请输入一个正整数 x(若输入-1退出程序):);scanf(%d,存在一处错误!,程序调试实例 例5.11,/*函数功能:计算x的阶乘 函数入口参数:整型x 函数返回值:阶乘运算结果*/int Factorial(int x)int i,result;for(i=1;i=x;i+)re
18、sult*=i;return result;,存在一处错误!,程序调试实例 例5.11,/*函数功能:计算x的阶乘 函数入口参数:无符号长整型x 函数返回值:阶乘运算结果*/unsigned long Factorial(unsigned int x)unsigned long i,result=1;for(i=2;i=x;i+)result*=i;return result;,关于代码风格问题,缩进(indent)保证代码整洁、层次清晰的主要手段,int isprime(int n)int k,i;k=sqrt(double)n);for(i=2;i=k;i+)if(n%i=0)return
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 大学 实用教程 函数

链接地址:https://www.31ppt.com/p-6503827.html