Цикл повторяется несмотря на достижение условия выхода - PullRequest
0 голосов
/ 09 июля 2019

У меня есть небольшая программа, которая пытается построить прямоугольный треугольник.

Границы, заданные программой, заключаются в том, что основание и высота должны находиться в диапазоне [10,20].

Код, кажется, прекрасно работает для построения треугольников в диапазоне [10,19]. Тем не менее, в граничных условиях [n, 20] или [20, n] выходной сигнал становится бесполезным и отказывается выходить из цикла for, который генерирует середину треугольника (между базовой и верхней линиями).

Буду признателен за помощь в определении проблемы, спасибо.

Я изучил проблему, но у меня нет практики, и ко мне следует относиться как к начинающему.

Проблема связана с циклом while или nested после комментария «BUILD».

Обратите внимание, что может быть один или два не относящихся к делу переменных, определенных выше этого уровня кода предоставленного кода.

//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;
 }

}

Верх треугольника печатает (один «*»). Затем средняя часть треугольника повторяется бесконечно (звездочки с пробелами между ними). Считая строки, кажется, что он достигает случая пробелов base-2, но не выходит. Кажется, чтобы добраться до линии «19/20» .

1 Ответ

1 голос
/ 09 июля 2019

После небольшой отладки кажется, что ваш код ломается для любого ввода, где base! = Height.

Проблема в вашем цикле for - ваша логика в цикле while, в которой средние стрелки должны отсчитывать от height-1 до тех пор, пока не достигнет 1, верна, но в for вы столкнетесь проблемы, если основание и высота не совпадают - цикл приводит средние стрелки к отрицательному значению, что приводит к тому, что оно пропускает условие экранирования middlerows != 1.

Если, например, пользователь вводит 11, 15, то при первом прогоне средние стрелки будут равны 14, а цикл for будет отсчитывать от 0 до 9 (высота-2), уменьшая средние стрелки каждый время. В конце этого цикла ваши средние теперь равны 5. 5 != 1, поэтому цикл будет запущен снова.

После повторного запуска срединные стрелки находятся в -4. -4 != 1, поэтому цикл запускается снова, опуская средние стрелки до -13 ... и затем он просто продолжает падать, навсегда (или пока вы не обернетесь вокруг и не повезете, каким-то образом идеально набрав middlerows=1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...