2001年度程序员级下午试题

考试总分:5分

考试类型:模拟试题

作答时间:60分钟

已答人数:967

试卷答案:有

试卷介绍: 2001年度程序员级下午试题

开始答题

试卷预览

  • 1. 试题一阅读下列程序或函数说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。[函数1.1说明]函数strcmp()是比较两个字符串s和t的大小。若st,函数返回正数。[函数1.1]intstrcmp(char*s,char*t){while(*s&&*t&&__(1)__){s++;t++;}return__(2)__;}[程序1.2说明]在n行n列的矩阵中,每行都有最大的数,本程序求这n个最大数中的最小一个[程序1.2]#include〈stdio.h〉#defineN100inta[N][N];voidmain(){introw,col,max,min,n;/*输入合法n(〈100),和输入m×n个整数到数组a的代码略*/for(row=0;row<n;row++){for(max=a[row][0],col=l;col<n;col++)if(__(3)__)max=a[row][col];if(__(4)__)min=max;elseif(__(5)__)min=max;}printf("Theminofmaxnumbersis%d\n",min);}[15分]

    A(1)__){s++;t++;}return__

    B(2)__;}[程序1.2说明]在n行n列的矩阵中,每行都有最大的数,本程序求这n个最大数中的最小一个[程序1.2]#include〈stdio.h〉#defineN100inta[N][N];voidmain(){introw,col,max,min,n;/*输入合法n(〈100),和输入m×n个整数到数组a的代码略*/for(row=0;row<n;row++){for(max=a[row][0],col=l;col<n;col++)if(__

    C(3)__)max=a[row][col];if(__

    D(4)__)min=max;elseif(__

    E(5)__)min=max;}printf("Theminofmaxnumbersis%d\n",min);}[15分]

  • 2. 试题二阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。[程序2说明]本程序中的函数first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元;函数reverse_copy()的功能是按已知链表复制出一个新链表,但新链表的表元链接顺序与已知链表的表元链接顺序相反;函数print_link()用来输出链表中各表元的值;函数free_link()用来释放链表全部表元空间。[程序2〕#include〈stdip.h〉#include〈malloc.h〉typedefstructnode{intval;structnode*next;}NODE;voidfirst_insert(NODE**p,intv){NODE*q=(NODE*)malloc(sizeof(NODE));q->va1=v;__(1)__;*p=__(2)__;}NODE*reverse_copy(NODE*p){NODE*u;for(u=NULL;p;p=p->next)first_insert(__(3)__);returnu;}voidprint_link(NODE*p){for(;__(4)__)printf("%d\t",p->val);printf("\n");voidfree_link(NODE*p){NODE*u;while(p!=NULL){u=p-〉next;free(p);__(5)__;}}voidmain(){NODE*link1,*link2;inti;linkl=NULL;for(i=1;i<=10;i++)firstinsert(&link1,i);link2=revere_copy(link1);print_link(link1);freeJink(linkl);print_link(link2);free_link(link2);}[15分]

    A(1)__;*p=__

    B(2)__;}NODE*reverse_copy(NODE*p){NODE*u;for(u=NULL;p;p=p->next)first_insert(__

    C(3)__);returnu;}voidprint_link(NODE*p){for(;__

    D(4)__)printf("%d\t",p->val);printf("\n");voidfree_link(NODE*p){NODE*u;while(p!=NULL){u=p-〉next;free(p);__

    E(5)__;}}voidmain(){NODE*link1,*link2;inti;linkl=NULL;for(i=1;i<=10;i++)firstinsert(&link1,i);link2=revere_copy(link1);print_link(link1);freeJink(linkl);print_link(link2);free_link(link2);}[15分]

  • 3. 试题三阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。[程序3说明]本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为:typedefstmct{charfnme[256];/*原始文件名*/longlength;/*原始文件长度(字节数)*/longoffset;/*原始文件在合并文件中的位置(偏移量)*/}FileInfo;在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记:F11ek1foEndF1ag={"CombinedFile".0,_offset};其中_offset是第一个原始文件的控制信息在合并文件中的位置(偏移量)。启动本程序的命令行的格式是:程序名合并文件名[原始文件名]如果不指定原始文件名,默认恢复合并文件中的所有原始文件。程序中涉及的部分文件操作的库函数简要说明如下:intfread(void*buffer,intsize,intcount,FILE*fbin):从二进制文件流fbin中读取count块长度为size字节的数据块到buffer指向的存储区。返回值为实际读取的数据块数。intfwrite(void*buffer,intsize,intcount,FILE*fbin):各参数和返回值的意义与fread相同,但对文件进行写操作。intfseek(FILE*fbin,longoffset,intposition):将文件流fbin的读/写位置以position为基准移动offset字节。position的值可以是SEEK_SET(文件头),SEEK_CUR(当前位置),SEEK_END(文件尾);offset为正表示向文件尾方向移动,为负表示向文件头方向移动,为零表示到基准位置。longftell(FILE*fbin):返回文件流fbin的当前读/写位置(相对于文件头的偏移量)。上述偏移量均以字节为单位,即偏移字节数。[程序3]#include〈stdio.h〉#include〈string.h〉typedefstruct{charfname[256];longlength;longoffset;}}FileInfo;voidcopyfile(FILE*fin,FILE*fout,intfsiz){charbuf[1024];intsiz=1024;while(fsiz!=0){/*每次复制siz个字节,直至复制完fsiz个字节*/if(siz>fsiz)__(1)__;fread(buf,1,siz,fin);fwrite(buf,1,siz,fout);fsiz=__(2)__;}}intdofile(FILE*fin,FileInfo*inp){longoffset;FILE*fout;if((fout=fopen(inp-〉fname,"wb"))=NULL){printf("创建文件错误:%s\n",inp-〉fname);return1;}offset=__(3)__;/*保留合并文件读/写位置*/fseek(__(4)__);/*定位于被恢复文件首*/copyfile(fin,fout,inp-〉length);fclose(fout);printf("\n---文件名:%\n文件长:%1d.\n",inp-〉fname,inp-〉length);__(5)__;/*恢复合并文件读/写位置*/return0;}intmain(intargc,char*argv[]){FileInfofinfo;charfname[256];FILE*fcmbn;if(argc2)或全部(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;}fclose(fcmbn);return0;}[15分]

    A(1)__;fread(buf,1,siz,fin);fwrite(buf,1,siz,fout);fsiz=__

    B(2)__;}}intdofile(FILE*fin,FileInfo*inp){longoffset;FILE*fout;if((fout=fopen(inp-〉fname,"wb"))=NULL){printf("创建文件错误:%s\n",inp-〉fname);return1;}offset=__

    C(3)__;/*保留合并文件读/写位置*/fseek(__

    D(4)__);/*定位于被恢复文件首*/copyfile(fin,fout,inp-〉length);fclose(fout);printf("\n---文件名:%\n文件长:%1d.\n",inp-〉fname,inp-〉length);__

    E(5)__;/*恢复合并文件读/写位置*/return0;}intmain(intargc,char*argv[]){FileInfofinfo;charfname[256];FILE*fcmbn;if(argc2)或全部(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;}fclose(fcmbn);return0;}[15分]

  • 4. 试题五阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。[程序5说明]本程序采用递归算法将一个自然数n分解成不多于m个整数之和。设构成和数n的各个整数取于数组d,d中的整数互不相等且由大到小存储。例如,数组d中存储以下整数:d[]={100,81,64,49,36,25,16,9,4,1},则有:nm程序运行后的输出1002100=10013213=9+4142Noanswer(9+4+1超过2个)71571=49+9+9+4(表示可重复取数)函数End()的形参c表示d中可取的整数个数;形参pd指向能成为和数的整数的存放位置。[程序5]#include〈stdio.h〉#defineN20intfind(intn,intm,int*d,intc,int*pd){intr;if(n==0)return0;/*已分解完成*/if(m==0||c==0)return-1;/*不可以分解*/if(__(1)__)returnfind(n,m,d+1,c-1,pd);else{*pd=*d;r=find(__(2)__,d,c,__(3)__);/*继续对剩余数作分解*/if(r>=0)return__(4)__;returnfind(n,m,__(5)__,pd);}}voidmain(){intn,m,k,i,p[N],*pptr=p;intd[]={100,81,64,49,36,25,16,9,4,1};printf("Entern,m:";scanf(%d%d,&n,&m);k=find(n,m,d,10,pptr);if(k<=O)printf("Noanswer!\n");else{printf("%d=%d",n,p[0]);for(i=l;i<k;i++)printf("+%d",p[i]);printf("\n");}[15分]

    A(1)__)returnfind(n,m,d+1,c-1,pd);else{*pd=*d;r=find(__

    B(2)__,d,c,__

    C(3)__);/*继续对剩余数作分解*/if(r>=0)return__

    D(4)__;returnfind(n,m,__

    E(5)__,pd);}}voidmain(){intn,m,k,i,p[N],*pptr=p;intd[]={100,81,64,49,36,25,16,9,4,1};printf("Entern,m:";scanf(%d%d,&n,&m);k=find(n,m,d,10,pptr);if(k<=O)printf("Noanswer!\n");else{printf("%d=%d",n,p[0]);for(i=l;i<k;i++)printf("+%d",p[i]);printf("\n");}[15分]

  • 5. 试题四阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。[程序4说明]设一个环上有编号为0~n-1的n粒不同颜色的珠子(每粒珠子颜色用字母表示,n粒珠子颜色由输入的字符串表示)。以环上某两粒珠子间为断点,从断点一方按顺时针方向取走连续同色的珠子,又从断点另一方按逆时针方向对剩下珠子取走连续同色的珠子,两者之和为该断点可取走珠子的粒数。移动断点,能取走的珠子数不尽相同。本程序找出可以取走最多的珠子数及断点的位置。程序中用双向链表存储字符串。例如,编号为0-9的10粒珠子颜色的字符串为“aaabbbadcc",对应链表为:若在2号与3号珠子间为断点,共可取走6粒珠子,且为取走的珠子数最多。[程序4]#include〈stdio.h〉#include〈string.h〉#include〈malloc.h〉typedefstructnode{chard;structnode*fpt;/*后继指针*/structnode*bpt;/*前趋指针*/}NODE;NODE*building(char*s)/*生成双向循环链表*/{NODE*p=NULL,*q;while(*s){q=(NODE*)malloc(sizeof(NODE));q->ch=*s++;if(p=NULL)p=q->fpt=q->bt=q;else{p->bpt->fpt=q;q->fpt=p;q-〉bpt=__(1)__;__(2)__;}}return}intcount(NODE*start,intmaxn,intstep)/*求可取走珠子粒数*/{intcolor,c;NODE*p;color=-1;C=0;for(p=start;cO?p->fpt;p->bpt){if(color==-1)color=p->ch;elseif(__(3)__)break;c++}return}intfind(char*s,int*cutpos)/*寻找取走珠子数最多的断点和粒数*/{inti,c,cut,maxc=0,1en=strlen(s);NODE*p;if((p=building(s))=NULL){*cu1tpos=-1;return-1;}i=0;do{c=count(p,1en,1);c=c+__(4)__;if(c>maxc){maxc=c;cut=i;}__(5)__;i++;}while(i<len);*cutpos=cut;returnmaxc;}voidmain(){intcut,max;chars[120];scanf(,%s',s);max=find(s,&cut);printf("Cutposition=%d,Number=%d.\n",cut,max);}[15分]

    A(1)__;__

    B(2)__;}}return}intcount(NODE*start,intmaxn,intstep)/*求可取走珠子粒数*/{intcolor,c;NODE*p;color=-1;C=0;for(p=start;cO?p->fpt;p->bpt){if(color==-1)color=p->ch;elseif(__

    C(3)__)break;c++}return}intfind(char*s,int*cutpos)/*寻找取走珠子数最多的断点和粒数*/{inti,c,cut,maxc=0,1en=strlen(s);NODE*p;if((p=building(s))=NULL){*cu1tpos=-1;return-1;}i=0;do{c=count(p,1en,1);c=c+__

    D(4)__;if(c>maxc){maxc=c;cut=i;}__

    E(5)__;i++;}while(i<len);*cutpos=cut;returnmaxc;}voidmain(){intcut,max;chars[120];scanf(,%s',s);max=find(s,&cut);printf("Cutposition=%d,Number=%d.\n",cut,max);}[15分]

相关试卷
相关题库