اذهب إلى المحتوى

العمليات الحسابية في لغة جو Go


هدى جبور

تُعَدّ الأعداد شائعةً في البرمجة، إذ تُستخدَم لتمثيل أشياء مثل أبعاد حجم الشاشة والمواقع الجغرافية والمال والنقاط ومقدار الوقت الذي مضى في الفيديو ومواضع الصور ضمن الألعاب والألوان من خلال ربطها مع الأرقام …إلخ، كما يرتبط الأداء الفعال في العديد من البرامج ارتباطًا وثيقًا بكيفية إنجاز العمليات الحسابية، لذا تُعَدّ أمرًا مهمًا عليك إتقانه، كما ستجعل منك براعتك في الرياضيات مبرمجًا أفضل لكنها ليست شرطًا أساسيًا، فإذا لم يكن لديك خلفية في الرياضيات، فحاول التفكير في الرياضيات بوصفها أداةً لتحقيق ما ترغب في تحقيقه وطريقةً لتحسين تفكيرك المنطقي.

سنعمل مع أهم نوعين من الأعداد المستخَدمة في لغة جو وهما الأعداد الصحيحة والعشرية:

  • الأعداد الصحيحة: هي أعداد سالبة أو موجبة مثل 1, 0, 1-, … إلخ.
  • الأعداد العشرية هي التي تحتوي فواصل عشرية مثل 9.0, 2.25-, … إلخ.

العوامل الرياضية

العامل operator هو رمز يمثل عملية وغالبًا ما تكون عملية رياضية، فمثلًا العامل + يمثل عملية الجمع الرياضية.

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

العملية الوظيفة
x + y جمع العددين x و y
-------- --------
x - y طرح العددين x و y
-------- --------
x * y ضرب العددين x و y
-------- --------
x / y قسمة العددين x و y
-------- --------
x % y باقي قسمة x على y
-------- --------
x+ ضرب قيمة المتغير بالعدد +1
-------- --------
x- ضرب قيمة المتغير بالعدد -1

سيغطي المقال أيضًا العوامل المركبة التي تكون إحدى مركباتها عامل حسابي مع إشارة اليساوي مثل =+ و =*.

الجمع والطرح

يمكنك إنجاز عمليات الجمع والطرح في لغة جو تمامًا مثل استخدامك للآلة الحاسبة كما في المثال التالي من أجل الأعداد الصحيحة:

fmt.Println(1 + 5)

يكون الخرج كما يلي:

6

يمكنك تهيئة متغيرات تُخزّن تلك القيم ثم تطبع نتيجة جمعها بدلًا من تمرير الأعداد مباشرةً إلى دالة الطباعة:

a := 88
b := 103

fmt.Println(a + b)

يكون الخرج كما يلي:

191

قد يكون العدد الصحيح سالبًا، ففي هذه الحالة نضع إشارة سالب قبله بكل بساطة كما يلي:

c := -36
d := 25

fmt.Println(c + d)

يكون الخرج كما يلي:

-11

الأمر نفسه بالنسبة للأعداد العشرية، إذ يمكنك إنجاز عمليات الجمع كما في المثال التالي:

e := 5.5
f := 2.5

fmt.Println(e + f)

يكون الخرج كما يلي:

8

لاحظ أن الناتج هو عدد بدون فاصلة عشرية، إذ منوقع أنّ الخرج يحتوي على فاصلة عشرية بما أنّ عملية الجمع بين عددين عشريين أي 8.0، والسبب في ذلك هو أن دالة الطباعة تحوِّل الخرج تلقائيًا إلى قيمة صحيحة من خلال إسقاط الفواصل العشرية، ولتجنب حدوث ذلك نستخدِم العنصر النائب 2f.%، إذ تشير f إلى وجود عدد حقيقي و2 إلى إبقاء عددين بعد الفاصلة.

fmt.Printf("%.2f", e + f)

يكون الخرج كما يلي:

8.00

عملية الطرح نفسها كما في الجمع مع استبدال العامل + بالعامل -:

g := 75.67
h := 32.0

fmt.Println(g - h)

يكون الخرج كما يلي:

43.67

لا يمكنك في لغة جو إنجاز عملية حسابية بين عددين من نوعي بيانات مختلفين مثل int و float64 كما في المثال التالي:

