2014-02-09 2 views
0

Хорошо, поэтому я должен рассчитать, сколько времени пройдет, если я пойду со скоростью света с определенной скоростью и продолжительностью. Да, это домашнее задание. Я его выяснил по большей части, но когда я вхожу 40 на время и 60 лет, я получаю 0.008305, когда мне нужно получить 50. Что происходит?Не получить правильный ответ из уравнения. Кроме того, бесконечный цикл

Кроме того, цикл do while работает неправильно. Он повторяет весь блок кода независимо от того, как я отвечаю и игнорирую инструкции cout и cin, заставляя его давать мне ошибки при оценке v1. Как это исправить?

#include <iostream> 
#include <iomanip> 
#include <conio.h> 
#include <cmath> 

const int c = 299792458; 

int main() 
{ 
    int loopCheck = 'y'; 

    do 
    { 
     int tm = 0; 

     std::cout << "Enter time of travel: " << std::endl; 
     std::cin >> tm; 

     if (tm < 0) 
     { 
      do 
      { 
       std::cout << "You have entered an incorrect value. " 
          << "Please enter a value greater than 0." 
          << std::endl; 
       std::cin >> tm; 

      } while (tm < 0); 
     } 

     double v1 = 0; 

     std::cout << "Enter velocity: " << std::endl; 
     std::cin >> v1; 

     if (v1 <= 0 || v1 >= 100) 
     { 
      do 
      { 
       std::cout << "You have entered an incorrect value. " 
         << "Please enter a value between 0 and 100." 
         << std::endl; 
       std::cin >> v1; 

      } while (v1 <= 0 || v1 >= 100); 
     } 

     double v2 = (v1/100) * c; 
     double ts = tm/(sqrt((1 - (v2 * v2))/(c * c))); 

     std::cout << v2 << " " << c << std::endl; 

     std::cout << std::fixed << std::setprecision(6) << ts 
       << std::endl << std::endl; 

     std::cout << "Would you like to enter more data? (y/n)" << std::endl; 
     std::cin >> loopCheck; 
    } while (loopCheck == 'y'); 

    _getch(); 
    return 0; 
} 
+2

gcc дает следующее предупреждение: a.cpp: 48: 52: warning: integer overflow в выражении [-Woverflow]. Это строка 'double ts = tm ... (c * c)));' –

ответ

2

Цикл повторяется всегда, потому что вы вводите символ y или n и loopCheck объявлен

int loopCheck = 'y'; 

Это означает, что

std::cin >> loopCheck; 

ищет целое число, но не может найти один. В зависимости от версии вашего компилятора loopCheck не изменится или не будет установлен на ноль, см. `std::basic_istream::operator>>. Если вы измените это значение на

char loopCheck = 'y'; 

он должен работать должным образом.

Чтобы устранить проблему Целочисленное переполнение в

double ts = tm/(sqrt((1 - (v2 * v2))/(c * c))); 

вы могли бы объявить c, как, например double

const double c = 299792458; 

Update:

Существует дополнительная ошибка в формуле. У вас есть

sqrt((1 - v2²)/c²) 

, который дает отрицательное количество и, следовательно, является неправильным. Удаление скобки

sqrt(1 - v2²/c²) 

, который переводит к

double ts = tm/(sqrt(1 - (v2 * v2)/(c * c)); 

дает правильный вывод.

+0

Я внесла эти изменения, и они исправили цикл, но на выходе теперь говорит -1. # IND00. Что это значит? – Brandon

+0

Не 'int loopCheck = 'y'' оценивать' int loopCheck = 121'? И char - это просто 8-разрядное целое число без знака. Поэтому изменение на char не приведет к изменению поведения. – lightandlight

+0

@lightandlight Проблема с 'int loopCheck' не является преобразованием' y' в '121', а' std :: istream' ожидает целое число. См. Обновленный ответ. –

1

у вас есть некоторые ошибки типа произнесения:

double v2 = (v1/100.f) * c; 
double ts = tm/(sqrt((1 - (v2 * v2))/(double)(c * c))); 

для бесконечного цикла, это другая ошибка типа: изменение ИНТ на символ.

если вы используете C++ 11, вы можете объявить C как:

constexpr int c = 299792458; 
+0

Что будет constexpr делать здесь над const? – codah

1

Будьте осторожны целочисленного деления. Если операция сначала вызывает деление двух целых чисел, результат будет округлен до ближайшего целого. Так, например, 25/10 * 10 даст результат 20. Если результатом будет float или double, тогда лучше выполнить преобразование целого числа в float или double перед выполнением деления, например, 25/10.0 * 10 будет нормально, потому что компилятор выполнит операции с плавающей запятой.

У вас также будет проблема с работой в целых числах, когда диапазон промежуточного результата становится слишком большим. например, на большинстве систем 100000 * 100000/50000 не даст вам результата, которого вы ожидаете из-за переполнения целого числа. Опять же, преобразование в float или double сначала является решением.

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

0

Looping проблема:

int loopCheck = 'y' такое же, как int loopCheck = 121, так что цикл, пока будет проверить значение 121. Использование cin >> loopCheck кажется, чтобы установить loopCheck к нулю. Я думаю, что это происходит потому, что арифметическая версия operator>> только разбирает цифры, а не преобразование символов в их значение ASCII, поэтому ввод возвращает нецифровые 0.

Вы должны позвонить loopCheck = cin.get(), чтобы получить первый символ в потоке, а затем cin.ignore() чтобы отказаться от символа новой строки, который появляется после него.

+0

Он устанавливает 'loopCheck' в ноль, когда вы используете C++ 11. Он оставляет 'loopCheck' неизменным, когда у вас C++ 03 или ранее. –

+0

gnu ++ 03 (gnu C++ 98) устанавливает его в ноль. Это, как говорится, мне действительно нужно изменить мои флаги компилятора. – lightandlight

Смежные вопросы