العمليات الحسابية (Arithmetic)

مقدمة

تحدثنا عن التعبيرات وبعض العلامات الحسابية في درس التعبيرات (مستوى ابتدائي) ويفضل الرجوع له أولاً قبل قراءة هذا الدرس ﻷننا سنستكمل الشرح بالتفصيل وسنتحدث عن التعبيرات الحسابية المتقدمة.

تسمى العلامات باﻹنجليزية Operators، يجب معرفتها ﻷنك ربما تستخدمها مستقبلاً...

العلامات الحسابية

العلامات اﻷساسية

درسنا هذه العلامات من قبل، وهي العلامات الحسابية اﻷساسية...

الاسمالعلامة الحسابية
علامة الجمع+
علامة الطرح-
علامة الضرب*
علامة القسمة/
علامة الجمع+

العلامات الجديدة

الاسمالعلامة الحسابيةالوصف
علامة المتبقي (modulo)%معرفة المتبقي من ناتج قسمة العددين
علامة اﻷُس (Exponentiation)**تكرار ضرب العدد في نفسه (الرفع إلى أُسّ)
علامة الزيادة++زيادة 1 على قيمة العدد
علامة الإنقاص--إنقاص أو طرح 1 من قيمة العدد

علامة المتبقي %

تُستخدم لمعرفة باقي عملية القسمة، فمثلاً إذا قمنا بقسمة 4 / 2 سيكون الناتج 2 لكن تخيل أننا نقوم بقسمة 5/2 كم سيكون الناتج؟ سيكون هناك كسر، أي سيكون هناك باقي من القسمة، والباقي هو 1 ﻷن أقرب عدد من 5 يمكن قسمته على 2 هو 4 ويتبقى 1، وبالتالي 4 % 2 تساوي 0 لكن 5 % 2 تساوي 1 وكذلك 11 % 3 تساوي 2 ﻷن أقرب عدد من 11 يقبل القسمة على 3 هو 9 ويكون الباقي من 11 هو 2

console.log(5%2);
console.log(4%2);
console.log(11%3);
console.log(15%3);
console.log(15%4);
console.log(5%4);
ناتج التشغيل 1
0
2
0
3
1

معرفة هل العدد يقبل القسمة أم ﻻ

يمكن استخدام علامة باقي القسمة % في معرفة هل العدد يقبل القسمة على عدد آخر أم ﻻ، إن كانت تقبل القسمة سيكون الناتج 0 ﻷن في هذه الحالة لن يكون هناك متبقي من القسمة، أما إن كان لا يقبل القسمة سيكون هناك متبقي بالتالي سيكون الناتج أكبر من 0

مثال إنشاء دالة تقوم بإرجاع هل العدد يقبل القسمة على 4 أم ﻻ

function divisibleByFour(num){
  if (num % 4 === 0){
    return true;
  }else{
    return false;
  }
}
console.log(divisibleByFour(8));
console.log(divisibleByFour(6));
console.log(divisibleByFour(9));
console.log(divisibleByFour(4));
ناتج التشغيل true
false
false
true

معرفة العدد زوجي أم فردي

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

اﻷعداد الزوجية هي: 0, 2, 4, 6, 8, 10 ... واﻷعداد الفردية هي: 1, 3, 5, 7, 9, 11 ...

خوارزمية معرفة العدد زوجي أم فردي:

  • إذا كان العدد يقبل القسمة على 2 إذن هو عدد زوجي
  • غير ذلك العدد فردي

مثال دالة تقوم بطباعة "زوجي" إن كان العدد زوجي، و"فردي" إن كان العدد فردي

function evenOrOdd(num){
  if (num % 2 === 0){
    console.log(num + ": زوجي");
  }else{
    console.log(num + ": فردي");
  }
}

evenOrOdd(2);
evenOrOdd(3);
evenOrOdd(4);
evenOrOdd(5);
evenOrOdd(10);
ناتج التشغيل 2: زوجي
3: فردي
4: زوجي
5: فردي
10: زوجي

علامة اﻷُسّ (تكرار الضرب) **

تستخدم في تكرار الضرب، أو رفع العدد لأُس كما في الرياضيات، فمثلاً 32 = 9 يمكن كتابتها برمجياً 3 ** 2 وسيكون ناتج التعبير 9

console.log(3**2);
var n = 2;
var x = n**n; // = 2**2 = 4
console.log(x**n); // = 4**2 = 16
ناتج التشغيل 9
16

علامة اﻷُس ليست موجودة في كل اللغات البرمجية، ولم تكن موجودة في اﻹصدارات القديمة من لغة جافاسكريبت وأضيفت في التحديثات اﻷخيرة للغة، لكننا ذكرناها لتعرف فيمَ تُستخدم إن لاحظتها في أي كود.

دالة تكرار الضرب

يمكننا بنفسنا إنشاء دالة تقوم بنفس دور علامة اﻷُس ** لتكرار الضرب ويمكننا استخدام هذه الدالة في برنامجنا، ولهذا السبب اللغات القديمة لا تحتوي على علامة اﻷس، لأن من الممكن كتابة دالة بسيطة تقوم بنفس الدور!

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

في هذا المثال ننشئ دالة اسمها pow تأخذ مُدخلين، اﻷول هو العدد والثاني هو اﻷُس أو عدد تكرارات الضرب، وتقوم الدالة بإرجاع ناتج العدد اﻷول أُس العدد الثاني باستخدام الحلقات التكرارية

function pow(num, power){
  var result = 1;
  var i = 0;
  while (i < power){
    result = result * num;
    i = i + 1;
  }
  return result;
}

console.log(pow(3, 2));
ناتج التشغيل 9

