没有合适的资源?快使用搜索试试~ 我知道了~
构成C语言程序的基本单位是函数函数也是C程序中模块化¸¸¸.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 26 浏览量
2022-05-31
17:34:42
上传
评论
收藏 709KB DOC 举报
温馨提示
试读
37页
构成C语言程序的基本单位是函数函数也是C程序中模块化¸¸¸.doc
资源推荐
资源详情
资源评论
第 8 章 函 数
第 8 章 函 数
构成 语言程序的基本单位是函数。函数也是 程序中模块化程序设计的基础。 函
数可分为标准库函数和用户定义函数两类。前者是系统定义的,它们的定义分别放在不同
的头文件中,用户只要用 文件包含将头文件包含到程序中即可调用它们;后者
则是用户为解决自己的特定问题自行编写的。本章主要介绍用户定义函数的设计和调用问
题。当然,在自行设计程序时,充分利用系统提供的库函数,可以大大减轻程序设计的负
担。
8.1 函数概念
一个较大的程序一般应分为若干个程序模块,每个模块用来实现一个特定的功能。一
个 程序由一个主函数()和若干个其他函数( 个到多个)构成。程序的执行总是
从主函数开始,到主函数结束。同一个函数可以被一个或多个函数调用任意多次。如图
中“子模块 就被调用两次。下面看一个例子:
例 从键盘输入两个正整数 与 ( 大于 ),求 的值(即求
)。
程序如下:
主函数
!"
#"声明函数,说明本函数中要调用的函数 #在本函数后面定义
$%&'($!)"
&'*!*!+!+"
,-..-..-本循环用来保证输入的 大于 ,并且
! 都是正整数
$%&'/(%$$!)"&'*!*!+!+"
0
$%&'/-*/!##"
0
#1计算阶乘值的函数,函数名前的 表示返回值的类型
1"
!"
-"
&%-"-1"22-"计算 3451,并将计算结果赋值给变量
%%"将计算得到的阶乘值返回调用函数(这里是主函数)
0
上面程序中,一共有两个函数:一个是主函数 ,完成的功能是从键盘输入两个
正整数 与 ,通过调用函数 #计算并输出 ##的值;另一个函数是
#,它完成的功能是计算阶乘值,它通过从主函数得到一个参数 1,计算 1,并将计算
结果返回调用函数(主函数)。
下面作几点说明:
1
第 8 章 函 数
()一个 程序可以由若干函数组成,其中必须有且仅有一个主函数 。 程
序总是从主函数开始执行(不管它在程序中的什么位置),而其他函数只能被调用。
(3)一个 程序可以由一个或多个源程序文件组成。 程序的编译以源程序文件为
编译单位,而不是以函数为单位进行编译。被调用函数与调用函数可以分别放在不同的源
程序文件中,可以分别编写、分别编译,但最后必须连接成一个程序进行运行。
(4)在 语言中,所有函数都是平行的,即在定义函数时是互相独立的,互不从属 。
即 函数不能嵌套定义。
(6)程序中的 是将要用到的库函数的头文件包含到程序中来,这里因为用
到了标准输入输出函数 &和 $%&,才使用。
()如果被调用函数在调用函数的后面定义,则必须在调用函数中进行声明。函数
声明的一般形式为:
类型标识符 函数名(7形参表列8);
'形参表列”是可以省略的。最简单声明函数的方式,就是将函数定义时的头部(在括
号中含形参类型说明)作为声明的表达式,加上分号就构成了函数的声明语句。例如,例
中函数的声明就是将其省略。例 中函数的声明可以写成以下两种形式:
#"
或
#1"
一、函数的定义
在使用一个函数前,需要先对其进行定义。
函数定义通常由两部分组成:函数头部和函数体。
函数的一般定义形式为:
类型标识符 函数名(形参表列)
形参类型声明
声明部分
语句部分
0
在定义函数时要注意以下几点:
()函数头部的“类型标识符”是指函数类型,即函数返回值的数据类型。如果函数无
返回值,则“类型标识符”可以使用空类型(即 9 类型)。如果省略函数的类型标识符,
则默认的数据类型为 int 型。例如,例 8.1 中的函数 jiec()返回值类型为 int 型,可以省略
jiec(k)前面的类型标识符 int。
(3)“函数名”必须为有效的标识符(标识符的命名规则见第 3 章)。
(4)“形参表列”可以没有,如果没有则表明函数是无参函数。当“形参表列”中有多个
参数时,则它们之间要用逗号(,)分隔。“形参类型声明”类似于变量声明。当然, 语
言中允许在形参表列中直接对形参的类型进行声明。例如,在例 中函数 #可以定
义成下面的形式:
#1
!"
-"
&%-"-1"22-"
%%"
0
(6) 语言中允许定义空函数。例如:
2
第 8 章 函 数
: 0
在程序中调用此函数时,实际上什么工作也不做,没有任何实际作用。但是空函数在
模块化程序设计中是很有用的。在程序设计中往往根据需要确定若干模块,分别由一些函
数来实现。但在开始时,一般不可能将所有的函数模块都设计完成,只能将一些最重要、
最基本的函数设计出来,而对于一些次要的函数模块在以后需要时陆续补上。因此,在程
序设计的开始阶段,为了程序的完整性,用一些空函数先放在那里占一个位置,以后用一
个编好的函数代替空函数。这样做,程序的结构清楚,可读性好,以后扩充新功能也比较
方便,对程序结构影响不大。所以空函数在模块化程序设计中是很有用的。
二、函数的调用
自定义函数在定义好后,必须使用才能体现函数定义的目的。
函数调用的一般形式为:
函数名(实参表列);
例如,在例 中,计算 !的函数调用表达式是:#,如果要计算 并赋值
给变量 ,则调用语句为:
-#"
函数调用的方式可以有以下三种:
、函数语句
直接由函数的调用作为一个语句。如例 中的标准库函数的调用
$%&'($!)"
这种调用方式不要求函数向主调函数带回值,只要求完成一定的操作。
3、函数表达式
这种调用方式是将函数调用作为一个子表达式,这种表达式称为函数表达式,通常情
况下这种函数调用方式要求带回一个值(即在函数中有 %% 语句)参加表达式的计算。
例如:
$%&'/-*/!##"
在这个调用中,#函数调用和 #的调用都是作为子表达式,先将返回值
代入表达式,再将两个返回值相除得到表达式的值,最后将表达式的值输出。
4、函数参数
这种函数调用方式是指将函数调用作为另一个函数的实参,例如,
如果使用例 中的函数 #计算 4,并将计算结果赋值给变量 的话,可以使
用下面的语句:
-##4"
其中 #4是一次函数调用,它应该先执行,执行后返回的值 ; 作为另一次函数调用
的实参。即 -#;;,最后再调用函数 #计算出 ;,并将结果赋值给变量 。
实质上,函数调用作为函数的参数,还是函数作为表达式形式调用的一种,因为函数
的参数本来就是表达式。
8.2 函数的参数和返回值
8.2.1 形式参数和实际参数
在函数的定义和调用过程中会涉及到函数的参数,函数的参数有两种:形式参数和实
际参数,分别简称为:形参和实参。
形参是指在定义函数时函数名后面括号中的参数。而实参是指在主调函数中调用一个
函数时,函数名后面括号中的参数。
3
第 8 章 函 数
比如,在第 章的例 中,函数在定义时,<函数的头部为
=<=<!=:
就定义了两个形参 < 和 :,并且类型都是 = 型。
而在函数调用时(在 函数中)
-<!>"
和 > 就是作为实参。
关于形参与实参作如下几点说明:
()形参必须是单个的变量名(普通变量名、指针变量名、一维数组、二维数组),
而实参可以是常量、变量或表达式,如:
<4!2>"
不管实参是常量、变量还是表达式,它们必须有确定的值。
(3)在定义函数中,形参必须指定数据类型。形参的类型声明可以放在函数名后的
括号中,也可以放在函数的头部与函数体之间(参见函数定义的一般形式)。例如:
=<<!:
=<!:"
550
(4)形参在函数调用之前,它并不占用内存中的存储单元。只有当函数调用时,实
参的值传递(拷贝)给形参时,才给形参分配内存存储单元。在函数调用结束后,形参所
占的内存单元立即被释放。
(6)在 语言中,实参向形参的数据传递是“单向传递”,即只能由实参传递给形参,
而不能由形参传回给实参。在实参向形参传递数据时,是将实参的值拷贝给形参,因此,
实参与形参占用不同的内存单元。如果形参是数组名,则传递的是数组首地址而不是数组
中元素的值。
()实参与形参的个数必须相同,顺序一致,并且实参与对应的形参类型应相同或
赋值兼容。例如,在例 中形参与实参都为 型,这是合法的、正确的。如果实参为
型,而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换。如实参值为
;,而形参值为 型,则会将实参 ; 的值转换成 型的值 ;,再送给形参。除实型
与整型数据之间可转换外,字符型与整型数据之间也能相互转换。
8.2.2 函数的返回值
在调用函数过程中,经常希望得到一个从被调用函数中带回来的值,这就是函数的返
回值。例如,在例 中,#就要带回来一个 的值。
在 程序中,函数返回值是通过如下格式的语句带回来的:
%%表达式;
当然上述语句也可以是这样的形式:
%%表达式;
说明:
()%% 语句括号中(或其后)的表达式可以没有,当没有这个达式表时,说明
只是要求函数返回,但不要求带回一个值,其功能就是中断被调用函数的执行,返回主调
用函数,并不带回返回值。这种用法类似于 <函数。
(3)只有当主调函数中需要得到一个从被调用函数带回来的值时,才在被调用函数
中使用 %% 语句带回一个返回值。即一个函数中如果有 %% 语句,并且 %% 语句
后的表达式不是空的,则调用该函数时一定会得到一个返回值。
当然,在函数中可能不止一个 %% 语句,但每次调用函数时,必定只执行其中一个
%% 语句。例如:
4
第 8 章 函 数
&<
%%"
%%"
这段程序中,当满足 < 时,返回 ,否则,返回 。
(4)函数返回值的类型。
如果函数有返回值,则这个值必定属于一个确定的数据类型,这个类型是在函数定义
的头部说明的。例如,在例 中的函数 #定义时
#1
1"
550
在函数名之前的 就是指出了该函数返回值的类型。因为这个函数返回值类型是
型的,在定义时也可以省略。
如果函数类型和 %% 语句中表达式的值类型不一致,则以函数类型为准。对于数值
型数据,可以自动进行类型转换。例如,若定义的返回值类型是 型,而 %% 语句中
表达式的类型是 = 型,则会将表达式的值自动转换成 型返回。
如果函数中没有 %% 语句,则说明并不带回一个值,这种情况下,在函数定义时,
函数名前的类型可以使用 9 型。9 型是指空类型,即在函数定义时,如果函数名前
的类型是 9 型,则说明该函数在调用时并不带回一个确定的值。
(6)函数返回值,每次只能带回一个值。尽管在函数中可能有多个 %% 语句,但
只有其中的一个 %% 语句会执行,也就只能带回一个值。如果想从函数中带回多个值,
可以采用的方式有两种:①使用指针变量,通过地址传递方式;②使用全局变量。在后面
将会介绍到。
()当函数返回值是指针值时,函数头部的定义形式一般为:
数据类型 *函数名(参数表列)
这种情况下,在主调用函数中,函数返回值所赋给的变量必须是指针变量。
例 3下面程序中有四处错误,请根据题意改正。
主函数接收从键盘上输入一组整数(以 作为输入结束)保存到整型数组 << 中,
调用 & 函数。函数 & 的功能是:对长度为 的数组 ,不考虑这组整数中的最大数和
最小数(其有重复,则都不考虑),求出余下数中的最大数 < 及最大数的个数 、
最小数 及最小数的个数 3,分别保存到全局变量 <、、、3 中。
含有错误的源程序如下:
?@
<!!!3"
&78!
!#!1!<"
&%-""22
1-"
&%#-2"#-@"#22
&7187#81-#"
&1- <-78"78-718"718-<"0
0
&%-"@"22$%&A*A!78"
5
剩余36页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 82
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 简单的Python示例,演示了如何使用TCP/IP协议进行基本的客户端和服务器通信
- 考试.sql
- keil2 + proteus + 8051.exe
- 1961ee27df03bd4595d28e24b00dde4e_744c805f7e4fb4d40fa3f695bfbab035_8(1).c
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- windows注册表编辑工具
- mediapipe-0.9.0.1-cp37-cp37m-win-amd64.whl.zip
- 校园通行码预约管理系统20240522075502
- 车类型数据集6250张VOC+YOLO格式.zip
- The PyTorch implementation of STGCN.STGCN-main.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功