我的if语句逻辑有什么问题?

时间:2016-11-29 13:10:57

标签: c++ if-statement logic

在这个小程序中,我尝试按降序排序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;
}

先谢谢你帮助我。

2 个答案:

答案 0 :(得分:8)

一般情况下,您不能通过2次比较对3个数字进行排序(在信息内容方面,请参阅YSC&#39的评论。您的案例1 3 2已经存在缺陷:如果numbThree > 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个比较。

答案 1 :(得分:1)

不是作为答案,而是作为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";
}