第三章 模块化程序设计01_第1页
第三章 模块化程序设计01_第2页
第三章 模块化程序设计01_第3页
第三章 模块化程序设计01_第4页
第三章 模块化程序设计01_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第三章模块化程序设计济南大学-信息学院C语言程序设计第1页3.1模块化程序设计思想3.2函数定义3.3函数调用3.4函数的原型与声明3.5函数的嵌套与递归3.6库函数3.7变量的作用域与存储类型3.8指针与函数济南大学-信息学院C语言程序设计第2页#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}voidmain(){inta,b,c;scanf("%d%d",&a,&b);

c=max(a,b);printf("max=%d\n",c);}一个完整的函数一个完整的函数自定义函数首部自定义函数体教材第3页例1.3函数首部注意:①程序永远从main函数开始。②max(a,b)是什么?③自定义函数max()函数体函数-模块化程序设计的体现济南大学-信息学院C语言程序设计第3页mainabcdefghi结构化程序设计的特点:自顶向下、逐步细化、模块化C语言程序的基本单位是函数有且至少有一个函数main()结构化程序由三种基本结构组成:A模块B模块顺序结构选择结构判断条件成立吗?成立

不成立A模块B模块循环结构循环体

循环条件满足吗?3.1模块化程序设计的思想什么是模块化程序设计?

模块化程序设计就是将一个复杂的大问题,分解为一个个独立的简单的小问题(即模块),分别解决简单的小问题,进而解决复杂的大问题。在C语言中,这些独立的简单的模块就是函数。

济南大学-信息学院C语言程序设计第4页功能分解是一个自顶向下、逐步求精的过程。必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用(即使用)。阶乘模块fac(n)的实现:

f=1; for(i=1;i<=n;i++) { f=f*i; }济南大学-信息学院C语言程序设计第5页例3-1:计算fac(k)fac(m)+fac(n)mk只需实现模块fac()即可#include<stdio.h>//普通设计voidmain(){ inti,k,m,n; floatx,y,z; scanf("%d%d%d",&k,&m,&n);

x=1;//fac(k) for(i=1;i<=k;i++) x=x*i;

y=1;//fac(m) for(i=1;i<=m;i++) y=y*i;

z=1;//fac(n) for(i=1;i<=n;i++) z=z*i;

printf("%f\n",x/(y+z));}济南大学-信息学院C语言程序设计第6页

x=fac(k);//调用函数,并赋值给xy=fac(m);

//调用函数,并赋值给y

z=fac(n);

//调用函数,并赋值给zfloatfac(intn){ inti; floatf=1; for(i=1;i<=n;i++) f=f*i; returnf;}模块即函数3.2函数定义济南大学-信息学院C语言程序设计第7页在C语言中,函数分为以下两种:(1)

库函数是由系统提供的,用户不用定义,只需用#include包含其头文件,即可直接使用。如:printf()、scanf()、sqrt()等。(2)自定义函数:这种函数是根据具体需求编写的,以完成相应的功能。函数定义就是编写实现函数功能的程序模块。函数使用之前必须先定义后调用。

本章学习的内容voidmain(){ intk,m,n; floatx,y,z; scanf("%d%d%d",&k,&m,&n);

x=fac(k); y=fac(m); z=fac(n);

printf("%f\n",x/(y+z)); }济南大学-信息学院C语言程序设计第8页函数定义格式:

函数返回值类型函数名(形参表){函数体;}#include<stdio.h>floatfac(intn){

inti; floatf=1; for(i=1;i<=n;i++) f=f*i; returnf;}函数调用格式:函数名(实参表);例如:x=fac(k);例如:floatfac(intn){…}01二月2023济南大学·信息学院1、函数定义的形式:函数类型函数名(数据类型形参1,数据类型形参2,……){

其它变量声明部分语句部分}2、说明:①、函数由两部分构成:函数首部和函数体;②、函数返回值类型:即函数值(返回值)的类型

