0

我认识的一位大学新生正在学习计算机科学课程的介绍,请我帮助他完成一项家庭作业。我通读了几次,我很尴尬地承认我不知道他们要什么。这是问题:

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

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

我不知道什么是循环不变量,所以我搜索并阅读了Wikipedia 文章。从那我收集到的第一个断言语句告诉我,在循环期间我不应该允许 x 和 y 为负数。老实说,我被困在这一点上。有人可以帮我理解他们在这里的要求吗?

4

1 回答 1

1

作业的描述不完整,几乎没有意义。

但是,可以推断它是关于让用户输入两个正整数,并在不使用乘法运算符的情况下计算乘积,作为总和。

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

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

通过要求一般规则成立来推断操作数 1 和 0 的情况。

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

无论如何,它作为循环不变量很好地工作。当你增加循环变量时,循环不变量仍然成立,并确保你有一个好的产品。因此,当循环完成时,循环不变量对该乘积的约束,加上此时循环变量的值,确保您有一个乘积(很容易减少为)x*y。

于 2012-09-28T04:41:38.337 回答