程序切片问题与解答

程序切片问题与解答

本题涉及程序切片。
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进行了修改:

  1. 在第2行进行输入操作:input(y); 这表示我们对变量y进行了初始赋值。

  2. 在第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进行了修改:

  1. 在第3行进行输入操作:input(z); 这表示我们对变量z进行了初始赋值。

  2. 在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,我们考虑在执行路径下生成切片。

在给定输入和执行路径下,代码片段执行如下:

  1. 输入操作:input(x); 将输入值1赋给变量x。

  2. 输入操作:input(y); 将输入值7赋给变量y。

  3. 输入操作:input(z); 将输入值2赋给变量z。

  4. 条件语句if (z > 0):由于z的初始值为2,满足条件,执行if语句块。

  5. 在if语句块中,z = 1; 将z的值修改为1。

  6. z = 2 * z; 将z的值修改为2。

  7. 进入while循环,由于x的初始值为1,满足条件,进入循环。

  8. 在while循环中,根据z的值的正负进行条件判断。

  9. 在if语句块中,z = z + 1; 将z的值增加1。

  10. y = y + x; 将y的值增加x的值,即7 + 1 = 8。

  11. 循环结束,执行下一次循环迭代。

  12. 最后,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;
}

请注意,动态后向切片是基于给定的输入和执行路径生成的,如果输入和执行路径不同,则切片可能会有所变化。

猜你喜欢

转载自blog.csdn.net/kirsten111111/article/details/131028303
今日推荐