المتغيرات وأنواع البيانات
كيف يتذكّر البرنامج القيم ويغيّرها ويستخدمها؟
إعداد: م. بدر الدين محمد الحليمي · م. محمد زهير كحيل
في نهاية هذه المحاضرة ستكون قادرًا على
- تشرح مفهوم المتغير باستخدام مثال الصندوق
- تصرّح عن متغير، وتسند إليه قيمة، ثم تستخدمه
- تختار نوع البيانات المناسب لكل قيمة
- تستخدم العوامل لحساب القيم وتحديثها
- تسمّي المتغيرات وفق قواعد Java، وتصحّح أخطاء التسمية
محتويات المحاضرة
- كل تطبيق يتذكّر قيمًا تتغير أثناء تشغيله
- المتغير صندوق له اسم ويحمل قيمة واحدة
- ثلاث خطوات للتعامل مع أي متغير
- خمسة أنواع بيانات تغطي معظم برامجنا الأولى
- في Java ثمانية أنواع بدائية، لكل منها حجم ثابت
- البرنامج الأول: خزّن رقمين واجمعهما
- القيمة تتغير والاسم يبقى: تتبّع score سطرًا سطرًا
- أسماء المتغيرات تتبع قواعد يفرضها المترجم
- المترجم يرفض قيمة من نوع خاطئ
- تحدي التبديل: متغير ثالث يحفظ القيمة
- العلامة + تصل النصوص في نص واحد جديد
- خمسة عوامل حسابية
++و--يغيّران القيمة بمقدار واحد، قبل الاستخدام أو بعده+=و-=يحدّثان المتغير بخطوة قصيرة- التمرين النهائي: برنامج يطبع بطاقة طالب
- أسئلة المراجعة
كل تطبيق يتذكّر قيمًا تتغير أثناء تشغيله
نقاطك تزيد مع كل مرحلة تنهيها وتبقى ظاهرة أعلى الشاشة.
الزر M+ يحفظ رقمًا لتستخدمه بعد عدة عمليات.
يتغير إجمالي السلة في كل مرة تضيف فيها منتجًا أو تحذفه.
المتغير صندوق له اسم ويحمل قيمة واحدة
- يحتاج البرنامج إلى حفظ القيم أثناء تشغيله.
- الرقم وحده ليس متغيرًا؛ المتغير اسم يحمل الرقم.
- الصندوق يحمل قيمة واحدة فقط في كل مرة.
- المتغيرات ليست للأرقام فقط.
| الجزء | معناه |
|---|---|
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؟
double.أي نوع يناسب «هل دفع الطالب الرسوم؟»
true أو false.في Java ثمانية أنواع بدائية، لكل منها حجم ثابت
نستخدم في هذا المساق int وdouble وchar وboolean؛ والبقية تخزن النوع نفسه من القيم في ذاكرة أكبر أو أصغر.
| النوع | الحجم | المدى أو أمثلة |
|---|---|---|
boolean | قيمتان منطقيتان | true, false |
byte | 8 بت | -128 … 127 |
char | 16 بت | حرف Unicode واحد: 'a' |
short | 16 بت | -32,768 … 32,767 |
int | 32 بت | قرابة 2.1 مليار، موجبًا أو سالبًا |
long | 64 بت | 10L |
float | 32 بت | قرابة 7 أرقام معنوية: 3.14f |
double | 64 بت | قرابة 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
البرنامج الأول: خزّن رقمين واجمعهما
- اكتب الأسطر داخل
main - توقّع الناتج قبل التشغيل
- شغّلفي المختبر اضغط F6، وهنا زر «تشغيل» أو Ctrl+Enter.
- غيّر القيمتين وشغّل مرة أخرى
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);
}
}أسئلة المراجعة
ما الفرق بين التصريح والإسناد؟
int age; تصريح، وage = 19; إسناد، ويمكن جمعهما: int age = 19;.أي نوع يناسب درجة حرارة مثل 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.