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

كيفية حل معادلة ب ++c

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

السلام عليكم

في البداية أحب أن أشكر جميع مشرفي وأعضاء هذا المنتدى الرائع والمفيد على الجهود الطيبة التي يقدمونها عسى أن يجعلها الله في ميزان حسناتكم .

وسؤالي هو :

أريد أن أكتب برنامج في الـ ++c ولا أعرف من أين وكيف أبدا فيه والمطلوب هو إدخال معادلة رياضية مثلا f(x)=x-sinx-0.5=0 ومجال حل المعادلة [0,3.14] بطريقة ما مثل طريقة التنصيف ؟؟

هذه أمور رياضيه غير مهمة المهم الطريقة البرمجية ..

فأنا لا أعرف هل أستخدم struct أم أعتبر x متغير عادي وكيف أحدد المجال ؟؟؟

أفيدوني جزاكم الله خيرا.اعتبروه موضوع للنقاش كل واحد يبدي رأيه حتي نصل إلى الحل ..

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

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

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

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

#2
f(x)=x-sinx-0.5=0

لا تعني الكثير و اظن ان طريقة كتابتها خاطئة و الا فان الناتج هو حل وليست علاقة اقصد متغير لا متغيرين.

x=sin(x)+0.5

و بالتالي فالمقصود هو

f(x)= x-sin(x)-0.5

لا يلزم structure و لكن for او while و غيرها ستؤدي الغرض مثل

for (int xx=0;xx < 315;xx++) {
float x , y;
x=xx/100;
y = x- sin (x) -0.5;
cout << x << '  ' << y;}

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#3

السلام عليكم

حقيقة الاخ عماد رد رد كافي ولكن انا فهمت ان المجال تريد تكرار من 0 الى 13 وطباعة الحل :

وعلى فهمي كتبة هذه السطور وان شاء الله تكون مفيدة وان كان من خطأ فارجوا توضيح السؤال اكثر .

وباللله التوفيق

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

int main()
{
	double x,y,z;

	/*
	cout << "Enter x = ";
	cin >> x;   
	y =  3.14 / 180 * x; //التحويل الى راديان
   z = x - sin(y) - 0.5; //حل المعادلة
   cout << z << "\n";*/

//هنا الحل للسؤال
   for( int i=0; i<=13; i++ )
   {
    y =  3.14 / 180 * i;
    cout << i - sin(y) - 0.5  << "\n";
   }




	return 0;

}

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

#4

اهلا بالاخ السهم النارى، في الحقيقة انا اتعلم c++ في الوقت الحاضر و بالتالى فلا يمكن الاخذ مني بشكل نهائى في c++ و انا اساهم هنا لاتعلم و افيد ما استطعت و لهذا فارجو من الجميع عدم التردد بتصحيح اخطائي و لا حرج.

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#5

مرحبا

شكرا أخواني على المشاركة .. أعتقد لسه ما توصلنا للحل ..

y =x-sinx-0.5

تتحقق المعادلة إذا كانت y=0 لأي قيمة ل x حيث xفي الجال من 0,3.14

في حال عمل for صعبة بسبب القيم العشرية التي من الممكن أن تحقق المعادلة مثلا في هذه الحالة x=0.1+x مارح يتوقف البرنامج يظل يشتغل ..

حلينا جزء من المشكلة بس ظهر أخر لأني ما ممكن أعمل i عدد صحيح ولا حتى عشري إذا يتوقف البرنامج عند حل يمكن فيه إحتمالية وجود حل أخر وبالتالي يكون البرنامج مش فعال ..

أرجو أن كلامي واضح .. على فكرة ما أعرف أستخدم code مثلكم للتوضيح أكثر أعذروني ..

شكرا مرة أخرى .. إذا أحد عنده حل مايبخل علينا ..

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

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

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

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

#6

السلام عليكم

الله يحيك اخي عماد هلا والله فيك في منتدنا.

كما احب احيي فيك تواضعك في تصحيح اخطائك . ( ومن منا يصاحبي لا يخطأ ولكن المهم أن نصحح من اخطائنا ).

