当前课程知识点:C语言程序设计 > 第8章 函数 > 8.1 函数概述 > 函数概述
同学们
大家好
今天我们学习第八章函数
首先我们来看学习函数的意义
人们在求解某个复杂问题时
通常采用逐步分解
分而治之的方法
也就是将一个大问题分解成
若干个比较容易求解的小问题
然后分别求解
每个小问题叫做一个模块
这叫做模块化程序设计
其中的每一个子模块
在C语言中对应于一个函数
那么,我们给出函数的定义
函数就是一段可以重复调用的
功能相对独立完整的程序段
下面看函数的基本特性
函数有如下一些基本特性
第一C语言是函数式语言
指的是一个C语言程序的
基本构成单位是函数
第二一个C程序只能有一个main函数
main函数是C程序的一个特殊函数
第三C程序的执行总是从main函数开始
在main中结束
即main函数是C程序的入口
第四
函数不能嵌套定义
可以嵌套调用
即一个函数可以调用另外一个函数
下面
我们看函数的分类
从用户角度
函数分为
标准函数和用户自定义函数
标准函数
指的就是由系统提供的库函数
例如我们用过的printf函数
用户自定义函数
就是由我们用户自己定义的函数
如何自定义一个函数
就是本章的主要内容
我们在使用库函数应注意以下一些方面
第一
函数的功能
即
要知道该函数完成什么功能
第二
函数参数的数目和顺序
及各参数的意义和类型
即
我们要知道每个参数表示的含义是什么
以及每个参数的数据类型
第三
函数返回值的意义和类型
即
要知道函数返回值
也就是计算结果
它的含义是什么
以及计算结果的数据类型是什么
第四
使用时需要使用的包含文件
例如
使用printf函数时需要包含头文件stdio.h
从函数形式上
函数分为
无参数无返回值
无参数有返回值
有参数无返回值
有参数有返回值
其中的参数
指的是函数所要操作的数
也就是函数的输入
返回值
指的是函数的计算结果
也就是函数的输出
函数可以有参数
也可以没有参数
可以有返回值
也可以没有返回值
组合起来就是这四种形式
下面讲解比较简单的无参函数
分为无参数无返回值和
无参数有返回值的函数
第一无参数无返回值的函数
它的定义格式是
void关键字加上函数名
再加上左右括号
括号里面写void关键字
表示不需要参数
也可以留空
然后再加上左右花括号括起来的
变量声明部分和执行部分
其中
函数名必须是合法的标示符
函数前面的viod关键字表示函数没有返回值
但不可省略
变量声明部分和执行部分构成了函数体
此类函数的用途是
完成某项固定的处理任务
执行完成后不向调用者返回函数值
它类似于其它语言的过程
此类函数的原型声明是
void 函数名( void )
或 void 加上函数名( )
括号里面留空
也就是说括号里的void语句可以省略
那么
为什么要对函数进行声明呢
因为C语言规定
若函数的调用出现在函数的定义之前
则必须对其原型进行声明
否则会出现编译错误
下面看无参无返回值函数的调用
此类函数的调用很简单
即
函数名加上左右括号及分号即可
注意
不能将这种函数调用赋值给任何变量
因为它没有返回值
调用时
中间不能加void关键字
例如
这个程序中定义的函数showerror()
就是一个无参无返回值的函数
main函数中请求用户输入一个整数
当其小于0时
调用showerror函数
showerror函数显示
input error
的错误信息后返回main函数
由于showerror
函数的定义出现在了调用之后
所以程序的第三行对该函数进行了声明
即
函数的调用出现在函数的定义之前
则必须对其原型进行声明
这个程序同时也描述了编写C程序的一般格式
通常一个C程序由如下几个部分组成
首先是文件包含部分
如include
用于标准库函数原型声明
其次是常量定义部分
如#define PI 3.1415等
再其次是变量定义部分
通常是程序用到的全局变量的定义
我们将在后面的内容介绍全局变量
然后是用户自定义函数原型的声明
再然后是main函数部分
最后是用户自定义函数
也就是用户自定义函数的实现
其中,常量定义部分和变量定义部分
根据程序需要
也可以没有
main函数和用户自定义函数的顺序也可以颠倒
例如
main函数在用户自定义函数之后
则带来的好处是
可以减少一些用户自定义函数的声明
但如果用户自定义函数在main函数之后
则通常需要在main函数之前或
main函数内部开头的部分
对用户自定义函数做声明
下面看函数的返回
函数的返回使用return表达式
有三种形式
第一rerurn (表达式);
第二rerutn 表达式;
第三return;
这三种语句的功能
均可结束函数的执行
使程序控制从被调用函数返回到调用函数中
其中
前两种方式用于
有返回值函数的计算结果的返回
而第三种形式用于无返回值的函数
想提前结束运行的时候
需要说明的是
函数中可以有多个return语句
在无返回值的函数中
return语句的形式只能是第③种形式
也就是return加分号
例如
函数showyes的功能是
如果输入的字符不是'Y'或'y'
则什么都不输出
直接返回
否则
输出"YES! "
其中用到了函数toupper
它的功能是将小写字符转换成大写字符
下面看无参数有返回值的函数
它的定义格式是
返回值类型符 函数名 (void)
括号中的viod可以省略
再加左右花括号
左右花括号中加变量声明部分和执行部分
其中返回值类型符可以为
除数组类型外的任何类型
缺省时也就是说
不写返回值类型时默认为int型
函数名必须为合法的标识符
其次,括号里的void表明无参数
可以缺省略
此类函数的用途是
用于完成某项固定的处理任务
执行完成后向调用者返回函数值
此类函数的原型声明是
返回值类型符 函数名( void );
或 返回值类型符 函数名( )
括号里面留空,不加viod关键字
无参数有返回值的函数的调用形式是
函数名( void )加右括号
或 变量 = 函数名( );
例如
这个程序中的sum函数
该函数功能是
获取用户的输入
并判断
当输入‘0’时
则 计算1~100之间所有偶数之和并返回
当输入‘1’时
则 计算1~100之间所有奇数之和并返回
main()函数
通过tot=sum语句
调用sum函数
并根据用户输入是0还是1来计算
1~100之间所有偶数或奇数之和
并将结果赋值给tot变量
最后输出结果
无参数有返回值的函数的返回
其格式是
rerurn (表达式); 或 rerutn 表达式;
需要说明的是
第一
表达式的值即是函数的返回值
第二
函数体中一般都包含return语句
如果没有
函数也会返回一个值
但这个值是不可预知的
将会使程序可能犯有逻辑错误
我们要避免这种情况的发生
第三
一般情况下
表达式值的类型应与函数返回值类型一致
第四
当return语句中的表达式的类型
与函数的返回值类型不一致时
编译器将对表达式进行强制类型转换
将表达式的值强制转换成函数返回值类型
然后返回给调用者
好
同学们
今天的内容就讲到这里
再见
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-2.1 程序设计语言的发展及其特点和应用
--程序设计语言的特点及发展
- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤
--C语言程序的结构和编制步骤
-3.1 C语言的数据类型
--C语言的数据类型
--C语言的数据类型
-3.2 常量
--常量
--常量
-3.3 什么是变量
--什么是变量
--什么是变量
-3.4 如何进行算术运算
--如何进行算术运算
--如何进行算术运算
-3.5 赋值运算符和逗号运算符
--赋值运算符和逗号运算符
-3.6 数据类型转换
--数据类型转换
--数据类型转换
-4.1 格式化输出printf
--格式化输出
-4.2 格式化输入scanf及字符数据的非格式化输入输出
--格式化输入
-5.1 关系运算符和关系表达式
--关系运算符和关系表达式
-5.2 逻辑运算符和逻辑表达式
--逻辑运算符和逻辑表达式
-5.3 条件运算符和条件表达式
--条件运算符和条件表达式
-5.4 if语句
--if语句
--if语句
-5.5 switch语句
--switch语句
--switch语句
-6.1 while语句
--while语句
--while语句
--do-while语句
-6.2 for语句
--for语句
--for语句
-6.3 循环的嵌套
--循环的嵌套
--循环的嵌套
-6.4 break语句和continue语句
--break和continue语句
-7.1 一维数组的定义和引用
--一维数组的定义和引用
-7.2 一维数组的赋值
--一维数组的赋值
--一维数组的赋值
-7.3 二维数组的定义和引用
--二维数组的定义和引用
-7.4 二维数组的赋值
--二维数组的赋值
--二维数组的赋值
-7.5 字符串的本质
--字符串的本质
--字符串的本质
-7.6 字符串操作的常用函数
--字符串常用函数
-7.7 字符串数组
--字符串数组
--字符串数组
-8.1 函数概述
--函数概述
--函数概述
-8.2 有参函数
--有参函数
--有参函数
-8.3 函数参数的传递方式
--函数参数的传递方式
-8.4 变量的作用域和生存期
--变量的作用域和生存期
-8.5 变量的存储类型
--变量的存储类型
--变量的存储类型
-8.6 函数的嵌套和递归调用
--函数的嵌套和递归调用
-8.7 函数的作用域与封装
--函数的作用域与封装
-9.1 指针变量的概念(上)
--指针变量的概念(上)
-9.2 指针变量的概念(下)
--指针变量的概念(下)
-9.3 指向一维数组的指针变量
--指向一维数组的指针变量
-9.4 指向二维数组的指针变量(上)
--指向二维数组的指针变量(上)
-9.5 指向二维数组的指针变量(下)
--指向二维数组的指针变量(下)
-9.6 动态内存分配
--动态内存分配
--动态内存分配
-10.1 编译预处理
--编译预处理
-11.1 用户自己建立数据类型
--用户自己建立数据类型
-11.2 定义结构体类型变量
--定义结构体类型变量
-11.3 结构体变量的引用与初始化
-11.4 结构体数组
--结构体数组
--结构体数组
-11.5 指向结构体类型数据的指针
--指向结构体类型数据的指针
-12.1 文件的基本概念和文件指针
--文件的基本概念和文件指针
-12,2 文件的打开和关闭
--文件的打开和关闭
--文件的打开和关闭
-12.3 文本文件读写
--文本文件读写
--文本文件读写
-12.4 二进制文件读写
--二进制文件读写
--二进制文件读写