public class DeveloppementLimiteSinusAvecFonctions {
  
///////////////////////////////////////////////////////

/* Calcul de la puissance entiere d'un reel          */
/* Les valeurs a reelle et n entiere sont donnees    */
  
  static double puissance(double a,int n) {
    double res;
    int i;
    res = a;
    for ( i = 1 ; i < n ; i = i+1 )
      res = res*a;
    return(res);
  }

/* Calcul de n!                                      */
/* La valeur n entiere est donnee                    */
  
  static long factoriel(int n) {
    long fct;
    int i;
    fct = 1L;
    for ( i = 2 ; i <= n ; i = i+1 )
      fct = fct*i;
    return(fct);
  }
  
/* Calcul de la valeur de sin(a) au voisinage de 0.0 */
/* Utilisation du developpement limite               */
/* Les valeurs a et n sont donnees                   */

  static double sinus(double a,int n) {
    double signe;
    double sn;
    sn = a;
    signe = -1.0;
    for ( int i = 3 ; i <= n ; i = i+2 ) {
      sn = sn + signe*puissance(a,i)/factoriel(i);
      signe = -signe; }
    return sn;
  }

///////////////////////////////////////////////////////

/* Programme principal                               */

  public static void main(String [] args) {
    double angle;
    int n;
    double sin;
    Ecran.afficher("SVP, l'angle : ");
    angle = Clavier.saisirDouble();
    Ecran.afficher("SVP, n       : ");
    n = Clavier.saisirInt();  
    sin = sinus(angle,n);
    Ecran.afficherln("sin(",angle,") = ",sin);
    Ecran.afficherln("Valeur reelle = ",Math.sin(angle));
    Ecran.afficherln("Difference = ",Math.sin(angle)-sin);
  }
}