فرصة سعيدة وبالتوفيق بأذن الله.

أما اخي السأل فأضنني فهمت وان لم افهم المجال فهل المقصود به من 0 الى 13

المهم اليك البرنامج بعد وضع if _ else لتدل على حل المعادلة وان لم نتوصل للحل فان شاء الله يرد عليك من هو احسن مني .

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

int main()
{
	double x,y;



	cout << "Enter number from \n x =  ";
	cin >> x; 


   y =  x - sin(3.14 / 180 *  x) - 0.5; //Íá ÇáãÚÇÏáÉ

   cout << "\n y  = " << y << "\n";

   if( y == 0 )
    cout << x << "\n";
   else
    cout << x << " Not solution \n";


   /*for( int i=0; i<=13; i++ )
   {
    y =  3.14 / 180 * i;
    cout << i - sin(y) - 0.5  << "\n";
   }*/




	return 0;

}

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

#7

السهم النارى لا تاخذني اخذت منك وغيرت الان جرب هذا

#include <iostream.h>
#include <math.h>
#define pi 3.14159265

int main()
{
double x,y;
for (int xx=0;xx<314000;xx++)
{

	x= xx;
	x/=100000;
	y= x  - 0.5- sin(x/180);
	if (y<0.000001 && y > -0.00001) 
	{  cout << x << ' ' << y << '\n';
	break;
	};

};

cin >> x; 


return 0;

}

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#8

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

ولكن أخي عماد أعتقد توصلنا للحل تقريبا ولكنني لم أفهم معنى :

if (y<0.000001 && y > -0.00001)

نحن نريد قيمة y=0 حتى نوجد حل المعادلة حيث أنx هي جذور المعادلة ( القيم التي تحقق المعادلة )

قد تكون اجابتك صحيحة وأنا غلطان لا أعرف ؟؟؟؟؟لأت البرنامج لن يتوقف في الحالة الثانية .

هل جربت تنفيذ البرنامج أم لا ؟؟ على كل حال سوف أجربه وأخبركم ..

شكرا لكم مرة أخرى ..

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

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

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

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

#9

ماهي المادة التى تدرسونها هل هي Numerical Analysis او ما شابه ؟ لانه و ربما طريقة البرمجة تعتمد على ما درستموه (خوارزم الحل)، بالنسبة للجملة التى تسال عنها فحيث ان العملية لا يمكن ان تاتي صفرا بالضبط بطريقة مباشرة ولكن هناك طرق تقريبية و هنا اعطي قيمة ل y حيث اضمن انها قريبة من الصفر و تقع بين -0.000001 و 0.00001، البرنامج بسيط ويمكن كتابته بطريقة افضل بكثير و بحسب Numerical Analysis و لكنى بحكم انني حديث في اللغة فلا استطيع الخوض كثيرا.

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#10

السلام عليكم

أخي عماد واخي foloer أحييكم وأقول ياسلام على التفاعل نبغى الشغل كذا دايم واحد يخطي الثاني يصحح والثالث يحلل وهكذا.

أخي عماد لماذا وضعت هذا السطر

x/=100000;

ومفائدة السطر الاخير

cin >> x;

هل تقصد رؤية الناتج.

والى floer أقول الجذور تحقق المعادلة عندما

y = 0;

كلام صحيح لكن اعطنا الخوارزمية وقانون التحويل الى راديان لاني ناسيه .

هل هو مثل ماهو موجود في البرنامج.

وياليت تعطينا عدد يحقق المعادلة ويكون له جذور أي عدد نجربه على الحل .

والله أعلم.

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

#11
x/=100000;

هذا السطر سببه ان استخدام FOR و XX++ ستعطي INTEGER و انا اريد رقم DOUBLE اي اجزء من باي 3.14 مثل 0.532 مثلا. حل المعادلة هو x=0.50279 حيث عندها تكون y قريبة من الصفر.

