●试题六
阅读以下说明和C++程序,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
设计一个类模板Sample用于对一个有序数组采用二分法查找元素下标。
【C++程序】
#include<iostream.h>
#define Max 100∥最多元素个数
template<class T>
class Sample
{
T A[Max]:∥存放有序数序
int n:∥实际元素个数
public
Sample(){}∥默认构造函数
Sample(T a[],int i);∥初始化构造函数
int seek(T c);
void disp()
{
for(int i=0;i<n;i++)
cout<<A[i]<<"";
cout<<end1:
}
};
template<class T>
Sample<T>::Sample(T a[],int i)
{
n=i;
for(intj=0;j<i;j++)
(1) ;
}
template<class T>
int Sample<T>::seek(T c)
{
int low=0,high=n-1,mid;
while((2) )
{
mid=(low+high)/2;
if((3) )
return mid;
else if((4) )
low=mid+l;
else
(5) ;
}
return-1;
}
void main()
{
char a[]="acegkmpwxz";
Sample<char>s(a,1。);
cout<<"元素序列:";s.disp();
cout<<"元素′g′的下标:"<<s.seek(′g′)<<endl;
}
查看答案
●试题一
阅读下列算法说明和算法,将应填入(n)处的字句写在答卷的对应栏内。
【算法说明】
某英汉词典文件包含N个记录(N>1),每个记录有两个字段:一个是英文单词,另一个是相应的汉语解释。各个记录按英文单词的词典顺序排列,各英文单词并不重复。
本算法用于维护、更新该英汉词典文件。维护、更新的方法是:首先输入一个英文单词及其汉语解释,然后在该词典中查找输入的英文单词,若找到,则用输入的汉语解释更新原有的解释;若找不到,则需要将输入的英文单词及其汉语解释插入到该词典的适当位置,使各记录仍按英文单词的词典顺序排列。
【算法】
第一步读入英汉词典文件,并将读入的N个英文单词依次存放在字符串数组ENG中,将相应的汉语解释依次存放在字符串数组CN中。数组元素CN(i)给出了数组元素ENG(i)的解释。
第二步输入英文单词及其汉语解释,将它们分别存放在字符串变量E和C中。若E为空串或都是空格,则转向第四步。
第三步根据变量E的值,用二分法在数组ENG中查找。具体步骤如下:
1.1→L,N→H
2.INT((L+H)/2)→K
3.若E=ENG(K),则C→CN(K),转向第二步
若E<ENG(K),则K-1→ (1) ;若E>ENG(K),则K+1→ (2)
4.若H<L则
对I=N,L,-1(始值,终值,增量)循环执行:
ENG(I)→ENG(I+1)
CN(I)→CN(I+1)
然后,将E和C分别存入 (3) 和 (4) ,N+1→N最后转向第二步
否则,转向 (5)
第四步将数组ENG和CN输出,形成新的英汉词典文件,算法结束。
●试题三
阅读下列程序说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
下面的程序功能的功能是以行为单位对字符串按下面的条件进行排序。排序条件为:从字符串中间一分为二,右边部分按字符的ASCⅡ值降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上
例如:位置:0 1 2 3 4 5 6 7
源字符串:h g f e a b c d
则处理后字符串:d c b a h g f e
函数ReadDat()实现从文件in.dat中读取数据(每行字符串长度均小于80),函数WriteDat()把结果dat输出到文件out.dat中。
【程序】
#include<stdio.h>
#include<siring.h>
#include<conio.h>
char dat[20][80];
void jsSort()
{
int i,j,k,strl;
char ch;
for(i=0;i<20;i++)
{
strl=strlen(dat[i]);
for(j= (1) ;j<strl;j++)/*对后半部分的字符串进行排序*/
for(k=j+1;k<strl;k++)
if((2) )
{
ch=dat[i][j];
dat[i][j]=dat[i][k];
dat[i][k]=ch;
}
for(j=0; (3) j++)/*前后两部分进行交换*/
{
ch=dat[i][j];
dat[i][j]=dat[i][(strl+1)/2+j];
dat[i][(strl+1)/2+j]=ch;
}
}
}
void main()
{
readDat();
jsSort();
writeDat();
}
readDat()
{
FILE*in;
int i=0;
char*p;
(4) ;
while(i<20 && fgets(dat[i],80,in)!=NULL)
{
p=strchr(dat[i],"\n");
if(p)*p=0;
i++;
}
fclose(in);
}
writeDat()
{
FILE*out;
int i;
clrscr();
out=fopen("out.dat","W");
for(i=0;i<20;i++)
{
printf("%s\n",dat[i]);
printf((5) );
}
fclose(out);
}
●试题四
阅读下列程序说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量 )。其结构为:
typedef struct{char fname [256]/*原始文件名*/
long length;/*原始文件长度(字节数)*/
long offset;/*原始文件在合并文件中的位置(偏移量)*/
}FileInfo;
在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记:
FileInfo EndF1ag={"Combined File",0,_offset};
其中_offset是第一个原始文件的控制信息在合并文件中的位置(偏移量)。
启动本程序的命令行的格式是:
程序名合并文件名[原始文件名]
如果不指定原始文件名,默认恢复合并文件中的所有原始文件。
程序中涉及的部分文件操作的库函数简要说明如下:
int fread (void *buffer,int size,int count,FILE *fbin):从二进制文件流fbin中读取count块长度为size字节的数据块到buffer指向的存储区。返回值为实际读取的数据块数。
int fwrite(void *buffer,int size,int count,FILE *fbin):各参数和返回值的意义与fread相同,但对文件进行写操作。
int fseek(FILE *fbin,long offset,int position):将文件流fbin的读/写位置以position为基准移动offset字节。position的值可以是SEEK_SET(文件头),SEEK_CUR(当前位置),SEEK_END(文件尾);offset为正,表示向文件尾方向移动,为负表示向文件头方向移动,为零表示到基准位置。
long ftell(FILE *fbin):返回文件流fbin的当前读/写位置(相对于文件头的偏移量)。上述偏移量均以字节为单位,即偏移字节数。
【程序】
#include <stdio.h>
#include<string.h>
typedef struct{char fname[256];long length;long offset;
}FileInfo;
void copyfile(FILE *fin,FILE *fout,int fsize)
{char buf[1024];int siz=1024;
while(fsize !=0){/*每次复制siz个字节,直至复制完fsize个字节*/
if(siz >fsize) (1) ;
fread(buf,1,siz,fin);fwrite(buf,1,siz,fout);
fsize= (2) ;}
}
int dofile(FILE *fin,FileInfo *inp)
{ long offset;
FILE *fout;
if((fout=fopen(inp->fname,"wb"))==NULL){
printf("创建文件错误:%s\n",inp->fname);
return 1;
}
offset= (3) ;/*保留合并文件读/写位置*/
fseek((4) );/*定位于被恢复文件首*/
copyfile(fin,fout,inp->length);
fclose(fout);
printf("\n---文件名:%\n文件长:%1d.
\n",inp->fname,inp->length);
(5) ;/*恢复合并文件读/写位置*/
return 0;
}
int main(int argc,char *argv[])
{FileInfo finfo;
char fname[256];FILE *fcmbn;
if(argc<2){printf("输入合并文件名:");scanf("%s",fname);}
else strcpy(fname,argv[1]);
if((fcmbn=fopen(fname,"rb"))==NULL){
printf("文件打开错误:%s\n",fname);return 1;
}
fseek(fcmbn,-sizeof(FileInfo),SEEK_END);/*定位于合并文件末尾的标志信息*/
fread(&finfo,1,sizeof(FileInfo),fcmbn);
if(finfo.length!=0 || strcmp(finfo.fnane,"CombinedFile")){
printf("指定的文件不是合法的合并文件\n");
fclose(fcmbn);return 2;
}
fseek(fcmbn,finfo.offset,SEEK_SET);/*定位于首个原始文件的控制信息*/
for(;;){/*恢复一个(argc>2)或全部(argc=2)原始文件*/
fread(&finfo,1,sizeof(FileInfo),fcmbn);
if(finfo.length==0)break;
if(argc>2 && strcmp(finfo.fname,argv[2]))continue;
if(dofile(fcmbn,&finfo)!=0)break;
}
fcolse(fcmbn);return 0;
}
●试题三
阅读下列函数说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
函数DelA_InsB(LinkedList La,LinkedList Lb,int key1,int key2,int len)的功能是:将线性表A中关键码为key1的结点开始的len个结点,按原顺序移至线性表B中关键码为key2的结点之前,若移动成功,则返回0;否则返回-1。线性表的存储结构为带头结点的单链表,La为表A的头指针,Lb为表B的头指针。单链表结点的类型定义为
typedef struct node {
int key;
struct node *next;
}*LinkedList;
【函数】
int DelA_InsB(LinkedList La,LinkdeList Lb,int key1,int key2,int len)
{LinkedList p,q,s,prep,pres;
int k;
if(!La->next||!Lb->next||len<=0)return-1;
p=La->next;prep=La;
while(p & & p- >key != key1){/*查找表A中键值为key1的结点*/
prep=p;p=p->next;
}
if(!p)return -1;/*表A中不存在键值为key1的结点*/
q=p;k=1;
while(q && (1) ){/*在表A中找出待删除的len个结点*/
(2) ;k++;
}
if(!q)return -1;/*表A中不存在要被删除的len个结点*/
s=Lb->next; (3) ;
while(s && s->key !=key2){/*查找表B中键值为key2的结点*/
pres=s;s=s->next;
}
if(!s)return -1;/*表B中不存在键值为key2的结点*/
(4) =q->next;/*将表A中的len个结点删除*/
q->next= (5) ;
pres->next=p;/*将len个结点移至表B*/
return 0;
}