无法算出这个按数字序列打印数字的小 C++ 程序的最后一个
Cannot work out the last of this little C++ program that prints numbers in numerical sequence
我目前正在做 "Programming: Principles and Practice Using C++",但我无法完成一项特定的练习。
在此程序中,用户将输入三个随机数,然后程序将 return 这些数字按数字顺序排列。如果输入的第一个和第二个数字是最低的,那么第一个和第二个数字 return 是正确的,但第三个数字不是,我不确定为什么。
这是代码:
int main()
{
string barn;
int val1 = 0, val2 = 0, val3 = 0;
cout << "Enter the first number: ";
cin >> val1;
cout << "Enter the second number: ";
cin >> val2;
cout << "Enter the third number: ";
cin >> val3;
if (val1 < val2 && val3)
{
cout << val1 << " ";
if (val1 < val2)
{
cout << val2 << " ";
cout << val3 << " ";
}
else
{
cout << val3 << " ";
cout << val2 << " ";
}
}
else if (val2 < val1 && val3)
{
cout << val2 << " ";
if (val2 < val1)
{
cout << val1 << " ";
cout << val3 << " ";
}
else
{
cout << val3 << " ";
cout << val1 << " ";
}
}
else if(val3 < val1 && val2)
{
cout << val3 << " ";
if (val3 < val1)
{
cout << val1 << " ";
cout << val2 << " ";
}
else
{
cout << val2 << " ";
cout << val1 << " ";
}
}
cin >> barn;
}
1 3 5 打印:1 3 5。
3 1 5 打印:1 3 5。
3 5 1 打印:3 5 1` - 这就是我的问题所在。第二个 else if 语句似乎没有正常工作,我不确定为什么。
这和你想的不一样:
if (val1 < val2 && val3)
当(val1
大于 val2
)且(val3
的计算结果不同于 0
)时,您的 if
条件为真
你应该做 if (val1 < val2 && val1 < val3)
同样的规则适用于其他 if
语句。
另外你内心的if
说法也不正确。示例:检查 val1 < val2 && val1 < val3
后,您应该检查 val2 < val3
。下面是您的第一个 if
语句的示例:
if (val1 < val2 && val1 < val3)
{
cout << val1 << " ";
if (val2 < val3)
{
cout << val2 << " ";
cout << val3 << " ";
}
else
{
cout << val3 << " ";
cout << val2 << " ";
}
}
最后你应该想到用户多次输入相同值的情况。
顺便说一句,351 不会让您进入第三个 else if 语句。检查您的运算符优先级或完全写出您的运算符,例如:
else if ((val3 < val1) && (val3 < val2))
另见:http://en.cppreference.com/w/cpp/language/operator_precedence
Imo,您应该始终完整地写出您的运算符,尤其是如果您是该语言的新手,这真的很有帮助。 :)
这个:
if(val1 < val2 && val3){...}
并不代表您认为的那样。正确的写法是:
if((val1 < val2) && (val1 < val3)){...}
额外的括号可能不是必需的,但我在这种情况下的规则是安全而不是抱歉:)
内容:
if(val1 < val2 && val3){...}
的作用是,如果布尔值 (val1 < val2)
和 (val3)
为真,则 returns 为真。如果 val3
为 非零 (**cf EDIT 部分),则 (val3)
被评估为真,否则被评估为假。
更改您的代码以考虑到这一点,然后告诉我们它是否有效,我没有检查其余部分是否正确。
编辑
我的回答被编辑为说除 0 以外的任何值都被评估为真。
对了,谢谢 :) 我想知道是什么误导了我可能对其他人有用。
- 我在 C++ 文档中找不到任何关于它的参考,但我想这是每种语言的规范。
- 表达式 (5 == true) returns false,但是 (5) 被计算为 true。
我想那是因为在 (5 == true) 中,true 被转换为 int 值 1 并且比较是在 int 值之间进行的,而不是布尔值。 (true == 5) 也 returns false.
这肯定是初学者的错误,我以此为教训进行明确的条件测试,并且从不相信程序会按照我的意愿对其进行评估。
我目前正在做 "Programming: Principles and Practice Using C++",但我无法完成一项特定的练习。 在此程序中,用户将输入三个随机数,然后程序将 return 这些数字按数字顺序排列。如果输入的第一个和第二个数字是最低的,那么第一个和第二个数字 return 是正确的,但第三个数字不是,我不确定为什么。 这是代码:
int main()
{
string barn;
int val1 = 0, val2 = 0, val3 = 0;
cout << "Enter the first number: ";
cin >> val1;
cout << "Enter the second number: ";
cin >> val2;
cout << "Enter the third number: ";
cin >> val3;
if (val1 < val2 && val3)
{
cout << val1 << " ";
if (val1 < val2)
{
cout << val2 << " ";
cout << val3 << " ";
}
else
{
cout << val3 << " ";
cout << val2 << " ";
}
}
else if (val2 < val1 && val3)
{
cout << val2 << " ";
if (val2 < val1)
{
cout << val1 << " ";
cout << val3 << " ";
}
else
{
cout << val3 << " ";
cout << val1 << " ";
}
}
else if(val3 < val1 && val2)
{
cout << val3 << " ";
if (val3 < val1)
{
cout << val1 << " ";
cout << val2 << " ";
}
else
{
cout << val2 << " ";
cout << val1 << " ";
}
}
cin >> barn;
}
1 3 5 打印:1 3 5。 3 1 5 打印:1 3 5。 3 5 1 打印:3 5 1` - 这就是我的问题所在。第二个 else if 语句似乎没有正常工作,我不确定为什么。
这和你想的不一样:
if (val1 < val2 && val3)
当(val1
大于 val2
)且(val3
的计算结果不同于 0
)时,您的 if
条件为真
你应该做 if (val1 < val2 && val1 < val3)
同样的规则适用于其他 if
语句。
另外你内心的if
说法也不正确。示例:检查 val1 < val2 && val1 < val3
后,您应该检查 val2 < val3
。下面是您的第一个 if
语句的示例:
if (val1 < val2 && val1 < val3)
{
cout << val1 << " ";
if (val2 < val3)
{
cout << val2 << " ";
cout << val3 << " ";
}
else
{
cout << val3 << " ";
cout << val2 << " ";
}
}
最后你应该想到用户多次输入相同值的情况。
顺便说一句,351 不会让您进入第三个 else if 语句。检查您的运算符优先级或完全写出您的运算符,例如:
else if ((val3 < val1) && (val3 < val2))
另见:http://en.cppreference.com/w/cpp/language/operator_precedence
Imo,您应该始终完整地写出您的运算符,尤其是如果您是该语言的新手,这真的很有帮助。 :)
这个:
if(val1 < val2 && val3){...}
并不代表您认为的那样。正确的写法是:
if((val1 < val2) && (val1 < val3)){...}
额外的括号可能不是必需的,但我在这种情况下的规则是安全而不是抱歉:)
内容:
if(val1 < val2 && val3){...}
的作用是,如果布尔值 (val1 < val2)
和 (val3)
为真,则 returns 为真。如果 val3
为 非零 (**cf EDIT 部分),则 (val3)
被评估为真,否则被评估为假。
更改您的代码以考虑到这一点,然后告诉我们它是否有效,我没有检查其余部分是否正确。
编辑
我的回答被编辑为说除 0 以外的任何值都被评估为真。
对了,谢谢 :) 我想知道是什么误导了我可能对其他人有用。
- 我在 C++ 文档中找不到任何关于它的参考,但我想这是每种语言的规范。
- 表达式 (5 == true) returns false,但是 (5) 被计算为 true。 我想那是因为在 (5 == true) 中,true 被转换为 int 值 1 并且比较是在 int 值之间进行的,而不是布尔值。 (true == 5) 也 returns false.
这肯定是初学者的错误,我以此为教训进行明确的条件测试,并且从不相信程序会按照我的意愿对其进行评估。