السطر الاخير لايقاف الشاشة و لا اعلم طريقة غير طرقة الادخال لاستيقاف الشاشة او لاظهارها و كما ذكرت لرؤية النتائج و ياليت تخبرني طريقة غير هذه الطريقة.

بالنسبة للجيب sin فهذه الدالة تحسب القيم بالراديان اي قياسا على PI 3.14 وهنا بعض القياسات حيث 360 درجة تساوي π2

DEGREES:
SIN(0)=0
SIN(90)=1
SIN(180)=0
SIN(270)=-1
RADIAN:
SIN(0)=0
SIN(PI/2)=1
SIN(PI)=0
SIN(PI*3/2)=-1

degrad.gif

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#12

مرحبا ..

أشكركم إخواني على تفاعلكم الطيب ..

أخي عماد المادة فعلا هي التي ذكرتها متعبة جدا ..

إذا كنت تريد إيقاف الشاشة إستخدم الأمر التالي والكلاس مرفق أعلاة وهو الصحيحة للإيقاف الشاشة :

#include <conio.h>
getch();

اليكم ما توصلت إليه :

#include <iostream.h>
#include <math.h>
#include <conio.h>
main()
{
double x,y;

for (int xx=0;xx<314;xx++)
{
 x=xx/100;
 y=x- sin(x)-0.5;

 if (y<0.000001 && y>-0.000001)
 cout<<x;
 else
 cout<< "no ";

 }

 getch();

 return 0;
 }

وضعت الأمر

else
 cout<< "no ";

فقط لأتأكد من ال for فقط ولكنني لا أحصل على نتيجة ل x ???

شكرا لكم السهم الناري وعماد ..

تحياتي

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

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

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

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

#13

السلام عليكم

ماشاء الله عليك عماد عندك حس رياضي وانا من محبين الرياضيات والبرمجة الرياضية حقيقة.

بالنسبة للدوال التي تقوم من خلالها بالنظر بالناتج فقد ذكر flower احدها وهو

و ch = getchar()

وغيرها المهم ان تقرأ أي حرف ( اقصد ان يضغط المستخدم على اي حرف على لوحة المفاتيح وينهي البرنامج ).

بالنسبة لللمعادلة ملاحظتم حاجة الا وهي أنه من الصعوبه ( وجهة نظر ) أيجاد جذر لها والسبب لوجود x التي يتم طرح قيمتها من قيمة sin و 0.5 وبالتالي لاتكون y = 0

والحمدلله أنكم توصلتم للحل .

وبالتوفيق والا الامام.

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

#14

المعادلة لها حل تقريبي يساوي (1.4973) ، أو تنويعات على هذا الحل إذا تحكمنا بقيمتي INTERVAL و PRECISION في الكود الموضح في الأسفل (نفس كود الحل الذي تعملون عليه).

كلما أعطينا الـ INTERVAL قيمة أصغر، حصلنا على أعداد أكثر من قيم x التي تحل المعادلة. فالعلاقة بينه وبين عدد الحلول عكسية.

وكلما صغرت قيمة الـ PRECISION ، حصلنا على عدد أقل من الحلول. طردية.

يمكن تجربة البرنامج بتثبيت إحدى القيمتين وتغيير الأخرى عدة مرات، ثم العكس.

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

#define PI 3.1415927
#define INTERVAL 0.0001
#define PRECISION 0.000001

void main() {

double x, y;
double increment = INTERVAL;

clrscr();
cout << "x - sin(x) - 0.5 = 0" << "\n";

for (x=0; x<=PI; x+=increment) {
	y = x - sin(x) - 0.5;
	if (y<PRECISION && y>-PRECISION) cout << "x = " << x << "\n";
}

cout << "Done.";
getch();

}

القيم الحالية تعطي حل واحد: x = 1.4973

#15

حل الاخ متعلم سليم من حيث القيمة وهي 1.4973 وقد اخطات سابقا بالقسمة على 180 و هذا الكود المعدل والنهائي ولكن الغريب انني حينما استعملت getch بدل cin لم تظهر النتيجة فما هو التفسير ؟

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

