从等式中得不到正确的答案。此外,无限循环

时间:2014-02-09 23:34:23

标签: c++ infinite-loop do-while

好的,所以如果我以一定的速度和持续时间以光速行进,我应该计算通过多少时间。是的,这是功课。我大部分时间都想到了,但是当我进入40岁的时候和60岁的时候,当我得到50时,我得到0.008305.那会怎么样?

此外,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;
}

4 个答案:

答案 0 :(得分:2)

循环始终重复,因为您输入了字符yn并声明了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;

更新

公式中还有一个错误。

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

给出负数,因此是错误的。删除括号

sqrt(1 - v2² / c²)

转换为

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

给出正确的输出。

答案 1 :(得分:1)

你有一些类型转换错误:

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

对于无限循环,它是另一种类型错误:将int更改为char。

如果使用c ++ 11,则可以将C声明为:

constexpr int c = 299792458;

答案 2 :(得分:1)

小心整数除法。如果操作首先导致两个整数的除法,则结果将向下舍入为最接近的整数。因此,例如25/10 * 10将得到20的结果。如果结果将是浮点数或双精度数,那么最好在执行除法之前将整数转换为浮点数或双精度数,例如25 / 10.0 * 10将是正常的,因为编译器将执行浮点运算。

当中间结果的范围太大时,您也会遇到整数问题。例如,在大多数系统上,由于整数溢出,100000 * 100000/50000将无法提供您期望的结果。再次,转换为浮点数或双倍优先是一种解决方案。

要调试这些类型的问题,请尝试逐行逐步执行代码并确认变量包含您期望的值,或者将每个操作的结果打印出来并与计算器的结果进行比较,这样您就可以缩小范围它出错了。

答案 3 :(得分:0)

循环问题:

int loopCheck = 'y'int loopCheck = 121相同,因此while循环将检查值121.使用cin >> loopCheck似乎将loopCheck设置为零。我认为这是因为operator>>的算术版本只解析数字而不是将字符转换为它们的ascii值,因此输入非数字会返回0.

你应该调用loopCheck = cin.get()来获取流中的第一个字符,然后调用cin.ignore()来丢弃它后面的换行符。