شرح أسهل برنامج في ++C بإحتراف

عزيزي، في هذه التدوينة سأعرفك على كيفية كتابة أول برنامج بلغة ++C، عندما أقول كتابة أول برنامج هذا لا يعني أنك سوف تنشئ الآن برنامجاً مثل برامج سطح المكتب التي تعرفها. لأن هذه مرحلة متقدمة من البرمجة سوف تصلها قريباً، ولكنك تحتاج إلي وضع حجرِ أساس للبرمجة بلغة ++C.

فالبرمجة بلغة ++C هي تماماً كعملية البناء، فلبناء مبنىً معين لابد من رسم خارطة البناء أولاً ثم تجهيز المعدات والأدوات اللازمة للبناء وبعدها الشروع في تنفيذ الخارطة. فكل بناء لابد من وضع الأساسات والأعمدة له، ثم يأتي دورُ الغرف و الأثاثات لاحقاً وفقاً لآراء المُلاّك .
أما مرحلة كتابة برنامج يشبه برامج سطح المكتب المعروفة يسبقها العديد من المراحل، فأنت الآن سوف تبدأ بالمراحل الأولي من البرمجة بلغة ++C.
ولكتابة أول برنامج لابد من تحديد المهمة و الطريقة التي يعمل بها البرنامج وتسمى الخوارزمية وهذه المرحلة بمثابة خارطة البناء كما سنرى في المثال التالي :

ستكتب برنامجاً بسيطاً يقوم بطباعة “مدونة علوم” مكتوبة بالأحرف الإنجليزية. أي أن البرنامج التالي يعرض الجملة “Mudawna Oolom” على الشاشة.

#include <iostream>

// This program print " Mudawna Oolom " on the screen

using namespace std;6
int main()
{
    cout << " Mudawna Oolom \n";
	return 0;
}

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

تحليل البرنامج:
السطر 1