#define PI 3.14159265
#define INTERVAL 0.0001
#define PRECISION 0.000001

int main()
{
double x,y;
for (int xx=0;xx<PI/INTERVAL;xx++)
{

x= xx;
x*=INTERVAL;
y= x  - 0.5- sin(x);
if (y< PRECISION && y > - PRECISION) 
{  cout << x << ' ' << y << '\n';
break;
};

};

cin >> x;

return 0;

}

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#16

السلام عليكم

الكود ماشاء الله شغال صح.

بالنسبة لؤالك أخ عماد

في الغالي الدالة getch()

التي تاتي مع مكتبة conio.h

تظهر الناج على الشاشة ومن ثم تنتظر حتى يدخل المستخدم أي حرف من لوحة المفاتيح ثم تنهي البرنامج علما ان هذا الحرف الذي تم قراءته لا يظهر على الشاشة والعلم عند الله .

جرب مره اخرى فلا اظن ان هنالك سبب يمنع من التنفيذ .

وبالتوفيق.

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

#17

getch() غالبا ستعمل لكن إذا لم تستجب، اكتبها مرتين. ستضطر لضغط زر الإدخال مرتين أيضا.

#18

مطلوب تفسير!! غريبة وضعت هذا الكود و النتيجة تظهر فقط بعد الضغط على 6 احرف اي فقط عند الوصول للامر cin لماذا؟؟؟ بالنسبة للفجوال بيسك كان هناك امر اسمه doevents و يبدو اننا بحاجه لمثله لكن لا اعلم ما هو بانتظار المفسرين. استخدم مثلكم vc++ 6.0.

getch ();
getch ();
getch ();
getch ();
getch ();
getch ();
cin >> x;

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#19

السلام عليكم

ماشاء الله أفكار جميلة ومشجعة

الكود يبدو صحيحا مع اننا ممكن نكتب الكود بأكثر من طريقة ولكن اخواني هناك مشكلة بسيطة وهي ....

ماذا لو كان للمعادلة اكتر من جذر واحد فكروا معي.

#20

أظن أخي عماد انك لست في حاجة لان تستعمل getch()

لان الفيجوالc++ تعطيك نافدة سوداء لا تختفي حتى تضغط على اي مفتاح

Press any key to continue

والله اعلم

#21

السلام عليكم ,,

أستخدم visual studio 2003 ,, والكود يعمل مباشرة مع ال cin ,, لكن ماأعرفه لتلافي مثل هذه المشاكل عليك بواحدة من اثنين ,,

اما استخدام ال

cin.get();

بدل ال cin العادية ,,

أو ان تكتب جملة لتجاهل عدد خانات معين موجود مسبقا كالتالي:

cin.ignore(10);

جربو الكودين وأخبرونا ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#22
اقتباس
لان الفيجوالc++ تعطيك نافدة سوداء لا تختفي حتى تضغط على اي مفتاح

Press any key to continue

لفعل ذلك اضغط على ctr+F5 ,, بدلا من F5 فقط ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#23
HGB كتب:

لفعل ذلك اضغط على ctr+F5 ,, بدلا من F5 فقط ,,

هذا ما كنت ابحث عنه و لكن الا يوجد مفتاح لاظهار الشاشة حتى بعد الانتهاء من البرنامج ام ان الشاشة تكون مؤقتة و تفقد كل المعلومات بعد اغلاقها؟

39_22.gif

تزود من التقوى فإنك لا تدري *** إذا جن ليل هل تعيش إلى الفجر

فكم من فتى أمسى وأصبح ضاحكاً *** وقد نسجت أكفانه وهو لا يدري

لقراءة القرآن الكريم و سماعه و تفسيره ........

ماذا يعني انني مسلم سني؟

قصة غريبة

ConflictResolution.gif

#24

ما شاء الله عليكم يا شباب ..

أخيرا الحل مضبوط ...

عماد أنا أستخدم Borland ++c وتضبط معي getch()

شكرا لكم ..

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

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

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

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

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

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