计算机二级C语言上机真题(48)【附详解】
【真题1】 以下程序可把输入的十进制数以十六进制数的形式输出。
请在横线上填上适当的内容并把横线删除,使它能得出正确的结果。
试题程序:
#include < stdio.h >main()
{char b[17]={"0123456789ABCDEF"};
int c[64],d,i=0,base=16;
long n;
printf("Enter a number:\n"); scanf("%ld",&n);
do {
c[i]=___1__;i++;n=n/base;}
while(n!=0);
printf("Transmite new base:\n");
for(___2____;i >=0;--i)
{ d=c[i];printf("%c",b__3___);}
printf("\n");
}
(2011年2月)
解析: 填空1:在该程序中,字符数组b存储十六进制的16 个数值,整型数
组c 存储译出的十六进制数的各位数值。从整数n 译出它的各位十六进制数
值,需采用除16 取余的方法,即求n除16 的余,得到它的十六进制的个位
数,接着将n 除以16。在n不等于0 的情况下循环,能顺序求出n 的十六进
制的个位数、十位数、百位数等。程序中变量base已预置16,所以在第1 个
空处可填代码n%base或n%16。
填空2:我们注意,在do - while循环中i的自加语句将在循环判断结束之前
执行,也就是说退出循环之后i的值比c 数组实际用到的下标值要大1,因此在
for 循环中对i先自减再运算,可以正确调用存在c数组中的16进制数。
填空3:当n 的十六进制数的个位、十位、百位等依次存放于数组c 中后,就
从最高位至最低位,参照数组c[i]的内容d(以其内容为下标),取十六进制数
字符表中的字符b[d]输出。所以第3个空可填入代码[d] 。
答案:【1】n%base或n%16 【2】--i 【3】[d]
【真题2】 给定程序modi.c 中,函数fun 的功能是:按顺序给s 所指数组中的元
素赋予从1 开始的奇数,然后再按顺序对每五个元素求一个平均值,并将这些值依次
存放在w 所指的数组中,若s所指数组中元素的个数不是5 的倍数,多余部分忽略
不计。
例如,s 所指数组有14 个元素,则只对前10 个元素进行处理,不对最后的4 个元
素求平均值。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >#define SIZE 20
fun(double *s,double *w)
{ int k,i; double sum;
for (k=1,i=0;i< SIZE;i++)
{ s[i]=k; k+=2; }
/************found************/
sun=0.0;
for(k=0,i=0;i< SIZE;i++)
{ sum+=s[i];
/************found************/
if (i+1%5==0)
{ w[k]=sum/5;sum=0;k++;}
}
return k;
}
main()
{ double a[SIZE],b[SIZE/5];
int i,k;
k=fun(a,b);
printf("The original data:\n");
for (i=0;i< SIZE;i++)
{ if(i%5==0) printf("\n");
printf("%4.0f",a[i]);
}
printf("\n\nThe result:\n");
for(i=0;i< k;i++) printf("%6.2f ",b[i]);
printf("\n\n");
}
(2011年2月)
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
本题中的第一个错误:在函数中,未对变量sun 进行定义,由程序可知,函数
通过变量sum 来累计和值,需先为sum 赋初值0,所以程序中语句
"sun=0.0;"应改为"sum=0.0;"或相同作用的语句。
本题中的第二个错误:要注意算术运算符的优先级:*、/→%→+、-,由题意
可知,条件语句是用来判断元素的个数是不是5的倍数,所以程序中语句"if
(i+1%5==0)"应改为"if ((i+1)%5==0)"或相同作用的语句。
【真题3】 请编写函数fun,其功能是:计算并输出3 到n 之间所有素数的平方根
之和。
例如,在主函数中从键盘给n 输入100 后,
输出为:sum=148.874270。
注意:要求n 的值大于2 但不大于100。
部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < math.h >#include < stdio.h >double fun(int n)
{……}
main()
{ int n; double sum;
printf("\n\nInput n: "); scanf("%d",&n);
sum=fun(n);
printf("\n\nsum=%f\n\n",sum);
}
(2011年2月)
解析: 本题的考核点是查找素数的算法以及开根函数的应用。
解题思路:从3 到指定数n,找出所有的素数,素数的判断方法是:只能被1
和其自身整除,而不能被其它任何数整除的数;sqrt(x)函数是计算x的平方
根。
#include < math.h >
#include < stdio.h >
double fun(int n)
{int i,j=0; /*定义两个整型变量*/
double s=0; /*定义变量s 为双精度型*/
for (i=3;i< =n;i++)
{ for (j=2;j< i;j++)
if (i%j==0) break; /*如果i能被j整除就说明i 不是素数,继而退出循环体
*/
if (j==i) s=s+sqrt(i); /*sqrt(i)函数是计算i的平方根*/
}
return s; /*返回结果*/
}
请在横线上填上适当的内容并把横线删除,使它能得出正确的结果。
试题程序:
#include < stdio.h >main()
{char b[17]={"0123456789ABCDEF"};
int c[64],d,i=0,base=16;
long n;
printf("Enter a number:\n"); scanf("%ld",&n);
do {
c[i]=___1__;i++;n=n/base;}
while(n!=0);
printf("Transmite new base:\n");
for(___2____;i >=0;--i)
{ d=c[i];printf("%c",b__3___);}
printf("\n");
}
(2011年2月)
解析: 填空1:在该程序中,字符数组b存储十六进制的16 个数值,整型数
组c 存储译出的十六进制数的各位数值。从整数n 译出它的各位十六进制数
值,需采用除16 取余的方法,即求n除16 的余,得到它的十六进制的个位
数,接着将n 除以16。在n不等于0 的情况下循环,能顺序求出n 的十六进
制的个位数、十位数、百位数等。程序中变量base已预置16,所以在第1 个
空处可填代码n%base或n%16。
填空2:我们注意,在do - while循环中i的自加语句将在循环判断结束之前
执行,也就是说退出循环之后i的值比c 数组实际用到的下标值要大1,因此在
for 循环中对i先自减再运算,可以正确调用存在c数组中的16进制数。
填空3:当n 的十六进制数的个位、十位、百位等依次存放于数组c 中后,就
从最高位至最低位,参照数组c[i]的内容d(以其内容为下标),取十六进制数
字符表中的字符b[d]输出。所以第3个空可填入代码[d] 。
答案:【1】n%base或n%16 【2】--i 【3】[d]
【真题2】 给定程序modi.c 中,函数fun 的功能是:按顺序给s 所指数组中的元
素赋予从1 开始的奇数,然后再按顺序对每五个元素求一个平均值,并将这些值依次
存放在w 所指的数组中,若s所指数组中元素的个数不是5 的倍数,多余部分忽略
不计。
例如,s 所指数组有14 个元素,则只对前10 个元素进行处理,不对最后的4 个元
素求平均值。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main 函数,
#include < stdio.h >#define SIZE 20
fun(double *s,double *w)
{ int k,i; double sum;
for (k=1,i=0;i< SIZE;i++)
{ s[i]=k; k+=2; }
/************found************/
sun=0.0;
for(k=0,i=0;i< SIZE;i++)
{ sum+=s[i];
/************found************/
if (i+1%5==0)
{ w[k]=sum/5;sum=0;k++;}
}
return k;
}
main()
{ double a[SIZE],b[SIZE/5];
int i,k;
k=fun(a,b);
printf("The original data:\n");
for (i=0;i< SIZE;i++)
{ if(i%5==0) printf("\n");
printf("%4.0f",a[i]);
}
printf("\n\nThe result:\n");
for(i=0;i< k;i++) printf("%6.2f ",b[i]);
printf("\n\n");
}
(2011年2月)
解析: 本题着重考察考生对C 语言中一些简单算法的掌握情况。
本题中的第一个错误:在函数中,未对变量sun 进行定义,由程序可知,函数
通过变量sum 来累计和值,需先为sum 赋初值0,所以程序中语句
"sun=0.0;"应改为"sum=0.0;"或相同作用的语句。
本题中的第二个错误:要注意算术运算符的优先级:*、/→%→+、-,由题意
可知,条件语句是用来判断元素的个数是不是5的倍数,所以程序中语句"if
(i+1%5==0)"应改为"if ((i+1)%5==0)"或相同作用的语句。
【真题3】 请编写函数fun,其功能是:计算并输出3 到n 之间所有素数的平方根
之和。
例如,在主函数中从键盘给n 输入100 后,
输出为:sum=148.874270。
注意:要求n 的值大于2 但不大于100。
部分源程序在文件prog.c 中。
请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < math.h >#include < stdio.h >double fun(int n)
{……}
main()
{ int n; double sum;
printf("\n\nInput n: "); scanf("%d",&n);
sum=fun(n);
printf("\n\nsum=%f\n\n",sum);
}
(2011年2月)
解析: 本题的考核点是查找素数的算法以及开根函数的应用。
解题思路:从3 到指定数n,找出所有的素数,素数的判断方法是:只能被1
和其自身整除,而不能被其它任何数整除的数;sqrt(x)函数是计算x的平方
根。
#include < math.h >
#include < stdio.h >
double fun(int n)
{int i,j=0; /*定义两个整型变量*/
double s=0; /*定义变量s 为双精度型*/
for (i=3;i< =n;i++)
{ for (j=2;j< i;j++)
if (i%j==0) break; /*如果i能被j整除就说明i 不是素数,继而退出循环体
*/
if (j==i) s=s+sqrt(i); /*sqrt(i)函数是计算i的平方根*/
}
return s; /*返回结果*/
}