2017-06-14 2 views
-6

Je suis assez nouveau dans le codage et essayer d'écrire une progression de péché pour l'uniComment coder une progression du péché avec c?

En formule, il ressemble à ceci:

the picture of the progression

Alors j'ai essayé de coder ... Et en quelque sorte, il calcule le radian mais pas le sinus ... Qu'est-ce qui ne va pas?

#include "stdafx.h" 
#include <iostream> 
#include <math.h> 

using namespace std; 

double n, a; 

int fakultaet(double a = 2 * n + 1) 
{ 
    if (a == 0) 
    return 1; 
    else 
    return (a * fakultaet(a - 1)); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    double sin, y, f; // sin = Sinus, y= angle, n=index 
    printf("please insert the angle \n"); 
    scanf("%lf", &y); 

    double x = y * 3.14159265359 * 1/180; // x = radian measure 

    while (n < 5) 
    { 
     sin = pow(-1, n) * pow(x, 2 * n + 1)/fakultaet(a); 
    } 

    printf("The sinus is %lf\n", sin); 

    system("Pause"); 

    return 0; 
} 
+2

Parce que n ne fait jamais à 5? – immibis

+0

Alors, comment vais-je le changer? Je veux dire, on nous a dit quand la progression devrait se terminer, alors j'ai décidé de finir ça en quelque sorte ... Dois-je mettre n = 5? – Jaqen

+0

Et C est notre uni subjaect, avait C++ en colledge et maintenant java et c dans l'uni xD – Jaqen

Répondre

1

Vous n'augmentez pas le sin, ou le n. Le codage en dur de la valeur d'entrée de la factorielle n'est pas bon non plus. Il devrait ressembler à ceci:

#include "stdafx.h" 
#include <iostream> 
#include <math.h> 

using namespace std; 

int fakultaet(double a) 
{ 
    if (a == 0) 
    return 1; 
    else 
    return (a * fakultaet(a - 1)); 
} 

int main() 
{ 

    double sin = 0, y, f; // sin = Sinus, y= angle, n=index 
    printf("please insert the angle \n"); 
    scanf("%lf", &y); 

    double x = y * 3.14159265359 * 1/180; // x = radian measure 

    for (int n = 0; n < 5; ++n) 
    { 
     sin += pow(-1, n) * pow(x, 2 * n + 1)/fakultaet(2 * n + 1); 
    } 

    printf("The sinus is %lf\n", sin); 

    system("Pause"); 

    return 0; 
} 

J'ai fait plusieurs modifications. Je me suis tourné la fonction factoriel:

int fakultaet(double a = 2 * n + 1) 

dans une version non hardcoded:

int fakultaet(double a) 

Ajouté le initialisation du péché:

double sin = 0 

Changé votre boucle while:

while (n < 5) 

Dans un pour qui inclu des l'augmentation qui lui manquait ainsi:

for (int n = 0; n < 5; ++n) 

a également tourné le calcul du péché:

sin = pow(-1, n) * pow(x, 2 * n + 1)/fakultaet(a); 

Dans un qui résume:

sin += pow(-1, n) * pow(x, 2 * n + 1)/fakultaet(2 * n + 1); 
+0

@drescherjm en effet, merci de remarquer que – Isac

+0

alors pourquoi avez-vous mis sin 0? – Jaqen

+0

*** pourquoi avez-vous défini sin 0 *** Si vous ne le définissez pas sin ne sera pas initialisé (contenant éventuellement une valeur de mémoire aléatoire de mémoire qui rendra votre ordures de calcul ..). – drescherjm

0

Vous pouvez obtenir un résultat plus propre et plus efficace en observant que les termes adjacents dans la somme sont liés. Nous pouvons exprimer cela comme une récidive:

  • T_n = - T_{n-1} x^2 /((2n+1) (2n))
  • T_0 = x

Cela vaut mieux, car elle évite les appels à pow et la nécessité de faire des calculs factoriels explicites (fakultaet).

Le code ressemble à quelque chose comme:

int main() { 
    ... 
    double T = x; 
    double sin = T; 
    for(int i=1 ; i<5; ++i) { 
    T *= -(x*x)/((2*i+1)*(2*i)); 
    sin += T; 
    } 
    ... 
}