البرمجة

تحسين برنامج إنشاء بيتزا في C++

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

أولاً وقبل كل شيء، الخطأ الذي تواجهه “C++ forbids comparison between pointer and integer” يعني أن هناك مقارنة تحدث بين مؤشر (pointer) وعدد صحيح (integer)، وهذا لا يمكن في لغة C++.

الخطأ الثاني هو أنك تقوم بمقارنة نصوص باستخدام عمليات المقارنة (==)، وهذا ليس صحيحاً في C++.

الآن دعونا نقوم بتصحيح الأخطاء وتحسين الكود:

  1. أولاً، عند قراءة النص من المستخدم باستخدام cin، يجب عليك استخدام cin للحصول على النص بأكمله بدون استخدام فهرس مثل cin >> pizza.topping;.

  2. بعد ذلك، لا يمكنك استخدام عمليات المقارنة (==) لمقارنة نصوص. بدلاً من ذلك، يجب استخدام دالة مثل strcmp() للقيام بذلك.

  3. أيضًا، ينبغي أن تستخدم مؤشرًا إلى المصفوفة topping عوضًا عن استخدام عدد ثابت. فعلى سبيل المثال، يمكنك تعريف المصفوفة كمؤشر واستخدام new لتحديد الحجم الذي يتم قراءته من المستخدم.

  4. أخيرًا، لاحظ أنك تقوم بقراءة مؤشرات إلى المصفوفة pizza.topping باستخدام cin، وهذا غير صحيح. يجب استخدام cin.getline() لقراءة السلاسل المحتوية على مسافات.

بعد تطبيق هذه التغييرات، ستكون النسخة المصححة للكود كما يلي:

cpp
#include #include // لاستخدام strcmp using namespace std; class Pizza { public: int slices; char* topping; // تغيير النوع إلى مؤشر إلى char bool pepperoni, cheese; }; int main() { // Make your own Pizza! Pizza pizza; pizza.topping = new char[10]; // تحديد حجم المصفوفة باستخدام new cout << "\n You can have Cheese or Pepperoni Pizza!"; cout << "\n Type [cheese] or [pepperoni] \n"; cin.getline(pizza.topping, 10); // استخدام getline للقراءة if (strcmp(pizza.topping, "pepperoni") == 0) { pizza.pepperoni = true; cout << "How many slices of pepperoni would you like?"; } if (strcmp(pizza.topping, "cheese") == 0) { pizza.cheese = true; cout << "How many slices of cheese would you like?"; } cin >> pizza.slices; if (pizza.slices >= 1) { cout << "You ordered " << pizza.slices << " slices of " << pizza.topping << " Pizza!"; } else if (pizza.slices <= 0) { cout << "Change your mind?"; } else { cout <<"Can't Decide? That's Okay."; } delete[] pizza.topping; // تحرير الذاكرة المخصصة }

بعد هذه التغييرات، يجب أن يعمل البرنامج بشكل صحيح ويمنحك نتائج تناسب توقعاتك.

المزيد من المعلومات

بالطبع، إليك المزيد من المعلومات حول الكود والتغييرات التي تم إجراؤها:

  1. استخدام strcmp: في الكود المصحح، لمقارنة النصوص تم استخدام دالة strcmp التي تقارن بين سلسلتين نصيتين. إذا كانت السلاسل متطابقة، تُعيد الدالة القيمة صفر. وهذا ما تم استخدامه في الشروط داخل الـ if للتأكد من أن نوع البيتزا هو الذي تريده المستخدم.

  2. تحرير الذاكرة: عندما تقوم بتحديد متغير باستخدام new، يتعين عليك أن تتذكر أن تحرر الذاكرة بعد الانتهاء من استخدامها. لذلك تم استخدام delete[] لتحرير المصفوفة topping التي تم تحديدها باستخدام new.

  3. قراءة السلاسل النصية: تم استخدام cin.getline() بدلاً من cin >> لقراءة السلاسل النصية من المستخدم. هذا لأن cin >> تتوقف عندما تصل إلى مسافة بين الكلمات، بينما cin.getline() تقرأ السطر بأكمله بما في ذلك المسافات.

  4. تحسين بنية الكلاس: يمكن أيضًا التفكير في تحسين بنية الكلاس بحيث يتم تمرير النصوص المراد قراءتها كمعاملات في الدالة الخاصة بإنشاء البيتزا، بدلاً من تركيبها في الداخل. هذا يمكن أن يزيد من مرونة البرنامج وسهولة صيانته في المستقبل.

  5. التحكم في الإدخال: يمكن أيضًا أن تضيف التحكم في الإدخال لضمان أن المستخدم يقوم بإدخال خيارات صحيحة فقط، مثل استخدام حلقة do-while لطلب الإدخال حتى يتم إدخال خيار صحيح.

باستخدام هذه الإضافات والتحسينات، يمكن تعزيز جودة الكود وقابليته للصيانة والتوسع في المستقبل.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر