مجموعة المسائل 1
ادرس البرنامج التالي ثم أجب عن الأسئلة التالية. نود أن تجيب عن الأسئلة من خلال إلقاء نظرة على رمز المصدر فقط، أي، يرجى عدم نسخه في ملف، وتجميعه والإجابة عن الأسئلة بناءً على تشغيله. وسيقضي ذلك على هذا الأمر كل المتعة!
int main() { int counter, first, last, next; first = 1; last = 2; for (counter = first; counter <= last; counter++) { cout << "\n " << counter; next = counter * counter; cout << " " << next; } counter = first; while (counter <= last) { cout << "\n " << counter; next = counter * counter; cout << " " << next; counter++; } counter = first; do { cout << "\n " << counter; next = counter * counter; cout << " " << next; counter++; } while (counter < last); }
السؤال 1: ما هو مُخرج هذا البرنامج؟
أ) |
1 2 2 4 1 2 2 4 1 2 2 4 |
ب) |
1 1 2 4 1 1 2 4 1 1 2 4 |
ج) |
1 1 2 4 1 1 2 4 1 1 |
د. |
1 1 2 4 1 1 1 1 2 4 |
هـ) | وهي لا تؤدي إلى أي نتيجة - هناك أخطاء في البنية. |
السؤال 2: ماذا سيحدث إذا أزلنا إعداد "counter" قبل التكرار الحلقي do- while؟
أ) | التكرار اللانهائي - ينتج عن التكرار اللانهائي سلسلة من التكرارات 1 |
ب) | لن تتغيّر نتيجة البرنامج |
ج) | تُخرج التكرار الحلقي (do- while) 2 و4. |
د. | لن ينتج عن التكرار الحلقي do- while أي شيء |
هـ) | تُنتج التكرار الحلقي (do- while) 3 و9 (9). |
السؤال 3: في ضوء البرنامج الأصلي الموجود أعلى هذه الصفحة، لنفترض أن لدينا إزالة السطر الذي يقوم بإعداد متغير العدّاد قبل حلقة التكرار while. المزايا إذا أزلنا أيضًا سطر counter++ داخل while-loop، كما في ما يلي؟
أ) | لا ينتج عن التكرار الحلقي while أي شيء. |
ب) | تُخرج التكرار الحلقي while 1 و1؛ لا ينتج عن التكرار الحلقي do- while أي شيء. |
ج) | ناتج التكرار الحلقي while هو نفسه عندما يكون كلا الخطين . |
د. | سيُخرج النظام أرقامًا عشوائية إلى أن يتم تحويل جهاز الكمبيوتر. |
هـ) | التكرار الحلقي while هو تكرار لا نهائي |
السؤال 4: ماذا سيحدث بالنظر إلى البرنامج الأصلي في أعلى هذه الصفحة إذا بدا التكرار الحلقي while على هذا النحو؟
counter = first; while (counter <= last) { cout << "\n" << counter; if (first % 2 == 0) next = counter * counter; cout << " " << next; counter++; }
أ) | ناتج التكرار الحلقي while هو نفسه المُخرج في البرنامج الأصلي. |
ب) | لن يؤدي التكرار الحلقي while إلى إخراج أي شيء |
ج) | ناتج التكرار الحلقي while هو 1 1 و1 4. |
د. | ناتج التكرار الحلقي while هو 1 2 و2 4. |
هـ) | ناتج التكرار الحلقي while هو 1 4 و2 4. |
و. | ناتج التكرار الحلقي while هو 2 4 و2 4. |
السؤال 5: ماذا يحدث إذا كان المتغير الأول أكبر من الآخر؟
أ) | ستنتج التكرار while-loop شيئًا، ولكن لا شيء آخر سيخرجه. |
ب) | سيؤدي استخدام الدالة while-loop إلى إخراج شيء ما، لكن لا شيء آخر سيخرجه. |
ج) | لن تكون هناك أي نتائج على الإطلاق. |
د. | سيُظهر البرنامج خطأ أو تعطُّل |
هـ) | ستنتج التكرار for-loop شيئًا، ولكن لا شيء آخر سيحدث. |
السؤال 6: ما ناتج البرنامج إذا قمنا بتهيئة المتغير الأول هو نفسه المتغير الأخير؟
أ) | سيؤدي استخدام الدالة while-loop إلى إخراج شيء ما، لكن لا شيء آخر سيخرجه. |
ب) | ستنتج التكرار while-loop شيئًا، ولكن لا شيء آخر سيخرجه. |
ج) | ينتج عن كل تكرار حل سطر واحد. |
د. | سينتج عن التكرار الحلقي while-a خطين والتكرار الحلقي سطرًا واحدًا. |
هـ) | لن يؤدي ذلك إلى إخراج أي شيء |
و. | ستنتج التكرار for-loop شيئًا، ولكن لا شيء آخر سيحدث. |
مجموعة المسائل 2
وكما في مجموعة المسائل السابقة، إليك برنامج للنظر فيه. يُرجى الإجابة عن الأسئلة اللاحقة من خلال مراجعة رمز المصدر فقط.
#include <iostream> using namespace std; int main() { int Boys = 3, Girls = 5; void F1(int males, int females); void F2(int &m, int &f); F1(Boys, Girls); cout << "\nAfter calling F1, within main()"; cout << "\n\tBoys = " << Boys; // #2 cout << "\n\tGirls = " << Girls; F2(Boys, Girls); cout << "\nAfter calling F2, within main()"; cout << "\n\tBoys = " << Boys; // #4 cout << "\n\tGirls = " << Girls; } void F1(int b, int g) { b += 3, g += 4; cout << "\nF1"; cout << "\n\tBoys = " << b; // #1 cout << "\n\tGirls = " << g; } void F2(int &b, int &g) { b = b + 8, g = g + 5; cout << "\nF2"; cout << "\n\tBoys = " << b; // #3 cout << "\n\tGirls = " << g; }
السؤال 1: ما هو مُخرج متغير الأولاد على الأسطر المميّزة؟
أ) |
رقم 1: 6 رقم 2: 3 رقم 3: 11 رقم 4: 11 |
ب) |
رقم 1: 6 رقم 2: 3 رقم 3: 11 رقم 4: 3 |
ج) |
رقم 1: 6 رقم 2: 6 رقم 3: 11 رقم 4: 11 |
د. | وهي تنتج أي شيء لأنه لا يتم تجميعها أو تشغيلها. |
السؤال 2: يُرجى اختيار كل ما ينطبق على السطور التالية من البرنامج:
void F1(int males, int females); void F2(int &m, int &f);
أ) | وتنص قواعد C++ على أنه يمكننا إزالة هذين السطرين طالما يتم تحديد الطرق قبل الاستخدام. |
ب) | تنص قواعد C++ على أن أسماء الوسيطات يجب أن تكون متطابقة بين التعريف والتعريف. |
ج) | سيتوقف هذا البرنامج إذا أزلنا هذين السطرين. |
د. | من الشائع أن يتم ذكر التصريحات في الكلمات الرئيسية النطاق. |
هـ) | وتسمى هذه نماذج البيانات التي تتم إعادة توجيهها. |
السؤال 3: إذا نقلنا السطر التالي من main() ووضعناه في المعامل النطاق، فماذا سيحدث؟
int Boys = 3, Girls = 5;
أ) | سيكون الناتج هو ذاته. |
ب) | سيكون للأولاد 3 = والفتيات = 5 في الناتج |
ج) | سيكون للأولاد = 3 وGirls = 5 فقط في الإخراج من main() |
السؤال 4: ماذا لو غيّرنا بداية البرنامج لتبدو على النحو التالي:
// We have moved moved these to global scope const int Boys = 3; const int Girls = 5; void main() { //int Boys = 3, Girls = 5;
أ) | يتم تجميع البرنامج ولكنه سيعطل عندما نحاول تشغيله. |
ب) | لن تكون هناك تغييرات في الناتج |
ج) | سيكون الناتج أولاد = 3 فتيات = 5 في جميع مراحل البرنامج |
د. | سيكون الناتج "أولاد" = 3 فتيات = 5 فقط في الإخراج من()Main |
هـ) | من المحتمل ألا يتم تجميع البرنامج (اعتمادًا على برنامج التجميع). |
السؤال 5: يتم تمرير البيانات حسب القيمة في F2.
أ) | صحيح |
ب) | خطأ |
مجموعة المسائل 3
وكما في مجموعة المسائل السابقة، إليك برنامج للنظر فيه. من فضلك والإجابة عن الأسئلة التالية بإلقاء نظرة على رمز المصدر فقط.هذا هو أكثر تشويقًا من الاثنين السابقين - تتبع التعليمات البرمجية بعناية.
#include <iostream> using namespace std; const int MAX_SIZE = 20; typedef int ARR2D[MAX_SIZE][MAX_SIZE]; void Print(ARR2D in_array, int rows, int cols); void Fill(ARR2D in_array, int rows, int cols); int main() { ARR2D matrix; int row, col; do { cout << "Please enter the size of the matrix to generate (rows and cols) :" << endl; cin >> row >> col; } while (row <= 0 || row > MAX_SIZE || col <= 0 || col > MAX_SIZE); Fill(matrix, row, col); Print(matrix, row, col); return(0); } void Print(ARR2D in_array, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) cout << '\t' << in_array[i][j]; cout << endl; } } void Fill(ARR2D in_array, int rows, int cols) { for(int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) in_array[i][j] = 0; const int limit = rows * cols; int cNum = 1; int cRow = 0; int cCol = 0; int cDir = 0; // 0-north, 1-east, 2-south, 3-west while(true) { // Place the number. in_array[cRow][cCol] = cNum; cNum++; if (cNum > limit) break; int fRow = cRow; int fCol = cCol; while (true) { fRow = cRow; fCol = cCol; switch(cDir) { case 0: fRow--; break; case 1: fCol++; break; case 2: fRow++; break; case 3: fCol--; break; } if ( fRow >= 0 && fRow < rows && fCol >= 0 && fCol < cols && in_array[fRow][fCol] == 0) break; cDir = (cDir + 1) % 4; } cRow = fRow; cCol = fCol; } }
السؤال 1: ماذا ينتج عن هذا البرنامج مع إدخال 3 للصفوف و4 والأعمدة؟
أ) |
1 2 3 4 5 6 7 8 9 10 11 12 |
ب) |
1 2 3 4 5 6 7 8 9 10 11 12 |
ج) |
12 11 10 9 8 7 6 5 4 3 2 1 |
د. |
1 3 2 4 8 6 7 5 9 11 10 12 |
هـ) |
1 2 3 4 10 11 12 5 9 8 7 6 |
ز) |
9 8 7 6 10 11 12 5 1 2 3 4 |
ح) | هذا لا يؤدي إلى إخراج أي شيء - المنطق خاطئ. |
ط) | لا يؤدي ذلك إلى إخراج أي شيء - حيث توجد أخطاء في البنية. |
J) | وهي لا تؤدي إلى أي شيء، وليس من المفترض أن تؤديها. |
ك) | تُخرج أول 12 رقمًا يتبادر إلى الذهن أثناء انتظار تشغيل البرنامج. |
السؤال 2: ماذا لو أضفنا السطر التالي إلى الدالة main()؟
MAX_SIZE = 10;
أ) | غير مسموح بهذا في لغة C++. |
ب) | يُسمح بذلك. سيتم تشغيل البرنامج مع ضبط MAX_size على 20 |
ج) | يُسمح بذلك. سيتم تشغيل البرنامج مع ضبط MAX_size على 10. |
السؤال 3: بالنظر إلى الأسطر الأربعة التالية من البرنامج أعلاه:
const int MAX_SIZE = 20; typedef int ARR2D [MAX_SIZE][MAX_SIZE]; void Print (ARR2D A, int rows, int cols); void Fill (ARR2D A, int rows, int cols);
1) هل من الممكن استخدام ثابت في تعريف الكتابة؟
2) هل من الممكن استخدام تعريف الكتابة في إعلان قبل تعريف متغير من هذا النوع؟
أ) | 1) نعم 2) نعم |
ب) | 1) لا 2) لا |
ج) | 1) لا 2) نعم |
د. | 1) نعم 2) لا |
السؤال 4: هل يمكننا استخدام ما يلي:
#define MAX_SIZE 20
const int MAX_SIZE = 20;
أ) | نعم، سيعمل ومن المقبول استخدام #define للثوابت في ملفات المصدر C++ |
ب) | نعم، سيعمل ولكن لا يتم عادةً استخدام #define للثوابت في لغة C++ |
ج) | #define غير متاح في لغة C++ |
د. | لا يمكنك تنفيذ أي من هذه الإجراءات باستخدام لغة C. |
السؤال 5: يُستخدم تعريف الكتابة لإنشاء اسم مستعار لاسم نوع.
أ) | صحيح |
ب) | خطأ |
السؤال 6: ماذا يحدث إذا لم نقم بإعداد الصفيفة على 0 في fill()؟
أ) | سيتم تشغيله ولكن النتائج ستكون جميع قيم الاثني عشر |
ب) | سيعمل بشكل جيد وينشئ نفس الإخراج كما لو كانت الصفيفة تم الإعداد على 0 |
ج) | لن يتم تشغيل البرنامج أو سيتعطّل |
د. | سيتم تنفيذ العملية، ولكن ستكون النتيجة قيم 0. |
هـ) | سيتم تشغيله ولكن قد لا يؤدي إلى إنشاء أي نتائج. |
السؤال 7: اختر كل ما ينطبق. لماذا نستخدم ثابتًا لحساب MAX_size في هذا البرنامج؟ أليس من الأسهل كتابة "20" بدلاً من MAX_size أينما كان احتاجت؟
أ) | MAX_TIME هو قيمة مدمجة في C++ يمكن لأي شخص استخدامها. تم الضبط للتو واستخدامها. |
ب) | يجب تجنُّب التغييرات العامة تمامًا مثل المتغيرات العمومية |
ج) | يؤدي استخدام Console إلى تسهيل فهم برنامجنا |
د. | عادةً ما تعتبر الأرقام السحرية في البرنامج ممارسة جيدة. |
هـ) | إذا أردنا تغيير MAX_حجم، فلن نحتاج سوى إلى تغييرها في واحدة الْمَكَانْ |
السؤال 8: يجب أن تحتوي عبارة Switch في الدالة fill() على قيمة لهذه الحالة، لأنه يُعد أسلوبًا جيدًا لتضمين واحدة.
أ) | صحيح |
ب) | خطأ |
السؤال 9: لاحظ في الدالة fill()، نُعلن عن المتغيرات بين العبارات. على سبيل المثال، يتم تعريف cNum وcRow وتهيئتها بعد تشغيل التكرار الحلقي. هل سيعمل هذا في C++، أم يجب تعريف جميع المتغيرات أعلى الدالة؟
أ) | لا بأس من إجراء ذلك. |
ب) | يجب الإعلان عن جميع المتغيرات في أعلى الدالة. |
ج) | كلتا الطريقتين خاطئتان - لا يسمح C++ بالمتغيرات في أي مكان في البرنامج. |
د. | يجب الإعلان عن جميع المتغيرات في النطاق العمومي. |
مجموعة المسائل 4
فيما يلي مجموعة من الملفات التي تحدد فئة بسيطة وتختبرها. وكالعادة، يمكنك الإجابة عن الأسئلة اللاحقة بالرجوع إلى رمز المصدر فقط.
في ما يلي ملف العنوان (cow.h):
#ifndef COW_H #define COW_H using namespace std; typedef enum Color {black, brown, beige, blackandwhite, nocolor}; class Cow { public: Cow(); ~Cow(); // accessors double weight() { return weight_; }; string name() { return name_; }; Color color() { return color_; }; // mutators void set_name(string inName) { name_ = inName; }; void set_color(Color inColor) { color_ = inColor; }; void set_weight(double inWeight) {weight_ = inWeight; }; void Moo(); void Properties(); private: Color color_; double weight_; string name_; }; #endif
في ما يلي ملف .cc المرتبط (cow.cc):
#include <iostream> #include "cow.h" using namespace std; Cow::Cow() {} Cow::~Cow() {} void Cow::Moo() { cout << name() << " says MOO." << endl; } void Cow::Properties() { cout << name() << " weighs " << weight() << ", is " << color() << " and says MOO." << endl; }
وإليك برنامج عميل لهذا الفصل (cowmain.cc):
#include <iostream> #include "cow.h" using namespace std; int main() { Cow cow1; cow1.set_name("betsy"); cow1.set_weight(400.0); cow1.set_color(black); cow1.Moo(); cow1.Properties(); }
السؤال 1: ماذا يُخرج هذا البرنامج؟
أ) | تقول بيتسي MOO. يبلغ وزن بيتسي 400، وهو 0 ويقول MOO. |
ب) | تقول بيتسي MOO. يبلغ وزن بيتسي 400 شخص، وهو أسود ويقول MOO. |
ج) | تقول بيتسي MOO. بيتسي يزن 400، |
السؤال 2: يجب ألا نضع أبدًا رمز لطريقتي الموصّل والمبدل في ملف عنوان. (لاحظ أن الموصّل هو طريقة تُرجع قيمة، والمتغير طريقة تعدِّل قيمة).
أ) | صحيح |
ب) | خطأ |
السؤال 3: هل نحتاج إلى "البقر::" قبل كل تعريف من تعريفات الدوال في cow.cc؟
أ) | لا، بما أنّ سمة cow.h مضمَّنة |
ب) | نعم |
السؤال 4: ما الدور الذي يؤديه:
#ifndef COW_H #define COW_H ... #endif
تشغيله في ملف العنوان؟
يُرجى اختيار كل ما ينطبق:
أ) | وليس لها أي أغراض لأن اسم الملف هو cow.h وليس COW_H. |
ب) | وفي حال عدم تنفيذ هذا الإجراء، سيظهر خطأ في بيئة التشغيل |
ج) | فإذا لم نفعل ذلك، فقد نضمّن الملف أكثر من مرة |
د. | وهي لا تتخذ أي إجراء لأنّ هناك خطأ إملائيًا في كلمة رئيسية واحدة أو أكثر. |
هـ) | لم يفعل أي شيء لأن فئة Cow تحتوي على ملف عنوان واحد فقط. |
السؤال 5: ماذا سيحدث إذا أضفنا السطر التالي إلى cowmain.cc؟
cow1.weight_ = 24;
أ) | سيتم تشغيل البرنامج وتعديل متغير الوزن بجانب هذا الخط. |
ب) | يتم تجميع البرنامج وتشغيله، ولكنه يتعطل في هذا السطر. |
ج) | وهذا لا يسمح به C++. |
د. | سيجمع البرنامج ويشغِّله، لكن متغير الوزن ليس تم التغيير بواسطة هذا الخط. |
السؤال 6: عند تنفيذ السطر التالي، يتم استدعاء الدالة الإنشائية في فئة Cow:
Cow cow1;
ما هي بعض الخصائص المهمة للدوال الإنشائية؟
يُرجى اختيار كل ما ينطبق.
أ) | عادةً لا تُرجع أي قيم |
ب) | إذا لم نوفر دالة إنشائية في فئتنا، فإن الفئة ستكون غير مجمّع |
ج) | الدالة الإنشائية في فئة Cow غير نموذجية لأنها لا تقوم بتهيئة المتغيرات الخاصة. |
د. | تحمل دائمًا نفس اسم الفئة |
هـ) | يمكن أن يكون لدينا العديد من الدوال الإنشائية في فئة ما طالما أن الوسيطات مختلفة |
و. | يتم استدعاء الدالة الإنشائية عند استرداد فئة. |
السؤال 7: ما هي بعض الخصائص المهمة للمكوّن التالف؟
أ) | يتم استدعاء الدالة الإخلالية عندما يخرج كائن خارج النطاق |
ب) | تحمل الدالة الدالّة نفس اسم الفئة ولكنها مسبوقة بـ "~". |
ج) | يوجد خطأ ما في الدالة الدالّة في cow.cc تتمثل في لا يفعل أي شيء. |
د. | إذا لم ننشئ دالة تلف بفئتنا، فلن يكون لهذه الفئة تجميع |
السؤال 8: بناءً على الطريقة التي يستخدم بها برنامج العميل الفئة، ضع في الاعتبار التالي:
تقسيم الأعضاء إلى عام وخاص في فصل البقر ليس مناسبًا. بمعنى أنه يجب أن يكون الشيء الخاص عامًا أو شيئًا عامًا يجب أن يكون خاصًا.
أ) | صحيح |
ب) | خطأ |
السؤال 9: ماذا لو أضفنا دالة إنشائية أخرى بالإضافة إلى الدالة التي علينا أن cow.cc. تبدو الدالة الإنشائية الجديدة على هذا النحو
Cow::Cow(string inName, double inWeight, Color inColor) { set_name(inName); set_weight(inWeight); set_color(inColor); }
ونضيف الأسطر التالية إلى main():
Cow cow2("milly", 350.2, brown); cow2.Moo(); cow2.Properties();
هل هذا ممكن؟
يُرجى اختيار كل ما ينطبق.
أ) | سيتعطل الخط في main() حيث نقوم بتهيئة cow2. |
ب) | يمكننا أن يكون لدينا دالة إنشائية واحدة فقط. |
ج) | هذا شائع في C++ |
د. | نعم، ولكن هذا ليس استخدامًا عاديًا لـ C++ |
هـ) | سيتم تشغيل هذا بشكل جيد، لكن لن يؤدي إلى إخراج أي شيء لأن لم يتم إعداد خاصة. |
و. | لا يمكننا استدعاء setName() وsetColor() وsetweight() من داخل طريقة من نفس الفئة. |
أسئلة إضافية
السؤال 1) ما هو مُخرج ما يلي؟
#include <iostream> using namespace std; void HelpMe(int *p, int *num, int *q); void WhereAmI(int *p, int *q, int a); void HelpMe(int *p, int *num, int *q) { int a; a = 2; q = &a; *p = *q + *num; num = p; } void WhereAmI(int *p, int *q, int a) { a = 6; *p = a + *p; *q = a + 3; HelpMe(q, &a, p); } int main() { int *p; int q; int *num; int a; a = 3; q = 5; p = &a; num = &q; HelpMe(&a, p, num); WhereAmI(&q, p, *num); cout << "*p = " << *p << " q = " << q << " *num = " << *num << endl; }
السؤال 2) ضع في الاعتبار العبارة التالية، بافتراض وجود فئة Apple وقد تم إعدادها. تحتوي فئة Apple على متغير color_ المثيل:
Apple* granny_smith = new Apple;
يُرجى اختيار جميع العبارات التالية صحيحة:
أ) | Apple* granny_smith = NULL; if (granny_smith == NULL)... هذا غير مقبول - NULL ليست قيمة يمكن التحقق منها بهذه الطريقة. |
ب) | Apple* granny_smith, fuji; يؤدي هذا إلى تعريف مؤشرَين لكائنات Apple |
ج) | يحتوي المتغير granny_smith على قيم متغير المثيل المرتبطة بكائن Apple |
د. | Apple* granny_smith = NULL; لا بأس، |
هـ) | يحتوي المتغير granny_smith على عنوان كائن Apple. |
و. | string gs_color = *(granny_smith.get_color()); تعرض هذه العبارة لون الكائن granny_smith، بافتراض أنه قد تم إعداده. |
ز) | يتم تخصيص مساحة التخزين للعنصر Apple الجديد في الذاكرة |
ح) | يتم تخصيص مساحة التخزين لعنصر Apple الجديد في حزمة بيئة التشغيل |
ط) | int* a = &b; يضع هذا عنوان b في a. |
السؤال 3) ما هو مُخرج البرنامج التالي؟
#include <iostream> using namespace std; const int kNumVeggies = 4; void Grill(int squash, int *mushroom); int Saute(int onions[], int celery); void Grill(int squash, int *mushroom) { *mushroom = squash/4; cout << *mushroom + squash << endl; } int Saute(int onions[], int celery) { celery *= 2; onions[celery]++; Grill(onions[0], &onions[3]); cout << celery << " " << onions[3] << endl; return celery; } int main() { int broccoli, peppers[kNumVeggies], *zucchini; for (broccoli = 0; broccoli < kNumVeggies; broccoli++) peppers[broccoli] = kNumVeggies - broccoli; zucchini = &peppers[Saute(peppers,1)]; Grill(*zucchini, zucchini); zucchini--; cout << peppers[3] + *zucchini + *(zucchini + 1) << endl; }
إجابات الاختبار
يجب أن تحاول إكمال جميع الأسئلة أعلاه دون النظر إلى الإجابات. من الأفضل أن تطلب المساعدة من شخص ما بدلاً من الانتقال مباشرةً إلى ورقة الإجابة للحصول على المساعدة.
يمكنك الاطّلاع على إجابات للمسائل أعلاه هنا.