编写一个求k的阶乘的被调函数,要求以k作形参,以k的阶乘作为返回值

如题所述

函数的调用
8.4.1 函数调用的一般形式
前面已经说过,在程序中是通过对函数的调用来执行函数体的,其过程与其它语言的子程序调用相似。
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
8.4.2 函数调用的方式
在C语言中,可以用以下几种方式调用函数:
1. 函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。
2. 函数语句:函数调用的一般形式加上分号即构成函数语句。例如: printf ("%d",a);scanf ("%d",&b);都是以函数语句的方式调用函数。
3. 函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y)); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。介绍printf 函数时已提到过,这里从函数调用的角度再强调一下。

main()
{
int i=8;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
}

如按照从右至左的顺序求值。运行结果应为:
8
7
7
8
如对printf语句中的++i,--i,i++,i--从左至右求值,结果应为:
9
8
8
9
应特别注意的是,无论是从左至右求值, 还是自右至左求值,其输出顺序都是不变的, 即输出顺序总是和实参表中实参的顺序相同。由于Turbo C现定是自右至左求值,所以结果为8,7,7,8。上述问题如还不理解,上机一试就明白了。
8.4.3 被调用函数的声明和函数原型
在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。
其一般形式为:
类型说明符 被调函数名(类型 形参,类型 形参…);
或为:
类型说明符 被调函数名(类型,类型…);
括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。
例8.1 main函数中对max函数的说明为:
int max(int a,int b);
或写为:
int max(int,int);
C语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明。
1) 如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。例8.2的主函数中未对函数s作说明而直接调用即属此种情形。
2) 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。例如例8.1中,函数max的定义放在main 函数之前,因此可在main函数中省去对max函数的函数说明int max(int a,int b)。
3) 如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。例如:
char str(int a);
float f(float b);
main()
{
……
}
char str(int a)
{
……
}
float f(float b)
{
……
}
其中第一,二行对str函数和f函数预先作了说明。因此在以后各函数中无须对str和f函数再作说明就可直接调用。
4) 对库函数的调用不需要再作说明,但必须把该函数的头文件用include命令包含在源文件前部。
8.5 函数的嵌套调用
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图。

图表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。
计算s=22!+32!
本题可编写两个函数,一个是用来计算平方值的函数f1,另一个是用来计算阶乘值的函数f2。主函数先调f1计算出平方值,再在f1中以平方值为实参,调用 f2计算其阶乘值,然后返回f1,再返回主函数,在循环程序中计算累加和。
long f1(int p)
{
int k;
long r;
long f2(int);
k=p*p;
r=f2(k);
return r;
}
long f2(int q)
{
long c=1;
int i;
for(i=1;i<=q;i++)
c=c*i;
return c;
}
main()
{
int i;
long s=0;
for (i=2;i<=3;i++)
s=s+f1(i);
printf("\ns=%ld\n",s);
}

在程序中,函数f1和f2均为长整型,都在主函数之前定义,故不必再在主函数中对f1和f2加以说明。在主程序中,执行循环程序依次把i值作为实参调用函数f1求i2值。在f1中又发生对函数f2的调用,这时是把i2的值作为实参去调f2,在f2 中完成求i2!的计算。f2执行完毕把C值(即i2!)返回给f1,再由f1返回主函数实现累加。至此,由函数的嵌套调用实现了题目的要求。由于数值很大,所以函数和一些变量的类型都说明为长整型,否则会造成计算错误。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-29
#include<stdio.h>
#include<string.h>
void swap(int c[], int len)
{
int i = 0;
int tmp;

for (; i < len; ++i, --len)
{
tmp = c[i];
c[i] = c[len];
c[len] = tmp;
}
}
int mul(char a[], char b[], int c[])
{
int c1,c2,i,k;
c1=strlen(a);
c2=strlen(b);
for(i=0;i<c1;i++)
for(k=0;k<c2;k++)
c[i+k]+=(a[c1-i-1]-'0')*(b[c2-k-1]-'0');
k=999;
while(c[k]==0)
k--;
for(i=0;i<=k;i++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[i]>0)
i++;
swap(c, i-1);
for (k = 0; k < i; ++k)
printf("%d", c[k]);
printf("\n");

return i;
}

void mycopy(char b[], int c[], int len)
{
int i;

for (i = 0; i < len; ++i)
sprintf(b+i, "%d", c[i]);
}

int main()
{
char a[1000] = {0}, b[1000] = {0};
int c[1000] = {1};
int i;
int len = 1;
int n = 0;

printf("输入n的值:");
scanf(" %d", &n);

for (i = 1; i <= n; i++)
{
memset(b, 0, 1000);
mycopy(b, c, len);
sprintf(a, "%d", i);
memset(c, 0, 4*len);
len = mul(a, b, c);
}
return 0;
}

100的阶乘肯定木有问题!只要 算出来的数别大于1000位就是可以的!
第2个回答  2011-06-29
#include <stdio.h>

