●试题三
阅读下列程序说明和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;
}
●试题八
阅读以下说明和Java代码,将解答写入答题纸的对应栏内。
【说明】
下面的程序是从命令行输入3个数传递到public static void main(String args[])方法中(如 java IsTriangle 3 4 5),并判断这3个数能否构成三角形的3条边,并显示相应的结果。请在程序的每条横线处填入适当的语句,使程序的功能完整。
注意:请勿改动main()主方法和其他已有的语句内容,仅在横线处填入适当的语句。
public class IsTriangle{
public static void main(String args[]){
int a[]=new (1) [args. (2) ];
for(int i=0;i<3; (3) )
{
a[i]= (4)
}
if((5) )
System.out.println(a[0]+ ","+a[1]+ ","+a[2]"能构成三角形的3条边");
else
System.out.println(a[0]+ ","+a[1]+ ","+a[2] "不能构成三角形的3条边");
}
}
●试题六
阅读以下应用说明及Visual Basic部分程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
单击窗体上的"测试"(cmdTest)按钮,出现一个输入框,要求输入一串字符,将该字符串中的非字母字符删除后,显示在窗体中的一个文本框(txtShow)中。
【程序代码】
Private Sub cmdTest_Click()
Dim strT1,strT2 As String
Dim strCh As (1)
Dim intL As Integer
Dim intI As Integer
strT1= (2) ("请输入一串字符","字符串输入")
intL= (3)
strT2=″″
For intI=l To intL
strCh=Mid(strT1,intI,1)
If(strCh>"A"And (4) ) Or (strCh>"a" And suCh<"z")Then
strT2=strT2+strCh
End If
Next intI
txtShow.Text= (5)
End sub