没有从方程式中得到正确的答案.还有无限循环

Not getting the right answer from an equation. Also, infinite looping

本文关键字:答案 无限循环 方程式      更新时间:2023-10-16

好的,所以我应该计算一下,如果我以一定的速度和持续时间以光速前进,会经过多少时间。是的,这是家庭作业。我大部分时间都想清楚了,但当我当时进入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;
}

循环总是重复,因为您输入了字符yn,并且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()来丢弃后面的换行符。