如何做一个;如果。。。那么,如果。。。。那么,如果两者都没有……”; 我已经做了一个简单的应用程序,在C++中玩FiZZBuz,虽然这不一定是C++问题,但什么是最好的方法来做if语句,所以它做如下:

如何做一个;如果。。。那么,如果。。。。那么,如果两者都没有……”; 我已经做了一个简单的应用程序,在C++中玩FiZZBuz,虽然这不一定是C++问题,但什么是最好的方法来做if语句,所以它做如下:,c++,if-statement,C++,If Statement,如果(x)那么:a, 如果(y)那么:b, 如果(x)和(y)那么:a和b, 如果两者均不存在,则: 这是我目前的做法: #include <iostream> using namespace std; int main () { int factor1 = 7; int factor2 = 15; bool found = false; string factor1_word = "Fizz"; string factor2_word =

如果(x)那么:a,
如果(y)那么:b,
如果(x)和(y)那么:a和b,
如果两者均不存在,则:

这是我目前的做法:

#include <iostream>
using namespace std;

int main ()
{
    int factor1 = 7;
    int factor2 = 15;
    bool found = false;
    string factor1_word = "Fizz";
    string factor2_word = "Buzz";
    int n = 1000;
    for (int i = 1; i < n+1; i++)
    {
        if (i % factor1 == 0)
        {
            cout << factor1_word;
            found = true;
        }
        if (i % factor2 == 0)
        {
            cout << factor2_word;
            found = true;
        }
        if (found == 0)
        {
            cout << i;
        }
        cout << endl;
        found = false;
    }
    return 0;
}
#包括
使用名称空间std;
int main()
{
整数因子1=7;
整数因子2=15;
bool-found=false;
字符串因子1_word=“Fizz”;
字符串因子2_word=“Buzz”;
int n=1000;
对于(int i=1;i
仅此而已,请按此编写代码

if     (x && !y)  { a(); }
else if(y && !x)  { b(); }
else if(x &&  y)  {a(); b(); /* or maybe a_and_b() to make sense */}
else {/* nothing */}
&&!
实现“但不是如果…”。注意逻辑AND运算符
&&
,而不是位运算符
&
(最初我弄错了,或多或少是一个输入错误),onyl在某些情况下偶然获得了所需的行为。
else
s使“始终只有一个”。
最后一个
else{}
,如果没有
if
,则将“不为'x或y'做任何事”变为
“对任何未明确涵盖的案例都不做任何事情”。这是我建议的一种做法,总是明确地对“其他所有事情”进行编码,以便有机会注意到您实际上没有涵盖所有可能的案例

为了将所有(在两个二进制输入的情况下为四个)情况进行清晰的分类,请阅读卡诺-维奇图()和相应的逻辑优化。

对于(int i=0;i 始终从零开始,因为在大多数数据结构(如数组或向量)中,0是起始索引,并且尝试保持代码简单易读,u的方式是最有效的方式,因为for循环的运行时效率将是o(n)级,无论是什么情况

对于(int i=0;i

始终从零开始,因为在大多数数据结构(如数组或向量)中,0是起始索引,并且尝试保持代码简单易读,u的方式是最有效的方式,因为for循环的运行时效率将是o(n)级,无论是什么情况


您可以使用(!found)而不是(found==0)

看起来像是代码复查堆栈交换的一个问题。通过什么属性,您可以确定“更好”的方法而不是“相当好”的方法?请查看标记的定义:“优化”(optimization)并选择一个。我想您会喜欢最后一个“教师幸福”(teacher happiness)。将此视为代码审阅,我觉得这很好。在我看来,这是完全可读的。分配
true
然后比较
==0
有点矛盾。如果(!found),为什么不
?@Chipster你是说是否有<1000的数字可以被7和15除?试试7*15==105。第一个
否则
会使程序运行不正确,应该删除。第二个
find=true;
是冗余的。是的,这会有不同的行为,因为如果我s触发后,它就不需要麻烦去检查另一个了。请解释你的解决方案,以及其他一些东西,以帮助消除StackOverflow是免费代码编写服务的误解。现在你删除了这两个
else
s,你的代码基本上与OP没有什么不同。@HolyBlackCat好的,现在我明白了。这行代码确实有一个对标志的影响(我短视地认为这会破坏冗余),但对于else,标志不会对输出产生影响(我现在认为这是更间接的冗余形式)和重置。感谢您让我思考得更久。这比OP的原始解决方案可读性要低得多,而且比它需要的复杂得多。
否则如果(x&&y){a();b();}
是多余的,如果您只删除前两个if上的
!x
!y
条件。如果
a()之外的其他条件
b()当两个条件都为真时调用了
,这是有意义的,但因为它们是相同的,所以它的代码更干净,只会让失败发生。他并不是说他不希望在
x&&y
的情况下发生
反应。事实上,恰恰相反。他非常明确地说,他希望这两种情况都发生这是一个例子。@侦探Velkku感谢你的输入。不幸的是,我意识到自己犯了错误,而不是<代码>和代码>而不是<代码> & &代码>。关于可读性,我们显然有不同的意见。我同意你的代码是可读的。但是如果你考虑输出,它似乎很清楚。至少对我来说,输出的可读性是个问题。“FizzBuzz”比“Fizz,Buzz”更不可取(猜测),例如,“FizzBuzz,Buzz”是x&y的输出,这是OPs代码无法实现的。这将是一个明确的反应
a_和_b()
,正如我在那一行的评论中所建议的。基于这个假设(我承认这是一个假设)代码的其余部分是逻辑结果。此外,该结构可以很容易地应用于对可能的输入和期望的输出进行逻辑优化分析(在卡诺的帮助下),这对于更具“创造性”的人来说并不那么容易用一个共同的标志隐式ORing结果的方式。观点和假设分开。我感谢你表达你的观点。@TEDLYNGOM准确。我意识到的时候我在别处。感谢你指出。我本来打算从零开始for循环,但我想让程序模拟真实的游戏,在其中y