【真题1】 下列给定程序中,函数fun()的功能是:给一维数组a输入任意4 个整 数,并按如下的规律输出。例如输入1,2,3,4,程序运行后输出以下方阵: 4 1 2 3 3 4 1 2 2 3 4 1 1 2 3 4 试题程序: #include < stdio.h >#define M 4 void fun(__1__) { int i,j,k,m; printf("Enter 4 number: "); for(i=0;i< M;i++) scanf("%d",__2__); printf("\n\nThe result :\n\n "); for(i=M;i >0;i--) { k=a[M-1]; for(j=M-1;j >0;j--) a[j]=a[j-1]; __3__; for(m=0;m< M;m++) printf("%d ",a[m]); printf("\n "); } } main() { int a[M]; fun(a); printf("\n\n "); } 解析: 填空1:注意main 函数对fun 函数的调用语句,实参是一个整型指针 变量,所以这里也应该是一个指针变量,分析程序可知这个变量是a。 填空2:这里考查的是对scanf函数的掌握,由我们对C语言的学习可知,这 里应该是一个变量地址,再看题目要求可知这里要输入一个4元的一维数组, 就可以得到答案。 填空3:理解题目要求后,分析内层for循环可知每循环一次都将数组前一个值 赋给后一个,那么第一个元素的值是多少呢?注意外层for 循环的第一条语句可 以知道将k赋给每行第一个元素。 答案:【1】int *a 【2】&a[i] 【3】a[0]=k 【真题2】 文件modi.c 中程序的功能是:读入整数m 和n(0≤m,n≤3),按下 面的公式计算函数ACK 的值并输出。 ┌ n + 1, m = 0 ACK( m ,n ) = ┤ ACK(m - 1, 1), n = 0 └ ACK(m - 1, ACK(m, n - 1) ) m,n >0 例如,若输入3 和2,则应输出29。 请改正程序中的错误,使它能计算出正确的结果。 注意: #include < conio.h >#include < stdio.h >long ACK( long m, long n ) { long k; if( m == 0 ) k = n + 1; else if( n == 0 ) k = ACK( m - 1, 1 ); else /************found**********/ k = ACK( m - 1, ACK( m - 1, n - 1 ) ); return( k ); } main() { long m, n; clrscr(); printf( "\nPlease enter 2 numbers:\n" ); scanf( "%ld %ld", &m, &n ); /************found**********/ printf( "\nThe value of Ackerman function is &d\n", ACK( m, n ) ); } 解析: 本题的考核点是C语言中if选择语句和printf输出函数的使用。 从题目的要求来看,如果m和n 都不等于0 时,ACK( m, n) = ACK(m - 1, ACK(m, n - 1) ),显然原程序给出的ACK函数中" k = ACK( m - 1, ACK( m - 1, n - 1 ) )"是不符合条件的,应改成"k=ACK(m-1,ACK(m,n- 1) );"或相同作用的语句。 另外,因为C 语言中printf函数格式字符串的前缀应是%,而不是&,所以应 将原程序中的"printf( "\nThe value of Ackerman function is &d\n", ACK( m, n ) );"改为"printf("\nThe value of Ackerman function is %d\n",ACK(m,n) );"或相同作用的语句。 【真题3】 编写程序,实现矩阵(3 行3 列)的转置(即行列互换)。 例如,输入下面的矩阵: 100 200 300 400 500 600 700 800 900 程序输出: 100 400 700 200 500 800 300 600 900 注意: 部分源程序存在文件prog.c 中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < stdio.h >#include < conio.h >int fun(int array[3][3]) {……} main() { int i,j; int array[3][3]={{100,200,300}, {400,500,600}, {700,800,900}}; clrscr(); for (i=0;i< 3;i++) { for (j=0;j< 3;j++) printf("%7d",array[i][j]); printf("\n"); } fun(array); printf("Converted array:\n"); for(i=0;i< 3;i++) { for(j=0;j< 3;j++) printf("%7d",array[i][j]); printf("\n"); } } (2011年2月) 解析: 本题的考核点是3 行3列矩阵转置算法。 提示思路:通过两重循环和一个中间数组完成转置。方法是通过循环将原数组 中的i行j列上的数赋值给中间数组的j 行i 列,最后再将中间数组的值赋给原 数组,形成转置后的矩阵。 int fun(int array[3][3]) { int i,j;int b[3][3]; for (i=0;i< 3;i++) for (j=0;j< 3;j++) b[j][i]=array[i][j];/*将矩阵行列互换*/ for (i=0;i< 3;i++) for (j=0;j< 3;j++) array[i][j]=b[i][j];/*将b数组中的数据原封不动的保存在array 数组中*/ } |