الكلية الجامعية للعلوم التطبيقيةبرمجة 1
English
المحاضرة 3 · 100 دقيقة

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

كيف يتذكّر البرنامج القيم ويغيّرها ويستخدمها؟

إعداد: م. بدر الدين محمد الحليمي · م. محمد زهير كحيل

في نهاية هذه المحاضرة ستكون قادرًا على

  1. تشرح مفهوم المتغير باستخدام مثال الصندوق
  2. تصرّح عن متغير، وتسند إليه قيمة، ثم تستخدمه
  3. تختار نوع البيانات المناسب لكل قيمة
  4. تستخدم العوامل لحساب القيم وتحديثها
  5. تسمّي المتغيرات وفق قواعد Java، وتصحّح أخطاء التسمية
محتويات المحاضرة
  1. كل تطبيق يتذكّر قيمًا تتغير أثناء تشغيله
  2. المتغير صندوق له اسم ويحمل قيمة واحدة
  3. ثلاث خطوات للتعامل مع أي متغير
  4. خمسة أنواع بيانات تغطي معظم برامجنا الأولى
  5. في Java ثمانية أنواع بدائية، لكل منها حجم ثابت
  6. البرنامج الأول: خزّن رقمين واجمعهما
  7. القيمة تتغير والاسم يبقى: تتبّع score سطرًا سطرًا
  8. أسماء المتغيرات تتبع قواعد يفرضها المترجم
  9. المترجم يرفض قيمة من نوع خاطئ
  10. تحدي التبديل: متغير ثالث يحفظ القيمة
  11. العلامة + تصل النصوص في نص واحد جديد
  12. خمسة عوامل حسابية
  13. ++ و-- يغيّران القيمة بمقدار واحد، قبل الاستخدام أو بعده
  14. += و-= يحدّثان المتغير بخطوة قصيرة
  15. التمرين النهائي: برنامج يطبع بطاقة طالب
  16. أسئلة المراجعة
الجزء الأول: المتغيرات وأنواعها

كل تطبيق يتذكّر قيمًا تتغير أثناء تشغيله

لعبة على الجوال

نقاطك تزيد مع كل مرحلة تنهيها وتبقى ظاهرة أعلى الشاشة.

الآلة الحاسبة

الزر M+ يحفظ رقمًا لتستخدمه بعد عدة عمليات.

متجر إلكتروني

يتغير إجمالي السلة في كل مرة تضيف فيها منتجًا أو تحذفه.

المتغير صندوق له اسم ويحمل قيمة واحدة

firstNumber2int
secondNumber3int
  • يحتاج البرنامج إلى حفظ القيم أثناء تشغيله.
  • الرقم وحده ليس متغيرًا؛ المتغير اسم يحمل الرقم.
  • الصندوق يحمل قيمة واحدة فقط في كل مرة.
  • المتغيرات ليست للأرقام فقط.
الجزءمعناه
intنوع البيانات: عدد صحيح
firstNumberاسم المتغير
2القيمة المخزنة فيه

ثلاث خطوات للتعامل مع أي متغير

التصريح

احجز صندوقًا وأعطه نوعًا واسمًا. لا يحمل قيمة بعد.

int age;
الإسناد

ضع قيمة في الصندوق باستخدام =، واقرأها «تأخذ القيمة».

age = 19;
الاستخدام

اكتب اسم المتغير، فيقرأ البرنامج القيمة المخزنة فيه.

println(age);

جرّب الخطوات الثلاث

شغّل البرنامج، ثم اضغط «تتبّع سطرًا سطرًا» وشاهد الصندوق يظهر ويمتلئ. غيّر العمر وشغّله مجددًا.

public class Age {
    public static void main(String[] args) {
        int age;
        age = 19;
        System.out.println(age);
    }
}
الناتج
19

الاسم يسار العلامة

أصلح السطر حتى يعمل البرنامج ويطبع 19.

public class Age {
    public static void main(String[] args) {
        int age;
        19 = age;
        System.out.println(age);
    }
}
رسالة المترجمunexpected type
أظهر التصحيح
public class Age {
    public static void main(String[] args) {
        int age;
        age = 19;
        System.out.println(age);
    }
}
الناتج
19

لماذا؟ يجب أن يكون على يسار = صندوق يستقبل القيمة، والرقم 19 ليس صندوقًا.

خمسة أنواع بيانات تغطي معظم برامجنا الأولى

