我使用Xcode的方式有误还是写错了程序?

时间:2019-02-24 08:38:04

标签: c++

所以我在做一个有关正弦的C ++问题。

它说sin x可以通过多项式x-(x ^ 3/6)+(x ^ 5/120)-(x ^ 7/5040)近似,它告诉我输出两个近似的sin值和通过cmath计算的正弦值。

输入的单位是度,我们必须首先将其转换为弧度,然后找出正弦。

样本运行(输入只有45个,其他是我们的输出):

角度:45 大约Sin = 0.70710647 cmath sin = 0.70710678

我试图为此编写代码。当我按Command + R时,尽管程序说“ build success”,但什么也没发生。我是Xcode的新手,所以不确定我是否正确使用Xcode或编写错误程序。有人可以帮忙吗?

[err,result] = await to(db.query('insert into result(reg_no,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,essay1,essay2,essay3) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)',[req.session.reg, req.body.q1.value, req.body.q2.value, req.body.q3, req.body.q4, req.body.q5, req.body.q6, req.body.q7, req.body.q8, req.body.q9, req.body.q10, req.body.essay1, req.body.essay2, req.body.essay3]));

my code

2 个答案:

答案 0 :(得分:1)

关于您的问题的我的 猜测 :您运行该程序,它耐心等待您的输入。

使用

cin >> angleDeg;

您的程序似乎正在停止,正在等待您在IDE控制台窗口中提供一些输入。由于您尚未编写任何提示,因此没有任何输出可告诉您它正在等待输入。

我建议您先添加一些输出以要求输入:

cout << "Please enter angle in degrees: ";
cin >> angleDeg;

答案 1 :(得分:0)

  

当我按Command + R时,尽管程序说“ build success”,但什么也没发生。

我猜answerSome programmer dude应该可以解决此问题,但是,正如注释中所指出的那样,所发布的代码中存在更糟糕的问题,这可能是由于对函数应如何理解的误解所致。用C ++声明和调用。

考虑一下:

double approxSin(double angleDeg) {
    if (-180<angleDeg<180) return approxSin(/* Some unreadable expression */);
}

足以产生一些警告:

prog.cc:7:22: warning: result of comparison of constant 180 with expression of type 'bool'
                       is always true [-Wtautological-constant-out-of-range-compare]
    if (-180<angleDeg<180) return approxSin(angleDeg-(...));
        ~~~~~~~~~~~~~^~~~
prog.cc:6:35: warning: all paths through this function will call itself [-Winfinite-recursion]
double approxSin(double angleDeg) {
                                  ^

关系运算符从左到右进行求值,以便编译器将-180<angleDeg<180之类的表达式读为(-180 < angleDeg) < 180-180 < angleDeg的结果是bool,导致编译器对该表达式的警告始终为true。

可以将其写为-180 < angle && angle < 180,但是在给定OP的分配后,应针对正负pi测试角度。另外,还应该编写替代分支。

第二个警告是关于函数的递归调用的,没有任何替代路径,这是没有意义的。我只能猜测OP误解了如何从函数返回值。

可以使用std::pow或应用Horner方法以更具可读性的方式评估多项式本身。我将在后面显示一个示例。

另一个大问题(通常是某种程度上的问题)是在“通话”站点中,这根本不是通话:

cout << "approxSin = " << &approxSin << endl;

最终打印出1,其原因可以在以下问答中找到:How to print function pointers with cout?

最后,我要注意的是,虽然作业特别要求将输入的角度从度转换为弧度(如std::sin的参数所示),但发布的代码仅检查以度为单位的范围,而不进行任何转换

以下实现比较了评估sin()函数的不同方法

#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <cmath>

namespace my {

// M_PI while widespread, isn't part of the ISO standard    
#ifndef M_PI
constexpr double pi = 3.141592653589793115997963468544185161590576171875;
#else
constexpr double pi = M_PI;
#endif    

constexpr double radians_from_degrees(double degrees)
{
    return degrees * pi / 180.0;
}

constexpr double convert_angle_to_plus_minus_pi(double angle)
{
    while ( angle < -pi )
        angle += 2.0 * pi;
    while ( angle > pi ) {
        angle -= 2.0 * pi;
    }
    return angle;
}

// Approximates sin(angle), with angle between [-pi, pi], using a polynomial
// Evaluate the polynomial using Horner's method
constexpr double sin_a(double angle)
{
    // A radian is passed, but the approximation is good only in [-pi, pi]
    angle = convert_angle_to_plus_minus_pi(angle);

    // Evaluates p(a) = a - a^3 / 6 + a^5 / 120 - a^7 / 5040
    double sq_angle = angle * angle;
    return angle * ( 1.0 + sq_angle * (-1.0/6.0 + sq_angle * ( 1.0/120.0 - sq_angle / 5040.0)));
}

double sin_b(double angle) {
    angle = convert_angle_to_plus_minus_pi(angle);
    return angle - pow(angle, 3) / 6.0 + pow(angle, 5) / 120.0 - pow(angle, 7) / 5040.0;
}

} // End of namespace 'my'

int main()
{
    std::cout << " angle    std::sin      my::sin_a     my::sin_b\n"
              << "-----------------------------------------------\n"
              << std::setprecision(8) << std::fixed;

    for (int i = -90; i < 475; i += 15)
    {
        double angle = my::radians_from_degrees(i);

        std::cout << std::setw(5) << i
                  << std::setw(14) << std::sin(angle)
                  << std::setw(14) << my::sin_a(angle)
                  << std::setw(14) << my::sin_b(angle) << '\n';
    }
    return 0;
}