السلام عليكم
إلى الأستاذ namespace:
بانتظار ردك على مشاركتي السابقة :)
السلام عليكم
إلى الأستاذ namespace:
بانتظار ردك على مشاركتي السابقة :)
namespace كتب:مثال على أي موضوع ؟
اهلا وسهلا
على هذا القانون 
ومافي الي يميز هذا القانون عن القوانين الاخرى هل هي دقه النتائج مثلا او ماذا
راح اتعبك معايه بعرف بس استحملني
empror9 كتب:ومافي الي يميز هذا القانون عن القوانين الاخرى هل هي دقه النتائج مثلا او ماذا
هذا القانون هو نفسه الذي في مشاركتك الأولى - لكن الأخير هو ما يسمى بالسلسلة التكرارية
السلسلة التكرارية : هي سلسلة يكتب كل حد فيها بدلالة بعض الحدود السابقة أو كلها ، فمثلا متسلسلة فيبوناشي ، احدى المتسلسلات التكرارية

يمكنك كتابة متسلسلة تكرارية فقط إذا كان الحد الحالي يمكن كتابته بدلالة الحد ( الحدود ) الذي قبله
في مثالنا ( والكلام للجميع ) الحد الحالي هو نفسه الحد السابق له لكن بعكس إشارته وضربه بـ ( ( X2 / ( i * ( i - 1 )
على هذا الأساس تم كتابة الكود ( بالنسبة للأخ khaled_prg الذي سأل عن الكود )
اقتباسيعني نستخدم الإستدعاء الذاتي مرتين
نعم يمكن
البرمجة = الرياضيات
السلام عليكم
مرحبا بالأستاذ namespace :)
اقتباسفي مثالنا ( والكلام للجميع ) الحد الحالي هو نفسه الحد السابق له لكن بعكس إشارته وضربه بـ ( ( X2 / ( i * ( i - 1 )
اتضح الكود .. جزاك الله خيرا :)
اقتباسنعم يمكن
كيف ذلك ؟
قمت بتنفيذ الكود التالي و لكنه لم يعمل :blush: و لا أدري أين الخطأ:
#include<iostream>
using namespace std;
float sin(float x,int r);
int main()
{
cout<<sin(2.643798,9)<<endl;
system("Pause");
return 0;
}
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(n-1));
else
result+=(-x*sin(x,n-1)/n*sin(n-1));
}
n+=2*n+1;
}
return result;
}نص الخطأ:
too few arguments to function float sin(float,int)
لم تعلق على هذه الفقرة:
اقتباسطيب .. إذا كان الحال هكذا فلماذا تستخدم الدوارة for داخل أكوادك !؟
بانتظار توضيحاتك :)
تحياتي.
أنا قلت التالي :
اقتباسأليس الاستدعاء الذاتي ليغنينا عن الدوران ، أليس الاستدعاء الذاتي يفعل ما يعجز عنه الدوران ، وإلا فإن كان الأمر متاحاً بدوران بسيط فلم الاستدعاء الذاتي ؟
أستخدم for في الأمثلة البسيطة كمثالنا ولست مضطراً إلى الاستدعاء الذاتي ، وكلاهما صواب ، لكن الاستدعاء الذاتي له عيوبه ، فهو إلى جانب سرعته يهلك الذاكرة ، ابحث عن عيوب الاستدعاء الذاتي .
اقتباسقمت بتنفيذ الكود التالي و لكنه لم يعمل :blush: و لا أدري أين الخطأ:
result+=(x*sin(x,n-1)/n*sin(n-1));
لاحظ أنه في استدعاء الاقتران الذي على اليمين بعثت له معاملاً واحداً one argument مع أن الصواب أن تبعث له اثنين
أذا انتهيت من هذه المشكلة فستبدأ دوامة الأخطاء المنطقية ، لأنك تستخدم دوراناً داخل اقتران يستدعي نفسه
كتبت لك الكود التالي لاقتران sin يستدعي نفسه ويعطي نفس نتائج الكود السابق - لاحظ أنه لا دوران بداخل الاقتران
float sin(float x)
{
static float result=x;
static float sign=1;
static float n=1;
sign=-sign;
n+=2;
if(n==11) return result;
result += sign*result*(x*x)/(n*(n-1));
sin(x);
return result;
}بالنسبة للمتغيرات الساكنة ببساطة ؛ الأسطر الثلاثة الأولى اعتبرها غير موجودة بعد أول تنفيذ للدالة ، ابحث وتعلم أكثر عن static variables
سلامي
البرمجة = الرياضيات
السلام عليكم
اقتباسأستخدم for في الأمثلة البسيطة كمثالنا ولست مضطراً إلى الاستدعاء الذاتي ، وكلاهما صواب ، لكن الاستدعاء الذاتي له عيوبه ، فهو إلى جانب سرعته يهلك الذاكرة ، ابحث عن عيوب الاستدعاء الذاتي .
1-أيهما أكثر استهلاكا للذاكرة (الإستدعاء الذاتي أم الدوران) و لماذا ؟
2-يا ريت تذكر لنا عيوب الإستدعاء الذاتي باختصار :)
اقتباسلاحظ أنه في استدعاء الاقتران الذي على اليمين بعثت له معاملاً واحداً one argument مع أن الصواب أن تبعث له اثنين
ألا يمكننا التغلب على هذه المشكل بإضافة 1 كقيمة للمتغير الأول ؟
result+=(x*sin(x,n-1)/n*sin(1,n-1));
اقتباسأذا انتهيت من هذه المشكلة فستبدأ دوامة الأخطاء المنطقية ، لأنك تستخدم دوراناً داخل اقتران يستدعي نفسه
ماذا تقصد بدوامة الأخطاء المنطقية ؟ و مالعيب في استخدام دوران داخل دالة تستدعي نفسها ؟
فائدة الإستدعاء الذاتي هي حساب (x أس n قسمة على مضروب n) في كل مرة و فائدة الدوران هي المرور على جميع قيم n.
اقتباسبالنسبة للمتغيرات الساكنة ببساطة ؛ الأسطر الثلاثة الأولى اعتبرها غير موجودة بعد أول تنفيذ للدالة ، ابحث وتعلم أكثر عن static variables
درستُها من قبل :wink: و للذين لا يعرفونها:
طريقة الإعلان عن متغير من النوع الساكن تكون بكتابة كلمة static و نوع المتغير ثم إسمه ,هكذا:
static int n;
في هذا المثال قمنا بالإعلان عن متغير صحيح باسم n و أضفنا إليه خاصية السكون.
كلمه static تعني السكون, و عند إضافتها إلى أي متغير .. فهذا يعني أنك قد أضفت له سمتين رئيسيتين هما:
a-أصبح عمر المتغير مثل عمر المتغيرات العامة التي لا تُمسح من الذاكرة إلا إذا طلبت ذلك برمجيا, أو بانتهاء تنفيذ البرنامج .. لأن المتغيرات العامة مُعرضة إلى أن تتم قراءتها في أي وقت ومن أي دالة.
b-لا ُيمكن رؤيتها إلا داخل الإطار التي أُعلنت بداخله.
لاحظ أن هذا النوع من المتغيرات (أقصد النوع static) يأخذ مزايا النوعين السابقين .. فهي مثل المتغيرات الخاصة لأن هناك دالة وحيدة تستطيع رؤيتها وهي الدالة التي تم الإعلان عن المتغير بداخلها ,و من ناحية أُخرى فالمتغيرات الساكنة مثل المتغيرات العامة لأنها لا تنتهي أو تُمسح من الذاكرة عندما ينتهي تنفيذ الدالة التابعة لها .. بل تظل مخزنة في الذاكرة (جاهزة للإستدعاء) حتى ينتهي تنفيذ البرنامج.
أرجو التصحيح إذا كان هناك خطأ في المعلومات
تحياتي.
تم تعديل هذه المشاركة بواسطة khaled_prg في 11 يوليو 2010 في 12:37
السلام عليكم
أين أنت يا أستاذ namespace ؟
نحن بحاجة ماسة إلى مساعدتك :blush:
أرجو أن تكون بخير :)
اشكرك namespace على ردك الكريم
يعني مثل كذا مثلا -(term 2 - 3) * في رقم 1 ((الاكس)) ^ 2 مقسومين على 3 * (3 - 1)؟؟
سويت كذا وطلع الناتج غلط
السلام عليكم
اقتباسيعني مثل كذا مثلا -(term 2 - 3) * في رقم 1 ((الاكس)) ^ 2 مقسومين على 3 * (3 - 1)؟؟
ليس هذا ما قاله الأستاذ namespace
انظر جيدا إلى ما قال:
اقتباسالحد الحالي هو نفسه الحد السابق له لكن بعكس إشارته وضربه بــ :x2/(i*(i-1))
تحياتي.
تم تعديل هذه المشاركة بواسطة khaled_prg في 11 يوليو 2010 في 14:09
العذر والسموحه لان المنتدى كان به مشاكل بقاعده البيانات
طيب لما اطبق الكلام مايطلع نفس الناتج
***
بالنسبه للكود الذي كتبه namespace
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;
}ما المقصود من sign وليه اسندنا له -1؟
بالنسبه لـ for مافهمت sign = -sing
وباقي الكود واضح تقريبا وفعلا استفعدت منه كثير
ربما استخدمه في البرنامج واعدل عليه على حسب الاسئله الي عندي
عندي سؤال بالنسبه للكود الي كتبه namespace وعدلته انا شويه
#include<iostream>
using namespace std;
const float pi = 3.1415926;
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 cos(float x)
{
float result = 1;
int limit = 10;
int sign = -1;
for(int i=2 ; i<limit ; i+=2,sign=-sign)
result += sign*(pow(x,i)/fact(i));
return result;
}
float tan(float x)
{
return sin(x)/cos(x);
}
int main()
{
float result;
float x;
cout<<"please enter 'x': ";
cin >> x;
result = sin(x);
cout << result;
return 0;
}ليه عندما ادخل قيمه الاكس مثلا نقول 7 يظهر لي الناتج - inf او inf?
السلام عليكم
اقتباسطيب لما اطبق الكلام مايطلع نفس الناتج
سبق و أن أجبتك , راجع مشاركتي السابقة :)
اقتباسما المقصود من sign وليه اسندنا له -1؟بالنسبه لـ for مافهمت sign = -sing
عند النظر إلى نشر تايلور لـ sin ستلاحظ أن الجزء المُضاف للمجموع تنعكس إشارته في كل مرة .. بمعنى :
يبدأ بإشارة موجبة و من ثم إشارة سالبة و من ثم يعود إلى الإشارة الموجبة و يحمل إشارة سالبة في المرة القادمة و هكذا دواليك .... :)
الأخ namespace قام ياستخدام متغير sign و أسند إليه قيمة ابتدائية هي -1 ثم قام بتغييرها في كل مرة لتتغير إشارة الجزء المُضاف للمجموع.
توجد طريقة أخرى (كطريقتي) حيث نقوم بترقيم الأجزاء المُضافة للمجموع .. فأول جزء في المجموع يكون رقم 1 و ثان جزء يكون رقم 2 و ثالث جزء يكون رقم 3 و رابع جزء يكون رقم 4 و ....
لاحظ ان الأجزاء ذات الرتبة الفردية ستحمل إشارة موجبة أما الأجزاء ذات الرتية الزوجية فستحمل إشارة سالبة و هذا ما قصدتُه عندما كتبت:
if(++i%2!=0) result+=(x*sin(x,n-1)/n*sin(n-1)); else result+=(-x*sin(x,n-1)/n*sin(n-1));
اقتباسليه عندما ادخل قيمه الاكس مثلا نقول 7 يظهر لي الناتج - inf او inf?
ربما تكون قيمة الناتج أقل من القيمة الصغرى لـ float
تحياتي :)
اهاا صحيح لاني سئلت نفسي نفس السؤال وقلت القانون يختلف وكيف وضع اشاره += واسندها لـ result
الان كل شئ تمام التمام
بالنسبه لكلامك حول - inf او inf
طيب يعني ماهو الحل؟ لان عندي مثال في السؤال الموجود عندي
نفترض ان الاكس هو 1.5708000 وتظهر نتيجه الساين هو 1
بينما في البرنامج عندي تظهر لي inf
يعني ماهي المشكله بالضبط؟ مع ان القانون الموجود في الكود صحيح
السلام عليكم
اقتباسطيب يعني ماهو الحل؟ لان عندي مثال في السؤال الموجود عندينفترض ان الاكس هو 1.5708000 وتظهر نتيجه الساين هو 1
بينما في البرنامج عندي تظهر لي inf
إذا كانت المشكلة تتعلق بـ"مدى" float فيمكننا التغلب على المشكلة باستخدام double
و لكنني قلتُ "ربما" :blush: فأنا لست متأكد :P
بانتظار الإخوة حتى يصححوا لنا المسألة و يجيبوا على تساؤلاتي الأخيرة :)
تحياتي.
اقتباسإذا كانت المشكلة تتعلق بـ"مدى" float فيمكننا التغلب على المشكلة باستخدام
لا يمكنك ذلك - للأسف
اقتباسبينما في البرنامج عندي تظهر لي inf
هذا الكود يعطيك 1.01 ، ذكرته سابقاً ويعتمد السلسلة التكرارية
float sin(float x)
{
float result = x;
int limit = 11;
int sign = -1;
for(int i=3 ; i<limit ; i+=2,sign=-sign)
result += sign*result*(x*x)/(i*(i-1));
return result;
}تم تعديل هذه المشاركة بواسطة namespace في 11 يوليو 2010 في 17:17
البرمجة = الرياضيات
إلى الأستاذ namespace:
أرجو منك الرد على هذه التساؤلات:
اقتباسأستخدم for في الأمثلة البسيطة كمثالنا ولست مضطراً إلى الاستدعاء الذاتي ، وكلاهما صواب ، لكن الاستدعاء الذاتي له عيوبه ، فهو إلى جانب سرعته يهلك الذاكرة ، ابحث عن عيوب الاستدعاء الذاتي .
1-أيهما أكثر استهلاكا للذاكرة (الإستدعاء الذاتي أم الدوران) و لماذا ؟
2-يا ريت تذكر لنا عيوب الإستدعاء الذاتي باختصار :)
اقتباسلاحظ أنه في استدعاء الاقتران الذي على اليمين بعثت له معاملاً واحداً one argument مع أن الصواب أن تبعث له اثنين
ألا يمكننا التغلب على هذه المشكل بإضافة 1 كقيمة للمتغير الأول ؟
result+=(x*sin(x,n-1)/n*sin(1,n-1));
اقتباسأذا انتهيت من هذه المشكلة فستبدأ دوامة الأخطاء المنطقية ، لأنك تستخدم دوراناً داخل اقتران يستدعي نفسه
ماذا تقصد بدوامة الأخطاء المنطقية ؟ و مالعيب في استخدام دوران داخل دالة تستدعي نفسها ؟
فائدة الإستدعاء الذاتي هي حساب (x أس n قسمة على مضروب n) في كل مرة و فائدة الدوران هي المرور على جميع قيم n.
اقتباسبالنسبة للمتغيرات الساكنة ببساطة ؛ الأسطر الثلاثة الأولى اعتبرها غير موجودة بعد أول تنفيذ للدالة ، ابحث وتعلم أكثر عن static variables
درستُها من قبل :wink: و للذين لا يعرفونها:
طريقة الإعلان عن متغير من النوع الساكن تكون بكتابة كلمة static و نوع المتغير ثم إسمه ,هكذا:
static int n;
في هذا المثال قمنا بالإعلان عن متغير صحيح باسم n و أضفنا إليه خاصية السكون.
كلمه static تعني السكون, و عند إضافتها إلى أي متغير .. فهذا يعني أنك قد أضفت له سمتين رئيسيتين هما:
a-أصبح عمر المتغير مثل عمر المتغيرات العامة التي لا تُمسح من الذاكرة إلا إذا طلبت ذلك برمجيا, أو بانتهاء تنفيذ البرنامج .. لأن المتغيرات العامة مُعرضة إلى أن تتم قراءتها في أي وقت ومن أي دالة.
b-لا ُيمكن رؤيتها إلا داخل الإطار التي أُعلنت بداخله.
لاحظ أن هذا النوع من المتغيرات (أقصد النوع static) يأخذ مزايا النوعين السابقين .. فهي مثل المتغيرات الخاصة لأن هناك دالة وحيدة تستطيع رؤيتها وهي الدالة التي تم الإعلان عن المتغير بداخلها ,و من ناحية أُخرى فالمتغيرات الساكنة مثل المتغيرات العامة لأنها لا تنتهي أو تُمسح من الذاكرة عندما ينتهي تنفيذ الدالة التابعة لها .. بل تظل مخزنة في الذاكرة (جاهزة للإستدعاء) حتى ينتهي تنفيذ البرنامج.
أرجو التصحيح إذا كان هناك خطأ في المعلومات.
تم تعديل هذه المشاركة بواسطة khaled_prg في 11 يوليو 2010 في 16:20
1
اقتباس-أيهما أكثر استهلاكا للذاكرة (الإستدعاء الذاتي أم الدوران) و لماذا ؟
الاستدعاء الذاتي بالتأكيد
اقتباس2-يا ريت تذكر لنا عيوب الإستدعاء الذاتي باختصار
http://www.allinterview.com/showanswers/229.html
1- باستخدامه يحصل لدينا غموض والتباس بالنسبة للكود ، مثلاً الكود الذي كتبته أنت يعتبر unreadable ولو كنت تعمل في شركة وأراد أحد تطوير الكود فلن يستطيع أو سيصعب عليه بسبب الغموض والالتباس .
2- it is very difficult to trace ; debug and understand
صعب التتبع واكتشاف الأخطاء
3- sometimes a lot of free memory is require for recursive solutions
يعني بالعربي يشفط الذاكرة
4-less efficient as compared to the non-recursive counterparts as the overhead involved in entering,re-entering and exiting a block is avoided in case of the non recursive forms. its also possible to identify a number of local variables which need not be saved and restored with the help of stacks and this unwanted stacking activity is avoided in the non-recursive versions
اقتباسماذا تقصد بدوامة الأخطاء المنطقية ؟ و مالعيب في استخدام دوران داخل دالة تستدعي نفسها ؟
فائدة الإستدعاء الذاتي هي حساب (x أس n قسمة على مضروب n) في كل مرة و فائدة الدوران هي المرور على جميع قيم n.
دعك من تلك الطريقة - سأعطيك واحدة جديدة تعطي نتائج ممتازة
اقتباسأضفت له سمتين رئيسيتين
الثانية موجودة أصلاً
اقتباسأرجو التصحيح إذا كان هناك خطأ في المعلومات
معلومات جميلة - شكراً لك
تم تعديل هذه المشاركة بواسطة namespace في 11 يوليو 2010 في 18:09
البرمجة = الرياضيات
namespace كتب:لا يمكنك ذلك - للأسف
هذا الكود يعطيك 1.01 ، ذكرته سابقاً ويعتمد السلسلة التكرارية
float sin(float x) { float result = x; int limit = 11; int sign = -1; for(int i=3 ; i<limit ; i+=2,sign=-sign) result += sign*result*(x*x)/(i*(i-1)); return result; }
اهلين استاذ namespace
اهاا الان بيشتغل تمام ، هذا الكود ترجمه للقانون term صحيح؟
يعني القانون هذا افضل صح؟
هذه الطريقة تعطي نتائج ممتازة للغاية - قريبة جداً من تلك التي تحصل عليها من cmath
وهي سريعة جداً مقارنة بالطرق السابقة ، لكنها تستهلك قدراً من الذاكرة عند تعريف الجداول يمكن إهماله
#include<iostream>
using namespace std;
double hollyConstant=0.017453;
double sinTable[]={0.0, // sin(0)
0.173648, // sin(10)
0.342020, // sin(20)
0.5, // sin(30)
0.642787, // sin(40)
0.766044, // sin(50)
0.866025, // sin(60)
0.939692, // sin(70)
0.984807, // sin(80)
1.0}; // sin(90)
double cosTable[]={1.0, // cos(0)
0.999847, // cos(1)
0.999390, // cos(2)
0.998629, // cos(3)
0.997564, // cos(4)
0.996194, // cos(5)
0.994521, // cos(6)
0.992546, // cos(7)
0.990268, // cos(8)
0.987688}; // cos(9)
float mySin(float angle)
{
int a = angle / 10;
float b = angle - 10 * a;
return sinTable[a] * cosTable[int(b)] + b * hollyConstant * sinTable[9-a];
}
int main()
{
cout<<mySin(30)<<endl;
return 0;
}تم الحل باستخدام هذه المتطابقة :
sin(a+b) = sin(a) cos(b) + sin(b) cos(a)
الثابت hollyConstant هو ببساطة pi / 180
عندما ندخل الزاوية نقوم بإدخالها بالدرجات degrees
ناتج التنفيذ : 0.5
أترك لك عمل اقتران cos ، استخدم المتطابقة :
cos(a+b) = cos(a) cos(b) - sin(a) sin(b)
البرمجة = الرياضيات
اهاا جميل جدا بس مادرست الطريقه هذي واعتقد انها array واحنا ما درسناه لسه
عشان كذا ما اقدر استخدمها حاليا
لكن مو مشكله فهمت الان الكود الاول الي تكرمت وكتبته لي وراح اعدل عليه حسب حاجتي
طيب اسمحلي بسؤال
هل هذا الكود صحيح؟ لاني اريد ان استخدم القانون الثاني term لانه افضل وادق في النتايج زي ماعرفت
float cos(float x)
{
float result = 1;
int limit = 10;
int sign = -1;
for(int i=2 ; i<limit ; i+=2,sign=-sign)
result += sign*result*(x*x)/(i*(i-1));
return result;
}وهنا سؤال اخر بعيد تماما عن موضوعنا
#include <iostream>
using namespace std;
int sum(int num1,int num2){
int sum;
sum = num1 + num2;
return sum;
}
int div(int num1,int num2){
int sum;
sum = num1 / num2;
return sum;
}
int main()
{
char q ='y'; // to quite the programme
int choose;
while(q == 'y'){
cout <<"Welcome to the super programme"<<endl;
cout <<"1- finding the sum of the numbers."<<endl;
cout <<"2- finding the divide of the numbers."<<endl;
cout <<"please choose which programe you want:"<<endl;
cin >> choose;
while(choose < 1 || choose > 2){
cout<<"please choose ethir '1' or '2'";
cin >> choose;
}
if(choose == 1){
cout <<"Please enter two numbers:";
cin >> num1 >> num2;
sum(num1,num2);
}else if(choose == 2){
cout <<"Please enter two numbers:";
cin >> num1 >> num2;
div(num1,num2);
}
cout <<" ,Repeat?";
cin >> q;
}
return 0;
}هذا الكود بسيط جدا قمت بكتابته وهو يقوم بتخيير المستخدم اذا اراد ان يستخدم عمليه الجمع او القسمه
طبعا انا عملته عشان اسوي مثال على الدوال ، لكن ما المشكله في الكود؟ لانه لايعمل
تم تعديل هذه المشاركة بواسطة empror9 في 11 يوليو 2010 في 19:15
السلام عليكم
اقتباسهل هذا الكود صحيح؟ لاني اريد ان استخدم القانون الثاني term لانه افضل وادق في النتايج زي ماعرفت
اترك الإجابة لصاحب الكود :)
اقتباسهذا الكود بسيط جدا قمت بكتابته وهو يقوم بتخيير المستخدم اذا اراد ان يستخدم عمليه الجمع او القسمهطبعا انا عملته عشان اسوي مثال على الدوال ، لكن ما المشكله في الكود؟ لانه لايعمل
الكود يحتوي على عدة أخطاء و هي :
int div(int num1,int num2)
في الحالة العامة فإن الدالة div يجب أن تعيد قيمة حقيقية (كسرية) لذلك يجب أن يكون نوع القيمة المعادة هو float
cin >> num1 >> num2;
المتغيرين num1 و num2 تم الإعلان عنهما في الدالة السابقة أي أنهما متغيرات خاصة و لا يمكن رؤيتهم خارج الإطار الذي تم الإعلان عنهم فيه , لذلك يجب أن تعلن عن متغيرات جديدة بنفس الإسم أو باسم مخالف (الإختيار لك).
sum(num1,num2);
هذه الكتابة تكون سليمة إذا كانت الدالة تعيد void أما الدالة sum فهي تعيد قيمة لذلك فإن العبارة:
sum(num1,num2);
عبارة عن قيمة و لا يمكن التعامل مع القيم بهذه الطريقة ....!
div(num1,num2);
نفس الخطأ ...!
و هذا الكود بعد التعديل و الإختصار:
#include<iostream>
using namespace std;
int sum(int num1,int num2)
{
return num1+num2;
}
float Div(int num1,int num2)
{
return (float)num1/num2;
}
int main()
{
char q ='y'; // to quite the programme
int a,b,choose;
while(q=='y')
{
cout <<"Welcome to the super programme"<<endl;
cout <<"1- finding the sum of the numbers."<<endl;
cout <<"2- finding the divide of the numbers."<<endl;
cout <<"please choose which programe you want:"<<endl;
cin >> choose;
while(choose < 1 || choose > 2)
{
cout<<"please choose ethir '1' or '2'";
cin >> choose;
}
switch(choose)
{
case 1:
{
cout <<"Please enter two numbers:";
cin>>a>>b;
cout<<sum(a,b)<<endl;
};break;
case 2:
{
cout <<"Please enter two numbers:";
cin>>a>>b;
cout<<Div(a,b)<<endl;
};break;
}
cout <<"Repeat ? :";
cin >> q;
}
return 0;
}لدي أسئلة حول الكود:
1-في بداية الكود .. عندما نطلب من المستخدم إدخال قيمة للمتغير choose و يُدخل المستخدم حرف فإن البرنامج يدخل في دوارة غير منتهية ....! , لماذا !؟
2-عندما نسمي الدالة الثانية بالإسم div (الحرف d يكون صغير) فإن المترجم يعترض , لماذا ؟
3-بالنسبة للسطر التالي:
return (float)num1/num2;
عندما لا نحول القيمة المُعادة إلى float , هكذا:
return num1/num2;
فإن القيمة التي تعيدها الدالة Div تكون قيمة غير كسرية (لا تحتوي على الفاصلة) , مالسبب !؟
تحياتي.
تم تعديل هذه المشاركة بواسطة khaled_prg في 11 يوليو 2010 في 21:07