1·1

أول برنامج وبنية الكود الأساسية

كل برنامج جافا يبدأ من مكان واحد: الكلاس والميثود الرئيسي. لنفهم الشكل العام أولًا.

تخيّل أن برنامج جافا مثل مدرسة: المدرسة هي class (الكلاس)، وداخلها يوجد مكان محدد يبدأ منه اليوم الدراسي وهو main (الميثود الرئيسي). عندما تشغّل البرنامج، جافا تبحث عن main وتبدأ منه مباشرة.

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

Hello.java
public class Hello {    public static void main(String[] args) {        System.out.println("Hello World!");    }}
جرّب بنفسكاضغط «▶ تشغيل» لتنفيذ البرنامج ورؤية المخرجات فعليًا، واضغط «✎ تعديل» لتغيير الكود ثم أعد تشغيله — التغييرات تُحفظ في الصفحة فقط ولا تؤثر على نسخة زملائك.
اتجاه القراءة — أهم عادة من اليوم الأولاقرأ الكود دائمًا من اليسار إلى اليمين، سطرًا سطرًا من الأعلى إلى الأسفل — عكس عادتك في قراءة العربية. في int age = 17; يأتي النوع أولًا ثم الاسم ثم القيمة، وهذا الترتيب لا يتغير أبدًا.

ماذا يعني كل سطر؟

  • public class Helloننشئ صندوقًا (كلاس) اسمه Hello. يجب أن يطابق اسم الملف: Hello.java
  • { }الأقواس المعقوفة تحدد حدود الكلاس وحدود كل جزء داخله.
  • public static void main(...)هذه هي الميثود الرئيسي — نقطة بداية البرنامج. جافا تبدأ التنفيذ من أول سطر داخلها.
  • public static voidثلاث كلمات تسبق دائمًا كلمة main — معناها الدقيق موضوع متقدم، فاحفظ هذا الشكل كما هو في كل برنامج تكتبه.
  • String[] argsمعلومة جاهزة تكتب بين القوسين كما هي — لن نحتاج تغييرها في هذه الورشة، فلا تشغل بالك بها.
  • System.out.println(...)أمر الطباعة: اعرض ما بداخل الأقواس على الشاشة ثم انزل سطرًا جديدًا.
  • ;كل أمر في جافا ينتهي بفاصلة منقوطة. نسيانها أشهر خطأ عند المبتدئين!

جرب بنفسك — اضغط على أي سطر لترى دوره

public class Hello {public static void main(String[] args) {        System.out.println("Hello World!");    }}
اضغط على أي سطر من البرنامج أعلاهسيُظلَّل السطر ويظهر هنا شرح دوره — جرّب بالترتيب من الأعلى كما تقرأ الكود.

ماذا يحدث عند الضغط على «تشغيل»؟

  • تبحث جافا عن main وتقف عند أول سطر داخل أقواسها { }.
  • تنفّذ الأسطر واحدًا تلو الآخر من الأعلى إلى الأسفل — لا تتخطى أي سطر.
  • عند الوصول إلى القوس الختامي } ينتهي البرنامج وتظهر المخرجات.
ملاحظةالأسطر التي تبدأ بـ // تعليقات — جافا تتجاهلها، ونستخدمها لشرح الكود لأنفسنا ولمن يقرأه.
انتبهحرف الـ H في Hello كبير، وفي اسم الملف يجب أن يكون كبيرًا أيضًا. جافا حساسة لحالة الأحرف (Case Sensitive).
اختبر نفسك · +5 نقاط
ما نتيجة System.out.println(5 + 3); ؟
اختبر نفسك ٢ · حتى +5 نقاط
أي سطر طباعة مكتوب بشكل صحيح تمامًا؟
اختبر نفسك ٣ · حتى +5 نقاط
اسم الكلاس في برنامجك هو Hello — ما اسم الملف الصحيح الذي يُحفظ به؟
1·2

ميثود الطباعة

نافذتك لرؤية ما يحدث داخل البرنامج — كل ما تطبعه يظهر على الشاشة.

لدينا شكلان رئيسيان من ميثود الطباعة:

  • System.out.println(...) — تطبع النص ثم تنزل سطرًا جديدًا (ln اختصار line).
  • System.out.print(...) — تطبع النص وتبقى في نفس السطر.
