Треугольник, конструкция C ++, проблема с вычислением углов - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблема с домашним заданием.

1) Я должен написать функцию SSS со входами a, b и c. Мне нужно вывести альфа, бета и гамму.

2) Я должен написать функцию SWS с входами a, b и gamma. И мне нужно вывести c, альфа и бета.

Вот мой код:

#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: для альфы, для беты, для гаммы. И я не знаю, как я могу написать это в одной функции. Я написал только одну функцию для поиска c для задачи 2.

Я новичок в C ++. Я был бы рад, если бы вы могли мне помочь.

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Возвращение структуры или использование класса 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. Я не использовал эти упрощения, потому что мой текущий компилятор не совместим!
Этот подход можно комбинировать со структурным, так как можно возвращать несколько структур через кортеж.

Редактировать: Я просто вижу, что Натан Оливер уже упоминал о возможности кортежа в комментарии ...

0 голосов
/ 06 ноября 2018

Во-первых, вам не нужно cstdio, если вы включаете iostream, что лучше делать в C ++, поскольку cstdio - это просто библиотека C, перенесенная в C ++.

Что касается вашей проблемы, похоже, вам нужно передать переменные по значению. Ваша любимая книга C ++ должна сказать вам, что есть такие случаи, как ваш, когда вам нужно «вернуть» более одного значения. В этом случае вы можете передавать указатели (стиль C) или более безопасные ссылки на функции, которые действуют как указатели.

Таким образом, вы на самом деле определяете свою функцию следующим образом:

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

Или, как указано @ Ripi2, упаковать значения в 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;
}
0 голосов
/ 06 ноября 2018

Да, вы можете вернуть только один объект из функции. Но вы можете сделать так, чтобы он возвращал составной объект, такой как структура или класс. Традиционно вы используете структуры только для объектов данных, потому что это то, что они были в 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;
};
0 голосов
/ 06 ноября 2018

A struct будет самым простым способом сделать то, что вы хотите. Вы также можете создать класс, но это может быть излишним решением для домашней работы (они в основном одинаковы, но посмотрите мою ветку комментариев, чтобы узнать мою точку зрения по этому вопросу).

объявление структуры выглядит так:

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

Затем структура в основном становится типом, который вы можете использовать почти как int, double, bool и т. Д.

Вот хорошее чтение на struct и как его использовать

...