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

برنامج Equationsolver

بدأه Omar Eladel في 25 سبتمبر 2008 · 10 رد · 2,681 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
السلام عليكم و رحمة الله و بركاته

منذ فترة بدأت فى تعلم Qt لعمل واجهات رسومية GUI باستخدام لغة C++ و كنت فى البداية اعانى ولا اعرف كيفية عمل اى برنامج غير الامثلة الموجودة فى الكتاب الذى اتعلم منه :confused: و لكن بعد فترة من القراءة قلت ما المانع ان اعمل اول برنامج لى باستخدام هذه المكتبة الرائعة السهلة البسيطة .

فكرة البرنامج :
هدف البرنامج هو حل المعادلات من الدرجة الاولى و الثانية باستخدام Quadratic Formula و هى كالتالى :
LaTeX
mimetex.cgi?x%20=%20%5Cfrac%7B%7B-b%7D%5


الوحدات البرمجية :
البرنامج يتكون من ثلاث وحدات :
  • equationsolver.h
  • equationsolver.cpp
  • main.cpp


شرح الاكواد :
اولا : equationsolver.h
هذا الملف به تعريف الصنف الاساسى فى البرنامج و هو EquationSolver .
كود الوحدة :
  1.  
  2. #ifndef EQUATIONSOLVER_H_INCLUDED
  3. #define EQUATIONSOLVER_H_INCLUDED
  4.  
  5. #include<QWidget>
  6. #include <QtGui>
  7.  
  8. class EquationSolver : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. EquationSolver(QWidget* =0);
  13.  
  14. private slots:
  15. void displayX();
  16. void clearForm();
  17.  
  18. private:
  19. QLineEdit* lineEditA;
  20. QLineEdit* lineEditB;
  21. QLineEdit* lineEditC;
  22. QLineEdit* lineEditDispX1;
  23. QLineEdit* lineEditDispX2;
  24. QPushButton* Calculate;
  25. QPushButton* Clear;
  26.  
  27. double a,b,c;
  28. double x1,x2;
  29.  
  30. double calculateX1(double, double, double);
  31. double calculateX2(double, double, double);
  32.  
  33. };
  34. #endif // EQUATIONSOLVER_H_INCLUDED
  35.  
  36.  