النوعيحملمثالالعلامة المميزة
intعدد صحيح19بدون فاصلة عشرية
doubleعدد عشري3.75يحتوي على فاصلة عشرية
charحرف واحد'A'بين علامتي تنصيص مفردتين
Stringنص"Sara"بين علامتي تنصيص مزدوجتين
booleanصح أو خطأtrueقيمتان فقط

الأنواع الخمسة في برنامج واحد

public class Types {
    public static void main(String[] args) {
        int age = 19;
        double gpa = 3.75;
        char grade = 'A';
        String name = "Sara";
        boolean passed = true;

        System.out.println(name);
        System.out.println(age);
        System.out.println(gpa);
        System.out.println(grade);
        System.out.println(passed);
    }
}
الناتج
Sara
19
3.75
A
true

أي نوع يناسب عدد الطلاب في الصف، مثل 32؟

أي نوع يناسب سعر كتاب، مثل 12.5؟

أي نوع يناسب «هل دفع الطالب الرسوم؟»

في Java ثمانية أنواع بدائية، لكل منها حجم ثابت

نستخدم في هذا المساق int وdouble وchar وboolean؛ والبقية تخزن النوع نفسه من القيم في ذاكرة أكبر أو أصغر.

النوعالحجمالمدى أو أمثلة
booleanقيمتان منطقيتانtrue, false
byte8 بت-128 … 127
char16 بتحرف Unicode واحد: 'a'
short16 بت-32,768 … 32,767
int32 بتقرابة 2.1 مليار، موجبًا أو سالبًا
long64 بت10L
float32 بتقرابة 7 أرقام معنوية: 3.14f
double64 بتقرابة 16 رقمًا معنويًا: 3.14

ماذا يحدث حين يمتلئ الصندوق؟

لكل نوع حد أقصى. أضف 1 إلى أكبر قيمة في int، ثم غيّر النوع إلى long وأضف الحرف L إلى العدد.

public class Limits {
    public static void main(String[] args) {
        int biggest = 2147483647;
        System.out.println(biggest);
        System.out.println(biggest + 1);
    }
}
الناتج
2147483647
-2147483648
الجزء الثاني: لنكتب الكود

البرنامج الأول: خزّن رقمين واجمعهما

  1. اكتب الأسطر داخل main
  2. توقّع الناتج قبل التشغيل
  3. شغّلفي المختبر اضغط F6، وهنا زر «تشغيل» أو Ctrl+Enter.
  4. غيّر القيمتين وشغّل مرة أخرى
package firstprogram;

public class FirstProgram {
    public static void main(String[] args) {
        int firstNumber = 2;
        int secondNumber = 3;
        int sum = firstNumber + secondNumber;
        System.out.println(sum);
    }
}
الناتج
5

علامات التنصيص تفصل اسم المتغير عن النص. ماذا يطبع؟

public class Names {
    public static void main(String[] args) {
        int sum = 5;
        System.out.println(sum);
        System.out.println("sum");
        System.out.println("Sum = " + sum);
    }
}
أظهر الناتج
الناتج
5
sum
Sum = 5

لماذا؟ دون علامات تنصيص يطبع البرنامج قيمة المتغير، وداخلها يطبع الكلمة كما هي. والعلامة + تصل النص بالمتغير.

القيمة تتغير والاسم يبقى: تتبّع score سطرًا سطرًا

ما قيمة score في النهاية؟

public class Score {
    public static void main(String[] args) {
        int score = 10;
        score = score + 5;
        score = score * 2;
        System.out.println(score);
    }
}
أظهر الناتج
الناتج
30

لماذا؟ السطر الثاني ليس معادلة رياضية: نحسب الجانب الأيمن أولًا (10 + 5)، ثم نضع النتيجة في الصندوق ويُمحى القديم. ثم 15 × 2 = 30.

أسماء المتغيرات تتبع قواعد يفرضها المترجم

الاسمالحكمالسبب
2ndNumberغير مسموحيبدأ برقم
my ageغير مسموحفيه مسافة
intغير مسموحكلمة محجوزة في Java
total%غير مسموحالرمز % غير مسموح في الأسماء
secondNumberمسموح وواضحيبدأ بحرف
myAgeمسموح وواضحكلمتان موصولتان
totalPriceمسموح وواضحيصف ما يخزنه
Ageمسموح، لكن تجنّبهاسم مختلف عن age، لكنه يخالف عرف camelCase
total$مسموح، لكن تجنّبه$ و_ مسموحان، لكن المبرمجين لا يستخدمونهما عادة في الأسماء

