C语言中的平均值、最大值和最小值程序

3

我正在使用C语言编程,需要编写代码从用户那里获取n个数字并找出这些数字的最小值、最大值、平均值和平方和。目前我已经完成了平均值和平方和部分,但是最小值和最大值的计算让我很困扰。

请注意,我只具备基础的编程知识,还没有学习到数组。我只知道逻辑运算符、函数、循环以及stdlib.h、math.h和stdio.h库的使用。

以下是我的代码。在编译时,当我尝试使用float和double时,平均数函数给了我很多问题,因此将其乘以1.0进行修正。我现在有所有结果,只差最小值和最大值。我得到的最大值总是最后一个输入的数字,最小值为0。

#include<stdio.h>
int main()
{
    float average;
    int i, n, count=0, sum=0, squaresum=0, num, min, max;


    printf("Please enter the number of numbers you wish to evaluate\n");
    scanf_s("%d",&n);

    printf("Please enter %d numbers\n",n);

    while(count<n)
    {
        min=0;
        max=0;

            if(num>max)
               max=num;
            if(num<min)
               min=num;

            scanf_s("%d",&num);

        sum = sum+num;
        squaresum = squaresum + (num*num);

        count++;
    }
        average = 1.0*sum/n;

    printf("Your average is %.2f\n",average);
    printf("The sum of your squares is %d\n",squaresum);    



    printf("Your maximum number is %d\n",max);
    printf("Your minimum number is %d\n",min);

return(0);
}
9个回答

3

您的算法还不够正确。以下是正确的实现:

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

int main(void)
{
    float average;
    int n, num, count = 0, sum = 0, squaresum = 0;
    int min = INT_MAX, max = INT_MIN;
    bool gotAnswer = false;

    /* Don't Let User Enter Wrong Input */
    while(!gotAnswer)
    {
        printf("Please enter the number of numbers you wish to evaluate: ");
        if(scanf_s("%d", &n) != 1)
        {
            /* User Entered Wrong Input; Clean Up stdin Stream*/
            while(getchar() != '\n')
            {
                 continue;
            }
        }
        else
        {
            /* User Input Was Good */
            gotAnswer = true;
        }
    }

    /* Clear stdin Stream Just In Case */
    while(getchar() != '\n')
        continue;

    while(count < n)
    {
        /* Don't Let User Enter Wrong Input */
        gotAnswer = false;
        printf("Enter number %d: ", count + 1);
        if(scanf_s("%d", &num) != 1)
        {
            /* User Entered Wrong Input; Clean Up stdin Stream */
            while(getchar() != '\n')
                continue;

            /* Let User Try Again */
            continue;
        }
        else
        {
            /* User Input Was Correct */
            gotAnswer = true;

            /* Clear stdin Stream Just In Case */
            while(getchar() != '\n')
                continue;
        }

        if(num > max)
            max = num;
        if(num < min)
            min = num;

        sum += num;
        squaresum += num * num;
        count++;
    }

    average = 1.0 * sum / n;

    printf("Your average is %.2f\n", average);
    printf("The sum of your squares is %d\n", squaresum);    
    printf("Your maximum number is %d\n", max);
    printf("Your minimum number is %d\n", min);

    system("pause");
    return 0;
}

我加入了错误检查和恢复机制。如对逻辑有任何疑问,请随时询问。


1
检查 scanf() 的结果,并使用 min = INT_MAX,max = INT_MIN - chux - Reinstate Monica
@chux 我知道你会确保我做得正确,所以才这么做的。 :-D - Fiddling Bits
@chux 你收到了我的圣诞愿望清单!谢谢圣诞老人 Chux! - Fiddling Bits

2

按照您当前的代码编写方式,min必须从较高的值(而非0)开始,否则代码将无法正常运行。选择的最佳值是int的最大可能值。

您还应考虑是否要在每次循环时重置这些变量。


1

在循环外输入第一个num,并将其分配给maxmin

scanf("%d",&num);
max = min = num;  

将您的while循环改为无限循环。
while(1) {...} 

现在检查条件,判断您的计数器count是否等于n,如果是,则跳出无限循环break

if(count == n)
    break;  

修改后的完整代码如下:
#include<stdio.h>
int main()
{
    float average;
    int i, n, count=0, sum=0, squaresum=0, num, min, max;

    printf("Please enter the number of numbers you wish to evaluate\n");
    scanf_s("%d",&n);

   printf("Please enter %d numbers\n",n);

   scanf_s("%d",&num);
   max = min = num;

   while(1)
   {
        if(num>max)
           max=num;
        if(num<min)
           min=num;

     sum = sum+num;
     squaresum = squaresum + (num*num);

     count++;
     if(count == n)
        break;
     scanf_s("%d",&num);

   }
    average = 1.0*sum/n;

printf("Your average is %.2f\n",average);
printf("The sum of your squares is %d\n",squaresum);



printf("Your maximum number is %d\n",max);
printf("Your minimum number is %d\n",min);

return(0);
}

