0

我的作业有问题。

1) 我应该用输入 a、b 和 c 编写函数 SSS。我需要输出 alpha、beta 和 gamma。

2) 我应该用输入 a、b 和 gamma 编写函数 SWS。我需要输出 c、alpha 和 beta。

这是我的代码:

#include <iostream>
#include <cmath>
#include <math.h>
#include <cstdio>

using namespace std;

double SSS_alpha(double a, double b, double c){

    int bot1 = -2*b*c;
    if(bot1==0.0){
        return 0.0;
    }

    double alpha = acos((a*a-b*b-c*c)/bot1);
    const double rad = 0.5729577951308232088;
    return alpha*rad;

}

double SSS_beta(double a, double b, double c){

    double bot2 = -2*c*a;
    if(bot2==0.0){
        return 0.0;
    }

    double beta = acos((b*b-c*c-a*a)/bot2);
    const double rad = 0.5729577951308232088;
    return beta*rad;
}

double SSS_gamma(double a, double b, double c){

    double bot3 = -2*b*a;
    if(bot3==0.0){
        return 0.0;
    }

    double gamma = acos((c*c-a*a-b*b)/bot3);
    const double rad = 0.5729577951308232088;
    return gamma*rad;
}


double WSW_seite_c(double a, double b, double gamma){
    double c_1 = (a*a+b*b-2*a*b*cos(gamma));
    double c = sqrt(c_1);
    return c;

}



int main(){
    cout << SSS_alpha(5.0, 7.0, 8.0)<<endl;
    cout <<SSS_beta(5.0, 7.0, 8.0)<<endl;
    cout <<SSS_gamma(5,7,8)<<endl;
    cout <<"Seite c: "<<WSW_seite_c(5, 7, 0.81)<<endl;

}

我只能在一个函数中返回一个参数。我有很多任务 1 的功能:对于 alpha,对于 beta,对于 gamma。而且我不知道如何在一个函数中编写它。我只写了一个函数来查找任务 2 的 c。

我是 C++ 新手。如果你能帮助我,我会很高兴。:)

4

4 回答 4

2

首先,您不需要cstdio包含iostream您最好在 C++ 中执行的操作,因为cstdio只是将 C 库迁移到 C++。

至于您的问题,听起来您需要按值传递变量。您最喜欢的 C++ 书籍应该告诉您,在某些情况下,您需要“返回”多个值。在这种情况下,您可以传递指针(C 风格)或更安全的对函数的引用,这些函数类似于指针。

所以你实际上会定义你的函数如下:

void SSS(double a, double b, double c, double & alpha, double & beta, double & gamma);

或者如@Ripi2 所述,将值打包在 a 中struct并返回该类型的值:

/* Thanks to NathanOliver in the comments */
struct Values {
    double a;
    double b;
    double c;
};

Values SSS(double a, double b, double c) {
    Values values;
    /* Do stuff */
    return values;
}
于 2018-11-06T17:01:51.300 回答
2

按照建议返回结构或使用类 Triangle 是完美的解决方案,这是我通常使用的。

但是,在一些简单的情况下,通过一个元组返回多个值可能非常方便。
我在下面展示了一个简单的“工作”示例。
请注意,对于超过 3 个返回对象,我通常会避免这种解决方案,以避免混淆。

#include    <iostream>
#include    <tuple>
std::tuple<double, double, double> f(double x, double y){
    double a = x;
    double b = x+y;
    double c = x-y;
    return std::make_tuple(a, b, c);
}
int main() {
    double a, b, c;
    std::tie (a, b, c) = f (1.0, 2.0);
    std::cout << "a = " << a << "\n";
    std::cout << "b = " << b << "\n";
    std::cout << "c = " << c << "\n";
    return 0;
}

我希望代码是自我解释的。
可以使用 C++17 简化语法。我没有使用这些简化,因为我当前的编译器不兼容!
这种方法可以与结构一结合,因为可以通过一个元组返回多个结构。

编辑:我刚刚看到 NathanOliver 已经在评论中提到了元组的可能性......

于 2018-11-06T19:03:58.510 回答
1

是的,你只能从一个函数中返回一个对象。但是你可以让它返回一个复合对象,比如结构或类。传统上,您将结构用于仅数据对象,因为它们在 C 中就是如此。

struct Triangle
{
    double a;
    double b;
    double c;
};

然后你可以Triangle从一个函数返回一个对象。并以这种方式访问​​其成员:

Triangle tri1;     // first, create an instance of the struct
tri1.a = 5.0f;      // assign a value to a member

为您的数据类型选择有意义的名称(就像您的变量一样)并始终设计数据类型以便它们代表它们的名称是一种很好的做法。


为了使代码更具表现力,您可以使用更面向对象的方法进一步发展。您可以提供Triangle计算其角度的数据类型成员函数,以便您可以“询问”Triangle它的角度是多少。

(此时您还应该将其命名为类,因为它不再是纯数据结构,但这是一个约定问题。在 C++ 中,结构和类几乎相同。)

class Triangle
{
    public:
    // everything in this section can be accessed from outside

    // this is a constructor. It is a special function that lets you create a Triangle
    Triangle(double pa, double pb, double pc)
        : a(pa), b(pb), c(pc)   // initialize the members
    {}

    // getters for the private members (not needed but that way they can't directly be changed)
    double get_a() const
    {
        return a;
    }
    double get_b() const
    {
        return b;
    }
    double get_c() const
    {
        return c;
    }

    double alpha() const;
    double beta() const;
    double gamma() const;
    // should be const because they dont change anything about the object

    private:   
    // the default access for classes, everything in this section can only be accessed by member functions

    double a;
    double b;
    double c;
};

// member function definitions outside of class declaration
double Triangle::alpha() const
{
    // calculate and return alpha...
}
double Triangle::beta() const
{
    // calculate and return beta...
}
double Triangle::gamma() const
{
    // ...
}

你可以这样使用这个类:

int main()
{
    // create a Triangle by calling the constructor
    Triangle tri1(5.0, 7.0, 8.0);
    std::cout << "Alpha: " << tri1.alpha() << std::endl;
    std::cout << "Beta: " << tri1.beta() << std::endl;
    std::cout << "Gamma: " << tri1.gamma() << std::endl;
    return 0;
};
于 2018-11-06T17:36:44.440 回答
1

Astruct将是做你想做的最简单的方法。您也可以创建一个类,但这可能是家庭作业的过度解决方案(它们基本上是相同的,但请参阅我的评论线程以了解我对此事的看法)。

一个结构声明是这样的:

struct containerName
{
    int val_a;
    double val_b;
    //and so on : you put what ever you need
}

然后结构基本上变成了一种你可以使用的类型,就像int,等等。doublebool

这是一个很好的阅读以及struct如何使用它

于 2018-11-06T16:57:43.203 回答