【问题标题】:C Integer range must meet 3 different conditionsC 整数范围必须满足 3 个不同的条件
【发布时间】:2018-05-18 01:07:22
【问题描述】:

如果我想将分配给整数的值的范围限制为三个不同的条件。例如;必须在 9 到 95 之间,并且可以被 5 整除,这是否是实现此目的的正确方法?

有人告诉我,我可以有多个条件,只要它们用 && 分隔,但我的代码几乎没有成功。

if (input >= 5 && input <= 95 && input %5)

【问题讨论】:

  • 如果 num % 5 == 0,则一个数字可以被 5 整除。您没有对此进行检查。
  • 请阅读% 运算符的作用;如果 LHS 可以被 RHS 上的值整除,则它不会返回 true
  • @DeiDei 谢谢,有时候答案很明显

标签: c if-statement int


【解决方案1】:

你的代码对我来说似乎很好,除了这一行。

if (input >= 5 && input <= 95 && input %5)

表达式input % 5 返回input/5 的余数。您希望 input 可以被 5 整除,这发生在 input % 5 返回余数 0 时。由于 C 将 0 解释为 false,并且几乎所有其他整数都解释为 true,因此该表达式的作用与您想要的完全相反它要做。尝试使用

if (input >= 5 && input <= 95 && (input % 5 == 0))

这应该做你想做的事。

【讨论】:

    【解决方案2】:

    您的代码存在数量 个问题。首先,彻底的错误:

    • 表达式input % 5 将得到除以五的余数。这意味着如果它一个倍数,你将得到零,否则非零。不幸的是,零被视为 false,因此只有在 input 不是 倍数时才会如此。正确的表达式是(input % 5) == 0

    • 如果您输入的内容不能被解释为整数,scanf 将失败,input 将保留之前的任何值。应该通过检查返回值来捕获并采取行动 - 这会为您提供成功扫描的项目数,因此应该是一个。

    • 您的代码似乎在正常情况下返回该值,但如果无效则返回 nothing

    接下来,虽然不是错误,但这些都是我个人的偏好,它们可以使代码更易于阅读和维护:

    • 我更喜欢显式分隔子表达式,这样我就不必担心优先规则(只要它不会使表达式在处理过程中变得不可读)。为此,我会做出完整的if 声明if ((input &gt;= 5) &amp;&amp; (input &lt;= 95) &amp;&amp; ((input % 5 == 0))

    • 我不是 if (condition) transferControl else ... 构造的忠实拥护者,因为 else 完全是多余的。

    • 我也更喜欢一开始就以本地化的方式进行错误捕获,尽早发现问题。只有通过所有检查后,您才能执行成功部分。

    • 一个函数(假设它是一个函数,这似乎很可能)通常应该做一个的事情,例如检查值是否有效。将问题写入标准输出可能最好留给调用者,以便函数真正可重用。最好有一个函数进行检查并返回一些值来指示是否存在失败,以及 如果值有效。

    • 通常使用puts("something") 比使用printf("something\n") 更好。 printf 调用最好留给您实际需要进行参数格式化的地方。


    考虑到所有这些,我提出的代码如下:

    #include <stdbool.h>
    
    bool InputValidRangeAndMultiple(
        unsigned *pValue,
        unsigned minVal,
        unsigned maxVal,
        unsigned multVal
    ) {
        unsigned input;
    
        // If no unsigned int available, error.
    
        if (scanf("%u", pValue) != 1) return false;
    
        // If value invalid in any way (range or multiple), error.
    
        if ((*pValue < minVal) || (*pValue > maxVal)) return false;
    
        if ((*pValue % multVal) != 0) return false;
    
        // Value is now deemed okay.
    
        return true;
    }
    

    这样就可以调用该函数,提示和错误在“输入和检查”函数之外处理:

    #include <stdio.h>
    
    unsigned value;
    
    puts("Enter Value.\nValue must be divisible by 5 and within 5 and 95...");
    if (! InputValidRangeAndMultiple(&value, 5u, 95u, 5u)) {
        puts("Invalid input...");
        returnOrDoSomethingIntelligent();
    }
    // The 'value' variable is now valid.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-22
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多