【问题标题】:Minimum of all inputs- in CC中所有输入的最小值
【发布时间】:2018-03-26 21:54:23
【问题描述】:

在学习 C 语言课程时,我们学习了 if/else 语句、重复、运算符、循环和 switch。

此分配的目的是让用户输入 5 个数字并返回以下输出:

显示输入的最小数字

显示输入的最大数字

显示输入的五个数字的总和

显示输入的五个数字的平均值

我知道它很长并且可能陷入困境,但它运行并适用于除重复输出零而不是实际最小数字的“最小值”之外的所有内容。不知道我在哪里出错了。任何提示都会有所帮助。

int choice = 0, number, sum = 0, count = 0, minim = 0, max = 0;
float average;

printf("Please enter your first number: ");
scanf("%i", &number);
if (number < minim) {
    minim = number;  }
if (max < number) {
    max = number;  }
   count += number;

printf("Please enter your second number: ");
scanf("%i", &number);
if (number < minim) {
    minim = number;  }
if (max < number) {
    max = number;  }
count += number;

printf("Please enter your third number: ");
scanf("%i", &number);
if (number < minim) {
    minim = number;  }
if (max < number) {
    max = number;  }
count += number;

printf("Please enter your fourth number: ");
scanf("%i", &number);
if (number < minim) {
    minim = number;  }
if (max < number) {
    max = number;  }
count += number;

printf("Please enter your fifth number: ");
scanf("%i", &number);
if (number < minim) {
    minim = number;  }
if (max < number) {
    max = number;  }
count += number;

sum += count;
average = sum / 5;

while (choice != -1) {
    printf("\n\nChoose an option from the menu below to see the results (1,2,3,4) or use (-1) to exit:\n");
    printf("1.  Smallest number entered\n");
    printf("2.  Largest number entered\n");
    printf("3.  Sum of the five numbers entered\n");
    printf("4.  Average of the five numbers entered\n\n");
    printf("\nEnter your selection: ");
    scanf("%i", &choice);

    switch (choice) {
        case 1:
            printf("\n The smallest number entered is %i\n", minim);
            break;
        case 2:
            printf("\n The largest number entered is %i\n", max);
            break;
        case 3:
            printf("\n The sum of the five numbers entered is %i\n", sum);
            break;
        case 4:
            printf("\n The average of the five numbers entered is %.2lf\n", average);
            break;
        default:
        printf("Incorrect menu option selected.\n");
    }
}

printf("\nThank you for your time. Exiting program.\n");

}

【问题讨论】:

  • minim 初始化为一个非常大的数字。例如:INT_MAX 在limits.h 中。 (另外,你说你已经学会了循环。这将是一个使用循环的好地方。)
  • 问题(没有深入研究代码)似乎是您将minim 变量初始化为0。当这与用户输入进行比较时,它几乎总是会失败,因为检查 (userInput
  • ...和max = INT_MIN;
  • 除此之外,我很好奇为什么每个条目都有count += number;,最后是sum += count;,什么时候可以使用sum += number 并摆脱count
  • 为了便于阅读和理解:1) 遵循公理:每行只有一个语句,并且(最多)每条语句一个变量声明。(考虑右大括号' }' 作为单独的语句。2)通过单个空行分隔代码块(forifelsewhiledo...whileswitchcasedefault

标签: c minmax


【解决方案1】:

正如 John3136 所提到的,您可以将初始最小值分配给常量 INT_MAX,并将初始最大值分配给 INT_MIN,您可能应该这样做,因为它会使转换到循环更容易,但更简单的选择是您当前的代码将简单地将用户输入的初始值分配给minim。如果您使用 max 来执行此操作也会有所帮助,因为它可以让您的程序处理负数。

【讨论】:

    【解决方案2】:

    minim 从 0 开始,只有当数字小于 0 时才会重置,所以除非您输入负数...

    2 种方法:

    1. 在开始时将minim 设置为 INT_MAX(一切都将小于 INT_MAX)
    2. minim 设置为某个“不可能的”标记值(例如-1),这样您就可以在第一时间知道if (minim == sentinel),然后设置minim

    INT_MAX 位于limits.h - 请参阅此问题了解更多详细信息Is there a LARGEST_INTEGER macro or something similar? (C)

    没有 1 是最简单的,适用于所有情况。

    正如 cmets 中所指出的:编写的代码是直接顺序的,因此您可以在“输入第一个数字块”中说 minim = number;。我不建议这样做的原因是,如果/当 OP 将数据条目放入循环中时,您需要对 i=0 案例进行特殊处理。我想这与使用哨兵并没有什么不同,因此INT_MAX 是唯一明智的答案。

    【讨论】:

    • 你可以将第一个值赋给 minim。
    • @AidenGrossman 在这种情况下为 true,但是当 OP 意识到确实应该有一个循环时,这将成为循环内的特殊情况处理。
    • 是的,在使用循环时无条件设置第一个值是一种特殊情况(例如for (int i = 0; i &lt; ...; ++i) { if (i == 0) { minim = number; max = number; } if (number &lt; minim) minim = number; if (number &gt; max) max = number; },但它的开销很低,并且不需要limits.h。另外, 如果问题略有不同 [with a function get_minmax(int *arr,int count)], unconditional set 可以在函数内的循环之前完成。特别是,如果需要保留原始值以执行其他操作稍后。所以,50/50 接近 ...
    【解决方案3】:

    只需将第一个数字设为最小值,如下所示:

    printf("Please enter your first number: "); scanf("%i", &number); **minim=number;**

    【讨论】:

      【解决方案4】:

      不要在number 中使用5 个输入,而是使用循环并将值minimmax 设置为第一个输入。

      我已经稍微更改了代码,所以我在下面给出了完整的代码。

      int main() {
      int choice , number, sum = 0, count = 0, minim = 0, max = 0;
      float average;
      for(int i=0;i<5;i++){
              printf("Enter %d number\n",i+1);
              scanf("%d", &number);
              if(i==0){
                  max=number;
                  minim=number;
              }
              else{
              if(number>max){
                  max=number;
              }
              if(number<minim){
                  minim=number;
              }
              }
              sum+=number;
          }
      average=sum/5;
      while (1) {       // infinite loop
          printf("\n\nChoose an option from the menu below to see the results (1,2,3,4) or use (-1) to exit:\n");
          printf("1.  Smallest number entered\n");
          printf("2.  Largest number entered\n");
          printf("3.  Sum of the five numbers entered\n");
          printf("4.  Average of the five numbers entered\n\n");
          printf("\nEnter your selection: ");
          scanf("%i", &choice);
      
          switch (choice) {
              case 1:
                  printf("\n The smallest number entered is %i\n", minim);
                  break;
              case 2:
                  printf("\n The largest number entered is %i\n", max);
                  break;
              case 3:
                  printf("\n The sum of the five numbers entered is %i\n", sum);
                  break;
              case 4:
                  printf("\n The average of the five numbers entered is %.2lf\n", average);
                  break;
              case -1:
                  printf("\n Program Exit\n");
                  exit(0);
              default: 
                  printf("\nIncorrect menu option selected.\n");
          }
      }
      
      printf("\nThank you for your time. Exiting program.\n");
          return 0;
      }
      

      希望能有所帮助。

      【讨论】:

      • 包含不使用内容的头文件是一种糟糕的编程习惯。例如,math.h 的内容没有被使用,因此应该删除该语句。
      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多