الميثودتنزل سطرًا جديدًا؟مثال على المخرجات
println("Hello")نعم — كل استدعاء في سطر مستقلHello⏎
print("Hello")لا — تلتصق بطبعة الاستدعاء التاليHello (no newline)

شغّل هذا المثال وقارن الطريقتين على نفس الكلمات — الفرق يظهر بوضوح في عدد الأسطر:

PrintVsPrintln.java
public class PrintVsPrintln {    public static void main(String[] args) {        // println: each word on its own line        System.out.println("Hello");        System.out.println("World");        // print: both words stick on one line        System.out.print("Hello");        System.out.print(" World");    }}
اقرأ المخرجاتالناتج ثلاثة أسطر: سطران من println، ثم سطر واحد مشترك من print + print. لاحظ المسافة البادئة داخل النص " World" — لأن print لا تضيف مسافة تلقائيًا بين الطبعات.
PrintDemo.java
public class PrintDemo {    public static void main(String[] args) {        System.out.println("Hello");        System.out.print("I am a student");        System.out.println(" in the Java workshop");        System.out.println("The result of 2 + 3 is: " + (2 + 3));    }}

توقّع قبل أن تشغّل

اقرأ الكود أعلاه وحاول تخمين ماذا سيظهر على الشاشة قبل الضغط على «▶ تشغيل» — ثم قارن توقعك بالنتيجة.

  • كل println تبدأ سطرًا جديدًا — فتظهر Hello في سطر مستقل.
  • أما print فتبقى في مكانها — لذلك تلتصق "I am a student" و" in the Java workshop" معًا في السطر الثاني.
  • الجملة الأخيرة تدمج نصًا مع ناتج عملية حسابية بإشارة +: "The result of 2 + 3 is: " + (2 + 3) فتطبع: The result of 2 + 3 is: 5
تلميحلطباعة سطر فارغ استخدم System.out.println(); بدون أي شيء داخلها.

الدمج: التصاق النصوص بإشارة +

عندما تضع إشارة + بين قيمتين يفحص جافا طرفيها: إذا كان أحدهما نصًا فلن يحسب شيئًا — بل يلصق القيمتين جنبًا إلى جنب في نص واحد. وإذا كان الطرفان أرقامًا فعلًا، يجمعهما حسابًا. وعند تتابع عدة إشارات + يُقرأ التعبير من اليسار إلى اليمين، فيبدأ الالتصاق من أول إشارة يكون أحد طرفيها نصًا. لهذا تستطيع بناء جملة كاملة من قطع صغيرة:

"Age: " نص + 17 رقم ➡ "Age: 17" نص واحد كل + تفحص طرفيها: إذا كان أحدهما نصًا صارت «لاصقًا» ويُقرأ التعبير من اليسار — فالأرقام التي تسبق أول نص تُجمع أولًا
الدمج: نص + أي شيء = نص واحد ملتصق

شاهد الدمج خطوة بخطوة في الدرس 3·1

التعبيرالناتجلماذا؟
"مرحبا " + "سارة"مرحبا سارةنص + نص يلتصقان مباشرة
"العمر: " + 17العمر: 17الرقم يُحوَّل تلقائيًا إلى نص ثم يُلصق
"17" + 5175النص أولًا — لصق لا جمع!
5 + "17"517يُقرأ من اليسار: يلتصق 5 بالنص قبل أي حساب
1 + 2 + "a"3aالطرفان الأولان رقمان فيُجمعان أولًا (3)، ثم يلتصق النص — الالتصاق يبدأ عند أول نص فقط
"الناتج: " + (2 + 3)الناتج: 5الأقواس تجبر الحساب على الانتهاء قبل الالتصاق
MergeDemo.java
public class MergeDemo {    public static void main(String[] args) {        String name = "Sara";        int age = 17;        System.out.println("Name: " + name);              // Name: Sara        System.out.println("Next year: " + (age + 1));    // Next year: 18 — الأقواس جمعت أولًا        System.out.println("Without brackets: " + age + 1);  // Without brackets: 171 — التصاق!        System.out.println("Sum = " + (2 + 3) + " not " + 2 + 3); // Sum = 5 not 23    }}
انتبه — القاعدة الذهبيةاقرأ التعبير من اليسار إلى اليمين: أول ما يقابل نصًا يبدأ الالتصاق ولا يتوقف بعده. إذا أردت جمع الأرقام أولًا ضعها بين قوسين ( ) — كما في المثالين الأخيرين أعلاه، حيث فرّقت الأقواس بين 5 و23!
انتبهالنصوص دائمًا بين علامتي تنصيص مزدوجتين " " — كتابة System.out.println(hello); بدونهما خطأ، لأن جافا لن تعرف أن hello نص وليست اسم متغير.
اختبر نفسك · +5 نقاط
إذا كتبت أربع جمل println متتالية، أين ستظهر المخرجات؟
اختبر نفسك ٢ · حتى +5 نقاط
ما ناتج System.out.println("Age: " + 17 + 1); ؟
اختبر نفسك ٣ · حتى +5 نقاط
أي من الأسطر التالية سيرفضه المترجم؟
1·3

إنشاء المتغيرات

المتغير صندوق عليه ملصق اسم — تخزن فيه قيمة وتغيّرها وقتما تشاء.

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

اقرأ هذا السطر كأنه جملة عربية: int age = 17; تعني: «أنشئ صندوقًا نوعه int اسمه age وضع فيه الرقم 17». أما السطر الخامس في المثال بالأسفل (age = 18;) فيعني فقط: «خذ صندوق age الموجود وضع فيه قيمة جديدة».

كل متغير صندوق: اسمه على الملصق وقيمته بالداخل age 17 int — أرقام صحيحة name "Sara" String — نصوص gpa 4.75 double — أرقام عشرية السطر ⁦age = 18;⁩ لا يصنع صندوقًا جديدًا — يستبدل فقط ما بداخله
تشبيه المتغير: صندوق عليه ملصق الاسم، وقيمته بالداخل
Variables.java
public class Variables {    public static void main(String[] args) {        int age = 17;             // a box for whole numbers        String name = "Sara";     // a box for text        double gpa = 4.75;        // a box for decimal numbers        age = 18;  // changing the variable's value        System.out.println("Name: " + name);        System.out.println("Age: " + age);        System.out.println("GPA: " + gpa);    }}

قواعد تسمية المتغيرات

