好的,所以如果我以一定的速度和持续时间以光速行进,我应该计算通过多少时间。是的,这是功课。我大部分时间都想到了,但是当我进入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;
}
答案 0 :(得分: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;
更新
公式中还有一个错误。
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()
来丢弃它后面的换行符。