问答题阅读下列说明和图,回答问题1至问题3。【说明】某大型旅店为了便于管理,欲开发一个客房管理系统。希望实现客房预订、入住登记、账务结算、退房,以及将服务项目记入客人账单。旅客包括散客和团体,散客预订或入住时需要提供姓名、性别、身份证和联系电话,团体则提供团体名称、负责人的姓名、性别、身份证和联系电话,以及团体人数。对于散客,还要提供换房。旅店还提供了很多服务项目,比如早餐。对每一个入住客人,服务列表记录了住宿期间的各项服务,包括服务类型、日期、数量等。当然,客人也可以不要任何服务。旅店的客房有一个唯一的房间号,分为不同的类别,不同的房间床位数和价格不同。为了有效的管理,需要记录每天的客房状态。客房的状态有:空闲、占用、已预订和维修。·客人入住后,客房处于占用状态。·客人退房后,客房处于空闲状态。·客人预订后,客房处于已预订状态。·预订客人入住后,客房处于占用状态。·预订客人取消预订后客房处于空闲状态。·需要维修时客房处于维修状态。·维修完成后客房处于空闲状态。该系统采用面向对象方法开发,系统中的类及类之间的关系用UML类图表示,如图9-12所示是该系统的类图的一部分,图9-13描述了客房状态的转变情况。
问答题下面是一个Applet程序,其功能是在绘图区域中通过鼠标的移动来绘制直线,并且有清除绘图区域按钮,用来清除已经绘制的图像。程序运行结果如图5所示。importjava.awt.*;importjava.applet.*;/*<appletcode=ex6_7.classwidth=800height=400></applet>*/publicclassex6_7extendsApplet{privateButtonbtn;privatebooleanbDraw,bClear;privateintupX,upY,downX,downY;publicvoidint(){setLayout(null);bClear=false;bDraw=false;btn=newButton("clear");btn.reshape(250,150,70,30);add(btn);}publicvoidpaint(Graphicsg){if(bClear){g.clearRect(0,0,getSize().width,getSize().height);{{U}}(1){{/U}};}if(bDraw){g.drawLine({{U}}(2){{/U}});bDraw=false;}}publicvoidupdate(Graphicsg){{{U}}(3){{/U}};}publicbooleanmouseDown(Eventevent,intx,inty){downX=x;downY=y;returntrue;}publicbooleanmouseup(Eventevent,intX,inty){upX=x;upY=y;{{U}}(4){{/U}};repaint();returntrue;}publicbooleanaction(Eventevent,Objectobject){if({{U}}(5){{/U}}){bClear=true;repaint();}returntrue;}}ex6_7.html<HTML><HEAD><TITLE>ex6_7</TITLE></HEAD><BODY><appletcode="ex6_7.class"width=800height=400></applet></BODY></HTML>
问答题【说明】下面是一个Applet程序,其功能是通过一个按钮控制一个窗口的创建,显示与隐藏,并且以按钮文字作为提示,可以随着窗口的状态改变,即如果窗口出现,则按钮文字为"HidemyFrm",提示用户点击按钮,则隐藏窗口,反之亦然。请将横线处语句补充完整。程序运行结果如图5所示:importjava.awt.*;importjava.applet.*;<appletcode="ex8_7.class"width=800height=400></applet>*/publicclassex8_7extendsApplet{privateFramefrm;privateButtonshowBtn;publicvoidinit(){showBtn=newButton("ShowFrame");{{U}}(1){{/U}};}publicbooleanaction(Evente,Objecto){if(e.target==showBtn){if({{U}}(2){{/U}}){{{U}}(3){{/U}};frm.dispose(){{U}}(4){{/U}}showBtn,setLabel("ShowmyFrm");}else{frm=newFrame("myFrm");frm.resize(200,150);frm.setBackground(Color.gray);{{U}}(5){{/U}};showBtn,setLabel("HidemyFrm");}}returntrue;}}ex8_7,html<HTML><HEAD><TITLE>ex8_7</TITLE></HEAD><BODY><appletcode="ex8_7,class"width=800height=400></applet></BODY></HTML>
问答题[说明]
快速排序是一种典型的分治算法。采用快速排序对数组A[p..r]排序的3个步骤如下。
(1)分解:选择一个枢轴(Pivot)元素划分数组。将数组A[p..r]划分为两个子数组(可能为空)A[p..q-1]和A[q+1..r],使得A[q]大于等于A[p..q-1]中的每个元素,小于A[q+1..r]中的每个元素。q的值在划分过程中计算。
(2)递归求解:通过递归的调用快速排序,对子数组A[p..q-1]和A[q+1..r]分别排序。
(3)合并:快速排序在原地排序,故不需合并操作。
问答题【说明】传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)和Closing(正在关闭)五种状态。触发状态的转换事件有click、complete和timeout三种。事件与其相应的状态转换如下图所示。下面的Java代码1与Java代码2分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。【Java代码1】publicclassDoor{publicstaticfinalintCLOSED=1;publicstaticfinalintOPENING=2;publicstaticfinalintOPEN=3;publicstaticfinalintCLOSING=4;publicstaticfinalintSTAYOPEN=5;privateintstate=CLOSED;//定义状态变量,用不同的整数表示不同状态privatevoidsetState(intstate){this.state=state;}//设置传输门当前状态publicvoidgetState(){//此处代码省略,本方法输出状态字符串,//例如,当前状态为CLOSED时,输出字符串为"CLOSED"}publicvoidclick(){//发生click事件时进行状态转换if({{U}}(1){{/U}};)setState(OPENING);elseif({{U}}(2){{/U}};)setState{CLOSING);elseif({{U}}(3){{/U}};)setState(STAYOPEN);}//发生timeout事件时进行状态转换publicvoidtimeout(){if(state==OPEN)setState(CLOSING);}publicvoidcomplete(){//发生complete事件时进行状态转换if(state==OPENING)setState(OPEN);elseif(state==CLOSING)setState(CLOSED);}publicstaticvoidmain(String[]args){DooraDoor=newDoor();aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();aDoor.getState();return;}}【Java代码2】publicclassDoor{publicfinalDoorStateCLOSED=newDoorClosed(this);publicfinalDoorStateOPENING=newDoorOpening(this);publicfinalDoorStateOPEN=newDoorOpen(this);publicfinalDoorStateCLOSING=newDoorClosing(this);publicfinalDoorStateSTAYOPEN=newDoorStayOpen(this);privateDoorStatestate=CLOSED;//设置传输门当前状态publicvoidsetState(DoorStatestate){this.state=state;}publicvoidgetState(){//根据当前状态输出对应的状态字符串System.out.println(state.getClass().getName());}publicvoidclick(){{{U}}(4){{/U}};}//发生click事件时进行状态转换publicvoidtimeout(){{{U}}(5){{/U}};}//发生timeout事件时进行状态转换publicvoidcomplete(){{{U}}(6){{/U}};)//发生complete事件时进行状态转换publicstaticvoidmain(String[]args){DooraDoor=newDoor();aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.timeout();aDoor.getState();return;}}publicabstractclassDoorState{//定义所有状态类的基类protectedDoordoor;publicDoorState(Doordoer){this.door=door;}publicvoidclick(){}publicvoidcomplete(){}publicvoidtimeout(){}}classDoorClosedextendsDoorState{//定义一个基本的Closed状态publicDoorClosed(Doordoor){super(door);}publicvoidclick(){{{U}}(7){{/U}};)//该类定义的其余代码省略}//其余代码省略
问答题选出正确的关系代数表达式。
问答题[说明]
某公司拟开发一多用户电子邮件客户端系统,部分功能的初步需求分析结果如下。
(1)邮件客户端系统支持多个用户,用户信息主要包括用户名和用户密码,且系统中的用户名不可重复。
(2)邮件账号信息包括邮件地址及其相应的密码,一个用户可以拥有多个邮件地址(如user1@123.com)。
(3)一个用户可拥有一个地址簿,地址簿信息包括联系人编号、姓名、电话、单位地址、邮件地址1、邮件地址2、邮件地址3等信息。地址簿中一个联系人只能属于一个用户,且联系人编号唯一标识一个联系人。
(4)一个邮件账号可以含有多封邮件,一封邮件可以含有多个附件。邮件主要包括邮件号、发件人地址、收件人地址、邮件状态、邮件主题、邮件内容、发送时间、接收时间。其中,邮件号在整个系统内唯一标识一封邮件,邮件状态有已接收、待发送、已发送和已删除4种,分别表示邮件是属于收件箱、发件箱、已发送箱和废件箱。一封邮件可以发送给多个用户。附件信息主要包括附件号、附件文件名、附件大小。一个附件只属于一封邮件,且附件号仪在一封邮件内唯一。
问答题试题五(共15分)阅读下列说明和C++代码,将应填入____(n)___处的字句写在答题纸的对应栏内。[说明]某咖啡店售卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据矽加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。
问答题【说明】 函数DeleteNode (Bitree *r, int e)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1。二叉查找树结点的类型定义为: typedef struct Tnode int data; /*结点的键值*/ struct Tnode *Lchild, *Rchild; /*指向左、右子树的指针*/ *Bitree: 在二叉查找树上删除一个结点时,要考虑3种情况: ①若待删除的结点p是叶子结点,则直接删除该结点; ②若待删除的结点p只有一个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点p; ③若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述①、②情况之一。 【函数】 int DeleteNode (Bitree *r,int e) Bitree p=*r,pp,s,c; while ( (1) ) /*从树根结点出发查找键值为e的结点*/ pp=p; if(e<p->data) p=p->Lchild; else p=p->Rchild; if(!P) return-1; /*查找失败*/ if(p->Lchild p->data=s->data; p=s; /*处理情况①、②*/ if ( (4) ) c=p->Lchild; else c=p->Rchild; if(p==*r) *r=c; else if ( (5) ) pp->Lchild=c; else pp->Rchild=c; free (p); return 0;
问答题【问题3】
若将上述各关系直接实现为对应的物理表,现需查询在2005年1月1日到2005年 12月31日期间,在该宾馆住宿次数大于5次的客人身份证号,并且按照入住次数进行降序排列。下面是实现该功能的SQL语句,请填补语句中的空缺。
SELECT 住宿.身份证号,count (入住日期)
FROM 住宿,客人
WHERE 入住日期>='20050101'AND入住日期<='20051231'
AND 住宿.身份证号=客人.身份证号
GROUP BY {{U}}(2) {{/U}}
{{U}} (3) {{/U}} count(入住日期)>5
{{U}} (4) {{/U}}
问答题【说明】某超市的销售业务由一个销售业务管理系统进行管理,该系统每完成一次交易都需要提供顾客发票,其格式如表1-1所示。对于这样一个销售业务管理系统,分别给出了以下两种关系数据库的设计(下划线表示主关键字)设计一:顾客Customer(顾客代码Cno,姓名name,住址address,联系电话phone)收银员Salesman(收银员代码Sno,身份证号idno,姓名flame,住址address,联系电话phone)商品Merchandise(商品代码Milo,商品名称Mname,价格price)发票Invoice(发票号码Ino,交易日期Idate,顾客代码Cno,收银员代码Sno,商品代码Mno,单价unitprice,数量amount)设计二:顾客Customer(顾客代码Cno,姓名name,住址address,联系电话phone)收银员Salesman(收银员代码Sno,身份证号idno,姓名name,住址address,联系电话吵one)商品Merchandise(商品代码Mno,商品名称mllame,价格pnce)发票Invoice(发票号码Ino,交易日期Idate,顾客代码Cno,收银员代码Sno)发票明细Invoicedetail(发票号码Ino,商品代码Uno,单价unitprice,数量amount)
问答题[说明1]B树是一种多又平衡查找树。一棵m阶的B树,或为空树,或为满足下列特性的m叉树。(1)树中每个节点至多有m棵子树。(2)若根节点不是叶子节点,则它至少有两棵子树。(3)除根之外的所有非叶子节点至少有[m/2]棵子树。(4)所有的非叶子节点中包含下列数据信息:(n,A0,K1,A1,K2,A2,…,Kn,An)。其中,Ki(i=1,2,…,n)为关键字,且Ki<Ki+1(i=1,2,…,n-1),Ai(i=0,1,…,n)为指向树根节点的指针,且指针Ai-1所指子树中所有节点的关键字均小于ki,Ai+1所指子树中所有节点的关键字均大于ki;n为节点中关键字的数目。(5)所有的叶子节点都出现在同一层次上,并且不带信息(可以看作是外部节点或查找失败的节点,实际上这些节点不存在,指向这些节点的指针为空)。例如,一棵4阶B树如图1所示(节点中关键字的数目省略)。B树的阶M、bool类型、关键字类型及B树节点的定义如下:#defineM4/*B树的阶*/typedefenum{FALSE=0,TRUE=1}bool;typedefintElemKeyType;typedefStructBTreeNode{intnumkeys;/*节点中关键字的数目*/structBTreeNode*parent;/*指向父节点的指针,树根的父节点指针为空*/structBTreeNode*A[M];/*指向子树节点的指针数组*/ElemgeyTypeK[M];/*存储关键字的数组,K[0]闲置不用*/}BTreeNode;函数SearchBtree(BTreeNode*root,ElemKeyTypeakey,BTreeNode**ptr)的功能是:在给定的一棵M阶B树中查找关键字akey所在节点,若找到则返回TRUE,否则返回FALSE。其中,root是指向该M阶B树根节点的指针,参数ptr返回akey所在节点的指针,若akey不在该B树中,则ptr返回查找失败时空指针所在节点的指针。例如,在图1所示的4阶B树中查找关键字25时,ptr返回指向节点e的指针。注:在节点中查找关键字akey时采用二分法。函数SearchBtree的代码如下:boolSearchBtree(BTreeNode*root,ElemKeyTypeakey,BTreeNode**ptr){intlw,hi,mid;BTreeNode*P=root;*ptr=NULL;while(p){lw=1;hi=______;while(lw<=hi){mid=(lw+hi)/2;if(p→K[mid]==akey){*ptr=P;returnTRUE;}elseif______hi=mid-1;elselw=mid+1;}*ptr=p;p=______;}returnFALSE;}
问答题【说明】
源程序中定义了Circle类与Money类,Circle类可对半径为r的圆进行周长与面积的计算,而Money类用于计算一圆形游泳池的造价。游泳池四周有原形过道,过道外围上栅栏,过道宽度为3米,根据键入的游泳池半径,每米栅栏价格及每平方米过道价格,即可计算出游泳池的造价。请按要求完成下列操作,将程序补充完整。
①定义符号常量PI(值为3.14159f)与WIDTH(值为3.00f),分别用于表示圆周率与过道的固定宽度。
②定义Circle类默认构造函数,把私有成员radius初始化为参数r的值。
③完成Money类默认构造函数的定义,把私有成员FencePrice(每米栅栏的价格)、ConcretePrice(每平方米过道的价格)初始化为参数f,c的值。
④完成Money类成员函数float Money::TotalMoney(float fencelen,float conarea)的定义,根据参数fencelen(栅栏的长度)和conarea(过道的面积),返回栅栏与过道的总造价。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件test4.cpp清单如下:
#include<iostream.h>
{{U}} (1) {{/U}}
class Circle
{
private:
float radius;
public:
{{U}} (2) {{/U}}
float Circumference(){return 2 * P| * radius;}
float Area(){return P|*radius * radius;}
};
class Money
{
private:
float FencePrice;
float ConcretePrice;
public:
Money(float f,float c);
float Tota|Money(float fencelen, float conarea);
};
Money::Money(float f,float c)
{
{{U}}(3) {{/U}}
}
float Money::Tota|Money(float fencelen, float conarea)
{
{{U}}(4) {{/U}}
}
void main( )
{
float radius, fence, concrete;
cout. setf(ios:: fixed);
cout. setf(ios:: showpoint);
cout. precision (2);
cout << "Enter the radius of the pool:";
cin > > radius;
cout << "Enter the FencePrice:";
cin > > fence;
cout << "Enter the ConcretePrice: ";
cin > > concrete;
Circle Pool(radius);
Circle PoolRim(radius + WIDTH);
Money mon( fence, concrete);
float totalmoney = mon. TotalMoney( PoolRim. Circumference( ), ( PoolRim. Area ( ) - Pool.
Area ( ) ) );
cout << "The total money is RMB" << totalmoney << end|;
}
问答题[问题3]
写出每种关系模式的主键。
问答题试题五(共15分)阅读下列说明和C++代码,将应填入____(n)____处的字句写在答题纸的对应栏内。[说明]某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新。现在采用观察者(Observer)模式来开发该系统。观察者模式的类图如图5-1所示。[C++代码]
问答题[说明]
在一个简化的绘图程序中,支持的图形种类有点(point)和圆(circle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shape_t、point_t和circle_t分别表示基本图形、点和圆,并且点和圆具有基本图形的所有特征。
[C程序]
typedef enum { point, circle } shape_type; /* 程序中的两种图形:点和圆 */
typedef struct { /* 基本的图形类型 */
shape type type; /* 图形种类标识:点或者圆 */
void (*destroy) (); /* 销毁图形操作的函数指针 */
void (*draw)(); /* 绘制图形操作的函数指针 */
} shape_t;
typedef struct { shape_t common; int x; int y; } point_t;
/* 定义点类型,x、y为点坐标 */
void destroyPoint (point_t* this) { free(this); printf ("Point
destoryed!/n");) /* 销毁点对象 */
void drawPoint (point_t* this) { printf("P(%d, %d)", this→x, this→y);)
/* 绘制点对象 */
shape_t* createPoint(va_list* ap) /* 创建点对象,并设置其属性 */
{
point_t* p point;
if ((p_point=(point_t*) malloc (sizeof(point_t)))==NULL) return NULL;
p_point→common. type = point;
p_point→common. destroy = destroyPoint;
p_point→common. draw=drawPoint;
p_point→x = va_arg (*ap, int); /* 设置点的横坐标 */
p_point→y = va_arg(*ap, int); /* 设置点的纵坐标 */
return (shape_t*)p_point; /* 返回点对象指针 */
}
tyPedef struct /* 定义圆类型 */
{
shape_t common;
point_t *center; /* 圆心点 */
int radius; /* 圆半径 */
} circle_t;
void destroyCircle(circle_t* this) {
free (______); free(this); printf("Circle destoryed!/n");
}
void drawCircle (circle_t* this)
{
printf ("C(");
______.draw( this→center); /* 绘制圆心*/
printf (", %d)", this→radius);
}
shape_t* createCircle(va list* ap) /* 创建一个圆,并设置其属性 */
{
circle_t* p_circle;
if ((p_circle=(circle_t*)malloc(sizeof(circle_t)))==NULL)return NULL;
p_circle→common. type=circle; p_circle→common. destroy=destroyCircle;
p_circle→common. draw=drawCircle;
______ =createPoint(ap); /* 设置圆心 */
p_circle→radius=va arg(*ap, int); /* 设置圆半径 */
return p_circle;
}
shape t* createShape(shape_type st, …) /* 创建某一种具体的图形 */
{
va_list ap; /* 可变参数列表 */
shape_t* P_shape = NULL;
______ (ap, st);
if ( st == point) p_shape=createPoint( &ap); /* 创建点对象 */
if ( st == circle) p_shape=createCircle(&ap); /* 创建圆对象 */
va_end(ap);
return p-shape;
}
int main()
{
int i; /* 循环控制变量,用于循环计数 */
shape t* shapes[2]; /* 图形指针数组,存储图形的地址 */
shape_s[0] = createShape ( point, 2, 3); /* 横坐标为2,纵坐标为3 */
shapes[1] = createShape( circle, 20, 40, 10);
/* 圆心坐标(20, 40), 半径为10 */
for (i=0; i<2; i++) { shapes[i]→draw(shapes[i]); printf("/n"); }
/* 绘制数组中图形 */
for( i=1; i>=0; i--) shapes[i]→destroy(shapes[i]);
/* 销毁数组中图形 */
return 0;
}
运行结果如下:
p(2, 3)
______
Circle destoryed!
Point destoryed!
问答题问题:4.3 若输入的硬币数为30,则最少的比较次数为( ),最多的比较次数为( )。
问答题【说明】某绘图系统存在point、line、square三种图元,它们具有Shape接口,图元的类图关系如图13-12所示。现要将circle图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了XCircle类,且完全满足系统新增的Circle图元所需的功能,但XCircle不是由Shape派生而来的,它提供的接口不能被系统直接使用。代码13-2既使用了XCircle又遵循了Shape规定的接口,既避免了从头开发一个新的Circle类,又可以不修改绘图系统中已经定义的接口。代码13-3根据用户指定的参数生成特定的图元实例,并对之进行显示操作。绘图系统定义的接口与XCircle提供的显示接口及其功能如表13-5所示。{{B}}表13-5接口及其功能{{/B}}ShapeXCircle功能display()DisplayIt()显示图元【代码13-2】classCircle{{U}}(1){{/U}}{private{{U}}(2){{/U}}pxc;publicCircle(){pxc=new{{U}}(3){{/U}};}publicvoiddisplay(){pxc.{{U}}(4){{/U}};}}【代码13-3】publicclassFactory{public{{U}}(5){{/U}}getShapeInstance(inttyoe){//生成特定类实例switch(type){case0:returnnewpoint();case1:returnnewRectangle();case2:returnnewline();case3:returnnewCircle();default:returnnull}}};publicclassApp{publicstaticviodmain(Stringargv[){if(argv.length!=1){system.out.println("errorparameters!");Return;}inttype=(newInteger(argv[0)).intValue();Factoryfactory=newFactory();shapes;s=factory.{{U}}(6){{/U}};if(s==null){system.out.println("Errorgetinstance!");Return;}s.display();return;}}
问答题[说明]某订单管理系统的部分UML类图如图5-16所示。在图5-16中,Product表示产品,ProductList表示所销售产品的列表,Order表示产品订单,Orderltem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。各个类的部分属性和方法说明如表5-23所示。{{B}}表5-23某订单管理系统各个类的部分属性和方法说明表{{/B}}{{B}}类{{/B}}{{B}}成员{{/B}}{{B}}说明{{/B}}ProductListArrayList<Product>productsProductStringcode产品编号Stringdescription产品描述doubleprice产品单价Booleanequals(Objectobject)若两个产品相同则返回true,否则返回falseOrderItemProductproduct订单项中的产品intquantity产品的订购数量ProductgetProduct()获取订单项中的产品OrderArrayList(orderItem)items订单中包含的订单项orderListArrayList(Order)Orders订单voidaddorder(orderOrder)向订单列表中添加新订单intgetNumberOfOrders()获取订单列表中的订单总数SalesSystemProductListcatalog产品目录orderListsales订单列表voidstatistic()依次统计产品目录中每个产品的订购总量,并打印出每个产品的编号、说明、订购总量和订购金额可以使用类java.util.ArrayList<E>来实现对象的聚集关系,如图5-16中OrderList与Order之间的聚集关系。for-each循环提供了一种遍历对象集合的简单方法。在for-each循环中,可以指定需要遍历的对象集合及用来接收集合中每个元素的变量,其语法如下:for(用来接收集合中元素的变量:需要遍历的对象集合)如果要使用for-each循环来遍历对象集合,那么包含该对象集合的类必须实现接口java.util.Iterable<T>。Java程序7-1和Java程序7-2分别给出了类OrderList和方法statistic的Java代码。
问答题
对文法G[S]:S→a|∧|(T);T→T,S|S:回答问题1~问题3。
【表】
表4-2 预测分析表
a
∧
(
)
,
#
S
→a
→∧
(u)(2)(/u)
T
(u)(1)(/u)
→SN
→SN
N
(u)(3)(/u)
→,SN