Member 13051317 Ответов: 3

Как я могу найти значение синуса с помощью синусоидального ряда


я хочу найти грех x, используя синусоидальный ряд . х-х^3/3!+......
я хочу найти это с помощью функции pow

[edit]добавлен блок кода-OriginalGriff [/edit]

Что я уже пробовал:

#include<stdio.h>
#include<math.h>
int main()
{
  int i,j,n,fact,ch,p;
  float x,sum,angle;
   do
    {
      printf("\n1. Sine series\n2. Cosine series\n3. Exponential series\n4. Exit\nEnter your choice: ");
      scanf("%d",&ch);
      switch(ch)
	{
	case 1:
	  printf("\nEnter the value of x(in degree)and n in sine series.\n");
	  scanf("%f",&x);
	  printf("e");
	  scanf("%d",&n);
	  printf("\n%d",n);
       	  angle=x;
	  printf("hi");
	  x=angle*3.14/180;
	  fact=1;
	  sum=0;
	  p=0;
	  for(i=1;i<=n;i+2)
	    {
	      for(j=2;j<=n;j++)
		{
		  fact=fact*j;
		}
	      //printf("\n%d",fact);
	      sum+=(pow(-1,p)*((float)pow(x,i)/fact));
	      p++;
	    }
	  printf("\nsin(%.2f)=%.2f\n",angle,sum);
	  break;
	case 2:
	  printf("\nEnter the value of x(in degree)and n in cosine series .\n");
	  scanf("%f%d",&x,&n);
	  angle=x;
	  x=x*3.14/180;
	  fact=1;
	  sum=0;
	  for(i=0,p=0;i<=n;i+2,p++)
	    {
	      for(j=1;j<=n;j++)
		{
		  fact*=j;
		}
	      sum+=(pow(-1,p)*((float)pow(x,i)/fact));
	    }
	  printf("\ncos(%.2f)=%.2f\n",angle,sum);
	  break;
	case 3:
	  printf("\nEnter the value of x(in degree)and n in exponential series.\n");
	  scanf("%f%d",&x,&n);
	  angle=x;
	  x=x*3.14/180;
	  fact=1;
	  sum=0;
	  for(i=0;i<n;i++)
	    {
	      for(j=1;j<=n;j++)
		{
		  fact*=j;
		}
	      sum+=((float)pow(x,i)/fact);
	    }
	  printf("\ne^(%.2f)=%.2f\n",angle,sum);
	  break;
	case 4:
	  exit(0);break;
	  default:printf("\n Invalid input\n");
	}
       }while(1);
    return 0;
}

Rick York

Тогда все в порядке. Какой у вас вопрос?

Я предполагаю, что это то, как я правильно форматирую это.

3 Ответов

Рейтинг:
2

OriginalGriff

Мы не делаем домашнее задание: оно задано не просто так. Она существует для того, чтобы вы думали о том, что вам сказали, и пытались понять это. Он также существует для того, чтобы ваш наставник мог определить области, в которых вы слабы, и сосредоточить больше внимания на корректирующих действиях.

Так что все будет зависеть от вас.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что именно то, что вы ожидали, произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Пора вам освоить новый (и очень, очень полезный) навык: отладку!

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете.


Рейтинг:
2

Patrice T

Цитата:
я хочу найти грех x, используя синусоидальный ряд . х-х^3/3!+......
я хочу найти это с помощью функции pow

Тогда сделайте это, начните работать.

Мы не делаем вашу домашнюю работу.
Домашнее задание предназначено не для того, чтобы проверить ваши навыки просить других людей сделать вашу работу, оно предназначено для того, чтобы заставить вас думать и помочь вашему учителю проверить ваше понимание курсов, которые вы прошли, а также проблем, с которыми вы сталкиваетесь при их применении.
Любая ваша неудача поможет учителю выявить ваши слабости и наметить меры по их исправлению.
Итак, попробуйте, перечитайте свои уроки и приступайте к работе. Если вы застряли на конкретной проблеме, покажите свой код и объясните эту точную проблему, мы можем помочь.

Как программист, ваша задача-создавать алгоритмы это решает конкретные проблемы, и вы не можете полагаться на кого-то другого, чтобы вечно делать это за вас, поэтому есть время, когда вам придется научиться этому. И чем скорее, тем лучше.
Когда вы просто просите решение, это все равно что пытаться научиться водить машину, обучая кого-то другого.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.


Рейтинг:
1

CPallini

Есть несколько ошибок. Например

Цитата:
для(i=1;i<=n; i+2)

это неправильно, последнее утверждение в предложении for не имеет никакого эффекта, оно должно быть i+=2 Более того, fact переменная должна быть инициализирована непосредственно перед факториальным циклом (кстати, лучше использовать float переменная для удержания факторного результата, потому что он скоро становится большим).
Вы можете исправить свой код таким образом:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
  int i,j,n,ch,p;
  float fact;
  float x,sum,angle;
  do
  {
    printf("\n1. Sine series\n2. Cosine series\n3. Exponential series\n4. Exit\nEnter your choice: ");
    scanf("%d",&ch);
    switch(ch)
    {
    case 1:
      printf("\nEnter the value of x(in degree)and n in sine series.\n");
      scanf("%f",&x);
      scanf("%d",&n);
      angle = x;
      x=x*M_PI/180;
      sum=0.0;
      p=0;
      for(i=1;i<=n;i+=2)
      {
        fact=1;
        for(j=2;j<=i;j++)
        {
          fact=fact*j;
        }
        sum+=(pow(-1,p)*((float)pow(x,i)/fact));
        p++;
      }
      printf("\nsin(%.2f)=%.2f\n",angle,sum);
    break;
    //...


Однако я бы учел следующее sin вычисление в функции, и я бы также вычислял члены постепенно, например
#include <stdio.h>
#include <math.h>

double comp_sin( double x, int n)
{
  double sign = 1.0;
  double fact = 1.0;
  double sum=0.0;
  double x2 = x * x;

  int k;

  for (k=0; k<n; ++k)
  {
    sum += (sign * x) / fact;
    // update the factors
    sign = sign > 0.0 ? -1.0 : 1.0; // toggle the sign
    fact *= (2.0 * k + 2.0) * (2.0 * k + 3.0); // compute the next 'factorial' factor
    x *= x2; // compute the next 'power' factor
  }
  return sum;
}


int main()
{
  int n;
  double angle;

  printf("please enter the angle in degres and the number of terms of the series\n");
  scanf("%lf", &angle);
  scanf("%d", &n);

  printf("sin(%g) = %g\n", angle, comp_sin(angle*M_PI/180, n ));

  return 0;
}