粉丝6.1万获赞34.3万

哇,你做的这道题我感觉好像花了很长时间,有点难吗?呃,的确, 这题的话也不是特别难,不过还是有一定的难度。嗯,他名字叫做矩阵交换行,就是五行五列的矩阵,嗯,将他的 dn 行和 dm 行交换,然后输出交换后的局,结果 好,输入呢,是六行,一共是六行,嗯,前五行的话是,嗯, 用这个矩阵的每一行是矩阵的每一行元素,然后元素元素之间呢,都需要用空格隔开。嗯,第六行的话就是输入整数 n 和 m 这两个整数的话就是你要 交换的第哪两行,哦,就是要交换的这个元素,对,然后呢, n 和 m 他们都是大于等于一小于等于五的,嗯, 不然的话,他这个你说十行和一百行交换,那他只有五行,他这就会报错,他给个范围吗?嗯, 然后输入输出格式就是输出交换后的矩阵,嗯,然后矩阵的每一行元素呢就要占一行元素之间用空格隔开,嗯,比如说输入他这里是,呃输入的,反正就很多。然后他交换之后呢,这个, 嗯,就是他原本第一行是一二二一二,他跑到最后一行去了,也就互换了吧。嗯,然后最后 原本是三零八二四跑到第一行去了,这个好理解。首先呢,我们这里还是用这个 inter 来定义, aa 的话,你定义成只要是五以上就行,嗯,然后不是五就够,可以,嗯,也不是五以下就好,嗯,然后定义 nm, 嗯,然后重复执行,每一次呢都往这个 a 的 di 行的接列去输入,然后 ii 的话是重复到五,然后接的话也是重复到五,因为它必须是满了五行五列才行。嗯,然后 c in m 和 n 重复执行,这里的话我们只用重复执行一次,嗯,然后这里里面的话我们用 s, w, a, p, 这里的话就是把他的这两行交换。啊。 aswap 是不是更换的那个?对,就是交换的意思。嗯, 但是这里的话我们还可以用一个更笨一点的方法。哦,就是我们先把这个, 呃,看他这个交换的他的 n 是否大于 m, 嗯,如果 n 大于 m 的话,我们先出先输出这个, 呃,遇到这里我们就先输出 a 的 n 行 i d, 啊啊,如果 n 的话是小于 m, 那么就先输出 m 行 i d, 嗯,这里的话就笨一点的方法。对,不过我们用 swep 这个函数的话,就交换,就一下就更换过去,交换的话就更简单。嗯,对。然后后面我们再重复之, 把这个 a 打印出来,打印的话我们把这个每一次都是输出他的 di 行的接列,然后输出空格,嗯,最后呢打印一个 ntl, 嗯,就是他外面一个循环,然后呢 里面有一个循环,里面循环结束,那么就输出。你没有,然后在外面循环,然后在里面循环。嗯,你这样重复,嗯,重复一直到最后满足条件,然后跳出,跳出了,然后,呃,瑞特林就结束,结束了,然后就没了。 啊,这个题呢,我感觉到哈,你上次做过类似类似的题,但是呢,你这次我觉得理解的更加深刻一点,对,对不对?上次那个题基本上是一样的。嗯,差不多。呃,虽然说是他这个,呃, 好像完全一样吧,基本上,对,是吧?因为我看到这个他的输入数据我就想起来了,因为他这个他那个输入数据让我印象深刻,他就,哎,你这个是属于通关的题里面的一个,是不是对一百?他这个还是 有很多题他都重复了。啊,这一百个通关题现在完成了多少啊?九十九。哦,那你完就完了吗?啊,好好好,这道题我重新讲的话其实就是复习的差不多。对对对,就是要经常复习,复习才能记忆牢固,对吧? 嗯,不错不错,我觉得你今天理解的更加深刻一点啊。嗯,好。

今天讲一下表格,神奇红数学计算随机数一到十。好,首先我们回到之前的开发工具, 在这里面我们讲到了一个随机函数,这个函数他可以随机一个是零到,嗯, 零到一的一个随机数,那么我们可以发现我们其实在很多时候并不希望是做这么一个小数,形式力度,我们可以看一下, 这里是一个零点一三三六,对吧?我们是一个随机数,零到一的随机数,那么有时候我们想要取一个整数,比如说是一个一到十,该怎么操作好?首先我们可以知道 目前这里画是一个零到一结果,因此我们可以直接在这里乘一个十,这样画就可以直接小数点变成一到九的结果。 我记一下这个一到九,那么所以说我想要完成一个一到十的话,我后面还要再加一个一,这样就可以完成了,一个是一到十的状态。 好,接下来我们可以发现,当我输到的是假设我原来随机数,最早随机数是一个是零点九九, 零点九九,那么我这里乘一个十的话,变成一个九点九九,九点九九,好,这时候我如果再加上一个一,就会变 变成一个十点九九,那么他会大于我们原有的一个十十一到十的范围之间。因此我们可以用到之前的一个数字进行一个向下去整 好,这时候我们依旧输入 m a, m a, t, h, 好,选择点,输入 f、 l, o, r, 选择括号。接下来我们把直线这个复制整台。 好,现在我们随机选取一个零到九,呃,零到一的数字乘以一个十,建华保留他第一位小数,接下来我们再进一进四加一, 这样可以保证一个是十的位置,然后我们可以再向下去整,这样过滤掉我们后面的所有小数,由此造成一个十到一到十的一个垂直范围。接下来我们会输出一下, 好看到没有?这次是一个八,这次是一个一,这次是个九,这次是个三,这次是个一,这次是个五,好,就这样子吧。

