У меня проблема с домашней работой.
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 ++. Я был бы счастлив, если бы вы могли мне помочь. 🙂
Возвращение структуры или использование класса 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 уже упоминал о возможности кортежа в комментарии …
Сначала тебе не нужно 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;
}
struct
будет самый простой способ делать то, что вы хотите. Вы также можете создать класс, но это может быть излишним решением для домашней работы (они в основном одинаковы, но посмотрите мою ветку комментариев, чтобы узнать мою точку зрения по этому вопросу).
объявление структуры выглядит так:
struct containerName
{
int val_a;
double val_b;
//and so on : you put what ever you need
}
Затем структура в основном становится типом, который вы можете использовать почти как int
, double
, bool
и т.п.
Вот хорошее чтение на struct
и как его использовать
Да, вы можете вернуть только один объект из функции. Но вы можете сделать так, чтобы он возвращал составной объект, такой как структура или класс. Традиционно вы используете структуры только для объектов данных, потому что это то, что они были в 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;
};