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

برنامج c++ للمناقشة

مغلق
بدأه flowers في 29 سبتمبر 2004 · 9 رد · 689 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لو سمحتهم أريد مساعدة من جديد ...

أريد أكتب برنامج معطياته التالية

F(x)=x3-4x2+6x-7

ضمن المجال

{2,3}

والدقه 0.001

وخوارزمية الحل هي :

Bisection method (f,a,b,root,r)
C=a+b\2;
If (b-c)<= r;
Then { c=root; exit;}
If f(a)*f(b)<0 then 
B=c;
Else
A=c;

البرنامج بلغة السي بلس بلس و r=0.001

كتبت البرنامج التالي ولكن الناتج لا يظهر لي ..

فهل من مساعد رجاءا ...

#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>

main()
{

double a,b,c;

a=2; b=3; c=a+b/2;
cout<< endl<<a<<b<<c;
while ((a!=c )|| (b!=c))
{
   if ((b-c)<= 0.0001)
  { cout<< " \n the root is   "<<c;
   exit(1);
   }

   if ((b*b*b -4*b*b + 6*b-7)*(c*c*c-4*c*c + 6*c-7))
   b=c;

   else
   a=c;

   c=a+b/2;

}

cout<<endl<<" the root is "<<c;

getch();

return 0;
}

أعرض الموضوع للمناقشة الهادفة وأرجو أن لا يزعج ذلك أحد ..

تحياتي للجميع ..

تزود للذي لابــــــــــد منه .... فإن الموت ميقات العبـــاد

وتب مما جنيت وأنت حي ... . وكن متنبها قبل الرقــــــاد

ستندم إن رحلت بغير زاد ... . وتشقى إذ يناديك المنادي

أترضى أن تكون رفيق قوم .... لهم زاد وأنـــت بغير زاد ؟!

#2

لا مشكلة في كتابة الكود.

(عليك تعديل السطر

if ((b*b*b -4*b*b + 6*b-7)*(c*c*c-4*c*c + 6*c-7))

يبدو أنك نسيت إضافة المقارنة مع الصفر)

لكن هناك أخطاء منطقية.

الشرط if (b-c)<= 0.0001 دائما صحيح.

بما أن نطاق a و b بين 2 و3، فـ c=a+b/2 تعطي لـ c قيمة دائما أكبر من b. فتصبح نتيجة المقارنة في جملة if السابقة دائما صحيحة، لأن أية قيمة سالبة هي أصغر من (0.001).

وينتهي البرنامج دائما مع جملة if الأولى، root=c.

إذا تجاوزنا هذا الشرط. فالحلقة التكرارية while لا نهائية. دائما a أو b سيكون مختلفا عن c، وسيبقى البرنامج داخل الحلقة، لأن c=a+b/2 ما لم تكن كل القيم تساوي الصفر، وهو ما لا يمكن حسب طريقة سير المعادلات.

الآن البرنامج يتوقف عند الشرط الأول if (b-c)<= 0.0001، ويعطي جذرا يساوي 3.5.

إذا كنت تستخدم ++turbo c، اضغط alt+F5 لرؤية النتيجة، فدالة getch لن تعمل لأن تنفيذ البرنامج يتوقف قبل الوصول إليها.

#3

السلام عليكم

المشكلة كما قال الاخ متعلم تكمن في السطر

if ((b*b*b -4*b*b + 6*b-7)*(c*c*c-4*c*c + 6*c-7))

المطلوب تغييره ل:

if(c*c*c-4*c*c+6*c-7)>0))

والله اعلم

#4

هناك خطأ اخر لم انتبه له وهو الاقواس

فهناك فرق طبعا بين

a+b/2 و a+B)/2)

المعذرة ...

واعتقد ان ااناتج يجب ان يكون 2.742981

#5
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>

main()
{

double a,b,c;

a=2; b=3; c=(a+b)/2;
cout<< endl<<a<<b<<c;
while ((a!=c )|| (b!=c))
{
  if ((b-c)<= 0.0001)
 { cout<< " \n the root is   "<<c;
  exit(1);
  }

  if ((c*c*c-4*c*c + 6*c-7)>0)
  b=c;

  else
  a=c;

  c=(a+b)/2;

}

cout<<endl<<" the root is "<<c;

getch();

return 0;
}
#6

السلام عليكم

شكرا karimosh و متعلم على المشاركة الطيبة ،،،

الشرط if (b-c)<= 0.0001 دائما صحيح.

بما أن نطاق a و b بين 2 و3، فـ c=a+b/2 تعطي لـ c قيمة دائما أكبر من b. فتصبح نتيجة المقارنة في جملة if السابقة دائما صحيحة، لأن أية قيمة سالبة هي أصغر من (0.001).

وينتهي البرنامج دائما مع جملة if الأولى، root=c

متعلم لا أعتقد أن هذا صحيح لأن b=3 , c=2.5 وتالي b-c=0.5

في الحالة الأولى وفي الثانية c=2.25 ثم 2.125 ثم 2.0625

وبالتالي تكون قيم b-c موجبة ولا يتحقق الشرط كما ذكرت ...

وفعلا نسيت الإشارة وتكون كاتالي

