任务四 C语言函数(讲解视频)-湖北省计算机技能高考操作(应会)考纲技能通
|
9份
|
51人阅读
|
0人下载
精品
内容正文:
我们来简单解释一下函数的参数传递以及返回值的概念。我这里做了一个简单的比喻。如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品。从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值。在了解函数的参数,我们需要了解两个简单的概念。参数其实又分为形参以及实参。我们把实参和形参分别进行两个解释。形参我们把它叫做是定义函数时形参的概念是定义函数时的参数叫做实参。而实参是调用函数时的参数。在实际调用过程中实参会将它自己本身的值传递给形参,那此时就可以在函数内部拿到我们函数外部的值,这个是函数的参数,也就是说实际上就好比我们的实参就是原材料,而函数就是机器。将原材料交递给函数之后,函数是用形参来接受我们的原材料,然后通过函数的内部代码完成我们最终的产品,这个是函数的参数。那么返回值?这里同样做了一句解释,函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果。这个结果通常通过return语句返回。那么我们需要注意的是函数名称,我们前面函数名称的函数返回值一定要和我们return语句后面的值的类型要一一对应。如果说我们return后面的值为整型,那么函数的返回值一定要为int整型。如果return后面语句值为字符,那么函数的返回值类型也一定要为洽。而如果说函数体中无return返回语句时,则我们的函数值通常写成void。Void表示无返回值类型,这个就是函数的返回值。
好,我们来看看这道题,利用递归求非波那契数列的前二十几项值。我们知道非波那挈是一个数列,而非波纳挈数列的规律是从第三项开始从第三项开始,每一项的值等于前两项的和,而第一项和第二项的值都为一。所以说第三项就是前两项的和2,那么第四项就是前两项的和3,那么依次这样,一是这样按照每一项的值等于前两项和的规律去以此推出下一项。那这个时候我们就利用递归来求。我们来看这里在主函数中I等于1,I小于等于20,I加加这里的I是代表的每一项从第一项到第20项,然后依次传给这个函数FIB,然后这里对应输出每项的值,那说明这个函数是返回每一项的值。这里的N接受的是几,那么就代表它要返回第几项的值。我们利用递归了,其实很简单。既然这个非波那切是求第N项的值,我们并不知道第N项的值是多少。但是我们根据菲波那契的规律,我们知道第N项的值它是一定等于N减一项,也就是FIBN减1加上FIBN减2。这就是我们一定知道第一项的值等于前一项加前两项的和。那么一直这样递归推,那么N减1N减2总会推到第一项和第二项的时候。也就是说当N等等于一或者说N等等于2,当推到第一项和第二项的时候,它们的值一定为一,我们只需要返回一即可,那么这就是菲波那挈。
好,我们来看一下这道题。第一个函数功能为求两个数的最大公约数。求最大公约数我们通常使用的是叫辗转相相除法,外国叫做阿基米德算法。这个时候我们定义好了这样一个函数叫GCD。里面有两个参数,一个A一个B这个形参A和B就是用来接收最后的实参两个值,也就是A求A和B的最大公约数。在求A和B的最大公约数,我们首先再来回顾一下辗转相除法的概念,就是用较大数除以较小数取得余数,然后用较小数作为下一次的较大数,余数作为下一次的较小数,以此循环往复,直到某一次取得的余数为零时则停止,则当前的较小数为最大公约数。参照这个语法,我们首先要来做较大数去除,以较小数取得余数。我们在这里定义一个T逗号RR表示余数。首先我们可以来求余数R等A除以B但在这里我们首先要确定我们的辗转相除法是用的较大数除以较小数取得因数。在这里我们并没有办法保证A一定比B大。所以说在取余数之前,我们先将A和B的值进行判断。如果说A小于B我们就让A和B的值发生交换,T等于AA等于BB等于T那此时在进行辗转相除法之前,我们就一定能保证A是叫大数,B是较小数。然后首先取得余数,判断当前的余数,如果不为零时,我们就开始进行我们的辗转相除法而不等于0。然后用下一次,也就当前的较小数作为下一次较大数,也就是A等于BB等于R当前的余数作为下一次较小数,以此循环往复,继续求我们的余数。如此循环往复,直到某一次R等于零时,则当前的较小数B为最大公约数。我们此时可以将这个B进行返回,但是注意我们这个位置用的返回值。那此时我们这个位置就不能再使用word,而是使用一个int这个就是我们定义的函数,求最大公约数的函数。
好,我们来看一下这道题定义一个函数,判断整数是否是完数。那么什么是完数完数的概念是除了本身之外的所有的因子和等于本身,这个数叫完数。举个例子,比如说六六的因子有1236,那除开六本身之外的因子和123他们加起来的和它们加起来的和刚刚好是和六相等的,那么此时这个六就叫做完墅。所以说要判断这个数是否是完数,本质上就是要除找到除开它本身的所有的因子的和。所以说我们这里定了一个is number函数,然后判断这个数是否是完数。那么这个A形参N用来接收外部传入的整数。这里首先inter I负循环I从一开始I小于NI加加这里是为了取出一到它本三减一之外的所有数,然后判断哪些数是它的因子和哪些数是它的因子。如果这个判断成立,那就说明此时SN的因子,然后我们再在这里定一个S等于0,那么S是用来求和的,S等于S加I,求它的因子和。那么在循环外面,如果说它的因子和等等于N本身,那此时就代表它是完数。Retry一个一,否则它不是完漱,我们return一个0,那么这个就是判断网速的方法。
好,我们来看一下这道题定义一个函数判断是否为素数,那么素数的概念是只能被一和本身整除。如果说我们按照正常的逻辑直接去判断数数,也就是会做出一个N乘以一等等,0N的N乘以N等等。那么按照这个顺着这个逻辑去做出这样的条件判断,其实这个逻辑是错的。因为此时对任意的N都成立,所以说反其道而行之,要判断一个数是素数,我们就看他能否找到除了一和本身之外,他能否找到第三个数能整除。如果说一旦能找到,那就说明他不是叔叔。那么我们顺着这个逻辑,我们在这里定义了一个prime函数。这里的N形参N用来接收外部传过来的整数。这个时候除了一和本身之外,我们首先要去拿2到N减一的数。所以这里的一个i for循环I从二开始,I小于NI加I加OK此时for循环再取2到N减一之间数,然后再拿着这个N去判断,去模拟这个区间的数。如果有任意一个数能除尽,那么说明它就不是素数,也就此时做一个N乘以I等等于0,此时就是在寻找是否有第三个数能证出一若。如果说一旦能找到,马上break,提前终止循环。那此时循环的跳出条件有两个,第一个就是循环条件不满足,另外一个就是break。而我们知道一旦执行中的break,意味着NVI等等于零就满足了,那意味着就是找到第三个了。所以说一旦break出来就说明不是素数,而循环条件自动终止的是数数,那我们要判断的是否为素数,那循环条件终止就说明它是输出。那此时循环条件终止的条件就是I大于0N,有时候自己做判断,如果说I大于等于N的时候,我这里就函数return一表示它是数数,否则return一个零表示它不是素数,那么这个就是判断数数的方法。
好,我们来看一下这道题,利用DV求N的阶乘。这道题其实很简单,N的阶乘的意思就是从N乘以N减1,一直往下乘乘到一为止。那么利用递归就是要同时在返回当前值N的同时,去让它帮我自动乘以下一个数。所以说当我传入一个N值的时候,这里我们进行输入N。传入这个N值的时候,它应当帮我返回到当前N的值,并且同时去帮我自动调用乘以下一个N减一的值。那么一直往下沉乘到当N等等于一的时候,我们只需要返回一个一,这就是计算N的阶层。
好,我们来看一下这道题,定义一个排序函数,传入数组和数组长度将其排序。传入数组和数组长度意味着我们需要两个参数。一个是数组名或者说一个指针参数,另外一个整形速度长度参数。所以说我们定义好,我们这里使用void表示无法回执类型。我们将函数名称定义成sort排序,小括号花括号在里面定义两个形参应的一个A中括号,那么这个就是传入数组的参数,形参A再定义一个int一个N那这个N也同样也是用形参用来接收传入的速度长度。那在函数内部,这个数组形参A会接收到实参数组,这个形参N会接收到实参数组的长度。那它在函数内部我们将其排序可以有多种方法,比如说冒泡排序、插序排序、选择排序。这个时候我们选择使用我们最简单的冒泡排序,我们int一个I逗号J逗号T冒泡排序的规则是外层循环决定比较的轮数,内存循环决定比较的次数。轮数等于数组长度减1,次数等于数组长度减当前的人数。所以说外层循环决定人数I从一开始I小于N速度长度减一轮I加加内存循环决定别的次数。由于内存循环J还要做索引值,所以说J从零开始,J小于数组长度减去当前的人数J加加在函数内部我们开始可以做比较。也就是如果说你的前一个值大于我的后一个值,我们此时就发生。值的交换。T等于AJ,AJ等于AJ加1,AJ加一等于T那。这个时候我们采用的是前者大于后面就交换。那此时我们这种排序方法使用的升序排序。如果想要降序排序,将这个位置大于符号换成小于符号即可。那此时我们就定义好了一个排序函数,这个函数调用时只需要传入对应的数组名和对应的数组长度即可。
C语言函数的本质就是一段封装好的可以重复使用的代码,它使我们的程序更加模块化,不需要编写大量的重复性代码,这也是函数的主要功能。其实函数本质上就是代码,代码就是函数,只不过函数是把代码封装好了。那么如何去定义函数呢?我们通常使用函数返回值,函数名小括号里面写上我们的参数,然后花括号里面写上我们的函数代码块。当然在函数的最后别忘了return返回值,这个位置的return返回值要和这个位置的函数返回值的类型是要一一对应的。函数名的命名标准是符合我们标识符的命名标准,也就是有哪几条命名规则。函数的参数是函数内部和外部沟通的桥梁,在定义函数时的参数我们叫行参,调用函数的参数我们叫实参。这个是调用函数定义函数。那么如何调用函数的?调用函数就是将定义好的函数名称后面加上我们的小括号,小括号里面传入指令的参数,我们把这个参数叫做实参。当然你定义函数时的实参有多少个,那么调用函数时的实参就得有多少个。实参会把会把它的值传递给形参,这个就是函数的调用。
好,我们来看一下什么叫变量的作用域。其实简而言之,变量的作用域就是变量起作用的范围。其实准确来说,有的变量它可以在所有的C文件中使用,同样也有的变量只能在当前文件中使用,更甚者有的变量只能在函数内部使用。这个时候每个每一种变量它其中的范围都不对用。在我们现阶段,我们只考虑两种变量,一种叫全局变量,一种叫局部变量。所谓的全局变量,就是在函数当前文中,在我们全局作用域,也就是主函数中全局作用域下定义的变量,我们叫全局变量。而在我们函数内部中定义的变量通常叫做局部变量。我们要知道在函数内部定义的变量只能在函数内部中使用,而在全局并不能全局环境下,全局环境下定义的变量在文件中所有位置都可以使用。而这就是全局和局部的一个区别。那么什么叫函数的声明呢?我们都知道任何函数的使用都要先遵循,先定义后使用,否则会报错,汇报当前的函数未定义。这个时候有的时候我们又希望,或者说有时候我们在写的时候,我们需要将将函数先使用。那这个时候我们就要对函数进行声明。也就是告诉我这个编译器我现在使用了,但是你先不要报错,你的声明,我等会儿给你补上,其实就是起到一个这样的一个作用,避免因为未找到函数的定义而报错。所以说我们通常比如说我在这里,我使用这个函数叫sort函数。然后在这个位置使用数学函数,知道我们这个位置并没有进行定义。可以看到这里表示未定义的标识符。那这个时候我们其实可以在这个位置进行,比如这个函数叫做sort,那这个时候我们可以在这里补上声明,这个函数是个无法位置sort小括号花括号然后封号。那这就表示函数的声明,函数的声明也就是当执行到所有函数时,AOK我告诉我的编译器,你现在先不要报错函数定义,我等会儿给你补上。由于在这里进行了函数声明,这个叫做函数声明。那么什么叫递归函数的?递归函数的概念是在函数内部调用自身,我们把这种函数称为递归函数。那么我们在书写递归函数的时候,一定要注意两个比较大家容易犯错的点。第一个就是函一定要自身或者说调用自身,这才叫递归函数。另外一个大家比较遗漏比较容易遗漏的点,就是一定不要忘记递归函数,你一定要有出口,一定要有出口,也就是一定要有终止条件。换而言之就是要有终止条件。如果说没有终止条件的话,那么这个递归函数它就是一个无限循环的,就跟死循环一样的,那么程序最终会崩溃的,这个就叫做递归函数。