00:00
同学们,我们来看。全国计算机等级考试二级C语言真题操作题的第五一道,我们首先呢,还是把这个题打开,对,先把这个真题打开,我们来看一下它具体的要求是什么。打开一下还是三道。它的呃,一套上一套升级题里面还有三道题,一个是填空程序填空题。那么首先我们看一下第一个程序填空题,它的要求是什么,来阅读一下,就说这些题呢,你拿到过后,你是首先要要把题搞懂才能开始来完成。首先我们还是根据以前的这个规则哈,来建一个新的。一个文件夹放,这叫exam。零五。那么首先是我们这第五套的第一个题,写一个叫exam。零五杠零一。好把后缀呢跟他修改一下。
01:03
把题拿过来,我们看一下这个题的要求。认真阅读哈题有些题还是比较烧脑的,就是一定要认真看,不然的话可能写不出来。我们先来看这道题的要求,是下列给定的一个程序是函数棒。这个函数放的功能是删除字符串S中所有空白字符。包括table,就是那个制表符,还有回车符以及换行符。输入字符串时,呃,输入字符串时用井号结束输入,就是当我给了一个字符串过后呢,我输了一个井号就代表结束了,比如说我输了个ADE空格C空格,然后又是个空格KK。然后呢,我在后面加了一个井号。那这样子的话,就认为这个结束了明白,然后他他要求呢,把这里面的空格给过滤掉。
02:02
那这道题呢,它已经完成了一部分,我们先来看这道题的一个分析和解答。这题还是要动动脑筋的,首先你要把题读懂,我们先把这个题读一下,大概它是什么意思哈,同学们看,首先它在这里呢,定义的一个字符CS是S,肯定是个字符串啊,是个字符数组了,他让我们输入一个字符。说一个字符串,这个字符,这个字符串大家看这边有有有点动脑筋啊,他给一个字符串的时候呢,它是用get char来一个一个获取的,也就是说。也就是说这个地方它它input一个string。然后他是怎么得到的呢?我们就是这个地方,它会等待我们输入吗。它会等待我们输入,所以说这里我们输入的是输入的是一个字符串,但是呢,它是按照字符一个一个接收的,这这里看看出来没有,这里啊,这里分析出来是什么呢?是一个。
03:07
一个字符的方式来接收的。什么意思,就说我输了一个字符串,它是一个一个字符来接收的。嗯。先把这个读完,然后呢,大家可以看到他在这里做了一件事情,这里在循环的读写,大家有没有发现。这是一个while循环,然后呢,这边有个get叉,因此它在这里面呢,它先读一个过后,后面就是循环的读取了。啊,当读取读取一个字符后,就循环的循环的读取什么呢?字符串的每个字符看出来没有。为什么是循环图,你看C加加,AI加加嘛,I加加,不停的加加加一个再读一次,加一个读一个,读一个过后呢,就放在这个S这个字符数组里面了,大家有没有发现每读取一个。
04:05
读取一个读取一个就放入到哪个呢?S这个字符数组中,看清楚没有。所以说先把读懂,读懂完了过后呢,再看这边,那么这里面它整完了过后,它调用了一个放函数。调用了一个放函数,这个放函数呢,它传进去了,把这个字符数组传给了这个P字符指针,在这个字符指针里面,它做了一件什么事情的过滤,也就是说这个地方我们分析出来放函数。这个半函数,其实它的它的这个行参呢,它的形参这个P是一个指针,指向什么呢?指向了我们这个原始的原始的字符数组能看懂吗。也是你传入的吧,或者叫传入的支付数组。
05:00
那在这里面呢,这个放函数其实就实现了一个过滤,大家有没有发现在这里。这里放函数完成了,完成了对什么呢?对这个P指向的字符数组的过滤工作。大家看懂了没有,你看这里面它是怎么做的呢?大家有没有发现它一个for循环。它这个for循环里面呢,I等于零,T也等于零,看到没有,然后呢,P啊P这个I,也就是他这个地方它有点特别,它是看你后面有没有结尾,因为这个如果我们整个这个字符,它输完了过后,它结完了过后,是不是就代表我们后面其实是有一个结尾的,这个地方P0哈。P0P只要不是。只要。只要不是这个斜杠零。这个空格,因为斜杠明我们以前讲过嘛,它就是林子。
06:00
是不是讲过这个东西啊,只要不是斜杠铃就继续就继续。直到读到一个斜杠零,因为零就代表甲,他就不去玩了,在这里面它做了一个判断,看到没有,他说is space这个函数大家猜也猜的出来是干什么。这个函数就是判断你是不是还有这个空白字符,包括有没有回车呀,有没有这个换行啊等等,所以说这个地方要阅阅读出来,就是这个函数的作用。就是EPA。这个函数。函数是判断。该制服?该字符是不是一个空白字符?那么如果不是的话,大家看这边它是怎么取的啊,看清楚了,它这样取出来的是不是P加IP,是一个指针加指针运算,我们讲过,那每加一个呢,这个指针就按照它的这一个单位,就是它这个数据类型的字节数来进行这个增减。
07:02
而新P加I呢,就是把这一个字符的内容取出来。是不是如果说他取出来这个就是这个就是字符啊。这个才是他取出来字符。他判断这个东西是不是空白字母,如果不是的话,你应该怎么办?如果是的话呢,如果是,如果不是一个空白字符,应该怎么办?如果是的话呢,就不要做,大家看整个这个地方一定要看清楚了。这个if语句跟for循环关联的。但是呢?这个for循环只有一条语句,所以说下面的语句,其实下面这个语句呢,跟for循环是没有关系的,看懂了没有。这点一一定要读出来,否则你答不上来。好,经过这样一个分析,其实这个一我们就应该知道他是干什么事情,能看出来他在干什么吗?这个一这个空格其实就是要把非空白字符放入到这个C字符数组里面去,最后来一个斜杠,零分为。
08:05
读懂了没有,所以他就完成一个工作,因此我们这个地方又继续分析出来,这个题其实有一点难度。其实这个题呢,比我们前面讲的填空题要难一些,大家发现没有,因为他对我们整体对这个程序的理解是需要有有一定的认识,否则你写不出来,你对这个程序不理解。你不你你对这个程序没有理解,你是填不出来的,好,那现在我们第一个空格,空格一其实就已经有思路,空格一就是。就是将非空白字符将哪个呢?将这个P指向的。将将这个P指向的字符数组中的哎中的非空白,空白字符干什么呢?放入到这个C中。是不是放到这个C字符里面去啊,那这个地方就应该填写一个什么东西呢?是不是特别简单,就应该C走起来T加加,然后等于什么呢?PI。
09:12
看懂了没有?这个PI是不是也是可以把这个PI是不是也可以把我们这个P指向的这一个字符数组里面的某个元素取出来。是不是一样的,以前是不是我们讲过这个东西啊。绝对讲过的,绝对讲过的好,这个这这个工作就是完成这件事情。那最后大家有没有发现你继续阅读这个题,它在最后for循环处理完了过后,给这个C字符封了一下尾。就是给什么呢?当当这个将当处理完后,处理完后给什么呢?给这个C字符数组分为。呃,加了一个最后啊,最后加了。加了一个这样的东西,表示结束。
10:04
讲过吧,然后他又做了一件事有意思的工作,他将这个C呢,拷贝鬼给这个批了,为什么要拷贝回去啊,同学们,因为这个C是一个临时,它是一个局部变量,是不是我们以前讲过这个局部变量是不能够做一个返回值返回回去的,所以说它这个又做了一个工作,将什么呢,将C。字符数组的所有内容。所字符数组吧,就字符数拷贝。拷贝回哪个呢?P,那最后这个P指向的这个P指向的字符数组呢,就变成了一个新的了,因为你把这个东西都拷贝回去了嘛,那相当于说这个P。这个拷贝回去过后,这个P就指向了一个不包含空白字符的一个内容了,因为C已经过滤,C是过滤掉的嘛,再把C的那种拷贝回去,P指向的这一个空间里面就没有非空白字符了,这样料理啊,此时。
11:07
此时这样写就有有一点难度,此时此时P呢指向的这个字符数组就的呃的元素中,元素中就。就干什么呢,就没有没有这个空白字符了。能读懂吧,好这个代码就行,这个第一个只要填出来过后啊,难度就小了,说空个一,这应该是填写什么玩意儿呢,就这句话。这句话你要分析出来,其他的其实就一马平川了,这个其实最难的,那下面这个就很好理解了,因为你在这方传进去的时候,你是用while循环往里面放的,肯定是在判断它是不是结尾了嘛。这个地方应该是填写一个结尾符是不是,所以说这方应该是C不等于,只要不等于这个井号就可以继续读取。
12:02
看到没有,所以说我们这方分出分析出来空格,空格二就是。就是在循环。循呃循环读取输入时判断是呃,判断该字符串或者叫输入的啊,判断输入的字符串是否结束。啊,结束能理解吗?同学们,有点难度,但是呢,还好。是不是用来这个判断呢,然后下边有一句什么动作,这个while循环其实只到这就结束了。其实就在不停的往里面读东西。对不对,读东西,那最后这个地方应该做件什么事情呢?同学们给我说一下,诶大家有没有发现你这个是S字符串往里面放的时候,最终你是没有给他加一个结尾符的,这是要死人的对不对?因为你不加结结尾符的话,后面我们再读取的时候,这个PI它就不知道什么时候结尾。
13:06
也就是说这个P指向的字符数组其实就是S这个数组,那你如果不加一个结尾符,那这个循环肯定是个死循环。所以说这个地方呢,一定有一个非常重要的工作,大家看啊,这边还是有点难的,各位朋友,空格三。就是给什么呢?S字符数组。最后最后加入一个结束标志。这个别结束标志是个什么玩意儿,是不是以前我们都讲过很多遍了呀,标志。是不是就是斜杠零呢?没问题吧,所以说此时此刻你应该加一个什么玩意呢,来看此时此刻这个S最后是不是就是I呀。是不是应该加一个S,走起来I等于斜杠零。完事了。这样代码就写完了。
14:01
看,大家看看老师分析能明白了吗?这个题说实话有点难度。我个人感觉难度还是有一些了,你如果嗯对C语言掌握的不是很到位,未必能够写出来,尤其是对我们前面讲的字符数组这一个章节没有理解到位,其实是很难填写出来的。好,各位同学,那么这个就完成了,我们来试一下,看看代码能否跑起来,来,来一个get。首先我们先申请一下解决方案。看看它到底能不能够完成过滤的工作,好朋友们玩一把。走起来哈。那我现在呢,我输一个A。ABC空格对不对,然后呢,RRR空格哈。OK,来,最后加一个井号,如果说这个哦没问题的话呢,应该把这个字符串里面所有的空格给过滤掉,回车,诶这个为什么不行呢?哦,应该来一个两个get叉对不对?刚才老师忘了这个事情呢,没关系,我们再来测一下。
15:07
只要代码没问题就没问题,ABC空格。Hello,空格RROK,井号回车,好,同学们可以看到的的确确是把这个空过滤掉了,如果你中间有制表符,就是那个table键或者回车换行啊,它都可以过滤掉,好的代码就讲完了,看看大家理解了吗?啊,有点难度,OK,我把这段代码的一个讲解呢,放到我们的笔记中,没问题吧?同学们来一个表格。哦,分析和解答。放这那紧接着呢,我们再来看修改题吧,我们再看一套修改题。好,那修改题呢,我们也要认真的读题哈,这个题嗯,你说难度大不大呢?也不大,但是你要不认真看哈,你还真做不出来,同学们。来,走一个吧。我们新写一个文件叫exam。
16:04
EXA05-0302是不是我们第第五套的第二个题了呀,是什么题呢。就是我们的改错题。我们先来看这道题的一个具体要求好不好,我们来看一下。他说呀,给下面给定的一个程序函数放的功能是根据整形形参N计算如下公式的值,什么是呢?就说如果等,如果你传的是一个1A1等于一,就说传的这个N呢,它这这个应该这样理解,如果N等于一,就应该等于一。N如果等于二呢?N等于二呢,就应该是按照这个计算的,就是一除以五加A1,也就是说呃,一除以五加上前面这个数,前面一的这个就是N等于一的时候,这个值,如果NA等于三呢,就是A3,就是如果N等于三呢,它的这个结果应该是一除以五加上A2这个值就是这这个值。
17:06
啊,其实它是一个递归的,有人相信用前面的这个值来推出后面这个数的值,明白了吗?那这样地方,他说如果N等于十,就应该输出这个,他问,他要求我们修改这个程序的错误,看看哪个地方有错误改动它,而且呢,不允许改动我们的主函数不得增行和三行,也不得改变程序结构,我们来看一下,呃,首先把这个去掉啊,这个是这个是没有没关系的,这个不是错误。好,我们先来看目前它有哪些错误。嗯,首先同学们看一下这段,这个题呢,没有语法错误。因为语法是过的,我们看运行一下,看这个结果是什么。我输一个十。输一个十回车,它返回一个0.00,想的不对。为什么不对呢?我们首先来看哈,它的一个大概的一个结构是先输一个N拿到了,然后呢调放。
18:04
这个函数把N传进去,返回一个值,其实这里面就是关键。那么我们来看这里面呢,有一个特别有意思的现象,首先你看哈。嗯,在哪里要去改呢。在哪里要去改呢?Okay。同学们有没有发现他的错误?应该是在这个位置?我们看啊A1,如果N等于一的时候,它其实就应该返回一个一。对吧,但是你有没有发现,你有没有发现他在这个地方。同学们看。哎,它为什么这样写呢?你看这里A等于一,其实A等于一是直接就可以返回就可以了,因为它就等于一吗?为什么还去循环一次呢?没有必要,而且你看这个循环。I等于一的时候,I等于一的时候循环那就有问题了。
19:00
因为你你这个这个这个套路,这循环这个工作呢,其实是等于二的时候才工才去做这个事情。你不然的话你会变成什么样子呢?你看啊,如果I等于一,这个就变成了1.0,去除以五加上A。而这个A是多少呢?这个A等于一。这就不对了,那你这样返回来,假设我出的就是一个一好,它返回就是1.0去除以一个六,显然这是错误的,所以说我们可以看出来,这个地方这个一是有问题的。看出来没有?对,好,我们分析一下分析。第一个啊。第一个从这里看。好,我这电快没有了,我把这个。从从这一个程序呢,从分析知道。分析知道。帮。
20:00
知道。知道什么呢?当N等于二时,N等于二时才才开始执行,才执行哪个呢?才执行这个for循环里面这个套路。而如果N等于一的话呢,咱直接返回一对不对,如果N,如果N等于一,直接返回一就可以了。就可以,因此这边的我们修改的思路就出来了,应该把这个for循环这个一改成二。改成什么呢?改成这样一个东西,就是把I对应的一改成二就可以了,其实这个地方就是错误的根源,改一下就行了。完事儿了。就一个错误,那么这个错误改完了过后,我们来试一下,看看代码对不对呢?来走,一起来运行。运行起来。运行起来过呢,再输一个十回车,诶还是有问题哈,还是有问题,我们看。
21:01
呃,如果是等于这个的话呢,还是有问题,我们看哪里有问题。N等于I等于二。的时候有这样问题,那么我们就要进行一个简单的分析了。问题在什么地方呢?来,我们看这里有点问题,大家有没有发现这里面最恐怖的是什么地方?你看这个A啊。这个A它定义的居然是一个int类型,这是有问题的,因为如果它是一个int类型,在你整个这个过程中,你看到没有,不管怎么去除,你看如果按照我们刚才那种除法,1.01除以一个什么什么,那么这边如果是个小数。如果这边是个小数,它都会变成一个零给返回来,返回零过后呢,你再输出,按照小数输出的话呢,就是始终都是0.000多少,因此我们这边还需要一个改动,注意听哈,下面呢我们分析。
22:00
因为因为这个返回的返回的结果是float类型的。类型对不对,但是呢,但是。但是这个源代码里面把这个A,但是A现在是什么呢?现在是int类型。这是不对的,这不对。这个不对。那这个不对的话呢,我们应该怎么修改呢?修改如下,就是这样修改好,这样修改就行了,就是将修改哈,我这直接写修改的原因就是这个int a要改成什么呢?改成float a就可以了,两个地方的修改,把这个改成float。A,好,我们整理一下第一个错误,就是这要改。初一。这是我们的错误二。臭味。好,那这两个一改呢,就应该可以了吧,我觉得应该是没有什么问题了,走起来我们仍然呢,用他给出的这个数据进行验证出一个十,我们发现现在返回的是。
23:05
0.192582。对不对,00.0.19258完全正确,完全正确,好这个代码呢,就分析完毕,同样我们把这一个。程序的改做题也给大家梳理到这里。这是改错题对不对还是老规矩,分析和什么呢和解答。好的,各位同学,那关于我们第五套的。第五套,这前面两个题的评讲就到这里,大家消化一下。
我来说两句