为什么这段代码做错了计算?

时间:2019-07-27 06:23:44

标签: string c++11 char substring findbugs

调试该代码时,我注意到代码中提到的sum值往往会给出错误的结果。我不明白为什么会这样。

我的程序使用一个字符串来计算其子字符串并计算所有子字符串中存在的元音数量,最后一个求和值是同时所有所有元音计数之和

我已经尝试通过代码进行调试,无法理解代码出了什么问题

#include <iostream>
using namespace std;

int main()
{
long long int t,j,n,l,count=0,sum=0;
cin>>t;
string s;
//char i;
while(t>0)
{
    l=0;
    sum=0;
   count=0;
    cin  >>  s;
    n= s.length();
    for(j=0;j<n;j++)
    {
        if(s[j]=='a' || s[j]=='e' || s[j]=='i' || s[j]=='o' || s[j]=='u' || s[j]=='A'|| s[j]=='E' || s[j]=='I' ||s[j]=='O' || s[j]=='U')
        {
              count++;
             l=j;

             cout<<"l="<<j<<endl;
             cout<<"j="<<j<<endl;
             cout<<"n="<<n<<endl;
             cout<<"n-1="<<n-1<<endl;
             cout<<"j+1="<<j+1<<endl;

            sum=sum+((n-l)*(j+1));

            cout<<"SUM is="<<sum << endl;
        }
    }
     if(l==0)
        {
            sum=0;
        }
        cout<<"Second part Sum="<<endl;
    cout<<sum<<endl;
    t--;
}

}

程序编译并运行,没有错误消息。但是,由于和的计算不正确,因此存在逻辑错误... t3206-range-diff.sh

为什么总和= 20?,应该是25或35 ...

为澄清起见,这是此解决方案的问题说明: t3206-range-diff.sh

1 个答案:

答案 0 :(得分:2)

程序提供的输出正确。为什么您认为应该是25/30?

您写了

sum=sum+((n-l)*(j+1));

当j = 1时,则l = j = 1 所以(n-1)(j + 1)=(6-1)(1 + 1)= 5 * 2 = 10

所以sum = sum +(n-l)*(j + 1)= 0 + 10 = 10

当j = 4时l = j = 4

所以(n-1)(j + 1)=(6-4)(4 + 1)= 2 * 5 = 10

所以sum = sum +(n-l)*(j + 1)= 10 + 10 = 20

我认为您搞砸了l(字母)和1。 如果您写了(n-l)*(j+1),那将是= 5 * 5 = 25个结果,最终的总和= 10 + 25 = 35