1、【
简答题】
试题一
阅读下列程序或函数说明和 C 代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[函数1.1说明]
函数strcmp()是比较两个字符串 s 和 t 的大小。若 s < t 函数返回负数;若 s = t 函数返回0;若 s > t,函数返回正数。
[函数1.1]
int strcmp(char *s,char *t)
{ while ( *s && *t && __(1)__){
s++;t++ ;
}
return __(2)__;
}
[程序1.2说明]
在 n 行 n 列的矩阵中,每行都有最大的数,本程序求这 n 个最大数中的最小一个
[程序1.2]
#include〈stdio.h〉
#define N 100int a[N][N];
void main()
{ int row ,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;
else if(__(5)__) min = max;
}
printf ("The min of max numbers is %d\n",min);
}
[15分]
解析:
(1) *s == *t
(2) *s - *t
(3) a[row][col] > max
(4) row == 0
(5) max < min
2、【
简答题】
试题二
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序2说明]
本程序中的函数 first_insert() 的功能是在已知链表的首表元之前插入一个指定值的表元;函数 reverse_copy() 的功能是按已知链表复制出一个新链表,但新链表的表元链接顺序与已知链表的表元链接顺序相反;函数 print_link() 用来输出链表中各表元的值;函数 free_link()用来释放链表全部表元空间。
[程序2〕
#include〈stdip.h〉
#include〈malloc.h〉
typedef struct node{ int val;
struct node *next;} NODE;
void first_insert( NODE **p,int v)
{ 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)__);
return u;
}
void print_link( NODE *p )
{ for( ;__(4)__) printf ("%d\t" , p -> val);
printf("\n");
void free_link(NODE*p)
{ NODE *u;
while( p != NULL){ u=p-〉next;free( p );__(5)__;}
}
void main()
{ NODE *link1 , *link2;
int i ;linkl = NULL ;
for( i = 1;i <= 10 ; i++ )
first insert( &link1,i );
link2 = revere_ copy(link1);
print_link(link1);freeJink(linkl);
print_link(link2);free_link(link2);
}
[15分]
解析:
(1) q ->ncxt = *p
(2) q
(3) &u ,p->val
(4) p != NULL; p = p->next
(5) p = u
3、【
简答题】
试题三
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序3说明]
本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为:
typedef stmct{char fnme[256];/*原始文件名*/
long length;/*原始文件长度(字节数)*/
long offset;/*原始文件在合并文件中的位置(偏移量)*/
}FileInfo;
在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记:
F11ek1fo 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 的当前读/写位置(相对于文件头的偏移量)。上述偏移量均以字节为单位,即偏移字节数。
[程序3]
#include〈stdio.h〉
#include〈string.h〉
typedef struct{char fname[256];long length;long offset;}
}FileInfo;
void copyfile( FILE *fin, FILE *fout, int fsiz)
{ char buf[1024]; int siz = 1024 ;
while(fsiz != 0) { /*每次复制siz个字节,直至复制完fsiz个字节*/
if ( siz > fsiz) __(1)__ ;
fread( buf , 1 , siz , fin ) ; fwrite( buf , 1 , siz , fout );
fsiz = __(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.fmane , "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 ;
}
fclose( fcmbn ) ; return 0 ;
}
[15分]
解析:
(1) siz = fsiz
(2) fsiz-siz
(3) ftell(fin)
(4) fin,inp->offset, SEEK_SET
(5) feesk(fin ,offset, SEEK_SET)