استخدام هذه العلامات يُعدّ استخداماً للتعبيرات، وبالتالي ينطبق على كل العلامات خصائص التعبيرات البرمجية

والتعبيرات البرمجية كما قلنا يُمكن استخدامها في كثير من المواضع، فيمكن أن تكون قيمة المتغير تعبيراً، ويمكن أن يكون مُدخل الدالة تعبيراً، لذلك يمكنك مثلاً إدخال عملية حسابية لدالة الطباعة كمُدخل: console.log(5%2) ويمكن أن تكون قيمة لمتغير، وهكذا.

علامة الزيادة ++

تستخدم لزيادة 1 على قيمة العدد، لذلك مثلاً في الحلقات التكرارية تُستخدم بكثرة! فأنت في الحلقات التكرارية غالباً تقوم بزيادة قيمة متغير العدّاد بواحد أو إنقاصها بواحد، لذلك هذه العلامة تكون حل أمثل وخيار سريع

تُستخدم هذه العلامة فقط مع المتغيرات، لا يمكن استخدامها مع اﻷعداد مباشرة
var n = 5;
n++;
console.log(n);
ناتج التشغيل 6

n++ في المثال السابق تعتبر بديلاً لكتابة n = n+1

استخدام علامة الزيادة في الحلقات التكرارية

وتُستخدم بكثرة في الحلقات التكرارية، لذلك من اﻵن يفضل أن تستخدمها في أي حلقة تكرارية لزيادة قيمة متغير العداد i

var i = 0;
while (i <= 3){
  console.log(i);
  i++;
}
ناتج التشغيل 0
1
2
3

علامة الإنقاص --

بالضبط مثل علامة الزيادة لكنها تقوم بإنقاص 1 من قيمة العدد

var n = 5;
n--;
console.log(n);
ناتج التشغيل 4

الزيادة واﻹنقاص كتعبيرات

علامة الزيادة وعلامة اﻹنقاص تُعتبر تعبيراً (expression) أي أن المفسر يقوم بترجمتها وإستبدالها بقيمة أخرى راجعة منها، فهي تقوم بإرجاع قيمة بالضبط كما تقوم الدوال بإرجاع قيمة، ولكنها تقوم بإرجاع قيمة المتغير قبل الزيادة أو الإنقاص ثم تقوم بزيادته أو إنقاصه

var x = 1;
console.log(x++);
console.log(x);
ناتج التشغيل 1
2

في المثال السابق console.log(x++) تقوم بطباعة قيمة x الحالية قبل الزيادة فتقوم بطباعة 1، وبعد الطباعة تقوم بإضافة 1 إلى قيمة x، لذلك console.log(x) في السطر التالي تقوم بطباعة 2 ﻷن قيمة x قد تغيرت اﻵن وزادت بمقدار 1

ويُمكن أن تُستخدم كقيمة لمتغير، مثلها مثل أي تعبير آخر!

var x = 1;
var y = x++;
console.log('x: ' + x);
console.log('y: ' + y);
ناتج التشغيل x: 2
y: 1

المثال السابق يقوم بإنشاء متغير اسمه y وقيمته x++ فتكون قيمته تساوي قيمة x القديمة ﻷن التعبير x++ يقوم بإرجاع قيمة x القديمة، وبعدها سيتم تغيير قيمة x وإضافة واحد إليها، فتكون قيمة x الجديدة تساوي 2

الزيادة واﻹنقاص قبل اﻹرجاع

ماذا لو أردنا الزيادة واﻹنقاص أولاً ثم إرجاع القيمة؟ هنا نستخدم ++x و --x، لاحظ أن علامة الزيادة واﻹنقاص أصبحت قبل المتغير، فسيقوم بالزيادة واﻹنقاص أولاً...

var x = 1;
var y = ++x;
console.log('x: ' + x);
console.log('y: ' + y);
ناتج التشغيل x: 2
y: 2

عامل التجميع ()

يُستخدم عامل التجميع لتجميع عملية حسابية معينة أو عدة عمليات، وهو نفسه الموجود بالرياضيات، فمثلاً تخيل أنك تريد ناتج هذه العملية الحسابية 5+5*2 وبالطبع سيتم تنفيذ عملية الضرب أولاً ثم يتم تنفيذ الجمع فيكون الناتج 10+5 = 15 ولكن تخيل أنك تريد تنفيذ عملية الجمع أولاً ثم عملية الضرب، في هذه الحالة سنستخدم عامل التجميع (5+5) * 2 وفي هذه الحالة سيقوم المفسّر بالمرور على ما بداخل عامل التجميع أولاً، فيجمع 5+5 ثم يضربها * 2 فيكون الناتج 10*2 = 20 ولاحظ اختلاف الناتج بين المثالين، لذلك هذا العامل من العوامل المهمة، لاحظ الأمثلة التالية:

console.log(1 + 2 * 3); // 1 + 6
// output: 7

console.log(1 + (2 * 3)); // 1 + 6
// output: 7

console.log((1 + 2) * 3); // 3 * 3
// output: 9

console.log((5 + 5) * 2; // 10 * 2
// output: 20
ناتج التشغيل 7
7
9
20
تحدي البحث في مصفوفة

قم بكتابة دالة تحسب محيط المستطيل، تأخذ مُدخلين، العرض width والطول height وتقوم بإرجاع محيط المستطيل، مع العلم أن محيط المستطيل يساوي (الطول + العرض) * 2

محيط المثلث يستخدم علامة التجميع () ﻷنه يجب حساب مجموع الطول + العرض أولاً ثم ضرب الناتج * 2

المساهمين

وجدت خطأ أو تريد المساهمة في محتوى الدرس؟ عدل الصفحة على Github