函数的概述
函数:
实现一定功能的,独立的代码模块。我们的函数一定是先定义,后使用。
使用函数的优势:
1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数,减少代码量。
2. 借助函数可以减少重复性的代码。
3. 实现结构化(模块化)程序设计思想: 结构化程序设计思想:将大型的任务功能划分为相互独立的小型的任务模块来设计。
函数是C语言程序的基本组成单元:
函数的分类C语言程序是由一个(必然是main函数)或多个函数组成。
函数的分类
从函数实现的角度:
库函数:C语言标准库实现并提供使用的函数,比如常见的有printf(),scanf()
用户自定义函数:需要程序员自行实现,开发中大部分都是这样的函数
从函数形式的角度:
无参函数:函数调用时,无需传参,可配可不配返回值。
有参函数:函数调用时,需要参数传递数据,经常需要配套返回值使用。
相关概念
主调函数:主动去调用其他函数的函数。
被调函数:被调用的函数
很多时候,一个函数既可以是主调函数,也可以是被调函数。这种情况一般出自自定义函 数。
函数的定义
语法
函数首部:
返回类型:函数返回值的类型
函数名:函数的名称,遵循标识符命名(使用英文字母、数字、_、$,不能以数字开头,建议小写 +下划线命名法)
形参列表:用于接收主调函数传递的数据,如果有多个用" , "分隔,且每一个形参都需要指定类 型。
面试题:
注意:
函数类型标识符变量类型说明符相同,它表示返回的函数值的类型。
在C语言中还可以定义无类型(即void类型)的函数,这种函数不返回函数值,只是完成某种功 能。
如果省略函数的类型标识符,则默认为是int型。
函数中返回语句的形式为 return(表达式);或 return 表达式;其作用是将表达式的值作为函数值返 回给调用函数。其中表达式的类型应与函数类型一致。
如果"形参表列"中有多个形式参数,则它们之间要用" , "分隔。
如果形参表中有多个形参,即使它们的类型是相同的,在形参表中也只能逐个进行说明。 fun1(in t a,int b){}
一个完整C程序中的所有函数可以放在一个文件中,也可以放在 多个文件中。
案例
案例1:
案例2:
形参和实参
概念
形参(形式参数):
函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当函 数调用时,系统才会为形参申请内存,用于存储实际参数,并且当函数返回,系统会自动回收为形参 申请的内存资源。(本质上所有函数都有return,只不过当我们的函数返回类型是void的时候,return 关键字被省略了)
实参(实际参数):
函数调用时主调函数传递的数据参数(常量、变量、表达式..,只要有确定的值),实参是传递的 数据。
实参和形参必须类型相同。若不同时,按赋值规定自动进行类型转换。
在C语言中,参数传递遵循 单向值传递 ,实参只是将自身的值传递给形参,而不是实参本身。形参 的值的改变不会影响实参。
实参与形参在内存中占据不同的内存空间,尽管可能实参和形参名称是一样的。
案例2:
函数的返回值
若不需要返回值,函数中可以没有return语句。
一个函数中可以有多个return语句,但任一时刻只有一个return语句被执行。
被调函数返回给主调函数的结果数据(可以是变量、常量、表达式,只要是有确定值即可。)
返回值类型一般情况下需要和函数中return语句返回的数据类型保持一致,如果不一致,以函数定 义时指定的返回类型为标准。也就是返回值类型和实际返回值可以存在自动类型转换或者强制类型 转换的关系。
案例1:
案例2:
案例3:
函数的调用
调用方式
1. 函数语句: test(); int result = max(2,4);
2. 函数表达式: 4 + max(2,4);
3. 函数参数: printf("%d",max(2,4))
在一个函数中调用另一个函数须具备以下条件
① 被调用的函数必须是已经定义的函数;
② 若使用库函数,应在本文件开头用#include包含;
③ 若使用用户定义的函数,而用户函数又在主调函数的后面,则应在主调函数中对被调用的函数进 行声明。声明的作用是把函数名、函数参数的个数和类型等信息通知编译系统,以便在遇到函数时, 编译系统能正确识别函数,并检查函数调用的合法性。
函数声明
函数调用时,往往要遵循 先定义后调用 ,但如果我们对函数的调用操作出现在函数的定义之前,则需 要对函数进行声明。
函数声明的作用:
是把函数名、函数参数的个数和返回类型等信息通知给编译系统,以便于在遇到函数时,编译系统能 正确识别函数,并检查函数调用的合法性。
声明的方式:
函数首部后加上分号;
函数首部后加上分号,可省略形参名,但不能省略参数类型。
函数的嵌套调用
函数不允许嵌套定义,但允许嵌套调用。
嵌套调用:在被调函数内有去主动去调用其他函数,这样的函数调用方式,称之为嵌套调用;
章节作业
编程题
1. 编写一个函数,通过输入球的半径,返回球的体积;
2. 编写一个函数,通过输入一个数字字符,返回该数字
3. 编写一个函数,输入四个数据分别表示2个点的x,y坐标,返回两点之间的距离;
4. 编写一个函数,通过参数输入一个整型数,返回该数各位上数字的平方和;
5. 编写一个函数,通过参数输入x的值,计算如下的数学函数值,当 x>5时, f(x) = 4x+7;否则 f(x) = -2x+3,返回结果值
6. 设计一个函数,用来求出多个数据的平均值;
7. 设计一个函数,用来查找一个字符串中某个字符的位置;
8. 设计一个函数,把一个整型数字转成对应的字符串格式
9. 设计一个函数,统计字符串中大写字母的个数
10. 设计函数,实现strcmp 的功能;
11. 编写函数,用于判断输入的字符是不是个数字。是返回1,不是返回0.
12. 设计一程序,实现一个简单的计算器。 要求:有菜单函数 和加、减、乘、除的函数 主函数调用这些函数实现程序的功能.要求菜单函数能 够输出如下的界面
1、加法 2、减法 3、乘法 4、除法 0.退出
13. 设计函数实现冒泡排序;
思考题【选做】
14. 编写一个函数,将数组中的数据首尾互换