摘要:
本文是有关C语言程序理解技术的探讨,先引入了程序状态空间表示法这个概念,并加以阐述。本文通过模拟程序执行算法,得到了数据流与控制流图,根据数据流与控制流图找到程序的三种状态,即初态,中间状态,终态。
关键词:
程序状态空间,初态,中间状态,终态。
1、引言:
C语言的语句分为说明语句和执行语句两类,说明语句指出了程序要解决的具体问题,执行语句指出了解决问题的具体方法。所以,大多数的C语言程序都是以说明语句开始的。说明语句是由关键字与变量名组成,执行语句主要是改变变量的内容,所以我们可以根据变量的内容在程序中的变化情况来理解一个程序。如何掌握变量在程序中的变化情况,以及如何根据变量的情况理解程序,这就是本文要探讨的有关程序状态空间表示法的问题。
2、程序状态空间表示法:
所谓程序状态空间是指:当一个题目确定后,编程者就能知道,要处理对象的初始状态和要达到目标的终止状态,以及针对具体对象所能采用的一组操作。目的是,运用这组操作,作用在对象上,使对象的状态(值)发生变化,即产生一组后续状态。继续使用这组操作,再作用在各个后续状态上,又产生了各种后续状态,直到变化后的状态达到了目标的终止状态。则初始状态、所有后继状态和终止状态汇集在一起称为程序状态空间。用程序状态空间法求解,就是由初态出发,寻找一组操作,依次作用在初始状态及其后续状态上,达到终止状态。一个具体的题目,就确定了它的状态空间,而该问题的一个具体的程序,就是由初态到终态的一个具体路径。同一个题目不同人编写的程序只是路径不同而已。但它们的初始状态和终止状态是相同的。因此,C程序的执行是程序状态空间中由初始状态到达终止状态的一条指定的路径。本论文主要探讨如何在C语言程序中找到对象的三种状态。
C语言程序是告诉计算机”做什么”和”怎么做”。C程序的说明语句是由人工将”做什么”转换为状态空间中的初始状态、终止状态和执行过程中用到的中间状态。状态就是说明语句中的变量。C程序的执行语句是”怎么做”的具体描述,它是依次对由初始状态开始,按C语句进行操作,直到终止状态的路径的描述。
3、数据流与控制流图:
(1)什么是数据流与控制流图?
数据流与控制流图是一个二维的图表:该图的列为控制流,即在程序执行过程中控制点的位置;该图的行为数据流,为当前时刻控制点上各个数据项的值。所以在该图由任意控制点往右看到的数据项的值,就是此点上的程序执行映像(即一个快照)。
(2)控制流与数据流图的数据结构
#define n 20
typedef int datatype;
typedef struct node
{ datatype value;
struct node *next;
}controlflow;
typeder struct
{ char var[10];
controlflow *link;
}dataflow;
dataflow ga[n];
(3)数据流图与控制流图生成算法
l算法:模拟程序执行生成控制流与数据流图。
*注:原程序保存在program.txt文件中。
1)FILE *fp;
fp=fopen(“program.txt”,r);
2)文件中读取说明语句
3)将变量填入数据流数组的数据域中,若有初值将其填入控制流的数据域中;
4)从文件中读取其他语句,进行比较:
①如果指针未到文件末尾执行②~⑤,否则执行5)
②读取相应的关键词;
③执行相应语句的模拟程序;
④执行填写控制流的操作;
⑤继续读取文件,返回①;
5)结束。
模拟执行过程如:
读取关键词为”=”,执行赋值操作,即将=右边的表达式进行计算后填入控制流的数据域中,接着读取文件;
l以五个数由大到小排序的程序为例。
程序:
main()
{
1int a[5]={5,6,7,8,9}, i,j,t;
2for(i=0;i<4;i++)
3for(j=i+1;j<5;j++)
if(a[i]
{
t= a[i];a[i]=a[j];a[j]=t;
}
4printf("排序的结果是:\n ");
5for(i=0;i<=4;i++)
printf("%2d ",a[i]);
}
控制流与数据流图:
数据流控制流
a[0]
a[1]
a[2]
a[3]
a[4]
i
j
t
1
5
6
7
8
9
2
6
5
7
8
9
0
1
5
3
7
5
6
8
9
0
2
6
3
8
5
6
7
9
0
3
7
3
9
5
6
7
8
0
4
8
2
9
6
5
7
8
1
2
5
3
9
7
5
6
8
1
3
6
3
9
8
5
6
7
1
4
7
2
9
8
6
5
7
2
3
5
3
9
8
7
5
6
2
4
6
2
9
8
7
6
5
3
4
5
程序模拟执行能得到程序的控制流和数据流图。由图中能得到程序的初始状态、中间状态和终止状态集。确定这些状态的一般规则是:
①当变量一旦被定值后,只引用而不再定值时,称此变量为初始状态;
②当变量一旦被定值后,只被引用、定值或再定值时,称此变量为中间状态;
③当变量一旦被定值后,或再定值且最后在输出语句中输出时,称此变量为终止状态。
在有些程序中,初始状态与终止状态为同一状态。
l状态识别算法:根据控制流与数据流图确定要处理对象的三种状态。
1)int i;
controlflow *p;
2)for(i=0;i
①p=ga[i].link;
②依次读取每个变量控制流的数据域;
③将读取到的数据进行比较;
④依据状态规则确定每个变量的状态(前面已介绍此规则);
3)结束。
根据算法得到本例的三种状态为:
初态:a[0],a[1],a[2],a[3],a[4]
中间态:i,j,t
终态:a[0],a[1],a[2],a[3],a[4]
结论:
任何一个C语言程序都可以用状态空间来表示,可以根据要处理对象的三种状态,判断程序的功能,所以状态空间法更利于理解程序。