  • يبدأ الاسم بحرف (مثل age) أو _ أو $، ولا يبدأ برقم أبدًا.
  • بدون مسافات داخل الاسم: استخدم studentName بدلًا من student name.
  • لا تستخدم كلمات محجوزة في جافا مثل class أو public.
  • لا تعرّف نفس الاسم مرتين في البرنامج — لكل صندوق اسم واحد فقط.
  • اختر اسمًا يصف المحتوى: age أفضل من x.
الاسمالحكمالسبب
studentName✓ ممتازيصف المحتوى ويتبع نمط camelCase: كلمة أولى صغيرة، وكبير أول حرف مما يليها
1name✗ مرفوضيبدأ برقم — الأسماء يجب أن تبدأ بحرف أو _ أو $، وسيرفضه المترجم بخطأ
s_n✗ غير معبّرمقبول نحويًا لكنه غير مقروء — من يقرأه لن يفهم أنه اسم الطالب
تجربة سريعةافتح «✎ تعديل» على مثال المتغيرات أعلاه واكتب int 1name = 5; ثم «▶ تشغيل» — لاحظ أن رسالة الخطأ لا تتردد: الاسم الذي يبدأ برقم غير قانوني في جافا.
انتبهجافا حساسة لحالة الأحرف: age و Age متغيران مختلفان تمامًا!

الكلمات المحجوزة — أسماء لا يجوز استخدامها

لغة جافا «احتفظت» لنفسها بمجموعة كلمات لتبني بها جملها — لكل منها مهمة محددة في البرنامج، ولا يجوز أن تستخدمها اسمًا لمتغير أو ميثود. لاحظ أنك رأيت كل هذه الكلمات بالفعل في أمثلة الدروس:

publicclassstaticvoid intdoublecharboolean finalifelsewhile doforreturnbreak continuenewtruefalse

هذه هي الكلمات التي تحتاجها في الورشة — أما جافا الكاملة ففيها نحو 50 كلمة محجوزة إضافية ستقابلها تدريجيًا.

كيف أتعرّف عليها في المحرر؟لاحظ تلوين المحرر أعلاه: الكلمات المحجوزة تظهر بلون ذهبي غامق دائمًا. إذا كتبت اسم متغير فتلون تلقائيًا بهذا اللون، فاعلم أنك اصطدمت بكلمة محجوزة واختر اسمًا آخر — المترجم سيرفضها برسالة واضحة.
تلميحبعد تعريف الصندوق يمكنك «قراءة» محتواه في أي سطر لاحق — اضغط زر «⏭ تدريجي» أعلى المثال وراقب قيمة age وهي تتغير من 17 إلى 18 أمام عينيك.

منشئ المتغير — ابنِ الجملة بنفسك

قبل أن تكتب الكود حرًّا، تدرّب على ترتيب البنية هنا: اختر النوع، اكتب اسمًا، اكتب قيمة تطابق النوع، ثم اضغط «ابنِ الجملة». سيصحح لك المنشئ أي خطأ فورًا.

ركّب جملة تعريف متغير:
=
ستظهر جملتك هنا…

تدرّب قبل التمرين — ثلاثة أسئلة سريعة

١) أي سطر يُنشئ متغيرًا صحيحًا؟
٢) بعد السطرين int age = 17; ثم age = 18; — ما قيمة age الآن؟
٣) أين الخطأ في السطر: int 2name = 5; ؟
اختبر نفسك · +5 نقاط
أي سطر يعرّف متغير العمر بشكل صحيح؟
اختبر نفسك ٢ · حتى +5 نقاط
ما ناتج هذا الكود؟
String name = "Sara";
int age = 17;
age = 18;
System.out.println(name + " " + age);
اختبر نفسك ٣ · حتى +5 نقاط
ما معنى علامة = في السطر int age = 17; ؟
1·4

المتغير الثابت (final)

أحيانًا نريد صندوقًا يُغلق بقفل — قيمة تُكتب مرة واحدة ولا تتغير أبدًا.

نضيف الكلمة المحجوزة final قبل تعريف المتغير. القيمة تُعيَّن مرة واحدة فقط، وأي محاولة لتغييرها لاحقًا تُنتج خطأ في الترجمة — وهذا يحمينا من الأخطاء غير المقصودة.

تخيّل أن برنامجك يستخدم سعر التذكرة في عشرة أسطر مختلفة — لو عرّفته ثابتًا باسم TICKET_PRICE، فعند تغيّر السعر تعدّله في مكان واحد، ويمنعك جافا من تغييره بالخطأ في مكان آخر.

final = قفل على الصندوق DAYS_IN_WEEK 7 تُفتح لحظة التعريف فقط — تُوضع القيمة داخلة ثم يُقفل بينما المتغير العادي بلا قفل — تبدل ما بداخله متى شئت
تشبيه الثابت: صندوق عليه قفل — القيمة تدخل مرة ولا تخرج

لماذا لا نكتفي بمجرد «عدم تغييره»؟

قد تقول: سأعرّف المتغير عاديًا وأتعهد أنا ألا أغيّره! لكن البرامج الكبيرة تُكتب على أسابيع وتُعدَّل بأيدٍ كثيرة — والتعهد وحده ينكسر. final تحوّل القاعدة من «اتفاق» إلى ضمان يفرضه المترجم نفسه: لو خالفها أحد — حتى أنت بعد ستة أشهر — يتوقف البرنامج برسالة خطأ واضحة قبل أن يعمل، فيُكتشف الخطأ فورًا بدل أن يسبب نتائج خفية خاطئة.

Constants.java
public class Constants {    public static void main(String[] args) {        final double PI = 3.14159;   // constant: its value never changes        final int DAYS_IN_WEEK = 7;        double radius = 5.0;        double area = PI * radius * radius;  // circle area        // PI = 3.14;  ← error! cannot change a constant        System.out.println("Days in a week: " + DAYS_IN_WEEK);        System.out.println("Circle area: " + area);    }}

متى نستخدم الثوابت؟

