模块化程序设计1.ppt_第1页
模块化程序设计1.ppt_第2页
模块化程序设计1.ppt_第3页
模块化程序设计1.ppt_第4页
模块化程序设计1.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2019年7月26日星期五,济南大学信息学院,第三章 模块化程序设计,3.1 模块化程序设计思想 3.2 函数定义 3.3 函数调用 3.4 函数的原型与声明 3.5 函数的嵌套与递归 3.6 库函数 3.7 变量的作用域与存储类型 3.8 指针与函数,2019年7月26日星期五,济南大学信息学院,上节内容回顾,主函数main的内容: 主要就是函数调用及输出。,void main( ) ,自定义函数的内容: 主要就是程序主功能的完成,然后返回值。,函数返回值类型 函数名 (形参) 除形参外的其它变量定义; 功能完成语句; 函数返回语句return; ,变量定义 实参赋值 函数调用 输出结果printf,2019年7月26日星期五,济南大学信息学院,定义函数时需要解决的问题: 有没有参数?即:需要从主函数中传递数据吗? 参数的个数: 参数的类型:int、float、double、char或指针 是否有返回值?即:是否向主函数返回计算结果? 返回值的类型:void?其它int、float?,2019年7月26日星期五,济南大学信息学院,int max(int x, int y) void main( ) ,2、 函数调用的形式,函数名(实参);,3、 函数间的参数传递,平行定义,3.3.3 函数的返回值,济南大学信息学院,C语言程序设计,第5页,int max(int x, int y) int z; z=xy?x:y; return(z); ,1、函数的返回值是通过return语句获得的。 return语句的作用是终止当前函数的执行并将一个确定值带回主调函数中,return语句的一般形式是:,return(表达式);,或:return 表达式;,2、函数返回值的类型:在定义函数时指定,int max(int x, int y),double power(int x, int y),语言规定,凡不指定类型的函数,自动按整型(int)处理。,max(int x, int y),int max(int x, int y),济南大学信息学院,C语言程序设计,第6页,函数值的类型与return语句中表达式的类型应一致;若不一致,则以函数类型为准(自动转换)。,int max(double x, double y) return(xy?x:y); ,3、一个函数可以有多个return语句,但每次调用只有一个return语句被执行,因此函数的返回值只有一个。,4、对于有返回值的函数,若return语句后面没有表达式,或没有return语句,此时带回一个不确定的返回值。,return;,5、为了明确表示“不带回值”,用void定义“无类型”(或称“空类型”,即无返回值)。,void main( ) ,2019年7月26日星期五,济南大学信息学院,无参数、无返回值的函数定义及调用,、编写一个函数,打印一行信息“How do you do!”,printf(“How do you do!n“);,_ dayin( _ ) ,void,void main( ) ,dayin( );,#include ,自定义函数: 有没有参数:无 不需要从主函数中传递数据。 是否有返回值:无 不需要向主函数返回结果。,2019年7月26日星期五,济南大学信息学院, 输入圆的半径r,用自定义函数area实现圆的面积,并在主函数中输出最终的结果。,float area(int m) ,#include /普通设计 void main() int r; float a; scanf(“%d”, ,float s; s=3.14*m*m; return s;,a=area(r);,得到的信息: 函数有返回值,类型为float; 函数有参数,个数为1个,类型为int。,济南大学信息学院,C语言程序设计,第9页,例3.2 输入两个整数,计算其平均值。要求用函数实现平均值的计算。,average函数: 有没有参数:有 参数的个数:2 参数的数据类型:int 是否有返回值:有 返回值的类型:float 或 double,float average(int x,int y) float result; result=(x+y)/2.0; return(result); ,void main( ) int a,b; float ave; scanf(“%d%d“, ,主函数:函数调用 average函数:实现平均值的计算。,使用函数计算 1+1/3+1/5+1/n(n为奇数)的和。其中,n是从键盘上随机输入的一个整数。,int i,n; float sum; sum=0; printf(“input n:n”) scanf(“%d”,#include void main( ) ,fun函数: 有没有参数:? 参数的个数:? 参数的数据类型:? 是否有返回值:? 返回值的类型:?,2019年7月26日星期五,济南大学信息学院,#include float fun(int n) void main( ) int n; printf(“Input n:“); scanf(“%d“, ,int i; float sum=0; for (i=1; i=n; i+=2) sum+=1.0/i; return(sum);,int i,n; float sum=0; printf(“input n:n”) scanf(“%d”,不使用函数的做法 #include void main( ) ,2019年7月26日星期五,济南大学信息学院,编写函数,计算下式前n项的和。注意,n在主函数中输入,计算结果在主函数中输出。例如,当n=10时,结果为0.909091。,#include double fun(int m) void main( ) int n; printf(“Input n:“); scanf(“%d“, ,int i; double s=0; for (i=1; i=m; i+) s=s+1.0/(i*(i+1); return(s);,2019年7月26日星期五,济南大学信息学院,例1:定义一个函数,判断整数m是否是素数。是素数返回整数1,不是返回0。,isPrime( ) ,int m,int,int i,k; k=sqrt(m); for (i=2;i=k;i+) if (m%i=0) return(0); return(1);,判断m是否是素数可以让m被2、3、4 去除,若 能被其中的任何一个数整除,则证明不是素数。,#include void main() int x; printf(“please input a num:n”); scanf(“%d”, ,2019年7月26日星期五,济南大学信息学院,例2:定义一个函数,判断某一年是否闰年,是则返回1,不是返回0.,leap( ) ,int year,int,if (year%4=0,EG307.C,实验8的一个题目:编写函数,判断指定的字符是否数字字符,如果是返回1,否则返回0。,2019年7月26日星期五,济南大学信息学院,说明: 、被调用的函数必须已经存在;,、使用库函数时,应在文件开头用#include命令将有关头文件包含进来;,#include #include #include ,、若用户自己定义的函数在主调main函数之后,则应在main函数之前对被调用的函数作声明。,声明:将函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统。 - 即由函数定义时的函数首部加分号构成。,2019年7月26日星期五,济南大学信息学院,3.4 函数的原型与声明,在函数调用之前应当对所调用的函数进行声明,指出该函数的返回值的类型以及形参的个数和类型,编译器据此对函数调用进行语法检查,保证函数使用的正确性。,1、函数声明的格式:,函数类型 函数名( 形参表 );,例: float fun(double a, int b, float c); float fun(double, int, float); float fun(double x, int y, float z);,即函数首部 加”;”,2019年7月26日星期五,济南大学信息学院,2、说明: 、函数声明的位置:是在所有函数(包括main函数)的外部进行函数声明(推荐)。,、如果自定义函数出现在主调函数之前,可以不必进行声明。-(推荐),#include int max(int x, int y); void main( ) int max(int x, int y) ,#include int max(int x, int y) void main( ) ,2019年7月26日星期五,济南大学信息学院,3.5 函数的嵌套与递归,3.5.1 函数的嵌套调用,语言的函数定义都是互相平行的、独立的,即不允许嵌套定义函数(即在一个函数内部定义另一个函数); 但是,可以嵌套调用函数,即程序在调用一个函数的过程中,该被调函数又可以调用其它函数。,void main( ) : fun( ); : ,void fun( ) : g( ); : ,main函数,fun函数,g函数,2019年7月26日星期五,济南大学信息学院,例3.4 编程求 , 输入k和n的值,分析: 假设输入k=3, n=5, 即求13+23+33+43+53 ,累加题。 可分为以下4步求解: 输入n和k的值 乘方运算,即计算xk 求和运算,即计算1k+2k+nk 输出结果 需要编写三个函数:乘方函数、求和函数、main 函数,注意: main函数调用求和函数,而求和函数又调用乘方函数 main函数中将n和k作为实际参数, 把它们的值传给求和函数,2019年7月26日星期五,济南大学信息学院,#include void main( ) /*主函数*/ int k, n; float sum; /* 为什么用float型定义变量?*/ printf(“input:k,n “); /*提示信息*/ scanf(“%d%d“, ,2019年7月26日星期五,济南大学信息学院,/*求和函数1t+2t+mt */ float sigma( int m, int t) int i; float sum, p; sum=0; for (i=1; i=m; i+ ) p=power(i, t); sum=sum+p; return (sum) ; ,/*乘方函数pq -重点掌握 p*p*p*p */ float power(int p, int q) int i; float product; product=1; for(i=1; i=q; i+) product=product*p; return (product); ,调用乘方函数,2019年7月26日星期五,济南大学信息学院,void main( ) int k, n; float sum; printf(“input:k,n “); scanf(“%d%d“, ,float sigma( int m, int t) int i; float sum, p; sum=0; for (i=1; i=m; i+ ) p=power(i, t); sum=sum+p; return (sum) ; ,float power(int p, int q) int i; float product; product=1; for(i=1; i=q; i+) product=product*p; return(product); ,#include,完整程序:,参数值的传递过程: main sigma power n m k t q i p,2019年7月26日星期五,济南大学信息学院,函数在被调用的过程中,又直接或间接地调用自身,则称函数的递归调用。这种函数也被称为递归函数。语言允许函数的递归调用。,3.5.2 函数的递归调用,例3.5 用递归方法求整数n的阶乘n!。,分析:一般来说,n!描述成为: n!=1*2*3*(n-1)*n 但是,变换一下,就可以将其描述成为: n!=n*(n-1)*3*2*1=n*(n-1)!,2019年7月26日星期五,济南大学信息学院,EG807.C,2019年7月26日星期五,济南大学信息学院,n=5 result=fact(5),result=120,递推,回溯,递归过程图示,2019年7月26日星期五,济南大学信息学院,3.6 库函数,库函数:即系统已经定义好、具有特定功能的函数。这些函数可以直接使用,不必

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论