别划走,看看吃药还能干点啥?这些工作表名称他能自动提取吗?来吧,展示公司 定义名称,噼里啪啦输入这些内容啊,函数耶, workboy, 如果我们想要及时更新名称,可以添加七呢?等好 index 函数,我们调用刚才定义的函数 录入完成,看看结果感觉不错,向下了,自动填充。接下来就是一步步的进行处理,我们获得的这个数据,埃菲尔进行容错 发音函数,查找 u 括号所在位置 reply 参数,把从第一位到第十五位内容替换成控制。完成了 我们要的工作表名称提取出来了。如果下方新增加工作表,你们猜猜会自动更新到这里吗?

通过刚刚的学习呢,我们就已经知道了,基于回调函数的一步变程当中,它存在一个叫做回调低于的问题, 我们应该怎样去解决这个问题呢?或者说我们应该怎样去改造回掉地域形式的代码,才能够让这个代码看起来比较好维护呢? 看下面这样的代码,在这段代码当中,他所做的事情呢,依然是依次去读取三个文件,虽然说读取文件本身的这个操作呢,他是属于一波 l 操作,但是呢,我们在编写代码的过程当中呀,却把这个代码写成了同步形式, 如果说我们真的把这个代码写成了这种形式,那么这个代码呢,他就是一个比较好维护的代码,这才是我们最终要编写的代码, 但是呢,我们不可能一下子就把这个代码改造成这种形式,我们需要通过一步一步的学习,最终呢我们才能够做到这个事情。好,接下来呢,我们就看下一种在扎巴 scrap 当中实现一步变成的这个解决方案,这种 一步编程的解决方案呢,它是基于 promise 的。什么是 promise 呢? promise 啊,是扎拉斯卡特当中一步编程的一种解决方案,他可以去解决基于毁掉函数的一步编程当中的那个毁掉地域问题。 关于这个 promise 啊,我们可以这样去理解,我们可以把 promise 呢想象成为一个容器,它是一个用于包裹翼步 api 的容器, 当容器当中的一部 api 执行完成之后呢, pro mis 呀,他允许我们在容器的外面获取一部 a p i 的执行结果,从而呢去避免回掉函数欠套的问题,或者说避免毁掉函数低于的问题。 pro mis 本身呢,我们可以把它翻译成承诺表示,他承诺帮助我们去做一些事情, 既然说他承诺了,他就要去做,做呢,就会有一个过程,就会有一个结果,结果要么是成功,要么是失败。所以啊,在 promise 当中呢,他有三种状态,分别是等待状态、成功状态和失败状态。默认 情况下,普奥密斯的这个状态呢,是等待状态,当一步操作成功之后呢,我们可以将这个等待状态变成成功状态。当这个一步操作执行失败以后呢,我们可以把这个等待状态变成失败状态。 在 promise 当中呀,这个状态一旦变成成功或者变成失败以后呢,这个状态啊,就不能够再次进行更改了。比如说他不能从成功变回等待,他不能从失败变回等待,他不能从成功变成失败,也不能从失败变成成功,他只能从等待变成成功,或者说他只能从等待变成失败。那么这是 promise 当中的三种状态。 接下来呢,我们要看一下 pro mis 的基础语法,就是要看一下他要怎么去使用 pro mis 本身呀,他是一个构造函数,我们可以通过 new 关键字去执行这个构造函数。在执行这个构造函数的时候呢,我们可以给他传递一个函数进去,这个函数就是我们刚刚所说的那个容器,但是在 pro mis 当中呢,它叫做执行器,当我们通过虐关键字 去执行 promiss 构造函数的时候,这里面的这个函数呢会被立即执行,那么在这个函数内部呢,我们要去包括一部 api, 在我们传递给他的这个函数当中呢,他又给我们提供了两个方法,第一个方法叫做 reserve, 第二个方法呢叫做 reject, reserve 这个方法的作用呢就是将等待状态变成成功状态。 reject 的这个方法的作用呢,就是将这个等待状态变成失败状态。 也就是说呀,当这个一步操作成功之后呢,我们要去调用 resef 这样的一个方法,把这个状态变成成功。当一步操作执行失败之后呢,我们要去调用 reject, 把这个状态啊变成失败。 无论我们把这个状态变成成功还是变成失败,那么这两个方法呢,他都会有一个参数,通过这个参数呢,让我们把成功的结果以及失败的原因传递到 promise 外面去。好当我们去扭这个 promise 之后呢,会得到一个 promise 对象,那么我们可以在这个执行期的外面呢,通过这个 promise 对象来拿到这个一波 api 执行的结果。 如何去拿呢?哎,非常简单哈,在 promise 这个对象下面呢,有一个方法叫做邓,有一个方法叫做 catch, 邓方法和 catch 方法呢,他都接收毁掉函数 作为参数,那么这个邓方法里面的这个回到函数什么时候执行呢?就是当这个状态变成成功态的时候,这个方法呢就可以去执行了,而这个方法有一个参数,这个参数呢就是当我们把这个状态变成成功状态的时候,去传递的那个参数,也就是一步操作的那个结果。太尺里面的这个回调函数呢,他也有个参数,那就是失败原因。 那么接下来呢,我们就切换到编辑器当中啊,来验证一下这个代码。在当前这个文件当中呢,我们来新建一个文件,这个文件的名字啊,就叫做二点二 pro miss 点 js。 那么我们说 pro miss 啊,它是一个异步编程的解决方案,我们可以把它想象成一个容器啊,在这个容器当中去执行 e 部代码。 那么怎样去创建这个容器呢?我们要通过 new 关键字去执行 promiss 这样一个构造函数,在这个构造函数当中呢, 我们可以去传第一个毁掉函数,这个毁掉函数啊,在 pro miss 当中叫做直行器,那么这个直行器呢,有两个参数哈,第一个参数呢叫做 reserve, 第二个参数啊叫做 reject。 我们说过,在 pro miss 当中呢,有三种状态,默认的状态呢是等待, 当我们去调用 reseve 这个方法的时候呀,就表示把这个状态从等待变成成功。当我们去调用 reject 的这样的一个方法的时候呢,就是把这个状态从等待变成失败。好, 接下来呢,我们要在这个容器当中啊,去执行一步操作,比如说我们仍然去读取文件。好,那么在这我们通过 f s 点二 rate five 这样的一个方法去读取文件内容。那么接下来呢,我们要先把 f s 呢给它引入下来,所以我们在上面啊,通过 cons 的关键字去声明一个常亮 f s, 它的值呢就是 require f s。 在 rate file 这个方法当中呢,我们去传入我们要读取的那个文件的路径就是当前这个文件夹下面的 x 点 txt, 第二个参数呢是编码,那么就是 utf 杠八,好,那么第三个参数依然是回答函数,那么在这我们再写上一个方式, 那么在这有俩参数,一个是 l, 一个是 result。 好,那么在这个地方呢,我们要去判断一下啊,如果说 l 存在,那么 l 存在说明什么呀?是不是说明这个义不操作执行失败了呀?如果说义不操作执行失败了,我们要把这个等待态变成失败态。好, 那么这个时候呢,我们要去调用 reject 这样的一个方法,然后呢,我们通过参数的方式把这个失败原因呢传递到 promise 到外面去, 如果说这个代码走到了 l 子,就说明这个一步操作执行成功了。如果说一步操作执行成功了,我们要去调用瑞色服这样的一个方法,把等待状态变成成功状态,并且通过参数的方式,把这个一步操作执行成功的结果传递到 pro miss 这个对象的外面去,那实际上就是这个瑞造特。好,那么我们把瑞造特放着在这,那么我们怎么样 在 promise 的外面去拿到这个一步操作执行的结果呢?好,那么实际上他有一个返回值啊,就是那个 promise 对象,所以呢,我们在这啊,通过 cos 的关键字去声明一个常亮,这个常亮的名字呢,我们就把它叫做 promise。 在 promise 这个对象下面呢,有两个方法,一个是邓方法,一个是 that 方法,那么这两个方法呢,是可以烈士调用的,如果说你在这啊,就要用了 reserve, 把这个状态从等待态变成成功态,那么他会去执行邓方法里面的这个回答案数。好,那么在这个地方我们去传第一个回答案数, 这个回调函数呢,有一个参数,那么这个参数呢?实际上就是在这个地方你传过来的这个参数。好,那么在这个地方我们通过 conso 的了方法去输出 resat, 如果说这个一步操作执行失败了,那么我们调用 ray jack 把等待态变成了失败态, 那么如果说状态变成失败的时候,那么会执行开始里面的这个回答函数,那么在这个回答函数当中有一个参数,那么就是你通过调用为 这样一个方法传递出来的这个失败原因。好,那么我们仍然通过 ctrl 点 low 方法去把这个 l 给他打印出来,保存这个文件。接下来呢,我们找到这个命令行工具, 在命令行工具当中呢,我们通过 no 的命量去执行二杠 promise 点,这是这样的一个文件,接下来我们敲击回车,那么在这个地方是不是输出了 x 呀?那么这个 x 呢?就是这个文件当中的内容,那么也就是说现在呢,我们已经成功的通过 promise 这样的一个方式去执行了一步操作了。好,那么这呢是 promise 的一个基础用法。