簡體   English   中英

c中的函數聲明和調用和定義

[英]function declaration and call and definition in c

如果我取 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;
} 

代碼可能沒有運行,因為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) {

如果我取 n>=9 的值,為什么在打印數組后此代碼不運行?

關於您的代碼(以及逐步構建程序)的一些想法:

  1. C 中的數組一旦定義就不會改變大小。 VLA 因各種原因而被淘汰。 malloc() 在。
  2. 使用雙精度型,除非有特殊原因需要使用浮點型。
  3. 每行定義並初始化一個變量。 Uninit vars 只能導致@Jens 提到的錯誤。
  4. 頂部的函數聲明(你已經完成了)
  5. 在開發過程中,沒有必要使用 scanf 使事情復雜化(至少在最初階段)。 它只會增加不必要的復雜性。 如果您正在測試統計函數(均值、方差),請將數字放入預定義的靜態數組中並首先驗證功能。
  6. C[i] 聲明為未初始化的 i。
  7. 對於構建此程序的初始階段,我包含了一個基本程序。
  8. 我不喜歡令牌之間的零空間(但忽略這一點)
  9. 考慮將您的數組稱為“數組”以外的其他內容。
  10. 計算樣本數組的大小允許您更改元素的數量,而無需更改代碼中的任何其他內容; 這為已經很困難的階段增加了另一層復雜性。

#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

我希望它有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM