我需要一些帮助以及一些关于去哪里的提示 对于编程分配,我必须编写一个程序来计算用户输入的数字的平方根,并且有一定的要求。
主请求数字并显示它,在循环内操作,以便用户可以在不关闭的情况下重复该程序
计算必须在名为 sqRoot 的函数中完成,该函数将由 main 使用该算法调用:
newValue = 0.5 *(oldValue +(X / oldValue))
我甚至不知道从哪里开始这样的程序。但是,这就是我到目前为止所做的:
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
double sqRoot();
double absVal();
int i = 0;
double X;
int main()
{
sqRoot = sqrt(X);
double X;
// Calculations
cout << "Please enter a number: ";
cin >> X;
while (X <= 0)
{
cout << "*** Error: Invalid Number! *** " << endl;
cout << "Please enter a number: ";
cin >> X;
}
while (X >= 1)
{
cout << "The Square Root is: " << sqRoot << endl;
}
}
double sqRoot ()
{
double newValue;
double oldValue ;
while (abs(newValue - oldValue) > 0.0001)
{
newValue = 0.5 * (oldValue + ( X / oldValue));
oldValue = newValue;
cout << " The square root is: " << newValue << endl;
}
return (newValue);
}
我只是坚持下一步该做什么以及如何正确编写程序。 感谢您的帮助和提示!
答案 0 :(得分:2)
在您的代码段中,您无法展示如何实施absVal()
,这是微不足道的:
double absVal( double x )
{
return x < 0.0 ? -x : x;
}
假设您了解三元运算符。否则使用if
。
您发布的main()
的实现基本上是一个无限循环,它仅重复计算和打印用户输入的等于或大于1.0的第一个数字。那不是你要求的,我想
我不确定x&gt; = 1条件是否必须(微小值需要更多迭代)或假设你的以及在负数的情况下你应该做什么(你可以使用absVal而不是打印错误),但你可以写这样的东西:
#include <iostream>
// #include <cmath> <-- you are not supposed to use that
// #include <cstdlib> <-- why do you want that?
// using namespace std; <-- bad idea
using std::cin;
using std::cout;
double absVal( double x );
double sqRoot( double x );
int main()
{
double num;
cout << "This program calculate the square root of the numbers you enter.\n"
<< "Please, enter a number or something else to quit the program:\n";
// this will loop till std::cin fails
while ( cin >> num )
{
if ( num < 0.0 ) {
cout << "*** Error: Invalid input! ***\n"
<< "Please enter a positive number: ";
continue;
}
cout << "The square root of " << num << " is: " << sqRoot(num);
cout << "\nPlease enter a number: ";
}
return 0; // you missed this
}
然后,在sqRoot()
的实现中,您忘记将变量x作为参数传递,初始化oldValue和newValue,如果执行流程进入while循环,它将在第一个循环之后退出,因为在条件之前评估oldValue = newValue;
。尝试这样的事情(我使用相对误差而不是绝对差值来获得更好的精度,使用较小的x值,代价是迭代次数):
double sqRoot(double x)
{
const double eps = 0.0001;
double newValue = 0;
double oldValue = x;
while ( oldValue != 0.0 )
{
newValue = 0.5 * (oldValue + (x / oldValue));
// check if the relative error is small enough
if ( absVal(newValue - oldValue) / oldValue < eps )
break;
oldValue = newValue;
}
return newValue;
}
希望它有所帮助。
答案 1 :(得分:0)
只需进行一些更正
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
double sqRoot(double X);
int main()
{
double X;
// Calculations
cout << "Please enter a number: ";
cin >> X;
while (X <= 0)
{
cout << "*** Error: Invalid Number! *** " << endl;
cout << "Please enter a number: ";
cin >> X;
}
while (X >= 1)
{
cout << "The Square Root is: " << sqRoot(X) << endl;
}
}
double sqRoot(double X)
{
double newValue = 0;
double oldValue = X;
while (true)
{
newValue = 0.5 * (oldValue + (X / oldValue));
if (abs(newValue - oldValue) < 0.0001)
break;
oldValue = newValue;
//cout << " The square root is: " << newValue << endl;
}
return (newValue);
}