الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعده في سلسله تايلور

رائج
بدأه empror9 في 9 يوليو 2010 · 59 رد · 3,225 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#27
namespace كتب:

مثال على أي موضوع ؟

اهلا وسهلا

على هذا القانون 16296156.jpg

ومافي الي يميز هذا القانون عن القوانين الاخرى هل هي دقه النتائج مثلا او ماذا

راح اتعبك معايه بعرف بس استحملني

#28
empror9 كتب:

ومافي الي يميز هذا القانون عن القوانين الاخرى هل هي دقه النتائج مثلا او ماذا

هذا القانون هو نفسه الذي في مشاركتك الأولى - لكن الأخير هو ما يسمى بالسلسلة التكرارية

السلسلة التكرارية : هي سلسلة يكتب كل حد فيها بدلالة بعض الحدود السابقة أو كلها ، فمثلا متسلسلة فيبوناشي ، احدى المتسلسلات التكرارية

jpzpxt.gif

يمكنك كتابة متسلسلة تكرارية فقط إذا كان الحد الحالي يمكن كتابته بدلالة الحد ( الحدود ) الذي قبله

في مثالنا ( والكلام للجميع ) الحد الحالي هو نفسه الحد السابق له لكن بعكس إشارته وضربه بـ ( ( X2 / ( i * ( i - 1 )

على هذا الأساس تم كتابة الكود ( بالنسبة للأخ khaled_prg الذي سأل عن الكود )

اقتباس
يعني نستخدم الإستدعاء الذاتي مرتين

نعم يمكن

البرمجة = الرياضيات

#29

السلام عليكم

مرحبا بالأستاذ 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 داخل أكوادك !؟

بانتظار توضيحاتك :)

تحياتي.

#30

أنا قلت التالي :

اقتباس
أليس الاستدعاء الذاتي ليغنينا عن الدوران ، أليس الاستدعاء الذاتي يفعل ما يعجز عنه الدوران ، وإلا فإن كان الأمر متاحاً بدوران بسيط فلم الاستدعاء الذاتي ؟

أستخدم 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

سلامي

البرمجة = الرياضيات

#31

السلام عليكم

اقتباس
أستخدم 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

#34

>>>

تم تعديل هذه المشاركة بواسطة empror9 في 11 يوليو 2010 في 13:46

#35

اشكرك namespace على ردك الكريم

يعني مثل كذا مثلا -(term 2 - 3) * في رقم 1 ((الاكس)) ^ 2 مقسومين على 3 * (3 - 1)؟؟

سويت كذا وطلع الناتج غلط

#36

السلام عليكم

اقتباس
يعني مثل كذا مثلا -(term 2 - 3) * في رقم 1 ((الاكس)) ^ 2 مقسومين على 3 * (3 - 1)؟؟

ليس هذا ما قاله الأستاذ namespace

انظر جيدا إلى ما قال:

اقتباس
الحد الحالي هو نفسه الحد السابق له لكن بعكس إشارته وضربه بــ :

x2/(i*(i-1))

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 11 يوليو 2010 في 14:09

#37

العذر والسموحه لان المنتدى كان به مشاكل بقاعده البيانات

طيب لما اطبق الكلام مايطلع نفس الناتج

***

بالنسبه للكود الذي كتبه 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

وباقي الكود واضح تقريبا وفعلا استفعدت منه كثير

ربما استخدمه في البرنامج واعدل عليه على حسب الاسئله الي عندي

#38

عندي سؤال بالنسبه للكود الي كتبه 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?

#39

السلام عليكم

اقتباس
طيب لما اطبق الكلام مايطلع نفس الناتج

سبق و أن أجبتك , راجع مشاركتي السابقة :)

اقتباس
ما المقصود من 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

تحياتي :)

#40

اهاا صحيح لاني سئلت نفسي نفس السؤال وقلت القانون يختلف وكيف وضع اشاره += واسندها لـ result

الان كل شئ تمام التمام

بالنسبه لكلامك حول - inf او inf

طيب يعني ماهو الحل؟ لان عندي مثال في السؤال الموجود عندي

نفترض ان الاكس هو 1.5708000 وتظهر نتيجه الساين هو 1

بينما في البرنامج عندي تظهر لي inf

يعني ماهي المشكله بالضبط؟ مع ان القانون الموجود في الكود صحيح

#41

السلام عليكم

اقتباس
طيب يعني ماهو الحل؟ لان عندي مثال في السؤال الموجود عندي

نفترض ان الاكس هو 1.5708000 وتظهر نتيجه الساين هو 1

بينما في البرنامج عندي تظهر لي inf

إذا كانت المشكلة تتعلق بـ"مدى" float فيمكننا التغلب على المشكلة باستخدام double

و لكنني قلتُ "ربما" :blush: فأنا لست متأكد :P

بانتظار الإخوة حتى يصححوا لنا المسألة و يجيبوا على تساؤلاتي الأخيرة :)

تحياتي.

#42
اقتباس
إذا كانت المشكلة تتعلق بـ"مدى" 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

البرمجة = الرياضيات

#43

:lol:

تم تعديل هذه المشاركة بواسطة namespace في 11 يوليو 2010 في 18:11

البرمجة = الرياضيات

#44

إلى الأستاذ 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

#45

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

1

البرمجة = الرياضيات

#46
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 صحيح؟

يعني القانون هذا افضل صح؟

#47

هذه الطريقة تعطي نتائج ممتازة للغاية - قريبة جداً من تلك التي تحصل عليها من 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)

البرمجة = الرياضيات

#48

اهاا جميل جدا بس مادرست الطريقه هذي واعتقد انها array واحنا ما درسناه لسه

عشان كذا ما اقدر استخدمها حاليا

لكن مو مشكله فهمت الان الكود الاول الي تكرمت وكتبته لي وراح اعدل عليه حسب حاجتي

#49

طيب اسمحلي بسؤال

هل هذا الكود صحيح؟ لاني اريد ان استخدم القانون الثاني 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

#50

السلام عليكم

اقتباس
هل هذا الكود صحيح؟ لاني اريد ان استخدم القانون الثاني 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

مواضيع مشابهة