C++ 理解循环不变量

C++ 理解循环不变量,c++,loops,assert,C++,Loops,Assert,我认识的一位大学一年级新生在上计算机科学导论课时,向我求助于他的一项家庭作业。我读了几遍,不好意思承认我不知道他们要什么。问题是: 下面给出了一个循环的轮廓。完成程序,以便它读取x和y值,验证它们(通过继续提示用户,直到他们输入正确的值),然后运行,以使给定的断言始终为真。在程序中必须为真的四个点包括循环不变断言。除非在给定的assert(…)语句中,否则不能使用乘法运算符 assert(x>0 && y>0); while(...) { assert(sum

我认识的一位大学一年级新生在上计算机科学导论课时,向我求助于他的一项家庭作业。我读了几遍,不好意思承认我不知道他们要什么。问题是:

下面给出了一个循环的轮廓。完成程序,以便它读取x和y值,验证它们(通过继续提示用户,直到他们输入正确的值),然后运行,以使给定的断言始终为真。在程序中必须为真的四个点包括循环不变断言。除非在给定的assert(…)语句中,否则不能使用乘法运算符

assert(x>0 && y>0);
while(...)
{
    assert(sum == i*(x+1));
    ...
    ...
}
assert(sum == y*(x+1));

我不知道什么是循环不变量,所以我在谷歌上搜索并阅读了这篇文章。由此我收集到的第一条assert语句告诉我,在循环期间,我不应该允许x和y为负值。说实话,我被困在这一点上了。有人能帮我理解他们的要求吗?

家庭作业的描述不完整,几乎毫无意义

然而,我们可以推断,这是关于让用户输入两个正整数,并计算乘积,而不使用乘法运算符,作为和

通常,正整数的乘积可以这样定义为和:

2次b=b+b
(a+1)乘以b=b+(a乘以b)

通过要求保留一般规则来推断操作数1和0的大小写

最后一个等式与您展示的断言的相似性可能不是巧合


无论如何,它可以很好地作为循环不变量工作。随着循环变量的增加,循环不变量仍然保持不变,并确保有一个好的产品。因此,当循环完成时,循环不变量对该乘积的约束,加上循环变量在这一点上的值,确保您有一个x*y的乘积。

我想我是循环变量?必须在循环之前读取一个x和y。或者x和y是否有起始值?是否有求和的初始值?如果任何一个
断言
s求值为false,则程序将不会运行。将
i
作为每次执行循环时都会更改的变量。您可能希望引用此线程@你知道我对这个问题所知道的一切。谢谢你的帮助。关于计算正整数乘积的观察是有意义的。我想我对循环试图实现的目标感到困惑。它只是寻找任意两个正数吗?是“循环不变断言”断言(sum==i*(x+1));?假设我关于作业的理论是正确的,循环应该是用户输入的“计算正整数的乘积”。所以它不是“寻找任意两个正数”。是的,循环不变量是断言。:-)我现在明白了,这是有道理的。非常感谢。