第5章模块化程序设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如,输出两个整数值的函数可定义为: void outint( int x, int y)
数定义*/ {
printf("x=%d, y=%d", x, y); }
/*有参函
3. 函数的返回值与return语句 调用者在调用函数时,函数有时需要把处理的结果返回给调
用者,这个结果就是函数的返回值,函数的返回值是由 return语句传递的。 return语句的形式: return (表达式);或 return表达式;或 return; 注意: (1) return语句中表达式的类型应与函数返回值类型一致, 若不一致,则以函数返回值的类型为准,对于数值型数据 将自动进行类型转换。void类型函数中return后第一个 return语句返回,函数返回值为第一个return语句中表达 式的值;若return后面无表达式,则返回调用函数处。 (3) 若函数体内没有return语句,就一直执行到函数体的末 尾后返回调用函数。这时会返回一个不确定的函数值,若 确实不要求返回函数值,则应将函数定义为void类型。
1. 函数调用的形式 (1) 无参函数调用形式为 函数名(); (2) 有参函数调用形式为 函数名(参数表);
注意:
(1) 函数调用语句中函数名与函数定义的名字相同。
(2) 有参函数调用时参数表中列出的参数是实际参数(简称实
参)。
实参的形式为
参数1,参数2,…,参数n
其中,各参数间用逗号隔开,实参与形参要保持顺序一致、 个数一致、类型应一致。实参与形参按顺序一一对应,传 递数据。当实参与形参类型不一致时,实参的值转化为形 参的类型赋给形参。
注意: (1) 函数体内可以是0条、1条或多条语句。当函数体是0条语
句时,称该函数为空函数。空函数作为一种什么都不执行 的函数,通常在程序设计初期作为临时函数使用,在设计 过程中再实现或扩充功能。注意函数体内无论有多少条语 句,大括号是不能省略的。例如: void nothing() { } (2) 在函数体内不能定义另一个函数,也就是说函数定义不 能嵌套。例如下面函数的定义是错误的。 void output1( ) { printf("*****"); void output2( )
5.1.2 函数的定义
前面提到,从函数参数的形式角度来看,函数分为无参函数 和有参函数,下面分别介绍这两种函数的定义形式。
1. 无参函数的定义 无参函数定义的一般形式为 返回值类型 函数名( ) { 说明部分 执行部分 }
说明: (1) 无参函数定义由函数头部和函数体两部分组成。函数头
部包括返回值类型,函数名两个部分;在 {} 内的部分称 为函数体,其在语法上是一个复合语句。 (2) 函数名是唯一标识函数的名字,是C语言中任何合法的标 识符,而且在该标识符后面必须有一对圆括号,用来表明 该标识符为函数名。 (3) 返回值类型是在调用函数结束后,函数给调用者返回结 果所具有的类型,返回值的类型为各种基本数据类型和自 定义数据类型;函数在被调用后也可以没有返回值,此时 返回值类型为void;另外,函数默认返回值类型为int。例 如: void output( ) { printf("*****"); }
4. 函数调用的执行过程 调用函数的过程分为如下几步: 第一步,将实参的值赋给形参。实参和形参的关系如同赋值
表达式的右操作数与左操作数的关系,对于基本类型的参 数,如果实参的类型与形参的类型相同,则实参直接赋值 给形参;否则实参按形参的类型执行类型转换后再赋给形 参。如果实参是数组名,因为数组名表示数组的起始地址 ,所以实参传递的是数组的起始地址,而不是变量的值; 第二步,将程序执行流程从主调函数的调用语句转到被调函 数的定义部分,执行被调函数的函数体; 第三步,当执行到被调函数函数体的第一个return 语句或者 最右边的一个大花括号时,程序执行流程返回到主调函数 的调用语句。若调用语句是表达式的一部分,则应用函数 的返回值参与表达式运算之后继续向下执行;若调用语句 是单独一条语句则直接继续向下执行。
例如,求两个整数的最大者的函数可定义为: int max(int x, int y) {
if(x>y) return x;
else return y;
}
5.1.3 函数的调用与函数说明
函数在定义之后并不能主动运行,必须通过对函数调用才能 实现函数的功能。一个函数可以被其他函数多次调用(main 函数不能被任何函数调用),调用函数的函数称为主调函数 ,被调用的函数称为被调函数。如果被调函数是有参函数 ,主调函数在调用时将数据传递给被调函数,从而得到所 需要的处理结果。
函数类型说明的格式为
返回值类型 函数名(参数类型表);
说明:
(1) 圆括号是函数的标志,不能省略,如果省略,就成为一 般变量的说明了。
(2) 参数类型表的形式与函数定义的形参表相同,也可以只 列出形参的类型名。
(3) 函数类型说明语句应放在主调函数函数体中的数据说明 位置或在主调函数前面。
例5.1 定义一个函数,suv函数功能为求两个浮点数的之和 ,并在主函数中调用此函数。
/*加法函数 /*减法函数 /*乘法函数*/
4. 程序运行结果 请输入数据和四则运算符(+ - * /), 如:2+4 3*6 18.00
5.1 函数的基本概念和操作
5.1.1 函数的概念
C语言是结构化程序设计语言,一个C语言程序由一个或多个 源程序文件组成。这样可以分别编写、分别编译,提高调 度效率。一个源程序文件由一个或多个函数组成。一个源 程序文件是一个编译单位。
2021/2/16
案例一 四则运算器
1. 问题描述 计算器是一种很方便的小工具。参照计算器进行简单模拟,
实现针对两个整数的四则运算。 2. 问题分析 本案例需要实现加、减、乘、除四则运算,其中加、减、乘
三种运算处理方法完全一致,除法因要考虑除数不能为0的 情况,略有不同。 因此此处以乘法操作为例,对计算过程 进行分析。 执行乘法操作的细节如下: (1) 乘法操作需要两个操作数,首先由用户输入一个数据, 作为第一个操作数; (2) 其次用户输入一个操作符,此处应输入乘法符号; (3) 然后用户输入第二个操作数; (4) 最后用户按下回车符,将数据传入计算机内进行计算, 计算器操作之后输出结果。 除法运算与乘法运算也基本相同,只是在输入第二个操作数 时,需要进行判断,当第二个操作数不为0时才能继续往下 执行。
C语言中的函数是一个独立完成某种功能的程序块,其中封装 了一些程序代码和数据。使用者只需关心函数的功能和使 用方法,而不必关心函数功能的具体实现细节。利用函数 可将复杂问题的解决过程分割成一个个小的模块,每一个 模块编写一个函数,而各函数分别完成一个功能单一而独 立的任务,因此C语言程序通常是由许多函数组成。函数在 使用之前除了标准函数库的函数以外,其他函数都必须事 先定义。
#include "stdio.h" void main() {
float suv(float, float); /*对suv函数进行说明*/ float x1, x2, x3; printf("input x1, x2"); scanf("%f%f", &x1, &x2); x3=suv(x1, x2); printf("\nsuv=%6.2f", x3); } float suv(float x, float y) { printf("%f, %f", x, y); return(x+y); }
➢ 理解函数的执行过程,理解函数中的各种数据的作用域和 传递方法(5.4-5.6)
➢ 了解函数指针和指针函数的概念(5.7-5.8) 2021/2/16
C语言是一种结构化程序设计语言,函数是其基本模块,当要 解决的问题比较复杂时,可以把复杂问题分解成若干个简 单问题,每个简单问题用单独的函数实现,通过函数调用 执行某个功能,如此将一个复杂的程序分化,可使程序的 结构更为清晰。
5.1 C程序结构
4
C程序的一般结构
复杂问题的结构化程序设计思想:“自上而下,逐步细化,结构化,
模块化”
C程序
源程序文件1
……
源程序文件n
函数1 … 函数n
函数1 … 函数m
使用函 ① 程序结构清晰,可读性好。
数 ② 减少重复编码的工作量。
的好处 ③ 可多人共同编制一个大程序,缩短程序设计
周期,提高程序设计和调试的效率。
注意:
(1) 如果被调函数定义出现在主调函数定义之前时,在主调 函数中不必对被调函数进行类型说明。
(2) 当被调函数的返回值为int型或char型时,在主调函数中 不必对被调函数进行原型说明,但是有些编译器(例如 Visual C、Boland C)要求即使被调函数的返回值为int型 或char型时,也要提前声明,所以尽量把被调用函数写在 主调函数之前。
3. C语言代码 #include <stdio.h> void Add(float op1, float op2)
*/ { float s;
s=op1+op2; printf("%.2f\n", s); } void Sub(float op1, float op2) */ { float s; s= op1-op2; printf("%.2f\n", s); } void Mult(float op1, float op2) {
(3) 实参要有确定的值,它可以是一个表达式或者是值。例 如:
int y=3;
output();
/*无参函数调用*/
outint(2, y);
/*有参函数调用*/
2. 函数调用的使用方式 (1) 函数调用作为一个语句,函数完成一定功能。例如: putchar('c'); (2) 函数调用出现在表达式中,这时要求被调函数必须带有
返回值,返回值将参加表达式的运算。 例如求两个整数的最大者的函数int max(int x, int y)
可以有如下调用: m=2+max(5,6); (3) 函数调用作为函数的实参。例如 Max=max(a, max(b, c));
3. 函数说明
在函数调用过程中,若被调函数(除函数返回值类型为int、 char之外)的定义出现在主调函数之后,则在调用函数前还 必须对该被调函数进行原型说明。
1 C /C++ 语言程序设计案例教程
第5章 模块化程序设计
第5章 函数
2
学习内容
5.1 C程序结构 5.2 函数的定义 5.3 函数调用和函数说明 5.4 函数的嵌套调用和递归调用 5.5 变量的作用域和存储方式 5.6 函数间的数据传递 ➢ 5.7 指针函数 ➢ 5.8 函数指针
学习目标
➢ 要求掌握函数的概念和定义方法,理解实参和形参的一致 性(5.1---5.4)
{ printf("# # # # #");
}
2. 有参函数的定义 有参函数定义与无参函数的区别在于有参函数带有参数表列
,作用是在函数被调用时接受提供给该函数的数据,以便 在函数体内进行处理。 有参函数定义的一般形式为 返回值类型 函数名(参数表列) {
说明部分 执行部分 } 说明: (1) 返回值、函数名和函数体与无参数含义相同; (2) 参数表列通常称为形式参数表(简称形参表),形式参数 表的形式为 类型 参数名1,类型 参数名2,...,类型 参数名n 其中,形参表说明函数参数的名称、类型和数目,由一个或 多个参数说明组成,每个参数说明之间用逗号分隔。书写 函数时要养成给函数注释的习惯,一般最少要对函数的功
在C语言中,根据使用的角度不同,函数可以有以下的分类。 (1) 从用户使用的角度,函数分为两类:标准函数和用户自
定义函数。 标准函数:在C语言的编译系统中提供了很多系统预定义的函
数,用户程序只需包含有相应的头文件就可以直接调用, 不同的编译系统提供的库函数名称和功能是不完全相同的 。例如在上一章所介绍的字符串处理函数都是系统给我们 提供的标准函数,只需要在使用时将头文件 "string.h" 包含进来就可以了。 用户自定义函数:用户根据自己特殊需要,按照C语言的语法 规定编写一段程序,实现特定的功能。 (2) 从函数参数的形式,函数分为两类:无参函数和有参函 数。 无参函数:使用该类函数时,不需给函数提供数据信息,就 可以直接使用该函数提供的功能。 有参函数:使用该类函数时,必须给该函数提供所需要的数 据信息,按照提供的数据不同,在使用该函数后获得不同 的结果。