  • قيم ثابتة معروفة: PI، عدد أيام الأسبوع، سرعة الضوء.
  • قيم تحدد مرة واحدة في بداية البرنامج ولا يجوز لأحد تعديلها بالخطأ — مثل سعر التذكرة أو الحد الأقصى للاعبين MAX_PLAYERS.
  • قيم «سياسة» قد تتغير مع الوقت لكنها ثابتة أثناء تشغيل البرنامج: نسبة الضريبة TAX_RATE، درجة النجاح PASSING_GRADE، رسالة ترحيب موحدة.

جرّب كسر القفل بنفسك

في المثال أعلاه يوجد سطر معلّق: // PI = 3.14; ← error! — افتح «✎ تعديل»، واحذف علامتي التعليق // من بدايته واضغط «▶ تشغيل». سيمنعك المترجم برسالة تقول إن PI ثابت لا يتغيّر، وستشاهد السطر المخالف مظللًا بالأحمر في المحرر — هذا بالضبط ما تعنيه الحماية: الخطأ يُقفل في مكانه قبل أن يصل إلى شاشة الطالب.

عرف متعارف عليهنكتب أسماء الثوابت بأحرف كبيرة مع شرطة سفلية بين الكلمات: DAYS_IN_WEEK — لتمييزها بلمحة عن المتغيرات العادية.
اختبر نفسك · +5 نقاط
عرّفنا final int MAX = 100; ثم كتبنا في سطر لاحق MAX = 90; — ماذا يحدث؟
اختبر نفسك ٢ · حتى +5 نقاط
ما ناتج هذا الكود؟
final int PRICE = 5;
int qty = 3;
System.out.println("Total: " + (PRICE * qty));
اختبر نفسك ٣ · حتى +5 نقاط
ما الاسم الأنسب (حسب العرف) لثابت يمثل سعر التذكرة؟
1·5

أنواع بيانات المتغيرات

لكل صندوق حجم ومادة — اختيار النوع الصحيح يوفر الذاكرة ويمنع الأخطاء.

النوعما يخزنهمثال
intأرقام صحيحة بدون كسورint age = 17;
doubleأرقام عشرية (بكسور)double price = 9.99;
charحرف واحد فقط بين علامتين تنصيص مفردتينchar grade = 'A';
booleanقيمة منطقية: صواب أو خطأboolean passed = true;
Stringنص (كلمة أو جملة) بين علامتين تنصيص مزدوجتينString name = "Sara";

كيف أختار النوع الصحيح؟

اسأل نفسك هذا السؤال عن القيمة التي تريد تخزينها، والإجابة تحدد النوع مباشرة:

