程序切片问题与解答
本题涉及程序切片。
a) 定义程序 s 是程序 p 相对于变量 y 的静态结束后向切片意味着什么。 [10%]
程序 p 的一个(静态的,向后的)程序切片 s 是根据切片标准 (V , n) 构建,其中 V 是一组变量名,n 是程序点。
当要执行的下一个语句在 n 时,p 中的语句不能影响变量在V 的值可能是从 p 中移除以形成 s。所以简化是通过删除代码。
b) 考虑以下代码片段,其中 input(x)、input(y) 和 input(z) 从接口或文件输入值,并将它们分别分配给 x、y 和 z。 包含行号以帮助您解释您的答案。
1 . i n p ut ( x ) ;
2 . i n p ut ( y ) ;
3 . i n p ut ( z ) ;
4 . i f ( x <0){
5 . x:=−x ;
6 . z:=−z ; }
7 . w h i l e ( x >0) {
8 . y:= y∗x ;
9 . z:= z+x ;
1 0. x:=x −1;}
1 1. i f ( y <0){
1 2. y:=−y ;}
为这段代码制作程序依赖图,解释你的答案。 注意,不需要包含自环边
c) 再次考虑上面的代码片段。 生成该代码片段关于变量 y 的最小静态后端切片。 确保你的回答是正确的:a) 如果你删除了一个陈述,那么解释为什么你可以删除它; b) 如果您保留声明,请解释原因。 如果您不根据 PDG 证明您的答案是正确的,那么分数将会降低。 [30%]
为了生成关于变量y的最小静态后端切片,我们需要找出在使用变量y之前对其进行的所有修改。
在给定的代码片段中,有两个地方对变量y进行了修改:
-
在第2行进行输入操作:
input(y);
这表示我们对变量y进行了初始赋值。 -
在第8行的循环中:
y = y * x;
这表示我们对变量y进行了乘法操作。
最小静态后端切片代码如下:
1 . i n p ut ( x ) ;
2 . i n p ut ( y ) ;
4 . i f ( x <0){
5 . x:=−x ;
7 . w h i l e ( x >0) {
8 . y:= y∗x ;
1 0. x:=x −1;}
1 1. i f ( y <0){
1 2. y:=−y ;}
解释:
- 我们保留了第1行的
input(x);
,因为变量y在while (x > 0)条件下被使用了,并且被修改了。 - 我们保留了第2行的
input(y);
,因为变量y在后续的代码中被使用了,并且被修改了。 - -我们删除了第3行的
input(z);
,因为在给定的代码片段中,变量z在后续的代码中没有使用到。
所以关于 PDG 部分,可以删除节点 3、6、9。 其他部分仍然保持原始格式。
d) 解释条件后向切片的含义。 在 y 的初始值至少为 2 的条件下,通过给出上面给出的关于变量 y 的代码片段的最小条件结束切片来说明你的答案。
[20%]
条件后向切片表示在给定条件下,仅包括与条件语句相关的代码以及对条件变量的修改。
因为 y 的初始值为 2 并且 y = y*x 仅当 x>0 时,所以 if (y < 0) 将被阻塞,因为它是无关紧要的,不会影响程序的执行。
最小条件结束切片代码如下:
1 . i n p ut ( x ) ;
2 . i n p ut ( y ) ;
3 . i n p ut ( z ) ;
4 . i f ( x <0){
5 . x:=−x ;
6 . z:=−z ; }
7 . w h i l e ( x >0) {
8 . y:= y∗x ;
9 . z:= z+x ;
1 0. x:=x −1;}
1 1.
1 2.
#####################################################
本题涉及程序切片。
a) 定义程序 s 是程序 p 相对于变量 y 的静态结束后向切片意味着什么。 [10%]
程序 p 的一个(静态的,向后的)程序切片 s 是根据切片标准 (V , n) 构建,其中 V 是一组变量名,n 是程序点。
当要执行的下一个语句在 n 时,p 中的语句不能影响变量在V 的值可能是从 p 中移除以形成 s。所以简化是通过删除代码。
b) 考虑以下代码片段,其中 input(x)、input(y) 和 input(z) 从接口或文件输入值,并将它们分别分配给 x、y 和 z。 包含行号以帮助您解释您的答案。
1 . i n p ut ( x ) ;
2 . i n p ut ( y ) ;
3 . i n p ut ( z ) ;
4 . i f ( z >0){
5 . z=1;}
e l s e{
6 . z=−1;}
7 . z=2∗z ;
8 . w h i l e ( x >0) {
9 . i f ( z >0){
1 0. z=z+1;}
e l s e{
1 1. z=z−1}
1 2. y=y+x ;
1 3. x=x −1;}
c) 再次考虑上面的代码片段。 生成此代码片段关于变量 z 的最小静态后端切片。 您应该证明您的答案是正确的:对于删除的每个陈述,您应该解释为什么可以删除它
对于保留的每条陈述,您应该解释为什么要保留它。 如果您不根据 PDG 证明您的答案是正确的,那么分数将会降低。 [30%]
在给定的代码片段中,有6个地方对变量z进行了修改:
-
在第3行进行输入操作:
input(z);
这表示我们对变量z进行了初始赋值。 -
在5,6,7,10,11行 z 的那些部分有新的值。
最小静态后端切片代码如下:
1 . i n p ut ( x ) ;
2 .
3 . i n p ut ( z ) ;
4 . i f ( z >0){
5 . z=1;}
e l s e{
6 . z=−1;}
7 . z=2∗z ;
8 . w h i l e ( x >0) {
9 . i f ( z >0){
1 0. z=z+1;}
e l s e{
1 1. z=z−1}
1 2.
1 3. x=x −1;}
解释:
- 我们保留了第1行的
input(x);
,因为变量z在while (x > 0)条件下被使用了,并且被修改了。 - 我们删除了第2行的
input(y);
,因为在给定的代码片段中,变量y在后续的代码中没有使用到。 - -我们保留了第3行的
input(z);
,因为变量z在后续的代码中被使用了,并且被修改了。
所以关于 PDG 部分,可以删除节点 2,12。 其他部分仍然保持原始格式。
d) 解释动态后向切片的含义。 通过给出上面给出的代码片段关于变量 z 的最小动态结束切片来说明你的答案,假设输入有 1 分配给 x,7 分配给 y,2 分配给 z。 [20%]
动态后向切片表示在给定的输入和执行路径下,仅包括与输出变量相关的代码以及对输出变量的修改。
根据上面给出的代码片段,我们可以生成关于变量z的最小动态结束切片。根据给定的输入值,假设x被分配为1,y被分配为7,z被分配为2,我们考虑在执行路径下生成切片。
在给定输入和执行路径下,代码片段执行如下:
-
输入操作:
input(x);
将输入值1赋给变量x。 -
输入操作:
input(y);
将输入值7赋给变量y。 -
输入操作:
input(z);
将输入值2赋给变量z。 -
条件语句
if (z > 0)
:由于z的初始值为2,满足条件,执行if语句块。 -
在if语句块中,
z = 1;
将z的值修改为1。 -
z = 2 * z;
将z的值修改为2。 -
进入while循环,由于x的初始值为1,满足条件,进入循环。
-
在while循环中,根据z的值的正负进行条件判断。
-
在if语句块中,
z = z + 1;
将z的值增加1。 -
y = y + x;
将y的值增加x的值,即7 + 1 = 8。 -
循环结束,执行下一次循环迭代。
-
最后,
x = x - 1;
将x的值减少1。
基于上述执行路径和输入值,生成关于变量z的最小动态结束切片如下:
input(x);
input(y);
input(z);
if (z > 0) {
z = 1;
}
z = 2 * z;
while (x > 0) {
if (z > 0) {
z = z + 1;
} else {
z = z - 1;
}
y = y + x;
x = x - 1;
}
请注意,动态后向切片是基于给定的输入和执行路径生成的,如果输入和执行路径不同,则切片可能会有所变化。