计算机二级C语言上机真题(56)【附详解】
【真题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 数组中*/
}
数,并按如下的规律输出。例如输入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 数组中*/
}