2013-03-12 477 views
1

我有以下程序調用了兩個函數,一個聚集數組,其中的總和收集平均:Ç - 傳遞一個函數值給另一個函數

#include <stdio.h> 

float array_sum (float myNumbers[],int size) 
{ 
    float sum = 0; 
    int i; /* Variable used in loop counter */ 

    for (i = 0; i < size; ++i) 
    { 
     sum +=myNumbers[i]; 
    } 

} 

float array_average (float myNumbers[],int size) 
{ 
    float sum = 0; 
    float average = 0; 
    int i; /* Variable used in loop counter */ 

    for (i = 0; i < size; ++i) 
    { 
     sum +=myNumbers[i]; 
    } 

    average = sum/size; 
    printf("avg = %5.2f", average); 
} 

int main (void) 
{ 
    int size; 
    int sum; 

    printf ("Enter The Amount Of Numbers In Your Array: "); 
    scanf("%i", &size); 

    float myNumbers[size]; 
    int i; 

    for (i = 0; i < size; ++i) 
    { 
     printf ("Enter the number:"); 
     scanf (" %f",&myNumbers[i]); 
    } 

    array_sum(myNumbers,size); 
    array_average(myNumbers,size); 

    return 0; 
} 

我想要做的就是在我的程序結束時顯示array_sumarray_average結果。此外,我認爲將array_sum通過array_average函數而不是再次計算數組總數會更有效率嗎?任何想法將不勝感激!

+0

你聲稱'array_sum'和'array_average'返回浮動,但那些都函數有一個'return'語句。也許你可以以這種方式回報你想要的價值? – 2013-03-12 01:46:06

回答

2

而是調用你的函數printf,你應該返回值:

return sum; 

return average; 

無論你的函數期望float返回值反正。你的編譯器應該已經警告過你。無論如何,你應該能夠這樣稱呼它(假設你有main聲明的相關變量):

sum = array_sum(myNumbers,size); 
average = array_average(myNumbers,size); 
printf("sum = %5.2f", sum); 
printf("avg = %5.2f", average); 

顯然,array_average功能做了很多同樣的工作array_sum中不添加任何附加價值,所以你應該通過調用array_sum來計算總和而不是重複代碼。

2

首先,你可以用來調用從平均函數中求和的函數使它不做重複代碼的工作。其次,你用返回類型聲明瞭這兩個函數,但是你不返回任何東西。您需要添加一個return語句,然後將返回的值設置爲main()中的變量。

1

這可能是最好的,如果你的函數返回相關的值。你的工作者職能都沒有返回聲明,他們應該這樣做。你的編譯器應該警告你這個;留意這些警告。

其次,如果您的函數不能自己打印值,那麼您的函數將更具可重用性,正如array_average目前所做的那樣。綜合起來,修改你的工作函數返回有問題的值;那麼你可以使用代碼是這樣的:

float sum = array_sum(myNumbers, size); 
printf("sum = %5.2f; avg = %5.2f", sum, sum/size); 

這也是值得注意的是,你的程序可以從溢出和精度遭受損失。然而,根據你的問題,我會說這些問題應該在更高級的學習中加以考慮。一定要回到他們身邊!

0

我有,你應該有這些功能的感覺,通過一個可以這樣做:

#include <stdio.h> 
#include <stdlib.h> 

/* Pass pointer to a target variable where to save sum. 
* Though it can be nice to return it, it all depends on usage. 
* Conventionally one often return status code, and edit params. 
*/ 
int array_sum(float myNumbers[], int size, float *sum) 
{ 
    int i; 

    /* This would indicate you have asked for the sum of an empty set. */ 
    if (size < 1) { 
     return 1; 
    } 
    *sum = 0; 

    for (i = 0; i < size; ++i) { 
     *sum += myNumbers[i]; 
    } 
    return 0; 
} 

int array_average(float sum, unsigned int size, float *avg) 
{ 
    /* Duh. */ 
    if (size == 0) { 
     return 1; 
    } 
    *avg = sum/size; 
    return 0; 
} 


/* A lot of redundant checks here, but only to show the concept. 
* Normally one would often call the function from context where 
* one does not have control on e.g. "size" before you actually 
* are going to sum it. 
* 
* Here you would probably check if size is < 1 after scanf and 
* ask for new number or abort. 
*/ 
int main(void /* int argc, char *argv[] */) 
{ 
    int i; 
    int size; 
    float sum; 
    float avg; 
    float *myNumbers; 

    printf ("Enter The Amount Of Numbers In Your Array: "); 
    if (!scanf("%i", &size)) { 
     fprintf(stderr, 
      "Unable to read size.\n" 
     ); 
     return 1; 
    } 

    if ((myNumbers = malloc(sizeof(float)* size)) ==NULL) { 
     fprintf(stderr, 
      "Memory error.\n" 
     ); 
     return 2; 
    } 

    for (i = 0; i < size; ++i) { 
     fprintf(stderr, "Enter the number: "); 
     if (!scanf("%f", &myNumbers[i])) { 
      fprintf(stderr, 
       "Unable to read float.\n" 
       "Try again." 
      ); 
      scanf("%*s"); /* Empty out buffer. */ 
      --i;   /* Reset count. */ 
     } 
    } 

    if (array_sum(myNumbers, size, &sum) != 0) { 
     fprintf(stderr, 
       "Sum failed.\n" 
     ); 
     return 2; 
    } 

    if (array_average(sum, size, &avg) != 0) { 
     fprintf(stderr, 
       "AVG failed.\n" 
     ); 
     return 3; 
    } 

    fprintf(stdout, 
     "Total numbers: %d\n" 
     "Sum   : %.2f\n" 
     "AVG   : %.2f\n" 
     , 
     size, 
     sum, 
     avg 
    ); 

    free(myNumbers); 

    return 0; 
} 
相關問題