【真题1】 给定程序中,函数fun 的功能是:将N×N 矩阵主对角线元素中的值与 反向对角线对应位置上元素中的值进行交换。例如,若N=3,有下列矩阵: 1 2 3 4 5 6 7 8 9 交换后为: 3 2 1 4 5 6 9 8 7 #include < stdio.h >#define N 4 /**********found**********/ void fun(int ___1___ , int n) { int i,s; /**********found**********/ for(___2___; i++) { s=t[i][i]; t[i][i]=t[i][n-i-1]; /**********found**********/ t[i][n-1-i]=___3___; } } main() { int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10}, i, j; printf("\nThe original array:\n"); for(i=0; i< N; i++) { for(j=0; j< N; j++) printf("%d ",t[i][j]); printf("\n"); } fun(t,N); printf("\nThe result is:\n"); for(i=0; i< N; i++) { for(j=0; j< N; j++) printf("%d ",t[i][j]); printf("\n"); } } (2011年2月) 解析: 本题考查的是二维数组的用法。 由于在主函数中存在语句"fun(t,N);",知函数fun的第一个形参为一个二维数 组,在C 中定义数组时对第一维的长度可以不指定,但第二维的长度不能省, 另由于在函数fun 中有未定义的二维数组变量t,故第一空应为t[][N]或其等效 形式;由于数组t的行列数为n,故在执行交换时,一共需要执行n 次,并且由 循环体中的语句知,i的起始值为0,故第二空为i=0;i< n;在本题中,交换两 个数是通过中间变量来实现的,假设要交换的数据为a,b,我们可以利用中间变 量t来完成交换,执行语句如下:t=a;a=b;b=t;,根据该思想,第三处应填入 的语句为s。 答案:【1】t[][N] 【2】i=0;i< n; 【3】 【真题2】 给定程序modi.c 中,函数fun 的功能是:通过某种方式实现两个变量 值的交换,规定不允许增加语句和表达式。例如变量a 中的值为3,b 中的值原为 8,程序运行后a 中的值为8,b中的值为3。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数, #include < conio.h >#include < stdio.h >int fun(int *x,int y) { int t; /************found************/ t=x;x=y; /************found************/ return(y); } main() { int a=3,b=8; clrscr(); printf("%d %d\n",a,b); b=fun(&a,b); printf("%d %d\n",a,b); } (2011年2月) 解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错 误的重要前提。 程序中的重要思想如下: 1、本题的主要目的是交换两个变量的值,在这样的任务中,合理的利用中间变 量是个清晰明了的好方法; 2、观察题目,可以发现函数fun()的函数声明中有不少玄虚,第一个形参是一 个地址,第二个形参是一个整型变量。 本题中的第一个错误发生在函数fun()中的赋值语句中: "t = x ; x = y ;",通过前面的分析,我们可以知道,在此变量x代表的是一 个地址,所以以上两条赋值语句运算符两端不匹配,应当更正为 "t=*x;*x=y;",这样才可以进行正常的赋值工作; 本题中的第二个错误发生在函数fun()的返回值产生时: "return(y);",结合程序上下文,可以知道,该函数的返回值实际上是为了将原 来的a值赋给b,而看看函数fun(),y(即原来的b值)始终未动,而原来的 a值现在已经存放到了中间变量t中,所以,这时我们返回的应当是t的值,故 更改为"return(t);"。 【真题3】 请编一个函数int day(int k,int m,int n),其功能是:返回小蚕需要多 少天才能爬到树顶(树高k 厘米,小蚕每天白天向上爬m 厘米,每天晚上因睡觉向 下滑n 厘米,爬到顶后不再下滑)(n<m<k)。 例如,若分别 输入253、71、29 给 k、m、n,则输出结果为:6。 注意:此程序存贮在prog.c中。 请勿改动主程序main、函数WriteData 和函数compute 中的任何内容,仅在函数 day 的花括号中填入你编写的若干语句。 #include < conio.h >#include < stdio.h >int day( int k, int m, int n ) {……} main() { int k, m, n; clrscr(); printf("\nPlease enter 3 numbers: "); scanf("%d %d %d", &k, &m, &n ); printf( "\nFor %d days, worm will be at the top.",day(k,m,n)); compute(); } /* 以下部分与考生答题无关, 考生不必阅读, 但不得进行任何修改 */ WriteData(int num) { FILE *fp; fp = fopen("dat92.dat", "w") ; fprintf(fp, "%d", num); fclose(fp); } compute() { int k, m, n; FILE *fp; fp=fopen("c9670903.in","r"); fscanf(fp, "%d %d %d", &k, &m, &n ); fclose(fp); WriteData(day(k,m,n)); } (2011年2月) 解析: 本题的考核点是C语言中的循环语句和条件判断语句的使用。 提示思路:在参考程序中用一个for 循环来统计天数,如果小蚕某一天白天爬到 了树顶,则它就不会再往下滑。因此我们应先判断小蚕是否是在白天爬到树 顶,如果已经爬到了树顶就直接返回天数。 int day( int k, int m, int n ) {int days, height = 0; for(days = 1;; days ++) /*for 循环用来统计天数*/ { height += m; /*height用于计算小蚕向上爬的高度*/ if ( height >= k ) return days; /*如果小蚕白天爬到了树顶,则返加天数 days*/ height -= n; /*否则到晚上小蚕因睡觉向下滑n 厘米*/ } } |