函数声明以及c中的调用和定义

时间:2018-10-21 09:52:52

标签: c loops

如果我采用n> = 9的值,为什么在打印数组后此代码无法运行?

#include <stdio.h>
#include <math.h>

float mean_function(float array[],int n);
int main() {
    int i,n;
    float array[n],mean,sum=0,s2,summation,deno,C[i],elements;
    printf("Enter No of Elements\n");
    scanf("%d",&n);
    printf("Enter Elements\n");
    for(i=0;i<n;i++){
        scanf("%f",&array[i]);
        printf("%f",array[i]);
    }
    printf("sample variance(s2) : (sum((x-mean)*(x-mean)))/(n-1) /n");
    printf("population variance(sigma2) : (sum((x-u)*(x-u))/n");
    mean_function(array,n);
    for(i=0;i<n;i++) {
        deno=((array[i]-mean)*(array[i]-mean));
        C[i]=deno;
        summation=summation+C[i];
    }
    s2=((summation)/(n-1));
    printf("s2=%f \n",s2);
}
float mean_function(float array[],int n) {
    int i;
    float sum=0,mean;
    for(i=0;i<n;i++){ sum=sum+array[i]; }
    mean=(sum/n);
    return mean;
} 

2 个答案:

答案 0 :(得分:0)

由于未初始化的array[n]声明了n,因此该代码可能未运行。在您用scanf()读取n时,该数组不会自动“增长为正确的大小”。您应该声明array足够大,或者如果您真的希望它是用户定义的,则使用malloc对其进行分配(请阅读comp.lang.c FAQ)以及所有Stackoverflow问题的标记数组...)

此外,scanf有时会失败。请注意,输入数字时,输入流中还将“ Enter”作为换行符('\n')。您从未读过换行符,因此下一个scanf失败。

当您使用以下代码实际检查scanf的返回值时,这变得显而易见:

if (scanf("%f", &array[i]) == 1) {
   /* successfully converted 1 item */
}
else {
   /* scanf failed */
}

通常,您要跳过输入中的空格。您可以通过在scanf格式中放置一个空格来做到这一点。请注意,一个空格告诉scanf跳过任何个空格。

if (scanf(" %f", &array[i]) == 1) {

答案 1 :(得分:0)

  

如果我认为有价值,为什么在打印数组后此代码无法运行   的n> = 9?

关于您的代码(以及有关逐步构建程序的一些想法):

  1. C中的数组一旦定义就不会改变大小。 VLA退出的原因有很多。 malloc()已插入。
  2. 除非有特殊原因使用浮点数,否则请使用double。
  3. 每行定义和初始化一个变量。如@Jens所述,Uninit vars只会导致错误。
  4. 顶部的函数声明(已完成)
  5. 在开发过程中,没有必要使scanf复杂化(至少在最初是这样)。它只会增加不必要的复杂性。如果要测试统计函数(均值,方差),则将数字放入预定义的静态数组中,然后首先验证功能。
  6. 用未初始化的i声明的
  7. C [i]。
  8. 在构建此程序的初始阶段,我包括一个基本程序。
  9. 我不喜欢令牌之间的零空间(但请忽略这一点)
  10. 考虑将您的数组称为“数组”以外的其他内容。
  11. 计算样本数组的大小可让您更改元素数,而无需更改代码中的任何其他内容;这已经很困难的阶段又增加了一层复杂性。

#include <stdio.h>
#include <math.h>

double sample_mean(double* p, int n);
int main()
{
    double samples[] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 16.5, 2.3};
    double mean = 0.0;

    int size_samples = sizeof samples/sizeof(double);
    printf("size_samples = %d\n", size_samples);

    mean = sample_mean(samples, size_samples);
    printf("Mean = %.2lf", mean);

}
// -------------------------------
double sample_mean(double* p, int n)
{
    double mean = 0.0;
    double total = 0.0;

    for(int i = 0; i < n; i++)
        total += *p++;
    mean = total/n;

    return mean;
}

一旦存在(保存)此功能,您就可以开始使用其他统计功能。这样,您可以逐步进行工作以更接近所需的结果。 接下来,您可以定义sample_variance(double* p, int n)并继续进行工作,知道到目前为止,您编写的代码还没有其他(新错误)。
输出:


size_samples = 8
Mean = 5.24

我希望它会有所帮助。