1
假设列表中的第一个数字为最小值和最大值。 将每个后续字符与当前最小值和当前最大值进行比较,并相应地更新。

0
你可以使用这段代码,它检查循环是否是第一次运行。如果是第一次运行,它将把n的值赋给最小值和最大值变量,然后继续运行。当它第二次运行时,它会检查并发现程序已经运行了两次,因此不会再用n的值初始化变量而不进行比较。
int n, limit, sum = 0, minimum, maximum;
float average;
bool firstTime = "true";

printf("\nEnter Limit: ");
scanf("%d", &limit);

printf("\nEnter %d numbers: \n", limit);
for (int i = 0; i < limit; i++)
{
    scanf("%d", &n);
    if (firstTime)
    {
        minimum = n;
        maximum = n;
        firstTime = false;
    }
    if (minimum > n)
    {
        minimum = n;
    }

    if (maximum < n)
    {
        maximum = n;
    }
    sum = sum + n;
}

average = sum / limit;
printf("\nMinimum: %d", minimum);
printf("\nMaximum: %d", maximum);
printf("\nSum: %d", sum);
printf("\nAverage: %.3lf", average);

0

你的 while 循环应该长这样

   min=3;
   max=0;
while(count<n)
    { 

     scanf("%d",&num);
    if(num>max)
    max=num;
    if(num<min)
    min=num;

    sum = sum+num;
    squaresum = squaresum + (num*num);

    count++;
}

我同意 Robert Harvey♦ 的观点。 你必须设置 min


@RobertHarvey minmax不在循环内。 - AJ.

0

你的代码有一些问题:

  1. num应该在minmax之前被读取
  2. while循环第一次执行时,你应该只是将num分配给maxmin

像这样:

  int min = 0;
  int max = 0;

  // If your compiler supports C99 standard you can put
  // bool first_time = true;
  int first_time = 1;

  while (count < n) {
    printf("Please, enter the next number\n");
    scanf_s("%d", &num); 

    // If your compiler supports C99 you can put it easier:
    // if (first_time) { 
    if (first_time == 1) {
      first_time = 0;
      max = num;
      min = num;
    }
    else {
      if(num > max)
        max = num;

      if(num < min)
        min = num;
    }
  ...

1
@Ed Heal:boolean(bool)仅出现在C99中;由于问题中没有提供使用的C标准信息,因此我将其放置为int。 - Dmitry Bychenko
@DimitryBychenko - 我们已经进入2014年了,因此可以假设我们拥有更现代的编译器! - Ed Heal
@EdHeal告诉所有使用微软编译器的人,如果他们想学习C89以外的任何东西,就要尽快换编译器!:-P - user539810

0

添加一个布尔值,命名为moved,给定的值min、max和0是循环的起始点

#include<stdio.h>
int main()
{
    float average;
    int i, n, count=0, sum=0, squaresum=0, num, min, max;

    bool first = true;
    printf("Please enter the number of numbers you wish to evaluate\n");
    scanf_s("%d",&n);

    printf("Please enter %d numbers\n",n);
        min=0;
        max=0;

    while(count<n)
    {
            scanf_s("%d",&num);

        if (first) {
           first = false;
           min = max = num;
        }
            if(num>max)
               max=num;
            if(num<min)
               min=num;


        sum = sum+num;
        squaresum = squaresum + (num*num);

        count++;
    }
        average = 1.0*sum/n;

    printf("Your average is %.2f\n",average);
    printf("The sum of your squares is %d\n",squaresum);    



    printf("Your maximum number is %d\n",max);
    printf("Your minimum number is %d\n",min);

return(0);
}

应该考虑检查 scanf 的返回值。

0
int marks , marks_count=0 , max=0 , min=100 , marks_number=1;
float total , avg;

printf("Hit enter to input marks of 10 student.\n\n");
getchar();

do
{
    printf("Input %d Mark : " , marks_number);
    scanf("%d" ,& marks);


    if (marks>max)
    {
        max=marks;
    }

    else if (marks<min)
    {
        min=marks;
    }

    marks_count++;
    marks_number++;

    total=total+marks;
}

while (marks_count<10);
while (marks_number<10);


avg=total/marks_count;

printf("\n\nAverage marks are : %.2f\n" , avg);
printf("Maximum marks are : %d\n" , max);
printf("Minimum marks are : %d\n\n\n" , min);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接