[英]C - Passing a function value to another function
我有以下程序調用兩個函數,一個函數收集數組的總和,一個函數收集平均值:
#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_sum
和array_average
結果。 此外,我認為這將是更有效地傳遞array_sum
通過array_average
函數,而不是計算再次數組總和? 任何想法將不勝感激!
首先,您可以從平均值函數中調用 sum函數,以使其工作而無需重復代碼。 其次,用返回類型聲明兩個函數,但不返回任何內容。 您需要添加return語句,然后將返回值設置為main()
的變量。
而不是在函數中調用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
相同的工作,因此您應該通過調用array_sum
來計算總和,而不是復制代碼。
最好是函數返回相關值。 您的任何一個輔助函數都沒有返回語句,應該使用該語句。 您的編譯器應對此發出警告; 注意那些警告。
其次,如果函數本身不打印值(如array_average
當前所做的那樣),它們將具有更高的可重用性。 將所有內容放在一起,修改您的worker函數以返回有問題的值; 那么您可以使用類似以下的代碼:
float sum = array_sum(myNumbers, size);
printf("sum = %5.2f; avg = %5.2f", sum, sum/size);
還值得注意的是,您的程序可能會遭受溢出和精度損失。 但是,根據您的問題,我會說這些問題應該在更高級的研究中解決。 不過請務必回到他們身邊!
我感覺到您應該具有這些功能,通過這些功能可以執行以下操作:
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.