若函数无返回值,函数定义时应写上void③、函数名的命名规则与变量一样,同一个文件中函数名不能重复!intmax(intx,inty){

……}voidmain(){

……}济南大学-信息学院C语言程序设计第10页④、参数(形参)列表:需说明参数的个数和类型,多个参数间用逗号间隔,也可以无参数,但括号不能省。书写格式

:

每一个形参都要写上数据类型和参数名;参数之间以逗号分隔,无参数时函数值返回值一般写上void

。函数名后的括号一定要有。floataverage(floata1,floata2,floata3){……}形参不能写成:floata1,a2,a3

×济南大学-信息学院C语言程序设计第11页⑤、函数体:由左右花括号括起来的部分。包括说明部分和语句部分,是实现函数的核心部分

说明部分:定义函数内除形参以外的其它变量等;

语句部分:实现函数功能的执行语句;函数返回值类型函数名(形参表){

变量说明部分;

语句部分;}注意:不要在函数体中再次定义参数列表中出现的变量。济南大学-信息学院C语言程序设计第12页C语言不允许在一个函数内定义另一个函数,即不能嵌套定义。所有函数在书写时都是平行的,通常写在main上方。main(){floata,b,s;scanf(“%f%f”,&a,&b);

s=area(a,b);printf("s=%f",s);}floatarea(floata,floatb){floats;s=a*b;returns;}应为平行关系:floatarea(floata,floatb){……}main(){……}×嵌套定义注意济南大学-信息学院C语言程序设计第13页voidmain(){ intk,m,n; floatx,y,z; scanf("%d%d%d",&k,&m,&n);

x=fac(k); y=fac(m); z=fac(n);

printf("%f\n",x/(y+z)); }#include<stdio.h>floatfac(intn){

inti; floatf=1; for(i=1;i<=n;i++) f=f*i;

returnf;}主函数函数调用函数定义,通常写在main函数上方济南大学-信息学院C语言程序设计第14页例:①、编写一个函数,函数中打印一行信息“Howdoyoudo!”printf("Howdoyoudo!\n");____dayin(____){}void

voidmain(){}dayin();#include<stdio.h>经验1:数据已知或固定则不需要作为参数传递;值事先不确定则需要参数传递!经验2:不要求计算结果或没有计算出一个数值则不需要返回值。主函数函数调用函数定义3.3函数调用(函数使用)济南大学-信息学院C语言程序设计第15页3.3.1函数调用的形式1、形式:函数名(实参表列);2、说明①、实参表列由0到多个实参名组成,实参之间用逗号分隔②、实参与形参的个数应相等,类型应一致,顺序要一一对应③、调用无参函数的格式为:

函数名();例如:dayin();#include<stdio.h>intmax(intx,inty

){intz;if(x>y)z=x;elsez=y;return(z);}voidmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b

);printf("max=%d\n",c);}函数调用形参实参济南大学-信息学院C语言程序设计第16页3、函数调用的方式①、函数调用语句:–无返回值函数的调用

由函数调用加上分号构成,在主调函数中可作为一个独立的语句;此时不要求函数带回返回值②、函数表达式:

函数调用作为一个运算对象出现在表达式中,此时要求函数带回一个确定的值以参加表达式的运算c=max(a,b);y=2*pow(x,2.5);③、函数参数:

函数调用作为另一个函数的实参,其值作为一个实际参数传给被调函数的形参;此时也要求函数带回一个确定值m=max(a,max(b,c));printf("%d\n",max(a,b));3.3.2函数间的参数传递济南大学-信息学院C语言程序设计第17页把需要参数的函数称为“有参函数”,不需要参数的函数称为“无参函数”。

形式参数:定义函数时函数名后面括号内的变量,简称形参

实际参数:调用函数时函数名后面括号内的变量,简称实参#include<stdio.h>intmax(intx,inty){return(x>y?x:y);}voidmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("Max=%d.\n",c);}形参实参函数调用的说明济南大学-信息学院C语言程序设计第18页运行期间,只有当函数被调用时,形式参数才被分配存储空间;调用结束后,形参所占的空间将被释放;实参与形参一一对应。

