2

我需要一些帮助和一些关于去哪里的提示 对于编程任务,我必须编写一个程序来计算用户输入的数字的平方根,并且有一定的要求。

  1. 主程序要求输入数字并显示它,在循环内运行,以便用户可以重复程序而无需关闭它

  2. 计算必须在一个名为sqRoot的函数中完成,该函数将由main使用以下算法调用:

newValue = 0.5 * (oldValue + (X / oldValue))

  1. sqRoot需要使用名为absVal的函数找到数字的绝对值,然后sqRoot将调用该函数

我什至不知道从哪里开始这样的程序。但是,这是我到目前为止所拥有的:

#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);
}

我只是坚持下一步该做什么以及如何正确编写程序。感谢您的帮助和提示!

4

2 回答 2

2

在您的代码段中,您没有显示您是如何实现absVal()的,这是微不足道的:

double absVal( double x )
{
    return  x < 0.0 ? -x : x;
}

假设您知道三元运算符。否则使用if.

您发布的实现main()基本上是一个无限循环,它仅重复计算和打印用户输入的第一个等于或大于 1.0 的数字。这不是你被要求的,我想

我不确定 x >= 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;
 }

希望它有所帮助。

于 2016-04-06T22:58:05.740 回答
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);
 }
于 2016-04-06T16:00:54.827 回答