00:00
同学们,我们来看第八套的程序修改题,程序修改题呢?为什么我们放在这块讲,是因为这套这道程序修改题它还是有一定难度的,我们来看一下。先把这个题呢,先拿到这边来好吧。注释掉,我们新建一个文件。文件的名字我们输入叫CE08杠零二。把后缀进行一个修改。文件后缀名改成C,把代码放过来,我们来看一下这道题,它是说了一件什么事情哈。他说了这么一个事情,他说。给了你一个函数,放。这个函数的功能是将一个长整形。长整形数中的每一位上的偶数的数依次逆向取出,光这个都读的有有点费劲,将每一位上为偶数的数依次逆向取出。
01:11
构成一个新数放在T中,显然他只要一说放在T,一般都是以指针的形式传递的。高位在低位,低位在高位,这个高位在低位,低位在高位,其实指的就是逆向。啊,他也不是哦,他也不是这个逆向啊,就是逆向取出,然后呢,把这个,呃,因为你逆向取的话,那肯定是高位先取出来嘛,那高位就放在这个低位去,低位呢就在高位了,例如当S中S给的数是这么一个数的时候,比如说这么一个数我们不去念了啊25846513这个数,那么它经过这个放函数处理过后呢,就变成了6482,为什么是6482呢?大家看一下。因为它是逆向取出,那就从这个从这个方向开始取。
02:04
对吧,那大家看第一个取出来是三三,不是偶数。三不是偶数,所以说去掉舍掉一也不是偶数,六五也不是偶数,六四,六四的话就放在高位。放在高位,然后呢,四也是一个偶数,继续往这放,因为四相对六来说呢,它对不对。他高位放低位吗?那低位在高位好,这样子呢,这个六这边就是四了。四然后呢,这边是八。八然后下面这个呢,就变成二啊是这样子来走的。对,你看你原先这个低位的六是不是低位啊。六肯定是低位嘛,原因是这个位它现在变成了星数的高位,就这个意思。他说请改正函数放中的错误,并使得它求出正确的结果,而且要求呢,不能改变主函数,不得增行三行,不能改变程序的结果,那这样子同学们你拿到这个题呢,你先看有没有语法错误。
03:14
从这看呢,好像没有看到有语法错误,我们先来运行一下,看看这个结果跟我们想的有什么区别没有。好,同学们先看,呃,我们就以什么呢?我们就以他给的这个数为例来运行,看看它此时此刻返回的是什么,然后再做修改和分析运行一下。运行。运起来过后看看看他有没有错误啊,大家看这时呢,它居然运行起来了,那运行起来过后我们数这个数二五。八四。六五。幺三回车,诶,大家应该看到了,它返回的是一个零。我再重新来一下。刚才一闪而过。我们再重新来给大家运行一下,少输了一个get char。
04:00
再重新输入。现在呢,我们输入二五。八四。六五。幺三回车。可以看到结果是零,显然不正确,人家的结果应该是6482,那为什么错了呢?好,同学们,我要给大家讲一下啊,现在呢,我跟大家讲这个事情,就是我们在改错的时候呢,现在语法错误是最好改的语法现在也没有错。从语法层面来说没有错,那一定是逻辑错了。分析第一点。该道题该题该题没有语法错误。没有语法错误。因此错误在什么呢?错误在。逻辑上这个是比较难的。因为逻辑上的错误,就需要我们必须阅读代码,没有办法了,同学们,这时需要我们阅读源码。跑不了了,前面大家还记不记得我们做了一个改错题,那个改错题是不是直接就是几个语法错误一改结果就正确了,现在你要阅读源码,这个就非常的耗费时间。
05:09
因为这个代码你得读懂啊。你要读懂这个难度就很大了,来吧,那没办法,就就开始读呗。首先呢,我们看第一句话定义了long long型,一个SST,一个S,一个T,然后输入S这个这句这些都没问题,然后这边是这句话是不是调用。调用我们这个放函数啊,调的时候大家有没有发现他把这个S,这个S就是你输你输进去的这个数和T,这个T大家一定要分析出来,他传的是地址,大家看到没有,也就是说你分析出来这这句话一定要分析到位啊。第三点,我们可以看到。它在调函数的时候,调用函数时。调用函数时,呃,一个是S,一个是T,也就说这一个是值,S是值。
06:01
而这。It呢,是地址。地址,所以说一定分析出来,将来这个T呢,它是一个指针,那大大家就要知道指针在取值的时候,指针在修改值的时候,它是要有个取值符号的,明白好,这个我们要分析到位,那现在呢,我们接着往下看,下面这句话没什么好理解的,就是直接把得到的这个T呢,这个T就应该是返回的结果分析出来了吧。好,这个T。T。大家要分析到T就是将来,将来。这个结果。没,没问题吧。它是结果的话呢,大家可以看,看到它返回这个结果以后,用print输出了一个T,下面两句话没什么可说,因此核心一定是放,现在我们来开始阅读,放放这个函数啊,大家看阅读起来是有一点难度的。那我们先把这个代码稍微的整理一下,这个是没问题的啊,整理一下。
07:02
嗯,怎么整理呢,这样整理一下,便于我们的阅读。好,我把这边整体移动一下。While循环,大家看这个while循环是跟谁对应的呢?它只跟我们这一句话对应,能看懂,不就是这是一个整体。这是一个整体,于是乎,下面这句话呢,是一句单独的话。看到没有,那Y循环从这开始到这结束,从这开始到这结束,看懂了没有?这个while循环又是一一个一条一一个部分了,那这边我们怎么来看呢?应该这样看。看懂没有?这样看起来就清晰很多。那也就是说它其实是分成这么几几段的,第一个呢,先定义了一些变量,然后是用了一个Y循环,然后呢用I除以十,然后这又是一个Y循环。那你怎么读这个东西呢?有点难,那这样子我教大家来用我们的输出语句来看,这样便于我们的一个分析来看,首先我们这句话我们读不懂对不对,你不懂怎么办呢?好,我们。
08:13
讲哈。如果在。在阅读源码时阅读源码。原。源码时。啊,可以使用debug。调试debug或者或者输出语句,或者输出语句来帮助阅读。同学们还记不记得我们在讲大学高校大学生C语言课程的时候讲过调试技巧?但现在呢?我们其实可以暂时不用调试,我们用输出语句来帮助我们阅读,我们首先对这个I有一定影响,我们对这个I,我们不知道它是干什么事情,大家来看这个I到底是什么呢?我可以告诉大家,大家看这个Y循环S除以I大于零。
09:03
只要S除以I大于零,它就让这个I呢乘以十,而I初始化为一,我可以负责任的告诉大家,这个I,这个I将来它这个结果呀,就这句话,这个结果它应该是多少呢?应该是你输进去的这个位数。整一一共有多少位,12345678,他就应该是1234678,再来一个零,也就这个I其实是柱子。为什么是这个值呢?你看啊,S除以I大于零。那只要它大于零,它就把这个I从一乘以十。那你除完过后呢,这个I不是又变成一倍了吗?然后再除以十还是大于零的话,再者其实大家看到它求的是S除以I的一个商。看到没有?所以说它最终这个结果就应该是一个九位数,我们看是不是这样子的呢?来同学们输出一下print f,大家不着急啊,这个题呢,有有一有有一丝丝的难度,I等于百分号D,我们来帮助大家阅读,那同学们现在呢,我们来玩一把,还是老规矩,待会呢,我们输入还是这个值好不好?
10:20
来运行,看看跟老师分析的是否一样。他应该得到一个九位数,我粘贴一下。运行。回车同学们可以看到,的确你看这时这个I呢,其实这个值。几位呢?123456789。九位他要他,他到底要干什么事情呢?大家有没有发现这道题的难度就是要把他的个个位数取出来。它的难度在这个,但是我不知道你将来这个位数是多少,多大的一个数,所以说它就用Y循环来看你到底是多大的一个数,再在这个基础上再增加一位,那增加一位过后呢,在这里同学们看它又把这个I又减回去了,这个地方我不一样,我不说这个地方I应该等于多少。
11:10
这个地方的I其实就应该除了一个十,就变成了一个这样的数。诶,他拿到这个数有什么用呢?看到没有,Y循环开始了。这个Y循环大家能猜出来在干什么吗?看这句话,这句话在干什么事情,重点分析。这句话就是在依次注意听着啊,依次取出应该是逆序啊,逆序取依次,从逆序依次取出,我想讲逆序吧,逆序取出S。各个各个位上的值。为什么呢?你想想你S,比如说你S是这样一个值,25846513,你除了你,你除以一个ii,现在是这么多。
12:04
你除以它不就得到它的哪个数了呢?同学们是不是哦,不是,它不是逆序取出的,它不是逆序取出的,它就是按顺序取出的,大家发现没有。它就是顺序取出,应该是顺序取出,因为从这边一除的话呢,应该是得到它的最高位。二。是不是啊,所以他应该是。顺序取出。顺序取出S各个微商的值,我们可以输出来看一下是不是这样子的PF。给朋友们看一下,D等于百分号D,我们这个地方就要靠输出语句帮助我们阅读明白这意思吗?我们看一下吧。我们可以看到它取出来是什么呢?哦,俺还是老规矩,粘贴一下好吧。粘贴这个,诶,不是这个数了,不是这个数了,不是这个数,应该是这个数。
13:01
来吧,同学们不着急哈,不着急写上这个题有一点小小的难度,诶,同学们看清楚没有?哎,现在看懂了吧,25846513,看到没有,2584653正确了,好起,当我们讲到这儿,我相信同学们明白想干什么事了吧它。他现在呢,这个地方它就判断是不是偶数,你看这儿代码就写错了,他这方应该是判这个D是不是偶数,因为是偶数,他看这里是偶数的话呢,我们就会去处理,因此这个地方一看就看出来了,这边应该是in这错误。应该是什么呢?如果D是一个偶数。偶数就去处理。说的第一个错误找到了哪里,在这?是不是你阅读源码就帮助我们理解了?如果你不读源码,很难理解,应该改成什么呢?各位应该改成等零好,第一个OK。
14:05
第一个就搞定,改成它明白哈。那么他拿到这个是偶数过后,他又做做了这这件事情,这件事情在做什么,你们发现没有。这件事情在做什么呀?因为他现在最大的问题呢,你你现在是顺序取出的,25846513这样取得,但是实际上我们要逆续。逆序的存放,就说你顺序取出,但是呢,我们高位的要在低位,低位的要在高位,所以说你看它取出这个值了过后呢,它是怎么处理的呢?它是让这个。D乘以一再加一个T。这个就变成第一位了。能理解不就说这个值这个地方我们可以看一个具体的例子,比如说以二为为例,你第一个来的是不是二啊。二那如果是二的话呢,二就进来,它就应该是怎么写的呢?是二去乘以S1S1,现在是不是一啊,一再加上。
15:11
一个再加上一个TT现在是多少呢?T是零,因为它是新TT本身是指针,因此它用取值符来访问这个T是正确的,这是正确的,所以说它这个地方呢,按理说应该是加零,但是很遗憾,大家有没有发现它又错了。这个地方显然应该是一个指针,既然是指针,就应该是用加取指符、取值符来处理,这个地方应该写成这个。又分析出来一个错误。看到没有,也就是说原先这个地方的代码也要进行一个修改。哪里呢,第六点。错误就是这句话是应该改成。骂呢,改成这个。他原先没有这两个,因为你T是指针,所以说要用取值符才能绑到它的这个值,好这样就改成这,那大家这样看就二加一等于零,不就变成二了吗。
16:07
诶这样大家理解了,理解完了过后,让这个S1乘扩倍,让这个一干什么呢?S1是增加十倍。哎,增加十倍有什么用处呢?当你再来一个,看这个这个二就在我们的这个个位上了,然后五过滤掉八来了,啊八八你看如果是八的话呢,它应该循环了两,这个地方应该循环了两次,所以说第二次这个八呢,它进来了过后,这应该是八去乘以多少了呢?因为八是他第一次进来的时候已经乘了个十,第二次进来又成了一个十,所以说这个变成了。100再加上T本身,因为T要累积啊,它T这这个第二步了,T要累积,T累积的话呢,就应该是它本身有个二。是不是它本身有个二,我看看是不是这样子的。
17:03
哦,不八四。对,他这个地方不是这样子的,因为。呃,我们看看这地方是怎么走的啊,S除以二,哦,对对,这个循环里面只加了一个十,因为只有偶数的时候才会加乘以个十倍,所以说这方仍然是十,而不是100,因为它是它是用这个衣服包起来的。只有在是偶数的时候才成了一个十对,所以说它应该是80乘以八乘以十,再加上一个二,就变成了82。看没有?那也就是说现在第八处理过后就变成了82,是不是四和六也是按这个逻辑来处理的,最后就变成了什么呢?最后变成了6482。好代码就写完了,那也就是说只需要把这改一下代码应该就是正确的了,那做完做完以后大家看整个这个循环过程中,这个S在不停减少S摩哀。在这个I这个地方,他在做什么事情呢?这句话其实是为了上面这个服务的。
18:06
因为只有你RS磨一个I,再让I去除以十,才会依次顺序取出这面值,这个不要去动它。如果你把这个改了的话呢,我们就没办法顺序取出S个位上的值了,现在这个地方在力学的处理。这这是顺序取出,然后这边呢,再逆序处理,把低位放高位,高位放低位,这边是再选什么将。将高位的高位的数。啊,处理后,处理后放在放在果的,哎,放在结果的地位。第一位,然后呢,把第一位的数处理后,放在结果的高位,我就不写了哈,这句话我就不写了,明白,那同学们现在再来看应该就没问题了,应该就没问题了,来,我们把它梳理一下,走起来运行。那运行过后呢,我们仍然输入这个数,还是我们的2584,我粘一下。
19:07
诶,怎么是八这个数。朋友们。粘贴。运行。同学们看6482,其实他这方是处理的这个数,它处理了,放在个位了,这个数放在十位,这个数放在百位,这个数放在千位,这两个过滤掉。这样的过滤掉,我问同学们一个问题啊,讲到这,我多说一句。如果我们,如果我们要求处理的不是偶数位,而是奇数位,应该怎么改?就这这么只只改一个基数。如果将长整形的每一位上的奇数位你去取出,放在这个题中,高位在低位,低位在高位,应该怎么改?也就是说这个地方改完的功能就应该是啊,就应该是这样子的。就是相当于是三。一。53155。
20:02
啊,就说就是如果我们需要的结果是3155应该怎么改。其实特别简单,只需要把这个地方的等换成不等就可以了。是不是你看我再运行一下这个结果呢,就是我们想要的另外一种结果了,就是说同学们要一定要要去多多理解它的一个原理,你才能才能做到不变应万变,明白这个意思吧,你看我粘贴一下。是不是这个数大家看是不是变成3155 3155就是我们要的,呃,这个结果是不是你看。是不是315 315正确吧,诶,就这么一个意思,当然人家没有让你做这个事情,你也不要去画蛇添足了,改回去啊,偶数。也就是说最后你这个结果呢,就是把这个改了,把这个改了就行了,好吧,其他地方你不要去动它,这里的注释呢,老师是为了讲课加的,你在实际答题的时候不要加这些乱七八糟的东西,你直接给他改完就完了,明白吗?不要添加注释,再说一遍啊,不要添加注释,这个加的东西给它去掉就可以。
21:05
同学们关于这一道改错题其实有点难度啊,因为他这么一个算法还是还是有些小东西在里边的,你看这个是顺序取出,那怎么想想的,然后又逆序处理啊,其实挺挺巧妙的,同学们关于这道题的评价呢,我们就给大家讲解到这里,我把它放在我们的。这一个卷试卷里面。那就应该是在这儿了。改错修改题放这好来放一个,这个叫分析和解答。分析和解答,各位放到这里。好,最后呢,我们把第七套和第八套这题都讲完,我们把它梳理到我们的这一个笔记中去走一下。来看一下吧,好,我们讲的第七套和第八套,第七套呢是这样子的。来梳理一下。放这哈第七套,然后它有一个图片也拿过来吧。
22:05
也拉过来。然后这边是我们的C语言真题第七套的试卷。写到这试卷。好,来一个箭头。这是我们的第七套的试卷,包括他的解答我们都有了,我扔这儿好吧。那在哪里去呢?在这里,诶在哪去了,这个题是在这。就这套我们复制一下。这里面主要是一定要理解这个题是怎么来的,而不是简单的知道一个结果哈,那你将来这个结果他多了去了,他将来提一遍,你要不知道为什么,那你肯定是搞不定的。放在哪里呢?放在这边。插入一个小表格。把它的格式带上哈。
23:00
这样就有相应的图片了。好,这是我们这道题的讲解,那紧接着呢,紧接着我们还有第第八道题的一个梳理也放这。第八道题呢,也是我们的上机体。来放一个图片。这边呢,我们也写下C语言真题第八套试卷。试卷啊试卷。拿一个小箭头。同样我们把第八道题呢,也放到一个表格中,便于同学们今后的复习,放一下第八道题在哪里呢?在这。是不是好,我们从这复制一下。整个分析还有解答呢,都给他说说清楚了,一定要去多看多练习,这样呢咱们才能才能做到心中有数。放好。各位同学。关于。第七套和第八道题的整理,我们就说到这儿,大家好好的去消化一下。
我来说两句