使用Repl.it并尝试使用C中的函数对可变长度数组中的元素求平均。我的程序在除返回以下值的平均值之外的所有其他I / O区域中均能正常工作:
该日的平均值是:-nan。对问题可能有什么见解?
目标是接收用户输入的信息(例如,在7个小时内每小时抽取多少品脱血液,然后使用函数调用来计算该7个小时内的平均值)。
新代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double average(int size, float ary[*]);
int main(void)
{
char dayOne[8], dayTwo[8];
int size;
float ave;
printf("Over how many hours do you want to view donation amounts?: ");
scanf("%d", &size);
if (size < 7 || size > 7)
size = 7;
printf("Enter day that you want to see average donation amount for: ");
scanf("%s", dayOne);
{
float ary[size];
for (int i = 0; i < size; i++)
{
printf("\nEnter amount taken in hour %d:", i + 1);
scanf("%f", &ary[i]);
}
ave = average(size, ary);
printf("\nThe average donated for %s is: %2.1f", dayOne, ave);
}
printf("\n\nEnter day that you want to see average donation amount for: ");
scanf("%s", dayTwo);
if(strcmp(dayOne, dayTwo)== 0)
printf("\nEnter a different day please: ");
scanf("%s", dayTwo);
{
float ary[size];
for (int i = 0; i < size; i++)
{
printf("\nEnter amount taken in hour %d:", i + 1);
scanf("%f", &ary[i]);
}
ave = average(size, ary);
printf("\nThe average donated for %s is: %2.1f", dayTwo, ave);
}
return 0;
}
double average(int size, float ary[])
{
double sum = 0;
double ave;
for (int i = 0; i < size; i++)
sum += ary[i];
ave = (double)sum / size;
return ave;
}
答案 0 :(得分:1)
这是错误的:
int ary[7];
…
scanf("%f", &ary[i]);
%f
用于扫描float
,但是ary[i]
是int
。结果行为未定义。
这是错误的:
double size;
…
ave = average(size, ary);
“…”中的任何内容均不会为size
分配值,因此在调用average
时它没有定义的值。
答案 1 :(得分:0)
要在伙伴上进行一些语法和逻辑上的更改。正如Eric Postpischil在回答中提到的那样,您的size
变量在使用前未初始化为任何变量。使用%f
接受整数也是不正确的。除了这些,我还将在下面列出其他一些故障以及相应的修复程序。我还附带了完整的工作代码以及输出。
错误: size
变量未初始化。
固定::由于您有固定的小时数,因此可以直接使用7
或通过size
使用。因此,在声明变量时对其进行初始化。只是一个建议伙伴,对int
使用size
。 ==> int size = 7;
错误:接受数组值的输入。数组ary
的类型为int
,但是您使用了%f
,它是float
的格式说明符。
修复:使用%d
,它是int
数据类型的格式说明符。 ==> scanf("%d", &ary[i]);
错误:用于打印平均值的格式说明符。如果类型为%f
,则再次使用float
来表示ave
,而变量double
则是平均值。
修复::使用%lf
的格式说明符double
。 ==> printf("\nThe average for the 2nd day is: %.3lf", ave);
.3
前的lf
只是为了限制小数点数为3。这是可选的。
错误::您接受第二天并显示与第一天相同的消息,但是为此的scanf
不在{{1 }}循环。因此,无论第二个输入日与第一个输入日是否相同,它都会提示用户输入该日的另一个名称。
修复:只需将if
移到scanf
循环中,即可检查当天是否与前一天相同。
我不会真的将其称为错误,因为这只是我需要做的一项改进。您接受第二天,该第二天应与第一天有所不同,并提示将找到平均值。但是您没有计算这一天的平均值。因此,我已将该部分包括在代码中。
代码:
if
输出:
#include <stdio.h> #include <stdlib.h> #include <string.h> double average(int, int [7]); int main(void) { char dayOne[8], dayTwo[8]; int size = 7; double ave; printf("Enter day that you want to see average donation amount for: "); scanf("%s", dayOne); int ary[7]; for (int i = 0; i < 7; i++) { printf("Enter amount taken in hour %d:", i + 1); scanf("%d", &ary[i]); } ave = average(size, ary); printf("\nThe average for the 1st day is: %.3lf", ave); printf("\n\nEnter day that you want to see average donation amount for:"); scanf("%s", dayTwo); if(strcmp(dayOne, dayTwo)== 0) { printf("\nEnter a different day please: "); scanf("%s", dayTwo); } for (int i = 0; i < 7; i++) { printf("Enter amount taken in hour %d:", i + 1); scanf("%d", &ary[i]); } ave = average(size, ary); printf("\nThe average for the 2nd day is: %.3lf", ave); return 0; } double average(int size, int ary[7]) { int sum = 0; double ave; for (int i = 0; i < size; i++) { sum = sum + ary[i]; } ave = sum / size; return ave; }
希望这会有所帮助。
答案 2 :(得分:0)
在调用平均值函数之前,尚未设置大小变量。 ave = average(size,ary);
可以将size初始化为0,然后在for循环中将其递增,如下所示:
double size = 0;
double ave;
printf("Enter day that you want to see average donation amount for: ");
scanf("%s", dayOne);
{
int ary[7];
for (int i = 0; i < 7; i++)
{
printf("Enter amount taken in hour %d:", i + 1);
scanf("%f", &ary[i]);
size++;
}
ave = average(size, ary);
printf("\nThe average for the day is: %f", ave);
}
double ary [7]; 代替 intary [7];