السلام عليكم
المطلوب هو كتابة كود يحسب sin لزاوية معينة يُدخلها المستخدم و ذلك بالإعتماد على قانون تايلور (انظر االصورة).

يمكننا فعل ذلك عن طريق كتابة 3 دوال كالتالي:
int fact(int x)
{
int result = 1;
for(int i=2 ; i<=x ; i++)
result *= i;
return result;
}
double pow(double x,double y)
{
double result=x;
for(int i=1 ; i<y ; i++)
result *= result;
return result;
}
float sin(float x)
{
float result = x;
int limit = 10;
int sign = -1;
for(int i=3 ; i<limit ; i+=2,sign=-sign)
result += sign*pow(x,i)/fact(i);
return result;
}و لكنني أريد جمع الدوال الثلاثة في دالة واحدة كالآتي:
float sin(float x,int r)
{
int i=0,n=0;
float result=0;
if(r%2==0) r++;
while(n!=r)
{
if(x==0) result=1;
else
{
if(++i%2!=0)
result+=(x*sin(x,n-1)/n*sin(1,n-1));
else
result+=(-x*sin(x,n-1)/n*sin(1,n-1));
}
n+=2*n+1;
}
return result;
}الفكرة ببساطة هي محاولة اختزال الدالتين fact و pow في دالة واحدة.
الدالة sin تستقبل متغيرين أحدهما float و الآخر int
بالنسبة لـ x فهي الزاوية المُراد حساب جيبها و المتغير r عبارة عن الأس الذي نتوقف عنده.
الهدف من المتغير i هو تغيير إشارة الجزء المُضاف للمجموع في كل مرة فإذا كان i فرديا فإننا نضع إشارة موجبة أمام المجموع أما إذا كان i زوجيا فإننا نضع إشارة سالبة أمام المجموع.
أما المتغير n فهو يمثل الأس في كل مرة و السبب في كتابة هذا السطر:
n+=2*n+1;
لأن الأس فردي دائما , لاحظ أننا نتوقف عندما تكون n تساوي r أي أن المتغير n يمثل الأس المؤقت.
لاحظ أننا نزيد المتغير r بواحد عندما يكوت زوجيا و ذلك لكي لا تكون الدوارة غير منتهية.
-------------------
حاولت أن أضع الدالة في كود هكذا:
#include<iostream>
using namespace std;
float sin(float x,int r)
{
int i=0,n=0;
float result=0;
if(r%2==0) r++;
while(n!=r)
{
if(x==0) result=1;
else
{
if(++i%2!=0)
result+=(x*sin(x,n-1)/n*sin(1,n-1));
else
result+=(-x*sin(x,n-1)/n*sin(1,n-1));
}
n+=2*n+1;
}
return result;
}
int main()
{
cout<<sin(2,7)<<endl;
system("pause");
return 0;
}انتظر تعليقاتكم على الدالة .. أريد أن أضعها في كود و يعمل :)
تحياتي.