可以是常量,变量或表达式;实参和形参的类型应相同或赋值相容;实参对形参的数据传递是“值传递”,

即单向传递;

即函数内形参的值无法传给实参。实参行参01二月2023济南大学·信息学院#include<stdio.h>voidsum(intx,inty,intz){x=10;y=20;z=x+y;printf("x=%d,y=%d,z=%d\n",x,y,z);}voidmain(){inta=1,b=2,c=0;sum(a,b,c);printf("a=%d,b=%d,c=%d\n",a,b,c);}x=10,y=20,z=30a=1,b=2,c=0EG305.C济南大学-信息学院C语言程序设计第20页定义函数时需要解决的问题:有没有参数?即:需要从主调函数中传递数据吗?参数的个数:参数的类型:int、float、double、char或指针是否有返回值?即:是否向主调函数返回计算结果?返回值的类型:void?其它int、float?3.3.3函数的返回值济南大学-信息学院C语言程序设计第21页intmax(intx,inty){intz;z=x>y?x:y;

return(z);}1、函数的返回值是通过return语句获得的。return语句的作用是终止当前函数的执行并将一个确定值带回主调函数中return语句的一般形式是:return(表达式);或:return

表达式;2、函数返回值的类型:在定义函数时指定intmax(intx,inty)doublepower(intx,inty)C语言规定,凡不指定类型的函数,自动按整型(int)处理。max(intx,inty)intmax(intx,inty)济南大学-信息学院C语言程序设计第22页

函数值的类型与return语句中表达式的类型应一致;若不一致,则以函数类型为准(自动转换)。intmax(doublex,doubley){return(x>y?x:y);}3、一个函数可以有多个return语句,但每个return后的表达式类型要相同;当执行到其中任何一个return语句时会立即返回主调函数4、对于有返回值的函数,若return语句后面没有表达式,或没有return语句,此时带回一个不确定的返回值。return;5、为了明确表示“不带回值”,可以用void定义“无类型”(或称“空类型”,即无返回值)。voidmain(){…}济南大学-信息学院C语言程序设计第23页例:输入圆的半径r,用自定义函数area实现圆的面积,并在主函数中输出最终的结果。也可以这样思考:area(){}main(){intr;floata;scanf(“%d”,&r);a=3.14*r*r;printf(“theareais%f”,a);}实参,可以和形参重名

floats;s=3.14*m*m;returns;

a=area(r);intmfloat编写函数的技巧:济南大学-信息学院C语言程序设计第24页主函数的内容:主要就是函数调用。voidmain(){}自定义函数的内容:主要就是程序功能的完成,,然后返回值。函数返回值类型函数名(形参){

除形参外的其它变量定义;执行语句;

函数返回语句;}变量定义输入实参函数调用输出结果01二月2023济南大学·信息学院sum函数:有没有参数:有参数的个数:2参数的数据类型:float或int是否有返回值:有返回值的类型:float或int主函数:函数调用sum函数:实现求和的计算。例题:编写函数sum,它的功能是计算a+|b|,a和b都要从主函数中输入,计算结果也要在主函数中输出。例题:编写函数sum,它的功能是计算a+|b|,a和b都要从主函数中输入,计算结果也要在主函数中输出。参考程序:#include<stdio.h>#include<math.h>

sum(){}voidmain(){floata,b,s;

printf("\nPleaseinputtwonum:");

scanf("%f%f",&a,&b);

s=sum(a,b);

printf("\n%f\n”,s);}floatfloatx,floatyfloatz;z=a+fabs(b);returnz;济南大学-信息学院C语言程序设计第27页例3.2输入两个整数,计算其平均值。要求用函数实现平均值的计算。average函数:有没有参数:有参数的个数:2参数的数据类型:int是否有返回值:有返回值的类型:float或doublefloataverage(intx,inty){floatresult;result=(x+y)

温馨提示

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

评论

0/150

提交评论