مادة عال 111 (CSC 111)، برمجة حاسبات 1 (Computer Programming 1)، هي اول مادة برمجة حقيقية تدرسها في قسم علوم الحاسب بجامعة الملك سعود. هذي المادة هي الاساس اللي ينبني عليه كل شيء بعدها: البرمجة كائنية التوجه في عال 113، تراكيب البيانات في عال 212، وكل مواد البرمجة المتقدمة. لو بنيت اساسك صح هنا، باقي المشوار يصير اسهل بكثير.
المادة تستخدم لغة جافا (Java) كلغة تدريس، والمرجع المعتمد هو كتاب “Java Programming: From Problem Analysis to Program Design” لـ D.S. Malik، وهو كتاب معروف بتدرجه من البسيط للمعقد مع امثلة عملية كثيرة.
ما تحتاج اي خبرة برمجية سابقة. المادة تبدا معك من الصفر. بس لازم تكون مستعد تتمرن كثير لان البرمجة مهارة عملية قبل ما تكون نظرية.
📋 ملخص سريع
- رمز المادة: عال 111 (CSC 111): برمجة حاسبات 1 (Computer Programming 1)
- الساعات المعتمدة: 3 ساعات نظري + 1 عملي
- المتطلب السابق: لا يوجد. هذي اول مادة برمجة
- اللغة المستخدمة: Java
- الكتاب المرجعي: Java Programming: From Problem Analysis to Program Design, D.S. Malik
- المواضيع الرئيسية: المتغيرات وانواع البيانات، العمليات الحسابية، جمل الشرط (if/else/switch)، الحلقات (for/while/do-while)، الدوال (Methods)، المصفوفات (1D و 2D)، التعامل مع النصوص (Strings)
- يقود الى: عال 113 برمجة حاسبات 2 (البرمجة كائنية التوجه)
ليش عال 111 مادة اساسية في مسارك؟
قبل ما ندخل في الشرح، خلنا نفهم ليش هذي المادة مهمة لك كطالب في جامعة الملك سعود:
- بوابة لكل مواد البرمجة: ما تقدر تاخذ عال 113 او اي مادة برمجية ثانية بدونها
- تبني طريقة تفكيرك البرمجي: مو بس تتعلم syntax، تتعلم كيف تحلل مشكلة وتحولها لكود
- اساسيات تنفعك في اي لغة: المفاهيم اللي تتعلمها هنا موجودة في كل لغات البرمجة بدون استثناء
- الدرجة تفرق: كثير من الشركات تسال عن معدلك في مواد البرمجة الاساسية وقت التقديم على وظيفة او تدريب تعاوني
- المقابلات الوظيفية: شركات التقنية الكبرى تبني اسئلة المقابلات على اساسيات البرمجة. لو اساسك ضعيف، راح تعاني لاحقا
ℹ️ نصيحة لطلاب السنة الاولى
لا تخاف اذا ما عندك اي خلفية برمجية. كل زملائك بدأوا من نفس النقطة. اللي يفرق هو مقدار التمرين اللي تسويه بره المحاضرة. خصص 30 دقيقة يوميا تكتب كود وراح تلاحظ فرق كبير خلال اسابيع.
نظرة عامة على محتوى عال 111
المادة تتوزع على 15 اسبوع تقريبا بهذا الترتيب:
| الاسابيع | الموضوع | المفاهيم الرئيسية |
|---|---|---|
| 1-2 | مقدمة في جافا وبيئة التطوير | JDK, IDE, اول برنامج |
| 3-4 | المتغيرات وانواع البيانات والعمليات | int, double, char, boolean, عمليات حسابية |
| 5-6 | جمل الشرط (Selection Statements) | if/else, switch, شروط متداخلة |
| 7-8 | الحلقات (Loops) | for, while, do-while, حلقات متداخلة |
| 9-10 | الدوال (Methods) | تعريف، استدعاء، parameters, return, overloading |
| 11-12 | المصفوفات الاحادية (1D Arrays) | انشاء، تعبئة، بحث، ترتيب |
| 13-14 | المصفوفات الثنائية والنصوص | 2D Arrays, String methods |
| 15 | مراجعة شاملة | تمارين متكاملة |
1. مقدمة في جافا وبيئة التطوير
اول شيء تتعلمه: كيف تجهز جهازك عشان تكتب وتشغّل كود جافا.
اعداد بيئة العمل
راح تحتاج تنزّل JDK (Java Development Kit) وبيئة تطوير مثل Eclipse او IntelliJ IDEA. غالبا المادة تستخدم Eclipse. نزّله، ثبّته، وجرب تشغل اول برنامج.
اول برنامج لك في جافا
// اول برنامج - طباعة رسالة ترحيب
public class HelloWorld {
public static void main(String[] args) {
System.out.println("مرحبا بالعالم!");
System.out.println("CSC 111 - جامعة الملك سعود");
}
}
مفاهيم اساسية تفهمها من البداية
- كل برنامج جافا لازم يكون داخل class
- التنفيذ يبدا من
main method - كل سطر ينتهي بـ فاصلة منقوطة
; System.out.println()تطبع نص وتنزل سطر جديدSystem.out.print()تطبع بدون سطر جديد
💡 لا تحاول تفهم كل شيء اول يوم
السطر public static void main(String[] args) فيه كلمات كثيرة ممكن تلخبطك. في هذي المرحلة، احفظه كقالب وركز على اللي يكون داخل الـ main. راح تفهم كل كلمة فيه لما توصل عال 113 ان شاء الله.
2. المتغيرات وانواع البيانات والعمليات
هنا تبدا تتعامل مع البيانات فعليا. المتغيرات هي “صناديق” تخزّن فيها قيم تقدر تستخدمها وتعدلها.
انواع البيانات الاساسية في جافا
// انواع البيانات الاساسية (Primitive Types)
int age = 21; // عدد صحيح
double gpa = 4.50; // عدد عشري
char grade = 'A'; // حرف واحد
boolean passed = true; // قيمة منطقية (true او false)
String name = "خالد"; // نص (سلسلة محارف)
العمليات الحسابية
int x = 10, y = 3;
System.out.println(x + y); // 13 - جمع
System.out.println(x - y); // 7 - طرح
System.out.println(x * y); // 30 - ضرب
System.out.println(x / y); // 3 - قسمة صحيحة (انتبه!)
System.out.println(x % y); // 1 - باقي القسمة (modulus)
قراءة مدخلات من المستخدم
import java.util.Scanner;
public class InputDemo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("ادخل اسمك: ");
String name = input.nextLine(); // قراءة نص
System.out.print("ادخل عمرك: ");
int age = input.nextInt(); // قراءة عدد صحيح
System.out.println("مرحبا " + name + "، عمرك " + age);
}
}
⚠️ خطا شائع: القسمة الصحيحة
لما تقسم int / int النتيجة تكون int. يعني 10 / 3 = 3 مو 3.33. لو تبي النتيجة عشرية، لازم واحد من الارقام يكون double:
10.0 / 3 او (double) 10 / 3.
هذا من اكثر الاخطاء اللي يخسر فيها الطلاب درجات في الميدترم.
العمليات المنطقية والمقارنة
العمليات هذي تحتاجها بكثرة لما توصل لجمل الشرط:
// عمليات المقارنة
// == (يساوي), != (لا يساوي)
// > (اكبر), < (اصغر), >= (اكبر او يساوي), <= (اصغر او يساوي)
// العمليات المنطقية
// && (و - AND), || (او - OR), ! (نفي - NOT)
int age = 20;
boolean isStudent = true;
// الشرطين لازم يتحققون معا
if (age >= 18 && isStudent) {
System.out.println("مؤهل للتسجيل");
}
3. جمل الشرط في عال 111 (Selection Statements)
تبي برنامجك ياخذ قرارات بناء على شروط معينة؟ جمل الشرط هي اللي تسوي لك هالشيء.
جملة if / else
// حساب التقدير بناء على المعدل
double gpa = 3.8;
if (gpa >= 4.5) {
System.out.println("ممتاز");
} else if (gpa >= 3.75) {
System.out.println("جيد جدا");
} else if (gpa >= 2.75) {
System.out.println("جيد");
} else if (gpa >= 2.0) {
System.out.println("مقبول");
} else {
System.out.println("راسب");
}
جملة switch
// تحديد اسم اليوم من رقمه
int day = 1;
switch (day) {
case 1: System.out.println("الاحد"); break;
case 2: System.out.println("الاثنين"); break;
case 3: System.out.println("الثلاثاء"); break;
case 4: System.out.println("الاربعاء"); break;
case 5: System.out.println("الخميس"); break;
default: System.out.println("عطلة نهاية الاسبوع");
}
الشروط المتداخلة (Nested if)
// التحقق من اهلية التسجيل
int credits = 15;
double gpa = 3.0;
if (credits >= 12) {
if (gpa >= 2.0) {
System.out.println("تقدر تسجل حمل كامل");
} else {
System.out.println("تسجيل محدود فقط");
}
} else {
System.out.println("اكمل الساعات المطلوبة اول");
}
⚠️ خطا كلاسيكي: = مقابل ==
المقارنة تستخدم == (يساوي) وليس = (اسناد قيمة). لو كتبت if (x = 5) بدل if (x == 5) جافا تعطيك خطا. هذا خطا يتكرر كثير في اول اختبار وتضيع عليك الدرجة بسببه.
4. الحلقات (Loops)
تبي تكرر عملية 100 مرة بدون ما تكتب 100 سطر؟ الحلقات هي الحل. في عال 111 تتعلم ثلاث انواع من الحلقات وكل وحدة لها استخدام مختلف.
حلقة for
تستخدمها لما تعرف عدد التكرارات مسبقا:
// طباعة الارقام من 1 الى 10
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
// جمع الارقام من 1 الى 100
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i; // sum = sum + i
}
System.out.println("المجموع = " + sum); // 5050
حلقة while
تستخدمها لما ما تعرف عدد التكرارات وتعتمد على شرط:
// جمع ارقام من المستخدم حتى يدخل 0
Scanner input = new Scanner(System.in);
int sum = 0;
int number;
System.out.print("ادخل رقم (0 للانهاء): ");
number = input.nextInt();
while (number != 0) {
sum += number;
System.out.print("ادخل رقم (0 للانهاء): ");
number = input.nextInt();
}
System.out.println("المجموع = " + sum);
حلقة do-while
مثل while بس تضمن التنفيذ مرة واحدة على الاقل:
// قائمة خيارات تتكرر حتى يختار الخروج
Scanner input = new Scanner(System.in);
int choice;
do {
System.out.println("1. عرض الدرجات");
System.out.println("2. حساب المعدل");
System.out.println("3. خروج");
System.out.print("اختيارك: ");
choice = input.nextInt();
if (choice == 1) System.out.println("عرض الدرجات...");
else if (choice == 2) System.out.println("حساب المعدل...");
} while (choice != 3);
الحلقات المتداخلة (Nested Loops)
الحلقات المتداخلة من اصعب الاجزاء في عال 111. الحيلة انك تفهم ان الحلقة الداخلية تنفذ بالكامل مع كل دورة من الحلقة الخارجية:
// طباعة مثلث من النجوم
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
System.out.println(); // سطر جديد
}
// النتيجة:
// *
// * *
// * * *
// * * * *
// * * * * *
💡 متى تستخدم كل حلقة؟
- for: لما تعرف عدد التكرارات (مثلا: كرر 10 مرات)
- while: لما تعتمد على شرط ولا تعرف العدد (مثلا: كرر حتى المستخدم يدخل 0)
- do-while: مثل while بس تنفذ مرة واحدة على الاقل قبل ما تتحقق من الشرط
هذا السؤال يجي في كل اختبار تقريبا. احفظه.
واجب الحلقات المتداخلة صعب عليك؟
الحلقات المتداخلة من اكثر المواضيع اللي يطلب فيها طلاب عال 111 مساعدة. ارسل لنا السؤال على واتساب ونشرحه لك خطوة بخطوة مع الحل الكامل.
ارسل واجبك على واتساب5. الدوال (Methods)
لما كودك يكبر ويصير فوضى كله داخل main، الدوال هي اللي تنقذك. تقسّم البرنامج لاجزاء صغيرة، كل جزء يسوي مهمة محددة.
تعريف واستدعاء الدوال
// دالة تحسب مربع رقم
public static int square(int n) {
return n * n;
}
// دالة تحسب الاكبر بين رقمين
public static int max(int a, int b) {
if (a > b) return a;
else return b;
}
نستدعي الدوال من داخل main:
public static void main(String[] args) {
int result = square(5); // result = 25
int bigger = max(10, 20); // bigger = 20
System.out.println("مربع 5 = " + result);
System.out.println("الاكبر = " + bigger);
}
دوال بدون قيمة راجعة (void)
// دالة تطبع خط فاصل - ما ترجع شيء
public static void printLine() {
System.out.println("========================");
}
// دالة ترحّب بالمستخدم
public static void greet(String name) {
System.out.println("مرحبا يا " + name + "!");
}
Method Overloading (تعدد الدوال بنفس الاسم)
جافا تسمح لك تعرّف اكثر من دالة بنفس الاسم بشرط ان تكون الـ parameters مختلفة:
public static int add(int a, int b) {
return a + b;
}
public static double add(double a, double b) {
return a + b;
}
public static int add(int a, int b, int c) {
return a + b + c;
}
ℹ️ الفرق بين Parameter و Argument
- Parameter (معامل): المتغير في تعريف الدالة، مثل
int nفيsquare(int n) - Argument (وسيط): القيمة الفعلية لما تستدعي الدالة، مثل
5فيsquare(5)
الدكتور يحب يسال عن هالفرق في الاختبار النظري. لا تخلط بينهم.
لو تبي تفهم الدوال بشكل اعمق مع امثلة اضافية، راجع دليلنا الشامل لتعلم جافا.
6. المصفوفات الاحادية (1D Arrays)
المصفوفات تخليك تخزّن مجموعة بيانات من نفس النوع في متغير واحد. بدل ما تعرّف 30 متغير لدرجات 30 طالب، تعرّف مصفوفة وحدة.
الانشاء والتعبئة
// انشاء مصفوفة بقيم مباشرة
int[] grades = {85, 92, 78, 95, 88};
// انشاء مصفوفة فارغة
double[] scores = new double[5]; // 5 عناصر كلها 0.0
// الوصول للعناصر (الفهرس يبدا من 0)
System.out.println(grades[0]); // 85 - اول عنصر
System.out.println(grades[4]); // 88 - اخر عنصر
// المرور على كل العناصر
for (int i = 0; i < grades.length; i++) {
System.out.println("طالب " + (i+1) + ": " + grades[i]);
}
خوارزميات اساسية على المصفوفات
هذي الخوارزميات تجي في كل اختبار تقريبا. ذاكرها كويس:
int[] numbers = {45, 12, 78, 34, 90, 23};
// ايجاد المجموع والمتوسط
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
double average = (double) sum / numbers.length;
System.out.println("المتوسط = " + average);
// ايجاد اكبر قيمة
int max = numbers[0]; // نفترض اول عنصر هو الاكبر
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] > max) max = numbers[i];
}
System.out.println("اكبر قيمة = " + max);
البحث في المصفوفة (Linear Search)
// البحث عن قيمة معينة في المصفوفة
public static int search(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) return i; // لقيناه
}
return -1; // ما لقيناه
}
7. المصفوفات الثنائية (2D Arrays)
المصفوفات الثنائية مثل الجدول: صفوف واعمدة. تحتاج حلقتين متداخلتين للمرور على كل العناصر.
// جدول درجات: 3 طلاب × 4 مواد
int[][] grades = {
{85, 90, 78, 92}, // طالب 1
{88, 76, 95, 80}, // طالب 2
{70, 85, 88, 91} // طالب 3
};
// حساب معدل كل طالب
for (int i = 0; i < grades.length; i++) {
int studentSum = 0;
for (int j = 0; j < grades[i].length; j++) {
studentSum += grades[i][j];
}
double avg = (double) studentSum / grades[i].length;
System.out.println("طالب " + (i+1) + " معدله: " + avg);
}
الوصول لعناصر محددة
// grades[صف][عمود]
System.out.println(grades[0][2]); // 78 - طالب 1، مادة 3
System.out.println(grades[2][0]); // 70 - طالب 3، مادة 1
// عدد الصفوف
System.out.println(grades.length); // 3
// عدد الاعمدة في الصف الاول
System.out.println(grades[0].length); // 4
⚠️ خطا شائع: ArrayIndexOutOfBoundsException
لو عندك مصفوفة بحجم 5، اخر فهرس هو 4 مو 5. كثير من الطلاب يكتبون i <= array.length بدل i < array.length ويطيح البرنامج. تذكّر: الفهرس يبدا من 0 وينتهي عند length - 1.
واجب المصفوفات الثنائية محيّرك؟
واجبات المصفوفات ثنائية البعد من اكثر الواجبات اللي يطلب فيها طلاب قسم علوم الحاسب مساعدة. ارسل لنا تفاصيل الواجب ونحله لك مع شرح كامل.
تواصل معنا على واتساب8. التعامل مع النصوص (Strings)
النصوص في جافا مو نوع بيانات بسيط مثل int او double. الـ String هو كائن (object) وله دوال جاهزة كثيرة تساعدك تتعامل معه.
الدوال الاساسية للنصوص
String name = "King Saud University";
// طول النص
System.out.println(name.length()); // 20
// تحويل لحروف كبيرة او صغيرة
System.out.println(name.toUpperCase()); // KING SAUD UNIVERSITY
System.out.println(name.toLowerCase()); // king saud university
// استخراج جزء من النص
System.out.println(name.substring(0, 4)); // King
System.out.println(name.substring(5)); // Saud University
// البحث عن حرف او نص
System.out.println(name.indexOf("Saud")); // 5
System.out.println(name.contains("King")); // true
// استبدال نص
System.out.println(name.replace("King", "Malik")); // Malik Saud University
مقارنة النصوص
String s1 = "java";
String s2 = "Java";
// == تقارن المراجع مو القيم - لا تستخدمها للنصوص!
// استخدم .equals() للمقارنة الصحيحة
System.out.println(s1.equals(s2)); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true
// المرور على كل حرف في النص
for (int i = 0; i < s1.length(); i++) {
char ch = s1.charAt(i);
System.out.println(ch);
}
⚠️ لا تستخدم == لمقارنة النصوص
من اشهر الاخطاء في جافا استخدام == لمقارنة نصين. النتيجة ممكن تطلع غلط لان == تقارن المراجع مو القيم. دائما استخدم .equals() او .equalsIgnoreCase() للمقارنة. هالغلطة لو جاتك في الاختبار تكلفك الدرجة كاملة.
اخطاء شائعة في عال 111 وكيف تتجنبها
خلنا نجمع اكثر الاخطاء اللي يخسر فيها الطلاب درجات:
الاخطاء الاكثر تكرارا في عال 111
- نسيان الفاصلة المنقوطة
;في نهاية السطر، جافا ما تسامح في هذا - = بدل == في الشروط،
if (x = 5)غلط، الصحif (x == 5) - القسمة الصحيحة،
10 / 3يعطي3مو3.33، استخدم10.0 / 3لو تبي عشري - فهرس المصفوفة يبدا من 0 مو من 1، واخر فهرس هو
length - 1 - استخدام == لمقارنة النصوص، الصح
.equals() - نسيان break في switch، بدون break البرنامج يكمل لكل الحالات
- Infinite loop، حلقة ما تنتهي لانك نسيت تحدّث متغير الشرط
- نسيان اغلاق الاقواس
{}، خصوصا في الحلقات والشروط المتداخلة
نصائح للاختبارات
اختبارات عال 111 عادة تتنوع بين هذي الانواع:
انواع الاسئلة المتوقعة
- تتبع الكود (Trace): يعطيك كود ويسالك عن المخرجات. لازم تنفذ الكود خطوة بخطوة على ورقة
- اكتشاف الاخطاء: يعطيك كود فيه اخطاء وتصلحها
- اكتب كود: يعطيك مسالة وتكتب الحل بجافا من الصفر
- اسئلة نظرية: الفرق بين while و do-while، انواع البيانات، scope المتغيرات
استراتيجية المذاكرة
خطة مذاكرة فعالة لـ عال 111
- راجع سلايدات المحاضرة وركز على الامثلة العملية مو بس التعريفات النظرية
- حل تمارين الكتاب، Malik فيه تمارين ممتازة في نهاية كل فصل
- اعد حل تمارين اللاب بدون ما تشوف الحل، لو قدرت تحله لحالك يعني فاهمه
- حل اختبارات سابقة، اسال الطلاب اللي قبلك عن نماذج الاسئلة
- اكتب الكود بيدك على ورق، في الاختبار ما فيه compiler يصحح لك
- ذاكر مع ربعك، اشرح لزميلك واطلب منه يشرح لك. اللي يقدر يشرح يعني فاهم
💡 نصيحة ذهبية لسؤال تتبع الكود
في سؤال تتبع الكود (Trace)، ارسم جدول للمتغيرات وحدّث القيم مع كل سطر. هذي الطريقة تقلل الاخطاء بشكل كبير وتوفر عليك وقت. الدكتور يحب يشوف شغلك مرتب ومنظم.
لو تبي استراتيجيات اضافية للمذاكرة والاستعداد للاختبارات بشكل عام، اقرا دليلنا للتحضير للاختبارات.
نصائح للاب العملي
اللاب في عال 111 يكون اسبوعي وهو جزء اساسي من درجتك. هذي نصائح تفرق معك:
- اكتب الكود بنفسك. لا تنسخ من زميلك حتى لو الكود صح. لو ما كتبته بنفسك ما راح تتعلم
- جرّب الاخطاء عمدا. لما يطلع لك error، اقرا رسالة الخطا. جافا واضحة في رسائلها وتوصلك للمشكلة بسرعة
- ابدا بحل بسيط. لا تحاول تكتب الحل المثالي من اول مرة. اكتب شيء يشتغل اول، بعدين حسّنه
- جرب بمدخلات مختلفة. قبل ما تسلّم، جرب برنامجك بارقام مختلفة وحالات حدية (مثل 0 وارقام سالبة)
- لا تخاف تسال. الـ TA موجود عشان يساعدك، استغل وجوده
ربط عال 111 بمسارك الاكاديمي
بعد ما تنهي عال 111 بنجاح، المادة التالية في الخطة هي عال 113 برمجة حاسبات 2 (البرمجة كائنية التوجه). في عال 113 تتعلم كيف تنظم كودك باستخدام الكلاسات والكائنات والوراثة وتعدد الاشكال. كل شيء تعلمته في عال 111 تستخدمه هناك بشكل مباشر.
بعد عال 113 تدخل عال 212 تراكيب البيانات وهي من اهم مواد التخصص. المادة تبني على كل شيء تعلمته في مواد البرمجة الاساسية وتعلمك كيف تكتب كود فعال.
لو تبي شرح اعمق لاساسيات جافا بشكل عام، اقرا دليلنا الشامل لتعلم جافا. ولو تحس انك تحتاج متابعة شخصية في البرمجة، تعرّف على خدمة الدروس الخصوصية في البرمجة.
خلاصة
مادة عال 111 مو مادة صعبة، لكنها تحتاج ممارسة يومية. البرمجة مثل اي مهارة عملية: كل ما تمرنت اكثر كل ما صرت احسن. لا تكتفي بمشاهدة الشرح، افتح الـ IDE واكتب كود كل يوم حتى لو 30 دقيقة.
تذكّر:
- المتغيرات هي صناديق تخزّن بيانات
- الشروط تخلي برنامجك ياخذ قرارات
- الحلقات تكرر عمليات بدون تكرار في الكود
- الدوال تنظم كودك وتخليه قابل لاعادة الاستخدام
- المصفوفات تخزّن مجموعات بيانات بكفاءة
- النصوص لها دوال جاهزة كثيرة تسهّل عليك التعامل معها
لو فهمت هذي المفاهيم وتمرنت عليها كويس، عال 111 ما راح تكون عقبة. بالعكس، راح تكون البداية الصحيحة لمشوارك في علوم الحاسب بجامعة الملك سعود.
واجب عال 111 ضاغطك والديدلاين قريب؟
فريقنا متخصص في مواد قسم علوم الحاسب بجامعة الملك سعود. ارسل لنا الواجب على واتساب ونرد عليك بعرض سعر خلال ساعة، شرح وحل كامل.
ارسل واجبك الان