if ((b*b*b -4*b*b + 6*b-7)*(c*c*c-4*c*c + 6*c-7<0))

ولكن لم نتوصل للحل بعد ....

تزود للذي لابــــــــــد منه .... فإن الموت ميقات العبـــاد

وتب مما جنيت وأنت حي ... . وكن متنبها قبل الرقــــــاد

ستندم إن رحلت بغير زاد ... . وتشقى إذ يناديك المنادي

أترضى أن تكون رفيق قوم .... لهم زاد وأنـــت بغير زاد ؟!

#7

بالنسبة للشرط :

while ((a!=c )|| (b!=c))

أعتقد أنه غير صحيح ..

من يعرف الحل رجاءا لا يبخل علينا ..

تحياتي للجميع ..

تزود للذي لابــــــــــد منه .... فإن الموت ميقات العبـــاد

وتب مما جنيت وأنت حي ... . وكن متنبها قبل الرقــــــاد

ستندم إن رحلت بغير زاد ... . وتشقى إذ يناديك المنادي

أترضى أن تكون رفيق قوم .... لهم زاد وأنـــت بغير زاد ؟!

#8

إذا كانت أكبر قيمة ممكنة لـ b هي 3، وأصغر قيمة ممكنة لـ a هي 2، فلا يمكن أن تكون c=2.5

c = 2 + 3/2 = 3.5

إلا إذا كانت المعادلة هي

(a+b)/2

وليست

a+b\2

في هذه الحالة

root = 2.499939

ويبقى البرنامج كما هو الآن.

#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>

main()
{

double a, b, c;

a = 2;
b = 3;
c = (a+b)/2;

cout << endl
     << "a = " << a << endl
     << "b = " << b << endl
     << "c = (a+b)/2) = " << c << endl;

while ((a!=c ) || (b!=c))
{
  if ( (b-c)<=0.0001)
  {
	cout << "The root is " << c;
	exit(1);
  }

  if ((b*b*b - 4*b*b + 6*b - 7)*(c*c*c - 4*c*c + 6*c - 7)<0)
	b = c;
  else  a = c;

  c = (a+b)/2;
}

cout << endl
     << "The root is " << c;

getch();

return 0;

}
#9

السلام عليكم

الموضوع هذا انا درسته وتعمقت فيه .فهذه الطريقة هي Bisection Mrthod

والحل هو:

#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#define TOLERANCE 0.0001

main()
{
    float a,b,c;
	a=2; b=3; 

	while ((b-a)>TOLERANCE)
	{
  c=(a+b)/2;
  if (((b*b*b-4*b*b+6*b-7)*(c*c*c-4*c*c + 6*c-7))>0)
 	 b=c;
  else
 	 a=c;
	}
	cout<<" the root is  "<<c<<endl;
	getch();
	return 0;
}

فكما نعلم جميعا ان جذر الدالة هو نقطة تقاطع الدالة مع محور X وبما انه هناك نقطتان a=2 و b=3 فالحل ياخذ عدة مراحل :

1- يجب التاكد من وجود جذر للدالة في المجال بين 2 و3 (اي ان الدالة تتقاطع مع محور X في هدا المجال)

كيف يمكننا التاكد ؟

على اعتبار ان الدالة هي :

F(x)=x^3-4x^2+6x-7

النظرية تقول انه اذا تحقق F(a)*F(b )<0 فان للدالة جذر واحد على الاقل وهذا المطلب يجب التاكد منه في البداية ومن هنا نلاحظ ان F(2)*F(3)<0

اذا فالشرط الاول تحقق!!!!!!

2- الدقة المطلوبة هي 0.0001 ادا فالشرط للحصول على نتيجة تتلائم مع الدقة المطلوبة يجب ان يتحقق b-a< 0.0001 ادا لم يتحقق فنذهب للخطوة 3 .

3- نقسم المقطع بين 2 و 3 من المنتصف ونحصل على النقطة c في المنتصف

c = ( a+b ) / 2=2.5

بعد تقسيم المقطع يجب ان نفحص هل نقطة التقاظع هي بين 2 و2.5 او بين 2.5 و3

بنفس الطريقة في الخطوة 1 فادا تحقق F(2.5)*F(3)<0 من هنا b=2.5 وادا لم يتحقق a=2.5 .

نعود الى الخطوة 2 ونستمر هكدا حتى تتحقق الدقة المطلوبة .

ارجو ان اكون وفقت في شرح الحل وارجو من المشرف ان يعذرنا لاننا دخلنا رياضيات في الموضوع اكتر من اللازم

وشكرا .

#10

ألف شكر لك أخي karimosh وجعله الله في ميزان حسناتك ليوم الدين ..

فعلا الأمر كما ذكرته تماما ..

2.gif

تحياتي للجميع ..

تزود للذي لابــــــــــد منه .... فإن الموت ميقات العبـــاد

وتب مما جنيت وأنت حي ... . وكن متنبها قبل الرقــــــاد

ستندم إن رحلت بغير زاد ... . وتشقى إذ يناديك المنادي

أترضى أن تكون رفيق قوم .... لهم زاد وأنـــت بغير زاد ؟!

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…