دليل البدء

التعلم باستخدام المثال

واحدة من أفضل الطرق لتعلُّم كيفية البرمجة بلغة جديدة هي الاطّلاع على العديد من الأمثلة على البرامج. وأفضل ما يمكنك فعله هو نسخ كل برنامج أدناه ولصقه في ملف نصي وتجميعه. بعد ذلك، جرِّب التجارب. من خلال توسيع نماذج البرامج هذه، ستكتسب الإلمام بجوانب مختلفة من لغة 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 مرات على سطر لستة أسطر، وتتم طباعة كل منها في حقل يضم 17 مسافة. استخدِم التكرارات الحلقية للقيام بذلك. انقر هنا للتعرّف على مزيد من المعلومات حول تنسيق المخرجات باستخدام الاقتباس. انقر هنا للاطّلاع على الحل.
  • باستخدام البرنامج الذي أكملته للتو، تعرف على كيفية طباعة عبارة "Hello World!" بالمحاذاة إلى اليسار في الحقول التي تحتوي على 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;
}

تجربة:

  • عندما يحدث خطأ في الإدخال، "فواصل" البث، ويعرض cin القيمة "false" ويتوقف البرنامج. من المهم جدًا الاحتفاء من مثل هذه الأخطاء كما فعلنا في البرنامج أعلاه. لكن ماذا لو أردنا إصلاح الخطأ بدلاً من إيقاف البرنامج؟ هناك خطوتان لمعالجة خطأ:
    1. امسح الخطأ باستخدام cin.clear().
    2. إزالة الأحرف غير الصحيحة من مجموعة البث. إحدى الطرق للقيام بذلك هي باستخدام 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. اكتشاف كيفية إنشاء رقم عشوائي ضمن نطاق معين من القيم.
  2. أنشئ دالة رئيسية تعالج تخمينًا واحدًا من المشغّل وتقدّم التلميحات.
  3. أضِف المطلوب السماح بعدة تخمينات حتى يخمن اللاعب الرقم.

تسمى عملية التطوير هذه التحليل، أي تقسيم المهمة إلى مهام فرعية، يسهل تنفيذ كل منها.

ابدأ بالخطوة 1، لإجراء بحث على Google لمعرفة كيفية إنشاء رقم عشوائي باستخدام لغة C++. جرِّب البحث باستخدام "rand C++". إليك الحل. 

بالنسبة للخطوة الثانية، يجب تلقي إدخال عدد صحيح من المشغل (مع التحقق المناسب من الخطأ على cin)، ثم التحقق منه مقابل الرقم السرّي. جرِّب كتابة هذا الجزء من اللعبة بنفسك قبل التحقق من الحل.