السطر 4,5: تضمين الملفات QWidget , QtGui QWidget : هذا الصنف هو الصنف الاساسى لكل عناصر واجهة المستخدم حيث كل عناصر الواجهة ترث هذا الصنف QtGui : هذا الملف يحتوى على جميع عناصر واجهة المستخدم مثل الازرار و صناديق النصوص 7: تعريف الصنف حيث انه يرث من الصنف QWidget9: هذا macro يجب ان يظهر فى تعريف الصنف الذى به اشارات و مستقبلاته الخاصة Signals & Slots 11: دالة البناء Constructor 13: تعريف مستقبلات الصنف Slots 14: دالة displayX() لعرض حلول المعادلة فى صناديق النصوص 15: دالة clearForm() لمسح محتويات النموذج (المدخلات و المخرجات)17: تعريف المتغيرات الخاصة التى يستخدمها الصنف (واضحة من مسمياتها) 29,30: دالتى calculateX1() , calculateX2() لحساب قيمة x فى المعادلة المدخلة ثانيا : equationsolver.cpp هذا الملف به تنفيذ الصنف EquationSolver
  1.  
  2. #include "equationsolver.h"
  3. #include <QtGui>
  4. #include <cmath>
  5. #include <QString>
  6.  
  7.  
  8. EquationSolver::EquationSolver(QWidget* parent)
  9. {
  10. lineEditA = new QLineEdit("Enter A");
  11. lineEditB = new QLineEdit("Enter B");
  12. lineEditC = new QLineEdit("Enter C");
  13. lineEditDispX1 = new QLineEdit("X1");
  14. lineEditDispX2 = new QLineEdit("X2");
  15. Calculate = new QPushButton("&Calculate");
  16. Clear = new QPushButton("&Clear");
  17.  
  18. QHBoxLayout* up = new QHBoxLayout;
  19. up->addWidget(lineEditA);
  20. up->addWidget(lineEditB);
  21. up->addWidget(lineEditC);
  22.  
  23. QVBoxLayout* downright = new QVBoxLayout;
  24. downright->addWidget(Calculate);
  25. downright->addWidget(Clear);
  26.  
  27. QHBoxLayout* downleft = new QHBoxLayout;
  28. downleft->addWidget(lineEditDispX1);
  29. downleft->addWidget(lineEditDispX2);
  30.  
  31. QHBoxLayout* down = new QHBoxLayout;
  32. down->addLayout(downleft);
  33. down->addLayout(downright);
  34.  
  35. QVBoxLayout* layout = new QVBoxLayout;
  36. layout->addLayout(up);
  37. layout->addLayout(down);
  38. setWindowTitle("EquationSolver");
  39. setLayout(layout);
  40.  
  41. connect(Calculate, SIGNAL(clicked()), this, SLOT(displayX()));
  42. connect(Clear, SIGNAL(clicked()), this,SLOT(clearForm()));
  43.  
  44.  
  45.  
  46. }
  47.  
  48. double EquationSolver::calculateX1(double a,double b, double c) //function to compute x1
  49. {
  50. double delta, X1, num, den; //data required for calculations
  51. double bsqr;
  52. if (a != 0) //quadratic equation
  53. {
  54.  
  55. bsqr = b*b;
  56.  
  57. delta = sqrt(bsqr - (4*a*c));
  58. num = (-1 * b) + delta;
  59. den = 2*a;
  60. X1 = num / den;
  61. return X1;
  62. }
  63. else if (a == 0) //linear equation
  64. {
  65. X1 = (-c) / b;
  66. }
  67. return X1;
  68. }
  69.  
  70. double EquationSolver::calculateX2(double a,double b, double c) //function to compute x1
  71. {
  72. double delta, X2, num, den; //data required for calculations
  73. double bsqr;
  74. if (a != 0) //quadratic equation
  75. {
  76.  
  77. bsqr = b*b;
  78.  
  79. delta = sqrt(bsqr - (4*a*c));
  80. num = (-1 * b) - delta;
  81. den = 2*a;
  82. X2 = num / den;
  83. return X2;
  84. }
  85. else if (a == 0) //linear equation
  86. {
  87. X2 = (-c) / b;
  88. }
  89. return X2;
  90. }
  91.  
  92. void EquationSolver::displayX()
  93. {
  94. QString strA;
  95. QString strB;
  96. QString strC;
  97.  
  98. QString strX1;
  99. QString strX2;
  100.  
  101. strA = lineEditA->text();
  102. strB = lineEditB->text();
  103. strC = lineEditC->text();
  104. a = strA.toDouble();
  105. b = strB.toDouble();
  106. c = strC.toDouble();
  107.  
  108. x1 = calculateX1(a,b,c);
  109. x2 = calculateX2(a,b,c);
  110.  
  111. QVariant varX1(x1);
  112. QVariant varX2(x2);
  113.  
  114.  
  115. strX1 = varX1.toString();
  116. strX2 = varX2.toString();
  117.  
  118. lineEditDispX1->setText(strX1);
  119. lineEditDispX2->setText(strX2);
  120. }
  121.  
  122. void EquationSolver::clearForm()
  123. {
  124. lineEditA->clear();
  125. lineEditB->clear();
  126. lineEditC->clear();
  127. lineEditDispX1->clear();
  128. lineEditDispX2->clear();
  129. }
  130.  
  131.  
