【真题1】 下列给定程序中,函数fun()的功能是:输出M 行M 列整数方阵,然后 求两条对角线上的各元素之和,返回此和数。 试题程序: #include < conio.h >#include < stdio.h >#define M 5 ___1___ fun(int n,int xx[][M]) { int i, j,___ 2___; printf("\nThe %d x %d matrix:\n",M,M); for(i=0;i< M;i++) { for(j=0;j< M;j++) printf("%4d",xx[i][j]); printf("\n"); } for(i=0;i< n;i++) sum+=___3___; return(sum); } main() { int aa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7} }; printf("\nThe sum of all elements on 2 diagnals is %d",fun(M,aa)); } (2011年2月) 解析: 填空1:由main 函数的调用语句可知fun函数的类型是int型的,也 可由返回值语句判断得知。 填空2:我们知道在C语言中每个变量在运算之前都必须被赋值,由循环中对 sum 的操作可知它是作为累加变量使用的,那么它的初值就得被赋为0。 填空3:由题意可知,程序的要求是在输出方阵的同时还要算出两个对角线元素 的值的和,关键是如何表达这两个元素在方阵中的位置。 答案:【1】int 【2】sum=0 【3】xx[i][i]+xx[i][n-i-1] 【真题2】 给定程序modi.c 中,函数fun 的功能是:用冒泡法对6 个字符串按由 大到小的顺序进行排序。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main 函数, #include < stdio.h >#include < conio.h >#define MAXLINE 20 fun(char *pstr[6]) { int i,j; char *p; for (i=0;i< 5;i++) { for(j=i+1;j< 6;j++) { /************found************/ if(strcmp(*(pstr+i),pstr+j)< 0) { p=*(pstr+i); /************found************/ *(pstr+i)=pstr+j; *(pstr+j)=p; } } } } main() {int i; char *pstr[6],str[6][MAXLINE]; clrscr(); for(i=0;i< 6;i++) pstr[i]=str[i]; printf("\nEnter 6 string(1 string at each line):\n"); for (i=0;i< 6;i++) scanf("%s",pstr[i]); fun(pstr); printf("The strings after sorting:\n"); for(i=0;i< 6;i++) printf("%s\n",pstr[i]); } (2011年2月) 解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错 误的重要前提。 程序中的重要思想如下: 1、建立了一个二维字符串数组,用于存放用户输入的6 个字符串; 2、建立了一个指针数组,目的是用6 个指针分别指向6 个字符串; 3、函数fun()的形参只有一个,即指针数组pstr[],这表明要想在函数fun() 中对6 个字符串进行操作,只能通过pstr[]中的6个指针。 题中第一个错误是在应用函数strcmp()的时候:观察源程序可以发现,在程序 中使用strcmp()函数的原意是为了判断字符串str[i]与str[i+1]两者的大小, 在fun()函数中只能通过指针来引用各个字符串,故应当使用*(pstr+x)的形式 来表示,而在使用strcmp()字符串比较函数的时候,第二个参数没有正确的表 示一个字符串,所以应当将"pstr+j"改为"*(pstr+j)"; 题中第二个错误是在函数fun()中的语句" *(pstr + i) = pstr + j ;"处,此语 句的原意是进行字符串的赋值操作,错误和第一个错误大致是一样的,所以应 当将"pstr+j"改为"*(pstr+j)"。 在函数中通过指针引用字符串的方式是灵活的,譬如本题中也可以使用 pstr[i]、pstr[j]类似的方法进行表示。 【真题3】 请编制函数void Mtrx(int n),输出一个如下的n 阶方阵。变量n 从文 件c9670503.in 中读取。 例如,若读入 4 或 5 ,则分别输出 1 2 3 4 或 1 2 3 4 5 8 7 6 5 10 9 8 7 6 9 10 11 12 11 12 13 14 15 16 15 14 13 20 19 18 17 16 25 24 23 22 21 注意:此程序存贮在prog.c中。 请勿改动主程序main 中的任何内容,仅在函数Mtrx 的横线处填入适当的内容并删 除横线。 #include < conio.h >#include < stdio.h >#define M 10 /* 本程序中的fopen、fprintf 和fclose 与考生无关 */ void Mtrx( int n ) { int a[M]={0},d=0, i, j, k; FILE *fp ; fp=fopen("dat52.dat","w"); for( i = 1 ; i < = n; i++ ) { for( j=0; j< n; j++ ) { ___(1)___; a[j]=d; } if (i % 2) for( k=0; k < n ; k++ ) { printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ; } else for( ____(2)____ ) { printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ;} ___(3)___ fprintf(fp, "\n"); } fclose(fp); } main() { int n; FILE *fp ; clrscr(); fp=fopen("c9670503.in","r"); fscanf(fp, "%d", &n ); fclose(fp); Mtrx( n ); } (2011年2月) 解析: (1). d += 1 (2). k=n-1;k >=0;k-- (3). printf("\n"); 本题的考核点是C 语言中的嵌套循环。 解题思路:对于一个二维矩阵进行计算,常常采用嵌套循环来实现。Mtrx 函数 中外循环是行循环,内循环是列循环。填空(1)部分为列循环输出准备数据,这 里应将d递增1。然后通过判断奇偶行而按不同的顺序输出数据,当为偶数行 执行填空(2)部分时,此时应从大到小输出数据,所以应从n-1到0 输出 a[k]。填空(3)使屏幕上的光标换行。 #include < conio.h > #include < stdio.h > #define M 10 /* 本程序中的fopen、fprintf和fclose与考生无关 */ void Mtrx( int n ) { int a[M]={0},d=0, i, j, k; FILE *fp ; fp=fopen("dat52.dat","w"); for( i = 1 ; i < = n; i++ ) { for( j=0; j< n; j++ ) {d += 1; a[j]=d; } if (i % 2) for( k=0; k < n ; k++ ) { printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ; } else for( k=n-1;k >=0;k-- ) { printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ;} printf("\n"); fprintf(fp, "\n"); } fclose(fp) ; } |