التعلم بالمثال
واحدة من أفضل الطرق لتعلم كيفية البرمجة بلغة جديدة هي البحث عن في الكثير والكثير من نماذج البرامج. أفضل شيء يمكنك فعله هو نسخ ولصق كل برنامج أدناه في ملف نصي وتجميعه. بعد ذلك، جرّب التجارب. من خلال توسيع هذه البرامج النموذجية، ستكتسب المعرفة بالجوانب المختلفة من C++، وستشعر بمزيد من الثقة عندما يحين وقت كتابة برامج من الصفر.
المثال 1: تجهيز برنامج التحويل البرمجي للعمل!
إذا لم يسبق لك إجراء ذلك، يُرجى نسخ البرنامج الكلاسيكي التالي ولصقه. في ملف نصي وتجميعه. تتوفر التعليمات حول التجميع هنا.
من المحتمل أنك عملت على تفاصيل هذا البرنامج في البرنامج التعليمي، لذلك لن نقدم وصفًا مفصَّلاً هنا. هناك بعض الأشياء مع ذلك، في ما يتعلق بسهولة القراءة. يشير ذلك إلى التعليقات والتنسيق الذي يساعد في تسهيل قراءة البرامج وفهمها والحفاظ عليها.
- يبدأ كل برنامج نكتبه بتعليق في العنوان يشير إلى الاسم للمؤلف ومعلومات الاتصال به ووصف موجز للاستخدام (إذا كان ذلك منطبقًا). تبدأ كل دالة بتعليق على العملية والاستخدام.
- نحن نضيف تعليقات توضيحية باستخدام جمل كاملة، كلما كانت التعليمات البرمجية وليس توثيقها بنفسه، على سبيل المثال، إذا كانت عملية المعالجة صعبة أو غير واضحة، أو شيقة أو مهمة.
- استخدام الأسماء الوصفية دائمًا: المتغيّرات عبارة عن كلمات بأحرف صغيرة مفصولة عنها. بواسطة _، كما في my_variable. تستخدم أسماء الدوال أحرفًا كبيرة لوضع علامة على الكلمات، كما في MyExciteFunction(). تبدأ الثوابت بحرف "k" واستخدامها الأحرف الكبيرة لوضع علامة على الكلمات، كما في kDaysInWeek.
- المسافة البادئة في مضاعفات الرقم اثنين. المستوى الأول عبارة عن مسافتين؛ إذا كانت أخرى هناك حاجة إلى مسافة بادئة، فنحن نستخدم أربع مسافات وستة مسافات وما إلى ذلك.
// hello.cpp: Maggie Johnson // Description: a program that prints the immortal saying "hello world" #include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
بعض التجارب التي يمكن تجربتها:
- الشيء الأكثر أهمية هو التأكد من أنه يمكنك تجميع هذا البرنامج وتشغيله.
- عدّل البرنامج أعلاه لطباعة "Hello World!" 4 مرات في سطرًا مكونًا من 6 أسطر، حيث تتم طباعة كل سطر في حقل مكون من 17 مسافة. استخدام حلقة التكرار للقيام بذلك. انقر هنا لـ سنتعرف على تنسيق الناتج باستخدام الرسم التخطيطي. انقر هنا لإجراء لرؤية الحل.
- باستخدام البرنامج الذي أكملته للتو، اكتشف كيفية طباعة "Hello" العالم!" محاذاته لليسار في حقول 17 مسافة (الافتراضي هو عادةً محاذاة إلى اليمين). انقر هنا للاطّلاع على الحلّ.
المثال 2: الحصول على بعض الإدخالات
من السهل الحصول على إدخالات من لوحة المفاتيح في لغة C++ باستخدام cin. يُرجى الاطّلاع على المثال أدناه:
// get_input.cpp: Maggie Johnson // Description: Illustrate the use of cin to get input. #include <iostream> using namespace std; int main() { int input_var = 0; // Enter the do while loop and stay there until either // a non-numeric is entered, or -1 is entered. Note that // cin will accept any integer, 4, 40, 400, etc. do { cout << "Enter a number (-1 = quit): "; // The following line accepts input from the keyboard into // variable input_var. // cin returns false if an input operation fails, that is, if // something other than an int (the type of input_var) is entered. if (!(cin >> input_var)) { cout << "You entered a non-numeric. Exiting..." << endl; break; // exit the do while loop } if (input_var != -1) { cout << "You entered " << input_var << endl; } } while (input_var != -1); cout << "All done." << endl; return 0; }
التجربة:
- عند حدوث خطأ في الإدخال، "يتوقف" البث إرجاع سين
false ويتوقف البرنامج. من المهم جدًا الاحتراس من مثل هذه الأخطاء
كما فعلنا في البرنامج أعلاه. لكن ماذا لو أردنا التعافي من الخطأ،
بدلاً من أن يتوقف البرنامج؟ هناك خطوتان للتعافي من
خطأ:
- امسح الخطأ باستخدام cin.clear().
- أزِل الأحرف غير الصحيحة من ساحة المشاركات. طريقة واحدة للقيام بذلك هي باستخدام cin.ignore().
اكتب برنامجًا يتعافى من الإدخال السيئ باستخدام هاتين الخطوتين. استخدام على Google للبحث عن آلية عمل هذه الطرق. الحل الذي نقدّمه هنا.
المثال 3: ماذا يُخرج هذا البرنامج؟
#include <iostream> using namespace std; int main() { cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl; for (int c = 1; c < 10; c++) { cout << c << "| "; for (int i = 1; i < 10; i++) { cout << i * c << '\t'; } cout << endl; } return 0; }
المثال 4: يؤدي التفكيك إلى تسهيل تنفيذ كل شيء...
حان الوقت لنبدأ في كتابة ألعاب الكمبيوتر! ستكون هذه الطريقة الأولى بسيطة بعض الشيء، ولكنه بداية. تتمثل مهمتنا في كتابة برنامج ينفذ عملية التخمين في اللعبة. يُنشئ برنامجنا رقمًا عشوائيًا بين 0 و100. يجب على اللاعب وتخمين الرقم السري. يقدم البرنامج تلميحات مثل "هذا المبلغ مرتفع جدًا" أو "هذا منخفض جدًا" حتى يخمن اللاعب الرقم السري أخيرًا.
سنعمل على هذه اللعبة في ثلاث خطوات.
- اكتشاف كيفية إيجاد رقم عشوائي ضمن نطاق معين من القيم.
- أنشئ دالة رئيسية تعالج تخمينًا واحدًا من اللاعب وتوفّر تلميحات.
- أضف ما نحتاج إليه للسماح بإجراء تخمينات متعددة حتى يخمن اللاعب الرقم.
وتُسمى عملية التطوير هذه تحليلاً، وهو ما يعني كسر مهمة إلى مهام فرعية، يسهل تنفيذ كل منها.
بدءًا من الخطوة 1، عليك إجراء بحث على Google لمعرفة كيفية إنشاء رقم عشوائي. باستخدام C++. جرِّب البحث على "راند C++". إليك الحل الذي نقدمه.
بالنسبة للخطوة 2، نحتاج إلى تلقي عدد صحيح مُدخل من المشغّل (مع تحديد قيمة وفحص الخطأ في الرقم التسلسلي)، والتحقق منه مقابل الرقم السري. التجربة والكتابة هذا الجزء من اللعبة بنفسك قبل الاطلاع على الحلّ.
أخيرًا، يجب إضافة حلقة تُواصِل جمع التخمينات من اللاعب حتى يخمنوا أخيرًا الرقم السري. بعد الانتهاء من هذا الجزء من يمكنك الاطّلاع على الحلّ الذي نقدّمه.
التحلل هو أحد أهم المهارات التي يجب أن يتعلمها المبرمج. القدرة على تقسيم المهمة إلى أجزاء يمكن إدارتها، ثم إكمال واحدة في مرحلة ما أمر بالغ الأهمية، بغض النظر عن حجم المشروع أو صغره. إليك بعض الأمثلة الفرص الأخرى المتاحة لك لممارسة الانحلال.
- توفر العديد من المهام اليومية فرصًا لبناء المهارات في الانحلال.
قد يفاجئك أن تكتشف أن عقلك يعمل بهذه الطريقة!
على سبيل المثال، إذا كان عليّ تنظيف مطبخ فوضوي حقًا (ربما الفتيات الصغيرات خبزت كعكة للتو)، أقسّم المهام لتقديم خطة، وللتأكد من عدم حاجتي إلى إعادة العمل لاحقًا. لا أريد أن أغسل الطابق الأول إذا كان هناك جميع أنواع الأشياء على الطاولات لتنظيفها - سأقوم وربما تضطر إلى القيام بالأرضية مرة أخرى لاحقًا. لذا، ربما أضع جميع المكونات غير متاح أولًا؛ نقل جميع الأطباق إلى الحوض؛ وتنظيف الطاولات؛ غَسْل الأطباق؛ وأخيرًا، تنظيف الأرضية. هناك طرق أخرى لتنفيذ هذه المهمة، ولكن من خلال التفكير فيها أولاً، تساعدني في تحديد خطة لن يتطلب إعادة العمل.
استخدم المهام اليومية كأمثلة لتطوير مهارات التحليل لديك. من يدري - قد يجعلك ذلك أكثر كفاءة في المنزل!
- القاسم المشترك الأكبر لعددين صحيحين هو أكبر عدد
ويقسمهما معًا بالتساوي. على سبيل المثال، gcd(12, 18) = 6, gcd(−4, 14) = 2.
إن أكثر الطرق فعالية لحساب gcd هي استخدام الخوارزمية الإقليدية. كتابة
برنامج بدالة لحساب gcd لعددين صحيحين. جرِّب إجراء ما يلي:
بدون تكرار، سيُساعدك على فهم كيفية تأثير الخوارزمية
أعماله.
حدد مهامك الفرعية بوضوح، على سبيل المثال، ابحث عن التعليمة البرمجية والخوارزمية إنشاء دالة غير متكررة للخوارزمية؛ وما إلى ذلك. هنا الحل الذي نقدمه.
المثال 5: ألغاز الرياضيات
تتمثل إحدى إمكانيات الحوسبة في القدرة على إجراء بحث بالقوة الغاشمة عن حل لمشكلة. تعمل التجربة والخطأ بشكل جيد في بعض المشكلات. وفي الواقع، يمكن لأجهزة الكمبيوتر أن تكون جيدة بشكل خاص في مثل هذه المشكلات. ضع في اعتبارك هذا:
تبلغ تكلفة الخيول 10 دولار أمريكي، والخنازير 3 دولار أمريكي، بينما تبلغ تكلفة الأرانب 0.50 دولار أمريكي فقط. مزارع يشتري 100 عن الحيوانات مقابل 100 دولار، فكم عدد الحيوانات التي اشتراها من كل حيوان؟
هناك حل بسيط للغاية لهذه المشكلة. تحقّق مما إذا كان بإمكانك العثور على قبل أن تطلع على لدينا.
إليك طريقة أخرى يمكنك تجربتها:
كم عدد الطرق التي يمكنك من خلالها ترتيب 6 كتب مختلفة، من اليسار إلى اليمين، على الرف؟
هذه المرة سنقدم لك الحل ونتيح لك كتابة البرنامج: 720.
المثال 6: سلاسل للنظر فيها
ماذا يُخرج البرنامج التالي؟
#include <iostream> using namespace std; int main() { string str1 = "To be or not to be, that is the question"; string str2 = "only "; string str3 = str1.substr(6, 12); str1.insert(32, str2); str1.replace(str1.find("to be", 0), 5, "to jump"); str1.erase(9, 4); cout << str1 << endl; for (int i = 0; i < str3.length(); i++) cout << str3[i]; cout << endl; }
(يُرجى النقر.) هنا للحصول على بعض المساعدة.
المثال 7: الخطوات التالية مع الانحلال - يومك الأول في العمل
حصلت للتو على وظيفة مندوب مبيعات في شركة ExerShoe، ومتخصصة في أحذية التمارين الرياضية المتطورة بتكلفة 225 دولارًا تقريبًا لكل زوج. لقد منحك رئيسك في العمل ثلاثة خيارات للتعويض، والتي يجب عليك اختيارها قبل أن تبدأ اليوم:
- راتب ثابت قدره 600 دولار في الأسبوع؛
- راتب 7.00 دولار في الساعة بالإضافة إلى عمولة بنسبة 10٪ على المبيعات؛
- بدون راتب، ولكن 20% عمولات و20 دولار أمريكي لكل زوج من الأحذية المُباعة
بصفتك مبرمجًا خبيرًا في C++ ، يمكنك كتابة برنامج لمساعدتك على تحديد أفضل خيار للتعويض.
هناك نهج شائع في إجراء التحليل لبرنامج أكبر وهو إنشاء دالة رئيسية تشبه المخطط التفصيلي لحل المشكلة. بعد ذلك، يُرجى اتّباع الخطوات التالية: نكتب الدوال للقيام بكل مهمة.
إليك الاجتياز الأول في البرنامج الرئيسي:
GetInput(WeeklySales); CalcMethod1(WeeklySales); CalcMethod2(WeeklySales); CalcMethod3(WeeklySales);
لنرَ ما إذا كان بإمكانك تنفيذ كلّ من هذه الدوال قبل مراجعة الحلّ.
المثال 8: ما الأماكن المتوفرة؟
ما ناتج البرنامج التالي؟
// scope.cpp, Maggie Johnson // Description: A program to illustrate different scopes #include <iostream> using namespace std; int a = 18; int b = 6; int function1(int a, int b) { return a - b; } int function2() { int c; c = a + b; return c; } int main() { int b = 12; int c = 0; a = function1(b, a); c = function2(); cout << "a: " << a << " b: " << b << " c: " << c << endl; }
بعد تحديد إجابتك، يمكنك مراجعة نسختنا التي تتضمّن تعليقات من الرمز هنا.
المثال 9: معالجة الملفات
يتم تنفيذ معالجة الملفات في لغة C++ باستخدام fstream. لحفظ الملف في ملف، وأن تعلن عن قيمة السمة "outstream" ثم افتحها باستخدام الأمر "out" الحالي. التحقق من هذا في المثال التالي.
// file.cpp, Maggie Johnson // Description: An illustration of file processing #include <fstream> #include <iostream> using namespace std; int main() { char first_name[30], last_name[30]; int age; char file_name[20]; // Collect the data. cout << "Enter First Name: "; cin >> first_name; cout << "Enter Last Name: "; cin >> last_name; cout << "Enter Age: "; cin >> age; cout << endl << "Enter the name of the file: "; cin >> file_name; // Create an ofstream called People, open the stream for output. ofstream People(file_name, ios::out); // Write the output to the stream. People << first_name << endl << last_name << endl << age << endl; return 0; }
- انظر ما إذا كان بإمكانك معرفة كيفية فتح الملف الذي تم إنشاؤه للتو، وعرض البيانات.إليك الحلّ الذي نقدّمه.
- والآن اعرف ما إذا كان يمكنك تعديل هذا البرنامج للسماح للمستخدم بإدخال العديد لسجلات البيانات باستخدام التكرار الحلقي. نريد أيضًا قراءة جميع البيانات، واحد تسجيلها في وقت واحد.إليك الحلّ الذي نقدّمه.
أنت الآن جاهز لتجربة بعض التدريبات مشاريعك بنفسك.
كيف يبدو العمل كمهندس برمجيات في Google
اقرأ عن شكل العمل في Google في هذا موقعك الإلكتروني.
تمارين ومشاريع
ستكون التدريبات التالية ستمنحك المزيد من التدريب على لغة C++ الأساسية. لا نقدّم حلولاً لهذه التمارين. المشروعات لأننا نريدك أن تعمل مع الطلاب الآخرين في هذا دورة سابقة.
- رقاقة كريكت الحقل المشترك بشكل مباشر مع درجة الحرارة الحالية
جمع 40 إلى عدد المرات التي يسقط فيها كريكت في الدقيقة، ثم قسمة
أن القيمة في 4 تعطينا درجة الحرارة. كتابة برنامج يأخذه كمدخل
عدد النقرات في الدقيقة ويطبع درجة الحرارة الحالية. بالنسبة
مثال،
Number of chirps: 120 The temperature is: 40.0 degrees.
- اكتب برنامجًا سيحسب درجتك النهائية في دورة برمجة.
التي ستتخذها. في ما يلي نظام وضع الدرجات:
Final grades will be based on the following: 40% Assignments 15% Midterm Examination 35% Final Examination 10% Class Participation Grade
يجب أن يطلب برنامجك من المستخدم درجات المهام الأربع، منتصف الفصل الدراسي، النهائية والدرجات للقسم. ثم، يتم حساب النتيجة النهائية وطباعتها. لإجراء العمليات الحسابية، يمكنك متوسط درجات المهام الأربعة معًا ثم ضربه في 0.4 (40%). ومن ثم، تضرب درجة منتصف الفصل بحلول 0.15، يكون النتيجة النهائية بمقدار 0.35 ودرجة المشاركة بمقدار 0.1. ثم جمع جميع نتائج عمليات الضرب هذه معًا.
استخدم الدوال حيثما كنت تستطيع في هذا البرنامج. يمكنك إنشاء دالة للحصول على المُدخل عن طريق تمرير السلسلة المطلوب عرضها كمعلمة في اجتماع توضيحي. إليك مثال على الأمر:
Enter the score for the first assignment. 75 Enter the score for the second assignment. 85 Enter the score for the third assignment. 82 Enter the score for the fourth assignment. 94 Enter the score for the midterm. 81 Enter the score for the final. 89 Enter the score for the section grade. 100 The final grade is: 86.9
- ونظرًا لأن ساعات التوقف الإلكترونية تصبح أرخص وأكثر دقة، فلن نتحرك
الشك في الانغماس بقياسات زمنية دقيقة بشكل مستحيل. كتابة برنامج
يُستخدم كإدخال فترة زمنية محددة بالثواني، ويتم إخراج عدد
الساعات والدقائق والثواني التي يمثلها. على سبيل المثال،
Number of seconds: 3662 Hours: 1 Minutes: 1 Seconds: 2
- لنفترض أننا أردنا طباعة بانر لما يلي:
أغنية FREEZY BREEZE Making 3 TreES FREEZE
نريد أن تكون الحروف كبيرة جدًا نظرًا لأن هذا لافتة:
وهكذا.FFFFF F FFF F F EEEEE E EEE E EEEEE
كونك أداة جيدة لتحليل المشكلات، ربما لاحظت أنه بدلاً من وضع جميع الأحرف في الوظيفة الرئيسية، فسيكون ذلك أكثر كفاءة لوضعها في الدوال. لذلك يمكن أن يكون لدينا "طباعة" الوظيفة و"printZ" والوظيفة وهكذا.
كتابة برنامج يحتوي على دوال تؤدي إلى إنشاء بانر لكلمة أو عبارة تحتوي على الكثير من الأحرف المتكررة. إليك بعض الاحتمالات:
FREEZY BREEZE MAKES FLEAS SNEEZE TWEETLE BEETLE PADDLE BATTLE SIX SICK CHICKS KICK SUE SEWS SUE'S SOCKS BEN BENDS BIM'S BROOM
- هذا "رقم سحري" المشكلة: اطلب من المستخدم إدخال رقم مكوّن من ثلاثة أرقام
رقم يكون رقمه الأول أكبر من آخر رقمه. سيتم التراجع عن تنفيذ برنامجك
الرقم، وطرح العكس من العدد الأصلي. أَخِيرًا،
وعكس الرقم الناتج وإضافته إلى شكله المعكوس. أخرِج
النهائية. يجب أن يكون الرقم الأصلي الذي يدخله المستخدم عددًا صحيحًا
اكتب (ليس ثلاثة أحرف). فكر في كيفية كتابة دالة تتطلب
عدد صحيح كإدخال ويتم إرجاع عكس هذا الرقم. مثال:
input number: 901 reverse it: 109 subtract: 901 - 109 = 792 reverse it: 297 add: 297 + 792 = 1089
- يشترط القانون على الشركات المصنّعة للمنتجات الغذائية تحديد تواريخ انتهاء صلاحية
على منتجاتها، ولكن هناك ثغرة في القانون: فهي لا تشترط
تاريخ انتهاء الصلاحية بأي شكل معين. لذلك، يمكن كتابتها
السواحيلية وأن تكون قانونية
"نادين" هي ابنة العم "رالف نادر" الثالثة، وهي موظفة في مجال جودة الطعام تُعيّنها بنفسها. وعلمت أنّ العديد من الشركات المصنّعة للمنتجات الغذائية بدأت بترميزها وتواريخ انتهاء صلاحية المنتج لمنع العملاء من معرفة عمر الأشياء.
غير أن الترميز يسمح لبائعي البقالة بتحديد تواريخ انتهاء الصلاحية إذا أرادوا ذلك لسبب ما.
أحد أساليب الترميز الشائعة:
- ترميز الأشهر من يناير إلى ديسمبر بالتنسيق "A" إلى L
- ترميز كل رقم من التاريخ كـ "Q" حتى "ي"
- ترميز السنة كـ 'A' حتى "ي" مما يعني 1 إلى 26 وهو بعد ذلك تمت إضافته إلى عام 1995.
عثرت "نادين" على رغيف خبز مشكوك فيه على وجه التحديد في هذا التاريخ: ARZM. اكتب برنامجًا لتحديد التاريخ.
- هذا تشبيه رقمي لخدعة بطاقة شهيرة. اطلب من المستخدم إدخال عدد مكون من ثلاثة أرقام. فكر في الرقم على أنه ABC (حيث A وB وC هم الثلاثة هذا الرقم). أوجِد الآن باقي الأعداد التي تم تشكيلها من خلال ABC وBCA وCAB عند القسمة على 11. سنسمي الباقين X وY وY ي. أضِفها بالشكل التالي: X+Y وY+Z وZ+X. إذا كان أي من المجاميع فردية، قم بزيادة أو خفضه بمقدار 11 (أي عملية ينتج عنها رقم موجب أقل من 20 لاحظ إذا كان المجموع 9، فما عليك سوى الإبلاغ عن ذلك وإيقاف العملية). أَخِيرًا، نقسم كل مجموع إلى نصفين. الأرقام الناتجة هي A، B، C. كتابة وهو برنامج ينفِّذ هذه الخوارزمية.
في ما يلي، قم بفك النظام قبل كتابة البرنامج. استخدِم الدوال كلّما أمكن لإنشاء برامج منظّمة بشكل جيد.
التطبيق: تصور الموسيقى باستخدام الرسوم المتحركة
ينشئ مهندسو البرمجيات مجموعة متنوعة من التطبيقات المثيرة للاهتمام والمبتكرة في كثير من الأحيان. في كل وحدة من هذه الدورة، نقدم تطبيقًا مختلفًا يحتاج المهندسون وتنفيذه، لمساعدتك على فهم جميع المجالات المختلفة التي عمل المهندسين.
إليك واحدة مثيرة للاهتمام تم إنشاؤه لتصور الموسيقى.