上机100套题及答案3140.docx
《上机100套题及答案3140.docx》由会员分享,可在线阅读,更多相关《上机100套题及答案3140.docx(43页珍藏版)》请在冰豆网上搜索。
上机100套题及答案3140
2009年4月上机100套题31-40
第三十一套
请补充main函数,该函数的功能是:
求n!
。
例如,7!
=5040。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#include
voidmain()
{
intI,n;
longf=1;
system("CLS");
printf("Inputn:
");
scanf("%d",【1】);
for(【2】;I<=n;I++)
【3】;
printf("%d!
=%ld\n",n,f);
}
【参考答案】
(1)&n
(2)i=1或i=2(3)f*=i
【考点分析】
本题考查:
scanf()函数;for循环语句,循环变量初始值;阶乘算法。
【解题思路】
填空1:
本题考查对标准输入函数scanf()的掌握程度,地址列表中都是地址值,所以在变量名前要加上取址运算符&。
填空2:
n的阶乘是将1、2、3…n累积相乘,所以for循环中i从1开始取数。
因为1乘以任何数都等于这个数本身,所以i也可以从2开始取数。
填空3:
掌握了阶乘的算法,这个问题就非常简单。
下列给定程序中,函数fun的功能是:
求表达式s=aa…aa-…-aa-aa-a(此处aa…aa表示n个a,a和n的值在1至9之间)的值。
例如a=3,n=6,则以上表达式为:
s=333333-33333-3333-333-33-3
其值是296298。
a和n是函数fun的形参,表达式的值作为函数值传回main函数。
请改正程序中的错误,使它能计算出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
longfun(inta,intn)
{
intj;
/*************found**************/
longs=0,t=1;
/*************found**************/
for(j=0;j<=n;j++)
t=t*10+a;
s=t;
for(j=1;j{
/*************found**************/
t=t%10;
s=s-t;
}
return(s);
}
main()
{
inta,n;
printf("\nPleaseenteraandn:
");
scanf("%d%d",&a,&n);
printf("\nThevalueoffunctionis%ld\n",fun(a,n));
}
【参考答案】
(1)错误:
longs=0,t=1;正确:
longs=0,t=0;
(2)错误:
for(j=0;j<=n;j++)
正确:
for(j=0;j(3)错误:
t=t%10;正确:
t=t/10;
【考点分析】
本题考查:
变量赋初值;for循环语句;区别求余运算和除法运算。
【解题思路】
(1)用代入法就可看出,结果是错误的,它的个位出现了问题。
(2)从题中给出的例题就可以看出,当n=6,a=3时,得到的最大数为33333,这是一个五位数,所以这里只要从0开始循环6次就可以了。
(3)根据题意,这里不需要求余数,而是要去掉个位数,重新组合一个数。
请编写函数fun,其功能是计算并输出如下多项式的值:
Sn=l+1/1!
+1/2!
+1/3!
+1/4!
+…+1/n!
例如,若主函数从键盘给n输入15,则输出为S=2.718282。
注意:
n的值要求大于1但不大于100。
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
doublefun(intn)
{
}
voidmain()
{
intn;
doubles;
FILE*out;
printf("\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("s=%f\n",s);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f\n",fun(n));
fclose(out);
/******************************/
}
【参考答案】
doublefun(intn)
{
doublet,sn=1.0;
inti,j;
for(i=1;i<=n;i++)
{
t=1.0;
for(j=1;j<=i;j++)
t*=j;
sn+=1.0/t;
}
returnsn;
}
【考点分析】
本题考查:
变量数据类型,数据类型强制转换;和、积变量如何初始化;for循环语句;通过return语句返回值。
【解题思路】
该程序的数学思路是:
在程序中输入n后,以前n项的阶乘作为分母递加,由于t是浮点类数据,所以s+=1.0/t,for循环的作用是每一次循环,将1.0/t与sn相加,并将值存入sn中。
第三十二套
请补允函数fun,该函数的功能是:
计算并输出下列多项式的值。
例如,若主函数从键盘给n输入50后,则输出为S=1.960784。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填若干表达式或语句。
试题程序:
#include
【1】fun(intn)
{
inti,j;
doublesum=0.0,t;
for(i=1;i<=n;i++)
{
t=0.0;
for(j=1;j<=i;j++)
t+=【2】;
sum+=【3】;
}
returnsum;
}
voidmain()
{
intn;
doubles;
printf("\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
}
【参考答案】
(1)double
(2)j(3)1.0/t或(double)1/t
【考点分析】
本题考查:
有参函数的定义;变量累加;多项式求和,数据类型强制转换。
【解题思路】
填空1:
根据主函数可知,返回值是一个double型的数据,因此填入double。
填空2:
由题中的公式可知,t表示分数分母的累加,那么应填入j。
填空3:
计算整个公式的和,就是分母的倒数和,由于在计算过程中有小数存在,应把分子写为double型的数据,所以填入1.0/t或(double)1/t。
下列给定程序中,函数fun的功能是:
根据整型形参m,计算如下公式的值。
例如,若m的值为5,则应输出:
1.463611。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
doublefun(intm)
{doubley=1.0;
inti;
/*************found**************/
for(i=2;i/*************found**************/
y+=1/(i*i);
return(y);
}
voidmain()
{intn=5;
system("CLS");
printf("\nTheresultis%1f\n",fun(n));
}
【参考答案】
(1)错误:
for(i=2;i正确:
for(i=2;i<=m;i++)
(2)错误:
y+=1/(i*i);
正确:
y+=1.0/(i*i);
【考点分析】
本题考查:
for循环语句的循环条件;数据类型的强制转换,由强制转换运算符完成转换。
【解题思路】
(1)for(i=2;i(2)y是一个double型变量,题中得出的结果是一个整数,所以改为y+=1.0/(i*i)。
请编写函数fun,该函数的功能是:
计算并输出
S=1+(1+20.5)+(1+20.5+30.5)+…+(1+20.5+30.5+…+n0.5)
例如,若主函数从键盘给n输入20后,则输出为S=534.188884。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
doublefun(intn)
{
}
voidmain()
{
FILE*wf;
intn;
doubles;
printf("\n\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%f",fun(20));
fclose(wf);
/*****************************/
}
【参考答案】
doublefun(intn)
{
inti;
doubles=0.0,s1=0.0;
for(i=1;i<=n;i++)
{
s1=s1+pow(i,0.5);
/*求每一项*/
s=s+s1;
/*按公式求出s*/
}
returns;
}
【考点分析】
本题考查:
变量数据类型及初始化;pow()函数的使用,其功能是计算x的y次方;for循环语句完成每一项的值以及累加计算。
【解题思路】
我们先用数学的思路读懂该程序,并用1个字符表示"()"内的值。
在本程序中用s1来表示题中每个小括号内的值,第1项相当于有1个10.5(它还是1),第2项相当于第1项的值加上20.5,第3项相当于第2项的值加上30.5,…,依此类推。
函数pow(x,y)的功能是求出x的y次方,该函数已在库函数中定义(即可直接使用)。
程序中用s来表示总的结果,每1次循环加1次s1,即加1项。
第三十三套
程序的功能是计算
。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在横线上填入所编写的若干表达式或语句。
试题程序:
#include
longfun(intn)
{
intI;
longs;
s=【1】;
for(I=1;I<=n;I++)
s=【2】;
returns;
}
voidmain()
{
longs;
intk,n;
scanf("%d",&n);
s=【3】;
for(k=0;k<=n;k++)
s=【4】;
printf("%ld\n",s);
}
【参考答案】
(1)1
(2)s*i或i*s(3)0(4)s+fun(k)
【考点分析】
本题考查:
累加(乘)操作时,变量如何初始化,如何实现累加(乘)。
【解题思路】
函数fun的功能是计算n的阶乘。
首先,定义一个long型累计变量s,并初始化为1,然后用一个for循环从1循环到n,累乘给s,循环结束时s的值即为n的阶乘。
主函数中也定义了一个累计变量s,通过for循环,累加从0到n的所有数的阶乘。
数列中,第一项为3,后一项都比前一项的值增5。
下列给定程序中,函数fun的功能是:
计算前
项的累计和。
在累加过程中把那些被4除后余2的当前累加值放入数组中,符合此条件的累加值的个数作为函数值返回主函数里。
如当n的值为20时,该数列为3,8,13,18,23,28,…,93,98。
符合此条件的累加值应为42,126,366,570,1010。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#defineN20
intfun(intn,int*a)
/*************found**************/
{intI,j,k,sum;
sum=0;
for(k=3,I=0;I{sum=sum+k;
/*************found**************/
if(sum%4=2)
a[j++]=sum;
}
/*************found**************/
returnj;
}
voidmain()
{inta[N],d,n,i;
printf("\nEntern(4<=n<=50):
");
scanf("%d",&n);
d=fun(n,a);
printf("\n\nTheresult:
\n");
for(i=0;iprintf("\n\n");
}
【参考答案】
(1)错误:
inti,j,k,sum;正确:
inti,j=0,k,sum;
(2)错误:
if(sum%4=2)正确:
if(sum%4==2)
(3)错误:
returnj;正确:
returnj++;
【考点分析】
本题考查:
变量初始化;if语句条件表达式,区别"="和"==";return语句完成函数值的返回。
【解题思路】
该题是一个公差为5的等差数列,要是用数学的办法解决也就是一个公式两个符号,问题迎刃而解,要是用C语言来求这样很有规律的等差数列前n项和,也相当简单,关键看细节。
i,k,sum都分别定义了,那么j呢?
所以,正确的应该是inti,j=0,k,sum;,再往下看,if(sum%4=2)是在说明题干中"在累加过程中把那些被4除后余2的当前累加值放入数组中,符合此条件的累加值的个数作为函数值返回主函数",那么"余2"的表示方法呢?
应该是if(sum%4==2),后面的返回错误就不提了,看看a[j++]=sum;语句,难道还能返回给j吗?
请编写一个函数fun,它的功能是:
计算并输出给定整数n的所有因子(不包括1与自身)之和。
规定n的值不大于1000。
例如,若主函数从键盘给n输入的值为856,则输出m为sum=763。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
intfun(intn)
{
}
voidmain()
{
intn,sum;
FILE*out;
printf("Inputn:
");
scanf("%d",&n);
sum=fun(n);
printf("sum=%d\n",sum);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%d\n",fun(123));
fprintf(out,"%d\n",fun(456));
fprintf(out,"%d\n",fun(789));
fprintf(out,"%d\n",fun(147));
fprintf(out,"%d",fun(258));
fclose(out);
/******************************/
}
【参考答案】
intfun(intn)
{
ints=0,i;
for(i=2;i<=n-1;i++)
/*将n减1累加*/
if(n%i==0)
s+=i;
returns;
}
【考点分析】
本题考查:
变量数据类型,求和时变量如何初始化;所有因子的判定方法,if语句结合求余运算;return返回语句。
【解题思路】
函数fun的功能是计算输出给定整数n的所有因子之和。
本题比较简单,
(1)遍历从2到n-1的所有整数;
(2)用条件语句找出能被n整除的所有整数,并累加求和;(3)返回值。
第三十四套
请补充main函数,该函数的功能是:
求1+2!
+3!
+…+N!
的和。
例如,1+2!
+3!
+…+5!
+6!
的和为873。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
voidmain()
{
intI,n;
longs=0,t=1;
system("CLS");
printf("\nInputn:
\n");
scanf("%d",【1】);
for(I=1;I<=n;I++)
{
t=【2】;
s=【3】;
}
printf("1!
+2!
+3!
...+%d!
=%ld\n",n,s);
}
【参考答案】
(1)&n
(2)t*i(3)s+t
【考点分析】本题考查:
scanf()函数,其一般形式为"scanf("格式控制字符串",地址表列);",其中,需要注意地址是由地址运算符"&"后跟变量名组成的;累加以及累乘的实现方法。
【解题思路】填空1:
标准输入函数scanf()的地址表列中,变量n前要加上取址运算符"&"。
填空2:
变量t用来保存每个数的阶乘,因为i!
=(i-1)!
*i,所以此空应为t*i。
填空3:
变量s用来保存从1到n的阶乘的总和。
下列给定程序中,函数fun的功能是:
求S的值。
设
S=(22/(1*3))*(42/(3*5))*(62/(5*7))*…*(2k)2/((2k-1)*(2k+1))
例如,当k为10时,函数的值应为1.533852。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
#include
/*************found**************/
fun(intk)
{intn;floats,w,p,q;
n=1;
s=1.0;
while(n<=k)
{w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
/*************found**************/
returns
}
voidmain()
{system("CLS");
printf("%f\n",fun(10));
}
【参考答案】
(1)错误:
fun(intk)正确:
doublefun(intk)
(2)错误:
returns正确:
returns;
【考点分析】
本题考查:
函数定义,其形式为"类型标识符函数名(形式参数表列)";return语句;C语言的书写规范。
【解题思路】
这是一道用C程序来实现的数学题,实现起来比较简单,但是就注意细节上的错误。
该题有两处错误,一个是简单的函数调用的定义错误;另一个是语法错误。
请编写函数fun,它的功能是:
计算并输出n(包括n)以内所有能被5或9整除的自然数的倒数之和。
例如,若主函数从键盘给n输入20后,则输出为s=0.583333。
注意:
n的值要求不大于100。
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
doublefun(intn)
{
}
main()
{
intn;
doubles;
FILE*out;
printf("\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n",s);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f\n",fun(30));
fclose(out);
/******************************/
}
【参考答案】
doublefun(intn)
{
inti;
doublesum=0.0;
for(i=1;i<=n;i++)
if(i%5==0||i%9==0)
sum+=1.0/i;
returnsum;
}
【考点分析】本题考查:
变量数据类型及初始化;if语句,for循环语句。
【解题思路】本题是一道简单的计算题,首先确定了n的范围,然后确定判断条件。
只要判断条件正确,这道题就可以轻松解决。
第三十五套
给定程序的功能是:
计算并输出下列级数的前N项之和SN,直到SN大于q为止,q的值通过形参传入。
例如,若q的值为50.0,则函数值为50.416687。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
doublefun(doubleq)
{
intn;
doubles,t;
n=2;
s=2.0;
while(s【1】q)
{
s=s+(double)(n+1)/n;
【2】;
}
printf("n=%d\n",n);
【3】;
}
voidmain()
{
printf("%f\n",fun(50));
}
【参考答案】
(1)<=
(2)n++或n+=1或n=n+1
(