求阶乘
1.该fun函数的功能是求10的阶乘。
1)#include
2)long fun(int n)
3){if(___1___)
4)return(n*fun(___2___));
5)else if(___3___)
6)return1;}
第一处:n>1
第二处:n-1·
第三处:n==1
解析:从第2、4行看到了函数名,函数体中又出现了函数的调用,则是递归。我们知道:n!=n*(n-1)!这就是一个递归的表达式,写成函数就是fun(n)=n*fun(n-1)。因此,4行处填写n-1。又:1!=1故3,5行就好填了。因此答案是n>1n-1n==1。还有0!=1故,还可填写:n>0n-1n==0
注意:35行的条件是相反的,这也是if与else条件的互斥性。
2.程序的功能是计算s=1!+2!+3!+……+n!
1)long fun(int n)
2){int i;
3)long s;
4)s=___1___;
5)for(i=1;i<=n;i++)
6)s=___2___;
7)return s;
8)}
9)main()
10){long s;
11)int k,n;
12)scanf("%d",&n);
13)s=___3___;
14)for(k=1;k<=n;k++)
15)s=___4___;
16)printf("%ld\n",s);
17)}
第一处:1
第二处:s*i
第三处:0
第四处:s+fun(k)
解析:首先,搞清楚函数fun、main各自的功能。
Fun是求一个数的阶乘,我们知道:n!=1*2*3*…*n
同时要死记住:求积,积的初值一般等于1。故fun中s是用来存放积的,其初值等于1;求阶乘是连乘,故s=s*i
Main是求和,记住:和的初值一般等于0.
两个函数中的局部变量s的作用是不同的。Main中的s是存放和的。
最后:注意一些变量的类型。
阶乘是求积,积的增长速度是比较快的,为防止溢出,fun的返回值类型是long。输出中ld是输出长整数。
3.请补全main函数,该函数的功能是:
求1+2!+3!+…+N!的和。
1)main()
2){int i,n;
3)long s=0,t=1;
4)//clrscr();
5)printf("\nInput n:\n");
6)scanf("%d",___1___);
7)for(i=1;i<=n;i++)
c语言用递归函数求n的阶乘
8){
9)t=___2___;
10)s=___3___;
11)}
12)printf("1!+2!+3!...+%d!=%ld\n",n,s);
13)}
第一处:&n
第二处:t*i
第三处:s+t
解析:求前n项的阶乘之和。这里没有使用子函数。
我们知道:5!=5*4!。即需要利用前一个数的阶乘,还有就是替换。
从第3行可知:s存放和,t存放积。
输入n,记住应是&n。
i是循环变量。
记住:填空后,手工地将循环执行几次,检验是否正确。
求和、平均值
1.请补全main函数,该函数的功能是:从键盘输入一个长整数,如果这个数是负数,则取它的的绝对值,并显示出来。
main()
{long int n;
clrscr();
printf("Enter the data:\n");
scanf(___1___);
printf("******the origial data********\n");
if(n<0)
___2___
printf("\n\n");
printf(___3___);
}
第一处:"%ld",&n
第二处:n=-n
第三处:"%ld",n
解析:此题要注意的是数据类型,输入输出的格式控制。
长整数使用ld(或Ld)
双精度浮点数使用lf(或Lf)
此处d f不能大写
2.请在函数fun的横线上填写若干个表达式,使从键盘上输入一个整数n,输出斐波纳契数列。斐波契数列是一种整数数列,其中每数等于前两数之后,如:0112358 13……
1)int fun(int n){
2)if(___1___)
3)return0;
4)else if(___2___)
5)return1;
6)else
7)return___3___;
8)}
第一处:n==0
第二处:n==1
第三处:fun(n-1)+fun(n-2)
解析:求斐波契数列:一项等于其前两项的和。
这也是一个递归。
求斐波契数列的第n项的值,n从0开始。
3.请补全函数fun,该函数的功能是求出以下分数序列的前n项之和。和值通过函数值返回到main函数。
1)#include
2)#include
3)___1___fun(int n)
4){int a,b,c,k;
5)double s;
6)s=0.0;
7)a=2;
8)b=1;
9)for(k=1;k<=n;k++)
10){
11)s=s+(___2___)a/(___3___)b;
12)c=a;
13)a=a+b;
14)b=c;
15)}
16)return s;
17)}
第一处:double
第二处:double
第三处:double
解析:从第11----14总结出数列的表达式。第1项是a/b=2/1;3/24/3
故:s=2/1+3/2+4/3+……和的初值是0。
记住:两个整数进行算术运算结果也是整数,算术运算中只要有一个操作数是实数,运算结果就是实数。
本题希望结果是实数,故要进行强制类型转换,2,3只要有一个进行强制转换就可以了。
最后,函数需要有一个返回值类型,当然也是双精度浮点数了。
4.给定程序的功能是计算并输出下列级数的前N项之和SN,直到SN大于q为止,q的值通过形参传入。
1)double fun(double q)
2){int n;
3)double s;
4)n=2;
5)s=2.0;
6)while(s___1___q)
7){
8)s=s+(double)(n+1)/n;
9)___2___;
10)}
11)printf("n=%d\n",n);
12)___3___;
13)}
第一处:s<=q
第二处:n++
第三处:return s
解析:从第8行,
从数学的角度总结出数列的表达式。
(n+1)/n n从2开始,每次增加1,故:SN=2+3/2+4/3+……和的初值是2.0
循环条件是“SN大于q为止”,while是满足条件才循环,故填写s<=q
最后,函数需要有一个返回值。
5.给定程序功能是计算S=f(-n)+f(-n+1)+…+f(0)+f(1)+f(2)+…+f(n)的值。
float f(double x)
{
if(x==0.0||x==2.0)
return___1___;
else if(x<0.0)
return(x-1)/(x-2);
else
return(x+1)/(x-2);
}
double fun(int n)
{int i;double s=0.0,y;
for(i=-n;i<=___2___;i++)
{y=f(1.0*i);s+=y;}
return___3___;
}
main()
{
printf("%f\n",fun(5));
}
第一处:0.0
第二处:n
第三处:s
解析:函数f(double x)求每个单项的值。if……else的条件是互斥的。
fun()是求和。
1.给定程序的功能是计算score中m个人的平均成绩aver,将低于aver的成绩放在below中,通过函数名返回人数。
int fun(int score[],int m,int below[])
{int i,j=0;
float aver=0.0;
for(i=0;i<m;i++)aver+=score[i];
aver/=(float)m;
for(i=0;i<m;i++)
if(score[i]<aver)below[j++]=___1___;
return j;
}
main()
{int i,n,below[9];
int score[9]={10,20,30,40,50,60,70,80,90};
n=fun(score,9,___2___);
printf("\nBelow the average score are:");
for(i=0;i<n;i++)printf("%d",___3___);
}
第一处:score[i]
第二处:below
第三处:below[i]
解析:求平均值,应先求和。此处,和与平均值使用了同一个变量。
Score[]是原来的成绩,
Below【】存放低于平均分的分数,还有人数。Below的长度一定不大于score的长度。Below的长度必须通过计数才能得到,且是在比较的过程中得到的。Below数组的长度用j来计数,其初值当然为0。
Fun函数中:先求总分,平均分;再比较,比平均分低,存于below,j++。
J是后加,不能错了。
函数fun的返回值赋值给n,n就是below数组的长度。
2.在主函数中从键盘输入若干个数放入数组x中,用0结束输入但不计入数组。下列给定程序中,函数fun功能是:输出数组元素中小于平均值的元素。
void fun(___1___,int n)
{
double sum=0.0;
double average=0.0;
int i=0;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。