【发布时间】:2022-01-23 14:45:21
【问题描述】:
#include <iostream>
#include <algorithm>
using namespace std;
void sumrange(int x, int y) {
int sum;
cout << "Enter the first number: ";
cin >> x;
cout << "Enter the second number: ";
cin >> y ;
int bnum = max(x,y);
int snum = min(x,y);
int i = snum;
while (i < bnum) { sum =+ i; i++; }
cout << sum;
}
int main() {
int x, y;
sumrange(x,y);
return 0;
}
我无法从我的输入中得到正确的答案,我尝试了 1 和 4,答案是 3,但它应该是 1+2+3+4,即 10。
【问题讨论】:
-
变量sum未初始化。
-
离题:关于 [
using namespace std]...for循环在这里更合适:for(int i = snum; i <= bnum; ++i) { sum += i; }。注意:因为您想将bnum本身也包含在您需要比较<=的总和中!也有点奇怪的是,您为函数提供了参数,而这些参数的值您从未使用过——然后只使用局部变量。顺便说一下,在将未初始化的x和y传递给函数的main 中是未定义的行为——即使它们从未在sumrange中被读取。 -
请注意,这可以在没有循环的情况下使用
1+2+ ..+ n = n * (n+1)/2这一事实来实现,因此假设x < y,x + (x+1) + ... +y = x + x * (y - x) + 1 + 2 + ... + (y - x) = x (y-x+1) + (y - x) * (y-x + 1) / 2 -
封闭公式的另一种变体:
(bnum * (bnum + 1) - (snum - 1) * snum) / 2... -
您没有在输入后检查流 - 始终这样做是为了捕获无效的用户输入:
if(cin >> x) { /* OK, can go on */ } else { /* some appropriate error handling */ }。虽然在给定的情况下,它会导致一个或两个值为 0,但您可能会再次出现致命错误......
标签: c++ loops function-definition