#include <iostream>

  • في البداية الرمز # هاش هو أحد توجيهات المعالج التمهيدي، هناك جزء صغير من المترجم يسمى “المعالج التمهيدي “Preprocessor” هذا الجزء يعمل دائما عندما نبدأ في ترجمه البرنامج ، أي يعمل أولا ثم يبدأ المترجم في عمله ، وظيفته هي ترجمه التوجيهات (أي جمله تبدأ ب#) إلى احد الأوامر الخاصة ، بعد أن يقوم بتحويلها يقوم المترجم بأداء عمله.
  • الكلمة include ، معناها تضمين ، “أي قم أيها المعالج التمهيدي بتضمين ملف الرأس هذا إلى الـ Code Source” ، ماذا يعني هذا ؟؟ بكل بساطه يقوم المعالج بنسخ ملف الرأس ولصقه في بداية ال Source Code.
  • كلمة include عبارة عن توجيه للمترجم بأن يضم محتويات ملف الرأس iostream إلى الملف الحالي (الملف المحتوي على عبارة include#) بحث يصبح جزءاً منه.
  • يوجد ملف الرأس iostream -وهو اختصار input/output stream – في مكتبة ++C القياسية، ويحتوي على التعاريف و الإعلانات الضرورية والمفيدة لعمليات الإدخال و الإخراج القياسية.
  • تتعامل هذه المكتبة مع عمليات الإدخال و الإخراج على أنها تيارات (streams) من الحروف. ونحن بحاجة إلى ضم ملف الرأس iostream إلى البرنامج اعلاه بسبب استخدامنا لعبارة الإخراج cout في السطر 9. فالبرنامج يطبع العبارة ” Mudawna Oolom ” على الشاشة باستخدام الكائن  cout الموجود في الملف iostream.
  • الكائن عبارة عن منطقة في الذاكرة لها السمات التالية: عنوان، حجم، نوع، وقيمة. فالمتغير عبارة عن كائن
  • بصفة عامة، يجب إضافة ملف الرأس iostream في أي برنامج يستخدم أدوات الإدخال أو الإخراج القياسية مثل cin و cout.
  • الحرف # الذي يسبق include يستخدم للدلالة على أن السطر الحالي هو توجيها للمترجم. أما قوسا الزاوية < > اللذان يحيطان بالملف iostream فيدلان على وجود ملف الرأس هذا في مكتبة ++C القياسية. وكما ذكرنا سابقاً، يقوم المعالج المبدئي بتنفيذ مثل هذه التوجيهات والتي تبدأ بـ #.

السطر 3

// This program print ” Mudawna Oolom ” on the screen

  • يعتبر هذا تعليقاً (comment) خاص بالمبرمج، وهو عبارة عن نص يضاف في الملف المصدر من أجل وصف أو شرح عمل البرنامج وتوثيقه. والتعليقات مفيدة جداً للمبرمجين عند متابعة أو تطوير البرامج.
  • عندما يصادف المترجم هذه التعليقات يتجاهلها تماماً وكأنها غير موجودة وبالتالي لا تؤثر على الملف التنفيذي.
  • كتابة التعليقات اختيارية وليست إجبارية ولكن ينصح بإضافتها إلى نصوص البرامج.
  • من الممكن كتابته التعليقات في لغة ++C بطريقتين:
    • تعليق أحادي السطر: ويبدأ بكتابة الخطين المائلين // في السطر وينتهي بنهاية نفس السطر. وسيعتبر المترجم أن أي شيء يبدأ من الخطين المائلين إلى نهاية السطر تعليقاً، مثل التعليق الموجود في السطر 3 في البرنامج أعلاه. و من الممكن استخدامها كذلك لكتابة تعليق متعدد الأسطر، ولكن يجب أن يبدأ كل سطر بالخطين المائلين.
    • تعليق متعدد السطور: وهو النمط القديم المستخدم في لغة C. ويبدأ بـ /* (خط مائل تليه نجمة) وينتهي بـ */ (نجمة يليها الخط المائل)، مثل:
      /* ++This is the first program in C */
      ويمكن استخدامها عند كتابة التعليقات الطويلة ولكن لا يسمح بتداخلها مع بعضها البعض، وسيتجاهلها المترجم كذلك.

using namespace std;

  • تخبر المترجم بأن يستخدم فضاء الأسماء المعرف باسم std (اختصارا لكلمة standard). وفضاء الأسماء (namespace) ميزة جديدة أُضيفت إلى ++C بغرض حل مشكلة تضارب الأسماء التعريفية خاصة عند استخدام المكتبات المختلفة. فهي تمكن المبرمجين من تغليف مكتبة ما بفضاء مميز.
  • الأسماء المعرفة في فضاء معين تكون مفصولة عن تلك المعرفة في فضاء آخر. لذا يمكن لبرنامج أن يستخدم كائنين يحملان نفس الاسم ولكن كل منهما في مجال أو فضاء مختلف.
  • الأسماء المعرفة في فضاء، من الممكن إستخدامها من داخل ذلك الفضاء مباشرة. ولكن عند استخدام إسم من خارج فضاءه، يجب أن نحدد فضاءه باستخدام مُعامِل تحديد المجال (scope resolution operator) ويرمز لهذا المُعامِل بالرمز ( :: ). فمثلا، الكائن cout معرف في الفضاء std وهو فضاء مكتبة++C القياسية، لذا يمكن تحديد الكائن cout بإستخدام معامل تحديد المجال كالتالي: std::cout.
  • الرمز std::cout يفيد بأن الاسم cout يخص الفضاء std. بشكل عام، لاستخدام كائن من خارج فضاءه، يسبق اسم الكائن بالبادئة المكونة من اسم الفضاء يليه معامل تحديد المجال.
  • إذا استخدم البرنامج كائنات متعددة من أحد الفضاءات، فإن تحديد الأسماء باستخدام البادئة المكونة من اسم الفضاء ومعامل تحديد المجال قد يكون شاقاً، وكذلك تجعل قراءة البرنامج أصعب. ويمكن حل هذا المشكلة باستخدام العبارة using التي تغني الحاجة عن كتابة مثل تلك البادئة.
  • عبارة using استخدمت في البرنامج أعلاه في السطر 5 من أجل إحضار جميع الكائنات المحددة في الفضاء std إلى فضاء البرنامج الحالي، أي فضاء البرنامج اعلاه وهذا يعفينا من استخدام البادئة ::std بجوار كل كائن نستخدمه من الفضاء std وبالتالي يؤدي إلى تبسيط إدخال البرنامج وزيادة وضوحه.
  • تسمح العبارة using في السطر 5 من استخدام أي اسم من الفضاء std دون الحاجة إلى استخدام البادئة ::std. وعبارة using ليست ضرورية، ويمكن حذف السطر 5 من البرنامج، ولكن عندها يجب تحديد البادئة ::std قبل ذكر اسم cout في السطر 9.

السطر 7

int main()

  • كل برنامج من برامج الـ ++C يحتوي على إجراء واحد أو أكثر، ولكل منها أسم. واحد فقط من هذه الإجراءات يجب أن يحمل الاسم ()main يمكن أن نشبهها بجدران البناء فكل بناء لابد من ان يحوي جدران يضم ما بداخله، وهو الإجراء الرئيسي الذي يبدأ منه تنفيذ البرنامج و غالبا ما ينهي منه. بعبارة أخرى، هو الإجراء الذي يستدعيه نظام التشغيل عندما تطلب تشغيل البرنامج، أي انه نقطة انطلاق البرنامج.
  • عادة، يقسم البرنامج إلى عدة إجراءات يقوم كل إجراء منها بعمل محدد، ويتكون كل منها من مجموعة مستقلة من الأوامر (statements).
  • يمكن للإجراءات أن تستدعي (call)بعضها البعض، كذلك يمكن أن يقوم الإجراء المستدعَى بإعادة قيمة للإجراء المستدعِي، هذه القيمة المعادة يجب تحديد نوعها قبل أسم الإجراء.
  • الكلمة int (اختصار integer) التي تسبق الإجراء الرئيسي ()main تدل على أن الإجراء الرئيسي يسترجع عدداً صحيحاً لنظام التشغيل أي أن ما بداخل هذا الجدران عبارة عن عدد صحيح.
  • القوسان المجودان بعد كلمة main فهما ضروريان، على الرغم من عدم وجود شيء بينهما، للدلالة على أنه إجراء، وتستخدم هذه الأقواس التي تلي أسماء الإجراءات من أجل تمرير المتغيرات الوسيطة (formal parameters).
  • القوسان الكبيران {} في السطرين 8 و11 ضروريان لتحديد بداية ونهاية الأوامر في الإجراء. أي من أجل تحديد متن الإجراء ()main.

السطر 9

cout << ” Mudawna Oolom \n”;

  • عبارة cout تقوم بعرض الرسالة “Mudawna Oolom” على الشاشة.
  • لغة ++C تنجز عمليات الإدخال والإخراج على شكل تيارات من الحروف (streams of characters). ويتم ذلك باستخدام عامِل الإدراج <<.
  • عامل الإدراج << في العبارة الموجودة في السطر 9 له معامَلان: المعامل الأيمن وهو هنا الرسالة “Mudawna Oolom\n” ، والمعامل الأيسر وهو cout. وعند التنفيذ، يقوم العامل << بإدراج تيار الحروف “Mudawna Oolom” في كائن تيار الإخراج cout.
  • كائن تيار الإخراج cout يمثّل وحدة الإخراج الأساسية وهي عادة ما تكون الشاشة. وبالتالي تعرض “Mudawna Oolom” على الشاشة.
  • تسمى الرسالة “Mudawna Oolom \n” والمحصورة بين علامتي الاقتباس المزدوجة بسلسلة حروف. وعند التنفيذ، تطبع السلسلة بالصورة التي تبدو فيها للعِيان وهي محصورة بين علامتي الاقتباس، باستثناء الحرفين الأخيرين n\.
  • يستخدم الخط المائل (\) كرمز للخروج، وعندما يظهر في سلسلة حروف، فإن الحرف الذي يليه ينضم معه ليشكل تتابع من الحروف تستخدم لترميز حروف خاصة. فالتتابع n\ يرمز لسطر جديد. و يؤدي هذا الترميز إلى تحرك مؤشر الشاشة إلى بداية السطر التالي.

السطر 10

return 0;

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

 

لاحظ العبارات في الأسطر 5 و9 و10 تنتهي بالفاصلة المنقوطة. في الواقع، جميع العبارات في لغة ++C يجب أن تنتهي بالفاصلة المنقوطة.

الملامح الرئيسية الموجودة في برامج ++C :

  • يحتوي كل برنامج ++C على إجراء رئيسي يسمى ()main والذي منه يبدأ تنفيذ البرنامج، و تعليمات أي إجراء يجب أن تحصر بين الأقواس الكبيرة {}.
  • في الوضع الافتراضي، يمثل الكائن cout الشاشة، وعند إدراج أي شيء فيه (تيار من الحروف) يتم عرضه على الشاشة. ويوجد تعريفة في مكتبة النظام iostream، ويمكن لأي إجراء آخر استخدامه.
  • وضع التعليقات مهم لقرّاء نص البرنامج، أما المترجم فيتجاهلها تماماً.
  • تنتهي كل تعليمة بفاصلة منقوطة (;)وتعبّر عن نهاية التعليمة.

بهذا تكون قد إمتلكت فكرة عامة عن كيفية كتابة البرامج بلغة ++C وفي التدوينات القادمة بإذن الله سوف تتعرف على نمط البرنامج من تنسيق وتنظيم للبرنامجة وخطوات كتابة وتنفيذ البرنامج و إستكشاف ومعالجة الأخطاء في الشيفرة البرمجية إن وجدت .

محمد إبراهيم

محمد ابراهيم مهندس حاسوب سوداني 21 عام مهتم بمجال التكنولوجيا والعالم الرقمي

‫49 تعليقات

  1. السلام عليكم ورحمة الله وبركاته …
    أعجبتني مدونتك حيث وجدت شرحا مبسطا ومفهوما لبعض المواضيع الجميلة ويمكن الاستفادة منها.

    عندي ملاحظة:
    رسالة طلب الاشتراك في المدونة مزعجة بعض الشيء .

    أتمنى لك التوفيق والنجاح في دنياك واخرتك.

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

  2. مع السلام
    ارجو منکم ان ان توضوحوا لی کیف نصوغ بعد کتابة برنامج ما فی هیئة و قالب application فی کامبیوتر
    بعباره اخري كيف نصوغ soft ware
    ارید منکم جوابا مع التوضیحات
    او ترشدونی علی کتاب ما فی هذا المجال
    شکرا لموقعکم الجمیل
    انتظر ا

    1. مرحباً مرتضى و شكراً لكلماتك الجميلة.

      بعد كتابتك لشفرة البرنامج (Coding)، و التأكد من عمل البرنامج فأنت تملك أسطراً برمجية لن يستطيع العميل أو المستخدم النهائي التعامل معها، و أنت ترغب في معرفة كيفية إنشاء الملف التنفيذي (exe file) لشفرتك التي كتبتها، صحيح؟

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

      فمثلاً إذا ما كُنت تستخدم مايكروسوفت فيجوال ستديو فكُل ما تحتاجُه هو الضغط على F7 لإنشاء الملف التنفيذي لمشروعك.

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

      دُمت بود أخي.

  3. عند استخدام اشارة ^ في البرنامج الذي يتم كتابته، فانه يتم اظهار رسالة خطأ، ارجو تفسير ذلك؟!
    ع سبيل المثال
    int x;
    float y;
    cin>>x>>y;
    y=y+0.5;
    z=x^2/(y-5); تكمن المشكله في هذا السطر
    cout<<"***"<<z<<x<<endl;
    return 0;

  4. السلام عليكم عندي سؤال اذا بتعرف تحله اخوي و شكرا لك

    Write a program using array. Create two arrays (one is int array and another is float array) of size 5 and 7 respectively. Read suitable values into the array. Display the odd indexed values from the first array and display the even indexed values from the second array.

    1. وعليكم السلام ورحمة الله مازن،
      مرحباً بك.

      نهج مدونة علوم قائمة على مشاركة المعلومات على عكس حل المسائل والإختبارات وما إلى ذلك.

      كُل التوفيق لك.

  5. شكراً إستاذ مصطفى الطيب ، إن شاء الله بدرس ++C الفصل القادم و تقديمك و تبسيطك للموضوع سهل علي فهم كيف يستخدم برنامج ++C .

    1. مرحباً بك أخي عبدالملك.

      هذه التدوينة من قبل الأخ محمد إبراهيم لهُ الشكر على مجهوده. تجد معلوماته أسفل التدوينة مباشرة.

      ويُسعدني أن تستفيد من هذه التدوينات وأتمنى لك التوفيق.

  6. السلام عليكم ورحمة الله وبركاته

    انا مطلع جديد على البرمجة ولغاتها وعندي فضول في التعرف على لغاتها.
    سؤالي هو اين ستطيع كتابة هذه البرامج في الكمبيوتر هل في مفكرة عادية ارجو التوضيح مع كامل الشكر والتقدير.

    1. وعليكم السلام ورحمة الله وبركاته أخي عبدو،

      أهلاً ومرحباً بك وأتمنى لك التوفيق في رحلتك البرمجية.
      تستطيعُ كتابةَ هذه الأوامر البرمجية (أكواد) في أي محرر نصوص، ولكن من أجل تنفيذها ستحتاجُ إلى بيئةٍ برمجيّة.

      أنصحك بالإطلاع على تدوينة ما بين شيفرة برنامجك و تنفيذه أسرار

  7. يعطيك العافيه اخوي على مجهودك انا حملت تطبيق c++ على جهازي الايفون
    بس مشكلته مو راضي يسوي لي run اتوقع لازم اشتري من التطبيق ياليت
    تفيدني وجزاك الله خير على مجهودك

  8. الى الان لم افهم المترجم؟؟! كيف يمكنني الحصول عليه؟؟! وهل اقوم بكتابة البرنامج في المترجم او اين اقوم بكتابة البرنامج ؟؟!
    .
    معلومات مفيده وشرح مبسط وكامل
    الف شكر على المعلومات إن شاء الله تقوم بتنزيل مثل هذه الدروس

  9. 1. Write a program to ask the user to enter two numbers and to decide what to do with them ask him to enter 1 for adding and 2 for
    subtraction 3 for multiply and 4 for division(in case of division make sure the second number is not 0)
    2. write a C++ code for a program that reads alphabet character (A-Z) (a-z) from the user and print the ASCII code for that character. If the user enter non-alphabet character print error message.
    3. A Car Rental company charges $0.15/mile if the total mileage does not exceed 100. If the total mileage is over 100, the company charges $0.25/mile for the first 100 miles, then it charges $0.5/mile for any additional mileage over 100.
    Write a C++ code for a program that prompts the user to enter the number of miles. Then the program would display the total price owed.
    ارجو المساعدة كيف اكتب هذا البرامج بلغة C++

  10. السلام عليكم
    استاذ اريد ابسط طريقه لفهم ++cلان حقيقة دايخ فيه لاني طالب برمجيات مرحله أولى
    تحياتي لكم

  11. السلام عليكم
    عفوا لدي استفسار عن البرمجة خاصة في لغة ++C الحين في لغة في حوالي 10 متغيرات الى هو ال if , if else , araay , loop وغيرها سؤالي هو
    انا الحين ك مبرمجة لم يجي لي سؤال كيف ابعرف انو لازم احط هذا المتغير وكذا ؟
    وشكرا ز

    1. وعليكم السلام ورحمة الله رهف،

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

      أنصحك بإجراء الكثير من التمارين المتعلقة لتألفي التعامل معها.

  12. بسم الله الرحمن الرحيم
    أن طالب في السنه الاولي الحمدالله عرفت أسرار لغه c++لكن ما اعاني منه أود أن اتعرف علي لغات السابقه cوجافا……الخ
    أرجو مساعده

  13. ليست لدي علاقة بالبرمجة والان اود ان ابدا في تعلمها لقد حملت على حاسوبي visual studio 2017 واود تعلم لغة c++ و اود ان اتعلم البرمجة كوني اتقن الرياضيات واحب التكنولوحيا كثيرا من فضلكم ..وبدون ان تضحكو على سؤالي ماذا افعل بتعلم لفة c++ يعني فهمت الشرح النظري اما التطبيقي لا ….فيما استخدم هاته اللغة ليس لدي اي فكرة !! هل في بناء تطبيقات ام ماذا !! و ماهي ادوات البرمجة للغة c++ !! علما انني ادرس الطب …فهل استطيع تعلمها في المنزل فقط !! وكيف استثمر بتعلمي للغة البرمجة هل يمكن توضيح من فضلكم و شكرا على المقالة الرائعة

  14. السلام عليكم
    عند العمل على البرنامج وعمل build يظهر معي خطأ
    C1010 unexpected end of file while looking for precompiled header. Did you forget to add ‘#include “pch.h”‘ to your source?
    بعد محاولة إضافة #include “pch.h”
    يظهر خطأ أخر وهو :
    C2065 ‘cout’: undeclared identifier

    الرجاء الإفادة

    1. وعليكم السلام أخي ربيع،
      تعلم البرمجة ليست عبر برنامج. وإنما تتعلم البرمجة من أجل انتاج برامج.

      بإمكانك إقتناء كتاب لتعلم إحدى لغات البرمجة (مثل php أو java أو python) وبنهايته من المتوقع أن تكون قادراً على تطوير وإنتاج برامج.

  15. سلام
    تخصصي هو تطبيقات الكمبيوتر ولكن لم افهم شي ابدا في عذا المجال ما اول خطوه اعملها لكي استوعب هذه البرميجيات
    شكرا

    1. ما دمت تدرس مجال تطبيقات الكمبيوتر فالحل هو أن تعود إلى المواد الأولى التي درستها سابقاً وتعيد دراستها حتى تفهمها. حاول الاستعانة بمن سبقك في الدراسة أو الخبراء أو نوع وسائل الشرح حتى تستطيع الفهم.
      كل التوفيق لك.

    1. السلام عليكم اخي انا عندي مشكلة مع الفيحوال اكسبرس2010 وهي عندما اريد تشغيل الفورم في البرنامج تاتيني رسالة الخطا هذه،
      the system cannot find the file specifiedK
      شكرا لك.

  16. احتاج لبرنامج لكلمة السر اذا اتخلتها صحيحه يظهر لك accept واذا فشلت يظهر لك rejcet واذا فشلت ثلاثه مراة ينتهي البرنامج

  17. السلام عليكم اخي انا عندي مشكلة مع الفيحوال اكسبرس2010 وهي عندما اريد تشغيل الفورم في البرنامج تاتيني رسالة الخطا هذه،
    the system cannot find the file specifiedK
    شكرا لك.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

مقالات ذات صلة

زر الذهاب إلى الأعلى