C++ 三角表生成器的输入问题 三角函数选择A.正弦,B.余弦,C.正切。 角的单位A度或B弧度 角度的起始值和结束值 从一个角度值到下一个角度值的增量

C++ 三角表生成器的输入问题 三角函数选择A.正弦,B.余弦,C.正切。 角的单位A度或B弧度 角度的起始值和结束值 从一个角度值到下一个角度值的增量,c++,C++,这是我目前的任务。现在我正在尝试,比如说,如果我选择正弦-A,那么我想选择度-A,如何防止这两个发生冲突?我还是新的C++,所以我仍然困惑如何做到这一点。任何帮助都将不胜感激。这是我在这里的第一篇帖子,所以,如果我做错了什么,请原谅我 #include <iostream> #include <iomanip> #include <cmath> const double PI = 3.14159265; using namespace std; int

这是我目前的任务。现在我正在尝试,比如说,如果我选择正弦-A,那么我想选择度-A,如何防止这两个发生冲突?我还是新的C++,所以我仍然困惑如何做到这一点。任何帮助都将不胜感激。这是我在这里的第一篇帖子,所以,如果我做错了什么,请原谅我

#include <iostream>
#include <iomanip>
#include <cmath>

const double PI = 3.14159265;
using namespace std;


int main()
{
    double v1, v2 , i;
    cout << "Trigonometric Table Generator" << endl;
    cout << " Choose the trignometric function(s): A-Sine, B-Cosine, C-Tangent" << endl;
    cout << " (e.g Enter A for Sine or AC for both Sine and Tangent): ";
    char input1;
    cin >> input1;


    cout << " Choose the unit of angle : A - degree or B - radian(e.g Enter A for degree) ";
    char input2;
    cin >> input2;

    if (input2 = 'A') {

        double degrees,i;
        degrees = (PI / 180)* i;
    }

    else if (input2 == 'B') {

        double radians, i;
        radians = ( 180 / PI)* i;

    }

    cout << "Enter the starting value and ending values for the angle, separated with a space: ";
    cin >> v1 >> v2;

    cout << "Enter the increment from one angle value to the next: ";
    cin >> i;



    switch (input1) {

    case 'A':

        double sine;

        for (i = 0; i <= v2; i = i + v1) {

            //degrees
            sine = (PI / 180)* i;

            cout << i << setw(10) << setprecision(3) << sine << endl;
        }
    }
    system("pause");
    return 0;
}

以下是一些让您走上正轨的想法:

首先,在C++中,与大多数其他编程语言一样,在使用变量之前必须对变量赋值。例如:

double radians, i;
radians = ( 180 / PI)* i;
由于在为表达式赋值之前已在表达式中使用i,因此这将导致未定义的行为。相反,尝试移动表达式radians=180/PI*i;在分配给我的for循环的内部

第二,C++变量的范围一般由括号{}决定,它们在内部定义。因此,当你写一些类似于:

if (input2 = 'A') {

    double degrees,i;
    degrees = (PI / 180)* i;
}
那么变量degrees和i只存在于if语句中。即使您使用相同的名称定义了另一个变量,如果它在不同的范围内,它实际上也不是同一个变量

最后,您需要仔细考虑您在这里执行的数学运算。例如,你似乎没有在任何地方调用过sin函数。在C++中,函数使用括号中的参数后面的名称来调用。例如,sin3返回3的正弦值


当你刚开始C++时,这东西可能会很棘手,所以不要灰心!您可能希望向老师或朋友寻求帮助,他们将能够提供更多个性化的帮助,指导您完成整个过程。

让我们按照传统方式进行,让编译器帮助我们。让我们从代码保持不变开始。让我们在启用警告的情况下进行编译,以便查看编译器是否会为我们指出任何潜在的问题。我们通过至少包含-Wall-Wextra来启用gcc/clang警告,对于新的C程序员,我们可能还应该包含-pedantic-Wshadow,使用VS,使用/W3。因此,让我们试着编译您的代码:

g++ -Wall -Wextra -pedantic -Wshadow -std=gnu++11 -Ofast -o trigtable trigtable.cpp
在windows上,在VS Developers命令提示符下创建可执行文件trigtable.exe:

