C语言程序设计 第6章 函数与模块化程序设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求整数x的绝对值 求双精度实数x的绝对值 计算sin(x)的值,x的单位为弧度 计算cos(x)的值,x的单位为弧度 求ex的值 求㏑x 计算x的开方
例题
#include <stdio.h> #include <math.h> void main() { double x,y;
scanf("%lf",&x); printf("%g\n",x); y=fabs(x); printf("%g\n",y); }
s1 所指地址
返回串中字符(不计 最后的'\0')个数
四、输入输出函数
• 调用字符函数时,要求在源文件中包含下以下命令行: • #include <stdio.h>
函数原型说明
功能
返回值
int getchar(void) char *gets(char *s) int putchar(char ch)
i++; } return (m); //返回值 }
main() { printf("\n%ld",s());}
25
(2)有参函数的定义形式
long s(int n ) //类型说明符long,函数名s {
数据类型说明符 {
函数名(带类型的形式参数列表)
i=1; //变量定义语句部分 long m=1; while(i<=n)
数,当在处理复杂问题中,遇到要用这段重复性程序段时,则无 需重复编写,只需调用函数即可。
模块与函数
• 可以将一个任务划分为若干个功能模块,每一个功能模块用一个 函数来实现。功能相同的模块只编一个函数。
• 简化程序设计的复杂程度。程序结构更加清晰,编写程序的工作 量大大减少。
• 常用的功能模块编写成函数,放在函数库中供公共选用,如: printf()、gets()等函数。
• 函数定义就是确定函数完成什么功能及怎么运行。标准函数 已经由系统定义,而用户自定义函数必须由用户自己定义。
• 自定义函数也分为有参函数和无参函数。
函数的定义
(1)无参函数的定义形式
数据类型说明符 函数名( ) {
变量定义语句部分 执行语句部分 } 例,求s=1*2*3*┅*n
long s( ) //类型说明符long,函数名s { int n,i=1; //变量定义语句部分 long m=1; scanf("%d",&n); //执行语句部分 while(i<=n) { m*=i;
(2)从函数的形式看:
函数分为
无参函数 有参函数
标准函数
#include "stdio.h"
main() {char c;
无参函数
c=getchar();
printstr(); printf("%c",c);
自定义函数
}
有参函数
15
标准函数
• 在C语言程序设计里,标准函数是由C语言函数库(C Standard library)所提供,用户无需定义,也不必在程序中做类型说明, 只需要在程序前加入包含该函数原型的头文件即可,在程序中直 接调用。
c=max(a,b); /*实参a,b*/
printf("the max is %d",c);
模块化程序设计过程
• 模块化设计可采用以下步骤进行: • ①分析问题,明确需要解决的任务; • ②对任务进行逐步分解和细化,分成若干个子任务,每个子任务
只完成部分完整功能,并且可以通过函数来实现; • ③确定模块(函数)之间的调用关系; • ④优化模块之间的调用关系; • ⑤在主函数中进行调用实现。
变量定义语句部分
执行语句部分 } 例如:例,求s=1*2*3*┅*n
{ m*=i; i++; }
return (m); //返回值 }
main()
{ int x;
scanf("%d",&x); //执行语句部分
printf("\n%ld",s(x));}
26
求两个整型数据的大者的函数
Hale Waihona Puke #include<stdio.h>
二、字符函数
• 调用字符函数时,要求在源文件中包含下以下命令行: • #include <ctype.h>
函数原型说明 int isupper(int ch) int islower(int ch) int tolower(int ch) int toupper(int ch)
功能 检查ch是否为大写字母
返回一个随机整数
程序终止执行,返回调用过程, state为0正常终止,非0非正常 无 终止
6.3 自定义函数
自定义函数
• 编写程序时会遇到各种各样的问题,有些问题可以采用库函 数中的标准函数来解决,但还有些问题库函数中没有相应的 解决函数,因此,用户需要自己编写函数来解决,根据具体 问题自行设计相应的程序段来完成函数的功能。
函数原型说明
功能
int abs( int x) double fabs(double x) double sin(double x) double cos(double x) double exp(double x) double log(double x) double sqrt(double x)
• 模块化的目的是为了降低程序复杂度,使程序设计、调试和维护 等操作简单化。
• 模块化的过程就是把复杂问题分解成独立模块的过程,每个模块完 成一个单独的功能。自顶向下的设计方法可以让程序设计人员把 全部精力集中在算法的总体设计上,而不必过多地考虑较低级模块 的设计细节。该设计方法的另一个优点是,相对独立的模块很容易 理解,也很容易编写和修改,具有较好的重用性,必要的话还可以单 独对其进行修改。
从标准输入设备读取下一个字符
返回所读字符,若出错或文件结 束返回-1
从标准设备读取一行字符串放入s所指 存储区,用’\0’替换读入的换行符
返回s,出错返回NULL
把ch输出到标准输出设备
返回输出的字符,若出错则返回 EOF
nt puts(char *str)
int scanf(char *format,args,…)
• 在C语言程序中利用函数实现程序的模块化,使得程序设计更加 简单和直观,从而提高了程序的易读性和可维护性,还可以把程 序中经常用到的一些计算或操作编写成通用函数,以供随时调用。
模块化程序设计原则
• 模块化就是把复杂的问题分解为单独的模块。一般说来,模块化 设计应该遵循以下3个主要原则:
• 1.模块独立 模块的独立性原则表现在模块完成独立的功能,与其他模块的联系 应该尽可能的简单,各个模块具有相对的独立性。 • 2.模块的规模要适当 模块的规模不能太大,也不能太小。如果模块的功能太强,可读性 就会较差,若模块的功能太弱,就会有很多的接口。 3.分解模块时要注意层次 在进行多层次任务分解时,要注意对问题进行抽象化。在分解初期, 可以只考虑大的模块,在中期,再逐步进行细化,分解成较小的模 块进行设计。 [
max(int x,int y) /*类型说明符int,函数名max,带类型的形式参数列表int x,int y*/
{int z;
/*变量定义语句部分*/
z=x>y?x:y; /*执行语句部分*/
return(z); /*返回值*/
}
main()
{int a,b,c;
scanf("%d,%d",&a,&b);
返回值 是,返回1;否则返回0
检查ch是否为小写字母
是,返回1;否则返回0
把ch中的字母转换成小写字母 返回对应的小写字母
把ch中的字母转换成大写字母 返回对应的大写字母
三、字符串函数
• 调用字符函数时,要求在源文件中包含下以下命令行: • #include <string.h>
函数原型说明 char *strcat(char *s1,char *s2) int strcmp(char *s1,char *s2)
• 在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小 程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过 模块的互相协作完成整个功能的程序。
• 这就是模块化程序设计方法。这种方法通常采用自顶向下,逐步求精的方 法来实现。
自顶向下的设计方法
• 在对复杂的程序设计时,程序设计人员通常是将任务逐步分解细化, 首先把复杂问题分解为主要任务,然后在主要任务中再进一步细分 为一系列子任务,直到所有的任务都被确定。这种先确定主要任务, 再逐步细分成子任务的过程称为自顶向下设计方法。
函数原型说明 void *malloc(unsigned size) void *free(void *p) int rand(void)
void exit(int state)
功能
返回值
分配size个字节的存储空间
分配内存空间的地址;如不成功, 返回0
释放p所指的内存区
无
产生0~32767的随机整数
• 例如:printf()、scanf()等
#include <stdio.h> main() {char c;
c=getchar(); printf("%c",c); }
C语言常用库函数(5类)
• 一、数学函数 • 调用数学函数时,要求在源文件中包含下以下命令行: • #include <math.h>
• 自顶向下的方法,将问题划分为几个部分,各个部分再进行细化, 直到分解为比较好解决问题为止。
• 模块化设计,简单地说就是程序的编写不是一开始就逐条录入计 算机语句和指令,而是首先用主程序、子程序、子过程等框架把 软件的主要结构和流程描述出来,并定义和调试好各个框架之间 的输入、输出链接关系,对每个模块采用逐步求精的结果是得到 一系列以功能模块为单位的算法描述。
char *strcpy(char *s1,char *s2) unsigned strlen(char *s)
功能 把字符串s2接到s1后面
对s1和s2所指字符串进行 比较
把s2指向的串复制到s1指 向的空间
求字符串s的长度
返回值 s1所指地址 s1<s2,返回负数; s1= =s2,返回0; s1>s2,返回正数
模块化间的通信
• 设计算法时,程序设计人员不仅要考虑把复杂问题划分成模块来处 理,同时也要考虑模块间的信息流。模块间的通信越少、越简单, 该模块也就越容易理解和维护,而不必过多涉及其他模块。模块间 的这种信息流被称为模块间的通信。
• 模块间的通信通常采用下面两种方法来实现: • (1) 通过指定变量的作用域(局部或全局数据)来实现。 • (2) 通过参数传递来实现。
模块化设计
第6章 模块化程序设计
6.1 模块化设计
模块化程序设计概念
• 人类在解决复杂问题时通常采用的策略是“分而治之,各个击破”。
• 利用这种思想,人们在求解一个复杂问题时,通常采用逐步分解、分而治 之的方法
• 也就是把一个大任务分解成若干个比较容易求解的小任务,然后分别求解 在设计一个复杂程序时,往往也是把整个程序划分为若干个功能较为单一 的程序模块,然后分别予以实现
6.2 函数的概念
问题分析
• 在处理复杂问题过程中,往往会遇到大量的重复性工作。 • 如果对这些相同的重复性工作均要编写相应程序段,不但麻烦,
而且冗余,程序结构复杂不清晰。更不会体现到程序设计的乐趣。 • 对于这样的问题,该如何解决? • 答案是采用函数来实现,也就是将相同重复性工作只编写一个函
C语言程序组成
• 一个C程序可由一个主函数和若干个非主函数构成。 • 主函数调用其它函数,其它函数也可以互相调用。 • 同一个函数可以被一个或多个函数调用多次。 • 程序的执行从main()函数开始。 • 在main()函数中结束整个程序的运行。
函数的分类
(1)从用户的角度看:
函数分为
标准函数(库函数)。由系统提供 自定义函数。 用户自己编制
把str所指字符串输出到标准设备, 将’\0’转成回车换行符
返回换行符,若出错,返回EOF
从标准输入设备按format指定的格式 把输入数据存入到args,…所指的内存 已输入的数据的个数
五、动态分配函数和随机函数
• 调用字符函数时,要求在源文件中包含下以下命令行: • #include <stdlib.h>
模块化程序设计优点
• 模块化程序设计的基本思想是自顶向下、逐步分解、分而治之, 即将一个较大的程序按照功能分割成一些小模块,各模块相对独 立、功能单一、结构清晰、接口简单。
• 模块化程序设计的其他优点如下: • (1)控制了程序设计的复杂性。 • (2)提高了代码的重用性。 • (3)易于维护和功能扩充。 • (4)有利于团队开发。