i := 7
j := 7.0
fmt.Println(i + j)

سيكون الخرج إشعارًا بعدم تطابق نوعي البيانات كما يلي:

i + j (mismatched types int and float64)

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

يتكون التعبير الرياضي الأحادي Unary Arithmetic Operation من مكوِّن أو عنصر واحد فقط، إذ يمكننا في لغة جو استخدام علامتَي الجمع والطرح على أساس عنصر أحادي مُقترن بقيمة، ولتبسيط الأمر، يُعَدّ إشارة + أو - تتلو قيمة أو متغير (كأنما نضرب -1 أو +1 بمتغير). ستوضّح الأمثلة أكثر:

تشير علامة الجمع على الرغم من عدم استخدامها بصورة شائعة إلى هوية القيمة identity، ويمكننا استخدامها مع القيم الموجبة كما يلي:

i := 3.3
fmt.Println(+i)

سيكون الخرج كما يلي:

3.3

عند استخدام إشارة الجمع مع عدد سالب، فلن تتغير إشارة هذا العدد، أي سيبقى سالبًا كما يلي:

j := -19
fmt.Println(+j)

يكون الخرج كما يلي:

-19

هنا المتغير موجب، ثم في دالة الطباعة اسبقناه بالإشارة -، وبالتالي تتبدّل إشارته من موجب إلى سالب:

k := 3.3
fmt.Println(-k)

يكون الخرج كما يلي:

3.3-

وبصورة بديلة عند استخدام العامل الأحادي سالب الإشارة مع قيمة سالبة كما يلي:

j := -19
fmt.Println(-j)

سيكون الخرج كما يلي:

19

الهدف من استخدام العملية الأحادية + والعملية الأحادية - هو إعادة هوية القيمة أو الإشارة المعاكسة لقيمة.

الضرب والقسمة

كما فعلنا في عمليات الجمع والطرح، لكن نستخدِم هنا عوامل مختلفة هي * للضرب و / للقسمة، وفيما يلي مثال عن عملية الضرب بين عددين عشريين:

k := 100.2
l := 10.2
fmt.Println(k * l)

يكون الخرج كما يلي:

1022.04

بالنسبة للقسمة يجب عليك معرفة أنّ الناتج قد يختلف تبعًا لنوع البيانات المختلفة، ففي حال قسّمت أعدادًا صحيحةً، فسيكون ناتج القسمة عددًا صحيحًا أيضًا، إذ ستُسقط أية فواصل عشرية إذا وجدت.

سنقسّم في المثال التالي عددين صحيحين 80/6 كما يلي:

package main

import (
    "fmt"
)

func main() {
    m := 80
    n := 6

    fmt.Println(m / n)
}

سيكون الخرج كما يلي:

13

لاحظ إسقاط الفاصلة العشرية من الخرج، فإذا أردت إبقاء الأعداد بعد الفاصلة، فعليك استخدام النوع العشري مع هذه البيانات عبر تحويلها باستخدام float32()‎ أو float64()‎:

package main

import (
    "fmt"
)

