C语言程序设计:第4章 模块化设计与应用_第1页
C语言程序设计:第4章 模块化设计与应用_第2页
C语言程序设计:第4章 模块化设计与应用_第3页
C语言程序设计:第4章 模块化设计与应用_第4页
C语言程序设计:第4章 模块化设计与应用_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第4章模块化设计与应用主要内容:

模块化程序设计 函数定义 函数声明函数调用 函数的传递参数 函数的返回值 预处理模块化分4.1

模块化程序设计方法4.1.1模块化程序设计思想将整个系统进行分解成若干功能独立的,分别设计、编程和测试的模块。特点:程序员能单独地负责一个或几个模块的开发。开发一个模块不需要知道系统其它模块的内部结构和编程细节。模块之间的接口尽可能简明,模块应尽可能彼此隔离。具有可修改性具有易读性具有易验证性模块化分方法:自上向下,逐步分解,分而治之

4.1

模块化程序设计方法4.1.2

模块规划实例

例4-1简单计算器问题描述:完成一个简单的计算器程序。要求能够完成如下的常用运算:加、减、乘、除、取余、倒数、以e为底的对数、以10为底的对数、开平方、指数运算、正弦、余弦、正切、二、八、十、十六进制之间的相互转换、位运算符运算、位段位运算、求pi()和阶乘。

问题分析1.模块分类2.模块功能细化六则运算对数运算········以10为底的运算以e为底的运算········4.1.2

模块规划实例解决方案4.1

模块化程序设计方法简单计算器对数运算六则运算幂运算三角运算阶乘进制转换Pi位运算以e为底以10为底开方指数运算余弦正切正弦二转八十十六八转二十十六十转二八十六十六转二八十位运算符运算位段位运算

例4-2学生成绩档案管理问题描述:完成一个综合的学生成绩档案管理系统。要求能够管理N个学生的3门功课(英语、高数和C语言)的成绩,需要实现以下功能:读入/存储学生信息、录入/修改/删除学生基本信息、录入/修改成绩、按学号/姓名查询、排序、浏览、统计每门课的优、良、中等、及格、不及格人数。4.1

模块化程序设计方法

问题分析1.模块分类2.模块功能细化学生信息维护学生成绩维护········学生信息录入、修改、查询等········

解决方案学生成绩档案管理学生成绩管理学生档案管理查询统计录入成绩修改成绩读入学生信息录入学生信息修改学生信息删除学生信息存储学生信息按学号查询按姓名查询浏览排序4.2函数从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数函数分类4.2.1函数的定义一般形式:

函数类型函数名(数据类型参数1,数据类型参数2,…){函数体}函数的唯一标识,符合标识符命名规则

函数定义不允许嵌套函数返回值类型缺省int类型无返回值void类型floatmax(floatx,floaty){returnx>y?x:y;}4.2.2函数的声明

函数类型函数名(数据类型参数名1,数据类型参数名2,…);

不能略掉;函数声明一般形式:函数声明举例(1)voidmain(){

floatmax(floatx,floaty);//函数声明floata,b,c;c=max(a,b);}floatmax(floatx,floaty){returnx>y?x:y;}主调函数中对被调用函数的说明函数声明举例(2)floatmax(floatx,floaty);//函数声明voidmain(){//不需要再次声明float

max(float,float)

floata,b,c; c=max(a,b);}floatmax(floatx,floaty){returnx>y?x:y;}在所有函数定义之前,进行函数声明函数声明举例(3)floatmax(floatx,floaty)/*函数定义具有声明作用*/{returnx>y?x:y;}voidmain(){/*不需要再次声明float

max(float,float)*/floata,b,c;c=max(a,b);}当被调用的函数定义出现在主调函数之前函数声明举例(4)当被调用函数的函数类型为int型时main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);/*函数调用*/printf("maxis%d",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}4.2.3函数的调用函数名(实参表列);

说明(1)在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。(2)实参必须在类型上按顺序与形参一一对应和匹配。如果类型不匹配,C编译程序将按赋值兼容的规则进行转换。(3)调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。main(){inta,b,c;a=4;b=5;c=max(a,b);/*函数调用*/printf("maxis%d",c);}4.2.3函数的调用函数调用方式:函数表达式

例:m=max(a,b)*2;(2)函数语句

例:printf(“Hello,World!\n”);(3)函数实参例:m=max(a,max(b,c));4.2.4函数的传递参数