أصلح اسم المتغير

public class Naming {
    public static void main(String[] args) {
        int 2ndNumber = 7;
        System.out.println(2ndNumber);
    }
}
رسالة المترجمnot a statement
أظهر التصحيح
public class Naming {
    public static void main(String[] args) {
        int secondNumber = 7;
        System.out.println(secondNumber);
    }
}
الناتج
7

لماذا؟ لا يبدأ الاسم برقم. يقرأ المترجم 2 عددًا، فلا يفهم بقية السطر، ولذلك تبدو الرسالة بعيدة عن السبب الحقيقي.

المترجم يرفض قيمة من نوع خاطئ

تجربة مخطط لها

وضعنا العمر داخل علامتي تنصيص. لاحظ الخط الأحمر في المحرر، ثم أصلح السطر.

public class Age {
    public static void main(String[] args) {
        int age = "19";
        System.out.println(age);
    }
}
رسالة المترجمincompatible types: String cannot be converted to int
أظهر التصحيح
public class Age {
    public static void main(String[] args) {
        int age = 19;
        System.out.println(age);
    }
}
الناتج
19

لماذا؟ النوع يحدد ما يقبله الصندوق: الصندوق المخصص للأرقام لا يقبل نصًا.

خطأ شائع آخر

استخدمنا المتغير قبل التصريح عنه.

public class Age {
    public static void main(String[] args) {
        System.out.println(age);
        int age = 19;
    }
}
رسالة المترجمcannot find symbol
أظهر التصحيح
public class Age {
    public static void main(String[] args) {
        int age = 19;
        System.out.println(age);
    }
}
الناتج
19

لماذا؟ يقرأ المترجم البرنامج من الأعلى إلى الأسفل، فلا يعرف الاسم age قبل سطر التصريح عنه.

تحدي التبديل: متغير ثالث يحفظ القيمة

تتبّع التبديل

اضغط «تتبّع سطرًا سطرًا» وراقب الصناديق الثلاثة. ثم احذف السطر int temp = a; واكتشف ما يحدث.

public class Swap {
    public static void main(String[] args) {
        int a = 5;
        int b = 9;

        int temp = a;
        a = b;
        b = temp;

        System.out.println(a);
        System.out.println(b);
    }
}
الناتج
9
5
الجزء الثالث: العوامل

العلامة + تصل النصوص في نص واحد جديد

يسمى وصل النصوص بالعلامة + الدمج (concatenation). وتقرأ Java العلامة + من اليسار إلى اليمين، وهنا يكمن الفخ.

توقّع: نص وأرقام

public class Concat {
    public static void main(String[] args) {
        System.out.println("Total: " + 2 + 3);
        System.out.println(2 + 3 + " total");
        System.out.println("Total: " + (2 + 3));
    }
}
أظهر الناتج
الناتج
Total: 23
5 total
Total: 5

لماذا؟ في السطر الأول يصبح "Total: " + 2 نصًا، فيُلصق به 3. في الثاني يُجمع 2 + 3 أولًا لأنهما رقمان. والأقواس في الثالث تفرض الجمع قبل الدمج.

نشاط ثنائي: اطبع اسمك الكامل

صرّح عن متغيرين نصيين firstName وlastName يحملان Sara وAli، ثم اطبع الاسم الكامل بينهما مسافة، باستخدام الدمج.

public class FullName {
    public static void main(String[] args) {
        // Declare firstName and lastName here

    }
}
الناتج المتوقع
Sara Ali
تلميح 1

تحتاج إلى نص بينهما يحوي مسافة واحدة: " ".

الحل
public class FullName {
    public static void main(String[] args) {
        String firstName = "Sara";
        String lastName = "Ali";
        System.out.println(firstName + " " + lastName);
    }
}

خمسة عوامل حسابية

العاملالاسمA = 10, B = 20ملاحظة
+الجمع30يجمع الطرفين
-الطرح-10يطرح الأيمن من الأيسر
*الضرب200يضرب الطرفين
/القسمة0قسمة الأعداد الصحيحة تحذف الكسر
%باقي القسمة10يعطي الباقي

غيّر القيم وتوقّع

غيّر A إلى 17 وB إلى 5، وتوقّع النتائج الخمس قبل التشغيل.

