Функция возвращает -1. # IND00 + объединяющие функции - PullRequest
0 голосов
/ 22 ноября 2018

так что я в основном пытаюсь объединить следующие 3 функции в 1 (это то, что хочет мой учитель, но я не мог заставить его работать, поэтому я сделал 3)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define TOTAL_DEG  (180.0)


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

double berechnung_alpha(double a, double b, double c, double gamma, double alpha)
{
    alpha = gamma * acos((double )(b * b + c * c - a * a) / (2.0 * b * c));
    return alpha;
}

double berechnung_beta(double gamma, double alpha, double beta)
{
    beta = - gamma - alpha + TOTAL_DEG;
     return beta;
}         

так, как я могу получитьфункция, возвращающая значения, если ее всего 1 функция (указатели были бы опцией, но я пока не очень удобен с ними)

Спасибо за помощь!

Ответы [ 3 ]

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

Вы можете иметь перечисление для различных операций и включить это enum для выполнения различных операций в вашей универсальной функции.Как то так:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define TOTAL_DEG  (180.0)

enum oper {LENGTH, ALPHA, BETA};

double berechnung_any(double a, double b, double c, double gamma, enum oper op)
{   
    double retVal;
    switch(op) {
       case LENGTH: 
        retVal = sqrt(a * a + b * b - (2 * a * b * cos(gamma)));
       break;
       case ALPHA:
        retVal = gamma * acos((double )(b * b + c * c - a * a) / (2.0 * b * c));
       break;
       case BETA:
        retVal = - gamma - (gamma * acos((double )(b * b + c * c - a * a) / (2.0 * b * c))) + TOTAL_DEG;
       break;
   }
   return retVal;
}
0 голосов
/ 22 ноября 2018

хорошо, так что я предполагаю, что у вас уже есть переменные a, b, и у вас нет c, alpha и beta, но вы хотите иметь их после вычисления.Вот код, я добавил основную функцию, чтобы продемонстрировать вам, как использовать указатели.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define TOTAL_DEG  (180.0)

//here a and b are transferred by values, c, gamma and alpha are just pointers.
double berechnung_func(double a, double b, double* c, double* gamma, double* alpha){

    *c = sqrt(a * a + b * b - (2 * a * b * cos(*gamma)));
    *alpha = (*gamma) * acos((double )(b * b + (*c) * (*c) - a * a) / (2.0 * b * (*c)));

    return (- (*gamma) - (*alpha) + TOTAL_DEG);
}

int main()
{
    double c, gamma, alpha, beta, a=5, b=6;

    // here we are sending c, gamma and alpha **addresses** to the function.
    beta = berechnung_func(a, b, &c, &gamma, &alpha); 
    printf("c = %d\n gamma = %d\n alpha = %d\n beta = %d\n", c, gamma, alpha, beta);

    return 0;
}
0 голосов
/ 22 ноября 2018

для объединения следующих 3 функций в 1

Использование вызовов существующих функций OP:

void berechnung_all(double a, double b, double c, double gamma,
    double *length, double *alpha, double *beta) {
  *length = berechnung_length(a,b,c,gamma);
  *alpha = berechnung_alpha(a,b,c,gamma, 0);
  *beta = berechnung_beta(a,b,c,gamma, *alpha, 0);
}

Более тесная интеграция

#ifndef M_PI
#define M_PI 3.1415926535897932384626433832795
#endif

#define R2D(r) ((r)*180.0/M_PI)
#define D2R(r) ((r)/180.0*M_PI)

void berechnung_all(double a, double b, double c, double gamma,
    double *length, double *alpha, double *beta) {

  *length = sqrt(a * a + b * b - (2 * a * b * cos(D2R(gamma))));

  // Avoid direct call to `acos()`: prevent `double` math oddities just outside [-1.0...1.0]
  double x = (b * b + c * c - a * a) / (2.0 * b * c);
  if (x > 1.0) x = 1.0;
  if (x < -1.0) x = -1.0;
  *alpha = R2D(gamma * acos(x));

  #define TOTAL_DEG  (180.0)
  *beta = - gamma - alpha + TOTAL_DEG;
}       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...