عندما نلقي نظرة على الكود، نجد أن هناك عدة أخطاء في الطريقة التي تم فيها كتابته وتنفيذه. دعنا نقوم بتحليل الأخطاء وتصحيحها لجعل البرنامج يعمل كما يتوقع المستخدم.
أولاً وقبل كل شيء، الخطأ الذي تواجهه “C++ forbids comparison between pointer and integer” يعني أن هناك مقارنة تحدث بين مؤشر (pointer) وعدد صحيح (integer)، وهذا لا يمكن في لغة C++.
-
تخزين الأرقام والفراغات في مصفوفة بلغة C15/02/2024
-
تحسين قراءة وإيداع الشيفرة في Rust02/02/2024
-
فهم فرق الاستدعاء بين JavaScript ولغات C/C++19/03/2024
الخطأ الثاني هو أنك تقوم بمقارنة نصوص باستخدام عمليات المقارنة (==)، وهذا ليس صحيحاً في C++.
الآن دعونا نقوم بتصحيح الأخطاء وتحسين الكود:
-
أولاً، عند قراءة النص من المستخدم باستخدام
cin
، يجب عليك استخدامcin
للحصول على النص بأكمله بدون استخدام فهرس مثلcin >> pizza.topping;
. -
بعد ذلك، لا يمكنك استخدام عمليات المقارنة (==) لمقارنة نصوص. بدلاً من ذلك، يجب استخدام دالة مثل
strcmp()
للقيام بذلك. -
أيضًا، ينبغي أن تستخدم مؤشرًا إلى المصفوفة
topping
عوضًا عن استخدام عدد ثابت. فعلى سبيل المثال، يمكنك تعريف المصفوفة كمؤشر واستخدامnew
لتحديد الحجم الذي يتم قراءته من المستخدم. -
أخيرًا، لاحظ أنك تقوم بقراءة مؤشرات إلى المصفوفة
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; // تحرير الذاكرة المخصصة
}
بعد هذه التغييرات، يجب أن يعمل البرنامج بشكل صحيح ويمنحك نتائج تناسب توقعاتك.
المزيد من المعلومات
بالطبع، إليك المزيد من المعلومات حول الكود والتغييرات التي تم إجراؤها:
-
استخدام
strcmp
: في الكود المصحح، لمقارنة النصوص تم استخدام دالةstrcmp
التي تقارن بين سلسلتين نصيتين. إذا كانت السلاسل متطابقة، تُعيد الدالة القيمة صفر. وهذا ما تم استخدامه في الشروط داخل الـif
للتأكد من أن نوع البيتزا هو الذي تريده المستخدم. -
تحرير الذاكرة: عندما تقوم بتحديد متغير باستخدام
new
، يتعين عليك أن تتذكر أن تحرر الذاكرة بعد الانتهاء من استخدامها. لذلك تم استخدامdelete[]
لتحرير المصفوفةtopping
التي تم تحديدها باستخدامnew
. -
قراءة السلاسل النصية: تم استخدام
cin.getline()
بدلاً منcin >>
لقراءة السلاسل النصية من المستخدم. هذا لأنcin >>
تتوقف عندما تصل إلى مسافة بين الكلمات، بينماcin.getline()
تقرأ السطر بأكمله بما في ذلك المسافات. -
تحسين بنية الكلاس: يمكن أيضًا التفكير في تحسين بنية الكلاس بحيث يتم تمرير النصوص المراد قراءتها كمعاملات في الدالة الخاصة بإنشاء البيتزا، بدلاً من تركيبها في الداخل. هذا يمكن أن يزيد من مرونة البرنامج وسهولة صيانته في المستقبل.
-
التحكم في الإدخال: يمكن أيضًا أن تضيف التحكم في الإدخال لضمان أن المستخدم يقوم بإدخال خيارات صحيحة فقط، مثل استخدام حلقة
do-while
لطلب الإدخال حتى يتم إدخال خيار صحيح.
باستخدام هذه الإضافات والتحسينات، يمكن تعزيز جودة الكود وقابليته للصيانة والتوسع في المستقبل.