Logo

רד-בורד: ארכיון

ראשי > תיכנות > חישוב פונקציית סינוס בעזרת פורמולה

10/12/2012 19:12:33 Epsilon
מה שלומכם?
שוב אני .
אז ככה,הפעם אני דרוש לכתוב תוכנית שמחשבת סינוס של זווית כלשהי ע"פ הנוסחא:
sin(x) = x – x3/3! + x5/5! – x7/7! + …

בכל אופן,כתבתי תוכנית,אשר באמת מצליחה לחשב את ערך הסינוס.
הבעיה היא שהיא מחשבת בצורה נכונה רק ברביע ה ראשון והשלישי.
בקיצור הטווח שמעניק תשובה נכונה הוא בין זווית0 ל 90
ובין זווית 0 ל -90.
\אשמח אם תביטו ותוכלו לעזור.
חשוב להדגיש,התוכנית מקבלת ערך זווית סינוס לבדיקה,ומקבלת רמת דיוק(מס’ איברים)

:#include <iostream>
using namespace std;
int factorial(int odd) // function that calculates factorials
{
int i, factorial_item,factorial_value;
for (i=1, factorial_item=1;i <= odd; i++)
{
factorial_value=factorial_item*(i);
factorial_item=factorial_value;
}
return factorial_value;
}
double power(double base, int power) // function that calculates the power
{
int i;
double solution;
double multiplication;
for (i=0, multiplication=1; i < power; i++)
{
solution=multiplication*base;
multiplication=solution;
}
return solution;
}
double calculation(double sin_value,int accuration_value) // function that calculates the value of the Sin
{
double solution, temp_solution;
int i, odd;
for(i=0, solution=0, temp_solution=0, odd=3; i < accuration_value;)
{
if (i % 2 == 0)
{
solution=solution-((power(sin_value,odd))/(factorial(odd)));
odd=odd+2;
i++;

}
else
{
solution=solution+((power(sin_value,odd))/(factorial(odd)));
odd=odd+2;
i++;
}
}
return solution;
}
void main() // the main function
{
double sin_value;
int accuration_value;
double final_sin_value;
cout<<"Enter value for Sin, accuration value:"<<endl;
cin>>sin_value>>accuration_value;
sin_value=(sin_value*3.14159)/180; // converts to radians
final_sin_value=sin_value+(calculation(sin_value,accuration_value));
cout<<"the Sin value is : "<<final_sin_value<<endl;
}
11/12/2012 11:44:22 Admin
לא עברתי על הקוד ברמה של לענות לך על השאלה, אבל כן עשיתי רפרוף מהיר כדי לתת כמה הערות:

1. למה מימשת פונקציית חזקה? יש פונקציה במחלקה cmath

2. מתמטיקה פשוטה - טור טיילור של פונקציית סינוס:

כדי לעשות את המעבר בין האיברים החיוביים (אלה שאתה שם לפניהם +) לשליליים (אלה שאתה שם לפניהם -) אתה לא צריך לעשות 2 פונקציות ולבדוק מה מתחלק ב2, אלא אתה יכול בפונקצייה אחת לעשות (מינוס 1 בחזקת n):
:(-1)^n
ואז כשn זוגי זה שווה 1 והאיבר חיובי, וכשn איזוגי זה שווה -1 והאיבר הוא שלילי.

3. בתוך לולאת פור יש לך אפשרות להקצות משתנה לתחום של הלולאה שייעלם ברגע שיוצאים ממנה. זה נראה ככה:
כרגע אתה כותב:
:int i;
for (i=0,i<10;i++)
במקום זה אפשר לכתוב:
:for (int i=0, i<10, i++)
כמובן שזה תלוי גם אם אתה מתכוון להשתמש בi הזה מחוץ ללולאה וצריך לזכור מה הערך האחרון שלו, או שהוא חיוני רק לצורך הלולאה עצמה.
בקוד שלך ספציפית זה פחות משמעותי, אבל עדיין זה משהו שכדאי לדעת.

4. מימוש רקורסיבי יפה שמצאתי עכשיו לעצרת בשורה אחת:
:int factorial(int n)
{
return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n;
}


אגב, ההערה השלישית שלי מתקשרת לסיבה שהייתי מופתע בפוסט הקודם שלך שמתחילים איתכם מבוא תכנות בשפת C++.
יש שם את ההתעסקות בניהול זכרון, בפויינטרים, ובמונחה עצמים. זה יותר מדי לעכל בקורס שנועד לאנשים שמתחילים מ0 ובעיקר צריך להבין בו בתור התחלה תחביר נכון (תנאים, לולאות, פונקציות), ובהמשך לקבל קצת פרפקטיבה לחשיבה רקורסיבית וחשיבה מונחית עצמים.
11/12/2012 19:32:01 Epsilon
תודה על התגובה. אממש בקרוב.
עמודים: 1