الفصل الثاني
:العمليات الحسابية والمتغيرات
وماذا بعد ان تعرفنا علي كيفية تصميم برنامج بسيط بالسي
وبعد ان تعرفنا علي الخطوات العامه لانشاء برنامج بلغة السي , في الحقيقه انت لم تتعرف بعد علي كل شيئ ولكن هذا يكفيك للان لكي تشق طريقكلنبدأ ان نعطي للبرنامج معني اكبر , او بالتحديد وظيفة اكبر
مامعني كلمة variable , متغير باي حال ؟
تخيل ان لديك عدة اوعية , كل وعاء مخصص لكي تضع فيه نوع معين من المواد
ونوع واحد فقط من هذا المواد بكمية محدوده لا تتدعدي حجم الوعاء
وعاء الماء , يحتمل قدر 5 اكواب من الماء
وعاء البنزين , يحتمل قدر 10 ليترات من البنزين
والي اخره , هذا بالظبت ماتعنيه كلمة متغير
فالمتغير هو container للبيانات
هناك عدة انواع من البيانات في لغة السي , هناك انواع اساسيه وانواع مشتقه سوف نتحدث عنها لاحقا
الانواع الاساسيه بشكل مبدأي هي
int , char , float , double
int = عدد رقمي صحيح خالي من النقاط العشريه
char = حرف واحد بين 'a' , 'b' او 'A' , 'B'
float = عدد رقمي غير صحيح يحتوي علي نقاط عشريه
double = هو ايضا عدد رقمي غير صحيح يحتوي علي نقاط عشريه ولكن ادق واكبر من النوع float
والان ؟ ماذا بعد ؟ نبدأ بتعريف المتغيرات ؟؟ لا لابد ان تعرف بعض القواعد اولا
keywords: ماذا تعني ؟
هي عدة كلمات محجوزه تحتفظ بها لغة السي لنفسها فقط ولا يمكنك ان تستخدمها لتسمية اي شيئ اخر
يمكنك ان تطلع عليها من هنا "
http://www.itee.uq.edu.au/~comp2303/Leslie_C_ref/C/SYNTAX/keywords.html" او يمكن فقط قراءة الاتي
auto break case char const continue default do
double else enum extern float for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
هذه هي الكلمات المحجوزه reserved words والتي تعرف بال keywords
والان ماذا بعد ؟
identifier :
ماذا تعني ؟ جائت من كلمة identity والتي تعني "اسم" والكلمة نفسها تعني ب"اسم"
اذن ال identifier هو اسم , ولكن اسم لماذا ؟ لاي شيئ انت تعرفه يجب ان يكون لديه identifier
المتغيرات , الدوال , الخ
اذن ماهي القواعد التي يمكن من خلالها انشاء identifier ?:
1- ان لا يكون اسما محجوز من ال keywords التي قد رايتها
2- حالة الحروف حساسة A تختلف تماما عن a
3- يجب ان يبدأ بحرف او ب _ ولا يمكن ان يبتدي برقم
4- ليست هناك قيود علي طول الاسم ولكن يفضل ان لايتجاوز ال 31 حرف "حيث انه في لغة السي القديمه لم يكن يوجد هناك قيود ايضا
ولكن ايضا لم يوجد ضمانات ان الاسم الذي يتعدي ال 31 حرف يشير الي ماتريده ان يشير اليه بالتحديد"
حان وقت تعريف بعض المتغيرات في برنامج حقيقي
int main(void)
{
int a;
int A;
char b;
float c;
double d;
return 0;
}
هل تلاحظ اولا غياب المكتبه القياسيه stdio.h ؟ واانا لم نقم باستدعائها ؟ هذا لاانا لا نحتاجها , لاانا لم نستخدم اي من محتوياتها
ثانيا , انظر الي النص المصدري المكتوب لتتعرف علي كيفية تعريف المتغير
تعريف المتغير يتم كالاتي :
type idenitifier ;
اظن ان الامور واضحة جدا الان ؟
والان بعد ان انشأنا المتغيرات ؟ ماذا تحتوي
في الحقيقه هي تحتوي علي شيئ او لاشيئ ! ماذا يعني هذا الكلام ؟ كيف يمكن ان تحتوي علي شيئ ولا شيئ !!
لان ماتحتويه الان يعد "قمامه" بيانات عشوائيه "قد تكون موجوده وقد لا تكون موجوده" داخل المتغير
ولذلك مايوجد بداخلها غير محدد ولا يمكن استخدامها هكذا
الان حان الوقت لكي اعرفك واقدم الي "="
كيف يمكنك اسناد قيمه الي متغير , طريقتي المفضله ان اقوم بفعل ذلك وقت تعريف المتغير
int x = 0;
هنا انا قمت بتعريف المتغير x واسناد القيمه 0 اليه وقت التعريف اي انه اصبح يحتوي علي شيئ ما وله قيمه وليس عشوائي معدوم القيمه
ولكن ايضا يمكنك ان تقوم بفعل ذلك في اي وقت تحبه عن طريق
variable = value ;
for example
x = 5;
ملاحظة : هناك بعض الامور التي تحدث في اسناد القيم للمتغيرات عن طريق العمليات الحسابيه ولكن الان ليس مجال نقاشها , في الفصول الاخري او بالاحري في مواضيع اخري سوف نناقشها
يمكنك ايضا ان تقوم بعمل الاتي
b = x;
قمت باسناد ميحتويه المتغير x الي b
يمكن ايضا ان تقوم بانشاء عدة متغيرات من نفس النوع في سطر واحد عن طريق مثلا
int a , b , d, g ;
سوف يقوم بانشاء المتغيرات a b d g من النوع int
يمكن ان تسندها جميها قيم
int a =0 , b = 5 , d =6 , g = 10;
او يمكن ان تقوم بعمل ذلك بعد تعريفها او اسنادهم كلهم قيمه واحده بعد التعريف مثل
a = b = d = g = 0;
وضحت الرؤيه ؟
العمليات الحسابيه :
وماذا بعد ان نقوم باسناد القيم للمتغيرات ؟ ماذا سوف يحدث ؟ لاشيئ
تصبح متغيرات تحتوي علي قيم ولاتفعل اي شيئ ! الان مانريده هو ان نقوم بعمل عمليات حسابيه لكي نستطيع ان نستفيد بتلك القيم
مثال علي ذلك تحويل ال kg الي pounds
الصيغه العامه هي
kg = pounds / 2.2;
pounds = kg * 2.2;
مثال علي ذلك شخص وزنه = 85 كيلو كم يساوي بال pounds ؟
pounds = 85 / 2.2
pounds = 187
قبل ان نقوم بالتصميم عليك ان تتعرف علي ال operators المستخدمه في العمليات الحسابيه
/ = للقسمه
* = للضرب
- = للطرح
+ = للجمع
وعليك ايضا ان تتعرف كيف يمكنك ان تطبع المتغيرات ولكن هذا سوف نناقشه بعد روؤية المثال لكي اوضح لك الامور بصوره افضل
#include <stdio.h>
int main(void)
{
int kg;
int pounds = 0;
int max = 300;
for(kg = 0 ; kg < max ; kg++)
{
pounds = kg * 2.2;
printf("Kg = %d , pounds = %d\n", kg , pounds);
}
return 0;
}
اعرف ان الامور اصبحت معقدة الان ولكن اطمئن ,
اولا قمنا بتعريف ثلاث متغيرات
kg ولم نقم باعطائه اي قيمه
pounds واعطيناها القيمه صفر
max واعطيناها القيمه 300
والان ماذا تعنيي :
for(kg = 0 ; kg < max ; kg++)
{
pounds = kg * 2.2;
printf("Kg = %d , pounds = %d\n", kg , pounds);
}
هذا نوع من العمليات في السي يسمي بالتكرارات
يمكن ان تقوم بوظيفة ما عدة مرات الي ان يتحقق لك الشرط الذي تريده "سوف نناقشها بالتفصيل لاحقا في فصل اخر هي واخواتها"
الصيغه العامه لها
for( declaration ; condetion ; increment/decrement)
تقوم باعطائها اعلان عن قيمة متغير , وتقوم باعطائها شرط , وتقوم باعطائها قيمه للازاده او النقصان
وتقوم هي بتنفيذ ال block الخاص بها " انت تعرف ماهو ال block"
قمنا اولا باسناد القيمه صفر الي kg مره واحده فقط في بداية التكرار
ثم قمنا بوضع الشرط انه طالما kg اقل من max عن طريق ال >
تقوم بتنفيذ kg++ والتي تعني قم بازادة قيمة kg واحد في كل مره يتحقق فيها الشرط وينفذ ال block
والان نقوم بتنفيذ المعادلة
pounds = kg * 2.2;
نقوم بضرب kg * 2.2 ثم اسناد قيمتهم الي pounds وذلك في statement واحده
ثم نقوم باستخدام دالة الاخراج printf لطباعة القيم وذلك يتطلب بعض الشرح
ماذا تعني %d و %d الاخري تلك
تسمي بحافظات المكان "سوف تتعرف اليها بالتفصيل لاحقا"
يكي تقوم بطباعة متغير لابد ان يكون له حافظة مكان في السلسلة النصيه ل printf
وذلك عن طريق وضع الحافظ الخاص بالمتغير
int = %d
char = %c
double and float = %f
وتقوم printf بوضع المتغيرات في اماكنها الصحيحه بالترتيب كما لاحظت
نظرة سريعه مره اخري :
نقوم بتعريف المتغيرات , نقوم بعمل تكرار لكي نحقق المعادلة
التكرار يتكرر فقط حين تكون قيمة kg اقل من max
نقوم بتحقيق المعادلة وطباعة المتغيرات , تتم زيادة قيمة kg ب 1 في كل مره ينفذ فيها ال block
حين تصل kg الي 300 لا يتم تحقيق ال block وينتهي التكرار وتقوم بالانتقال الي الخطوه الثانيه وهي انهاء main والعوده الي النظام
لنقم بعمل ذلك ولكن بطريقه مختلفه , نستطيع فيها ان نقوم بطباعة القيم الغير صحيحه
حيث انه اذا لاحظت اننا استخدمنا النوع int الذي لايحتوي علي فواصل عشرية
لنقم الان بعمل تغير بسيط
اجعل المتغير pounds متغير float وقم بتغير العلامه %d التي تشير الي pounds في printf الي %f بدلا من %d
ليصبح شكل البرنامج كالاتي
#include <stdio.h>
int main(void)
{
int kg;
float pounds = 0.0;
int max = 300;
for(kg = 0 ; kg < max ; kg++)
{
pounds = kg * 2.2;
printf("Kg = %d , pounds = %f\n", kg , pounds);
}
return 0;
}
قبل ان انسي \n الي اضعها في اخر السطر تعني new line
وهي نوع معين من الاشارات يمسي ب escape seqence له معني خاص للدالة printf حيث يمكن من خلاله ان تقوم بطباعة سطر جديد مكان ماوجدت \n مثلا my name is \n mohamed سوف تقوم بطباعة
my name is
mohamed
هناك عدة اشارات اخري ولكن سوف نناقشها لاحقا
والان حان وقت بعض الاسالة :
هل يمكنني ان اقوم بتحديد عدد الارقام بعد الفواصل العشريه ؟
يمكن ذلك , مثلا
printf("Kg = %d , pounds = %.2f\n,kg,pounds);
قم بتغيرها لكي تري ماذا قد حدث
لقد قمت بوضع رقم لكي يحدد قيمة التدقيق في الفواصل العشريه
لن يقوم بطباعة اكثر من رقمين بعد الفاصل العشري
وماذا لو كنت اريده ان لايطبع اكثر من ثلاثة ارقام قبلها وبعدها ؟
%3.3f
وضحت الرؤيه اظن ؟
الان وقد ختمنا الفصل الثاني دعني اسالك واطلب منك بعض الطلبات :
اي من التعريفات الاتيه صحيحه وايها خاطئه ؟
int 12x;
int x;
int ^x;
هل هناك اختلاف بين
char A و char a ?
كيف يمكنك ان تقوم بتحقيق المعادلة 5* 4 واسنادها الي المتغير x ?
ماالفارق بين %d و %f ؟
كيف يمكن ان اقوم باظهار
c
is
a
beautiful language
والان والواجب :
قم بكتابة برنامج يقوم بعمل الاتي
العد من 0 الي 10
طباعة جملة hello 5 مرات
طباعة الدرجات الحراريه من 0 الي 300 بالسليزيوس والفهرنتهايت
علما بانه يمكن التحويل بينهمها عن طريق
C=(F-32) * (5/9)
الي اللقاء في الفصل القادم