При выполнении кода для вычисления cos x с использованием серии Тейлора ответ будет 1 независимо от того, какой угол я поставил как - PullRequest
0 голосов
/ 08 мая 2020

Мне очень жаль, что я отнимаю часть вашего драгоценного времени. Я просто начинающий программист и пытался скомпилировать относительно простой код (для вас, ребята). На мой взгляд, я правильно понял свои функции, но объявление моей функции output вызывает некоторые проблемы, и мне трудно выяснить, что я сделал не так. В строках 41 и 50 компилятор указывает предупреждение, и я выделил его в своей программе. Я был бы очень признателен, если бы вы могли указать на мою ошибку.

#include<simplecpp>
#include<cmath>
#define pi 3.1415926535897932384626433832795
class calculation{
  private:
  int i=1;
  double t0=1;
  double t1,R,sum=1;
  double precision,degrees,radian,cosx;
  public:
  void getValue();
  void radians();
  double cosf(double radian);
  void output();
};
void calculation::getValue(){
  cout<<"Enter Angle: ";
  cin>>degrees;
  cout<<"Enter Precision: ";
  cin>>precision;
}
void calculation::radians(){
  degrees=abs(degrees);
  radian=(degrees*pi)/180;
}
double calculation::cosf(double radian){
  {
    do{
        R=-(radian*radian)/(2*i-1)/(2*i);
        t1=R*t0;
        sum=sum+t1;
        t0=t1;
        i++;
    }
    while(abs(t1/sum)>precision);
    return sum;
  }
}  
void calculation::output(){
  double cosx = cosf(radian);
  cout<<"cosine of the angle will be: "<<cosx;
}
int main(){
  calculation o1;
  o1.getValue();
  o1.radians();
  double radian=0;
  o1.cosf(radian);
  o1.output();
}

РЕДАКТИРОВАТЬ: Я внес необходимые изменения (как было предложено @NotAProgrammer), но во время компиляции cos x по-прежнему показывает значение как 1. Не могли бы вы мне помочь?

1 Ответ

1 голос
/ 08 мая 2020

В вашем коде есть несколько проблем. Прежде всего, main program { ... } не является допустимой записью в программе на C ++ (которую, как я полагаю, вы хотели использовать в качестве основной функции). Каждая программа на C ++ должна содержать функцию int main() { }, которая является начальной точкой. Таким образом, вам придется переписать его следующим образом:

int main()
{
 calculation o1;
 o1.getValue();
 o1.radians();
 o1.cosf(a); //Function uses an undeclared variable
 o1.output();
}

Во-вторых, проблема с выводом состоит в том, что в calculation::output() вы используете локальную неинициализированную переменную a, которую вы используете для вычисления cosf . В C ++ есть правила, определяющие, как и если переменные инициализируются, если им не предоставляется начальное значение, но они сложны, и, честно говоря, легче просто всегда давать им (разумное) начальное значение. Я предполагаю, что переменная x в классе calculation представляет радианы? В этом случае вы должны передать в функцию переменную объекта x. Поскольку это функция-член, у вас есть доступ к ее закрытым членам, и вы можете просто ссылаться на x. Вы также дважды вызываете cosf(): один раз в основной части программы (где вы игнорируете его вывод) и один раз в output() - это желаемая функция? Более того, в output() ваша функция cosf() возвращает double, но вы назначаете его float, что означает потенциальную потерю точности.

В-третьих, в вашей функции getValue() вы читаете в x в качестве углов, но затем в функции radians() вы перезаписываете значение в градусах радианами. Это не рекомендуется - как узнать в любой момент времени, содержит ли ваша переменная значение в градусах или радианах? Я бы также назвал ваши переменные по-другому - зачем называть градусы x, а точность n? Просто позвоните им degrees и precision. Это делает ваш код более понятным для чтения без необходимости углубляться в функции, чтобы понять, что этим переменным назначены.

Если вы хотите продолжать использовать этот код, вы можете изменить функцию вывода на это, предполагая, что x содержит радианы, а go оттуда.

void calculation::output() {
    double cosx = cosf(x); //This is the calculation object variable that holds the radians
    cout << "cosine of the angle will be: " << cosx;
}

Обычно для того, что вы пытаясь это сделать, я не вижу необходимости в объектно-ориентированном подходе. Вместо этого вы могли бы написать несколько бесплатных функций, которые принимают углы и возвращают радианы, и функцию cosf, которая принимает радианы и возвращает любую сумму, равную et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...