书接上回,还剩下三元式,四元式,逆波兰式以及代码优化没有写。
16.逆波兰式,三元式,四元式的书写
知识点:转移操作有四个:BL转向某标号(用的少)BT条件为真转 BF条件为假转 BR无条件转
16.1逆波兰式的书写
做题思路:
就是运算符在操作数的后面,比如 a-b的逆波兰式就是ab-,长一点的就是 (7 - 4) * 2,对应的逆波兰式为:7 4 - 2 * 。要注意的是,计算逆波兰式要根据优先级来计算,像是先小括号,在乘除在加减,要注意顺序。
要注意的是逆波兰表示时前面的序号与逆波兰式长度有关,一个字母或者一个符号表示一个长度。
条件语句的逆波兰式表示
注意:每一次进行判断后,后面紧跟的一句必定是BF跳转,跳转语句后接着是判断为true的执行语句。你可以这样想,你写的这个语句就相当于是这个程序的执行顺序,它每一句的执行都是符合逻辑的,你如果条件判断正确是不会执行条件判断错误时的语句的,同理相反也是一样的。所以在你写完你的句子时,你可以附一个初值自己执行一下自己写的,看会不会走到不该执行的语句上,如果没有证明你的句子写对了。按照这样的逻辑写,写这些语句就不会生搬硬套了,写的也就更快更准确了。不止条件语句的书写,像程序段,循环语句的逆波兰式表示,甚至是三元式四元式的书写也是这样的,只要按着执行的逻辑去书写,就会下笔如有神了。当然基本的书写格式要掌握!
程序段的逆波兰式表示
循环语句的逆波兰式表示
这块要注意的是,因为是循环语句,所以只有条件判断为假时才跳出循环,并且每次执行过后要记得判断条件要自增(i++),然后无条件BR跳转到判断语句那块,同样的,判断语句下面紧跟的就是BF跳转,这是一样的,剩下的和上面就是一样的了。
16.2四元式的书写
知识点:四元式的表示为(运算符,分量1,分量2,运算结果)
赋值的话:a:=4(:=,4,_ ,a)
-b(-,b,_,T1)
转移操作的写法略有不同:无条件转到A(BR,A,_,_)B为true时转到 A (BT,A,B,_)B为false时转到A(BF,A,B,_)A为跳转的序号(不用加括号),这块写时的序号是递增的,与逆波兰式不同(逆波兰式是根据长度走的)
注意:像赋值语句的话,有一种情况是 i=i+1,有两种写法(+,i,1,i)这个就是把i+1的结果直接赋值给i,还有一种是分两步写(+,i,1,T1)(=,T1,_,i)我们老师上课推荐的是这种写法。
举两个例子:
条件语句的四元式表示
程序段的四元式表示
循环语句的四元式表示
我觉得可转可不转吧,要是能直接写出四元式,就不用转了。
16.3三元式的书写
知识点:
知识点:三元式的表示为(运算符,分量1,分量2)
赋值的话:a:=4(:=,4,a )
-b(-,b,_)
与四元式的区别就是没有了运算结果的表示,所以在调用该条的运算结果时是调用该语句的序号。
转移操作的写法略有不同:无条件转到A(BR,A,_)B为true时转到 A (BT,A,B)B为false时转到A(BF,A,B)A为跳转的序号(不用加括号),这块写时的序号是递增的,与逆波兰式不同与四元式相同(逆波兰式是根据长度走的)
举个例子:
条件语句的三元式表示
程序段的三元式表示
循环语句的三元式表示
17.代码优化
有五个常用的优化技术:
1.合并常量运算
就是将能算出来的先算出来当为已知值。
2.删除无用赋值
就是没有使用的句子不用写。
3.削减运算强度
就是把乘法运算换算成加减法运算
4.删除多余运算
就是公共子表达式计算过一次,后面需要写时直接用,不用再写一遍。
5.外提不变表达式
就是循环中每次循环保持不变的提到循环外,减少循环中计算的次数。
书上的例题8.7就很好,里面包含了许多种优化。
做题思路:
其实就是看它给的循环语句,找有没有能优化的点,然后我们就会发现它是一个双重循环,外面循环执行一次,里面执行i+1次,所以就会发现,其实里面循环执行的判断条件是不变的,因为i是外层循环确定的,所以里层循环的判断条件就可以执行外提不变表达式,将i+1放到外层循环中,然后再看内层循环会发现第一句x=i+a没有用,所以删除无用赋值将这句删掉。接下来一句会发现i*a是固定的所以也执行外提不变表达式,提到外层循环中,里面直接调用就行,然后看第三句会发现一部分与第二句一样,所以我们不用在写一遍,直接调用第二句的结果删除多余运算了。像里层循环执行完一遍后外层循环不是要+1嘛,也可以调用之前定义的i+1语句,删除了多余运算。剩下的步骤语句就是正常了。
下面是我写的答案,不知道正不正确,供参考: