بالرغم من قدرة الجهاز الواسعة إلا أنه في الأساس يتعمد في حسابته على عمليات بسيطة للغاية أذكر منها:
- الحسابات القاعدية :
1- الجمع
2- الطرح
3- القسمة
4- الضرب
5- المودولو ( سأعرفكم عليه لاحقا )
إن كان بودكم القيام بحسابات أكثر تعقيدا، كالأسس و اللوغاريثميات و ماشابه، يجب إذا برمجتها أو بمعنى أوضحه : توضحون للجهاز كيف يقوم بها .
لنبدأ بالأسهل و هي الجمع، طبعا في الجمع نحتاج الرمز + ، و للقيام بعملية جمع وجب أن نشكل متغيرة مثلا اسمها : "resultat" من نمط int و نقوم بالحساب . و هذا مثال :
int resultat = 0;
resultat = 5 + 3;
ليس من الواجب أن تكون محترفا لتخمن في رأسك بأن النتيجة ستكون 8 ، لكن طبعا إن كنتم تريدون التأكد و إظهار النتيجة على الشاشة لتصبح مرئية لكم ، استخدموا الدالة printf التي تعلمتم كيف تتعاملون جيدا معها :
printf("5 + 3 = %d", resultat);
و هذا ما سيظهر على الشاشة :
5 + 3 = 8
و هكذا ننهى عملية الجمع بسهولة، لكن في العمليات الأخرى نحتاج رموز أخرى :
1- الجمع : +
2- الطرح : -
3- الضرب : x
4- القسمة /
5- المودولو %
لو سبق و جربتم الآلة الحاسبة الخاصة بجهازكم كنتم قد عرفتم بأن moins تعني الطرح - ، و "multiplié" تعني الضرب * ، و "divisé" تعني القسمة /
لن تجدوا صعوبة مع كل العمليات سوى الأخرة منها أي القسمة و المودولو ، لهذا سأقف عندهما و أشرحهما بالتفصيل .
- القسمة :
ينجز جهازكم حسابات القسمة بسهولة و نتائجه تكون سهلة، فمثلا 6/2 ستكون حتما 3 ، من هذه الناحية لا تقلقوا، لو نأخذ مثلا العملية 5/2 و تحسبون جيدا تجدونها بالتأكيد 2.5 ، لكن عندما نكتب الكود الخاص بها :
int resultat = 0;
resultat = 5 / 2;
printf ("5 / 2 = %d", resultat);
أنظروا ماذا يظهر في الشاشة !!
5 / 2 = 2
هناك مشكل كبير فنحن ننتظر أن يعطينا الجهاز قيمة 2.5 لكنه أظهر القيمة 2! هل يا ترى أجهزتنا غبية لهذه الدرجة ؟ بالواقع لما يقوم الجهاز بالقسمة يحتفظ بالرقم الصحيح الذي هو 2 و يمسح ما هو بعد الفاصل 5 .
- لكن هذا معقول لأن المتغير "resultat" الذي استخدمناه هو من نمط int ! لو استخدمنا النمط double لأظهر لنا العدد العشري كاملا !
لا هذا غير صحيح، جربوا نفس العملية بتغيير النمط إلى double و ستجدون نفس النتيجة 2 ، إن أردنا أن يظهر لنا الجهاز القيمة الصحيحة، يجب أن نغير الرقمين 2 و 5 إلى رقمين عشريين كالتالي : 2.0 و 5.0 ، قيمتهما هي نفسها لكن الجهاز سيعتبرهما عددين عشريين، و بالتالي هو يظن بأنه يقوم بقسمة عددين عشريين.
double resultat = 0;
resultat = 5.0 / 2.0;
printf ("5 / 2 = %f", resultat);
و النتيجة :
5 / 2 = 2.500000
هنا الرقم صحيح بالرغم من وجود عدة اصفار في نهاية الرقم، يعني القيمة تبقى نفسها .. هنا تدركون بأن تحويل الأرقام لعشرية مهم جدا أثناء الحسابات الخاصة بالقسمة، و هذه أمثلة للنتائج التي يعطيها لنا الجهاز في الحالة الأولى:
5 / 2 = 2
10 / 3 = 3
4 / 5 = 0
لكن إن أردتم النتيجة الصحيحة استعملوا الطريقة 2، هذا ما ينتج لكم:
5.0 / 2.0 = 2.5
10.0 / 3.0 = 3.33333
4.0 / 5.0 = 0.8
فالجهاز يقوم بالقسمة الإقليدية و يطرح على نفسه السؤال، كم توجد من الرقم 2 في الرقم 5 ؟ طبعا يوجد 2 فقط و هذه النتيجة المعطاة، و لكن أين الباقي من العملية ؟ لأننى لما أقول 5 هي أثنين من 2 ، يبقى الواحد طبعا، كيف لنا أن نسترجعه ؟ هنا يدخل المودولو الذي كلمتكم عنه .
- المودولو :
هو عبارة عن عملية حسابية تسمح بالحصول على الباقي من عملية القسمة، و هي العملية الغير معروفة نسبة للعمليات الأربع الأخرى، لكن يعتبرها الجهاز من العمليات القاعدية، و هو يعتبرها حلا لمشكل قسمة الأعداد الطبيعية .
كما قلت لكم المودولو يمثل الرمز % ، تمعنوا في التالي:
5 % 2 = 1
14 % 3 = 2
4 % 2 = 0
المودولو 5 % 2 هو باقي العملية 5 / 2 مما يعني أن الجهاز يقوم بالعملية و يطلع الناتج 5 = 2 * 2 + 1 حيث أن الواحد هو الباقي و الذي يعمل على إظهاره المودولو، نفس الأمر 14 % 3، العملية هي 14 = 3 * 4 + 2 ( المودولو يعطي القيمة 2)
أخيرا, من أجل 4 % 2، القسمة تامة، لا يوجد باقي، لهذا يظهر المودولو القيمة 0.
أعتقد بأنكم فهمتم تقريبا كيف تعم عملية القسمة باستخدام المودولو لهذا لا يسعنى الشرح أكثر من هذا، لي خبر جيد و هو أننا أتممنا كلّ عمليات الحساب، و تخلصنا من الرياضيات.
- عمليات على المتغيرات
الشيء الجيد أنكم تعلمتم كيف تقومون بالحساب في الخمس عمليات كلها، مما سيساعدنا على التدرب في العمليات على المتغيرات
لا أحد بإمكانه منعكم عن كتابة السورس :
resultat = nombre1 + nombre2;
هذا السطر يعمل على جمع المتغيرتين nombre1 و المتغيرة nombre2 ثم يخزنهما في المغير resultat ، هنا بدأت الامور المهمة تظهر، و حقيقة لكم الآن المستوى على برمجة آلة حاسبة بسيطة.
تخيلوا وجود برنامج يطلب من المستخدم إدخال رقمين، ثم يقوم بتخزينهما في متغيرتين، ثم يجمع هتين المتغيرتين و يخزن النتيجة في متغيرة اسمها "resultat".
قبل أن أعطيكم الكود سورس حاولوا لوسمحتم كتابة الكود سورس اعتمادا على الوصف الذي قدمته، هذا سيساعدكم على كتابة الكودسورس المرة القادمة دون الإعتماد على أحد .
هاهو الكود الصحيح الآن :
int main(int argc, char *argv[])
{
int resultat = 0, nombre1 = 0, nombre2 = 0;
// On demande les nombres 1 et 2 à l'utilisateur :
printf("Entrez le nombre 1 : ");
scanf("%d", &nombre1);
printf("Entrez le nombre 2 : ");
scanf("%d", &nombre2);
// On fait le calcul :
resultat = nombre1 + nombre2;
// Et on affiche l'addition à l'écran :
printf ("%d + %d = %d\n", nombre1, nombre2, resultat);
return 0;
}
و النتيجة التي تظهر على الشاشة :
Entrez le nombre 1 : 30
Entrez le nombre 2 : 25
30 + 25 = 55
هنا لقد برمجتم آلة حاسبة تعتمد على جمع عددين و إظهار نتيجتهم على الشاشة، حاولوا تجريب أرقام مختلفة المهم لا تفوت قدرة تحمل نمط الـ:int ، كما أنصحكم بمحاولة تطبيق مختلف عمليات الحساب، من القسمة و الطرح و ماشابه، و العملية هنا تكون سهلة إذ عليكم تغيير فقط الاشارة في كل مرة، كما يمكنكم إضافة متغير ثالث تسمونه nombre3 و يكون الكود كالتالي :
resultat = nombre1 + nombre2 + nombre3;
- الإختصارات
كما قلت لقد تعلمتم تقريبا كل العمليات و أصبح الآن كل شيء تقريبا سهلا ما إن ركزتم جيدا، للعلم فلعبة 3D تعتمد في الأساس على عمليات بسيطة فقط . هناك في لغة السي امكانية اختصار العمليات وماشابه، نستعملها للتقليص من حجم الكودسورس و هذا ما سأشرحه الآن و هو ما نسميه بالإضافة incrémentation .
- الإضافة incrémentation :
ستجدون أنه في كلّ مرة سترفقون الرقم 1 بمتغير ، و التالي ستتعاملون مع متغيرات مضافة بالرقم 1 .
نفترض أن متغيركم يحمل اسم "nombre" ، يحق لكم أن تعرفوا كيف نضيف الرقم 1 لأي متغير كان مهما كانت القيمة التي تحتويها . هذا ما يجدر بنا كتابته
nombre = nombre + 1;
ماالذي يحصل هنا ؟ نجمع nombre + 1 ثم نخزن الناتج في المتغير nombre ؟
إذا كانت المتغير الأصلي يحمل قيمة 5 مثلا فالمتغير الجديد يحمل 6 و إن كان مثلا يحمل قيمة 8 يصبح 9 و هكذا ..
هذه العملية متكررة كثيرا، و لهذا فهي تتعب الأشخاص الكسالى الذين يتعبون أن يكتبوا في كلّ مرة نفس المتغير، لهذا تم اختراع هذه الاختصارات تحت عملية تسمى بالإضافة.
التعليمة أسفله، تقوم بنفس الأمر الذي كنا نراه مع المتغير :
nombre++;
هذا السطر له نفس قيمة و ممعنى الكود الذي كتبناه قبل قليل، أليس مختصرا و قصيرا ؟ إنه يعني إضافة الرقم 1 للمتغير، يكفي إذا أن نرفق باسم المتغير nombre الاشارة + مرتين ، مع عدم نسيان النقطة-فاصلة ; الخاصتين بالتعليمة.
هذه العملية ستساعدنا كثيرا مستقبلا لأننا سنستخدم الكثير من الاختصارات بدل الكتابة الطويلة للكودسورس.
إذا كنتم ذو أبصار حادة، كنتم لتلحظوا أن الإشارتين ++ هما من اسم اللغة C++ .. و لو كنتم أذكياء قليلا كنتم لتعرفوا بأن الـ: ++ يدلان على أن السي بلس بلس ماهي إلا عبارة عن لغة C بمتسوى أعلى بدرجة واحدة . ( كما قلنا بالنسبة للمتغير ) .
- La décrémentation :
الـ: هي عكس الـ:l'incrémentation ( التي تزيد 1 لللمتغير ) فهي تنقس رقم 1 من المتغير .
بالرغم من أننا نستخدم الـ:l'incrémentation أكثر من الـ:La décrémentation فهي التي نستخدمها كثيرا ، إلا أن هذه لا غنى عنها أيضا و نستعملها في بعض الأحيان .
La décrémentation في الشكل ( longue طويل ) :
nombre = nombre - 1;
La décrémentation في الشكل ( "raccourcie المختصر ) :
nombre--;
و يمكنك تخمين هذا قبل ان أضعه، فبدل وضع ++ نضع -- ، فمتغيرتكم إن كانت تحمل مثلا الرقم 5 ستصبح بعد الـ:La décrémentation تحمل الرقم 4
- الإختصارات الأخرى
هنا اختصارات أخرى تعمل لنفس المنطلق، و هذه الاختصارات تصلح لكل العمليات القاعدية : + - * / % و هي تساعدنا على تجنب كتابة نفس اسم المتغير في السطر الواحد، و كذا إن أردتم مضاعفة متغيرتكم ( ضربها في 2 ) :
nombre = nombre * 2;
يمكنكم اختصارها كالتالي:
nombre *= 2;
بالطبع إن كانت القيمة 5 للمتغير قبل إجراء العملية تصبح الآن 10 بعدها .
بالنسبة لباقي العمليات القاعدية، هذا مثال لبرنامج يلخص ذلك
int nombre = 2;
nombre += 4; // nombre vaut 6...
nombre -= 3; // ... nombre vaut maintenant 3
nombre *= 5; // ... nombre vaut 15
nombre /= 3; // ... nombre vaut 5
nombre %= 3; // ... nombre vaut 2 (car 5 = 1 * 3 + 2)
الشيء الجيد هو أنه بامكاننا استخدامها مع كلّ العمليات القاعدية، لا تنسوا استخدام l'incrémentation في حالة اظطررتم لتكرار نفس الأسطر و لا تنسوا أيضا La décrémentation في الطرح ( لكنها أقل استعمالا من الأولى )
- المكتبة الرياضية
في لغة C هناك دائما ما نسميه بالمكتبات "standard"، تعني المكتبات التي تستخدم على الدوام، و هي مكتبات قاعدية نسخدمها كثيرا .
أذكركم بما قلت سابقا، المكتبة هي مجموعة دوال جاهزة، و هذه الدوال تمت كتابتها من طرف مبرمجين قبلكم، و هي تساعدكم على تجنب البرمجة ( الكاملة لصفرية ) للبرنامج من الأول .
لو تتذكرون قد استخدمنا من قبل الدالتين printf و scanf من المكتبة stdio.h . عليكم أن تعرفوا بوجود مكتبة أخرى تدعى math.h، تحتوي دوال رياضية جاهزة .
- بالرغم من أننا تعلمنا كيف نتعامل مع العمليات القاعدية إلا أننا بشكل كثير لن نحتاج المعقدة منها. لكن هذه المعقدة لا يمكن تحقيقها إلا بوجود المكتبة الرياضية .
أعطيكم مثال، لا نعرف كيف نستخدم القوى ( الأسس ) في لغة C ! ، كيف نحسب المربع ² ؟ يمكنكم ببساطة كتابة العملية 5² في برنامجكم لكن الجهاز لن يفهمها تماما ، لهذا ستفسر له كيف يقوم بالعملية باستخدام المكتبة الرياضية !
يمكننا الاستعانة الدوال الرياضية ، مع عدم نسيان ( ضرورة حتمية ) توجيهات المعالج الخاصة بها في بداية كل برنامج
#include <math.h>
ما إن تكتبوه تصبحون قادرين على استخدام كل الدوال المتوفرة في المكتبة .
كان ذلك موجزا فقط .. المهم هناك الكثير من الدوال الرياضية لا يمكننى تعدادها كلّها هنا، فهذا سيتعبنى و يشعركم بالملل، لهذا سأكتفي بذلك الأهم منها فقط،
من الممكن أن تكونوا دون المستوى الذي يسمح بمعرفة عمل هذه الدوال، لكن لن أصعب عليكم الأمر كثيرا، و ستجتازون الأمر بحول الله، كنصيحة : أحبّوا الرياضيات من اليوم و صاعدا و كونوا على انتباه دائم في القسم ^^ .
- fabs
هذه الدالة ترجع الأرقام لمصدرهم الأصلي، أو ما نعرفه بالقيمة المطلقة للأرقام ، و نكتبها : |x| ( يمكن أن نسميها بالتدوين الرياضي )
مثلا، الرقم 52- للدالة ترجعه للقيمة 52 .. الرقم 52 للدالة تعطيه 52 ( كل عدد موجب يبقى موجب، كل عدد سالب يصبح موجب مع الحفاظ على نفس القيمة ) ، هذا مثال :
double absolu = 0, nombre=-27;
absolu = fabs(nombre); // absolu vaudra 27
- "absolu" نعني بها القيمة المطلقة و هو اسم المتغير طبعا، يجب أن يكون من نمط double .
- هناك دالة اخرى مماثلة للـ:fabs تسمى "abs"، لكننا نجدها في "stdlib.h" . و هي تعمل بنفس طريقة الأولى إلا أنها تتعامل مع الأرقام الصحيحة ، يعني بالنمط (int).
- ceil
هذه الدالّة تدوّر الأعداد العشرية، و هاهي القاعدة : إن كان الرقم الأول بعد الفاصلة أقل من 5 نبقي العدد الصحيح كما هو ، لو نعطيها مثلا العدد 26.412 تعطينا هي 26 . أما إن كان الرقم الأول بعد الفاصلة يساوي أو يكون أكبر من 5 نزيد العدد الصحيح برتبة، لو نعطيها مثلا العدد 26.512 تعطينا هي 27 .
الدالة تعمل بالنمط double أيضا و هذا مثال:
double dessus = 0, nombre = 52.71;
dessus = ceil(nombre); // dessus vaudra 53
- " dessus " نعني بها : أعلى، و هو اسم المتغير .
- floor
هذه تعمل بعكس السابقة، إذا أعطيتها مثلا العدد 37.91 تعطيني مباشرة العدد 37 يعني العدد الصحيح .
- pow
هذه خاصة بقوى ( أسس ) الأعداد، يجب أن تعطيها قيمتين، الأولى هي الرقم الذي تريد اجراء العملية عليه و الثانية هي القوة الذي تريد أن تنسبها للرقم . مثلا 5² ، أعطيتها القيمتين 5 و 2 . و هذا مخطط عملها :
pow(nombre, puissance);
كمثال : ( 2 قوة 3 ) ، فـ:2^3 هي نفسها الكتابة 2 * 2 * 2 يعني النتيجة 8 :
double resultat = 0, nombre = 2;
resultat = pow(nombre, 3); // resultat vaudra 2^3 = 8
- sqrt
هذه الدالة هي الدالة جذر، يعني عكس الدالة السابقة . فجذر الـ:100 هو 10 . يطرح السؤال : أي عدد نربّعه نجد 100 ؟
double resultat = 0, nombre = 100;
resultat = sqrt(nombre); // resultat vaudra 10
-sin, cos, tan
أعتقد بأن الجميع يعرفها و هي أشهر الدوال في العلاقات المثلثية . تستخدم النمط double و تعطي النتيجة بالراديان radians
- asin, acos, atan
و هي الدوال arc sinus ،arc cosinus و arc tangente . علاقات مثلثية اخرى تعتمد النمط double أيضا .
-exp
تعطي أس عدد معين، نمط الدوبل أيضا
- log
دالة خاصة باللوغاريتميات ، نسميها أيضا "ln"
- log10
خاصة بحساب اللوغاريتم للـ:10