الدرس العاشر - التعامل مع الأعداد

مفهوم التعامل مع الأعداد في C++

هناك الكثير من الدوال الجاهزة في C++ و التي يمكنك استخدامها لإجراء عمليات حسابية.
بعض هذه الدوال يمكن استخدامها بشكل مباشر لأنها تعتبر معروفة بالنسبة لمترجم اللغة بشكل إفتراضي و بعض الدوال بحاجة لأن تضّمنها بنفسك أولاً حتى تتمكن من استخدامها.

بالإجمال, حتى تستطيع استخدام الدوال المخصصة لإجراء العمليات الحسابية, يجب تضمين الملف cmath الذي يحتويها.
لذلك ستجد أننا سنضيف السطر التالي في أي مثال نستخدم فيه إحدى الدوال التي سنتعلمها في هذا الدرس.

#include <cmath>

 

هذا السطر يعني أننا نريد إضافة محتوى الملف cmath في البرنامج مما يجعلنا قادرين على استخدام الدوال الموجودة فيه.

دوال الملف cmath في C++

الجدول التالي يحتوي على دوال الملف cmath الأكثر استخداماً.

إسم الدالة مع تعريفها

#

abs(x) ترجع القيمة المطلقة  ( Absoulte Value ) للعدد الذي نمرره لها مكان البارامتير x.

1

fabs(x) ترجع القيمة المطلقة للعدد الذي نوعه float و الذي نمرره لها مكان الباراميتر x.

2

floor(x) ترجع العدد الصحيح الأصغر أو الذي يساوي العدد الذي نمرره لها مكان الباراميتر x.

3

ceil(x) ترجع العدد الصحيح الأكبر أو الذي يساوي العدد الذي نمرره لها مكان الباراميتر x.

4

rint(x) ترجع أقرب عدد صحيح للعدد الذي نمرره لها مكان الباراميتر x.

5

fmax(x, y) ترجع العدد الأكبر بين العددين اللذين نمررهما لها مكان الباراميترين x و y.

6

fmin(x, y) ترجع العدد الأصغر بين العددين اللذين نمررهما لها مكان الباراميترين x و y.

7

fmod(x, y) ترجع الرقم الذي يتبقى من قسمة قيمة البارامتير x على قيمة البارامتير y.

8

pow(x, y) تضاعف قيمة الباراميتر x بقيمة الباراميتر y ثم ترجع الناتج.

9

sqrt(x) ترجع قيمة الجزر التربيعي (Square Root) للعدد الذي نمرره لها مكان الباراميتر x.

10

cbrt(x) ترجع قيمة الجزر التكعيبي ( Cube Root ) للعدد الذي نمرره لها مكان الباراميتر x.

11

fdim(x, y) إذا كانت قيمة x أكبر من قيمة y ترجع الفارق بينهما و الذي يساوي x-y, مع الإشارة إلى أنها ترجع الفارق كعدد إيجابي دائماً ( Positive Number ).
غير ذلك ترجع صفر مهما كانت قيمة الأعداد المدخلة.

12

fma(x, y, z) ترجع قيمة x * y + z مع الحفاظ على أي رقم موجود بعد الفاصلة.

13

hypot(x, y) ترجع قيمة وتر المثلث ( Hypotenuse ).
أي ترجع قيمة sqrt(x2 +y2) مع الحفاظ على أي رقم موجود بعد الفاصلة.

14

exp(x) ترجع قيمة ex, أي قيمة المتسارع ( Exponential ) للعدد الذي نمرره لها مكان الباراميتر x.

15

expm1(x) ترجع قيمة ex - 1, أي قيمة المتسارع ( Exponential ) للعدد الذي نمرره لها مكان الباراميتر x ناقص واحد.

16

log(x) ترجع قيمة loge(x), أي قيمة اللوغاريتم ( Logarithm ) للعدد الذي نمرره لها مكان الباراميتر x.

17

log2(x) ترجع قيمة log2(x), أي قيمة اللوغاريتم الثنائي ( Binary Logarithm ) للعدد الذي نمرره لها مكان الباراميتر x.

18

log10(x) ترجع قيمة log10(x), أي قيمة اللوغاريتم العشري ( Decimal Logarithm ) للعدد الذي نمرره لها مكان الباراميتر x.

19

sin(x) ترجع قيمة جيب الزاوية أو الجيب ( Sine ) للعدد الذي نمرره لها مكان الباراميتر x.

20

asin(x) ترجع قيمة الجيب العكسي أو جيب الزاوية القوسي ( Arc Sine ) للعدد الذي نمرره لها مكان الباراميتر x.

21

asinh(x) ترجع قيمة جيب الزاوية الزائدي أو الجيب الزائدي ( Hyperbolic Sine ) للعدد الذي نمرره لها مكان الباراميتر x.

22

cos(x) ترجع قيمة جيب التمام ( Cosine ) للعدد الذي نمرره لها مكان الباراميتر x.

23

acos(x) ترجع قيمة جيب التمام العكسي أو جيب تمام الزاوية القوسي ( Arc Cosine ) للعدد الذي نمرره لها مكان الباراميتر x.

24

cosh(x) ترجع قيمة جيب التمام الزائدي ( Hyperbolic Cosine ) للعدد الذي نمرره لها مكان الباراميتر x.

