自学C的十。。来天)?到函数部分,什么形参实参好混乱,为什么我总被编译器提示形参有重定义?

练手的例题是之前的前n项+分母阶乘(虽然我知道怎么做
**自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。本题要求对给定的非负整数n,求该级数的前n项和。
**

    #include<stdio.h>

double denominator(double n);

int main()

{

double n, i, sum, item;

scanf("%lf", &n);

sum = 1;

item = 1/ denominator(n);

for (i = 1; i <= n; i++) {

    sum = sum + item;

}
printf("%.6f", sum);

}
double denominator(double n)
{
double i, n, item;

for (i = 1; i <= n; i++) 

{item = item * i;}

return item;

}

函数到底是咋写的呢?

看别人也会主函数和支函数参数都定义一样的啊,形参实参。。。好烦

这道题如果要用函数写,这么写应该没错吧...?

从书写的方式来说,是没有问题的。函数denominator的定义写在main作用域的外部,而main函数内部会使用该函数,因此需要在main中使用该函数denominator之前,进行声明,以告知编译器该函数是合法的,它有进行定义,同时告知编译器该函数的返回类型,函数名,函数参数个数和参数类型。这里之所以会报错,是因为你的函数**denominator**定义中,其函数体中的变量 **n **与函数的参数n重定义了。函数也是有作用域的,你在同一个作用域中定义两个同名的变量肯定是错误的。就好比在main函数中定义两个同名的变量也会报错。修改方法是修改denominator函数体内的变量n,另取一个名字。

修改如下:

 double denominator(double n)
{
    double i, item;

    for (i = 1; i <= n; i++)

    {item = item * i;}

    return item;
}

函数定义方式为
返回值类型 函数名(形参列表){函数体}
如果你想在某个地方调用函数,就必须在这个地方之前就声明了该函数,就比如你给的例子在主函数中调用了denominator,要在主函数前声明该函数,而你是先声明了,函数的实际实现放到了main函数下方,另外,题目要去整数,用double就有点大材小用了
函数就像是一个加工厂,你把所需材料送进工厂,以获取成品,而形参就是我们预先规定好所需要的材料,实参就是我们实际送进工厂的东西,材料是什么(形参),我们就往工厂里塞什么(实参)