المستوى:
حديث التخرج
عدد الأسئلة:
١٢ سؤالاً
الزمن:
٦ دقائق

أسئلة اختبار وظيفة مبرمج حاسب آلي مع الإجابة

أسئلة تُطرح فعلاً في مقابلات وظيفة مبرمج حاسب آلي لحديثي التخرج: أساسيات البرمجة، والخوارزميات، وهياكل البيانات، والبرمجة كائنية التوجه، وقواعد البيانات وSQL، وتصحيح الأخطاء وGit. في آخرها تقرير بنقاط ضعفك.

المهارات: أساسيات البرمجة والمنطق، البرمجة كائنية التوجه، هياكل البيانات، الخوارزميات وحل المشكلات، تصحيح الأخطاء والاختبار وGit، قواعد البيانات وSQL

تعليمات: لكل سؤال إجابة صحيحة واحدة. إن لم تعرف الإجابة فاختر «لا أعرف»، وسيدلّك التقرير على ما تراجعه.

السؤال الأول: ما قيمة المتغير x بعد تنفيذ شيفرة Java التالية؟ int a = 7; int b = 2; double x = a / b;

اختر إجابتك لتبدأ الاختبار

كل الأسئلة مع الإجابات (١٢ سؤالاً)

جرّب المقابلة أولاً، ثم افتح الإجابات لتراجعها مع الشرح.
  1. ١. ما قيمة المتغير x بعد تنفيذ شيفرة Java التالية؟ int a = 7; int b = 2; double x = a / b;

    • خطأ عند الترجمة لأن الناتج ليس عدداً صحيحاً
    • 3.5
    • 3.0
    • 4.0

    الشرح: لأن a وb من النوع int تُنفَّذ القسمة الصحيحة أولاً فيكون الناتج 3، ثم يُحوَّل إلى double فيصبح 3.0. يتوقع كثيرون 3.5 لظنهم أن نوع المتغير المستقبِل هو الذي يحدد نوع العملية.

  2. ٢. ماذا تطبع شيفرة Java التالية؟ int i = 0; if (i != 0 && 10 / i > 1) { System.out.println("A"); } else { System.out.println("B"); }

    • تطبع A
    • خطأ عند الترجمة
    • ترمي ArithmeticException بسبب القسمة على صفر
    • تطبع B

    الشرح: المعامل && يعتمد التقييم المختصر (short-circuit evaluation)، فما دام الشرط الأول i != 0 خاطئاً لا يُقيَّم الجزء الثاني ولا تحدث القسمة على صفر. يتوقع بعضهم الاستثناء لظنهم أن طرفي الشرط يُقيَّمان دائماً.

  3. ٣. ما الفرق الصحيح بين method overloading وmethod overriding؟

    • overloading إعادة تعريف دالة موروثة في الصنف الفرعي، وoverriding دوال بالاسم نفسه ومعاملات مختلفة في الصنف نفسه
    • overloading دوال بالاسم نفسه ومعاملات مختلفة، وoverriding إعادة تعريف دالة موروثة بالتوقيع نفسه
    • overloading يعني تغيير نوع القيمة المعادة فقط، وoverriding يعني تغيير أسماء المعاملات فقط مع بقاء أنواعها
    • لا فرق جوهرياً بينهما، فكلاهما يعني تعريف أكثر من دالة بالاسم نفسه داخل الصنف الواحد

    الشرح: في overloading تتعدد الدوال بالاسم نفسه مع اختلاف عدد المعاملات أو أنواعها ويُحسم الاختيار وقت الترجمة، أما في overriding فيعيد الصنف الفرعي تعريف دالة ورثها بالتوقيع نفسه ويُحسم الاختيار وقت التشغيل. يخلط المبتدئون بينهما لتشابه الاسمين، ويظن بعضهم أن تغيير نوع القيمة المعادة وحده يكفي لـ overloading.

  4. ٤. ماذا يطبع السطران الأخيران من شيفرة Java التالية عند تنفيذهما داخل الدالة main؟ class Animal { String sound() { return "Some sound"; } } class Dog extends Animal { String sound() { return "Woof"; } } Animal a = new Dog(); System.out.println(a.sound());

    • Woof
    • Some sound
    • ClassCastException وقت التشغيل
    • خطأ عند الترجمة لأن نوع a هو Animal

    الشرح: هذا هو تعدد الأشكال (polymorphism): تُحدَّد الدالة المنفَّذة وقت التشغيل حسب نوع الكائن الفعلي Dog، لا حسب نوع المرجع Animal. يختار كثيرون Some sound لأنهم يخلطون بين نوع المتغير ونوع الكائن الذي يشير إليه.

  5. ٥. تريد تنفيذ ميزة التراجع (Undo) في محرر نصوص، بحيث يُلغى آخر تعديل أولاً ثم الذي قبله وهكذا. ما هيكل البيانات الأنسب لحفظ التعديلات؟

    • Hash Table
    • Stack
    • Binary Search Tree
    • Queue

    الشرح: يعمل Stack بمبدأ LIFO (آخر ما يدخل أول ما يخرج)، وهذا يطابق التراجع عن أحدث تعديل أولاً. يختار بعضهم Queue وهي تعمل بمبدأ FIFO فتُخرج أقدم تعديل لا أحدثه.

  6. ٦. ما التعقيد الزمني، في أسوأ الحالات، للوصول إلى عنصر بفهرسه i في singly linked list تحتوي على n عنصراً؟

    • O(n log n)
    • O(n)
    • O(log n)
    • O(1)

    الشرح: القائمة المترابطة لا تتيح الوصول المباشر بالفهرس، فلا بد من المرور على العقد واحدة تلو الأخرى من البداية، وهذا O(n) في أسوأ الحالات. يجيب كثيرون O(1) لأنهم يقيسونها على المصفوفة التي يُحسب فيها عنوان العنصر مباشرة.

  7. ٧. ما الشرط الأساسي الذي يجب أن يتحقق في مصفوفة قبل تطبيق البحث الثنائي (binary search) عليها؟

    • أن تكون عناصرها مرتبة
    • أن يكون عدد عناصرها زوجياً
    • ألا تحتوي على عناصر مكررة
    • أن تكون عناصرها أعداداً صحيحة

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

  8. ٨. ما التعقيد الزمني لشيفرة Python التالية بدلالة n؟ total = 0 for i in range(n): for j in range(i): total += 1

    • O(n)
    • O(n^2)
    • O(log n)
    • O(n log n)

    الشرح: تتكرر الحلقة الداخلية 0 + 1 + ... + (n-1) مرة، أي n(n-1)/2، وهذا O(n^2) بعد إهمال الثوابت والحدود الأصغر. يظن بعضهم أنها O(n log n) لأن الحلقة الداخلية أقصر من n، لكن متوسط طولها n/2 والثوابت لا تغيّر رتبة النمو.

  9. ٩. أبلغ أحد المستخدمين عن خطأ يظهر أحياناً عند حفظ الملفات في برنامج تعمل عليه، ولم يظهر لك هذا الخطأ من قبل. ما أفضل خطوة تبدأ بها؟

    • إغلاق البلاغ لأن الخطأ لا يظهر على جهازك
    • إعادة كتابة دالة الحفظ كاملة بأسلوب أوضح وأنظف
    • إحاطة دالة الحفظ بـ try/catch حتى لا يظهر الخطأ للمستخدم
    • جمع تفاصيل البلاغ ومحاولة إعادة إنتاج الخطأ

    الشرح: لا يمكن إصلاح خطأ بثقة قبل فهم ظروف حدوثه وإعادة إنتاجه، ثم تصبح خطوات إعادة الإنتاج أساساً لاختبار يثبت نجاح الإصلاح. أما إخفاء الخطأ بـ try/catch أو إعادة كتابة الدالة دون فهم السبب فيعالجان العَرَض ويتركان المشكلة قائمة.

  10. ١٠. رفعت commit إلى الفرع المشترك main عبر git push، ثم اكتشفت أنه يسبب خطأ، وكان زملاؤك قد سحبوه إلى أجهزتهم. ما الطريقة الأسلم للتراجع عنه؟

    • git reset --hard HEAD~1 ثم git push --force
    • git commit --amend ثم git push --force
    • git revert على ذلك الـ commit ثم git push
    • git stash ثم git push

    الشرح: ينشئ git revert commit جديداً يعكس التغيير دون إعادة كتابة التاريخ، فلا يتعارض مع نسخ زملائك. يبدو reset مع push --force حلاً أنظف، لكنه يعيد كتابة تاريخ فرع مشترك ويسبب مشكلات لكل من سحبه.

  11. ١١. ما الفرق بين WHERE وHAVING في استعلام SQL؟

    • WHERE يُستخدم مع SELECT فقط، وHAVING يُستخدم مع UPDATE وDELETE
    • HAVING يصفّي الصفوف قبل التجميع، وWHERE يصفّي المجموعات بعد GROUP BY
    • WHERE يصفّي الصفوف قبل التجميع، وHAVING يصفّي المجموعات بعد GROUP BY
    • لا فرق في النتيجة بينهما، وHAVING اسم بديل لـ WHERE في بعض قواعد البيانات

    الشرح: يُطبَّق WHERE على الصفوف قبل التجميع فلا يقبل دوال تجميعية مثل COUNT مباشرة، بينما يُطبَّق HAVING على المجموعات الناتجة عن GROUP BY. يخلط المبتدئون بينهما لأن كليهما يصفّي النتائج بشرط.

  12. ١٢. لديك جدولان: customers(id, name) وorders(id, customer_id, total). تريد عرض جميع العملاء، بمن فيهم من ليس لديهم أي طلب. ماذا تضع مكان الفراغ؟ SELECT c.name, o.total FROM customers c _____ orders o ON o.customer_id = c.id;

    • RIGHT JOIN
    • LEFT JOIN
    • CROSS JOIN
    • INNER JOIN

    الشرح: يعيد LEFT JOIN كل صفوف الجدول الأيسر customers، ويضع NULL في أعمدة orders لمن لا طلبات له. أما INNER JOIN، وهو الاختيار الخاطئ الشائع، فيعيد فقط العملاء الذين لديهم طلبات مطابقة.

المزيد