// k 不可太大,否则溢出。
long long foo(int k)
{
int i;
long long res = 1;

for (i = 1; i <= k; i++)
res *= i;

return res;
}

int main(void)
{
printf("%lld\n", foo(5));
return 0;
}本回答被提问者和网友采纳
第3个回答  2011-06-30
#include <stdio.h>
long fun ( int k)
{
if(k==0||k==1)return 1;
else return k*fun(k-1);

}
void main( )
{ int k ;
scanf("%d",&k);
printf("%d!=%ld\n", k, fun ( k )) ;
}
第4个回答  2011-06-29
int fun(int k)
{
int sum=1;
while(k>1)
{
sum*=k;
k--;
}
return sum;
}
k不要太大,不然整形放不下。

编写一个求k的阶乘的被调函数,要求以k作形参,以k的阶乘作为返回值
1. 函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。2. 函数语句:函数调用的一般形式加上分号即构成函数语句。例如: printf ("%d",a);scanf ("%d",&b);都是...

编写一个求k的阶乘的被调函数,要求以k为形参,以k的阶乘作返回值
\/\/简单的写一个,没做修饰 include <iostream> using namespace std;int jiecheng(int x){ if(x=1)return 1;return jiecheng(x-1)*x;} int qiuhe(int x,int y,int z){ return jiecheng(x)+jiecheng(y)+jiecheng(z);} void main(){ int x,y,z;cout<<"输入xyz";cin>>x>>y>>z...

python用while循环求n的阶乘
Python程序求阶乘以下是一个简单的 Python 程序,用于计算 7 的阶乘:num = 7 factorial = 1 for i in range(1, num+1):factorial *= i print(7 的阶乘为:, factorial)在这个程序中,我们首先定义变量 num 并将其设置为 7。本题要求编写程序,计算N的阶乘。输入格式:输入在一行中给出一...

编程:求正整数n的阶乘(n的值由键盘输入),不断尝试当n为多少时,阶乘第一...
2、思路:所谓n的阶乘就是从1到n的累积,所以可以通过一个for循环,从1到n依次求积即可。3、接着是阶乘recv函数逻辑,该函数有一个形参n用来接收输入的数。4、下构思下程序的基础,让用户自定义输入一个数作为阶乘数,当超过20时,输出“Nistoobig”.需要用到IF函数,以下为详细过程。

python一个函数可能有多少个输入(pythoninput函数一次输入多个值吗)
字典形式(通过k,value的方式传递)通过变量的方式传递 三、函数的返回值 作用:返回函数执行结果,如果没有设置,默认返回None 终止函数运行,函数遇到return终止函数 四、变量的作用域 全局变量和局部变量 在函数中定义的变量叫局部变量,在程序中一开始定义的变量叫全局变量 全局变量作用域整个程序,局部...

阶乘的函数形参需要几个
一个典型的函数定义包括以下部分:返回类型、函数名字、由0个或多个形参组成的列表以及函数体。编写一个求数的阶乘的程序。n的阶乘是从1到n所有的数字的乘积,例如5的阶乘是120。函数的名字是fact,它作用于一个整型参数,返回一个整型值。return语句负责结束函数并返回ret的值。

给定求组合数公式为:C(n,m)=m!\/n!(m-n)!,编一程序,输入m和n的值...
int sum_m=1,sum_n=1,sum_mn,sum; int i=m,j=n; for(int i=m;i>0;i--)\/\/求m的阶乘 sum_m*=i; for(int j=0;j>0;j--)\/\/求n的阶乘 sum_n*=j; sum_mn=multi(m,n); return (sum_m\/sum_n)*sum_mn;}int multi(int m,int n){ int sum=1; int k=m-n; while(k>0) ...

C++ 一个阶乘函数编写 看不懂错误在哪 求解
\/\/删除void main()int jc(int jc)\/\/参数明需要注明int jc(int){ int x_jc=1,i;\/\/x_jc初始化为1,for(i=1;i<=jc;i++)\/\/去掉后面的分号;,同时应该到参数的值 x_jc=x_jc*i; \/\/ jc=x_jc*i return x_jc;} void main(){ int in_sum,result;cout<<"请输入阶乘的个数:...

2011年全国计算机等级考试2级C语言机试题库
t[k]=b[j];b[j].s=0;}return t; }3. 程序设计请编写函数fun,函数的功能是,删去一维数组中所有相同的数,使之只剩一个。数组中的数已按从小到大的顺序排序,函数返回删除后数组中数据的个数。int fun(int a[ ],int n){int i,j=1,k=a[0];for(i=1;i<n;i++) if(k!=a[i]){a[j++]...

函数的三要素是什么
函数三要素 链接: https:\/\/pan.baidu.com\/s\/134-J3Q5HDTLTrAJVh9Y0pw ?pwd=q2p5 提取码: q2p5 函数的三个要素:功能,参数,返回值。

相似回答
大家正在搜