func main() {
    s := 80
    t := 6
    r := float64(s) / float64(t)
    fmt.Println(r)

سيكون الخرج كما يلي:

13.333333333333334

باقي القسمة

يمكنك إيجاد باقي قسمة عدد على عدد آخر من خلال العامل %، وهذا مفيد جدًا في الكثير من الحالات مثل إيجاد مضاعفات الأعداد، فلنلق نظرةً على المثال التالي:

o := 85
p := 15

fmt.Println(o % p)

سيكون الخرج كما يلي:

10

ناتج قسمة 85 على 15 هو 55 والباقي 10، لذا سيُخرج البرنامج العدد 10، وإذا أردت إيجاد باقي القسمة في حالة الأعداد العشرية، فيمكنك استخدام الدالة ()Mod من الحزمة math:

package main

import (
    "fmt"
    "math"
)

func main() {
    q := 36.0
    r := 8.0

    s := math.Mod(q, r)

    fmt.Println(s)
}

سيكون الخرج كما يلي:

4

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

كما في الرياضيات، علينا أن نضع في الحسبان أن العوامل تُطبّق حسب الأولوية وليس من اليسار إلى اليمين أو من اليمين إلى اليسار، فإذا نظرت إلى التعبير الرياضي التالي:

u = 10 + 10 * 5

هنا يُطبق الضرب أولًا ثم ناتج الضرب 50 يُجمع مع 10 لأن الأولوية للضرب على الجمع أو الطرح ويكون الخرج كما يلي:

60

استخدم الأقواس إذا أردت مثلًا جمع 10 مع 10 أولًا لأن ما بين الأقواس له الأولوية على ما هو خارجها، أي كما يلي:

u := (10 + 10) * 5
fmt.Println(u)

سيكون الخرج كما يلي:

100

ترتيب إجراء العمليات الحسابية هو كما يلي:

الأقواس Parentheses > الأس Exponent> الضرب Multiplication> القسمة Division> الجمع Addition> الطرح Subtraction.

ويمكن اختصار أوائل كلمات تلك العمليات بالبيت التالي: "قم أبعد ضيقًا … قم جد طريقًا".

عوامل الإسناد

من المألوف لديك استخدام عامل المساواة = لإسناد قيمة إلى متغير مثل إسناد القيمة 10 إلى المتغير x بكتابة x=10، كما يمكنك جعل الأمر أكثر إثارةً من خلال إدخال العمليات الحسابية إلى هذه المعادلة، إذ يمكنك استخدام العامل + أو - أو * أو / مع العامل السابق لتطبيق عمليات حسابية محددة، فإذا كان لديك مثلًا متغير x قيمته 5 وأردت جعل قيمته 7، فيمكنك كتابة x += 2 وهذا يكافئ كتابة x = x+2، وبالتالي تصبح قيمة x تساوي 7، أو يمكنك ضرب قيمة x بالقيمة 3 من خلال كتابة x *= 3 وهذا يكافئ x = x*3 أو يمكنك استخدام عامل باقي القسمة أيضًا x %= 2 والذي يكافئ x = x%2 وهكذا بالنسبة لباقي العمليات، ويوضّح المثال التالي الأمر أكثر:

w := 5
w += 1
fmt.Println(w)

يكون الخرج كما يلي:

6

تُستخدَم عوامل الإسناد المركبة كثيرًا في حالة حلقات for والتي ستستخدِمها عندما تريد تكرار عملية عدة مرات كما في المثال التالي:

package main

import "fmt"

func main() {

    values := []int{0, 1, 2, 3, 4, 5, 6}

    for _, x := range values {

        w := x

        w *= 2

        fmt.Println(w)
    }

}

يكون الخرج كما يلي:

0
2
4
6
8
10
12

استخدمنا حلقة for في المثال أعلاه للتكرار على الشريحة values، إذ هيّأنا المتغير w في كل تكرار بقيمة x الحالية ثم ضربناها بالقيمة 2 وطبعنا الخرج.

تمتلك لغة جو عامل إسناد مركب لكل عامل رياضي، وقد ناقشنا ذلك في هذا المقال، فلإضافة 1 إلى المتغير نفسه ثم إسناد القيمة الجديدة للمتغير نفسه، نكتب ما يلي والتي تكافئ y=y+1:

y += 1

طرح 1 ثم إسناد:

y -= 1

ضرب بالعدد 2 ثم إسناد:

y *= 2

قسمة على العدد 3 ثم إسناد:

y /= 3

باقي قسمة المتغير على العدد 3 ثم إسناد:

y %= 3

تُعَدّ عوامل الإسناد المركبة مفيدةً عندما تحتاج إلى زيادة أو تقليل قيمة المتغيرات تدريجيًا أو عندما تحتاج إلى أتمتة عمليات معينة في برنامجك.

الخاتمة

ناقشنا في هذا المقال العديد من العوامل التي يمكنك استخدامها في لغة جو مع أنواع البيانات العددية الصحيحة والعشرية، كما يمكنك الاطلاع على المقالات السابقة من سلسلة البرمجة بلغة Go لمزيد من التفاصيل عن المتغيرات والتعامل مع البيانات في لغة جو.

ترجمة -وبتصرف- للمقال How To Do Math in GowithOperators لصاحبه Gopher Guides.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...