00:00
同学们,我们来学习全国计算机等级考试C2级C语言的第14套,第14道题呢,它也是一套上机题,我们来看一下它的内容。打开我们的第14套题,然后呢,把它放在桌面。还是老规矩哈,我们一边看题,一边分析,一边写代码。第一道题是填空题,我们先把这道题呢拿到我们的这个开发工具里边去,同样我们新建一个文件夹。建一个文件夹叫。幺四。然后呢,我们新建一个文件。我们新建一个文件,同学们叫exam。幺四杠零一。把后缀做一个相应的修改。把题放这就可以了,我们看一下这道题呢,它是怎样一个要求哈,看一下。他说呀,他说现在呢,有一个函数放,它的功能是用递归的算法计算斐波纳器及数列,就是他会去计算斐波纳契数。
01:10
从,那么他解释了一下什么是斐波拉奇数,他说从第N项的值开始,从第N项的值开始,第一从的啊,他是这样子的,用递归算法计算。斐拉契及数列的第N项的值,第一项是什么呢?从第一项开始,菲波拉契数列是一一二三五八十三,什么意思啊?意意思就是说当N等于一的时候。那么斐波拉奇数就等于一,当N等于二的时候呢也等于一,当N等于三的时候是二,当N等于四的时候三,当N等于五的时候是五,当N等于六的时候是八,当N等于七的时候是四。当N,当N等于七的时候,等于13,以此类推。那大家有没有发现他这个斐波拉奇数有什么规律,这点特别的重要,好,然后他说了,如果给了一个N,输入一个七,那么就应该返回13,这里面最大的问题就是说大家要找规律,如果规律找不到,那么这个问题就没没解,或者说你很难解出来。来我们来分析一下。
02:18
分析哈,第一个首先我们要清楚。首先我们要明确吧,明确什么是斐波那契数。这个哎叫飞飞啊飞波纳气苏列。这个呢是必须明白的,那么我们可以通过上面给的力,我们可以看出来,通过。通过给出的,诶,他给出的这个案例呢,我们看到我们看出它有等一个,将N等于一时,菲波拉系数就为一,当N等于二的时候。那这样子我们这样写就行了,好吧。
03:01
也就是说我把这个数列拿过来好吗?拖咱们这个稍微快一点。就是它的斐波拉奇数是这个,那同学们看到这个是N等于一的时候,N等于一的时候,斐波拉奇是一,这是N等于二的时候。这是N等于三的时候,大家注意看规律哈,N等于三,那么这是N等于四。N等于四,看到没有N等于四,这个是N等于五,就N等于五的时候呢,斐波拉奇数就是五,N等于六是八,N等于七,N等于七呢是13 N等于。N等于八的时候是这个,那规律找到了没有,同学们找到规律没有,规律就这样子的,大家看啊规律。规律就是比如说我们,我们以这个为例啊,非波拉去数当。这样子,呃比嗯,比如说这个非波拉器是这样子的,非波纳器数列。
04:05
数列的规律就出来了,什么规律呢?什么规律呢?就是如果如果N等于一或者N等于二对吧,那么非波非波纳契数。菲波纳奇树。就是一看到没有,你看N等于一的时候等于一,N等于二的时候呢,也等于一,那当N等于当N大家看到当N大于等于三的时候,或者说如果N大于二。则是什么呢?则则菲波拉契速菲波拉契数。它应该等于什么呢?呃,它的前前一个前一个斐波拉奇数。再加上加,再加上前前啊,前一个的前一个斐波拉奇数,这个大家能看懂吗。
05:08
也就是说,大家有没有发现从N等于三开始的时候呢?它是前面前一个数的斐布拉奇数和这个非布拉奇数的和。前一个的前一个斐布拉奇数,你看这个N等于三的时候,呃,N等于三,N等于三的时候,你看它是三,是这两个数的和,那当N等于五的时候呢?它是这两个数的和,当N等于六的时候,是这两个数的和,当N等于七的时候,是这两个数的和。五加八嘛,当N等于八的时候,是这两个数的和。规律就已经出来了,这个规律是一定要找到的,这个规规律找不到,那肯定是没法解的。也就是说,非波拉系数等于前,当N大于二的时候,当N等于一,等于N等于一,N等于二,那就是一,没什么可说的,没有,这是固定的。当N大于二的时候,即N从三开始,斐波拉奇数等于前一个斐波拉奇数加上前一个的,前一个的斐波拉奇数可以了。
06:08
那明白这个道理呢?那老师就我估计大家应该知道怎么怎么填了吧,规律都已经找到了,这还有什么可说的呢?空格一,大家看空格一呢,这里面它说当N等于零的时候,它就返回一个零,那就相当于说N如果等于零了,我们就给你返回零就完了。那么当N等于一的时候,它一个一,那我问大家N等于二的时候,是不是也等于一啊,所以说其实这个地方应该填什么呢?就是我们刚才其实就是这句话。的一个。所所以应该填写什么呢?所以我们应该填写的是K2。大家看懂了没有?也就是说,当K1和K2的时候呢,它们均为。一你看这个是不是穿透。我们讲过Switch语句,如果Switch语句这边是个空语句的话呢,它会继续穿透到下一个case语句。
07:04
这就体现出当等于一等于二的时候,返回一。能能明白,那否则的话呢。是不是这个说一句是从这开始到这结束,那如果说。同学们看。那如果。对,同学们看,如果它呃是大于二,不在这个里面,就是说它既不等于零,也不等于一,是不是应该走下面这个语句了呀。也也就说应该走下面这个语句了,走下面这个语句呢,因为你上面有直接返回了吗?那如果是这个范围就是N大于二的时候呢,这句话要体现出来。当然你在做开发的时候,你不要写这些,这些注释,那就应该体现出非波拉奇,前一个非波拉奇数再加前一个,那就很简单了,就是这样写。大看我写我写上了哦。这个地方就应该是前一个数就G减一,是不是再加上。
08:03
前一个数的前一个数的G减二。就写完了,也就是说这个空空里面呢,应该填这个玩意儿。对不对,好,最后呃第三呃,就是说,那也就是说第第二个空,咱们也就明白了,是空格二,我们应该填写的是这些这个内容。对,那么呃,那么同学们看我们空格三呢。空格三是不是也很好答出来。空格三。是不是接收一个数啊。大家看这里它是SKYF,那说SKYF,他说input一个N,那显然这里面呢,我们就填一个N的地址就可以了,是用于用于输入或者叫接收。接收一个输入,那这里我们应该填写的,诶同学们就应该填写嘛呢,填写at服务一个N完事。那我们第三个空格应该填的是N,同学们,我们来试一下吧,Get char。
09:06
再来一个格。我做一个测试,那同学们看到它这里传了一个N过后呢,把N传给了这个方函数,对反过来这里面其实它它用的是递归哈,同学们这里面是递归,递归我们是讲过的,讲的也很清晰,那在我们高校大学生是一名课程里面讲的很很清楚的,来走一个运行,我们直接测试,直接输一个七。同学们,同学们看,根据他的要求,如果我们输的是一个七的话呢,应该返回一个13,看对不对,输一个七吧,同学们走起来。菲波拉契13完全正确,那我们可以再试一个,为了保险呢,我们再试一个八,如果是第八一个菲波拉契数应该等于多少呢?应该等于21,看到没有,是不是我这也梳理出来等于21,那你回车看是不是等于21呢?答案21正确。好,同学们第一个题我们就评价到这里。
10:00
应该说还是比较简单的,这里面最关键就是要把菲波拉契数的规律找到,如果规律找不到,没辙。分析和解答。各位放这我们紧接着看第二个修改题好不好来吗?我们把修改题呢,同样也放在我们的VS2010。同样我们新建一个文件,便于大家的一个阅读。文件名叫EXAM13杠零二。同样,我们将后背写错了,不好意思,这个名字叫幺四。要死,后缀我们改一把好吧。那同样我们把代码呢,呃,把这个要求先拷贝过来,同样我们先来阅读一下这道题的题意是什么哈,他说呢,有一个猫C。函数的功能是。按以下递归公式,它把这个递归公式已经给了,求函数的值,它怎么给的公式呢?他说放,呃,他说function,呃,放函数N等于十当,也就是说当N等于一的时候,大家看这句话怎么读好,就当N等于一的时候,它返回一个十,这样来看。
11:17
那么当N大于一的时候呢?当N大于一的时候呢?就等于放N加N减一这这个函数的值加一个二再返回给他。呃,当当给N输入一个五的时候呢?函数值为18,当给N输一个三的时候呢,函数为14,请改正。这个程序的错误,并使得它求出正确结果,不要改动幂函数,好同学们,我们看这个地方呢,它应该首先第一个应该是不是加一个int函啊,一个返回值,这个问肯定要加进去的。这个这个我加进去,这边呢,应该有个行参。对吧,这边应该有个行商我也写上去,这个应该是他的一个笔误啊,这个这个应该错误不会在这在这出现啊,不会在这出现,好,我们来先试一下,这两个是我加了这两个int呀,应该是,嗯,这个试卷给的时候就是就是我们在拿这个试卷的时候少了两个int,这个应该不是错误,我们试一下吧先。
12:16
先来看一下此时此刻,嗯,结果对不对,我们先输一个五,看他是否返回18。来运行一下。先输一个五吧,同学们。先输一个五。回车,诶,不好意思,这里应该再来一个get,是样子,同学们运行哈。跑起来。我们输入一个五对十显然是不正确的,因为人家五呢就应该返回18,那这个错错在哪里呢?来吧分析。分析走一个,嗯,我们来看看这句话的意思啊,我们这个就要阅读源码了,需要阅读阅读源代码。如果不阅读源代码,这是肯定没法玩的,我们看这个源码是什么意思呢?他这样说的。
13:06
他说你输一个N。然后呢,这个N呢,它调用了方放函数,把这个N传进去,那现在就应该阅读这个放函数了,放函数它怎么走的呢?他这样写的。In的C,这个应该是返回的结果了,看最后返回的C嘛,他说如果N等于N,诶大家看这里面是不是有问题了,已经看出来了,看到没有,他说N等于。这个地方它是一个等才对,不是不能是负给它,如果你是付给N等于一的话,它永远谁都等于十了。所以说这里面已经看出来这个错误了。因为这个地方,他说当这个千万不要人家这写个N等于一,你就认为是等于,因为在我们编程里面两个等才才算是等的,所以说错误在这里。已经找到错误了,错误一哪里呢?就这个地方是有问题的,这里。
14:02
这里应该应该是判断N等于一,而不是负值对不对,而不是副词语句,那应该怎么修改呢?应该对。就应该改成。应该改成什么呢?N等于一即可。代码喜欢。那换言之,我们这儿写个等号就可以了。对不对,那这样改完了后呢,我们可以先来测一下看看对不对,如果答案都已经正确了,就不需要再去找了。来看一下,现在我再输一个五,返回的是18对吗?正确来我们再输一个三,三的话呢,应该返回一个实时答案正确,所以说此时此刻其实代码就已经改正确了,那下面代码你可以再阅读一下,就是如果N等于一,返回一个10L10。就是如果N不等于呢,就调用。
15:00
方N减一加二也是正确的,最后返回一个C,这是一个整体哈。Return语句是独立的,就是if要执行完毕过后再去执行return,答案修改完毕,也就是说这道题其实只有一个错误。但是这个错误呢,其实有时候你你不认真阅读的话,还不一定找得到,因为我们在表先讲过,这个等和这个等是两个不一样的,这个等一个等号是负值,两个等号才表示判断两者是否相等,相相等,各位同学第二个题我们就评价到这里。朋友们,我把代码给它放到这里来,这是这道题的分析以及解答。分析和解答,各位放总,那同学们那第14套的前两个题,前面两个题一个判断,一个修改,就给大家先讲到这儿,大家消化一下。
我来说两句