أخيرًا، نحتاج إلى إضافة حلقة تستمر في جمع التخمينات من اللاعب حتى يخمن الرقم السرّي أخيرًا. بعد الانتهاء من هذا الجزء من البرنامج، يمكنك الاطّلاع على الحلّ الذي نقدّمه.

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

  • توفر العديد من المهام اليومية فرصًا لبناء المهارات في التحلل. قد يفاجئك اكتشاف أنّ عقلك يعمل بهذه الطريقة.

    على سبيل المثال، إذا اضطررت إلى تنظيف مطبخ فوضوي (ربما بعض الفتيات الصغيرات خبزن كعكة)، أقسّم المهام لتقديم خطة، وللتأكد من عدم حاجتي إلى إعادة إنجاز العمل لاحقًا. لا أريد أن أغسيل الأرضية أولاً إذا كانت هناك جميع أنواع الأشياء على الطاولات لتنظيفها، فربما أضطر لتنظيف الأرضية مرة أخرى لاحقًا. إذًا، أترك كل المكوّنات أولاً ونقلها إلى الحوض وتنظيف الطاولات وغسل الأطباق وأخيرًا تنظيف الأرض. هناك طرق أخرى لتنفيذ هذه المهمة، ولكن من خلال التفكير فيها أولاً، يساعدني ذلك في تحديد خطة لا تتطلّب إعادة عمل.

    استخدم المهام اليومية كأمثلة لتطوير مهارات التحليل. ومن يدري، فقد يجعلك ذلك أكثر كفاءة في المنزل!

  • القاسم المشترك الأكبر لعددين صحيحَين هو أكبر عدد يقسمهما معًا. على سبيل المثال، 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 دولارًا لكل زوج من الأحذية. منحك رئيسك في العمل ثلاثة خيارات للتعويض، عليك اختيارها قبل بدء العمل في اليوم الأول:

  1. راتب مستقيم قدره 600 دولار في الأسبوع؛
  2. راتب 7.00 دولارات لكل ساعة بالإضافة إلى عمولة بنسبة 10٪ على المبيعات؛
  3. بدون راتب، ولكن بنسبة% 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. لحفظ الملف في ملف، نُعلن عن ofstream ونفتحه باستخدام وضع "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++ الأساسية، إلا أنّنا لا نقدّم حلولاً لهذه التمارين والمشاريع لأننا نريد منك العمل مع طلاب آخرين في هذه الدورة.

  1. يهتز المجال المشترك للكريكيت بما يتناسب بشكل مباشر مع درجة الحرارة الحالية. من خلال إضافة 40 إلى عدد الوقت الذي يصدر فيه ضربة كريكيت في دقيقة واحدة، تصبح درجة الحرارة ناتجًا عن قسمة هذه القيمة على 4. اكتب برنامجًا يأخذ كإدخال عدد الاهتزازات في دقيقة ويطبع درجة الحرارة الحالية. على سبيل المثال،
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. اكتب برنامجًا يحسب الدرجة النهائية لدورة برمجة تحضرها. في ما يلي مخطط وضع الدرجات:
    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
  3. بما أنّ ساعات الإيقاف الإلكترونية أصبحت أقل تكلفة وأكثر دقة، لا عجب في ذلك، بقياسات زمنية لا يمكن الخلط بينها. اكتب برنامجًا يتم فيه إدخال فترة زمنية محدّدة بالثواني، ويعرض عدد الساعات والدقائق والثواني التي يمثّلها. مثلاً:
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. في ما يلي، عليك إجراء التحليل قبل كتابة البرنامج. استخدِم الدوال كلما أمكن ذلك لإنشاء برامج منظّمة بشكل جيد.

  5. لنفترض أننا أردنا طباعة بانر لما يلي:

    "فريزري بريزي يتجمد ثلاث أشجار"

    نريد أن تكون الأحرف كبيرة جدًا لأن هذا بانر:

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    
    وما إلى ذلك.

    كونك أداة تحليل جيدة للمشاكل، لاحظت على الأرجح أنّه بدلاً من وضع جميع القيم الرئيسية في الوظيفة الرئيسية، سيكون من الأكثر فعالية إدراجها في الدوال. إذًا، يمكننا استخدام دالة printE ودالة "printZ" وما إلى ذلك.

    اكتب برنامجًا يتضمّن دوال تنشئ بانر لكلمة أو عبارة تحتوي على الكثير من الأحرف المتكررة. بعض الاحتمالات:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. إليك مشكلة "الرقم السحري": اطلب من المستخدم إدخال رقم مكوّن من ثلاثة أرقام يكون رقمه الأول أكبر من آخر رقم. سيعكس برنامجك الرقم ويطرحه العكس من الرقم الأصلي. وأخيرًا، اعكس الرقم الناتج وأضِفه إلى شكله المعكوس. أخرج النتيجة النهائية. يجب أن يكون الرقم الأصلي الذي يدخله المستخدم من نوع عدد صحيح (وليس ثلاثة أحرف). فكِّر في طريقة كتابة دالة تأخذ عددًا صحيحًا كمدخل وتعرض عكس هذا الرقم. مثال:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. يشترط القانون على الشركات المصنّعة للمنتجات الغذائية تحديد تواريخ انتهاء صلاحية منتجاتها، ولكن هناك ثغرة في القانون، فلا يشترط أن يكون تاريخ انتهاء الصلاحية بأي شكل معيّن. لذلك، يمكن كتابتها باللغة السواحيلية ولا تزال قانونية.

    "نادين"، وهي ابنة رالف نادر الثالثة، هي تعمل كموظفة مراقبة جودة الطعام. وعلمت أنّ العديد من الشركات المصنّعة للمنتجات الغذائية بدأوا في ترميز تواريخ انتهاء صلاحية المنتج لمنع العملاء من معرفة عمر المنتجات.

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

    إحدى طرق الترميز الشائعة:

    • ترميز الأشهر من يناير إلى ديسمبر كـ "A" إلى "L"
    • ترميز كل رقم من أرقام التاريخ من "Q" إلى "Z"
    • ترميز السنة بالتنسيق "A" إلى "Z" يعني 1 إلى 26، ثم تتم إضافتها إلى 1995.

    وجدت "نادين" رغيف خبز مثيرًا للشك بشكل خاص بهذا التاريخ: ARZM. اكتب برنامجًا لتحديد التاريخ.

  8. هذا تشبيه رقمي بخدعة بطاقات شهيرة. اطلب من المستخدم إدخال رقم مكوَّن من ثلاثة أرقام. يتم اعتبار الرقم على أنّه ABC (حيث إنّ A وB وC هما الأرقام الثلاثة للرقم). اعثر الآن على باقي الأعداد التي تكونت بواسطة ABC وBCA وCAB عند قسمتها على 11. وسنطلق على الباقي أسماء X وY وZ. قم بإضافتها على النحو التالي X+Y، Y+Z، Z+X. إذا كان أي من المجاميع عددًا فرديًا، يمكنك زيادة هذا المجاميع أو خفضه بمقدار 11 (أيًا كانت العملية التي تؤدي إلى رقم موجب أقل من 20، ويُرجى العلم أنّه إذا كان المجموع 9، ما عليك سوى الإبلاغ عن ذلك وإيقاف العملية). وأخيرًا، اقسِم كل مبلغ من المجاميع إلى نصفين. الأرقام الناتجة هي A وB وC. اكتب برنامجًا ينفّذ هذه الخوارزمية.

التطبيق: عرض الموسيقى باستخدام الصور المتحركة

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

إليك تطبيق شيّق تم تصميمه لعرض المحتوى الموسيقي.