当前位置:C++技术网 > 资讯 > 习题讲解:4 在VS2010中运行C++ Primer Plus 清单7.17的代码不一样!

习题讲解:4 在VS2010中运行C++ Primer Plus 清单7.17的代码不一样!

更新时间:2017-06-29 10:31:02浏览次数:1+次

C++ Primer Plus 清单7.17中

void subdivide(char ar[],int low,int high,int level);

const int Len = 66;
const int Divs = 6;//这个改成10 ,还是显示六行 |?
int main()
{
char ruler[Len];
int i = 0;
for(i = 1; i < Len -2; i++)
ruler[i] = ' ';
ruler[Len - 1] = '\0';
int max = Len - 2;
int min = 0;
ruler[min] = ruler[max] = '|';
cout <<ruler <<endl;
for(i = 1; i <= Divs; i++)
{
subdivide(ruler,min,max,i);
cout <<ruler <<endl;
for(int j =1; j<Len -2;j++)
{
ruler[j] = ' ';
}
}
system("pause"); 
return 0;
}

void subdivide(char ar[],int low,int high,int level)
{
if(level ==0)
return ;
int mid = (high - low) /2;
ar[mid] = '|';
subdivide(ar,low,mid,level - 1);
subdivide(ar,mid,high,level -1);

}

运行后打印的 '|'不一样,Divs 改成10也显示为6行,而且在关闭Dos窗口弹出另外一个忽略/中断窗口


C++技术网会员解答:

    您好,感谢您对C++技术网的支持和信任。

    很不幸的告诉你,通过仔细的研究和证实,书错了。下面是正确的结果的截图:

在VS2010中运行C++ Primer Plus 清单7.17的代码不一样!

    纠正的代码如下:

void subdivide(char ar[],int low,int high,int level)
{
    if(level ==0)
        return ;
    int mid = (high + low) /2;
    ar[mid] = '|';
    subdivide(ar,low,mid,level - 1);
    subdivide(ar,mid,high,level -1);
} 

或者自己改动代码:


void subdivide(char ar[],int low,int high,int level)
{
    if(level ==0)
        return ;
    int mid = (high - low) /2;
    //ar[mid] = '|';
    //subdivide(ar,low,mid,level - 1);
    //subdivide(ar,mid,high,level -1);
    ar[mid + low] = '|';
    subdivide(ar, low, mid + low, level - 1);
    subdivide(ar, mid + low, high, level - 1);
} 
     问题在于算法。对于中点的定位计算错误,得不到预期的结果,还导致递归产生栈(Stack)错误。

     作者应该不会出现这个基本问题,估计是书在复印(影印)的时候,将+号印成了-号,如果你现在看的不是正版的书,建议还是看正版的纸质书,以免再出现这样的问题。