尽管达到退出条件,循环仍重复

时间:2019-07-09 02:05:04

标签: c++ loops

我有一个小程序正在尝试建立直角三角形。

程序给出的边界是,底部和高度必须都在[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'行。

1 个答案:

答案 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>