  • رقم صحيح بدون كسور (عمر، عدد طلاب)؟ ← int
  • رقم فيه كسر (سعر، معدل، طول)؟ ← double
  • حرف واحد فقط (تقدير، درجة)؟ ← char
  • الجواب نعم أو لا فقط؟ ← boolean
  • أي شيء آخر: اسم، كلمة، جملة كاملة؟ ← String

بطاقات الأنواع — اقلبها للتعرف عليها

intاضغط للقلب
أرقام صحيحةبدون كسور عشريةint age = 17;
doubleاضغط للقلب
أرقام عشريةتقبل الكسورdouble price = 9.99;
charاضغط للقلب
حرف واحدبين علامتين مفردتينchar grade = 'A';
booleanاضغط للقلب
صواب أو خطأقيمتان فقطboolean passed = true;
Stringاضغط للقلب
نص كاملبين علامتين مزدوجتينString name = "Sara";
DataTypes.java
public class DataTypes {    public static void main(String[] args) {        int students = 32;        double height = 1.72;        char grade = 'A';        boolean isEnrolled = true;        String course = "Java Basics";        System.out.println("Students: " + students);        System.out.println("Height: " + height + " m");        System.out.println("Grade: " + grade);        System.out.println("Enrolled in course? " + isEnrolled);        System.out.println("Course name: " + course);        // try the difference between a number-like String and a real number:        System.out.println("Text with a number glued on: " + "17" + 5);   // result: 175        System.out.println("Number actually added: " + (17 + 5));     // result: 22    }}
انتبهchar يستخدم علامة تنصيص مفردة 'A' بينما String يستخدم مزدوجة "A". الخلط بينهما خطأ ترجمة شائع جدًا.
انتبهالقيمة "17" نص وليست رقمًا حتى لو بدت رقمًا! لو جمعتها مع رقم فستُلصق به بدل أن تُجمع: "17" + 5 تعطي 175، بينما 17 + 5 تعطي 22. وستجد سطرين جاهزين لهذه التجربة في نهاية المثال أعلاه — شغّله وشاهد الفرق بنفسك.
انتبه — فقدان الدقة يسير في اتجاه واحدالتحويل من دون كسر إلى مع كسر آمن: double price = 5; يعمل وتصبح القيمة 5.0. أما العكس فمرفوض لأنه يفقد دقة: int x = 9.7; يوقف المترجم البرنامج بخطأ — فأي رقم ستخزنه في x بعد رمي الكسر؟ 9 أم 10؟ جافا ترفض أن تقرر عنك، وتطلب منك التصريح: إما int x = 9; أو double x = 9.7;. جرّب السطرين في المحرر أعلاه وراقب الفرق بين الرفض والقبول.
تلميحلاحظ أن String يبدأ بحرف كبير دائمًا، بينما بقية الأنواع بأحرف صغيرة — لأن String ليس نوعًا بدائيًا بل كلاس جاهز في جافا.
اختبر نفسك · +5 نقاط
ما نتيجة System.out.println("17" + 5); ؟
اختبر نفسك ٢ · حتى +5 نقاط
أي سطر من الأسطر التالية يرفضه المترجم؟
اختبر نفسك ٣ · حتى +5 نقاط
أي نوع تختاره لتخزين إجابة: هل الطالب مسجّل في الدورة (نعم أو لا)؟
★

تحدي: أين الخطأ؟

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

المقطع ١: هذا البرنامج لن يُترجم. أين الخطأ؟

public class Test { public static void main(String[] args) { int age = 16 System.out.println("My age: " + age); } }

قارن نهايات الأسطر في البرنامج: بعضها يحتاج إشارة ختامية نسيتها هنا.

المقطع ٢: خطأ في نوع البيانات. أين؟

public class Test2 { public static void main(String[] args) { char grade = "A"; System.out.println(grade); } }

تذكّر الفرق بين علامتي التنصيص في الدرس الخامس.

المقطع ٣: البرنامج لن يُترجم من الأساس. أين الخطأ؟

public class Test3 { public static void main(String[] args) { final int MAX = 100; MAX = 90; System.out.println(MAX); } }

اسأل نفسك: ماذا تعني الكلمة التي قبل نوع المتغير في السطر الثالث؟

لماذا هذا التحدي مهم؟المبرمج المحترف ليس من لا يخطئ، بل من يقرأ رسالة الخطأ ويعرف أين يبحث — انسخ هذه المقاطع إلى محرر أي درس في هذه الوحدة وشغّلها لترى رسائل الخطأ بنفسك.
🔍

اقرأ الخطأ

المهارة الأهم عند المبتدئين: قراءة رسالة الخطأ قبل الهرعة لتغيير الكود. في المقطعين التاليين البرنامج لن يعمل — مهمتك أولًا أن تترجم رسالة الخطأ العربية (أي سطر؟ ما نوع الخطأ؟) قبل أن تصلحه بنفسك.

المقطع ١: شغّل الكود كما هو واقرأ الرسالة بتمعّن — في أي سطر توقّف المترجم؟ وماذا كان يتوقع أن يرى؟

Bug1.java
public class Bug1 {    public static void main(String[] args) {        int age = 16        System.out.println("My age: " + age);    }}
الترجمة والإصلاحالرسالة: line 4: expected ";" — أي أن المترجم وصل إلى بداية السطر 4 بينما ما زال ينتظر نهاية أمر السطر 3: الفاصلة المنقوطة ; ناقصة في نهاية int age = 16. الإصلاح: أضف ; في نهاية السطر الثالث من البرنامج (السطر الذي يعرّف age).

المقطع ٢: هذا البرنامج يستخدم متغيرًا قبل أن يُعرَّف — شغّله ولاحظ أي سطر تشتكي منه الرسالة.

Bug2.java
public class Bug2 {    public static void main(String[] args) {        System.out.println(score);        int score = 10;    }}
الترجمة والإصلاحالرسالة: line 3: cannot find symbol — variable "score" — خطأ نوعه «استخدام قبل التعريف»: الطباعة في السطر 3 تطلب متغيرًا لم يُنشأ صندوقه بعد (تعريفه يأتي في السطر 4). جافا تقرأ من الأعلى إلى الأسفل ولا تعرف إلا ما عُرّف قبل السطر الحالي. الإصلاح: انقل تعريف int score = 10; قبل سطر الطباعة.
لماذا لا يوجد زر تحقق هنا؟لأن المهارة الحقيقية هي أن تفهم رسالة الخطأ بنفسك — هذه هي المهارة التي ستستخدمها في كل برنامج تكتبه خارج هذه الورشة. المكافأة هنا أن تضغط «▶ تشغيل» وتفهم لماذا فشل البرنامج قبل أن تعرف الإصلاح.
✎

تمارين الوحدة ١

تمارين على دروس الوحدة الأولى (بنية الكود، الطباعة، المتغيرات، الثوابت، الأنواع). كل تمرين أمامه كود ناقص: اضغط «✎ تعديل»، اكتب الكود المطلوب مكان التعليقات، اضغط «✔ حفظ» ثم «▶ تشغيل» — وقارن نتيجتك بالهدف المكتوب أسفل كل تمرين.

أمامك برنامج يطبع بطاقة تعريف طالب، لكن تعريف المتغيرات الثلاثة ناقص. أكملها: اسم الطالب name كنص، وعمره age كرقم صحيح، ومعدله gpa كرقم عشري.

Exercise1.java
public class Exercise1 {    public static void main(String[] args) {        // 1) define a String variable name with your name        // 2) define an int variable age with your age        // 3) define a double variable gpa with your GPA        System.out.println("Name: " + name);        System.out.println("Age: " + age);        System.out.println("GPA: " + gpa);    }}
الهدف — الشكل المتوقع
Name: (your name)
Age: (your age)
GPA: (your GPA)
تلميحاستخدم نفس الأسماء المذكورة في التعليقات حتى تعمل أسطر الطباعة الجاهزة.

سعر لتر الوقود ثابت ويساوي 2.05. أكمل البرنامج: عرّف الثابت LITER_PRICE باستخدام final، ثم احسب تكلفة تعبئة 40 لترًا في المتغير total (السعر مضروبًا في عدد اللترات).

Exercise2.java
public class Exercise2 {    public static void main(String[] args) {        // 1) define the constant LITER_PRICE = 2.05 using final        int liters = 40;        // 2) compute the total cost in a double variable total        System.out.println("Total cost: " + total + " SAR");    }}
الهدف
Total cost: 82.0 SAR
تلميحاسم الثوابت يُكتب بأحرف كبيرة، والقيمة تُكتب مرة واحدة فقط — جرّب تغيير liters إلى 60 بعد نجاحك وشاهد النتيجة.

أكمل سطرين: عرّف متغيرًا منطقيًا isOnline قيمته true، ومتغيرًا من نوع char اسمه level قيمته 'B'.

Exercise3.java
public class Exercise3 {    public static void main(String[] args) {        // 1) define a boolean variable isOnline with the value true        // 2) define a char variable level with the value 'B'        System.out.println("Online? " + isOnline);        System.out.println("Level: " + level);    }}
الهدف
Online? true
Level: B
تلميحقيم boolean تُكتب بلا تنصيص: true أو false، أما قيمة char فتُكتب بين علامتي تنصيص مفردتين مثل 'B'.

الميثود الرئيسي فارغ تمامًا! اكتب بنفسك ثلاث جمل طباعة تُخرج الجملة التالية في سطر واحد — استخدم print للجزأين الأولين وprintln للأخيرة.

Exercise4.java
public class Exercise4 {    public static void main(String[] args) {        // write 3 print statements that output the sentence on one line    }}
الهدف
My name is Laila and I am 15 years old
تلميحتذكر: print لا تنزل سطرًا جديدًا، أما println فتنزل بعد الطباعة — الترتيب يصنع الفرق.