【问题标题】:What's wrong in my if statements logic?我的 if 语句逻辑有什么问题?
【发布时间】:2016-11-29 13:10:57
【问题描述】:

在这个小程序中,我尝试按降序排列 3 个数字。但似乎有“// 3 2 1 - 不起作用”作为注释的行没有按预期工作。看来我的逻辑是正确的。

我的意见: 4、 554 和 454545

输出:(这不是我想要的) 554、454545 和 4

如果整数 numbThree 的值大于 numbOne 并且如果 numbOne NOT 大于 numbTwo (NOT == else) 它应该输出 numbThree、numbTwo 和numbOne按这个顺序,为什么不行?

#include <iostream>

int main() {
int numbOne = 0, numbTwo = 0, numbThree = 0;
std::cin >> numbOne >> numbTwo >> numbThree;

if (numbOne > numbTwo) {
    if (numbTwo > numbThree) {
        std::cout << numbOne << " " << numbTwo << " " << numbThree << std::endl; // 1 2 3
    }
    else {
        std::cout << numbOne << " " << numbThree << " " << numbTwo<< std::endl; // 1 3 2
    }
}
else if (numbTwo > numbOne) {
    if (numbOne > numbThree) {
        std::cout << numbTwo << " " << numbOne << " " << numbThree << std::endl; // 2 1 3 - works
    }
    else {
        std::cout << numbTwo << " " << numbThree << " " << numbOne << std::endl; // 2 3 1
    }
}
else if (numbThree > numbOne) {
    if (numbOne > numbTwo) {
        std::cout << numbThree << " " << numbOne << " " << numbTwo << std::endl; // 3 1 2
    }
    else {
        std::cout << numbThree << " " << numbTwo << " " << numbOne << std::endl; // 3 2 1 - doesn't work
    }
}

std::cin.get();
std::cin.ignore();
return 0;
}

提前感谢您帮助我。

【问题讨论】:

  • 听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。延伸阅读:How to debug small programs
  • 错在代码应该使用一个小数组和std::sort,而不是这种意大利面条式的代码。
  • 这种情况会被第一个else if捕获,因为numbTwo &gt; numbOne是真的。
  • 当你可能达到第三个条件时仔细观察:if (numbOne &gt; numbTwo) { ... } else if (numbTwo &gt; numbOne) { ...} else if (numbThree &gt; numbOne){ 只有前两个条件为假,即前两个数字相等时,你才能达到它!
  • 感谢 Gavin 和 Gerhardh 指出我的逻辑中缺少的东西,真的很有帮助。谢谢。

标签: c++ if-statement logic


【解决方案1】:

通常,您不能通过 2 次比较对 3 个数字进行排序(请参阅 YSC 的评论,了解信息内容方面的硬性原因)。您的案例1 3 2 已经存在缺陷:如果numbThree &gt; numbOne 怎么办?

一般情况下,您最多允许进行 3 次比较。当然,您可以简单地使用标准库(即语言)提供的排序功能。如果你不想(出于某种原因),那么正确的逻辑(升序)是

if(a<b)
  if     (b<c) // a,b,c   // 2 comparisons
  else if(a<c) // a,c,b   // 3 comparisons
  else         // c,a,b   // 3 comparisons
else
  if(    (a<c) // b,a,c   // 2 comparisons
  else if(b<c) // b,c,a   // 3 comparisons
  else         // c,b,a   // 3 comparisons

因此,在 6 种可能的情况中,有 4 种需要进行 3 次而不是 2 次比较。

【讨论】:

  • 通过两次比较,可以收获 2 位信息。找到 3 个数字的排列有 6 个可能的输出,即 ~2.58bits > 2bits。
【解决方案2】:

不打算作为答案,而是作为 Sam Varshavchik 评论的说明:

错在代码应该使用一个小数组,和std::sort, 而不是这种意大利面条式的代码。

虽然 Sam 对生产代码的看法是正确的,但作为如何实现逻辑的练习,这个问题还可以,并且已经有了解决方案。

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> v(3);
    if (! (std::cin >> v[0] >> v[1] >> v[2])) { exit(-1); }
    std::sort(v.begin(), v.end(), std::greater<int>());
    for (auto c: v) { std::cout << c << " "; }
    std::cout << "\n";
}

【讨论】:

  • 我理解他所说的,但我正在通过一本书学习,我必须用我目前所学的知识来做练习,那就是 if 语句。似乎@Gavin 的答案是最有用的,因为他确实指出了为什么我的代码没有按预期工作。谢谢大家。
  • 不用担心,正如我所说:这并不是一个答案。在您的书中的几章中提供了更多关于如何在 C++ 中完成此操作的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多