软件构造实验二

Posted Y-Y-R

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件构造实验二相关的知识,希望对你有一定的参考价值。

本次实验的任务是实现一个图的接口Graph<L>,并使用该接口实现实验一中的FriendshipGraph及“写诗”

采用测试优先编程,故要先写测试策略。对Graph<String>的测试策略为:

1.add 加入不在图中的点、以在图中的点

2.set 边的起点是否在图中、终点是否在图中、权值是否为正数

3.remove 删除在图中的顶点及不在图中的顶点

4.vertices 图中有顶点/无顶点

5.sources 有邻接到该顶点的顶点/无邻接到该顶点的顶点

6.targets 该顶点邻接到其他顶点/不邻接到任何顶点

实现Graph<String>

1.实现ConcreteEdgesGraph

ConcreteEdgesGraph记录图的所有顶点和所有边。其中顶点为L(这里是String)型,边为Edge型。

Edge类定义如下:

toSring方法:

 并设置相应的get方法。Edge是不可变的,故不提供set方法,且所有属性均为final

ConcreteEdgesGraph的实现:

 add方法(添加顶点):

 set方法(设置边的权值/添加边/删除边) 在更改边的权值时,由于Edge是不可变的。所以要删除原有的边并新建一条边

remove方法(删除顶点及关联的边):

 vertices,sources和targets方法,其中vertices方法使用了防御式拷贝

toString方法:

 ConcreteVerticesGraph为图的邻接表结构,Vertices类为顶点及其边表

Vertices类:

 toString方法

 并提供相应的get方法。同时由于Vertices是可变的,所以提供一定的set方法

ConcreteVerticesGraph类:

 add方法

 set方法

 remove方法

 vertices方法

 sources和targets方法

 toString方法

 泛型化:将String改为类型参数L

“写诗”:GraphPoet类用于写诗,它包含一个Graph<String>类的属性graph来记录语料库中某个单词出现在另一个单词之后的次数。

在构造时将graph也一同初始化,每读入语料库中的一个单词,就尝试将其作为顶点加入图中,并将前一个单词对应的顶点到该顶点的边的权值加一。

 “写诗”过程:将给定的句子写在字符串数组strings中,对每个单词strings[i],找在graph中存在strings[i]->s->strings[i+1]路径的“中间词”s,如果存在多个,则取weight(strings[i]->s)+weight(s->strings[i+1])

最大的单词s作为中间词插入strings[i]和strings[i+1]之间

 用Graph<L>实现FriendshipGraph:

利用委派,将Graph<Person>作为FriendshipGraph的属性。

 计算距离时采用实验一的方法。添加边时,默认每条边的权均为1.

对于Person类,则只需保留三个属性

 其意义同实验一。并提供必要的get和set方法。

 

实验二相对于实验一,提出了关于安全性的要求。实验的过程中要时刻注意数据是否可变、是否出现表示泄露、检查表示不变性等问题。对于不可变的数据类型,则不能提供set方法,将属性设为private且引用不可变(final)。对于表示泄露的问题,可以考虑使用防御式拷贝。在编写程序的时候要注意写AF,RI和Safe from rep exposure并撰写checkRep方法。限于篇幅这里暂不赘述

软件构造实验三-递归下降分析分析法

【实验目的】 

(1)掌握自上而下语法分析的要求与特点。 

(2)掌握递归下降语法分析的基本原理和方法。 

(3)掌握相应数据结构的设计方法。  

【实验内容】 

用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。

【实验要求】 

对下列文法,用递归下降分析法对任意输入的符号串进行分析:

E->TG    G->+TG|-TG   G->ε

T->FS    S->*FS|/FS    S->ε

F->(E)     F->i

代码精髓:

根据上述分析法进行建立

void E();

技术图片
1 void E()
2 {
3     cout << "S->TG		";
4     Fen();
5     Sheng();
6     T();
7     G();
8     
9 }
void E()

void T();

技术图片
1 void T()
2 {
3     cout << "T->FS		";
4     Fen();
5     Sheng();
6     F();
7     S();
8     Leaf = 0;
9 }
Void T()

void G();

技术图片
 1 void G()
 2 {
 3     if (str[lookahead] == +)
 4     {
 5         cout << "G->+TG	";
 6         match(+);
 7         T();
 8         G();
 9         Leaf = 1;
10     }
11     else if (str[lookahead] == -)
12     {
13         cout << "G->-TG	";
14         match(-);
15         T();
16         G();
17         Leaf = 1;
18     }
19     cout << "G->ε		";
20     Fen();
21     Sheng();
22     Leaf = 1;
23 
24 }
void G()

void F();

技术图片
 1 void F()
 2 {
 3 
 4     if (str[lookahead] == i)
 5     {
 6         cout << "F->i	";
 7         match(i);
 8         Leaf = 1;
 9     }
10 
11     else if (str[lookahead] == ()
12     {
13         cout << "F->(E)	";
14         match(();
15         E();
16         if (str[lookahead] == ))
17             match());
18         else Error();
19         Leaf = 0;
20     }
21     else
22     {
23         Leaf = 0;
24         Error();
25         
26     }
27 
28 }
void F()

void S();

 

技术图片void S()

 运行结果:

技术图片

 

技术图片

 

以上是关于软件构造实验二的主要内容,如果未能解决你的问题,请参考以下文章

软件构造-实验1 根据状态转换图手工构造词法扫描器

软件构造——实验五 算符优先分析法

软件构造实验三-递归下降分析分析法

软件构造Lab3基本流程指导及重难点分析

实验报告二

实验二及第四周总结