Member 14044947 Ответов: 2

Программа продолжает работать бесконечно, выводя очень большие числа


У меня есть код, который должен выводить 2 разных числа, а после этого выводить 3 разных числа в 3 столбцах по 50 строк, в последнем операторе else. Однако выход просто посылает одно действительно длинное число, выводит заголовок для каждого столбца, но либо никакого числа, либо ноль под ним, непрерывно.

#include <iomanip>
#include <math.h>
#include <iostream>
using namespace std;

const double g_m=32.0;
double thetaDegrees, sph;
double sec=0.0, t;
double x, y, z=0.0;

 
double range(double sph, double g_m, double thetaDegrees) 
  {
  return (pow(sph,2.0))/g_m*sin(2*thetaDegrees);
  } 
double timer(double range, double thetaDegrees, double sph) 
 {
 return range/sph*cos(thetaDegrees);	
 }
 
double distance(double sph, double sec, double thetaDegrees) 
 {
 return sph*sec*cos(thetaDegrees);
 }
 
double height(double sph, double thetaDegrees, double sec, double z) 
 {
   return ((sph*sec*sin(thetaDegrees))-(1.0/2.0*pow(sec,2.0))+z);
 }  
 
int main()
{
	int choice;
    bool shapes = true;
    while (shapes != false){

       cout << " Choose one \n ";
       cout << " 1 KPH.\n";
       cout << " 2 MPH.\n";
       cin >> choice;

       switch (choice)
       {
          case 1:
          {
           cout << "You chose KPH \n";
           cout << "Enter angle(degrees) and velocity(kph) \n";
           cin >> thetaDegrees >> sph;

          if ( sph==0 )
          {
             cin.clear();
             cin.ignore(512, '\n');
         	 cout<< "Bad data \n";
      	  }	   
          
		  else 
      	  {
		      if(thetaDegrees<0.0) 
		      {
                 cerr<<"degrees< error! \n";
              }
                 else 
				 {
                     if(thetaDegrees>90)
				     {
                        cerr<<"degrees< error! \n"; 
					 }
		             else 
					 {
					    double myRange = range(sph, g_m, thetaDegrees);
						cout<<fixed;
						cout << setprecision(3);
                        cout<< myRange<<"feet(Range)\n"; //R value is sent to screen
						cout<<fixed;
						cout << setprecision(3);
                        cout<< timer(myRange, thetaDegrees, sph)<<"secs in air\n"; 
				 
                       while(sec<=timer(myRange, thetaDegrees, sph))
					   {
				          double sec = sec+ (timer(myRange, thetaDegrees, sph)/50.0);
				          cout<<fixed;
				          cout<<setprecision(3); 
		      	  	      cout<<left<<setw(25)<<"Total Flight Time(secs)";
                          cout<<left<<setw(25)<<"Horizontal Distance(ft)";
                          cout<<left<<setw(25)<<"Height(ft)";
			      	      cout<< "\n"<<endl;
				          cout<<left<<setw(25)<<sec;
				          cout<<left<<setw(25)<<x;
				          cout<<left<<setw(25)<<y;
                          cout<< "\n"<<endl;

                   	   }
                     }
				 }
		  }	   	 
		 }
	break;	 
   case 2:
          {
           cout << "You chose MPH \n";
           cout << "Enter angle(degrees) and velocity(mph) \n";
           cin >> thetaDegrees >> sph;

          if ( sph==0 )
          {
             cin.clear();
             cin.ignore(512, '\n');
         	 cout<< "bad data \n";
      	  }	   
		  else 
      	  {
		      if(thetaDegrees<0.0) 
		      {
                 cerr<<"degrees< error! \n"; 
              }
                 else 
				 {
                     if(thetaDegrees>90)
				     {
                        cerr<<"degrees< error! \n"; 
					 }
		             else 
					 {
					    double myRange=range(sph, g_m, thetaDegrees);
                        cout<<myRange<<"feet(Range)\n"; 
                        cout<<timer(myRange, thetaDegrees, sph)<<"secs in air\n"; 
				 
                       while(sec<=timer(myRange, thetaDegrees, sph))
					   {
				          double sec = sec+ (timer(myRange, thetaDegrees, sph)/50.0);
				          cout<<fixed;
				          cout<<setprecision(3); 
		      	  	      cout<<left<<setw(25)<<"Total Flight Time(secs)";
                          cout<<left<<setw(25)<<"Horizontal Distance(ft)";
                          cout<<left<<setw(25)<<"Height(ft)";
			      	      cout<< "\n"<<endl;
				          cout<<left<<setw(25)<<sec;
				          cout<<left<<setw(25)<<x;
				          cout<<left<<setw(25)<<y;
                          cout<< "\n"<<endl;

                   	   }
                     }
				 }
		  }	   	 
		 }
       break;
	 case 3:
	   {
          cout << "End \n";
          shapes = false;
	   }  
       break;
         

    }
   }	
return 0;
    

}


Что я уже пробовал:

Я попробовал удалить и добавить заданную точность, и исправил. Я также попытался проверить, есть ли что-нибудь, что могло бы вызвать бесконечный цикл, но я не мог этого увидеть.

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
Я попробовал удалить и добавить заданную точность, и исправил. Я также попытался проверить, есть ли что-нибудь, что могло бы вызвать бесконечный цикл, но я не мог этого увидеть.

Может быть, пришло время научиться использовать отладчик и посмотреть, как работает ваш код.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

W.G.C.

Бесконечный цикл вызван тем, что переменная "sec" повторно объявляется внутри цикла while и используется в тестовом условии. Изменение переменной внутри цикла не влияет на глобальную переменную из-за области видимости переменной; удалите повторное объявление и инициализируйте значение до нуля перед началом цикла.

Кроме того, вот еще несколько пунктов:
Строка заголовка, скорее всего, не нуждается в повторной печати на каждом проходе; переместите ее выше цикла.
Строки 'fixed' и 'setprecision(3)' не нужно выполнять в каждом проходе; переместите их выше цикла.
Строки, содержащие 'endl', не должны выводить '\n', если только вы не хотите, чтобы между каждой выходной строкой были дополнительные пустые строки.
Если я не упускаю его, то, по-видимому, нет кода, который устанавливает значение для " x " и "y"; эти значения всегда будут отображать инициализированное значение (ноль).


}
	double myRange = range(sph, g_m, thetaDegrees);
	cout << fixed; //Moved outside of the loop
	cout << setprecision(3); //Moved outside of the loop
	cout << myRange << " feet(Range)\n"; 
	cout << timer(myRange, thetaDegrees, sph) << " secs in air\n";
	cout << left << setw(25) << "Total Flight Time(secs)"; //Moved outside of the loop
	cout << left << setw(25) << "Horizontal Distance(ft)"; //Moved outside of the loop
	cout << left << setw(25) << "Height(ft)" << endl; //Moved outside of the loop with endl
	while (sec <= timer(myRange, thetaDegrees, sph))
	{
		sec = sec + (timer(myRange, thetaDegrees, sph) / 50.0);
		//Double-blank line removed
		cout << left << setw(25) << sec;
		cout << left << setw(25) << x;
		cout << left << setw(25) << y << endl;
		//Double-blank line removed
	}
}