寻找元素平均的问题

时间:2018-11-28 00:37:44

标签: c repl.it

使用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;
}

3 个答案:

答案 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接受整数也是不正确的。除了这些,我还将在下面列出其他一些故障以及相应的修复程序。我还附带了完整的工作代码以及输出。

  1. 错误: size变量未初始化。

    固定::由于您有固定的小时数,因此可以直接使用7或通过size使用。因此,在声明变量时对其进行初始化。只是一个建议伙伴,对int使用size。 ==> int size = 7;

  2. 错误:接受数组值的输入。数组ary的类型为int,但是您使用了%f,它是float的格式说明符。

    修复:使用%d,它是int数据类型的格式说明符。 ==> scanf("%d", &ary[i]);

  3. 错误:用于打印平均值的格式说明符。如果类型为%f,则再次使用float来表示ave,而变量double则是平均值。

    修复::使用%lf的格式说明符double。 ==> printf("\nThe average for the 2nd day is: %.3lf", ave); .3前的lf只是为了限制小数点数为3。这是可选的。

  4. 错误::您接受第二天并显示与第一天相同的消息,但是为此的scanf不在{{1 }}循环。因此,无论第二个输入日与第一个输入日是否相同,它都会提示用户输入该日的另一个名称。

    修复:只需将if移到scanf循环中,即可检查当天是否与前一天相同。

  5. 我不会真的将其称为错误,因为这只是我需要做的一项改进。您接受第二天,该第二天应与第一天有所不同,并提示将找到平均值。但是您没有计算这一天的平均值。因此,我已将该部分包括在代码中。

代码:

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)

  1. 双倍大小;

在调用平均值函数之前,尚未设置大小变量。 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);
}
  1. 如果目标是接收双倍的用户输入,则用于保存这些值的数组应该为double。

double ary [7]; 代替 intary [7];