🔥让天下没有难学的算法🔥
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
入门级C语言真题汇总 🧡《C语言入门100例》🧡
几张动图学会一种数据结构 🌳《画解数据结构》🌳
组团学习,抱团生长 🌌《算法入门指引》🌌
竞赛选手金典图文教程 💜《夜深人静写算法》💜
文章目录
一、前言
本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。这个系列文章主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
这一章的主要内容是函数。
二、人物简介
- 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
- 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。
三、函数简介
函数可以把大的计算任务分解成若干较小的任务,然后通过调用的方式达到代码复用。一个逻辑不写多遍,减少代码维护成本。
调用函数的一方不需要了解函数的具体实现,对于他来说,这部分是一个 “黑盒子”,从而使得程序结构更加清晰。
C语言在设计中考虑了函数的 高效性 和 易用性 两个原则。函数的实现应该尽量简短,因为函数可以套函数,一个程序应该尽量由许多小的函数组成,而不是由少量较大函数组成。
四、函数的基本概念
在 ☀️光天化日学C语言☀️(01)- 第一个C语言程序 中,我们其实已经接触到了函数的概念。
int main()
{
printf("5201314\n");
return 0;
}
以上就是一个函数,它被称为C语言的 入口函数,或者 主函数。所有程序执行,都是从这个函数开始的,以它为例,我们引出函数的一些基本概念。
1、函数的基本结构
函数的基本结构如下图所示:
通过这个图,我们类比main()
这个函数,它的 返回类型 是int
32位整型,函数名 为main
,参数列表 为 空,函数体 为printf("5201314\n");
,返回值 为 0。
2、返回类型
函数的返回类型可以是任意类型,例如:整型、浮点型、字符型、自定义类型等等。返回类型 和 返回值 是 配套的,当返回类型为void
时,函数内部的返回值部分可以写return ;
,也可以直接省略不写。
3、函数名
函数名可以类比我们自己的名字。是给函数调用方用的。例如:main
和printf
都是函数名。
4、参数列表
函数的参数列表必须用()
括起来,参数是函数需要处理的数据,例如:
printf("光天化日学C语言\n");
用来输出字符串,"光天化日学C语言\n"
就是一个参数,参数类型是字符串。
5、函数体
函数体内部就是你可以任意发挥的部分,也就是函数的核心逻辑部分,可以是各种语句的组合。当然也可以是另一个函数,也就是函数是支持嵌套的。
6、返回值
函数的返回值则表示了这个函数最后返回给调用方的数据,如果返回值的类型和函数的返回类型不一致,则会进行强制类型转换,前提是能够强转的情况下。
五、函数举例
接下来,我们通过几个简单的例子,阐述一下函数的实际作用。
1、最大值
【例题1】循环输入数据,每组数据为两个数 a a a 和 b b b,要求输出两者中的大者。
这个问题我们可以直接采用 条件运算符 来求两者中的最大值,C语言实现如下:
#include <stdio.h>
int main() {
int a, b, c;
while(scanf("%d %d", &a, &b) != EOF) {
c = a > b ? a : b;
printf("%d\n", c);
}
return 0;
}
如果运用函数的方式,我们可以定义一个函数叫max
,具体实现如下:
int max(int a, int b) {
int c = a > b ? a : b;
return c;
}
其中,第一个int
代表的就是这个函数的 返回类型,max
为 函数名,int a, int b
是这个函数的 参数列表,函数体 就是条件运算符的计算部分,
c
c
c 作为 返回值 进行返回。
这样,作为调用方,我们只需要知道max
这个函数是用来求两个数的最大值的,实际内部实现我们不需要关心,所以调用部分实现如下:
int main() {
int a, b;
while(scanf("%d %d", &a, &b) != EOF) {
printf("%d\n", max(a, b));
}
return 0;
}
当然,我们还可以改max
函数的实现,如下:
int max(int a, int b) {
if(a > b)
return a;
return b;
}
然而,这对于调用方是完全透明的,这就意味着无论函数内部的算法怎么改,调用方始终可以不用改代码,这就是用函数的好处。
2、绝对值
【例题2】循环输入数据,每组数据为一个整数 a a a,要求输出它的绝对值。
同样的思路,我们可以定义一个名为absolute
的函数,然后再由调用方去调用,实现如下:
#include <stdio.h>
int absolute(int a) {
return a < 0 ? -a : a;
}
int main() {
int a;
while(scanf("%d", &a) != EOF) {
printf("%d\n", absolute(a));
}
return 0;
}
3、抛物线计算
【例题3】对于一个抛物线 y = a x 2 + b x + c y = ax^2 + bx + c y=ax2+bx+c,给定 常数 a a a、 b b b、 c c c,和自变量 x x x,求应变量 y y y 的值。
这个问题中,用f
作为函数名,需要接收
a
a
a、
b
b
b、
c
c
c、
x
x
x 四个参数,所以函数可以这么现:
#include <stdio.h>
double f(double a, double b, double c, double x) {
double y = a*x*x + b*x + c;
return y;
}
int main() {
double a, b, c, x;
while(scanf("%lf %lf %lf %lf", &a, &b, &c, &x) != EOF) {
printf("%lf\n", f(a, b, c, x));
}
return 0;
}
我们发现,上面的这个问题格外亲切,因为涉及到了 数学 中的 函数,那么数学中的函数和C语言中的函数,是什么关系呢?
米国人把函数称为 “Function”,它除了有 “函数” 的意思,还有一层意思是 “功能”,我们把它翻译成 “函数”,就是因为它和数学上的函数在使用形式上有几分相似。
当然,从本质上看,将 “Function” 理解为 “功能” 或许更恰当,C语言中的函数往往是独立地实现了某项功能。一个程序由多个函数组成。
六、库函数 和 自定义函数
1、库函数
C语言自带的函数称为 库函数。C语言在发布时已经封装好了很多函数,它们被放置到不同的文件中,使用函数时引入对应的文件即可。这些函数都是专家编写的,执行效率极高,并且考虑到了各种边界情况,各位读者可以放心使用。
2、自定义函数
和库函数相对,我们还可以编写自己的函数,拓展程序的功能,这种函数就是 自定义函数。自定义函数和库函数在编写和使用方式上完全相同,只是前者是系统提供的,后者是我们使用方自己根据业务功能自行实现的。
本文对函数进行了一个简要的介绍,下文将针对函数的定义、声明、参数列表 进行一个更加深入的探讨,敬请关注。
通过这一章,我们学会了:
1)函数的基本概念;
2)函数的基本用法;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
🔥让天下没有难学的算法🔥
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
入门级C语言真题汇总 🧡《C语言入门100例》🧡
几张动图学会一种数据结构 🌳《画解数据结构》🌳
组团学习,抱团生长 🌌《算法入门指引》🌌
竞赛选手金典图文教程 💜《夜深人静写算法》💜