【问题标题】:How to create C program to determine lagest number by entered value?如何创建 C 程序以通过输入的值确定最大数字?
【发布时间】:2013-10-24 13:04:08
【问题描述】:

我创建了一个程序来确定最大数,但我的讲师说它并不完美,有人可以让它完美吗?

 #include <stdio.h>
 int main () {
     double a,b=0,n, i;
     printf("limit of n input: ");
     scanf ("%lf",&n);

     for (i=1;i<=n;i++) {
         scanf("%lf",&a);
         if (a>b) b=a;
     }

     printf("%.2lf", b);

     return 0;
 }

【问题讨论】:

  • 在每个printf格式字符串的末尾添加\n,否则调用fflushin 应该是 int 而不是 double ....
  • 这在什么方面不完美?你的讲师在找什么?

标签: c loops for-loop


【解决方案1】:

如果她所说的“不完美”是指“不能正确处理负数或空集”,那么你会想要

  1. 将 n
  2. 读取循环外的第一个数字,因此您不会对可能的最小数字做出假设

【讨论】:

  • 那么,我应该怎么做才能声明最小的可能数字?我必须替换哪个变量?
  • 如果你读入循环外的第一个数字,你就有一个答案不可能小于的值。
【解决方案2】:

我会这样做,对于大量的文字感到抱歉。我认为它来自典型的 Objective-C 风格的长词编程:

#include <stdio.h>

int clean_stdin() {
    while (getchar()!='\n');

    return 1;
}

int main(int argc, char *argv[]) {
    char c;
    signed int count = 0;    // number of numbers to scan

    unsigned int fireErrorMessage = 0;
    do {
        if (fireErrorMessage == 1) {
            printf("You entered not a positive natural number. Please enter a number >0 Examples: 1 22 4012\n"); // output for the user
        }
        if (fireErrorMessage == 0) {
            fireErrorMessage = 1;
        }
        printf("How many integers do you want to insert (Inser a number >0)? ");
    } while (((scanf("%d%c", &count, &c) != 2 || c != '\n') && clean_stdin()) || count < 1);

    signed int indexOfNumber; // for index, declared outside because of output at the end

    signed int highestNumberIndex;
    double highestNumber; // saving the highest value in a helper variable

    fireErrorMessage = 0;
    for (indexOfNumber = 1; indexOfNumber <= count; indexOfNumber++) {
        double scannedNumber;
        do {
            if (fireErrorMessage == 1) {
                printf("You entered not a number. Please enter a number. Examples: 3.0 -1 14\n"); // output for the user
            }
            if (fireErrorMessage == 0) {
                fireErrorMessage = 1;
            }
            printf("Input number %d: ", indexOfNumber); // output for the user
        } while (((scanf("%lf%c", &scannedNumber, &c) != 2 || c != '\n') && clean_stdin()));

        fireErrorMessage = 0;

        if (indexOfNumber == 1 || scannedNumber > highestNumber) {
            highestNumberIndex = indexOfNumber;
            highestNumber = scannedNumber;
        }
    }

    printf("Highest input number on index %d, the value is about %.2lf\n", highestNumberIndex, highestNumber);

    return 0;
}

输出

How many integers do you want to insert (Inser a number >0)? aa5
You entered not a positive natural number. Please enter a number >0 Examples: 1 22 4012
How many integers do you want to insert (Inser a number >0)? -3
You entered not a positive natural number. Please enter a number >0 Examples: 1 22 4012
How many integers do you want to insert (Inser a number >0)? 3
Input number 1: aa
You entered not a number. Please enter a number. Examples: 3.0 -1 14
Input number 1: -50.0001
Input number 2: 51a
You entered not a number. Please enter a number. Examples: 3.0 -1 14
Input number 2: -1.00
Input number 3: -0.1
Highest input number on index 3, the value is about -0.10

【讨论】:

  • 如果 count
  • 非常好。两个建议的改进:在printf 格式字符串的末尾添加\n...并检查给定的count 数字是否大于0。毕竟讲师确实想要“完美”。
  • 并对scanf 进行一些错误检查 - 如果输入是一串文本,scanf 将失败。你也想把它困住。 “完美”代码检查所有输入。
  • 不要打扰 unsigned 尤其是用户输入,没有什么可以阻止用户输入负数。
  • 好的,改了。在 scanf 之后,不需要 \n
【解决方案3】:

此代码适用于循环索引的负数而非数字输入以及循环内的负数而非数字输入。谢谢

  #include <stdio.h>
  #include <math.h>
  int main () {
             int n, i;
             double a,b=0;
             printf("limit of n input: ");
             scanf ("%lf",&n);

            if(n < 0){
                      printf("value of n cannot be negative");
                      return 0;
                     }
           else if (n == 0)
                     return 0;
           else if (isnan(n))
                     return 0;

           else{
             for (i=1;i<=n;i++) 
               {
                   scanf("%lf",&a);
                   if(!isnan(a) && a > 0)
                         { 
                          if (a>b) b=a;
                         }

               }
              printf("%.2lf", b);

              return 0;
               }
             }

【讨论】:

  • 这是什么意思!isnan(a) &amp;&amp; a &gt; 0
  • 这会检查 'a' 是一个数字(不是字符串)并且大于零。如果对您有帮助,请随时投赞成票。谢谢
猜你喜欢
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多