试题四
4、阅读以下说明和C语言程序,将应填入______处的字句填写完整。
[说明]
本程序对某电码文(原文)进行加密形成密码文,其加密算法如下:
假定原文为C1,C2,C3,…,Cn加密后形成的密文为S1,S2,S3,…,Sn,首先读入正整数key(key>1)作为加密钥匙,并将密文字符位置按顺时针方向连成一个环,如下图所示:
加密时从S1位置起顺时针计数,当数到第key个字符位置时,将原文中的字符放入该密文字符位置中,同时从环中除去该字符位置;接着从环中下一个字符位置起继续计数,当再次数到第key个字符位置时,将原文中字符C2放入其中,并从环中除去该字符位置;依次类推,直至n个原文字符全部放入密文环中。由此产生的S1,S2,…,Sn即为原文的密文。
例如,当key=3时,原文this is a decoding system的密文为:
aotgnhedi ys d imietsnc ss
当key=4时,该原文的密文为:
ssdtyd htegiasiscnm e ion
本程序将电码的原文存放在字符数组old中,加密存放在整数key中。函数decode用于将原文old加密并返回密文字符数组的首指针。其中函数采用一个双向循环链表CODE来表示密文环;函数strlen用于计算一个字符串中的字符个数(不包括字符串结尾符'\0')。为了简单起见,程序中假设内存容量足以满足动态存储单元分配的要求。
[程序]
#include<stdio.h>
#inclode<stdlib.h>
typedef struct node
{ char ch;
struct node*forward'/*Link to next node.*/
struct node*backward;/*Link to previous node.*/
}CODE;
int strlen(char*s)
{ int len=0;
while(*s++!='\0')
len++;
return(len);
}
char*decode(char*old,int key)
{ char*New;int length,count,i;
CODE*loop,*p;
length=strlen(old);
loop=(CODE*)malloc(length*sizeof(CODE.);
for(i=1;i<length-1;i++)
{ loop[i].forward=&loop[i+1];
_____
}
loop[0].backward=&loop[length-1];
loop[0].forward=&loop[1];
loop[length-1].forward=loop;
______
for(p=loop,i=0;i<length;i++)
{ for(count=1;count<key;count++)
p=p->forward;
______
p->backward->forward=p->forward;
p->forward->backward=p->backward;
______
}
New=(char*)malloc((length+1)*sizeof(char));
for(i=0;i<length;i++)
______
New[length]='\0';
return(New);
}
void main()
{ char old[256];
int key,num=0;
printf("\nPlease input the telegraph:\n");
while(num<255&&(old[num++]=getchar())!='\n');
old[(num==255)?num:num-1]='\0';
do
{ printf("\nPlease input Key(Key>1):");
scanf("%d",&key);
}while(key<=1);
printf("\nThe decode of telegraph:'%s'is:\n'%s'n",old,decode(old,key));
}
试题五
5、阅读以下说明和C++程序,将应填入______处的字句填写完整。
[说明]
字符串在程序设计中扮演着重要角色。现需要设计字符串基类string,包含设置字符串、返回字符串长度及内容等功能。另有一个具有编辑功能的串类edit_string,派生于string,在其中设置一个光标,使其能支持在光标处的插入、删除操作。
[程序]
#include<iostream.h>
#include<stdio.h>
#include<string.h>
class string
{
int length;
char*data;
public:
int get_length(){return length;}
char*get_data(){return data;}
~string(){delete data;}
int set_data(int in_length, char *in_data);
int set_data(char *data);
void print() {cout<<data<<endl; }
};
class edit_string: public string
{
int cursor;
public:
int get_cursor(){return cursor; }
void move_cursor(int dis) {cursor=dis; }
int add_data(string *new_data);
void delete_data(int num);
};
int string::set_data(int in_length, char *in_data)
{
length=in_length;
if(!data)
delete data;
①
strcpy(data,in_data);
return length;
}
int string::set_data(char *in_data)
{
②
if(!data)
delete data;
①
strcpy(data,in_data);
return length;
}
int edit_string::add_data( string *new_data )
{
int n,k,m;
char *cp,*pt;
n=new_data->get_length();
pt=new_data->get_data();
cp=this->get_data();
m=this->get_length();
char*news=new char[n+m+1];
for(int i=0;i<cursor;i++)
news[i]=cp[i];
k=i;
for(int j=0;j<n;i++,j++)
news[i]=pt[j];
cursor=i;
for(j=k;j<m;j++,i++)
③
news[i]='\0';
④
delete news;
return cursor;
}
void edit_string::delete_data(int num)
{
int m;
char*cp;
cp=this->get_data();
m=this->get_length();
for(int i=cursor;i<m;i++)
⑤
cp[i]='\0';
}
试题六
6、阅读以下说明、Java代码,将应填入______处的字句填写完整。
[说明]
IC卡和200卡都是从电话卡派生的。下面的程序将电话卡定义为抽象类。其中balance为双精度变量,代表电话卡中的余额;cardNumber是长整型变量,代表电话卡的卡号;password是整型变量,代表电话卡的密码;connectNumber是字符串变量,代表电话卡的接入号码;connected是布尔变量,代表电话是否接通。
performDial()实现各种电话接通后的扣除费用的操作。其中200卡每次通话扣除0.5元的通话费用和附加费用;IC卡每次通话扣除0.9元的通话费。TimeLeft()方法用于测试电话卡余额及还可以拨打电话的次数。performConnection()用于电话接入操作,如果卡号和密码正确,则接通;否则,接不通。
[程序]
abstmct class PhoneCard
{
double batace;
① performDial();
double getBalance()
{return balance; }
double TimeLeft()
{
double current=balance;
int times=0;
do
{
②
times++;
}while(balance>=0);
balance=current;
return times-1;
}
}
abstract class Number_PhoneCard extends PhoneCard
{
long cardNumber;
int password;
String connectNumber;
Boolean connected;
Boolean performConnection(tong cn, int pw)
{
if(cn==cardNumber && ③ )
{
connected=true;
return true;
}
else return false;
}
}
class IC_Card ④
{
boolean performDial()
{
if(balance>0.9)
{
balance-=0.9;
return true:
}
else return false;
}
}
class D200_Card ④
{
static double additoryFee;
static{ additoryFee=0.1; }
boolean performDial()
{
if(balance>(0,5+additoryFee))
{
⑤
return true;
}
else return false;
}
}
试题四答案:
4、(1)loop[i].backward=&loop[i-1];
(2)loop[length-1].backward=&loop[length-2];
(3)p->ch=*old++;
(4)p=p->forward;
(5)New[i]=loop[i].ch;
[解析] 本题考查加密算法在C语言中的实现及双向循环链的生成。
题目给出了具体加密算法的过程,要求函数decode用于将原文old加密并返回密文字符数组的首指针,并告诉我们函数采用一个双向循环链表CODE来表示密文环。函数strlen用于计算一个字符串中的字符个数在程序中已经实现。
下面,我们来看程序。根据题目给出的条件,我们知道函数decode的基本功能和一些其他的性质。在函数decode中,loop=(CODE*)malloc(length*sizeof(CODE))要求动态分配能存放length个CODE类型的内存空间,这说明分配了length个CODE链表结点的空间,并把其首地址存放到指针变量loop中。但题目要求CODE链表是双向循环链表,因此,还需要将这些结点连接起来使其成为双向循环链表。程序通过一个循环语句来对除首结点和尾结点外的其他结点的前后指针域赋值,使forward指针域指向其后一个结点,使backward指针域指向其前一个结点。因此第1空的答案出来了,是“loop[i].backward=&loop[i-1];”。
为了构成循环链表,需要对链表中的首结点和尾结点进行操作,首结点的forward指针域和backward指针域应该分别指向第二个结点和尾结点,而尾结点的forward指针域和backward指针域应该分别指向首结点和倒数第二个结点。因此,第2空的答案应该是“loop[length-1].backward=&loop[length-2];”。
第3空和第4空在一个循环体中,根据我们上面的分析,再结合代码,我们可以知道,这个循环应该是对数据实现加密的过程。加密算法规定:加密时从S1位置起顺时针计数,当数到第key个字符位置时,将原文中的字符放入该密文字符位置中,同时从环中除去该字符位置,接着从环中下一个字符位置起继续计数,当再次数到第key个字符位置时,将原文中字符C2放入其中,并从环中除去该字符位置;依次类推,直至n个原文字符全部放入密文环中。从程序中可以看出,第3空处应该是当数到第key个字符位置的时候,应该要完成的任务,那么任务就是将原文中的字符放入该密文字符位置中,同时要将原文中的字符往后移一个。所以,此空答案为“p->ch=*old++;”。接下来应该从环中除去该字符位置,接着从环中下一个字符位置起继续计数,而删除环中该字符位置已经实现,第4空的作用只能是移动指针p去环中下一个位置,因此答案为“p=p->forward;”。
接下来的代码重新动态分配了一段空间,用来存放加密后的密文,第5空的作用应该是将密文环中的内容依次放入重新分配的数组New中,因此,此空的答案为“New[i]=loop[i].ch;”。
试题五答案:
5、①data=new char[length+1]; ②length=strlen(in_data);
③news[i]=cp[j]; ④set_data(news);
⑤cp[i]=cp[i+num];
[解析] 本题考查C++中字符串的操作。
字符是程序设计中常用的一种数据类型,而字符串表示一串字符,在程序设计中扮演着重要角色,是考试中常出现的内容。题目要求设计一个基类能实现字符串设置、返回字符串长度及内容等功能,设计一个子类能支持在光标处的插入、删除操作。
下面我们来看代码。首先定义了一个string基类,在string基类中,声明了两个成员变量和几个成员函数。接着定义了一个继承string类的派生类edit_string。再下面是对类中成员函数的实现。
第1空在set data()函数体中,int string::set_data()表明此函数是基类中的成员函数,根据基类要实现的功能,此函数要实现返回字符串长度和设置其内容,在函数体中其长度已经给出,但分配存储空间被delete data删除掉了,应该重新分配,在C++中一般用关键字new实现空间的动态分配。因此,第1空的答案是“data=new char[length+1];”。
第2空在另一个set data()函数体中,这两个函数同名,但参数不同,这是C++中用同名函数实现多态的技巧。此函数功能同上一个函数,但它的形参中没有指明字符串的长度,因此,在函数开始时要求出字符串的长度,用函数strlen()。所以,此空答案为“length=strlen(in_data);”。
第3空和第4空在函数add data()中,此函数是派生类中的成员函数,根据题目要求它要实现的功能是在光标处进行插入。在此函数体中重新分配了一块内存空间,其长度是原有字符串长度和要插入字符串长度之和加1,用来存放这两个字符串。第3空所在的位置是循环体下面,根据循环体的判断条件j<m我们可以想到这是要对长度为m的字符串进行插入。因此,此空答案为“。news[i]=cp[j];”。而第4空是在完成了插入工作以后,根据程序上下文推断,应该是计算字符长度并返回,因此,答案为“set_data(news);”。
第5空在函数delete data()中,根据题目要求,此函数应该是实现子类在光标处进行删除的功能。删除一般采用覆盖技术,即将后面的字符往前移动来覆盖掉要删除的字符,第5空实现的就是这个功能,要删除num个字符,后面的字符应该往前移动num位,因此,此空答案为“cp[i]=cp[i+num];”。
试题六答案:
6、①abstract Boolean ②performDial();
③pw==password ④extends Number_PhoneCard
⑤balance-=0.5+additoryFee;
[解析] 本题考查Java对抽象类的定义、继承及电话卡业务的实现。
在Java程序设计语言中,抽象类是指在类中定义了抽象成员函数的类,程序中把基类PhoneCard定义为抽象类,其中有一个成员变量和三个成员函数,但是已给出定义的两个函数都不是抽象成员函数。因此,第1空的作用是把成员函数performDial()定义为抽象成员函数,结合后面的程序我们可以知道,函数performDial()的返回类型是布尔型,因此,此空的答案为“abstract Boolean”。
第2空在函数TimeLeft()中,此函数用于测试电话卡余额及还可以拨打电话的次数,要实现此功能应该知道每次电话接通后扣除的费用,函数performDial()能实现这个功能,此处应该是调用这个函数,因此,此空答案为“performDial();”。
第3空在函数performConnection()中,此函数用于电话接入操作,如果卡号和密码正确,则接通;否则,接不通。结合程序中代码,我们知道此空是要判断密码是否正确,而参数pw中存放的是密码,因此,此空答案为“pw==password”。
第4空是在派生类的定义时,对派生类继承关系的说明。电话卡的所有属性在抽象类Number_PhoneCard中都有了完整的定义,那么这两个电话卡的派生类应该继承Number_PhoneCard抽象类,因此,此空答案为“extends Number_PhoneCard”。
第5空在D200_Card类的performDial()函数中,这个函数的作用是对200卡每次通话进行扣费操作。根据题目条件,200卡每次通话扣除0.5元,再结合程序中的内容,我们可以推导出第5空要完成的任务是费用扣除操作,因此,此空答案为“balance-=0.5+additoryFee;”。