我有一个小程序正在尝试建立直角三角形。
程序给出的边界是,底部和高度必须都在[10,20]范围内。
该代码对于构建范围为[10,19]的三角形似乎效果很好。 但是,在[n,20]或[20,n]的边界条件下,输出变为混乱状态,并拒绝退出生成三角形中间(在底线和顶线之间)的for循环。
非常感谢您协助我们指出问题所在,谢谢。
我已经调查了这个问题,但是我没有实践,应该被视为新手。
问题肯定是在“ BUILD”注释之后的while或嵌套循环。
请注意,在此提供的代码块级别之上,可能定义了一个或两个不相关的变量。
//TRIANGLE//
if (shapeselect=2)
{
int base;
int height;
//prompt use for base measurement//
cout<<"Please select the size of the BASE of your triangle, in the range [10,20]\n"<<endl;
cin>>base;
while (base!=10&&base!=11&&base!=12&&base!=13&&base!=14&&base!=15&&base!=16&&base!=17&&base!=18&&base!=19&&base!=20)
{
cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout<<"You have entered an invalid value.\nPlease enter a valid value for the BASE of your triangle in the range of [10,20].\n";
cin>>base;
}
//prompt user for height measurement//
cout<<"Please select the size of the HEIGHT of your triangle, in the range of [10,20].\n";
cin>>height;
while (height!=10&&height!=11&&height!=12&&height!=13&&height!=14&&height!=15&&height!=16&&height!=17&&height!=18&&height!=19&&height!=20)
{
cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout<<"You have entered an invalid value.\nPlease enter a valid value for the HEIGHT of your triangle, in the range [10,20].\n";
cin>>base;
}
//BUILD TRIANGLE//
string bottom(base, '*');
string top="*";
int middlerows=height-1;
cout<<top<<endl;
while (middlerows!=1)
{
int middlespacechars;
for (middlespacechars=0; middlespacechars!=base-2; ++middlespacechars)
{
string middlespace(middlespacechars, ' ');
cout<<"*"<<middlespace<<"*\n";
--middlerows;
}
}
cout<<bottom<<"\n"<<endl;
cout<<"^TRIANGLE\n";
cout<<"BASE = "<<base<<endl;
cout<<"HEIGHT = "<<height<<endl;
cout<<goodbye<<"\n"<<endl;
}
}
打印三角形的顶部(单个“ *”)。 然后,三角形的中间部分无限重复(星号在其之间间隔有空格)。 对行进行计数,似乎达到了以2为基数的空格的情况,但没有退出。好像到达了'19 / 20'行。
答案 0 :(得分:1)
经过一些调试之后,看来您的代码对于以!=高度为底的任何输入都中断了。
问题出在您的for
循环中–您在while
循环中的逻辑是中间行应该从height-1
开始倒数,直到达到1
为止,但这是正确的,但是在for
中,如果基数和高度不同,则会遇到问题-循环将中间行强制为负值,这会导致它错过middlerows != 1
的转义条件。
例如,如果用户输入11, 15
,则在第一个遍历中,中间行将为14,并且for循环将从0到最多9(高度2)计数,并递减每次都是中间人。在此循环结束时,您的中间行现在为5。5 != 1
,因此循环将再次运行。
再次运行后,中间行位于-4。 -4 != 1
,因此循环再次运行,将中间行降低到-13 ...然后就一直持续下降(或直到您变回幸运为止,以某种方式完美地击中middlerows=1
)。< / p>