在主调函数和被调用函数之间的数据传递是通过函数的参数进行的。c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}max(intx,inty){intz;z=x>y?x:y;return(z);}main(){inta,b,c;scanf("%d,%d",&a,&b);

c=max(a,b);printf("Maxis%d",c);}形参实参参数传递单向值传递只能把实参的“值传递”给形参不能把形参的值传递给实参,即对形参的值所作的改变不能带回给实参实参和形参是不同的变量具有不同的存储空间形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放在函数没有被调用时,函数中的形参只是一个符号,系统并不为之分配内存空间,只有该函数被调用时,才会为之分配存储空间,并且在调用结束后,形参所占的内存也被释放。

例4-5定义一个有两个参数函数Swap,函数Swap能够完成对这两个参数的值的交换。

由此可以看出,虽然在函数Swap()中,变量nNum1和nNum2的值已经交换,但并没有影响到主函数中的nNumber1和nNumber2的值,此时仍然输出为nNumber1=4,nNumber2=7。这里,请读者思考一下:有没有办法使最后的输出结果为nNumber1=7,nNumber2=4呢?请到后面的第6章中找答案。对于主调函数和被调用函数之间的数据传递是通过函数参数实现的,实参变量对形参变量的数据传递是单向传递,即只由实参传给形参,而不能由形参传回来给实参的内容已讲述完毕。但读者可能希望通过函数调用使主调函数能得到一个被调用函数的执行结果,这又该如何实现呢?参数传递举例voidswap(intx,inty){ intt; t=x;x=y;y=t;}main(){ inta=1,b=4; swap(a,b);}1a4b1x4y41返回语句形式:return(表达式);

return表达式;

return;功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数说明:函数中可有多个return语句若无return语句,遇}时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换void型函数—不返回值,定义函数类型为空类型例:无返回值函数

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}4.2.5

函数的返回值4.3预处理预处理命令是由ANSI统一规定的,但不是C语言本身的组成部分,不能直接对它们进行编译。4.3.1文件包含所谓“文件包含”是指一个源文件将另外一个或多个源文件的全部内容包含到本文件之中。它是C预处理程序的一个重要功能,其一般形式为:

#include"文件名"

#include<文件名>4.3预处理文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。4.3.2宏定义 在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替换,这称为“宏替换”或“宏展开”。在C语言中,“宏”分为有参数和无参数两种。1.不带参数的宏定义

#define标识符字符串不是语句,而是一种编译预处理命令

作用:在编译预处理时,把程序中在该命令之后出现的所有标识符进行替换为字符串#include<stdio.h>#definePI3.14159#defineR5.3main(){

printf("area=%f\n",PI*R*R);

printf("circumference=%f\n",2*PI*R);}2005年4月(填空题)(7)以下程序运行后的输出结果是【7】。

#defineS(x)4*x*x+1

main()

{inti=6,j=8;

printf(“%d\n”,S(i+j));

}

答案:814.4应用实例

例4-6简单计算器问题描述:采用函数调用方式完成简单计算器程序的六则运算模块、幂运算、三角函数模块和求pi。

问题分析使用计算器前先要进行功能选择,将功能选择定义为一个函数。由于幂运算模块又被分解成了两个功能小模块(开方、指数运算),因此需要设计类似于主菜单的二级菜单,方便选择功能。由于三角函数模块又被分解成了三个功能小模块(正弦、余弦、正切),因此也需要设计类似于主菜单的二级菜单,方便选择功能。然后先定义三个函数分别实现这三个功能小模块,再在二级菜单中调用它们。本小节只定义两个函数分别实现正弦、余弦,余下的正切将在第6章实现。求pi模块不用再继续分解了,只要定义一个函数即可。

程序实现其他代码详见书4.4应用实例

例4-7学生成绩档案管理。问题描述:

(1)在第4.1节里,把学生成绩档案管理规划成了四大功能模块,除统计模块外其它三个模块还被进一步分解(如图4-2所示)。现在需要设计一个“主菜单”和三个“二级菜单”供“用户”选择功能。定义四个函数分别实现这四个“菜单”。

(2)输入N个学生1门课程的成绩,按课程统计各级别(优、良、中、及格和不及格)人数并输出。并要求按上面的“主菜单”选择“统计模块”可以得到统计数据。定义一个函数实现此功能。

例4-7学生成绩

温馨提示

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

评论

0/150

提交评论