2013-03-12 128 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; 
} 
相关问题