1 => 4 : لتضمين الملفات التى نحتاجها فى تنفيذ دوال الصنف 7: دالة البناء Constructor 9 => 15 : تعريف عناصر واجهة المستخدم 17 => 39 : تعريف التصميم الخاص بالنموذج layouts 40: جملة الاتصال connect بين زر Calculate و صناديق النصوص لعرض النتائج 41: جملة الاتصال connect بين زر Clear و صناديق النصوص لمسح النصوص المكتوبة 47 => 90 : دوال حساب قيمة X باستخدام القانون المذكور فى الرابط : Quadratic Formula المشكلة الاساسية ظهرت فى ما بعد ذلك و هى فى جلب الارقام من صناديق النصوص و تنفيذ دوال الحساب و عرض النتائج مرة اخرى المشكلة فى ان صناديق النصوص تحتوى على نصوص من نوع QString و لا يمكن وضع ما فيها فى متغير رقمى لذلك وجب التحويل من نص الى رقم الحل فى السطر 103,104,105 و هى دالة خاصة بالصنف QString لتحويل من متغير نصى الى متغير رقمى من نوع double المشكلة الاخرى هى فى التحويل مرة اخرى من double الى QString و هذه المشكلة الاصعب لأن Standard C++ لا توفر دوال لتحويل الى QString لان هذا صنف خاص بـ Qt لذلك استخدمنا متغير من نوع QVariant و هو يقبل اى نوع من المتغيرات , هنا نحن مررنا له متغير من نوع double لتحويله الى متغير من QString الحل فى الاسطر 110 => 116 : انشاء متغير من نوع QVariant ليستقبل الناتج فى شكل double ثم تحويله الى متغير نصى من نوع QString عن طريق الدالة الخاصة بالصنف QVariant تسمى toString() باقى الكود هو لمسح محتويات صناديق النصوص عن طريق الدالة clear() ثالثا : main.cpp
  1.  
  2. #include <QApplication>
  3. #include "EquationSolver.h"
  4. #include <QPlastiqueStyle>
  5.  
  6. int main(int argc, char* argv[])
  7. {
  8. QApplication app(argc, argv);
  9. EquationSolver* pro = new EquationSolver;
  10. QApplication::setStyle(new QPlastiqueStyle);
  11. pro->show();
  12. return app.exec();
  13. }
  14.  
  15.  

هذا كود الدالة الرئيسة main() و هى تحتوى على تعليمات بسيطة جدا &

Eq.rar

تم تعديل هذه المشاركة بواسطة Omar Eladel في 26 سبتمبر 2008 في 14:20

#2

بارك الله فيك

تعجبني مثابرتك كثيرا..واصل

#3

الشكر لم يعد يعمل لدي!

ثابر على ما تقوم به وفقك الله :)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

اشكركم على ردودكم هذه يا اخوتى

بارك الله فيكم

وفقكم الله

#5

بداية جميلة أخي عمر

لكن للأسف , البرنامج يعرض Error بسبب عدم وجود المكتبة mingwm10.dll

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#6

اخى علاء ,,,,

المكتبة موجودة , حمل الملف الموجود فى الرابط فى اخر الموضوع و ضع الملفات فى نفس مجلد البرنامج و سوف يعمل باذن الله

#7

نعم , اشتغل البرنامج الآن

فلم ألاحظ وجود رابط الملفات

ورفعتها عشانك

الملفات مرفقة

وأرجو منك إزالة رابط الرابيدشير في الموضوع أعلاه

Depends.rar

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#8

بعد مشاهدة البرنامج أخي عمر , احب أعطيك بعض الاقتراحات التطويرية :

- قم بمنع المستخدم من إدخال أي قيم في خانة الناتج (X1 , X2)

لأنها مربعات إخراج فقط

- امنع المستخدم من إدخال أية أحرف في مربعات الإدخال

فهذا سيؤثر سلباً على الناتج , ويقلل من كفاءة برنامجك في معالجة الخطأ

- يمكنك تحسين الواجهة لتصبح مثلاً :

post-110239-1222466331_thumb.jpg

فتصبح أكثر تنظيماً وأكثر وضوحاً

لأنني عندما شغلت البرنامج للمرة الاولى ... كتبت قيما في مربعات الإخراج :blush:

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

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#9

عدلت البرنامج مثلما قال علاء

التعديلات :

1- منع المستخدم من ادخال بيانات فى صندوقى X1 و X2

2- اضافة صناديق عناوين labels للتوضيح للمستخدم ادخال البيانات

هذه صورته :

post-132119-1222511268_thumb.jpg

Eq.rar

#11

هذا تعديل الواجهة كما اردت يا علاء , و باستخدام GroupBox

post-132119-1222597949_thumb.png

Eq.rar

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