c ++中的“for loop”错误

时间:2014-09-15 22:08:10

标签: c++ loops for-loop

我正在尝试编写一个for循环来累加2个整数之间的和 2-9 = 2 + 3 + 4 + 5 ... + 9 我使用if语句来确定输入中的较大整数。 不知何故,即使条件返回false值,for也会执行一次。 因此我一直得到错误的价值 这是我写的代码。 提前谢谢。

#include <iostream>
using namespace std;
int main(){
    int in1, in2;
    void accumulate_sum(int i1, int i2);
    cout<<"Enter two integer:"<<endl;
    cout<<"Integer 1:"<<endl;
    cin>>in1;
    cout<<"Integer 2:"<<endl;
    cin>>in2;
    accumulate_sum(in1, in2);
    return 0;
}

void accumulate_sum(int i1, int i2){
    int i, sum, ca;
    if (i1 > i2)
    {
        ca=1;
        for (i=i2;i<(i1+1); i++) {
            sum+=i;
        }
    }
    else {
        i=i1;
        for (i;i<(i2+1); i++) {
            sum+=i;

        }
    }
    switch (ca) {
        case 1:
            cout<<"the sume from "<<i2<<" to "<<i1<<" is "<<sum<<endl;
            break;

        default:     cout<<"the sume from "<<i1<<" to "<<i2<<" is "<<sum<<endl;
            break;
    }
}

4 个答案:

答案 0 :(得分:2)

一个简单的解决方案:

程序中存在的问题是因为在开始添加值之前,您没有初始化sum。您还可以检查交换机中的ca,即使路径中有未初始化的路径。将它们都设置为您声明它们的0,一切都应该有效。


进一步改进/需要思考的事项:

要改进,存储最小值和最大值可以使您的功能更漂亮更快:

void accumulate_sum(int i1, int i2) {
    int sum = 0;
    int min = i1;
    int max = i2;
    if (i1 > i2) {
        min = i2;
        max = i1;
    }

    for (int i = min; i <= max; i++)
        sum += i;

    cout << "the sum from " << min << " to " << max " is " << sum << endl;
}

使用science of partial sums,您可以使用单个公式重写for。 由于1和n之间的所有自然数之和可以简化为......

enter image description here

我们可以证明minmax的所有自然数之和等于(((从1到max之和) - (从1到{的总和{1}}))+ min)...

enter image description here

然后我们可以用公式替换我们的min循环...

enter image description here

for

此外,在void accumulate_sum(int i1, int i2) { int min = i1; int max = i2; if (i1 > i2) { min = i2; max = i1; } int sum = (max*(max+1))/2 - (min*(min+1))/2 + min; cout << "the sum from " << min << " to " << max " is " << sum << endl; } 之外宣布您的职能是一种很好的做法,除非您有充分的理由这样做:

main()

答案 1 :(得分:2)

实际上是一个数学公式,用于将所有数字从n加到m,如下所示:

formula http://kepfeltoltes.hu/140916/latex_63cded397d9f50846f8c3c9e55e4af01_www.kepfeltoltes.hu_.png

应用此公式可使您的代码更快更干净,如下所示:

template <class T>
T accumulate_sum(T n, T m) {
    if (m<n) std::swap(n, m);
    return (m*(m+1))/2 - (n*(n+1))/2 + n;
}

当然模板不是必需的,但如果你用无符号整数类型调用函数,那么将它转换为函数内的int(已签名)并不是一个好主意。

安全类型(如果可能的话,不要进行无符号签名(反之亦然)转换),避免不必要的原始循环,并且如果可以,请始终使用STL! 我不是C ++专家(也不想像我一样假装),但记住这些很好!

干杯

答案 2 :(得分:0)

你只忘了将总和设为0。

更多地使用std :: min,std :: max并尽可能多地调整变量范围。

#include <iostream>

void accumulate_sum(int i1, int i2);

int main(){
    int in1, in2;

    std::cout << "Enter two integer:" << std::endl;
    std::cout << "Integer 1:" << std::endl;
    std::cin >> in1;
    std::cout << "Integer 2:" << std::endl;
    std::cin >> in2;

    accumulate_sum(in1, in2);

    return 0;
}

void accumulate_sum(int i1, int i2){
    int sum = 0;
    int min = std::min(i1, i2);
    int max = std::max(i1, i2);

    for (int i=min; i<=max; ++i)
        sum+=i;

    std::cout << "the sum from " << min << " to " << max << " is " << sum << std::endl;
}

我还没有看到你在main函数中声明accumulate_sum。不要这样做。

在代码中留下空白行和空格不是问题,它可以提高可读性。

答案 3 :(得分:0)

试试这个

accumulate_sum(int integer1, int integer2){
     int min = integer1 < integer2 ? integer1 : integer2;
     int max = integer1 > integer2 ? integer1 : integer2;
     int sum = 0;
     for (int i = min; i < max; ++i){
          sum += i;
     }

     cout << "the sum of integers from " << min << " to " << max << " is " << sum;
}

然后删除if和else语句,只需编写一次代码。