没有从方程式中得到正确的答案.还有无限循环
Not getting the right answer from an equation. Also, infinite looping
好的,所以我应该计算一下,如果我以一定的速度和持续时间以光速前进,会经过多少时间。是的,这是家庭作业。我大部分时间都想清楚了,但当我当时进入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;
}
循环总是重复,因为您输入了字符y
或n
,并且loopCheck
被声明为
int loopCheck = 'y';
这意味着,
std::cin >> loopCheck;
查找整数,但找不到。根据编译器的版本,loopCheck
将保持不变或设置为零,请参见"std::basic_stream::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));
给出正确的输出。
您有一些类型转换错误:
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;
小心整数除法。如果一个运算首先导致两个整数的除法,则结果将四舍五入到最接近的整数。因此,例如25/10*10将给出20的结果。如果结果是浮点或双精度,那么最好在执行除法之前将整数转换为浮点或双值,例如25/10.0*10就可以了,因为编译器会执行浮点运算。
当中间结果的范围变得太大时,在整数中工作也会遇到问题。例如,在大多数系统上,由于整数溢出,100000*100000/50000不会给您预期的结果。同样,先转换为浮点或双精度是一个解决方案。
要调试这些类型的问题,请尝试逐行遍历代码,确认变量包含您期望的值,或者打印每个操作的结果,并与计算器的结果进行比较,这样您就可以缩小错误的范围。
循环问题:
int loopCheck = 'y'
与int loopCheck = 121
相同,因此while循环将检查值121。使用cin >> loopCheck
似乎将loopCheck
设置为零。我认为这是因为operator>>
的算术版本只解析数字,而不是将字符转换为ascii值,所以输入非数字会返回0。
您应该调用loopCheck = cin.get()
来获取流中的第一个字符,然后调用cin.ignore()
来丢弃后面的换行符。
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- Qt 在另一个线程中无限循环
- 没有从方程式中得到正确的答案.还有无限循环
- 为什么此代码不显示计算的正确答案,为什么它会无限循环?