return;
Pos=0
for(;;)﹛
//调用indexStr在S所表示串的pos开始查找T的位置
Pos=indexStr();
if(pos=-1)//S所表示串中不存在子串T
return;
for(i=pos+T.length;ilength;i++)//通过覆盖来删除自串T
S->str[()]=S->str[i];
S->length=();//更新S所表示串的长度
﹜
﹜
(1)i-j+1
(2)j==T.length
(3)S,T,pos
(4)i-T.length
(5)S->length-T.length
函数1为字符串匹配,算法为:
先判断字符串S和T的长度,如果为空则不用循环,另外,如果字符串S的长度<字符串T的长度,那字符串S中也不能含有字符串T,也无需进行匹配。
那当上述情况都不存在时,即需要进行循环。
即从S的第一个字符开始,与T的第一个字符进行比较,如果相等,则S的第二个字符和T的第二字符进行比较,再相等就再往后移动一位进行比较,依次直到字符串T的结尾,也就是说j=T.length。
当某一个字符与T的字符不相等时,那么字符串S就应从下一个字符开始比较,此时i=i-j+1,(如果前面有匹配成功的话,i的值已经增加了j位,因此需要重新回到之前比较的位置的后一个字符进行比较)再次进行与T的第一个字符进行比较,此时j恢复初始值,j=0。
函数2为字符串的删除运算。
首先,要调用函数indexStr,需要三个参数,字符串S、字符串T和pos。
从函数2的调用VoideraseStr(SString*S,SStringT)可以看到,此处字符串S为指针变量,因此字符串前需使用*。
然后删除的字符串的位置为删除初始点的位置到其位置点+字符串T的长度,并将后面的字符串前移。
而删除T字符串后,字符串S的总长度变化,需减去字符串T的长度。
试题四(共15分)
阅读以下说明和C函数,填补函数中的空缺,将解答填入答题纸的对应栏内。
【说明】
简单队列是符合先进先出规则的数据结构,下面用不含有头结点的单向循环链表表示简单队列。
函数enqueue(queue*q,KeyTypenew_elem)的功能是将元素new_elem加入队尾。
函数Dnqueue(queue*q,KeyType*elem)的功能使将非空队列的队头元素出队(从
队列中删除),并通过参数带回刚出队的元素。
用单向循环链表表示的队列如图4-1所示。
图4-1单向循环链表表示的队列示意图
队列及链表结点等相关类型定义如下:
enum{errOr,OK};
typedefintKeyType;
typedefstructqNode﹛
KeyTypedata;
StructqNode*next;
﹜qNode,*Linkqueue;
Typedefstruct﹛
intsize;
Link:
queuerear;
}queue;
【C函数】
intenqueue(queue*q,KeyTypenew_elem)
﹛//元素new_elem入队列
qNode*p;
P=(qNode*)malloc(sizeof(qNode));
if(!
p)
returnerrOr;
P->data=new_elem;
if(q->rear)﹛
P->next=q->rear->next;
();
﹜
else
P->next=p;
﹙﹚;
q->size++;
returnOK;
﹜
intDequeue(queue*q,KeyType*elem)
﹛//出队列
qNode*p;
if(0==q->size)//是空队列
returnerrOr;
P=();//令p指向队头元素结点
*elem=p->data;
q->rear->next=();//将队列元素结点从链表中去除
if(())//被删除的队头结点是队列中唯一结点
q->rear=NULL//变成空队列
free(p);
q->size--;
returnOK;
﹜
(1)Q→rear→next=p
(2)Q→rear=p
(3)Q→rear→next
(4)p→next
(5)Q→rear==p或Q→rear→next==p或p→next==p或Q→size==1
本题考察C语言指针与链表的知识,为入队列和删除队列问题。
对于入队列,那么当队列Q不为空时,P的队尾t要指向原Q的队尾指向的元素,即:
P->next=Q->rear->next,Q的队尾要指向p,即:
Q→rear→next=p。
当队列Q为空时,插入p元素,则p的队尾指向p自身,即:
p→next=p,且整个队列Q的队尾也是p,即:
Q→rear=p。
对于队列删除元素p,先判断Q是否为空,为空队列则返回ERROR;
If(0==q->size)//是空队列
ReturnERROR;
另p指向队头元素结点,队头元素结点可用Q→rear→next表示。
此时,p转化为头结点,p出列,则需要Q的队尾指向p的下一个元素,因此第4空填:
p→next。
最后,判断被删除的队头结点是否是队列中的唯一结点,可采用:
Q→rear==p或Q→rear→next==p→next或Q→size==1等表示方法。
试题五(共15分)
阅读以下说明和Java程序,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
以下Jave代码实现一个简单客户关系管理系统(CrM)中通过工厂(Customerrfactory)对象来创建客户(Customer)对象的功能。
客户分为创建成功的客户(realCustomer)和空客户(NullCustomer)。
空客户对象是当不满足特定条件时创建或获取的对象。
类间关系如图5-1所示。
【Java代码】
AbstractclassCustomer﹛
ProtectedStringname;
()booleanisNil()
()StringgetName();
﹜
ClassrealCustomer()Customer﹛
PublicrealCustomer(Stringname)﹛returnfalse;﹜
﹜
ClassNullCustomer()Customer﹛
PublicStringgetName()﹛return″NotAvailableinCustomerDatabase″;﹜
PublicbooleanisNil()﹛returntrue;﹜
﹜
classCustomerfactory{
publicString[]names={"rob","Joe","Julie"};
publicCustomergetCustomer(Stringname){
for(inti=0;iif(names[i].())﹛
returnnewrealCusωmer(name);
﹜
﹜
return()
﹜
﹜
PublicclassCrM﹛
PublicviodgetCustomer()﹛
Customerfactory()
Customercustomer1-cf.getCustomer(″rob″);
Customercustomer2=cf.getCustomer(″rob″);
Customercustomer3=cf.getCustomer(″Julie″);
Customercustomer4=cf.getCustomer(″Laura″);
System.out.println(″customer1.getName());
System.out.println(″customer2getName());
System.out.println(″customer3.getName());
System.out.println(″customer4.getName());
﹜
Publicstaticviodmain(String[]arge)﹛
CrMcrm=newCrM();
Crm,getCustomer();
﹜
﹜
/*程序输出为:
Customer
rob
NotAvailableinCustomerDatabase
Julie
NotAvailableinCustomerDatable
*/
intmain()﹛
CrM*crs=newCrM();
Crs->getCustomer();
Crs->getCustomer();
Deletecrs;
return();
﹜
/*程序输出为:
Customer
rob
NotAvailableiniCustomerDatabase
Julie
NotAvailableinCustomerDatabase
1)abstract
2)abstract
3)extends
4)extends
5)equals(name)
6)newNullCustomer()
7)cf=NewCustomerFactory();
本题考察Java程序设计客户关系管理系统。
1)abstract定义可访问方法
2)abstract
3)extends继承Customer类
4)extends
5)equals(name)判断名字是否在数组集合内
6)newNullCustomer()当不满足条件时创建一个空对象
7)cf=NewCustomerFactory();实例化对象cf
试题六(共15分)
阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
以下C++代码实现一个简单客户关系管理系统(CrM)中通过工厂(Customerfactory)对象来创建客户(Customer)对象的功能。
客户分为创建成功的客户(realCustomer)和空客户(NullCustomer)。
空客户对象是当不满足特定条件时创建或获取的对象。
类间关系如图6-1所示。
【C++代码】
#include
#include
usingnamespacestd;
classCustomer{
protected:
stringname;
public:
(1)bollisNil()=0;
(2)stringgetName()=0;
﹜;
classrealCustomer(3){
public:
realCustomer(stringname){this->name=name;﹜
boolisNil(){returnfalse;﹜
stringgetName(){returnname;﹜
﹜;
classNullCustomer(4){
public:
boolisNil(){returntrue;﹜
stringgetName(){return〝NotAvailableinCustomerDatabase〞;﹜
﹜;
classCustomerfactory{
public:
stringnames[3]={〝rob〞,〝Joe〞,〝Julie〞﹜;
public:
Customer*getCustomer(stringname){
for(inti=0;i<3;i++){
if(names[i].(5)){
returnnewrealCustomer(name);
﹜
﹜
return(6);
﹜
﹜;
classCrM{
public:
voidgetCustomer(){
Customerfactory*(7);
Customer*customer1=cf->getCustomer(〝rob〞);
Customer*customer2=cf->getCustomer(〝Bob〞);
Customer*customer3=cf->getCustomer(〝Julie〞);
Customer*customer4=cf->getCustomer(〝Laura〞);
cout<<〝Customers〞<cout<getName()<cout<getName()<cout<getName()<cout<getName()<deletecf;
﹜
﹜;
intmain(){
CrM*crs=newCrM();
crs->getCustomer();
deletecrs;
return0;
﹜
/*程序输出为:
Customers
rob
NotAvailableinCustomerDatabase
Julie
NotAvailableinCustomerDatabase
*/
1)virtual
2)virtual
3):
publicCustomer
4):
publicCustomer
5)compare(name)==0
6)newNullCustomer()
7)cf=NewCustomerFactory();
本题考察使用C++代码实现实际问题。
在C++中,动态绑定是通过虚函数来实现的。
此题中用到了虚函数,所以要在成员函数原型缺钱加一个关键字virtual。
类RealCustomer和类NullCustomer是类Customer的派生类,因此3、4空都填publicCustomer。
进行对比数据库中的人名compare(name)==0
第6空与前面语句是相反的,一个是返回newRealCustomer(name),那么此处应填:
newNullCustomer()
第7空,用工厂创建对象,cf=NewCustomerFactory();