《04模块化程序设计(函数).ppt》由会员分享,可在线阅读,更多相关《04模块化程序设计(函数).ppt(80页珍藏版)》请在优知文库上搜索。
1、第四章第四章 模块化程序设计(函数)模块化程序设计(函数)一、模块化设计与函数一、模块化设计与函数l把大型软件按照规定的原则划分成一个个较小的、相对独立但又相互关联的模块,叫做模块化设计。l1965年,G.A.Miller在他的著名文章“奇妙的数字72人类信息处理能力的限度”中指出,普通人分辨或记忆同一类信息的不同品种或等级的数量一般不超过59项。这表明,要使人的智力能足以管理好程序,应该坚持模块化设计。正如不分段的长篇文章可能使读者感到头痛一样,大型的单模块软件不仅可读性差,可靠性也常常难以保证。lC语言中,模块化设计的重要工具是“自定义函数”。一、模块化设计与函数一、模块化设计与函数【例一
2、】参见 P5例1.3#include #include main( ) /*主调函数*/ int a,b,c; int max(int,int); /*函数原型*/ clrscr( ); printf(Input a,b=); scanf(%d,%d,&a,&b); c=max(a,b); printf(max=%dn,c);int max(int x,int y) /*被调函数*/ int z; if (xy) z=x; else z=y; return z;一、模块化设计与函数一、模块化设计与函数本章的学习首先要讨论什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调
3、用一个函数?函数学习的难点是什么?一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么? 什么是函数?一个独立的程序模块,可以定义自己的变量(仅在本函数内有效),拥有自己的存储空间。可以被其他函数或自身调用(主函数除外)。 一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么? 为什么要使用函数?u 便于实现模块化设计u 便于团队开发u 便于使用现有的或别人的程序模块提高编程效能在C程序设计中,通常: 将一个
4、大程序分成几个子程序模块(自定义函数) 将常用功能做成标准模块(标准函数)放在函数库中供其他程序调用 如果把编程比做制造一台机器,函数就好比其零部件。l可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试。l这些“零部件”可以是自己设计制造/别人设计制造/现在的标准产品一、模块化设计与函数一、模块化设计与函数【例二】编写一个儿童算术能力测试软件main() char ans = y; clrscr( ); cover( ); /*调用软件封面显示函数*/ password( ); /*调用密码检查函数*/ while (ans =y| ans =Y) question( );
5、/*调用产生题目函数*/ answers( ); /*调用接受回答函数*/ marks( ); /*调用评分函数*/ results( ); /*调用结果显示函数*/ printf(“是否继续练习?(Y/N)n”); ans=getch ( ); printf(“谢谢使用,再见!”); 自定义函数一、模块化设计与函数一、模块化设计与函数【例二】编写一个儿童算术能力测试软件main() char ans = y; clrscr( ); cover( ); /*调用软件封面显示函数*/ password( ); /*调用密码检查函数*/ while (ans =y| ans =Y) questio
6、n( ); /*调用产生题目函数*/ answers( ); /*调用接受回答函数*/ marks( ); /*调用评分函数*/ results( ); /*调用结果显示函数*/ printf(是否继续练习?(Y/N)n); ans=getch ( ); printf(谢谢使用,再见!);/*定义所用函数*/cover() /*软件封面显示函数*/password() /*密码检查函数*/question() /*产生题目函数*/answers() /*接受回答函数*/marks() /*评分函数*/results() /*结果显示函数*/ n 这些函数现在不编程或还不会编程,可先放空。n 可
7、以多人合作,每人完成若干个函数(模块化)。n 可在另一个源程序文件中定义。Lets try一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学习的难点是什么? 函数有哪些类型?根据函数的来源,可分为:u库函数(标准函数) 由系统提供,编程时可直接使用之u自定义函数 由编程者自己编写,使用时要“先定义后使用”根据使用的方式,可分为:u无参函数 u有参函数(函数内需要使用主调函数中的数据)一、模块化设计与函数一、模块化设计与函数什么是函数?为什么要使用函数?函数有哪些类型?如何自己定义一个函数?如何调用一个函数?函数学
8、习的难点是什么?u 如何自己定义一个函数? (见后)u 如何调用一个函数? (见后)u 函数部分学习的难点是什么? 函数的概念 形参/实参/返回值的概念 递归算法 变量的作用域和生存期 一、模块化设计与函数一、模块化设计与函数函数使用常识: P144l一个源文件由一个或多个函数组成,可为多个C程序公用。lC语言是以源文件为单位而不以函数为单位进行编译的。l一个C程序由一个或多个源(程序)文件组成可分别编写、编译和调试。lC程序执行总是从main函数开始,一般情况下调用其它函数后总是回到main函数,最后在 main函数中结束整个程序的运行。l所有函数都是平行的、互相独立的,即在一个函数内只能调
9、用其他函数,不能再定义一个函数(嵌套定义)。l一个函数可以调用其他函数或其本身,但任何函数均不可调用main函数。 二、函数的定义二、函数的定义函数定义“制造自己的函数”。 P1441、函数定义的一般形式 (参见例一) 函数返回值的数据类型 函数名(类型名 变量名1,类型名 变量名2,) 声明部分 处理语句 【注意】无形参表的即无参函数。无函数体的为“空函数”。如果函数返回值的数据类型为int,可以省略之。 传统方式见P146。类型标识符形参表二、函数的定义二、函数的定义把程序控制权从函数返回函数调用点有三种方法:l执行到函数结束的右花括号时(如果函数没有返回值);l执行到如下语句(如果函数没
10、有返回值): return;l把返回值返回调用处(见例一) return 表达式; 形式: return (x); return (x+y); return (xy?x:y); 语句中圆括号亦可省略。二、函数的定义二、函数的定义【注意】 如果函数值类型与return语句表达式值的类型不一致,以函数类型为准(数值型会自动进行类型转换)。 如果明确表示不需返回值,应使用void作函数返回值的数据类型,否则即使没有return语句,仍将带回一个不确定的值(见P149说明)。 三、函数的调用三、函数的调用1、库函数的调用 必须在源程序中用include命令将定义该库函数的头文件“包含进来”。调用方式:
11、 独立语句 执行某项操作,如clrscr( ), printf(“Input a,b=”)等表达式中 作运算对象,如 a=sqrt(x)+pow(r,3),c=exp(a) 等三、函数的调用三、函数的调用2、自定义函数 自定义函数和变量一样,在其主调函数中也必须“先声明,后使用”。 如例一中的 int max(int,int); /*函数原型*/ 例一中的自定义函数声明也可以用以下两种形式: P153 int max(int x,int y); (多余,因为编译系统并不检查参数名) 或 int max( );(编译系统将不检查参数类型和参数个数) 以下情况时,被调函数在主调函数中可以不先声明:
12、 P154l被调函数的返回值为整型时函数值是整型(int)或字符型(char)时系统自动按整型说明;l被调函数的定义出现在主调函数之前时l在所有函数定义之前,在函数的外部已做了函数声明时 调用方式同库函数。三、函数的调用三、函数的调用3、调用外部函数(其他源文件中定义的函数)时 函数说明语句 extern 函数名(); 【例二】 文件file1.c中main() int x=80,y=90,c; extern max(); /*函数说明*/ c=max(x,y)+20; /*调用max函数*/ printf(“Max is %dn”,c); 文件files2.c中(与file1.c同目录)ex
13、tern max(int a,int b) /*extern可省*/ float c; c=ab?a:b; return c; 注:要做一个 .prj文件才能运行。三、函数的调用三、函数的调用main() f1=f(x1); f2=f(x2); x=root(x1,x2); 例8.6嵌套调用关系(简化) float f(float x) float xpoint(float x1,float x2) y= 调用f(x1)、f(x2)float root(float x1,float x2); y1=f(x1) x=xpoint(x1,x2) y=f(x)4、函数的嵌套调用 P155例8.6三、
14、函数的调用三、函数的调用4、函数的嵌套调用 P155例8.6嵌套调用关系(示意图)例8.6模块划划分情况main( )n根据输入的x1,x2判断是否有根n若有,调用求根函数root( )n输出结果f(x)根据所给x值,求y=x3-5x2+16x-80返回y值,即与x对应的f(x)值xpoint( )根据所给x1,x2值计算弦与x轴的交点root(x1,x2 )根据所给x1,x2值求近似根补充内容补充内容: 计算方法与计算机数值求解计算方法与计算机数值求解计算方法工程数学之一一、计算方法研究内容:l高次方程求根l矩阵运算求解(通常归到线性代数中)l常微分方程数值求解l线性方程组求解l函数插值 计
15、算方法研究求解的算法,通过计算机程序数值求解。计算方法与计算机数值求解计算方法与计算机数值求解二、高次方程求根(近似解) 基本思路 方程f(x)=0处的x称为该方程的根 解法步骤:1、初始近似值(逐步扫描法异号必有根)2、逐步精确化(误差小于某许可值时,为所求近似根) 二分法 P121 习题6.13 迭代法 P121 习题6.11 牛顿法 P121 习题6.12 弦截法 P155 例8.6考试内容!例8.6“弦截法”原理二分法:设方程f(x)=0在区间(a,b)有一个根,取其中点x0=(a+b)/2。如果f(x0)与f(a)同号,则根在x0右侧,取a=x0,b不变,否则取b=x0,a不变。这样
16、就得到一个新的变小了的有根区间(a,b)。对此新的有根区间进行同样的处理,这样就可得到更小的有根区间当|a-b|e时,对应的x0即为所求根之近似解。e 为允许的误差迭代法:设有方程f(x)=0先设法将它化为 x=g(x)于是得到”迭代公式”: xn=g(xn-1)从给定的初始近似值x0出发,反复利用迭代公式求出 x0,x1,x2,x3,xn-1,xn当|xn-xn-1|e时,对应的xn即为所求根之近似解。e 为允许的误差例:求方程x3-x-1=0在x=1.5附近的一个根。步骤:将方程改造为迭代公式用x0=1.5代入,求得 x1=1.35721再代入,求得 x2=1.33086直到|xn-xn-1|e为止。e 为允许的误差 牛顿法:又称“牛顿切线法”(求值速度更快)。设有方程f(x)=0若已知它在x0附近有根,由其切线方程 y=f(x0)-f (x0)(x-x0)可得到”迭代公式”: xn+1= xn - f(xn)/f (xn)从给定的初始近似值x0出发,反复利用迭代公式求出 x0,x1,x2,x3,xn-1,xn当|xn-xn-1|e时,对应的xn即为所求根之近似解。e 为允许的误差