public class Arithmetic {
    public static void main(String[] args) {
        int A = 10;
        int B = 20;
        System.out.println(A + B);
        System.out.println(A - B);
        System.out.println(A * B);
        System.out.println(A / B);
        System.out.println(A % B);
    }
}
الناتج
30
-10
200
0
10

حوّل الثواني إلى دقائق وثوانٍ

المتغير total يحمل 125 ثانية. احسب منه الدقائق والثواني المتبقية باستخدام / و%، ثم اطبعهما كما في الناتج المتوقع.

public class Duration {
    public static void main(String[] args) {
        int total = 125;
        // Work out the minutes and the seconds here

    }
}
الناتج المتوقع
Minutes: 2
Seconds: 5
تلميح 1

في الدقيقة 60 ثانية، وقسمة الأعداد الصحيحة تحذف الكسر: total / 60.

تلميح 2

الثواني المتبقية هي باقي القسمة: total % 60.

الحل
public class Duration {
    public static void main(String[] args) {
        int total = 125;
        int minutes = total / 60;
        int seconds = total % 60;
        System.out.println("Minutes: " + minutes);
        System.out.println("Seconds: " + seconds);
    }
}

++ و-- يغيّران القيمة بمقدار واحد، قبل الاستخدام أو بعده

قبلي: ++x

يضيف واحدًا أولًا، ثم يستخدم القيمة الجديدة. النتيجة: y = 35 وx = 35.

int x = 34;
int y = ++x;
بعدي: x++

يستخدم القيمة القديمة أولًا، ثم يضيف واحدًا. النتيجة: y = 34 وx = 35.

int x = 34;
int y = x++;

تصويت: ماذا يطبع كل سطر؟

public class Vote {
    public static void main(String[] args) {
        int x = 14;
        System.out.println(x++);
        System.out.println(x);
    }
}
أظهر الناتج
الناتج
14
15

لماذا؟ x++ يعطي القيمة القديمة 14 للطباعة، ثم تصبح x مساوية 15.

+= و-= يحدّثان المتغير بخطوة قصيرة

القاعدة: تطبق Java العامل على القيمة القديمة، وتحل النتيجة محلها. و*= و/= تعملان بالطريقة نفسها.

ابدأ بالقيمتين num1 = 4 وnum2 = 8، واكتب num2 على الورق بعد كل سطر.

public class Compound {
    public static void main(String[] args) {
        int num1 = 4;
        int num2 = 8;
        num2 += num1;
        System.out.println(num2);
        num2 -= num1;
        System.out.println(num2);
        num2 *= 3;
        System.out.println(num2);
    }
}
أظهر الناتج
الناتج
12
8
24

لماذا؟ num2 += num1 تعني num2 = num2 + num1، أي 12. ثم نطرح 4 فتصبح 8. ثم نضرب في 3 فتصبح 24.

التمرين النهائي: برنامج يطبع بطاقة طالب

بطاقة الطالب

صرّح عن ثلاثة متغيرات: String name بالقيمة Ahmed، وdouble gpa بالقيمة 3.75، وint courses بالقيمة 5. ثم اطبع كل واحد على سطر كما في الناتج المتوقع.

public class StudentCard {
    public static void main(String[] args) {
        // Declare the three variables, then print them

    }
}
الناتج المتوقع
Name: Ahmed
GPA: 3.75
Courses: 5
تلميح 1

صل النص بالمتغير باستخدام +، مثل: "Name: " + name.

تلميح 2

تحتاج إلى ثلاثة أوامر println.

الحل
public class StudentCard {
    public static void main(String[] args) {
        String name = "Ahmed";
        double gpa = 3.75;
        int courses = 5;
        System.out.println("Name: " + name);
        System.out.println("GPA: " + gpa);
        System.out.println("Courses: " + courses);
    }
}

أسئلة المراجعة

ما الفرق بين التصريح والإسناد؟

أي نوع يناسب درجة حرارة مثل 36.6؟

لماذا يرفض المترجم الاسم 2ndNumber؟

ما قيمة x بعد هذين السطرين؟

public class Review {
    public static void main(String[] args) {
        int x = 4;
        x = x * 3;
        System.out.println(x);
    }
}
أظهر الناتج
الناتج
12

لماذا؟ نحسب الجانب الأيمن بالقيمة القديمة: 4 × 3 = 12.