00:01
函数,我们继续来学习C语言课程的下一个章节函数,函数这个章节呢,是我们整个这个C语言课程里面一个核心的部分。对,因为后面很多内容都跟函数有很大的关系,那所以说同学们要认真的来理解函数,那首先呢,我们还是有一个需求,对,也就是说为什么需要函数来一个问题,引出这个要讲解的函数知识点。请大家思考这么一个问题,请大家考这么一个问题,说我们要求大家完成这么一个功能,输入两个数,对两个数,两个数值,然后呢,再输入一个运算符,这个运算符是加减乘除其中的某一个,然后呢得到它的结果,说白了就是呢,写一个很简单的计算器,对不对?就说两个数,然后呢,再加一个运算符,得到对应的结果。
01:03
那同学们想一想。同学们想一想,如果我们用传统的方式来解决这个问题,你怎么解决?你怎么解决好?同学们现在呢?如果我们用传统的问题来解决,大家看我这个代码已经准备好了,很简单一段代码,同学们都能看懂。这边呢,定义了一个NUMBER1,一个NUMBER2,这个大家都能看懂吧,假定一个十,一个20,当然这两个数呢,我们可以通过这个键盘输入,同学们可以自己去完成哈,这个很简单,一个SCF就行了,然后呢,这有一个double res,这个呢是用来存放这个结果的。这是我们的两个数,我可以写一点注释。这是第一个数。第一个数没问题,这是我们的第二个数。第二个数。第二个数好的,那这个是什么呢?这个是最后的结果。
02:05
对,那这个地方同学们看到oper oper就是我们的一个运算符。这个是一个运算符,运算符好假定这个运算符呢,我们是一个减号假定啊,当然我们刚才讲了NUMBER1和NUMBER2,还有这个offer呢,实际上是可以通过。控制台输入的,只是我没有去做而已,好,同学们可以自己去完成,然后下面呢,我用了一个Switch语句,这个大家能看懂吧,一个Switch语句非常简单,就是说如果是加我们怎么办,如果是减。对,如果是乘法,求它的乘积,如果是除法,求它的除,最后呢?一最后我们把这个结果打印出来,同学们看这段代码是不是很简单?没有任何问题吧,但是大家想一个,如果我们用这个问题,这个方法来解决,会存在什么问题呢?来,同学们,我给大家说一下问题的所在。
03:00
好,同学们,我们新建一个文件夹。Chapter。零几的呀,零九是不是零九了,那现在呢,我们先看这么一个小案例,因为这个呢是跟函数相关的,所以说我取个名叫function function这个DEMOOK,零一。那同学们想一想哈,如果我们这么去解决它,可能存在什么问题?同学们想一想先。Include找STDL代码非常简单,Void,一个主函数。那么这段代码呢,我们就放过来。这段代码运行应该是没有任何问题的,很简单一段代码,我们先格式化一下。来,同学们运行这段代码,我输的是我现在指定的是十和一个20,显然。那十和20相减,最后这个结果呢,应该等于负十,我们看是不是这样子的来。我们运行一下。
04:00
对,我们来把前面。前面的这个文件先注销一下。同学们,我们运行哈,看运行的结果跟我想的是否一样,那如果说不出问题呢,他们这一个运算的结果应该是负十。十减去一个20等于负十。没问题。那如果说下面的问题。是一个什么问题呢?大家想一想,如果我这里。执行了,执行了其他的代码。哎,比如说我这里执行了很多其他的代码,我用点点点来表示,突然到这里我们又要注意听啊,我们又要计算。计算两个。我们又要又又要干什么呢?接收,接收两个数。对,两个数和一个一个运算符。
05:01
大家能理解我的意思吧,就现在我要接收两个数和一个运算符。同学们想你怎么完成?你怎么完成?现在我们又要接受两个数,比如说我现在有两个数,打个比方哈,有个NUMBER3等于60,对一个NUMBER4等于。80,然后呢,我有一个操作符对char o p,二,假如是二,然后呢,我要求他们的什么呢?乘积问题来了,请大家思考怎么办?你是不是?一个最简单的一个传统方案。你的传统方法是不是就把这个代码从第八行开始走,把这一段代码又怎么样呢?复制下来?是不是复制下来,然后呢,你在这做相应的改进,比如说这个是op。是不是你要还要改一下名字啊,你是不是要这么干,然后呢,这边诶,然后你再定一个double。
06:07
R12初始化来一个00.0是这样子的吧,然后呢,你就把这些相应的做一个改进,比如说这是二,呃,这三了三。是。但这个还是改了二对不对,好,我复制一下吧。那这边是相减,是不是相减呢。这边是不是它的承接。乘积哦,OK,这边是,诶这个面忘了写了,3NUMBER3乘以NUMBER4对不对,然后呢,这边是除法NUMBER3除以NUMBER4,最后我们可以拿到这个结果,那这边是NUMBER3,这边是二,这边是NUMBER4,这边是RESULT2。我们运行一下,看看这个结果对不对呢?现在呢,下一个运算的要求是60和80的乘积,我们运行一把。
07:02
应该说结果不会有什么错,对不对,诶大家看这报了一个错误,报了一个错误是什么呀,他说number没有声明好,没有声明是因为是不是因为我们这段代码声明应该提到前面去,是不是好,那现在呢,为了。为了这样去完成,我们把这个代码写到上面去,写到上面去过后呢,我们先来生成一下解决方案。你看这个多麻烦。我现在没有运行,你们就应该感觉到很麻烦了,那运行一下对不对,运行起来可以看到60乘以80等于四千八也是正确的,但是大家想想麻不麻烦?你们想想麻烦。而且这种需求。这种需求你将来是不是还有很多呀?你是不是还有很多,比如说我们又要去接受两个数,又输一个运算符,你是不是又得把这个代码复制一遍呢?麻不麻烦,所以说我们总结出来传统的解决方案是可以的,是有的,但是代码冗余,什么叫代码冗余呢?就是有过多重复的代码,即。
08:07
有过多过多。对,过多。过多重复的。重复的代码。就这意思,那这样子呢,就造成我们代码的维护性很差了,因此这个方案并不好。那如果不不好,我们怎么办呢?来同学们给大家提出一个解决方法,这样呢就引出了,对,在这个基础上我们就引出。引出了函数这个概念。我们可以用函数来解决,那么我们来看看函数到底是什么东西呢?来看这边有几个概念。函数呢?我这里给了三个三句话,大家注意理解为完成某一个功能的程序指令的集合,或者叫做语句的集合。我们就。把它称之为函数,那也就是说这个函数它是完成某一个功能。
09:04
就说这个函数呢,是完成某一个功能的,第二个呢,它是一个语句或者指令的集合,也就是说它是它是多条语句构成的,或者说多个指令构成的,明白。那么在C语言里面呢,函数分为两种,一种呢,自定义函数,所谓自定函数就是程序员自己写的,就是我们自己写的,还有一个呢,就是系统函数,系统函数呢,就是C语言的设计者给我们提供的,你比如说同学们看,在给大家的资料里边,是不是我们给了一个C标准,标准库参考手册,这个手册里面是不是就已经拥有了很多很多的函数,比如说同学们看我随便找一个号。别说找Mac吧,Mac。在max里面,你看这些是不是都是函数啊,这都是函数,看到没有这些都是函数,那这些函数呢,我们就称之为什么呀,系统函数,为什么管它叫系统函数呢?就是我们C语言。
10:07
本身就给我们提供好的。那么还有一点需要同学们注意的是,函数呢,还有一些其他的叫法,比如说有一些编程语言里边。他把这个函数呢叫方法,那么在本套视频课程中,我们统一称之为函数。对,好,同学们,那现在我们终于引出这个函数了,那下面呢,我们来看看函数它的基本语法到底是什么样子的,然后呢,我们来快速的入门一把。同学们看。函数的基本语法呢,是这样子的,它首先前边呢有一个返回类型,对返回类型,然后呢,这边是我们的函数名,这边呢有一段小括号,小括号里面写的是形参列表里面呢有两个部分构成,一个是函数体。一个是return语句。大家看懂了没有,那这样子呢,我这有几个说明,什么叫行参列表,先看一下,所谓行参列表就是表示函数的输入。
11:06
就函数的输入部分。那么呃,函数中的这个语句,这个语句就是我们为了实现某一个功能的代码块,明白了吗?最后还有一点要说明是,函数可以有返回值,就这有,有返回值也可以没有,即这个语句是可选的。就他可能有返回值,也有可能没有返回值。那么如果没有返回值呢?我们这个返回类型需要写成VO的,比如说我们这没有返回值。对,假如没有返回值,那么这个。返回类型呢,就是VO明白了吧,那如果有返回值,如果有返回值的话呢,一般我们会有一个return语句给它对应,比如说你这返回的是一个int类型,那这边返回的就是一个int值。好,这样讲了过后呢,大家可能还是不明白,那怎么办呢?这样子我们来一个快速入门案例。
12:06
用函数的思想,用函数的思想来解决前面的计算问题,你们会发现就变得非常的简单了,那怎么来解决呢?各位同学我们就不多说,我们直接在上面改好不好大家看。我们来分析一下,同学们有没有发现我们这个实现计算功能的代码,其本质就是这一段代码。是不是就是这段代码,如果没有返回值的话,是不是就是这段代码?那既然如此,我们为什么不把现在老师高亮的这一部分单独的拿出去做成一个函数呢?是可以的,来吧,同学们,根据老师的思路,我就开始玩了啊,来,我们写一个函数。这个这个函数呢,假如我们就没有返回值,假如没有返回值啊VO。VO,然呢,我就写个开。然后这边我们写个行参。
13:00
对。这这个待会儿我们做一个说明。说明,第一点函数名我们命名为color。你们看清看清楚了,第二个呢,我们假定没有返回值。没有返回值,没有返回值呢,我们就报的第三点行参,我们写一下,因为你要接收的是两个数和一个运算符,是不是这样子的,所以说我就直接写。N1。明白int n2明白,然后呢,还有一个运算符,比如说叫oper。明白了。那这样子的话呢,同学们,我们就可以这样来写了,同学们来走一个,我把刚才的这段代码。这段代码。看清楚了啊。我整个直接给他。咔嚓了。剪切了剪切,剪切完了过后呢,我就直接放在这个位置。在位置,当然放在这个位置过后呢,同学们可以看到,可能学看这里面有几个问题需要大家去了解的,第一个呢,你这个地方是传进的是N1和N2,那么你在这个函数里面用的时候呢,也要跟这个形参保持一致,好我说一下。
14:17
行参。行参列表为。为什么呢,这个。这个就是我们的行参列表。它有几个部分构成呢?它有两个int和一个差。好,这是第二点,第三点要第四点要说明的话,在函数中,函数中我们使用的变量,变量名需要和什么呀,和行参。行参列表列表。列表中的变量名称变量名一样。那也就是说你现在是N1N2,那这边也要改成N1N2,那好我们把它改一下啊N1。
15:01
N2。没问题,那下面是不是统一的改呀,这边也要改N1N2。没问题,下面呢也是N1。N1N2。再下面是N1除以N2。没问题吧,同学们好,下面呢,我们要输出的结,呃,输出的这个地方一个是N1,一个是N2。好,那有一个问题来了,说老师那你这个地方有一个运算结果呀,好,那这样子既然如此,因为这个运算过后呢,我们还是希望有一个返回值,是不是我们希望有个返回值,既然希望有一个返回值的话呢,我们可以这写一个double。对,也就是说我们希望这个函数将来有一个运算的结果,那怎么办呢?我就写成double了。好,那现在我又改了啊,假定我们有返回值,因为现在我分析到这儿,我发现应该有个返回值,那有个返回值呢,我们就是double类型的。
16:02
那现在我们怎么办呢?最后我们这个输出可以输出还可以再返回一个结果。那么这个结果在哪里呢?诶,同学们发现是res,但是这个res你会发现你在这没有定义。没有定义,那怎么办呢?好,我们需要定义,定义一个变量。变量干什么呢?保这个变量我们就就叫re吧,干什么呢?保存运算的结果。运算。对,注意听哈运算的结果。那计算结果是一个WRS等于0.0。好,下面的代码就OK了。是不是这也输出了,然后我把这个结果怎么样呢?R1返回。完事了。那这个任务返回过后呢,这个函数就有返回值了,现在我就这说了,好,写完了过后我们看怎么用哈,这看怎么用,下面这个传统方法我们就不要了,原先你是这样写的,传统方法呢,我给同学们先注销。
17:06
我我也放这好吧,我也放这儿,但是我要注销,因为我不想用这个传送方法,太麻烦了,来,我们看看此时此刻,此时此刻我要去计算。这一个的运算结果和这个运算结果,你看你们知道我怎么完成吗?非常的简单,我这么做。下面是传统的方法。现在呢,我们又。使用函数来完成。两个计算任务。计算任务。那我怎么完成呢?非常的简单,我就调用或者使用函数就可以了,那你看我怎么写啊,你看我怎么写,注意注意,首先呢,我开了。这个就叫调用函数。或者你也可以认为叫使用函数一样的。那你这个时候你的第一个计算任务是不是要传一个NUMBER1进去啊,把NUMBER1给他。
18:03
对,注意听哈,这边稍微有一点点难度,然后再面试,NUMBER2也给他。没有问题吧,同学们,然后是不是还有一个offer给他?同学们,同学们,当我们调用这个地方的时候,是不是最后它返回的一个结果呀?是不是还有一个结果,那这个结果呢?对这个结果我就付给这个res就可以了,能理解我的意思吗?来拿到它。可以了。第一个就写完了。第一个就行了,写完过我们来用一用呗,我们来用一用,看看到底行还是不行,为了以示区别呢,我们这写一个叫做叫做什么呢?我们这提示一句话吧,比如说。啊,比如说我在这地方写一句话。我提示一句话就是什么呢,使用。是用函数来解决计算任务,大家认真听哈。使用函数来解决任负,好,同学们,我们预习一下。
19:04
同学们可以看到,此时此刻,我们拿到结果已然是一样。看到没有,使用函数解决计算物,然后呢,这边是十减,在里面输出了一句话,就是十减去20等于负10.0。那这句话是在哪输出的呢?这句话其实就是在这个函数题里面。执行的。Okay。就这样子就解决了,那当然你们现在还是不明,现在只是一个初步的介绍啊,同学们,后面我们还要详讲,而且你这个地方还可以再打印一句话。因为这个RS是不是返回来的结果呀,就这个就是我们函数返回的结果。RS,那么这个RS等于多少呢?我可以在这再输出一把。哦,我可以这样写。开了。开了函数返回的结果2S等于多少呢?我们看是不是2S。
20:01
那么我问大家,这个re返回结果是不是就是我们这边运算的一个结果?对吧,运算结果是什么就什么了,那就是10.0,我们运行一下。跑起来。现在你肯定还有很多疑惑,大家不用着急,一会我就想看,诶,结果我们我们也拿到是不是,我看一下是为什么,是不是忘了少写个return了。好,我们看一下开了。我们这边有有一个输出语句,然后返回了一个R。返回一个R1。OK。这边呢,我们输出这句话,接收了RES2RES,我们看这边结果为什么没拿到。好,往这往下面看看return r对不对。这有个double,这有个double,这有个re,这边输出了,然后return return这边接收啊接收是这样子的,我们这没有输出。
21:04
是不是没有输出的原因啊,没有输出我们再来执行一下就能看到结果。好,同学们再看一下结果就对了,是不是负10.0?复试这里,那同样的同学们,道理啊,哎,如果说我们要完成第二个任务会变得非常简单呢。是不是变成第二项,我们再使用函数,注意看函数可以重新使用,使用函数完成。完成第二个第二个计算任务。你看这个多简单了。第二个任务,你看我我还用这个来调用。还是调用函数,但是呢,这次传的是NUMBER3和NUMBER4。然后呢,运算符是opera,同样我们把这个结果呢也返回给RE2。大家看看明白了没有,诶又返回一个R2E12,那为了好看这样子啊,我在这输出的时候统一来一个换行,大家看得懂吗?好,这个时候呢,我们再输出从开了。
22:08
从这个开函数返回的结果。R12等于多少呢?好,我们来运行一下。同学们,我们运行之,我们发现呢,诶这个想的结果很有意思,你看。你看第一次我们用开了,呃,函数返回的结果是负十。第二次呢,我们返回的结果是4800,那这里面这句话是在函数里边输出的。好,这就是我们对函数的一个基本认识,那至少呢,你学到现在,你至少至少应该知道函数它的一个基本语法,以及它的基本使用,当然了,函数还有很多细节。同学们听到现在呢,肯定你的心中有很多的疑惑,诶,他到底是怎么回事啊,怎么就能用呢,对不对?我一会儿会解释,但是大家应该体体体,呃,体验到一点什么呢?函数确实很方便,为什么很方便呢?因为你只要写一份代码,你需要用的时候,你直接使用这个函数就能完成功能了,就好像打个比方,就好像我们这边呢。
23:18
写有一个工具,有一个锤子对吧,有一个锤子这么一个工具,那么你要去干什么活,你把这个锤子拿过来用,用完了过后呢,这个就事情就完了,如果这边事情要用这个锤子,你把锤子锤子拿过来再用,就是这种感觉,就好像是个工具一样。好,同学们,那关于函数的一个快速入门我们就聊到这儿,那么我们把内容简单的梳理一下,来看一下哈,我们讲了哪些内容呢?关于函数后面我们还要想讲它的细节问题,来走一个。把前面讲的函数的内容做一个小结。函数。跟上老师思路哈。那么我们讲了函数的哪些东西呢?对,首先我们先提出了一个问题,为什么需要函数,对不对?先引起大家思考。
24:10
先提了一个为什么需要函数。我们为为什么需要函数呢?我提出了一个需求。我先提出了一个需求。对的,我先提出一个需求。那提出这个需求以后,我们先用的是传统方法解决。使用传统。方法解决。使用传统方法解决,这是需,这是这是需求。这是我们的需求,那么我们使用传统方法解决的一个套路就是干什么呢?就是将简单的说。简单的说就是。就是在需要需要执行计算时,计算时。将这段代码。将这段。
25:02
这段计算任务,呃,计算,将这段完成计算任务的代码干什么呀,复制。复制过来。复制即可。对,但是这种方法呢,我们也知道它存在的问题是代码冗余。是不是,然后呢,不利于代码的维护。对不对,所以说这个方案呢不好。该方法该传统方法传统方案。不好。不好,然后呢,我们就不好啊不好。然后就引出了什么呢,引出。出函数。好,这就是函数的由来,那么有了函数这个必要性过后呢,我们就来说了一下函数的概念。对,这就提出了函数的一个概念。那函数呢?我首先给大家提了三点。
26:00
三点,关于这三点,我们梳理到这里。梳理一下什么叫做函数呢?函数就是为了完成某一个某一个功能的,就是它首先是要完成一个功能,比如说前面我们完成的功能是什么呀?计算任务,而且它是程序指令的集合。换言之,就是说它有多条语句。函数呢,它的种类有自定义,还有系统函数。是不是好,这就是我们所说的函数。那有了这个提出函数的基本概念以后,下面呢,我们就说了一下函数的定义和它的快速入门是不是这样的道理来,函数的定义先拿到这来。那函数的定义,大致来说它的基本语法是这样子的,我们梳理一下,首先我们提到基本语法。我们提到基本有他长得什么样子呢?长得就是这个样子的。它长的样子就是这个样子是不是,那我这对它对函数的。
27:05
定义做了一定的说明,我说到行参列表就这一块,就是函数名的后面这个小括号里面放的是行参的列表,它表示我们函数的输入,你比如说看这段代码。NUMBER1 number2和op是不是这样就很具体了,这个就是我们的输入。那么函数中的语句就是表示实现某一个功能,那具体来说,看这里哪一个是我们的功能呢?在这里。是不是从这里开始?到这里结束,是不是都是我们完成计算任务的一个功能?是不是这就是完成这个具体功能的,那么后面呢,还有一个部分就是return语句,这个return语句呢,就是返回的一个值,当然这个值返回什么是由程序员来决定的。如果你不想有返回值可以写的,那就没有return了。没有return好,这个完了过后是不是我们就用一个快速入门来解决了,用函数来解决前面的计算任务。
28:07
那具体来说解决方法是不是就是这样写的?是不是这这这个地方好,我把这个代码呢,给各位朋友板书到这里。好,同学们,到现在呢,我相信各位同学听到现在应该对函数有一个最基本的认识了,就大体知道哦,函数是这么玩的,当然你的脑海里面肯定还有很多小问号啦,很多迷茫的东西,诶,那函数到底它是怎么执行的?哎,它有什么细节,它什么注意事项,对不对?没关系,我一会儿呢就会给大家具体的讲解。好空同学们,那关于函数的基本介绍和基本语法先给大家讲解到这里。
我来说两句