哦,不,编译器说:

trigtable.cpp: In function ‘int main()’:
trigtable.cpp:23:21: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if (input2 = 'A') {
                     ^
trigtable.cpp:25:24: warning: declaration of ‘i’ shadows a previous local [-Wshadow]
         double degrees,i;
                        ^
trigtable.cpp:11:21: warning: shadowed declaration is here [-Wshadow]
     double v1, v2 , i;
                     ^
trigtable.cpp:25:16: warning: variable ‘degrees’ set but not used [-Wunused-but-set-variable]
         double degrees,i;
                ^
trigtable.cpp:31:25: warning: declaration of ‘i’ shadows a previous local [-Wshadow]
         double radians, i;
                         ^
trigtable.cpp:11:21: warning: shadowed declaration is here [-Wshadow]
     double v1, v2 , i;
                     ^
trigtable.cpp:31:16: warning: variable ‘radians’ set but not used [-Wunused-but-set-variable]
         double radians, i;
所以在第23行,我们忘记了=是赋值,而==是比较。固定的

接下来在第25行,-Wshadow警告指出了这样一个事实,即我们在第25行使用的变量i会在第11行中隐藏i的声明。让我们通过将第11行的声明更改为使用描述性名称increment而不是i来解决这个问题

接下来在第25行,我们在第31行设置了可变度和相同的弧度,但在您的程序中都没有使用,是吗?哦,因为我们在if input2=='A'{…}的块范围内声明度,所以它只在该块内可用,并且在该块结束后立即超出范围。这同样适用于if input2==“B”的弧度

此外,在这两种情况下,由于我们没有初始化,我采取了任何输入来设置它,度=π/180*i;当i包含不确定值时,将调用试图使用i的未定义行为

我到底在那里干什么?哦,这是增量的起始值。但我们也没有设定。让我们做这个i,递增,并将递增的读数移到这段代码上面。。。事实上,让我们把所有的输入移到计算之上。如果我们的任何输入是无效的,这将使计算毫无意义。让我们将弧度和度数的声明移到main的顶部,这样它们在整个程序期间都能保持不变

仅进行这些更改并添加快速编译器检查以仅导致系统暂停;如果在windows上运行,则不需要它,否则您的代码可能如下所示:

#include <iostream>
#include <iomanip>
#include <cmath>

const double PI = 3.14159265;
using namespace std;

int main()
{
    double v1, v2 , increment, degrees, radians;
    char input1, input2;

    v1 = v2 = increment = degrees = radians = 0.0;  /* initialize values */

    cout <<  "Trigonometric Table Generator" << endl
         << " Select function(s): A-Sine, B-Cosine, C-Tangent" << endl
         << " (e.g Enter A for Sine or AC for both Sine and Tangent): ";

    if (!(cin >> input1)) { /* validate EVERY user input */
        cerr << "error: invalid input for 'input1'\n";
        return 1;
    }

    cout << " Unit of angle : (A - degree, B - radian): ";

    if (!(cin >> input2)) { /* validate EVERY user input */
        cerr << "error: invalid input for 'input2'\n";
        return 1;
    }

    cout << "Starting and ending angle values ("
         << ((input2 == 'A') ? "degrees" : "radians") << "): ";
    if (!(cin >> v1 >> v2)) { /* validate EVERY user input */
        cerr << "error: invalid input for 'v1 or v2'\n";
        return 1;
    }

    cout << "Enter the angle increment("
         << ((input2 == 'A') ? "degrees" : "radians") << "): ";
    if (!(cin >> increment)) {  /* validate EVERY user input */
        cerr << "error: invalid input for 'increment'\n";
        return 1;
    }

    if (input2 == 'A')
        degrees = (PI / 180.0) * increment;
    else if (input2 == 'B')
        radians = (180.0 / PI) * increment;

    switch (input1) {

        case 'A':
            double sine;

            for (double i = v1; i <= v2; i += increment) {

                //degrees
                sine = (PI / 180.0) * i;

                cout << i << setw(10) << setprecision(3) << sine << endl;
            }
            break;
        case 'B':
            cerr << "case 'B' not implemented\n";
            return 1;
            break;      /* technically not required, but good form */
        default : 
            cerr << "error: invalid function selection\n";
            return 1;
            break; 
    }
#if defined (_WIN32) || defined (_WIN64)
    system("pause");
#endif
    return 0;
}
嗯,等等30 0.524是错的。sin30度是0.5度,而不是0.524度。让我们检查一下我们的计算。。。正弦=π/180.0*i;-那不对,那只是从度到弧度的转换。如果我们将该行更改为:

                sine = sin((PI / 180.0) * i);
正确使用/输出

那更好

您还需要做一些进一步的改进。从使用描述性变量名开始。input1和input2或v1和v2是什么意思?为什么不为input1设置trigfuncs,为input2设置unitangle,为v1设置anglestart,为v2设置angleend。当你的代码中还有100行的时候,这就更有意义了

我在上面内联提供了一些额外的评论。读它们。还要注意的是,这些只是使代码正确编译和计算sin值所需的最小、较小的更改,还需要做很多额外的工作。输入“A”表示度数,“B”表示弧度,然后使用单独的度数和弧度变量的方法有点不可靠。准备好 e代码以角度和弧度增量计算一切,如果选择了度,只需进行转换。你不需要一个开关来处理不同的情况,逻辑上更容易的是在input1中的字符上循环,并在字符上切换要计算的函数,然后在此范围内检查v1、v2和增量是以弧度还是以度为单位。这些只是一些想法,其余的实现留给您


如果您有任何问题,请告诉我。

先了解一些基本知识。看看这个。让我知道,你在寻找什么。cin>>我是什么;然后对于i=0。。。do?@Md.MokammalHossenFarnan谢谢你的链接。它确实有我的项目所需要的基本知识。非常感谢@大卫·兰金>>我;是价值的增量。例如,如果我输入v1=0,v2=180,I=10,它将增加10。哦,我以为你读取I以保持增量,然后在for循环开始时将其重置为I=0,丢失了你刚才读取的增量值。不可能为增量变量选择了另一个名称,如double increment;?哦,天哪,就是这个。非常感谢您的时间和帮助!太感谢你了!v1=v2=增量=度=弧度=0.0;/*初始化值*/为什么必须初始化值=0?如果我们不给它输入一些值,这个值会自动从0开始吗?在C++中,如果你不初始化变量,它的值不一定是0,它可能是任何的。正确的。如果一个变量没有初始化,它的值是不确定的,并且您无意中试图访问它-您调用了未定义的行为,并且您的代码的已定义的可靠执行在此点停止。未定义的行为可以是任何东西,从看似正确完成,到分段错误。因此,在学习时,一个好习惯是在声明变量时初始化它们。v1=v2=。。链条只是为了节省空间。没有魔法。就我个人而言,我只是在自己的行中声明每个变量并初始化它。
$ ./bin/trigtable
Trigonometric Table Generator
 Select function(s): A-Sine, B-Cosine, C-Tangent
 (e.g Enter A for Sine or AC for both Sine and Tangent): A
 Unit of angle : (A - degree, B - radian): A
Starting and ending angle values (degrees): 30 45
Enter the angle increment(degrees): 1
30     0.524
31     0.541
32     0.559
33     0.576
34     0.593
35     0.611
36     0.628
37     0.646
38     0.663
39     0.681
40     0.698
41     0.716
42     0.733
43      0.75
44     0.768
45     0.785
                sine = sin((PI / 180.0) * i);
$ ./bin/trigtable
Trigonometric Table Generator
 Select function(s): A-Sine, B-Cosine, C-Tangent
 (e.g Enter A for Sine or AC for both Sine and Tangent): A
 Unit of angle : (A - degree, B - radian): A
Starting and ending angle values (degrees): 30 45
Enter the angle increment(degrees): 1
30       0.5
31     0.515
32      0.53
33     0.545
34     0.559
35     0.574
36     0.588
37     0.602
38     0.616
39     0.629
40     0.643
41     0.656
42     0.669
43     0.682
44     0.695
45     0.707