问答题【程序说明】
函数int commstr(char * str1,char * str2,int * sublen)从两已知字符串str1和str2中,找出它们的所有最长的公共子串。如果最长公共子串不止1个,函数将把它们全部找出并输出。约定空串不作为公共子串。
函数将最长公共子串的长度送入由参数sublen所指的变量中,并返回字符串str1和str2的最长公共子串的个数。如果字符串str1和str2没有公共子串,约定最长公共子串的个数和最长公共子串的长度均为0。
【程序】
int strlen(char * s)
{char *t=s;
while( * ++);
return t-s-1;
}
int commstr(char) *str1,char *str2,int *sublen
{ char*s1, *s2;
int count=0,len1 ,len2,k,j,i,p;
len1:=strlen(str1)
len2 = strlen(str2);
if(len1>len2)
{s1=str1 ;s2=str2;}
else {len2 = len1;s1 = str2;s2 = str1;}
for(j=len2;j>0;j--) /*从可能最长子串开始寻找*/
{for(k=0;{{U}} (1) {{/U}}<:len2;k++) /*k为子串s2的开始位置*/
{for(i=0;s1[{{U}} (2) {{/U}}]!='/0';i++;) /*i为子串s1的开始位置*/
{ /*s1的子串与s2的子串比较*/
for (p=0;p<j)p++);
if ({{U}} (4) {{/U}}) /*如果两子串相同*/
{for(p=0);p<j;p++} /*输出子串*/
printf ("%c",s2[k+p]);
printf ("/n");
count++;/*计数增1 */
}
}
}
if (count>0) break;
*sublen=(count>0)?{{U}} (5) {{/U}}:0;
return count;
}
问答题【说明】
设串s和串t采用顺序存储结构,编写函数实现串s和串t的比较操作,要求比较结果包括大于、小于和等于3种情况。
【函数】
int StrCompare(SStrType s, SStrType t)
{
int n=s.length, m={{U}} (1) {{/U}}, i,j,tag;
i=0; j=0;
while({{U}} (2) {{/U}})
{
if({{U}} (3) {{/U}})
{
i++;
j++;
}
else if(s.str[i]>t.str[j])
{
tag=1;
return tag;
}
else
{
tag=-1;
return tag;
}
}
if(n==m)
tag=0;
else if({{U}} (4) {{/U}})
tag=1;
else if(n<m)
tag=-1;
{{U}} (5) {{/U}};
}
问答题试题六(共 15 分)
阅读以下说明和C++程序代码,将应填入(n) 处的字句写在答题纸的对应栏内。
[说明]
在下面的C++代码中,类SalesTicket 能够完成打印票据正文的功能,类HeadDecorator 与FootDecorator 分别完成打印票据的台头和脚注的功能。
已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。
这是票据的台头!
这是票据正文!
这是票据的脚注!
------------------------
这是票据的台头!
这是票据的脚注!
[C++程序代码]
#include
using namespace std;
class SalesTicket {
public:
(1) printTicket() { cout printTicket();
}
};
class HeadDecorator : public Decorator{
public:
HeadDecorator(SalesTicket *t): (2) { }
void printTicket() {
cout << "这是票据的台头!" << endl;
Decorator::printTicket();
}
};
class FootDecorator :public Decorator{
public:
FootDecorator(SalesTicket *t): (3) { }
void printTicket() {
Decorator::printTicket();
cout << "这是票据的脚注!" << endl;
}
};
void main(void) {
SalesTicket t;
FootDecorator f(
HeadDecorator h( (4) );
h.printTicket();
cout << "------------------------"<< endl;
FootDecorator a(NULL);
HeadDecorator b( (5) );
b.printTicket();
}
问答题试题三(共15分)阅读以下说明和C程序,将应填入(n)处的字句写在答题纸的对应栏内。[说明]某种传感器的输出值Ratio依赖于环境温度temp(-40oC≤temp≤50oC)。对一组环境温度值(ITEMS个),人们已经测量得到了相应的Ratio值(见表1)。该表粗略地描述了曲线Ratio(temp)。校正系数K是Ratio的倒数,因此也依赖于环境温度temp。在数据处理中,人们需要用更多的列表值细致地描述曲线K(temp),如表2所示。在表2中,各温度值所对应的K值是对表1进行线性插值再求倒数得到的,具体的计算方法如下:1.根据temp值,在表1中用二分法查找;2.若找到相应的温度值,则按相应的Ratio值求倒数得到K值;3.若没找到相应的温度值,则可确定temp所在的温度区间[Tp1,Tp2],同时获得了相应的Ratio1和Ratio2,再按如下公式计算K值:Step=(Ratio1-Ratio2)/(Tp1-Tp2)K=1.0/(Ratio1+Step*(temp–Tp1))在程序中,当temp高于50oC或低于-40oC时,设定K=0。[程序]#includetypedefstruct{intTemp;/*环境温度*/doubleRatio;/*传感器的输出值*/}CURVE;#defineITEMS7doubleGetK(int,CURVE*,int);voidmain(){intDegree;doublek;CURVECurve[ITEMS]={{-40,0.2},{-20,0.60},{-10,0.8},{0,1.0},{10,1.17},{30,1.50},{50,1.8}};printf("环境温度校正系数\n");for(Degree=-40;DegreeTemp)||(Temp>(p+high)->Temp))return0.0;/*超出温度范围时返回0.0*/while(lowTemp)return(2);if(TempTemp)high=m-1;elselow=(3);}p+=high;Step=((4))/((p+1)->Temp-p->Temp);return1.0/(p->Ratio+Step*((5)));}
问答题【说明】一般的树结构常采用孩子一兄弟表示法表示,即用二叉链表代表树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点,例如,如图5-9(a)所示的树和如图5-9(b)所示的树的孩子一兄弟表示。函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对如图5-9所示的树进行层序遍历时,节点的访问次序为DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如表5-12所示。{{B}}表5-12实现队列基本操作的函数原型表{{/B}}函数原型说 明 voidInitQueue(Queue*Q) 初始化队列 BoolIsEmpty(Queue*Q) 判断队列是否为空,若是则返回true,否则返回alse voidEnQueue(Queue*Q,TreeNodep) 元素入队列 voidDeQueue(Queue*Q,TreeNode*p) 元素出队列Bool、Status类型定义如下:typedefenum{FALSE=0,TRUE=1}Bool;typedefenum{OVERFLOW=-2,UNDERFLOW=-1,ERROR=0,OK=1)Status;树的二叉链表节点定义如下:typedefstructN6de{chardata;structNode*firstchild,*nextbrother;}Node,*TreeNode;【C函数程序】StatusLevelTraverse(TreeNoderoot){/*层序遍历树,树采用孩子一兄弟表示法,root是树根节点的指针*/QueuetempQ;TreeNodeptr,brotherptr;if(!root)returnERROR;InitQueue({{U}}(1){{/U}};brotherptr=root->nextbrother;while(brotherptr)(EnQueue({{U}}(2){{/U}};}/*end-while*/while({{U}}(3){{/U}}){{{U}}(4){{/U}};Printf("%c/t",ptr->data);if({{U}}(5){{/U}})continue;{{U}}(6){{/U}};brotherptr=ptr->firstchiid->nextbrother;while(brotherptr){EnQueue({{U}}(7){{/U}};}/*end-while*/}/*end-while*/returnOK;}/*LevelTraverse*/
问答题【说明】 函数diff的功能是:根据两个由整数(都大于-32768)按升序构成的单链表L1和L2(分别由A,B指向)构造一个单链表L3(由*r指向),要求13中的所有整数都是L1,并且不是 L2中的整数,还要求L3中的所有整数都两两不等。 【函数】 #include < malloc. h > typedef struct node int d; struct node * next Node; void diff(Node *A,Node * B,Node * * r) int lastnum; Node * p; *r = NULL; if( ! A) return; while( (1) ) if(A->d < B ->d) lastnum =A -> d; p= ( Node * ) malloc( sizeof(Node) ); p->d = lastnum; p->next= *r; (2) ; do A = A -> next; while( (3) ); else if(A->d > B->d) B=B- >next; else (4) ; lastnum=A -> d; while ( A while(A) lastnum=A->d; p=( Node * ) malloc( sizeof(Node) ); p-> d = lastnum; (5) ; *r=p; while (A
问答题试题三(15分,每空3分)阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。[说明]一棵非空二叉树中“最左下”结点定义为:若树根的左子树为空,则树根为“最左下”结点;否则,从树根的左子树根出发,沿结点的左孩子分支向下查找,直到某个结点不存在左孩子时为止,该结点即为此二叉树的“最左下”结点。例如,下图所示的以A为根的二叉树的“最左下”结点为D,以C为根的子二叉树中的“最左下”结点为C。二叉树的结点类型定义如下:typedefstructBSTNode{intdata;structBSTNode*lch,*rch;//结点的左、右孩子指针}*BSTree;函数BSTreeFind_Del(BSTreeroot)的功能是:若root指向一棵二叉树的根结点,则找出该结点的右子树上的“最左下”结点*p,并从树中删除以*p为根的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在“最左下”结点,则返回空指针。[函数]BSTreeFind_Del(BSTreeroot){BSTreep,pre;if(!root)returnNULL;/*root指向的二叉树为空树*/(1);/*令p指向根结点的右子树*/if(!p)returnNULL;(2);/*设置pre的初值*/while(p->lch){/*查找“最左下”结点*/pre=p;p=(3);}if((4)==root)/*root的右子树根为“最左下”结点*/pre->rch=NULL;else(5)=NULL;/*删除以“最左下”结点为根的子树*/returnp;}
问答题【函数2.1说明】 递归函数sum(int a[], int n)的返回值是数组a[]的前n个元素之和。 【函数2.1】 int sum (int a[],int n) if(n>0) return (1) ; else (2) ; 【函数2.2说明】 有3个整数,设计函数compare(int a,int b,int c)求其中最大的数。 【函数2.2】 int compare (int a, int b, int c ) int temp, max; (3) a:b; (4) temp:c; 【函数2.3说明】 递归函数dec(int a[],int n)判断数组a[]的前n个元素是否是不递增的。不递增返回 1,否则返回0。 【函数2.3】 int dec( int a[], int n ) if(n<=1) return 1; if(a[0]<a[1]) return 0; return (5) ;
问答题试题四(共15分)阅读以下应用说明以及用VisualBasic开发过程中进行的属性设置和所编写的程序代码,将应填入(n)处的字句写在答题纸的对应栏内。[应用说明]启动某应用程序运行的登录窗口如下:其中的标签(Label1)“用户名(U)”对应文本框Username,标签(Label2)“密码(P)”对应文本框“Password”。当用户在Username文本框中输入用户名“ali88”,在Password文本框中输入“zmkm”(显示的字符均为“*”),并单击“确定”按钮时,就会弹出应用程序的主窗口frmAPP,而该登录窗口就会卸载。如果用户名或密码输入错误,则会弹出报警信息框。当用户单击其中的“确定”按钮后,登录窗口中Password文本框的内容就会消失,光标停留在该框内,以便用户重新输入密码,必要时用户还可以再修改用户名,再次做登录尝试。本应用程序允许发生3次输入错误。在第3次输入错误后,就会立即退出该应用程序。在弹出登录窗口后,当按键“Alt+U”时光标就会停留在Username文本框中;当按键“Alt+P”时光标就会停留在Password文本框中。当用户按“Enter”键时,就相当于单击“确定”按钮;当用户按“Esc”键时,就相当于单击“取消”按钮,立即退出该应用程序。[属性设置]在开发过程中,部分控件及属性设置如下:[程序代码]PrivateSubcmdOK_Click()(3)AsInteger'静态变量times的说明If(4)ThenUnloadMe'卸载本登录窗口(5)'弹出应用程序主窗口frmAPPElseMsgBox("用户名或密码错!")times=times+1Password.Text=""'清除密码框中的内容Password.SetFocus'将光标定位于密码框Iftimes=3ThenEndEndIfEndSubPrivateSubcmdCancel_Click()EndEndSub
问答题阅读以下某客房管理系统的算法说明和程序流程图,根据要求回答问题1至问题4。【算法说明】某商务交流中心共有N间客房。每间客房的房间号、房间等级、床位数及占用状态分别存放在数组ROOM、RANK、NBED和STATUS中。房间等级值为1、2或3。房间的状态值为0(空闲)或1(占用)。客房是以房间(不是床位)为单位出租的。程序流程图(见图2-11)所反映的算法是,根据几个散客的要求预订一间空房。程序的输入为:人数M,房间等级要求尺(R=0表示任意等级都可以)。程序的输出为:所有可供选择的房间号。
问答题 阅读以下说明和Java代码,请回答问题1和问题2。
【说明】
己知类Stock和类cxyjava都定义在cxyjava.java文件中,类Stock的定义中第14行前共有四行出现了错误,将下面代码修改正确并完善后的输出结果为:
0:0 1:23【Java代码】 01 public class
Stock{ 02 static { 03
shares = 0; 04 share val =
0.0; O5 } 06
public Stock(){getData();} 07 public
Stock(int n, iht pr=0){ 08
shares = n; 09
share val = pr;
10
getData(); 11
} 12 public void getData()
{ 13 System.out.println(shares
+ ":"+share_val); 14 }
15 private int shares; 16
private int share_val; 17 };
18 19 public class cxyjava{ 20
public static void main(String args[]) { 21
Stock a ={{U}} (1) {{/U}};
22 Stock b = new Stock(1,23);
23 //其他无输出代码省略 24
} 25 }
问答题[说明2]
const是C语言的一个关键字,可以用来定义“只读”型变量。
[问题2](4分)
(1)请定义一个“只读”型的整型常量size,并将其值初始化为10;
(2)请定义一个指向整型变量a的指针ptr,使得ptr的值不能修改,而ptr所指向的目标变量的值可以修改(即可以通过ptr间接修改整型变量a的值)。
注:无需给出整型变量a的定义。
问答题【说明】
请编写一个函数int SeqSearch(int list[],int start,int n,int key),该函数从start开始,在大小为n的数组list中查找key值,返回最先找到的key值的位置,如果没有找到则返回-1。请修改程序中画线部分的错误并将不同情况下的输出结果补充完整。
【程序】
文件search.cpp的内容如下:
#include <iostream. h >
int SeqSearch( int list[ ] ,int start,int n,int key)
{
for(int i=start;i<=n;i++) //(1)
{
if( list[i] = key)//(2)
{
return i;
}
}
return -1;
}
void main( )
{
int A[10]
int key,count=0,pos;
cout <<" Enter a list of 10 integers:";
for(pos=0;pos<10;pos++)
{
cin >>A; //(3)
}
cout <<" Enter a key; ";
cin >> key;
pos=0;
while(( pos = SeqSearch ( A, pos, 10, key)) !=-1 )
{
count ++;
pos ++;
}
cout<<key<<"occurs" <<count<< (count!=1?" times":" time") <<" in the list,"
<< endl;
}
第一种情况:输入2 3 12 6 8 45 8 33 7输入key:8
输出:{{U}} (4) {{/U}}
第二种情况:输入2 3 126 8 45 8 33 7输入k6y:9
输出:{{U}} (5) {{/U}}
问答题[说明]
C++语言本身不提供对数组下标越界的判断。为了解决这一问题,在以下[C++程序]中定义了相应的类模板,使得对于任意类型的二维数组,可以在访问数组元素的同时,对行下标和列下标进行越界判断,并给出相应的提示信息。
[C++程序]
#include <iostream.h>
template <class T> class Array;
template <Class T> class ArrayBody {
friend {{U}}(1) {{/U}};
T* tpBody;
int iRows,iColumns, iCurrentRow;
ArrayBody(int IRsz, int iCsz) {
tpBody = {{U}}(2) {{/U}};
iRows = iRsz;
iColumns = iCsz;
iCurrentRow = -1;
}
Public:
T
row_error = column_error =false;
try {
if (iCurrentRow < 0 || iCurrentRow >= iRows)
row_error = true;
if (j<0 || j>= iColumns)
column_error = true;
if (row_error == true || column_error == true)
{{U}} (3) {{/U}};
}
catch(char){
if (row_error == true)
cerr << "行下标越界[" << iCurrentRow << "]";
if (column_error = true)
cerr << "列下标越界[" << j << "]";
cout << "/n";
}
return tpBody[iCurrentRow * iColumns + j];
}
~Arraygody(){delete[]tpBody;}
};
template <class T> class Array {
ArrayBody<T> tBody;
Public;
ArrayBody<T>
return tBody;
}
Array(int iRsz, int iCsz) : {{U}}(5) {{/U}} { }
};
void main()
{
Array<int> a1(10,20);
Array<double> a2(3,5);
int b1;
double b2;
b1 = a1[-5][10]; //有越界提示:行下标越界[-5]
b1 = a1[10][15]; //有越界提示:行下标越界[10]
b1 = a1[1][4]; //没有越界提示
b2 = a2[2][6]; //有越界提示:列下标越界[6]
b2 = a2[10][20]; //有越界提示:行下标越界[10]列下标越界[20]
b2 = a2[1][4]; //没有越界提示
}
问答题【函数1说明】 函数palindrome(char s[])的功能是:判断字符串s是否为回文字符串。若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,则可称该字符串是回文字符串。例如,“LEVEL”是回文字符串,而“LEVAL”不是。 【函数1】 int palindrome(char s[] char *pi, *pj; pi=s; pj=s+strlen(s)-1; while(pi<pj pj--; if( (2) )return-1; else return 0; 【函数2说明】 函数f(char *str, char del)的功能是:将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。 例如,若str的值为“33123333435”,del的值为“3”,调用此函数后,将输出三个子字符串,分别为“12”、“4”和“5”。 【函数2】 void f(char *str, char del) int i,j, len; len=strlen(str); i=0; while(i<len) While( (3) ) i++; /*忽略连续的标志字符*/ /*寻找从str[i]开始直到标志字符出现的一个子字符串*/ j=i+1; while(str[j]!=del (4) ='/0'; /*给找到的字符序列置字符串结束标志*/ printf("%s/t", (5) ;
问答题阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
[说明]
对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。
函数quicksort(int a[],int n)实现了快速排序,其中,n个整数构成的待排序列保存在数组元素a[0]~a[n-1]中。
[C代码]
#include<stdio.h>
void quicksort(int a[], int n)
{
int i,j;
int pivot=a[0]; //设置基准值
i=0; j=n-1;
while (i<j){
while (i<1 //大于基准值者保持在原位置
if (i<j) { a[i] =a[j]; i++;}
while(i<j //不大于基准值者保持在原位置
if (i<1) { a[j] =a[i]; 1--;}
}
a[i]=pivot; //基准元素归位
if (i>1 )
______; //递归地对左孔序列进行快速排序
if (n-i-1>1 )
______; //递归地对右孔序列进行快速排序
}
int main()
{
int i, arr[] ={23,56,9,75,18,42,11,67};
quicksort(______); //调用quicksort对数组arr[]进行排序
for( i=0; i<sizeof(arr)/sizeof(int); i++ )
printf("%d/t",arr[i]);
return 0;
}
问答题
问答题[说明] 本程序使用类来管理员工的通讯地址信息。已知程序的输出为: 输出记录:5 姓名:王丽华 街道地址:中华路15号 市:襄樊市 省;湖北省 邮政编码:430070[C++程序]#include < iostream, h >#include < string, h >class employee. protected: char name[10]; char street[ 20 ]; char city[10]; char (1) [10]; char post[7]; int no; (2) : (3) (char [] ,char [] ,char [] ,char [] ,char [] ,int); void changename ( char n [] ) strcpy ( name, n); void changestreet( char s[] ) strcpy(street,s) ; void changecity ( char c [] ) strcpy ( city, c ); void changeprov( char p [] ) strcpy(prov,p); void changeno(int nnm) (4) ; void display( );;employee:: (3) (char n[] ,char s[] ,char c[] ,char p1[] ,char p2[] ,int nam) strcpy(name,n); strcpy ( street, s); strcpy ( city, c); strcpy ( prov, p1 ); strcpy ( post, p2 ); no = nam; void employee:: display( ) cont< <"输出记录: "< <no< <endl; cout< < "姓名: "< < name < < endl; coot < < "街道地址: "< < street < < endl; cout < < "市: "< < city < < endl; cout< <"省: "< <prov < <endl; cout < <"邮政编码: "< < post < < endl;void main( ) employee cmp("王华" ,"中华路15号" ,"武汉市","湖北省","430070", 1 ); emp. changename( "五丽华" ); emp. changecity ( "襄樊市" ); emp. changeno(5); (5) ;
问答题阅读以下说明和Java代码,将应填入{{U}} (n) {{/U}}处的字句写在答题纸的对应栏内。
{{B}}[{{/B}}说明{{B}}]{{/B}}
已知类LinkedList表示列表类,该类具有四个方法:addElement()、lastElement()、 HumberOfElement()以及removeLastElement()。四个方法的含义分别为:
void addElement(Object):在列表尾部添加一个对象;
Object lastElement():返回列表尾部对象;
int numberOfElement():返回列表中对象个数;
void removeLastElement():删除列表尾部的对象。
现需要借助LinkeedList来实现一个Stack栈类,Java代码1和Java代码2分别采用继承和组合的方式实现。
{{B}}[{{/B}}Java代码1{{B}}]{{/B}}
public class Stack extends binkedList {
public void push(Object o) { //压栈
addElement (o);
}
public Object peek() { //获取栈顶元素
return{{U}} (1) {{/U}};
}
public boolean isEmpty() { //判断栈是否为空
return numberOfElement () ==0;
}
public Object pop() { //弹栈
Object o=lastElement();
{{U}} (2) {{/U}};
return o;
}
{{B}}[{{/B}}Java代码2{{B}}]{{/B}}
public class Stack {
private{{U}} ( 3 ) {{/U}};
public Stack() {
list = new LinkedList ();
}
public void push (Object o) {
list. addElement (o);
}
public Object peek() { //获取栈顶元素
return list.{{U}} (4) {{/U}};
}
public boolean isEmpty () { //判断栈是否为空
return list.numberOfElement()==0;
}
public Object pop(){ //弹栈
Object o =list.lastElement();
list.removeLastElement();
return o;
}
{{B}}[{{/B}}问题{{B}}]{{/B}}
若类LinkedList新增加了一个公有的方法removeElement(int index),用于删除列表中第 index个元素,则在用继承和组合两种实现栈类Stack的方式中,哪种方式下Stack对象可访问方法removeElement(int index)?{{U}} (5) {{/U}}(A.继承 B.组合)
【说明】传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)和Closing(正在关闭)5种状态。触发状态的转换事件有click、complete和timeout3种,事件与其相应的状态转换如图6-18所示。下面的【C++代码1】与【C++代码2】分别用两种不同的设计思路对传输门进行状态模拟,请填补代码段中的空缺语句。【C++代码1】constintCLOSED=1;constintOPENING=2;constintOPEN=3;constintCLOSING=4;constintSTAYOPEN=5;//定义状态变量,用不同整数表示不同状态classDoorprivate:private:intstate;//传输门当前状态voidsetState(intstate)this->state=stale;//设置当前状态public:Door():state(CLOSED);voidgetState()//根据当前状态输出相应的字符串switch(state)caseOPENING:cout<<"OPENING"<<endl;break;caseCLOSED:cout<<"CLOSED"<<endl;break;caseOPEN:cout<<"OPEN"<<endl;break;caseCLOSING:cout<<"CLOSING"<<endl;break;caseSTAYOPEN:cout<<"STAYOPEN"<<endl;break;voidclick()//发生click事件时进行状态转换if((1))setState(OPENING);elseif((2))setState(CLOSING);elseif((3))setState(STAYOPEN);voidtimeout()//发生timeout事件时进行状态转换if(state==OPEN)setState(CLOSING);voidcomplete()//发生complete事件时进行状态转换if(state==OPENING)setState(OPEN);elseif(state==CLOSING)setState(CLOSED);;intmain()DooraDoor;aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();aDoor.getState();return0;【C++代码2】classDoorpublic:DoorState*CLOSED,*OPENING,*OPEN,*CLOSING,*STAYOPEN,*state;Door();virtual~Door()...//释放申请的内存,此处代码省略;voidsetState(DoorState*state)this->state=state;voidgetState()//例如,当前状态为CLOSED时,输出字符串为"CLOSED";voidclick();voidtimeout();voidcomplete();;Door::Door()CLOSED=newDoorClosed(this);OPENING=newDoorOpening(this);OPEN=newDoorOpen(this);CLOSING=newDoorClosing(this);STAYOPEN=newDoorStayOpen(this);state=CLOSED;voidDoor::click()(4);voidDoor::timeout()(5);voidDoor::complete()(6);classDoorState//定义一个抽象的状态,它是所有状态类的基类protected:Door*door;public:DoorState(Door*door)this->door=door;virtual~DoorState(void);virtualvoidclick()virtualvoidcomplete()virtualvoidtimeout();classDoorClosed:publicDoorState//定义一个基本的closed状态public:DoorClosed(Door*door):DoorState(door)virtual~DoorClosed()voidclick();;voidDoorClosed::click()(7);//其他状态类的定义与实现代码省略ihtmain()DooraDoor;aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.timeout();aDoor.getState();return0;