计算机二级C语言上机真题(85)【附详解】
【真题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 厘米*/
}
}
反向对角线对应位置上元素中的值进行交换。例如,若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 厘米*/
}
}