C语言 第七章 函数

一、函数引入

例:微信红包排序

主要功能:输入N个红包金额,输出N个红包,N个红包按照金额排序,输出排序后的N个红包。

问题分析

(源代码)

(运行结果截图)

问题:

解决的方法:用模块化程序设计的思路

(源代码)

主函数与程序模块之间的关系

二、函数基础知识

(一)库函数和自定义函数

C系统中函数分为两大类,分别是库函数(标准函数)和自定义函数。

1.库函数

常见的头文件

2.自定义函数

注意

(二)函数定义

1.为什么要定义函数

2.定义函数的方法

说明

例:用函数实现微信红包排序程序代码

(源代码)

(运行结果截图)

3.编程经验

4.常见错误

(三)函数声明

说明

三、函数的调用和返回

(一)函数的调用

1.函数调用格式

说明

函数调用形式

(1)函数调用语句

(2)函数表达式

(3)函数参数

(二)return语句和函数类型

return语句的一般格式

说明

例:用二分法查找一个红包

问题分析

编程思路

(源代码)

(运行结果截图)

说明:本例使用两个return语句,返回不同情况

常见编程错误:对于数组作为形参,注意数组起点下标是0,不是1.所以返回位置是从0开始的。

编程经验:在编写有返回值函数时,函数最好只有一条return语句,避免出现返回值错误。

四、函数的参数

C语言函数之间有两种传递参数的方法:值传递、地址传递

(一)值传递

例1:计算排列数Pnm

问题分析

(源代码)

运行过程

(运行结果截图)

说明

编程经验

(二)地址传递

例:从键盘输入两个数,调用函数将两个数交换

问题分析

(源代码)

(运行结果截图)

说明

常见编程错误

编程经验

(三)数组作函数参数

例:编写程序,接受用户输入的一行字符(不超过80个字符),将其中出现字母转成大写字母,其它字符不变。

方法一:数组元素作参数

问题分析

(源代码)

(运行结果截图)

方法二:数组名作参数

问题分析

(源代码)

(运行结果截图)

运行过程

·在函数transform执行时,通过实参地址数据的传递,形参被临时分配内存单元。

·在函数transform执行时,将数组ptr内字符小写字母转换成大写字母。

·函数调用结束时,形参分配空间被收回

说明

常见编程错误

编程经验

五、函数的嵌套和递归

(一)函数的嵌套调用

执行过程

例:输入4个整数,用函数的嵌套调用找出其中最大的数

编程思路

(源代码)

(运行结果截图)

(二)函数的递归调用

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

1.直接递归

2.间接递归

注意

在写递归程序中,一定要有递归结束条件,应使用if语句控制结束调用,否则,无限制递归,终将使栈内存空间溢出。

例:计算某个整数的阶乘

问题分析

(源代码)

(运行结果截图)

执行流程

常见编程错误

编程经验

六、变量和函数的作用域

(一)全局变量与局部变量

1.全局变量

说明

2.局部变量

说明

C语言中允许在函数或程序块内定义与全局变量重名的变量。在不同的作用域内,允许对某个变量进行重新定义。

例:10个职工的年龄存放在一维数组,写一个函数求职工的最大年龄、最小年龄和平均年龄。

问题分析

(源代码)

(运行结果截图)

编程经验

·建议不在必要时不要使用全局变量

·编程时提倡多使用局部变量

(二)变量的存储类别

动态存储方式与静态存储方式

变量的作用域的角度来观察,变量可以分为全局变量和局部变量。

变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式动态存储方式

静态存储区:全局变量和局部static变量存放在静态存储区中。

程序开始执行时给全局变量和局部static分配存储区,程序执行完毕就释放。在程序执行过程中占据固定的存储单元。

动态存储区:

(1)函数形式参数

(2)函数中定义的没有用关键字static声明的变量

(3)函数调用时的现场保护和返回地址等存放在动态存储区

函数调用开始时分配,函数结束时释放。在程序执行过程中,这种分配和释放是动态的。

局部变量的存储类别

每一个变量和函数都有两个属性:数据类型和数据的存储类别

存储类别包括:自动的、静态的、寄存器的、外部的。

根据变量的存储类别,可以知道变量的作用域生存期

1.自动变量(auto变量)

2.静态局部变量(static局部变量)

auto类型变量和static类型变量的区别

注意:若非必要,不要多用静态局部变量

3.寄存器变量(register变量)

全局变量的存储类别

全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程序的整个运行过程。

一般来说,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本文件的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。

1.在一个文件内扩展外部变量的作用域

例:调用函数,求三个整数中的大者。

编程思路

(源代码)

(运行结果截图)

2.将外部变量的作用域扩展到其他文件

例:给定b的值,输入a和m,求a*b和am的值

编程思路

(源代码)

(运行结果截图)

3.将外部变量的作用域限制在本文件中

说明

用static声明一个变量的作用

注意

(三)内部函数和外部函数

函数按其存储类别可以分为两类:内部函数外部函数

1.内部函数

内部函数的作用域只限于定义它的文件,在同一个程序的不同文件中可以有相同命名的函数,它们互不干扰,提高了程序的可靠性。

2.外部函数

如果定义时没有声明函数的存储类型,系统默认为extern型。

例:输入一个字符,将字符串中该字符删去。用外部函数实现。

编程思路

(源代码)

(运行结果截图)

编程经验

七、综合示例

例:微信红包管理系统

主要功能

问题分析

流程图

(源代码)

(运行结果截图)

八、函数常见错误

例1:编写函数实现两个整数之和

问题:定义函数时,函数头后面多加了分号

修改后

例2:编写函数实现两个整数的最大值

问题:定义函数时,形参前没写类型

修改后

例3:编写函数求10个红包的平均值

问题:调用函数前没声明函数

修改后

例4:编写函数实现指定整数的阶乘

问题:调用函数时实参前面多加类型

修改后

例5:编写函数对10个红包排序

问题:数组名作形式参数时,缺[ ]或多维数组缺第一维之后的维度大小

问题:数组名作实在参数时,多谢了下标

修改后

例6:编写函数交换两个整数

问题:调用函数时实在参数必须是变量的地址,数组名或指针类型

修改后

该文章属于个人课后学习笔记,内容来源于知到智慧树共享课-C语言程序设计(上海电力大学)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值