25

tan(x) ترجع قيمة الظل أو ظل الزاوية أو المماس ( Tangent ) للعدد الذي نمرره لها مكان الباراميتر x.

26

atan(x) ترجع قيمة الظل العكسي أو ظل الزاوية القوسي ( Arc Tangent ) للعدد الذي نمرره لها مكان الباراميتر x.

27

tanh(x) ترجع قيمة الظل الزائدي أو المماس الزائدي ( Hyperbolic Tangent ) للعدد الذي نمرره لها مكان الباراميتر x.

28

 

ملاحظة

يكفي فقط أن تعرف أن الدوال التي ذكرناها متوفرة لتستخدمها عند الحاجة لها مستقبلاً.
و من الطبيعي أن لا تكون أغلب هذه الدوال قد مرت معك من قبل لأن هذه الدوال تستخدم في الغالب في العمليات الحسابية التي تدرس في الرياضيات و الفيزياء, لذلك على الأرجح قد لا تستخدم أغلب الدوال المذكورة في البرامج العادية.

 

طريقة توليد أرقام عشوائية في C++

في حالات كثيرة قد تحتاج إلى توليد قيم عشوائية في برامجك و قد تكون بحاجة إلى تحديد نطاق الأعداد العشوائية التي ترغب في توليدها, فمثلاً في لعبة الزهر قد ترغب في الحصول على قيمة عشوائية بين 1 و 6.

 

الدالة rand()

للحصول على رقم عشوائي, يمكنك استخدام دالة إسمها rand() موجودة في الملف stdlib.h كالتالي.

المثال الأول

Main.cpp

 

  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4. int main()
  5. {
  6. // هنا قمنا بطباعة رقم عشوائي
  7. cout << "Random number: " << rand();
  8.  
  9. return 0;
  10. }

•سنحصل على نتيجة عشوائية تشبه النتيجة التالية عند التشغيل.

  • Random number: 41

•إذا قمنا بتشغيل البرنامج مرة ثانية سنحصل على نفس النتيجة السابقة كالتالي.

  • Random number: 41

•إذا قمنا بتشغيل البرنامج مرة ثالثة سنحصل على نفس النتيجة السابقة كالتالي.

  • Random number: 41

 

إذاً استخدام الدالة rand() لوحده لا يضمن أن تحصل على رقم عشوائي مختلف في كل مرة تقوم فيها بتشغيل البرنامج.
لهذا السبب بالتحديد, عليك أن تعلم مترجم لغة C++ بأن يعيد تغيير الإحتمالات العشوائية عند تشغيل البرنامج و قبل استداعاء الدالة rand() و هذا ما سنتعلمه الآن.

 

الدالتين srand() و time()

الدالة srand() تستخدم لتغيير سلسلة القيم العشوائية التي سيتم توليدها عند استدعاء الدالة rand() مما يجعلك تحصل على قيم عشوائية مختلفة عن القيم التي حصلت عليها في المرة السابقة التي قمت فيها بتشغيل البرنامج.

إفتراضياً, الدالة rand() تستخدم المدى srand(1) في كل مرة يتم فيها تشغيل البرنامج, لهذا كنا نحصل على نفس القيم العشوائية عند البرنامج.

لتمرير رقم مختلف للدالة srand() و بشكل تلقائي, يمكنك تمرير عدد الثواني الموجودة من 1-1-1970 و حتى وقت الجهاز الحالي و هذا تحصل عليه من خلال استدعاء الدالة time(0) و تمريرها للدالة srand() كما سنرى في المثال التالي.

ملاحظة: لاستخدام الدالة srand() يجب تضمين الملف stdlib.h و لاستخدام الدالة time() يجب تضمين الملف time.h.

المثال الثاني

Main.cpp

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. using namespace std;
  5. int main()
  6. {
  7. // هنا قمنا بتغيير سلسلة القيم العشوائية التي سيتم توليدها
  8. srand(time(0));
  9. // هنا قمنا بطباعة رقم عشوائي
  10. cout << "Random number: " << rand();
  11. return 0;
  12. }

•سنحصل على نتيجة عشوائية تشبه النتيجة التالية عند التشغيل.

  • Random number: 1537

•إذا قمنا بتشغيل البرنامج مرة ثانية سنحصل على نتيجة عشوائية مختلفة عن النتيجة السابقة كالتالي.

  • Random number: 1579

•إذا قمنا بتشغيل البرنامج مرة ثالثة سنحصل على نتيجة عشوائية مختلفة عن النتيجة السابقة كالتالي.

  • Random number: 1621

 

المثال التالي يوضج طريقة تحديد أعلى و أدنى قيمة عشوائية يمكن أن يتم إرجاعها.

المثال الثالث

Main.cpp

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. // هنا قمنا بتغيير سلسلة القيم العشوائية التي سيتم توليدها
  9. srand(time(0));
  10.  
  11. // هنا قمنا بإنشاء رقم عشوائي بين 1 و 10
  12. int x = rand() % 10 + 1;
  13.  
  14. // هنا قمنا بطباعة رقم عشوائي
  15. cout << "Random number: " << x;
  16. return 0;
  17. }

•سنحصل على رقم عشوائي بين 1 و 10 كالتالي عند التشغيل.

  • Random number: 3