Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

C++التعامل مع الأعداد

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

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

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

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

#include <cmath>
#include <cmath>

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

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

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

إسم الدالة مع تعريفها
1 abs(x) ترجع القيمة المطلقة ( Absoulte Value ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
2 fabs(x) ترجع القيمة المطلقة للعدد الذي نوعه float و الذي نمرره لها مكان الباراميتر x.
تابع القراءة
3 floor(x) ترجع العدد الصحيح الأصغر أو الذي يساوي العدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
4 ceil(x) ترجع العدد الصحيح الأكبر أو الذي يساوي العدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
5 rint(x) ترجع أقرب عدد صحيح للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
6 fmax(x, y) ترجع العدد الأكبر بين العددين اللذين نمررهما لها مكان الباراميترين x و y.
تابع القراءة
7 fmin(x, y) ترجع العدد الأصغر بين العددين اللذين نمررهما لها مكان الباراميترين x و y.
تابع القراءة
8 fmod(x, y) ترجع الرقم الذي يتبقى من قسمة قيمة البارامتير x على قيمة البارامتير y.
تابع القراءة
9 pow(x, y) تضاعف قيمة الباراميتر x بقيمة الباراميتر y ثم ترجع الناتج.
تابع القراءة
10 sqrt(x) ترجع قيمة الجذر التربيعي (Square Root) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
11 cbrt(x) ترجع قيمة الجذر التكعيبي ( Cube Root ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
12 fdim(x, y) إذا كانت قيمة x أكبر من قيمة y ترجع الفارق بينهما و الذي يساوي x-y, مع الإشارة إلى أنها ترجع الفارق كعدد إيجابي دائماً ( Positive Number ).
غير ذلك ترجع صفر مهما كانت قيمة الأعداد المدخلة.
تابع القراءة
13 fma(x, y, z) ترجع قيمة x * y + z مع الحفاظ على أي رقم موجود بعد الفاصلة.
تابع القراءة
14 hypot(x, y) ترجع قيمة وتر المثلث ( Hypotenuse ).
أي ترجع قيمة sqrt(x2 +y2) مع الحفاظ على أي رقم موجود بعد الفاصلة.
تابع القراءة
15 exp(x) ترجع قيمة ex, أي قيمة المتسارع ( Exponential ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
16 expm1(x) ترجع قيمة ex - 1, أي قيمة المتسارع ( Exponential ) للعدد الذي نمرره لها مكان الباراميتر x ناقص واحد.

تابع القراءة
17 log(x) ترجع قيمة loge(x), أي قيمة اللوغاريتم ( Logarithm ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
18 log2(x) ترجع قيمة log2(x), أي قيمة اللوغاريتم الثنائي ( Binary Logarithm ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
19 log10(x) ترجع قيمة log10(x), أي قيمة اللوغاريتم العشري ( Decimal Logarithm ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
20 sin(x) ترجع قيمة جيب الزاوية أو الجيب ( Sine ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
21 asin(x) ترجع قيمة الجيب العكسي أو جيب الزاوية القوسي ( Arc Sine ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
22 asinh(x) ترجع قيمة جيب الزاوية الزائدي أو الجيب الزائدي ( Hyperbolic Sine ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
23 cos(x) ترجع قيمة جيب التمام ( Cosine ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
24 acos(x) ترجع قيمة جيب التمام العكسي أو جيب تمام الزاوية القوسي ( Arc Cosine ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
25 cosh(x) ترجع قيمة جيب التمام الزائدي ( Hyperbolic Cosine ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
26 tan(x) ترجع قيمة الظل أو ظل الزاوية أو المماس ( Tangent ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
27 atan(x) ترجع قيمة الظل العكسي أو ظل الزاوية القوسي ( Arc Tangent ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة
28 tanh(x) ترجع قيمة الظل الزائدي أو المماس الزائدي ( Hyperbolic Tangent ) للعدد الذي نمرره لها مكان الباراميتر x.
تابع القراءة

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

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

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


الدالة rand()

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

المثال الأول

Main.cpp
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
// هنا قمنا بطباعة رقم عشوائي
cout << "Random number: " << rand();
return 0;
}
#include <iostream> #include <stdlib.h> using namespace std; int main() { // هنا قمنا بطباعة رقم عشوائي cout << "Random number: " << rand(); return 0; }

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

Random number: 41
Random number: 41

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

Random number: 41
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
// هنا قمنا بتغيير سلسلة القيم العشوائية التي سيتم توليدها
srand(time(0));
// هنا قمنا بطباعة رقم عشوائي
cout << "Random number: " << rand();
return 0;
}
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int main() { // هنا قمنا بتغيير سلسلة القيم العشوائية التي سيتم توليدها srand(time(0)); // هنا قمنا بطباعة رقم عشوائي cout << "Random number: " << rand(); return 0; }

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

Random number: 1537
Random number: 1537

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

Random number: 1579
Random number: 1579

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

Random number: 1621
Random number: 1621

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

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

Main.cpp
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
// هنا قمنا بتغيير سلسلة القيم العشوائية التي سيتم توليدها
srand(time(0));
// هنا قمنا بإنشاء رقم عشوائي بين 1 و 10
int x = rand() % 10 + 1;
// هنا قمنا بطباعة رقم عشوائي
cout << "Random number: " << x;
return 0;
}
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int main() { // هنا قمنا بتغيير سلسلة القيم العشوائية التي سيتم توليدها srand(time(0)); // هنا قمنا بإنشاء رقم عشوائي بين 1 و 10 int x = rand() % 10 + 1; // هنا قمنا بطباعة رقم عشوائي cout << "Random number: " << x; return 0; }

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

Random number: 3
Random number: 3