اخواني في المنضمة لكم هذا الشرح في لغة السي
الفصل الول:
نظرة تاريخية و ملمح عامة … C لغة
لغة متفردة في ملمحها ومنشآتها، وتتميز بأنها سلح قوي للمبرمج، فهي تؤدي العديد مما ل C لغة
تستطيع اللغات الخرى – عالية المستوى- أن تؤديه كما تتيح للمبرمج التحكم بصورة أفضل في
قد أصبحت لغة العصر. C الكمبيوتر، ولذلك فإن لغة ال
ليست جديدة فإنها لغة سريعة التطور ، حيث أبتكرها " دينيس C و على الرغم من أن لغة ال
The C ( ريتشي" في أوائل السبعينات وقدمها بالشتراك مع " بريان كارينجان" في كتابهما
والذي يعد المرجع الساسي في اللغة. ومنذ ذلك الحين واللغة ) programming language
في تطور مستمر.
++C وتتميز لغة ++C تطورا سريعا ليظهر منها المتداد الذي يطلق عليه C وتطورت لغة
Object Oriented( باعتمادها أساسا جديدا من طرق البرمجة وهو ما يطلق عليه
وهي الصورة الحدث ++Visual C الطريق لظهور لغة ++C ومهدت لغة .) Programming
من اللغة والتي تعمل في بيئة الويندوز.
قامت مؤسسة القياسات المريكية في عام 1983 C ونتيجة تزايد استخدام لغة
فأصدرت اللغة القياسية التي يطلق عليها C بعملية توحيد للهجات المختلفة التي كادت أن تنتشر للغة
وهي تحتوي على بعض الضافات إلى اللغة الصلية التي ابتكرها ريتشي. " ANSI C "
ما هو البرنامج:
البرنامج اصطلح يرمز لعدد محدد من الوامر التي تعطى للكمبيوتر، بغرض تنفيذ مهمة محددة أو
أداء وظيفة مطلوبة.
أن البرنامج ما هو إل معمار دقيق التصميم يعتمد في بنائه على C ومن أهم ملمح البرمجة بلغة
) function ( البلوكات الجاهزة التي تتكامل معا لتصنع البناء الضخم.و البلوك أو مايسمى بالدالة
ما هو إل مجموعة من الوامر متعلقة بجزء محدد من البرنامج، وتنتج البلوكات من تقسيم البرنامج
إلى أجزاء أصغر لكل وظيفته التي يتم تحديدها بالوامر التي تكتب في البلوك.
و استخدام البلوكات الجاهزة يوفر الوقت ول سيما عندما نرغب في تطوير البرنامج أو إحداث تغيرات
جذرية به. وليس هذا هو الحال مع لغة مثل بيسك حيث يبني المبرمج البناء كله من البداية، فإذا أراد
المبرمج تعديل البرنامج فإنه يعيد كتابتة أو على القل يعيد كتابة أغلب أجزائة.
استخدام البلوكات الجاهزة الموجودة بمكتبات المبرمجين الخرين، أو بناء مكتبة C ونستطيع مع لغة
من الدوال للستعانة بها وقت الحاجة.
وهناك خطوات مطلوبة لتنفيذ أي برنامج وهي:
Editors( ( -1 كتابة البرنامج وحفظة على القرص باستخدام أحد برامج التحرير
وينتج عن هذه العملية البرنامج الهدف الذي يحمل عادة ) compilation ( 2- عملية الترجمة
OBJ" . " المتداد
وينتج عن هذه العملية البرنامج التنفيذي الذي يحمل )Linking ( 3- عملية الربط بمكتبة اللغة
والبرنامج التنفيذي هو البرنامج الذي يتم تنفيذه بمجرد إدخال اسمه . ."EXE" المتداد
"Quick C" أو "Terbo C " وهناك العديد من برامج الترجمة الشهيرة على الكمبيوتر مثل
وتلك البرامج تحتوي على بيئة مجمعة تشمل محررا لكتابة البرنامج، و قوائم ذات نوافذ بها أوامر
الحفظ والترجمة و الربط و التنفيذ.
-------------------------------------------------------------------
C : الفصل الثاني : مبادئ لغة ال
C 1- البرنامج الول بلغة ال
من أفضل الطرق للبدء بتعلم لغة جديدة النظر لحد البرامج البسيطة المكتوبة بهذه اللغة ودراسة
أجزاءه كل على حدة، ولنتخذ برنامجا متكامل جاهزا للتنفيذ.
يوضح البرنامج التالي برنامجا صغيرا يطبع على الشاشة عند تشغيله العبارة
" Hello C"
CODE
#include <stdio.h>
main)(
{
printf ) “Hello C”(;
}
فهي المسئولة عن طباعة العبارة المطلوب طباعتها printf إن البرنامج يعتمد أساسا على الدالة
مبنية من دوال مختلفة لكل وظيفتها المحددة، C على الشاشة. وعندما تتقدم في اللغة ستجد أن لغة
كما ذكرنا سابقا.
المطلوب منها ل تستخدم بمفردها بل لبد أن تأتي بداخل الطار الموضح printf ولتؤدي الدالة
بالشكل السابق حتى تتمكن من القيام بعملها.
يعقبها القوس اليسر " { " والذي تتالى بعده main والطار الذى يحوي البرنامج يبدأ بكلمة
عبارات البرنامج، ثم ينتهي بالقوس اليمن " } ".
و البلوك الذي يبدأ بكلمة . )block( ويطلق على الجزء المحتوى بين القوسين " { } " اسم البلوك
يسمى بلوك البرنامج. )main(
وفي المثال السابق يتكون البرنامج من بلوك واحد هو بلوك البرنامج.
والسطر الول من البرنامج والمحصور بين العلمتين " /* */" يسمى التعليق ويستخدم التعليق
لكتابة الملحظات على البرنامج، ومن المفيد دوما كتابة التعليقات لتسهيل مراجعة البرنامج .
يتجاهل تماما كل ما يأتي بين هاتين العلمتين. ويجوز C وعند ترجمة هذا البرنامج فإن مترجم لغة
أن تضيف إلى البرنامج ما تشاء من الملحظات وفي أي مكان من البرنامج وبأي عدد من السطور
مادمت تبدأ وتنتهي بالعلمتين المميزتين" /* " ، " */ ".
وهو ل يمثل ) Directive ( أما السطر الثاني والذي يبدأ بالعلمة الخاصة " # " فيسمى بالتوجيه
جزءا من منطق البرنامج ولكنه يستخدم لتوجيه المترجم أثناء الترجمة ، حيث يدله على مكان الملف
Standard Input( والذي يطلق عليه اسم ملف العناوين للدخل و الخرج أو " stdio.h "
) Output header file
ويجب اللتزام بسطور التوجيه لن هناك دوال لبد لها من إستدعاء ملفات خاصه بها، وعندما
نستخدم دالة دون استخدام سطر التوجية الخاص بها نحصل على خطأ من المترجم عند بداية
الترجمة.
ولبد من مراعتها عند كتابة البرامج ومن هذه القواعد C و هناك قواعد بسيطة لكتابة البرنامج بلغة
ما يمكن التسامح فيه فمثل المسافات الخالية والسطور التي تفصل ما بين الكلمات والعبارات كلها
اختيارية ويمكن الستغناء عنها.
ولكن هناك من القواعد ما يجب اللتزام به :
-1 تكتب التوجيهات على سطر مستقل.
وتنتهي كل عبارة )staements ( في تكوين عبارات البرنامج ) printf -2 تستخدم الدوال ) مثل
بفاصلة منقوطة. والفاصلة المنقوطة لغنى عنها حتى لو كان البرنامج محتويا على عبارة واحدة،
وأغلب الخطاء التي نحصل عليها تكون نتيجة نسيان فاصلة منقوطة.
-3 تتطلب بعض الكلمات الخاصة باللغة أن نعقبها بمسافة خالية على القل وإل تعرضنا لرسالة خطأ
من المترجم عند ترجمة البرنامج.
بالحروف ) printf مثل أسماء الدوال )مثل ) key words ( -4 تكتب الكلمات المفتاحية للغة
)Small letters( . الصغيرة
2- الطباعة على الشاشة
لطابعة النصوص على الشاشة وهي كأي دالة أخرى تأتي متبوعة بقوسين printf تستخدم الدالة
نكتب بينهما النص المطلوب طباعته بين علمتي اقتباس.
وكل ما نكتبة بين علمتي القتباس يظهر كما هو على الشاشة ولذلك يصطلح على تسميته بالحرفي )
. )string
printf والبرنامج الموضح في الشكل التالي يحتوي على عبارتين تستخدم في كل منهما الدالة
لطباعة حرفي معين على الشاشة
CODE
#include <stdio.h>
main)(
{
printf)“Welcome ”(;
printf)“ C Programmer”(;
}
وناتج البرنامج موضح بالشكل التالي
WelcomeC Programmer
ونلحظ أن العبارتين طبعتا على الشاشة دون أي فاصل بينهما.
و لكننا حتما نريد الفصل بين العبارات المختلفة فمثل ماذا لو أردنا النتقال لسطر جديد لتطبع العبارة
الثانية على سطر مستقل؟
إن النتقال لسطر جديد يستلزم إضافة علمة خاصة إلى نهاية الحرفي الول، وتسمى هذه العلمة
)n\ ( وتكتب كالتي ) new line character ( بعلمة السطر الجديد
ولنجرب إستخدام هذه العلمة وذلك كما هو موضح في الشكل التالى
CODE
#include <stdio.h>
main)(
{
printf)“Welcome \n”(;
printf)“ C Programmer”(;
}
وعند تنفيذ هذا البرنامج نحصل على النتيجة التالية
Welcome
C Programmer
ومما يجب ملحظته أن علمة السطر الجديد تكتب بداخل علمتي القتباس ول تظهر على الشاشة
كما هي !!!
وذلك لن المترجم يفهم العلمات الخاصة على نحو ما وتعتبر أمرا من الوامر يقوم بتنفيذها بالصورة
المطلوبة.
ويمكن استخدام دالة الطباعة لتطبع على الشاشة محتويات بطاقة تحمل السم والعنوان كما هو
موضح بالشكل التالي
Future Horizons Co.
81 emarat othman
NasrCity
Cairo
و البرنامج المستخدم لطباعة هذة البطاقة موضح بالمثال التالي
CODE
#include <stdio.h>
main)(
{
printf)“Future Horizons Co.\n”(;
printf)“81 emarat othman \n“(;
printf)“NasrCity\n”(;
printf)“Cairo\n”(;
}
3- التعامل مع العداد
أن نعرض الرقام على الشاشة بل يمكننا أيضا أن printf يمكن باستخدام عبارة الطباعة و الدالة
تقييم التعبيرات الحسابية وطباعة النتيجة printf نجري العمليات الحسابية المختلفة فتتولى الدالة
على الشاشة.ومن الملحظ أن العداد ل تحتاج لعلمات اقتباس.
يجب أن نفرق بين نوعين من العداد: C وفي لغة
Integers(( -1 العداد الصحيحة
)Real numbers( 2- العداد الحقيقية
أما العداد الصحيحة فهي تلك العداد التي ل تحوي كسورا. بينما تحتوي العداد الحقيقية على
علمة عشرية ) بصرف النظر عن وجود كسر من عدمه(.
فورمات العداد:
يلزم إخبار الكمبيوتر دائما عن نوع العدد باستخدام صيغة خاصة )فورمات( تأتي بداخل علمتي
القتباس، لن الكمبيوتر يتعامل مع كل نوعية من العداد بطريقة مختلفة تماما.
ولتوضيح استخدام الفورمات انظر الشكل
CODE
#include <stdio.h>
main)(
{
printf)“%d \n”,130(;
printf)“%f\n”,130.5(;
}
وفي هذا البرنامج استخدمنا نوعين من العداد و لكل منهما له فورمات الخاصة به فنجد أن رمز
)d% ( الفورمات المستخدم مع العدد الصحيح هو
بمعنى رقم عشري أي مكتوب بالنظام ) decimal ( بهذا الرمز هو اختصار كلمة ) d ( والحرف
العشري.
بهذا الرمز هو اختصار ) f ( والحرف )f% ( أما رمز الفورمات المستخدم لطباعة العدد الحقيقي فهو
وهي العداد ذات العلمة العشرية. ) floating point number ( كلمة
وعند تنفيذ البرنامج السابق نحصل على النتيجة الموضحة بالشكل
130
130.5
ويجب على المبرمج تحري الدقة التامة عند التعامل مع الفورمات ، فل نستخدم فورمات العداد
الحقيقية مع العداد الصحيحة أو العكس. لن الخطأ في الستخدام ينتج عنه نتائج غير صحيحة.
التعبيرات الحسابية:
كما ذكرنا سابقا فأن دالة الطباعة يمكنها أيضا أن تجري العمليات الحسابية المختلفة وتطبع النتيجة
على الشاشة.
وتستخدم المؤثرات الحسابية الموضحة ادناه لبناء التعبيرات الحسابية:
مؤثر الجمع +
مؤثر الطرح -
مؤثر الضرب *
مؤثر القسمة /
) printf( والمثال التالي يوضح استخدام المؤثرات الحسابية مع الدالة
CODE
#include <stdio.h>
main)(
{
printf)“%d\n”,128*2(;
printf)“%f\n”,128.0/2(;
}
وعند تنفيذ البرنامج نحصل على الناتج الموضح بالشكل التالي
256
64.000000
4- استخدام المتغيرات
يقوم الكمبيوتر بتخزين البيانات التي يحتاجها في الذاكرة والمتغيرات ما هي إل عناوين خانات في
الذاكرة التي نحفظ فيها البيانات. ولتسهيل الوصول للبيانات المختزنة يتم في لغات البرمجة عالية
المستوى استبدال العناوين الرقمية بأسماء المتغيرات.
ويكفينا هنا - لو كنا مبتدئين في البرمجة- أن نتذكر دائما أن المتغير ما هو إل اسم لحد الماكن التي
تختزن فيها البيانات في الذاكرة.
)Identifiers ( باسماء البيانات C وأسماء المتغيرات يصطلح عليها في لغة ال
وهناك قواعد محددة لختيار أسماء البيانات وهي:
أو الكلمات التي ) Reserved words ( -1 أل يكون اسم البيان أحد الكلمات المحجوزة باللغة
ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر التشغيل ) main ( تحمل معنى خاصا مثل
المصاحب للمترجم.
سواء صغيرة كانت أم )A-Z ( -2 يمكن أن يحتوي السم على أى حرف من الحروف البجدية
9 ( كما يمكن أن تحتوي على علمة الشرطة السفلى ) _ ( ولكن ل - كبيرة، وأي رقم من الرقام ) 0
يجوز أن يبدأ السم برقم.
-3 ل قيود على طول السم ، وتتيح هذه الميزة استخدام أسماء معبرة عن مضمونها، ومن الفضل
دائما استخدام السم المعبر عن محتوى المتغير لتسهيل عملية فحص البرنامج في حالة الخطأ من
جهة، ولتسهيل عملية الضافة والتعديل للبرنامج.
)MY_NUMBER( فمثل اسم البيان C -4 الحروف الكبيرة و الصغيرة ليست متكافئة في لغة
.)My_Number ( وكلهما يختلف عن السم )my_number ( يختلف عن السم
العلن عن المتغيرات:
العلن C ليتمكن المستخدم من استخدام المتغيرات التي يريدها يتطلب البرنامج المكتوب بلغة
المسبق عن أسمائها ونوعياتها في مستهل البرنامج .
وتصنف المتغيرات بحسب البيانات التي يمكن أن تختزن فيها فهناك المتغيرات الصحيحة ) أي التي
تصلح لختزان العداد الصحيحة( و هناك المتغيرات الحقيقية ) أي التي تختزن العداد الحقيقية(،
ومع تقدمنا في اللغة سنتعرف على نوعيات أخرى من المتغيرات.
والشكل التالي يوضح برنامجا قمنا فيه بالعلن عن المتغيرات
CODE
#include <stdio.h>
main)(
{
/* variable declaration*/
int a;
float b;
/*Display output */
printf)“%d\n”,a(;
printf)“%f\n”,b(;
}
وهو من النوع الصحيح ) )a( وكما نرى في البرنامج أنه قد تم العلن عن متغيرين الول
للعلن عنه. int وقد استخدمنا الكلمة )integer
للعلن float وقد استخدمنا معه الكلمة )Real( وأما المتغير الثاني )فهو يختزن العداد الحقيقية
عنه.
وكما ذكرنا سابقا، نلحظ أن عبارة العلن تنتهي بفاصلة منقوطة كسائر عبارات البرنامج، كما أنه
)float أو int ( يلزم ترك مسافة خالية على القل بعد كل من الكلمات المحجوزة
ولننا لم نخزن في هذين المتغيرين أية a,b وبعد ذلك تقوم بقية البرنامج بطباعة محتوى المتغيرات
بيانات فإن ما نحصل علية ليس إل بعض المخلفات الموجودة في الذاكرة، وهي بل معنى على
الطلق والشكل التالي يوضح مثال لهذة المخلفات كنتيجة لتشغيل البرنامج
22348
476.950
Assignment ( تخزين البيانات في المتغيرات
في البرنامج السابق لحظنا أنه لبد من أن تختزن عددا ما في المتغير العددي الذي أعلنا عنه ويتم
ويوضح الشكل التالي برنامجا )assignment statement ( ذلك باستخدام عبارة التخصيص
قمنا فية بالعلن عن متغيرين و إختزان بيانين عدديين في كل منهما ، ثم نطبع محتويات هذين
المتغيرين على الشاشة.
CODE
#include <stdio.h>
main)(
{
/* variable declaration*/
int a;
float b;
/* Assignment */
a=1000;
b=796.5;
/*Display output */
printf)“%d\n”,a(;
printf)“%f\n”,b(;
}
وعند تنفيذ هذا البرنامج نحصل على النتيجة الموضحة بالشكل
1000
796.5
: ) Assignment statment ( عبارة التخصيص
إن العبارة
;a=1000
يمكن قرائتها على النحو التالي:
"a" خصص العدد 1000 للمتغير
ومن الجائز أن نخصص متغيرا لمتغير آخر ، ومعنى ذلك أننا نضع نسخة من المغير الول في المتغير
الثاني.
أما لو قمنا بتخصيص تعبير حسابي يحتوي على متغيرات وقيم عددية لمتغير ما فأن البرنامج في هذه
الحالة يجري عملية تقييم للتعبير الحسابي ويضع قيمته النهائية في المتغير المقصود.
ويوضح المثال التالي ثلث عمليات تخصيص كالتي:
a" " -1 تخصيص قيمة عددية للمتغير
b" " على 2 وتخصيص الناتج للمتغير "a " 2- قسمة محتويات المتغير
."c " وتخصيصها للمتغير "a" ، " b " 3- جمع محتويات كل من
CODE
#include<stdio.h>
main)(
{
int a;
float b,c;
a=1024;
b=a/2.0;
c= b+a;
printf)“The result is %f\n”,c(;
}
في عبارة واحدة وقمنا "b" ، " c " ومن الملحظ في هذا البرنامج أنه قد تم إعلن المتغيرين
بإستخدام علمة الفاصلة للفصل بينهما.
"c " ونتيجة البرنامج النهائية هي طباعة محتويات المتغير
التخصيص المتعدد:
أن نخصص قيمة ما لكثر من متغير في نفس العبارة كالتي: C يمكننا في لغة
;a = b = c = 24
تخصيص قيم ابتدائية المتغيرات:
يمكن أيضا شحن المتغير بقيمة إبتدائية أثناء العلن عنه كالتي:
; float a = 5.6
ونقوم بشحن المتغيرات بقيمة ابتدائية عند العلن عنها لضمان تنظيف وعاء المتغير من مخلفات
الذاكرة.
-5 التحكم في الفورمات
عند تنفيذ البرامج السابقة رأينا أن العداد الحقيقية تظهر على الشاشة متبوعة بعدد من الصفار.
ومما ل شك فيه أننا في التطبيقات الحقيقية قد نرغب في تعديل هذه الصورة لتحتوي على رقمين
عشريين أو رقم واحد، كما أننا قد ل نرغب في مشاهدة الصفار الزائدة على الطلق. فالفضل أن
نرى العدد
25.0000000
مكتوبا بالصورة
25
ويتم ذلك باستخدام علمات خاصة لتعديل مواصفات الفورمات يطلق عليها علمات تعديل الفورمات )
) format modifiers
والشكل التالي يوضح طرقا مختلفة لطباعة الرقم الحقيقي 25
الوصف | التأثير على شكل الناتج | النتيجة
0 | حذف جميع الصفار الزائدة | 25 f.%
3 | إظهار ثلث أصفار فقط بجوار العلمة | 25.000 f.%
يتحكم في عدد الصفار التي تظهر على يمين f ومن هذا الجدول نلحظ أن الرقم السابق للحرف
العلمة العشرية.
والمثال التالي يوضح برنامجا لطباعة العدد 75 بصور مختلفة
CODE
#include <stdio.h>
main)(
{
float x;
x=75;
printf)“%.0f\n”,x(;
printf)“%.1f\n”,x(;
printf)“%.2f\n”,x(;
}
وعند تنفيذه نحصل على الناتج الموضح بالشكل
75
75.0
75.00
والن ماذا لو كان العدد المطلوب طباعته محتويا على كسر عشري مثل
25.8756
واستخدمنا تعديل في الفورمات لطباعته ؟ إن ما يحدث في هذه الحالة هو تقريب العدد إلى عدد من
الخانات العشرية بحسب الرقم المستخدم في الفورمات
في صور مختلفة وبدرجات مختلفة من ¾ ويمكنك تجربة البرنامج التالي لطباعة قيمة الكسر
التقريب.
CODE
#include <stdio.h>
main)(
{
printf)“%.0f\n”,3.0/4.0(;
printf)“%.1f\n”,3.0/4.0(;
printf)“%.2f\n”,3.0/4.0(;
}
وناتج هذا المثال هو الموضح بالشكل
1
0.8
0.75
: ) char variable ( 6- متغير الرمز
ذكرنا فيما سبق أننا سنلتقي مع أنواع أخرى من المتغيرات، والن بعد أن تعرفنا على المتغيرات
)character ( العددية نتعرف على نوع آخر من المتغيرات وهو ما يصلح لتخزين رمز واحد
.) char ( ويطلق على هذا النوع من المتغيرات السم
و الرموز التي يمكن تخزينها في هذا النوع من المتغيرات فهي قد تكون رموزا موجودة في جدول
وهو جدول يحتوي الرموز المعتمدة من هيئة المواصفات )ASCII code table ( الكود آسكي
القياسية المريكية، ويضم جميع الحروف والرقام والعلمات الخاصة وعلمات التحكم والرقام
الكودية المناظرة لكل منها.
مثل نستخدم العبارة التالية: "a" و للعلن عن متغير رمز بالسم
;char a
ولتخصيص رمز ما لهذا المتغير فإننا نضعه بين علمتي اقتباس مفردتين كالتي
'a = 'Z
ولطباعة محتويات المتغير ،"Z " محتويا على الحرف " a" و بهذا التخصيص أصبح متغير الرمز
"c% " الرمز نحتاج إلى توصيف جديد للفورمات وهو التوصيف
وهو مخصص لطباعة الرموز. character ,هذا التوصيف يحتوي على الحرف الول من كلمة
"first_letter " والمثال التالي يوضح برنامجا قمنا فيه بالعلن عن متغير رمز بالسم
.c% ثم طبعنا محتويات المتغير باستخدام التوصيف "A " ثم خصصنا لهذا المتغير الحرف
.A وعند تنفيذ هذا البرنامج فإنه يطبع على الشاشة الحرف
CODE
#include <stdio.h>
main)(
{
char first_letter;
first_letter = ‘A’;
printf)“%c\n”,first_letter(;
}
ومن أهم خصائص متغير الرمز أننا نستطيع أن نطبعه بطريقتين مختلفتين:
c.% -1 باستخدام الفورمات
.d% 2- باستخدام الفورمات
في الحالة الولى كما رأينا في المثال السابق فأن الرمز المختزن هو الذي يظهر على الشاشة.
فإن رقم الكود آسكي المناظر للرمز هو الذي يظهر على الشاشة. d% أما لو استخدمنا الفورمات
والمثال التالي يوضح استخدام نوعي موصفات الفورمات مع متغير الرمز
CODE
include <stdio.h>#
main)(
{
char first_letter;
first_letter = ‘A’;
printf)“%c\n”,first_letter(;
;)printf)“%d\n”,first_letter
{
: C في لغة ) String & Pointer( 6- تخزين الحرفيات والمؤشرات
إلى الن تعلمنا كيفية التعامل مع المتغير الرمز ، والمتغيرات العددية.
ول ريب أن كل ) string ( و سنتعلم الن نوعا جديدا من المتغيرات وهو المتغير الحرفي
المبرمجين الذين سبق لهم التعامل مع لغات أخرى مثل البيسك قد تعودوا على إستخدام هذا النوع من
المتغيرات…
لتحتوي متغيرا من هذا النوع بل تختزن الحرفيات بطرية خاصة كرموز متتابعة. C ولكن لغة
وأحدى الطرق المستخدمة لتخزين الحرفيات هي استخدام نوع خاص من المتغيرات يسمى المؤشر )
الذي يشير إلى أول رمز في الحرفي المختزن في الذاكرة كما يتم تمييز نهاية الحرفي ،)pointer
برمز خاص ، وبذلك يمكن الستدلل على أولة و آخرة.
pointers ( المؤشرات
المؤشر متغير كسائر المتغيرات ولكنه يختلف عنها فيما يختزنه من بيانات، فالمؤشر ل يختزن
البيانات العادية مثل الرقام أو الرموز. ولكنة يختزن فقط عناوين الذاكرة، ومن هنا جاء اسمة
كمؤشر لنة يشير مباشرة إلى أحد خانات الذاكرة.
وتختلف طريقة العلن عن المؤشر بحسب البيان المخزون فيه، فإذا كان المؤشر يشير إلى عدد
صحيح مثل فيسمى في هذة الحالة ) مؤشر إلى عدد صحيح ( ويعلن عنه بعبارة كالعبارة التاليه:
;int *a
character ( أما لو كان يشير إلى رمز من الرموز فيسمى في هذه الحالة مؤشر إلى رمز أو
ويعلن عنه بعبارة كالعبارة التاليه: )pointer
char * a
هو اسم المؤشر الذي اخترناه وهو يأتي مسبوقا بالعلمة " * "a " ونلحظ أنه في كلتا الحالتين فأن
" التي تدل على كونه مؤشرا. أما نوع المؤشر فهو يتم تحديدة وفقا لنوع البيان المشار إلية فقد
وهي النواع الثلثة التي ) char ( أو رمزا ) real ( أو حقيقيا ) int ( يكون عددا صحيحا
C عرفناها في لغة
والمثال التالي يوضح كيفية تخصيص متغير حرفي وطباعته على الشاشة، ونلحظ أنه لطباعة
) s% ( الحرفي نقوم بطباعة المؤشر الذي يشير إليه مع استخدام توصيف جديد للفورمات وهو
CODE
#include <stdio.h>
main)(
{
char *a;
a = “Welcome C programmer”;
printf)“%s\n”,a(;
}
وناتج البرنامج هو الموضح بالشكل التالي :
Welcome C programmer
وعند العلن عن مؤشر بالعبارة
;char *a
فأن هذا يؤدي إلى خلق التي:
الذي يشير إلى أول حرف من الحرفي. " a " -1 المؤشر
الذي يحتوي على أول حرف من الحرفي. " a* " -2 المتغير
أن يحاول التدقيق في مفهوم المؤشرات فهي أداة قوية تساعد C من المهم لمن كان جديدا على لغة
المبرمج على إنجاز مهام كثيرة في أقل وقت ممكن، ولكنها في نفس الوقت تمثل مصدرا للخطاء ما
لم تستخدم بصورة مناسبة.
ثم يختزن " a " والمثال التالي يساعدنا على تعميق مفهوم المؤشر، فهو يبدأ بإعلن عن متغير رمز
ويطبع محتويات العديد من المتغيرات المتعلقة بالحرفي. ،" Hello again " فيه الحرفي
CODE
#include <stdio.h>
main)(
{
char *a;
a = “Hello again”;
printf)“%s\n”,a(;
printf)“%c\n”,*a(;
printf)“%d\n”,a(;
printf)“%p\n”,a(;
printf)“%d\n”,*a(;
}
هو رمز " p% " ويلحظ أنه عند تنفيذ البرنامج قد يختلف عنوان الذاكرة المطبوع. ورمز الفورمات
خاص بالمؤشرات ويؤدي إلى طباعة عنوان الذاكرة بالنظام السداسي عشري.
) I/O ( الفصل الثالث : الدخال و الخراج
لطباعة الخرج وفقا لصيغة محددة printf حتى الن قمنا بالطباعة على الشاشة باستخدام الدالة
)فورمات(. و لكن قد يحتاج المبرمج لدخال البيانات في وقت تنفيذ البرنامج ويستلزم ذلك استخدام
دوال لدخال البيانات، وهو ما سنتعرض له الن بشيء من التفصيل.
والمخصصه لدخال البيانات وفقا لصيغة محددة، فهي الدالة ،printf أما الدالة المناظرة للدالة
format" الذي تنتهي به كل من الدالتين هو الحرف الول من كلمة "f " ويعتبر الحرف ، scanf
"
لدخال البيانات. scanf والمثال التالي يوضح كيفية استخدام الدالة
CODE
#include <stdio.h>
main)(
{
float x,y,z;
scanf )“%f”,&x(;
scanf )“%f”,&y(;
z=x+y;
printf)“the sum of the numbers you entered is : %.2f\n”,z(;
}
ثم يتم استقبال قيمة المتغير " x,y,z " يبدأ البرنامج بالعلن عن ثلثة متغيرات من النوع الحقيقي
من لوحة الزرار بموجب العبارة : "x "
scanf )"%f",&x(
وتخصيص الناتج " x,y " بعبارة مماثلة ثم يتم جمع المتغيرين "y" ثم يتم استقبال المتغير الثاني
"z " للمتغير
المحتوي على المجموع. " z " وفي النهاية نطبع قيمة المتغير
فإذا أدخلنا العدد المطلوب وأتبعنا ذلك "x" عند تشغيل البرنامج سوف ينتظر إدخال قيمة المتغير
" y " فإن البرنامج يتوقف مرة أخرى منتظرا إدخال قيمة المتغير ، Enter بالضغط على الزر
وعندئذ يوافينا البرنامج بالنتيجة. Enter متبوعة بالضغط على الزر
فنلحظ ما يلي: scanf والن فلننظر بتفحص لحدى العبارات التي تحتوي على الدالة
وفي المثال السابق printf -1 ضرورة استخدام توصيف للفورمات بنفس السلوب المتبع مع الدالة
y". " أو "x" الذي يناظر المتغير الحقيقي " f% " قد استخدمنا التوصيف
، )x&( صراحة بل استخدمت صورة محورة منه وهي "y" أو "x " 2- لم تستخدم الدالة المتغير
وهي عبارة عن عنوان ) address operator ( وهذه الصورة الجديدة تسمى مؤشر العنوان
address-of ( المتغير ل المتغير نفسه. أما المؤثر الجديد & فيسمى مؤثر العنوان إلى
)operator
إدخال أكثر من قيمة متغير واحد بنفس العبارة:
استخدام عبارة واحدة ودالة واحدة لستقبال scanf يمكننا مع الدالة printf تماما كما مع الدالة
قيم عدة متغيرات كما في المثال التالي
CODE
#include <stdio.h>
main)(
{
float x,y,z;
scanf )“%f%f”,&x,&y(;
z=x+y;
printf)“the sum of the numbers you entered is : %.2f\n”,z(;
}
نلحظ أن الجزء الخاص بالفورمات ) والواقع بين علمتي القتباس ( يحتوي على توصيفين
بنفس عدد المتغيرات التي تأتي مفصولة عن بعضها البعض باستخدام " f %f% " للفورمات
)scanf الفاصلة " , " ) أنظر العبارة المحتوية على الدالة
يجب أن يكون بنفس ترتيب المتغيرات scanf ومن الملحظات الهامه أن ترتيب الفورمات في الدالة
التي سيتم إدخالها. وهذه الملحظة غير واضحة في المثال السابق نظرا لن كل المتغيرين المراد
إدخالهما من نفس النوع.
الفصل بين المدخلت:
ولكن ماذا ، Enter في المثال السابق كانت المتغيرات تدخل كل على حدة متبوعا بالضغط على الزر
لو أردنا إدخال المتغيرين في سطر واحد؟؟؟
المثال التالي يوضح الطريقة الجديدة لدخال المتغيرين في سطر واحد ويتم الفصل بينهما بفاصلة ،
ويتم ذلك بكتابة الفاصلة في البرنامج نفسه كفاصل بين توصيفات الفورمات.
CODE
#include <stdio.h>
main)(
{
int x;
float y,z;
scanf )“%d,%f”,&x,&y(;
z=x+y;
printf)“the sum of %d and %f is : %.2f\n”,x,y,z(;
}
رسالة لتنبية مستخدم البرنامج :
أنها ل يمكن استخدامها لطباعة أي نص على الشاشة كما مع دوال الدخل scanf من عيوب الدالة
في لغة مثل البيسك . وهذا معناه ضرورة الستعانة بدالة الطباعة
إذا أردنا أن نطبع على الشاشة رسالة تنبه المستخدم إلى أن البرنامج ينتظر إدخال بيان مثل: printf
Please Enter the number
في المثال التالي نرى صورة محسنة لدخال قيمتي متغيرين مع طباعة الرسائل اللزمة لتنبية
المستخدم.
CODE
#include <stdio.h>
main)(
{
float x,y,z;
printf)“Enter the first number : ”(;
scanf )“%f”,&x(;
printf)“Enter the second number : ”(;
scanf )“%f”,&y(;
z=x+y;
printf)“the sum of the numbers you entered is : %.2f\n”,z(;
}
ملحظة هامة:
لستقبال الحرفيات من لوحة المفاتيح، حيث يتطلب المر احتياطات scanf ل يوصى باستخدام الدالة
كثيرة . ولستقبال الحرفيات من لوحة المفاتيح توجد طرق أفضل سيأتي الحديث عنها.
طرق جديدة للتعامل مع الحرفيات:
لقد رأينا من قبل كيف يمكننا تخزين الحرفي بالستعانة بالمؤشرات حيث يشير المؤشر إلى الرمز
الول من الحرفي المختزن في الذاكرة . هذا من ناحية بداية الحرفي . أما من ناحية نهاية الحرفي
) NULL character ( فإن البرنامج من تلقاء نفسه يضيف إلى مؤخرة الحرفي الرمز الصفري
وهو الرمز رقم صفر في جدول الكود آسكي.
ويفيد هذا الرمز في تمييز مؤخرة الحرفي و بالتالي في تحديد طوله لتسهيل التعامل معه قراءة وكتابة
ومعالجة بالطرق المختلفة.
وفي الواقع أن هذه الطريقة برغم ما تحتويه من تفصيلت فنية دقيقة لكنها أفضل من الطرق
فمع ،) string variables ( المستخدمة في اللغات الخرى التي تتوفر بها المتغيرات الحرفية
ل توجد أية قيود على طول الحرفي المستخدم. C هذه الطريقة في لغة
) character arrays ( وهنا سنتناول طريقة أخرى لتمثيل الحرفيات وهي مصفوفة الرموز
ومن اسم هذه الطريقة يتضح أنه يتم حجز خانات الذاكرة اللزمة للحرفي مقدما.
العلن عن مصفوفة الرموز:
لننشئ مصفوفة من الرموز فإننا نبدأ بالعلن عنها في بداية البرنامج . ويشمل العلن اسم
أي الحد القصى لعدد الرموز بها . ) size ( المصفوفة وسعتها
employee_name ( فمثل الجملة التالية يتم فيها العلن عن مصفوفة رموز بالسم
CODE
char employee_name[20];
في هذا العلن يتم حجز عشرين خانة في الذاكرة تتسع كل منها لرمز واحد ، كما تخصص الخانة
.) NULL ( الخيرة للرمز الصفري
strcpy ( ولشحن هذه المصفوفة بأحد الحرفيات، فإن دالة خاصة تستخدم لهذا الغرض وهي الدالة
هو الحرفي المراد تخزينه في المصفوفة. "b" هو اسم مصفوفة الرموز، و " a " حيث ) ,) a
تتسع لعشرين رمزا ثم ننسخ إلى "a " والمثال التالي يوضح العلن عن مصفوفة رموز بالسم
وفي النهاية نطبع محتويات المصفوفة باستخدام دالة " Hello again " عناصرها الحرفي
.%s مع استخدام الفورمات المناسبة للحرفيات printf الطباعة
CODE
#include <stdio.h>
#include <string.h>
main)(
{
char a[20];
strcpy)a,”Hello again”(;
printf)“ %s\n”,a(;
}
ومن الملحظ في هذا البرنامج ظهور توجيه جديد هو :
#include <string.h>
هو الملف "string.h " حيث أن الملف strcpy إن هذا التوجيه يصبح لزما عند استخدام الدالة
وبقية دوال الحرفيات، ويطلق على هذا الملف اسم " strcpy " الذي يحتوي على تعريف الدالة
"string header file " ملف العناوين للحرفيات
فعندما . printf والن سنتناول طريقة عمل البرنامج بشىء من التفصيل، ولنبدأ بدالة الطباعة
فغنها تقرأ و تطبع عناصر المصفوفة واحدا بعد الخر حتى " a " تتعامل مع مصفوفة الرموز
تصادف الرمز الصفري فتتوقف.
أما عن طريقة تخزين الرموز في المصفوفة فهناك نقاط جديرة باهتمامنا .
" فإن عناصر المصفوفة تأخذ الرقام المسلسلة من " 0 "a[ إننا عندما نعلن عن المصفوفة " [ 20
إلى " 19 " كالتالي:
CODE
a[0], a[1],…………………..,a[19]
ول يشترط عندما نخصص أحد الحرفيات لهذه المصفوفة أن نشغل جميع العناصر ) الخانات( ففي
المثال السبق مثل عدد رموز الحرفي كانت 11 حرفا و استخدم العنصر الثاني عشر من المصفوفة
لتخزين الرمز الصفري.
طرق مختلفة لدخال الحرفيات:
لدخال الحرفيات من لوحة المفاتيح .والن scanf ذكرنا من قبل أنه ل يوصى باستخدام الدالة
سنستعرض البدائل المختلفة التي تتيحها اللغة لدخال الحرفيات.
: gets الدالة
وهي تقوم بقراءة الحرفي المدخل من لوحة " get string " يعتبر اسم الدالة اختصارا للعبارة
ثم تقوم بتخصيصه للمتغير المطلوب و الذي ) NULL ( المفاتيح ، وتضيف إليه الرمز الصفري
يستخدم كدليل للدالة. وصيغة الدالة كالتي:
;)gets)a
مصفوفة الرموز. " a " حيث
والمثال التالي يوضح استخدام هذه الدالة.
CODE
#include <stdio.h>
main)(
{
char employee_name[20];
gets)employee_name(;
printf)“ Employee: %s\n”,employee_name(;
}
employee " وعندما يبدأ البرنامج سوف ينتظر منك إدخال الحرفي المطلوب وهو اسم الموظف
ثم يخصصه لمصفوفة الرموز المكونة من عشرين عنصرا. وفي النهاية يطبع البرنامج " name
السم على الشاشة كتأكيد لتمام الستلم و الحفظ.
التي تعتبر scanf ويمكننا هنا إدخال السم محتويا على مسافات خالية وذلك على العكس من الدالة
.Enter المسافة الخالية مماثلة للضغط على المفتاح
ولكن هناك قيد على الحرفي المدخل إذ يجب مراعاة أل يزيد طوله عن الحجم المحجوز للمصفوفة مع
العلم بأن المترجم يستغل خانة من المصفوفة لتخزين الرمز الصفري. ففي هذا المثال ل يمكن إدخال
أكثر من 19 رمز فقط.
: fgets الدالة
ويتم تعريف الملف .) input device ( تستخدم هذه الدالة لقراءة حرفي من ملف أو جهاز للدخل
) أو جهاز الدخال ( ضمن صيغة الدالة نفسها كالتالي:
CODE
fgets) a, n, stdin (;
مصفوفة رموز " a " حيث
الحد القصى للرموز المدخلة. " n " و
اسم جهاز الدخل القياسي ) لوحة المفاتيح ( "stdin " و
باجهزة أخرى حسب الموقف و لكننا في الوقت stdin ويمكن بالطبع استبدال جهاز الدخل القياسي
الحالي سوف نكتفي بلوحة المفاتيح كجهاز للدخل .
عند استخدام هذه الدالة في إدخال الحرفيات فإنها تضيف إلى مؤخرة الحرفي كل من :
n (.\ ( -1 علمة السطر الجديد
.) NULL ( 2- الرمز الصفري
ولذلك فإنه مع هذه الدالة لبد وأن نخصص عنصرين في المصفوفة لهذين الرمزين .
والمثال التالي يوضح استخدام هذه الدالة
CODE
#include <stdio.h>
main)(
{
char employee_name[20+2];
fgets)employee_name,22,stdin(;
printf)“ Employee: %s\n”,employee_name(;
}
طرق مختلفة لطباعة الحرفيات:
سنتناول الن بعضا من دوال الخرج التي تصلح لطباعة الحرفيات بطريقة مبسطة.
:puts الدالة
وصيغة gets وهي الدالة المقابلة لدالة الدخل " put string " اسم هذه الدالة إختصار للعبارة
هذه الدالة كالتي:
puts ) a(;
ثابت حرفي ، أو مصفوفة رموز. a حيث
gets والمثال التالي يوضح استخدام هذه الدالة لطباعة رسالة لتنبيه المستخدم قبل استخدام الدالة
لستقبال البيان
CODE
#include <stdio.h>
main)(
{
char employee_name[20+1];
puts)“Enter employee_name: ”(;
gets)employee_name(;
puts)employee_name(;
}
وعند تنفيذ البرنامج نلحظ أن السم المدخل قد جاء على سطر مستقل بعد رسالة التنبيه . وذلك لن
"n\ " عندما تطبع حرفيا على الشاشة تطبع في مؤخرته علمة السطر الجديد puts الدالة
:fputs الدالة
فهي تستخدم لرسال الخرج إلى ملف أو جهاز الخرج المذكور fgets هذه الدالة هي المناظرة للدالة
اسمه ضمن بارامترات الدالة.
وصيغة الدالة كالتي:
fputs) a, stdout (;
مصفوفة رموز أو ثابت حرفي. a حيث
اسم جهاز الخرج القياسي وهو جهاز الشاشة. " stdout " و
ومن الطبيعي استبدال جهاز الشاشة كما يتطلب التطبيق.
في أنها ل تطبع علمة السطر الجديد في نهاية الحرفي. puts تختلف عن fputs والدالة
الفصل الرابع : المؤثرات
كأي لغة أخرى – تتعامل مع التعبيرات، وتتكون التعبيرات من الثوابت و المتغيرات – C إن لغة
المرتبطة ببعضها البعض بواسطة المؤثرات.
والمؤثرات تنقسم إلى عدة أنواع هي:
Arithmetic Operators ( ( -1 المؤثرات الحسابية
Relational Operators ( ( 2- المؤثرات العلقية
) Logical Operators ( 3- المؤثرات المنطقية
: ) Arithmetic Operators ( المؤثرات الحسابية
استخدام العديد من المؤثرات الحسابية، منها المؤثرات الساسية والتي تقوم بالعمليات C تتيح لغة
الحسابية الساسية وهي الموضحة أدناه
)+(الجمع
- (( الطرح
)*(الضرب
/(( القسمة
وهي الموضحة أدناه C وبالضافة لهذه المؤثرات توجد مؤثرات خاصة بلغة
%( ( باقي القسمة
--( ( النقصان
)++( الزيادة
وسنتناول بشيء من التفصيل استخدام هذه المؤثرات الخاصة.
مؤثر باقي القسمة
x % y : الصورة العامة لستخدام هذا المؤثر هي
والشكل التالي يوضح استخدام المؤثر والناتج ، " y " على " x " ويكون الناتج هو باقي قسمة
CODE
7%3
7/ ويكون الناتج لهذه العملية هو " 1 " وهو باقي القسمة للعددين 3
: )Decrement & Increment( مؤثرات الزيادة والنقصان
انها تستعمل الداتين الحسابيتين ++ و – لزيادة القيم بمقدار 1أو انقاصها C من مزايا لغة ال
بمقدار 1 والمثال التالي يوضح طريقة الستعمال :
CODE
X++;
++X;
ويمكن كتابته بصورة مكافئة على النحو التالي : X ومعناه اضافة قيمة 1 الى
CODE
X=X+1;
على النحو التالي : X وبالطريقة نفسها يمكن انقاص 1 من قيمة
CODE
--X;
X--;
وهو يكافيء الصورة :
CODE
X=X-1;
X=X+ اسرع من التعبير 1 X++ لكن هناك فرقا في سرعة التنفيذ , فالتعبير
وهذه هي الفائدة من جراء استخدام مثل هذه الدوات
: ) Relational Operators ( المؤثرات العلقية
يرجع اسم المؤثرات العلقية الى العمليات المختصة بالقيم التي بينها علقات وهو اجراء عمليات
)false( أو ل )true( مقارنة بين كميات حسابية او رمزية , وتكون نتيجة منطقية وهي اما نعم
أية قيمة غير )true( على انها صفر " 0 " وتأخذ النتيجة )false( وفي لغة السي تعامل النتيجة
. " الصفر والمشهور أنها " 1
ويبين الشكل التالي المؤثرات العلقية :
int a=b= نفرض ان : 3
: ) Logical Operators ( المؤثرات المنطقية
الفصل الخامس : اتخاذ القرار
تعرضنا حتى الن لبرامج متتالية الوامر، حيث ينفذ الكمبيوتر العبارات الموجودة في البرنامج
بالترتيب الذي وردت به .
ولكن في الحياة العملية نحتاج لتخاذ بعض القرارات تبعا لشروط معينة، ومن هنا ظهرت الحاجة
لوجود طرق لجعل البرنامج قادرا على تغيير تسلسل تنفيذ التعليمات تبعا للشروط المطلوبة.
وكيفية تغيير تسلسل التنفيذ تبعا للشروط C وسنتعرض هنا لطرق اتخاذ القرار في لغة ال
الموضوعة.
if statement ( العبارة الشرطية البسيطة
تكوين العبارة الشرطية البسيطة كما هو موضح بالشكل
CODE
if ) condition (
statement;
هو القرار المراد اتخاذه عند تحقق الشرط ) statement ( هو الشرط و ) condition ( حيث
المعطى.
وعندما ترغب في تنفيذ أكثر من عبارة بتحقق الشرط نستبدل العبارة التي تمثل القرار المراد اتخاذه
ببلوك به العبارات المراد تنفيذها.
ولتوضيح استخدام العبارة الشرطية البسيطة أنظر البرنامج التالي
CODE
#include <stdio.h>
main)(
{
float sum;
printf)“\n Enter the Sum : “(;
scanf)“%f”,sum(;
if )sum >50(
printf )“\n The student had passed”(;
}
وفي هذا البرنامج يطبع الكمبيوتر رسالة ليسأل المستخدم عن مجموع الطالب وبعد ذلك يقوم
بمقارنتها بالشرط اللزم للتأكد من النجاح ) وهو تجاوز المجموع 50 (فإذا تحقق الشرط يطبع
الكمبيوتر رسالة للمستخدم يعلمه أن الطالب ناجح،
)if ……. else statement ( العبارة الشرطية الكاملة
إن اتخاذ القرارات في الحياة العملية ليست بالسهولة التي ذكرت في البرنامج السابق، إذ نحتاج في
معظم الحيان لتخاذ اجراء تبعا لشرط معين، واتخاذ إجراء آخر إذا لم يتحقق هذا الشرط.
؟؟ لو نظرنا للبرنامج السابق لوجدنا سؤال ملحا : ماذا لو كان مجموع الطالب أقل من 50
الجابة على هذا السؤال هي أن الطالب يكون راسبا. ولكن البرنامج ل يتضمن أمرا بإعطاء حالة
الرسوب، لننا استخدمنا عبارة الشرط البسيطة والتي تستجيب لشرط واحد.
وسنتعرض الن لعبارة مركبة كما في البرنامج التالي:
CODE
#include <stdio.h>
main)(
{
float sum;
printf)“\n Enter the Sum : “(;
scanf)“%f”,sum(;
if )sum >50(
printf )“\n The student had passed”(;
else
printf)“\n The student had failed”(;
}
وفي هذا البرنامج استخدمنا العبارة الشرطية الكاملة والتي تأتي على الصورة الموضحة بالشكل
التالي
CODE
if ) condition(
statement-1;
else
statement-2;
هو الشرط ) condition ( حيث أن
هي عبارة النتيجة الصلية. ) statement - و ) 1
هي عبارة النتيجة البديلة. ) statement - و ) 2
ومنطق اتخاذ القرار هنا هو : " لو تحقق الشرط يقوم الكمبيوتر بتنفيذ عبارة النتيجة الصلية أما لو
لم يتحقق الشرط فيقوم الكمبيوتر بتنفيذ عبارة النتيجة البديلة"
وهكذا -باستخدام العبارة الشرطية الكاملة - تمكننا من اتخاذ القرار لحالتين متضادتين ، والن ماذا لو
كانت النتيجة الصلية و النتيجة البديلة تتضمنان أكثر من أمر للكمبيوتر؟
في هذه الحالة نحتاج إلى احتواء عبارات النتيجة الصلية بين قوسين من أقواس البلوكات، وهو
الموضح بالشكل
CODE
if ) condition(
{
statement 1;
statement 2;
statement n;
}
else
{
statement 1;
statement 2;
statement m;
}
نلحظ أن عبارة النتيجة تم استبدالها ببلوك النتيجة، والمثال التالي هو البرنامج السابق بعد تعديل
عبارات النتائج لتصبح بلوكات، وذلك ليتمكن البرنامج من إعطاء تقرير بالنجاح أو الرسوب متضمنا
النسبة المئوية باعتبار المجموع الكلي 1000 في حالة النجاح أو رسالة تفيد بأنه ل يمكن احتساب
النسبة المئوية لطالب راسب.
CODE
#include <stdio.h>
main)(
{
float sum;
printf)“\n Enter the Sum : “(;
scanf)“%f”,sum(;
if )sum >50(
{
printf )“\n The student had passed”(;
printf)“\n The percentage is : %f”,)sum/1000(*100(
}
else
{
printf)“\n The student had failed”(;
printf)“\ There is no percentage for failed student !”(;
}
}
لو افترضنا انه قد طلب منك - كمبرمج - عمل برنامج يمكنه احتساب التقديرات اعتمادا على مجموع
الطالب، في هذه الحالة نستخدم عبارة شرطية أيضا ولكن بها عدد من الشروط وعدد مناظر من
النتائج. أو ما يطلق علية العبارة الشرطية المتدرجة.
والشكل التالي يوضح التكوين العام للعبارة الشرطية المتدرجة
CODE
if ) condition –1(
statement –1;
else if ) condition-2(
statement-2;
else if) condition-3(
statement-3;
………..
else
statement-n;
) statement switch ( الختيار متعدد البدائل
يعتبر الختيار المتعدد البدائل بديل للعبارة الشرطية المتدرجة التي تعرضنا لها سابقا، والواقع أن
الختيار المتعدد البدائل أعد خصيصا ليكون أسهل استخداما من العبارة الشرطية المتدرجة.ويتميز
عنها بأنه أفضل توضيحا.
والشكل التالي يوضح الصورة العامة للختيار متعدد البدائل
CODE
switch )variable(
{
case value1;
statement 1;
break;
case value2;
statement 2;
break;
case value 3;
statement 3;
break;
……………
default:
statement;
}
يليها متغير الختيار والذي تحدد قيمته )switch ( وكما نرى فإن الختيار المتعدد البدائل يبدأ بكلمة
الختيار الذي سيتم تنفيذه، ويلي ذلك قوس بلوك كبير يحتوي داخله بلوكات صغيرة كل منها يمثل
متبوعة بقيمة ) case ( اختيارا من البدائل المطروحة و كل بلوك من بلوكات البدائل يبدأ بكلمة
لمتغير الختيار - والتي تمثل الشرط - وبعد ذلك تأتي عبارة النتيجة.
والغرض من هذه الكلمة هو منع الكمبيوتر من تنفيذ عبارة )break ( ويختتم بلوك البديل بكلمة
النتيجة التالية!!!
وقد تبدو هذه العبارة غريبة للوهلة الولى ويتبادر للذهن سؤال ملح : ألم يتحقق الشرط الول مثل
فماذا يدفع الكمبيوتر لتنفيذ بقية عبارات النتائج؟؟
والجابة عن هذا السؤال هي أن عبارة الختيار متعدد البدائل ل ترسل للكمبيوتر أمرا بالتوقف بعد
) break( تحقق أي شرط فيها، لذا لزم الستعانة بكلمة
متبوعة بعبارة أو بعبارات ينفذها الكمبيوتر في ) default( وبعد نهاية بلوكات البدائل تأتي كلمة
حالة عدم تحقق أي من الشروط السابقة.
الفصل السادس : الحلقات التكرارية
عدة C كثيرا ما نحتاج في البرامج إلى تكرار أمر موجه للكمبيوتر عددا من المرات، وتوفر لغة
وسائل تمكن المبرمج من أداء هذا التكرار.
C وعادة ما تسمى هذه الوسائل " الحلقات التكرارية "، ويوجد العديد من الحلقات التكرارية في لغة
سنتناول منها هنا
for ) for loop (. -1 الحلقة
while ) while loop (. 2- الحلقة
.)do…. while ) do-while loop 3- الحلقة
وفيما يلي سنتناول كل حلقة بالدراسة من حيث الشكل العام و أسلوب الستخدام وأمثلة توضيحية.
for ) for loop الحلقة
لتكرار أمر معين ) أو مجموعة من الوامر( عددا من المرات وتحتاج الحلقة إلي for تستخدم الحلقة
ثلث عناصر أساسية ) انظر الشكل التالي(
CODE
for ) counter statement; condition; step(
و هذه العناصر هي:
وظيفة العداد هي تسجيل عدد مرات التكرار. : ) counter ( -1 العداد
والشرط الذي يحدد نهاية التكرار إذ يظل التكرار قائما حتى ينتفي condition ( -2 الشرط
الشرط.
وهي القيمة التي تحدد عدد مرات التكرار. : )step( -3 الخطوة
: for والشكل التالي يوضح برنامجا قمنا فيه باستخدام الحلقة
CODE
#include <stdio.h>
main)(
{
int counter;
for ) counter=1;counter<=20;counter++(
printf)“%d”,counter(;
}
متبوعة بقوسين بينهما ثلثة عبارات ) for ( بدأت بكلمة for ومن البرنامج السابق نجد أن الحلقة
تفصل بينها علمة الفاصلة المنقوطة.
العبارة الولى تخزن القيمة البتدائية في العداد.
. والعبارة الثانية هي الشرط وهنا الشرط أن قيمة العداد أقل من أو تساوي 20
أما العبارة الثالثة فهي تحدد الخطوة، وفي هذا البرنامج يزاد العداد بمقدار 1 كل مرة تنفذ فيها
الحلقة.
. والبرنامج السابق ينتج عنه طباعة الرقام من 1 إلى 20
ملحظات:
يجب أن تفصل عن بعضها بالفاصلة المنقوطة، وهذا الخطأ for -1 العبارات الثلثة المكونة لحلقة
من الخطاء الشهيرة جدا في عالم البرمجة لذا وجب توخي الحذر.
في المثال السابق ( for -2 في حالة تكرار أكثر من أمر يتم استبدال العبارة التي تلي بداية الحلقة
ببلوك يحتوي العبارات المراد تنفيذها. ) ;)printf ) " %d",counter ( هي العبارة
while ) while loop الحلقة
في هذه الحلقة التكرارية نحتاج إلى الشرط فقط وطالما كان هذا الشرط متحققا استمرت الحلقة في
التكرار..
موضحة بالشكل التالي while والصورة العامة للحلقة
CODE
while ) conditon (
{
statement 1;
statement 2;
.
.
statement n;
}
هو الشرط اللزم لداء التكرار، والعبارات بداخل أقواس البلوكات هي ) condition ( حيث
العبارات المراد تكرارها.
لطباعة العداد من 1 إلى 20 while والمثال الموضح بالشكل التالي يوضح استخدام الحلقة
CODE
#include <stdio.h>
main)(
{
int counter=1;
while ) counter <=20 (
{
printf)“%d”,counter(;
counter++;
}
}
while: من المثال السابق يمكننا استخلص النتاتج التالية عن الحلقة
while. 1- تخصيص القيمة البتدائية للعداد تتم خارج الحلقة
while 2- زيادة العداد تتم داخل الحلقة
:do-while الحلقة التكرارية
تختلف هذه الحلقة عن الحلقتين السابقتين في مكان كتابة الشرط ، حيث يكتب الشرط هنا بعد
العبارات المطلوب تكرارها.
do-while والشكل التالي يوضح الصورة العامة للحلقة
CODE
do
{
statement 1;
statement 2;
.
.
statement n;
}
while ) conditon
أنها تنفذ العبارات المطلوب تكرارها مرة واحدة do-while وأهم ملحظة على الحلقة التكرارية
على القل حتى ولو كان الشرط غير متحقق !!!
وتفسير ذلك أن التحقق من الشرط يتم بعد التنفيذ وليس قبله كما في الحلقتين السابقتين.
السي++
: C عن لغة ++C الفصل الول مميزات لغة
بالعديد من المزايا ++C أسلوب برمجة الكائنات الموجهة وبالضافة لذلك تمتاز لغة ++C تدعم لغة
والتي سنتناولها فيما يلي بشيء من التفصيل.
المزيد من الحرية في العلن عن البيانات :
يشترط العلن عن المتغيرات في مستهل البرنامج، وعند الحاجة لمتغير جديد لبد من C في لغة
الرجوع لول البرنامج و العلن عنه.
ينتفي هذا الشرط إذ يتمكن المبرمج من تعريف المتغيرات وقت الحاجة إليها وفي أي ++C ومع لغة
مكان.
ويمكن للمبرمج القتصاد في استخدام الذاكرة باستخدام هذه الميزة ولتوضيح ذلك فلننظر للمثال التالي
CODE
#include <stdio.h>
main)(
{
int I;
scanf)“%d”,&I(;
if )I>5(
{
int j;
printf)“Enter the second number ”(;
scanf)“%d”,j(;
printf)“ the result is “,j*I(;
}
تم العلن عنه وقت الحاجة لستخدامه فقط " j " نلحظ هنا أن المتغير
موفرة بذلك ميزة رائعة، لنة يمكن للمبرمج أن يقتصد في استخدام الذاكرة وذلك بتعريف المتغيرات
التي يحتاجها عند تحقق شرط معين مثل داخل هذا الشرط.
وبذلك ل نحجز للمتغير مكانا إل عند الحاجة إليه فقط.
إعطاء قيم البتدائية لمعاملت الدوال:
بإعطاء قيم ابتدائية لمعاملت الدوال عند تعريفها، وعندما يتم استدعاء الدالة في ++C تسمح لغة
البرنامج بدون معاملت يتم استعمال القيم البتدائية، أما إذا أعطى المبرمج قيما للمعاملت فإنها
تستخدم بدل من القيم البتدائية.
ويسمح في هذه الحالة باستدعاء الدالة بأكثر من طريقة، والمثال التالي يلقي مزيدا من الضوء على
هذه الميزة.
CODE
#include <iostream.h>
void Add)int a=5,int b=9({
cout << a+b;
};
main)(
{
Add)4,6(;
Add)(;
}
والتي تجمع متغيرين من النوع الصحيح، والدالة تأخذ قيم ) )(Add ( في هذا المثال عرفنا الدالة
المتغيرين عند استدعائها مثل عبارة الستدعاء الولى وفيها أخذ المتغير الول القيمة ) 4( والثاني
) القيمة ) 6
أما عبارة الستدعاء الثانية فلم نعط للدالة قيما لمتغيراتها، وفي هذه الحالة تستخدم الدالة القيم
البتدائية المعلن عنها عند تعريف الدالة.
كتابة التعليقات:
عملية كتابة التعليقات حيث أصبح بالمكان كتابة التعليقات بعد العلمة " // " ودون ++C سهلت لغة
حيث كان التعليق يكتب دوما بين العلمتين " C التقيد بعلمة في نهاية التعليق كما كان سابقا في لغة
/* " و " */ ".
ويجب مراعاة أن التعليق لو جاء في عدة أسطر لزم وضع العلمة " // " في أول كل سطر ، ومن
الممكن في هذه الحالة وضع التعليق بين العلمتين المعتادتين لتلفي الخطأ عند نسيان وضع العلمة
" // " في أول السطر.
القدرة على إنشاء واستخدام الفصائل:
تدعم أسلوب برمجة الكائنات الموجهة ويتم ++C وهذه الميزة من أهم المميزات والتي تجعل لغة
وذلك تبعا للصورة العامة الموضحة بالشكل ) class ( إنشاء الفصيلة باستخدام الكلمة المحجوزة
التالي
CODE
class class_name{
private:
private data and functions
public :
public data and functions
}
ويتوالى بعد ذلك تعريف البيانات والدوال. ) class ( حيث يعطى اسم الفصيلة بعد الكلمة المحجوزة
تحديد درجة حماية البيانات :
تحديد درجات لحماية البيانات وذلك على مستوى الفصيلة، وتتحدد درجة الحماية ++C تتيح لغة
ويوضح الجدول التالي درجات الحماية ) public , private , protected ( باستخدام الكلمات
المختلفة
و بالتقدم في البرمجة سنألف استخدام محددات الحماية، وسنتعرض لها بشيء من التفصيل عند
الحديث عن الفصائل والكائنات.
constructors and destructors ( دوال البناء والهدم
++C كما ذكرنا سابقا فالفصيلة تتكون من بيانات و دوال تتعامل مع هذه البيانات، وتتيح لغة
وهي دالة تنفذ ) constructor ( للمبرمج أن ينشئ دالتين خاصتين تسمى إحداهما دالة البناء
تلقائيا عند العلن عن كائن من هذه الفصيلة. وتظهر فائدة هذه الدالة عندما نرغب في تخصيص قيم
ابتدائية لبيانات الفصيلة.
وتنفذ تلقائيا عند انتهاء استخدام الفصيلة ) destructor ( أما الدالة الخرى فهي دالة الهدم
وتستخدم هذه الدالة لتحرير أجزاء من الذاكرة كنا نستخدمها أثناء استعمال الفصيلة ولم نعد بحاجة
إليها، أو لتنفيذ سطور معينة عند النتهاء من استخدام الفصيلة.
كانت دالة البناء تحمل )Ball ( ودالة البناء تحمل نفس اسم الفصيلة، فمثل لو كان اسم الفصيلة
.) Ball ( السم
أما دالة الهدم فتأتي بنفس اسم الفصيلة مسبوقا بالعلمة) ~ ( فللفصيلة السابقة دالة الهدم تحمل
.) Ball~ ( السم
: )Inheritance ( التوريث
من أقوى خصائص برمجة الكائنات الموجهة خاصية التوريث. ونعني هنا توريث فصيلة إلى فصيلة
أخرى.
كل )parent class ( من الفصيلة الساسية ) derived class ( وهنا ترث الفصيلة المشتقة
بياناتها ودوالها ويمكن التعديل بعد ذلك في خصائص الفصيلة المشتقة لتناسب الحتياجات الجديدة،
بإضافة المزيد من البيانات والدوال.
وبذلك نجد أن برمجة الكائنات الموجهة تعفي المبرمج من إعادة بناء البرامج من الصفر بل يعتمد
على ما سبق لنجاز البرامج الجديدة، فتمكنه من استخدام الفصائل السابقة و عمل فصائل جديدة
للستفادة منها مستقبل.
friend functions ( الدوال الصديقة
عندما تعلن فصيلة عن دالة صديقة أو عدة دوال صديقة فإنها تسمح لهذه الدوال باستعمال البيانات
العضاء فيها ول تسمح لغير هذه الدوال بذلك.
وكذلك الحال عندما تعلن فصيلة عن فصيلة صديقة، فإنها تسمح لجميع دوال الفصيلة الصديقة
باستخدام بيانات الفصيلة الساسية.
وسيأتي الحديث بالتفصيل عن الدوال الصديقة في فصل الفصائل والكائنات.
++C : الفصل الثاني: أساسيات البرمجة بلغة
توجد لكل لغة أساسياتها التي ينبغي اللمام بها قبل كتابة البرامج بواسطتها، وهذا الفصل يوضح هذه
الساسيات مثل: هيكل البرنامج، المتغيرات، الدخال والخراج.
وبجانب هذا يلمس الباب العديد من مزايا اللغة من كتابة التعليقات، والعمليات الحسابية، وتحويل
البيانات. وغيرها من المزايا.
البناء الساسي للبرنامج:
لنلق نظرة متعمقة على البرنامج التالي
CODE
#include <iostream.h>
void main)(
{
cout << “ Every age has its own language . . .“;
}
ويتضح ذلك عندما ++C وبغض النظر عن صغر حجمه فإنه يوضح البناء الساسي للبرنامج في لغة
نتناوله بالتفصيل كما يلي.
الدوال:
الدوال تشكل البلوكات الساسية لبناء البرنامج ، ويتكون البرنامج هنا من دالة واحدة وهي الدالة
والدوال في بناء برمجة الكائنات الموجهة قد تكون أعضاء في فصائل محددة ) )(main ( الرئيسية
أو تكون مستقلة بذاتها ، والدالة الرئيسية دالة مستقلة بذاتها حيث ل تنتمي لي فصيلة.
والدالة لها اسمها ويليه قوسين توضع بينهما معاملت الدالة، ونلحظ أن الدالة الرئيسية في هذا
المثال ليس لها معاملت.
والتي تسبق اسم الدالة فتوضح أن الدالة ليس لها قيمة ترجع بها ، ) void ( أما الكلمة المحجوزة
بخلف بعض الدوال التي نخصص لها نوعا من البيانات بحيث ترجع قيمة من نوع هذا البيان.
وعبارات الدالة نفسها تحاط بقوسين خاصين" } " ، " { " يسميان بقوسي البلوكات.
و الدالة الرئيسية هي أول ما ينفذه الكمبيوتر عند تنفيذ البرنامج.
عبارات الخراج
في البرنامج السابق نلحظ أننا قد استخدمنا عبارة لطباعة الحرفيات، وتختلف هذه العبارة عن
العبارات التي تعودنا عليها عند استخدام اللغات الخرى فهنا لم نستخدم دالة خاصة لتطبع الخرج
)cout ( على الشاشة، بل قمنا بكتابة الحرفي بين علمتي تنصيص واستخدمنا الكلمة المحجوزة
والمعامل ) >> ( والعبارة التي استخدمناها للطباعة يفهمها الكمبيوتر بكما هو موضح بالشكل التالي
preprocessor directives ( موجهات ما قبل المعالجة
ليست في الواقع جزءا منه بل هي )<include <iostream.h# ( العبارة التي بدأ بها البرنامج
إعلن عن ملف يحتوي على تعريفات العديد من الدوال التي نحتاجها أثناء البرمجة.
وتبدأ العبارة بما يسمى بموجه قبل المعالجة وهو الرمز ) #( والمر الذي يليه موجه للمعالج مباشرة
وهناك جزء من المعالج يتعامل مع مثل هذة الوامر.
ويقوم بتنفيذ الوامر الصادرة إلية لتتم عملية المعالجة اعتمادا على المعلومات التي وفرها للمعالج.
Comments ( التعليقات
عند كتابة برنامج بأية لغة يستحب كتابة التعليقات لتوضيح العبارات المكونة للبرنامج.
والمبرمج الذكي يحرص دوما على كتابة كل ما يمكنه من تعليقات على برنامجه ليسهل عليه
تصحيحه أو استخدام بعض أجزاءه إن دعت الحاجة لذلك.
بكتابة التعليقات بطريقتين تسهلن على المبرمج وضع ما يشاء من التعليقات على ++C وتسمح لغة
البرنامج .
والطريقة الولى هي كتابة التعليق بعد العلمة " // " حيث يتجاهل المترجم السطر الذي يلي هذه
العلمة.
ولكن لو تجاوز التعليق السطر لزم إضافة المزيد من الرموز " //" أمام كل سطر من التعليقات.
وللستغناء عن الحاجة لكتابة العلمة " // " أمام كل سطر يمكن للمبرمج أن يستخدم الطريقة الثانية
وهي كتابة التعليق بين العلمتين " /*" و " */" ويسمح في هذة الحالة كتابة التعليق على أكثر من
سطر دون التسبب في الخطأ، طالما كان التعليق بين العلمتين المذكورتين.
والمثال التالي يوضح كيفية استخدام الطريقتين
CODE
// this is the first method
// this is the
// first method
/* this is the second method */
/* this is
the second
method*/
في المرة الولى استخدمنا الطريقة الولى ولم يتجاوز التعليق السطر فلم نستخدم سوى علمة تعليق
واحدة. أما في المرة الثانية تجاوز التعليق السطر فلزم علينا استخدام علمة تعليق ثانية .
وفي المرة الرابعة استخدمنا الطريقة الثانية لكتابة التعليقات ومع ان التعليق تجاوز السطر فلم
نستخدم علمة تعليق جديدة لكل سطر بل اكتفينا بوجود العلمة " /*" في بداية التعليق والعلمة "
*/" في نهايته.
تحدثنا مسبقا عن هذا الموضوع في السي ولكن باختصار( ( ++C المتغيرات في لغة
تمثل المتغيرات الجزء الهم من أي لغة، والمتغيرات ليست إل أسماء رمزية لوعية اختزان البيانات
في الذاكرة. وحسب أنواع البيانات المختزنة تنقسم المتغيرات إلى أنواع عديدة، ويخضع اختيار
أسماء المتغيرات لقواعد هي:
أو الكلمات التي ) Reserved words ( -1 أل يكون اسم المتغير أحد الكلمات المحجوزة باللغة
ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر التشغيل ) main ( تحمل معنى خاصا مثل
المصاحب للمترجم.
سواء صغيرة كانت أم )A-Z ( -2 يمكن أن يحتوي السم على أى حرف من الحروف البجدية
9 ( كما يمكن أن تحتوي على علمة الشرطة السفلى ) _ ( ولكن ل - كبيرة، وأي رقم من الرقام ) 0
يجوز أن يبدأ السم برقم.
-3 ل قيود على طول السم ، وتتيح هذه الميزة استخدام أسماء معبرة عن مضمونها، ومن الفضل
دائما استخدام السم المعبر عن محتوى المتغير لتسهيل عملية فحص البرنامج في حالة الخطأ من
جهة، ولتسهيل عملية الضافة والتعديل للبرنامج.
فمثل اسم المتغير ) ++C -4 الحروف الكبيرة و الصغيرة ليست متكافئة في لغة
وكلهما يختلف عن السم ) )my_number ( يختلف عن السم )MY_NUMBER
.)My_Number
وسنتناول هنا بالشرح بعض النواع الساسية من المتغيرات التي ل غنى للمبرمج عنها.
integer variables ( المتغيرات العددية الصحيحة
لنتعرف على كيفية تعريف المتغيرات العددية الصحيحة نلقي نظرة على البرنامج التالي
CODE
#include <iostream.h>
void main)(
{
int var1; //define var1
int var2; //define var2
var1=20; //assign value to var1
var2=var1+10;
cout<< “var1+10 is ”; //output text
cout<<var2; // output value of var2
}
. "var و " 2 "var قمنا في هذا البرنامج بتعريف متغيرين من النوع الصحيح بالسمين " 1
أو عدد صحيح، "integer " وهي اختصار "int " ولتعريف المتغير نستخدم الكلمة المحجوزة
متبوعة باسم المتغير والذي يتبع القواعد المحددة السابق ذكرها لختيار أسماء المتغيرات.
إذ ++C ونلحظ في هذا البرنامج أن المتغيرات تم تعريفها في أول البرنامج وليس هذا شرطا في لغة
تتيح لنا إمكانية تعريف المتغيرات وقت الحاجة في أي مكان نشاء.
وبعد عبارة العلن عن المتغيرين ننتقل إلى عبارة أخرى وهي عبارة تخصيص القيم للمتغيرات ،
حيث نخزن قيما فعلية في الماكن التي حجزناها سالفا .
وفي هذا البرنامج نخزن القيمة " 20 " في المتغير الول، والعبارة المستخدمة لتخصيص قيمة
المتغير الثاني ليست مباشرة، إذ يقوم المعالج بأداء عملية حسابية قبل تخصيص القيمة، حيث يجمع
القيمة " 10 " على المتغير الول.
ولخراج قيمة المتغيرات على الشاشة نستخدم العبارتين الخيرتين .
char variables ( المتغيرات الرمزية
المتغير الرمزي هو المتغير الذي يسمح بتخزين رمز فيه، والرمز في لغة الكمبيوتر هو كل ما يرد في
جدول الكود آسكي والذي يحدد الرموز التي يمكن للكمبيوتر التعامل معها.
والرموز تحتوي الحروف الكبيرة والصغيرة والعداد بالضافة إلى العديد من رموز التحكم.
ولتعريف متغير رمزي نستخدم العبارة
char variable_name;
هو اسم المتغير الرمزي، ويخضع أيضا للقواعد العامة لتسمية )variable_name ( حيث
المتغيرات.
وعند تخصيص قيمة لمتغير رمزي نستخدم علمتي اقتباس مفردتين كما بالعبارة التالية
variable = ‘A’;
) variable ( للمتغير )A ( وهذه العبارة تخصص الرمز
: ) escape sequences ( تتابعات الهروب
استخدام بعض رموز الحروف لداء مهام خاصة ولنلق نظرة على البرنامج ++C من إمكانيات لغة
التالي :
CODE
#include <iostream.h>
main)(
{
char var1=’A’;
char var2=’\t’;
char var3=’\n’;
cout << var1;
cout << var2;
cout << var1;
cout << var3;
}
للمتغير الول. )A ( في هذا البرنامج نعلن عن ثلثة متغيرات من النوع الرمزي ونخصص الرمز
أما المتغيرين الثاني و الثالث فنخصص لكل منهما رمز جديد مكون من علمة الشرطة المائلة
والتي تعني للمترجم أن الرمز الذي يليها ليس رمزا عاديا بل يحمل ) back slash ( العكسية
دللة خاصة، والرمز الذي يلي علمة الشرطة المائلة العكسية يقوم بأداء عملية خاصة ، فمثل إذا
كانت النتيجة النتقال لسطر جديد. )n( جاء بعد علمة الشرطة المائلة العكسية الرمز
كانت النتيجة طباعة عدد من المسافات الفارغة و مماثلة للتي تنتج من استخدام )t ( ولو جاء الحرف
.) tab ( المفتاح
وهناك العديد من تتابعات الهروب والتي نلخصها في الجدول التالي
)floating point variables ( المتغيرات العددية العشرية
تعرفنا في جزء سابق على المتغيرات العددية الصحيحة، ونعني بالصحيحة تلك التي ل تحتوي على
كسور أي ل توجد بها علمة عشرية.
والن نتعرف على المتغيرات العددية العشرية أو كما تسميها بعض الكتب المتغيرات الحقيقية وهي
المتغيرات التي تسمح لنا بالتعامل مع العداد التي تحوي الكسور أو العلمات العشرية، ومن هنا جاء
اسمها.
ولتعريف متغيرات من النوع الحقيقي نلقي نظرة على البرنامج التالي:
CODE
#include <iostream.h>
void main)(
{
float var1; //define var1
float var2; //define var2
var1= 50.79; //assign value to var1
var2= var1 + 56.9;
cout<< “var1+ 56.9 is ”; //output text
cout<<var2; // output value of var2
}
وتعريف المتغيرات الحقيقية ل يختلف عن المتغيرات الخرى إذ يتم بنفس الطريقة وباستخدام الكلمة
والتي تعني علمة عشرية، وهي ) floating point ( وهي اختصار لكلمة )float ( المحجوزة
ما يميز العداد الحقيقية.
ويتم التعامل مع العداد الحقيقية بنفس طريقة التعامل مع المتغيرات العددية الصحيحة.
وتجب ملحظة أنه لو خصصنا ناتج عملية حسابية تحتوي على متغيرات حقيقية و أخرى صحيحة
لبد من أن يكون الناتج مخصصا لمتغير من النوع الحقيقي، وإل حصلنا على أخطاء عند التنفيذ.
المؤشرات:
فكرة المؤشرات قد تبدو للوهلة الولى صعبة ولكن مع الفهم الجيد يصبح استعمال المؤشرات في
غاية السهولة.
والفكرة الساسية هي أن ذاكرة الكمبيوتر مقسمة إلى أماكن لتخزين البيانات المختلفة ولكل مكان من
هذه الماكن عنوانه الخاص، وهذا العنوان يفهمه الكمبيوتر بصورته العددية ) أي أن هذه العناوين ما
هي إل أعداد (.
والبرنامج عندما يعلن عن متغير من نوع معين فإن الكمبيوتر يحجز مكانا له في الذاكرة. وبالتالي
يكون لكل متغير من متغيرات البرنامج عنوانه الخاص.
. ++C والمؤشر هو متغير يحمل العنوان، ويمكننا تعريف مؤشرات لكل أنواع المتغيرات في لغة
ولتعريف مؤشر ما يذكر نوعه أول ثم اسم المتغير مسبوقا بالعلمة ) *(
وذلك كما في العبارة
;float *ptr
.ptr وفي هذه العبارة قمنا بتعريف مؤشر لعدد حقيقي، واسم المؤشر هو
.++C ويمكننا بنفس الطريقة تعريف مؤشرات لكل أنواع البيانات التي توجد في لغة
cin عبارات الدخال باستخدام
تعرفنا على العبارة المستخدمة في الخراج ونتناول الن العبارة التي تستخدم للدخال. والمثال التالي
يوضح العبارة قيد الستخدام
CODE
#include<iostream>
void main)(
{
int ftemp;
cout << “ Enter temperature in Fahrenheit: “;
cin >> ftemp;
int ctemp= )ftemp-32( * 5/9;
cout<<”The temperature in Celsius is : “ <<ctemp<<”\n”;
}
ويليها المؤثر ) <<( ثم )cin ( والدخال في هذا البرنامج يتم بالعبارة التي تحوي الكلمة المحجوزة
اسم المتغير الذي سنحتفظ فيه بالقيمة المدخلة.
ليضع ) Enter ( وتنتظر عبارة الدخال المستخدم ليضغط على الرمز المراد إدخاله متبوعا بالمفتاح
القيمة في المتغير المحجوز سابقا.
Structures ( السجلت
السجل عبارة عن مجموعة مترابطة من البيانات كما في المصفوفات ولكن السجل يحتوي بيانات
مختلفة النواع وليست من نوع واحد كما في المصفوفة.
تحوي البيانات المختلفة ويستخدم السجل لتخزين بيانات ) fields ( والسجل يتكون من عدة حقول
مترابطة متكررة، كما في قاعدة البيانات حيث تتكون قاعدة البيانات من سجلت بكل سجل منها نفس
الحقول، ولكن قيم تلك الحقول تختلف من سجل لخر.
والعلن عن السجل يتم كما هو موضح بالشكل التالي
CODE
struct structure_name
{
type field1;
type field2;
…
};
هو اسم السجل وبداخل السجل تتوالى الحقول المختلفة النواع ) )stucture_name ( حيث
ولكل حقل نوعه الخاص. ) ..…,field1, field2
وبتعريفنا للسجل يمكننا بعد ذلك تعريف متغيرات من نوع هذا السجل لستخدامها في البرنامج حسب
الحاجة
)var ويتم تعريف المتغيرات من السجل كما هو موضح بالشكل التالي الذي يوضح تعريف متغير ) 1
)structure من نوع السجل ) 1
CODE
struct structure1
{
type field1;
type field2;
…
} var1;
ويمكننا تعريف أي عدد من المتغيرات من نوع هذا السجل كما يتطلب البرنامج
والن كيف نتعامل مع السجلت؟؟
إننا نحتاج مثل لتخزين قيمة معينة في أحد الحقول، وفي هذه الحالة نستخدم المؤثر ).( والمثال
لحقل السم ) )Mohammed( وتخصيص اسم )Student ( التالي يوضح عمل سجل باسم
)name
CODE
#include<iostream.h>
struct Student
{
char* name;
int number;
};
main)(
{
Student Sdt1;
Std1.name=”Mohammed”;
Cout << Std1.name;
}
وهو الذي قمنا بتخزينه "Mohammed " وعند تنفيذ البرنامج تقوم العبارة الخيرة بطباعة السم
.)Std من المتغير ) 1 )name( في الحقل
الفصل الثالث : اتخاذ القرارات
تعرضنا حتى الن لبرامج متتالية الوامر، حيث ينفذ الكمبيوتر العبارات الموجودة في البرنامج
بالترتيب الذي وردت به .
ولكن في الحياة العملية نحتاج لتخاذ بعض القرارات تبعا لشروط معينة، ومن هنا ظهرت الحاجة
لوجود طرق لجعل البرنامج قادرا على تغيير تسلسل تنفيذ التعليمات تبعا للشروط المطلوبة.
كيفية تغيير تسلسل التنفيذ تبعا للشروط ++C وسنتعرض هنا لطرق اتخاذ القرار في لغة
الموضوعة.
if statement ( العبارة الشرطية البسيطة
تكوين العبارة الشرطية البسيطة كما هو موضح بالشكل التالي
if ) condition (
statement;
هو القرار المراد اتخاذه عند تحقق الشرط ) statement ( هو الشرط و ) condition ( حيث
المعطى.
وعندما ترغب في تنفيذ أكثر من عبارة بتحقق الشرط نستبدل العبارة التي تمثل القرار المراد اتخاذه
ببلوك به العبارات المراد تنفيذها.
ولتوضيح استخدام العبارة الشرطية البسيطة أنظر البرنامج التالي
CODE
#include <iostream.h>
main)(
{
float sum;
cout<< “ Enter the sum “;
cin >> sum;
if)sum>50(
cout<<” The student had passed”;
}
وفي هذا البرنامج يطبع الكمبيوتر رسالة ليسأل المستخدم عن مجموع الطالب وبعد ذلك يقوم
بمقارنتها بالشرط اللزم للتأكد من النجاح ) وهو تجاوز المجموع 50 (فإذا تحقق الشرط يطبع
الكمبيوتر رسالة للمستخدم يعلمه أن الطالب ناجح،
)if ……. else statement ( العبارة الشرطية الكاملة
إن اتخاذ القرارات في الحياة العملية ليست بالسهولة التي ذكرت في البرنامج السابق، إذ نحتاج في
معظم الحيان لتخاذ اجراء تبعا لشرط معين، واتخاذ إجراء آخر إذا لم يتحقق هذا الشرط.
؟؟ لو نظرنا للبرنامج السابق لوجدنا سؤال ملحا : ماذا لو كان مجموع الطالب أقل من 50
الجابة على هذا السؤال هي أن الطالب يكون راسبا. ولكن البرنامج ل يتضمن أمرا بإعطاء حالة
الرسوب، لننا استخدمنا عبارة الشرط البسيطة والتي تستجيب لشرط واحد.
وسنتعرض الن لعبارة مركبة كما في البرنامج التالي
CODE
#include <iostream.h>
main)(
{
float sum;
cout<< “ Enter the sum “;
cin >> sum;
if)sum>50(
cout<<” The student had passed”;
else
cout<<” The student had failed”;
}
وفي هذا البرنامج استخدمنا العبارة الشرطية الكاملة والتي تأتي على الصورة الموضحة بالشكل
التالي
if ) condition(
statement-1;
else
statement-2;
هو الشرط ) condition ( حيث أن
هي عبارة النتيجة الصلية. ) statement - و ) 1
هي عبارة النتيجة البديلة. ) statement - و ) 2
ومنطق اتخاذ القرار هنا هو : " لو تحقق الشرط يقوم الكمبيوتر بتنفيذ عبارة النتيجة الصلية أما لو
لم يتحقق الشرط فيقوم الكمبيوتر بتنفيذ عبارة النتيجة البديلة"
وهكذا -باستخدام العبارة الشرطية الكاملة - تمكننا من اتخاذ القرار لحالتين متضادتين ، والن ماذا لو
كانت النتيجة الصلية و النتيجة البديلة تتضمنان أكثر من أمر للكمبيوتر؟
في هذه الحالة نحتاج إلى احتواء عبارات النتيجة الصلية بين قوسين من أقواس البلوكات، وهو
الموضح بالشكل التالي
CODE
if ) condition(
{
statement 1;
statement 2;
.
.
statement n;
}
else
{
statement 1;
statement 2;
.
.
statement m;
}
نلحظ أن عبارة النتيجة تم استبدالها ببلوك النتيجة، والمثال التالي هو نفس البرنامج السابق بعد
تعديل عبارات النتائج لتصبح بلوكات، وذلك ليتمكن البرنامج من إعطاء تقرير بالنجاح أو الرسوب
متضمنا النسبة المئوية في حالة النجاح أو رسالة تفيد بأنه ل يمكن احتساب النسبة المئوية لطالب
راسب.
CODE
#include <iostream.h>
main)(
{
float sum;
cout<< “ Enter the sum “;
cin >> sum;
if)sum>50(
{
cout<<” The student had passed”;
cout<< “ His points are “<< sum/100;
}
else
{
cout<<” The student had failed”;
cout<<” No points are calculated for failed student !!”;
}
}
) if-else- if Ladder (: العبارة الشرطية المتدرجة
لو افترضنا انه قد طلب منك - كمبرمج - عمل برنامج يمكنه احتساب التقديرات اعتمادا على مجموع
الطالب، في هذه الحالة نستخدم عبارة شرطية أيضا ولكن بها عدد من الشروط وعدد مناظر من
النتائج. أو ما يطلق علية العبارة الشرطية المتدرجة.
والشكل التالي يوضح التكوين العام للعبارة الشرطية المتدرجة
CODE
if ) condition –1(
statement –1;
else if ) condition-2(
statement-2;
else if) condition-3(
statement-3;
………..
else
statement-n;
) statement switch ( الختيار متعدد البدائل
يعتبر الختيار المتعدد البدائل بديل للعبارة الشرطية المتدرجة التي تعرضنا لها سابقا، والواقع أن
الختيار المتعدد البدائل أعد خصيصا ليكون أسهل استخداما من العبارة الشرطية المتدرجة.ويتميز
عنها بأنه أفضل توضيحا.
والشكل التالي يوضح الصورة العامة للختيار متعدد البدائل
CODE
switch )variable(
{
case value1;
statement 1;
break;
case value2;
statement 2;
break;
case value 3;
statement 3;
break;
……………
default:
statement;
}
يليها متغير الختيار والذي تحدد قيمته )switch ( وكما نرى فإن الختيار المتعدد البدائل يبدأ بكلمة
الختيار الذي سيتم تنفيذه، ويلي ذلك قوس بلوك كبير يحتوي داخله بلوكات صغيرة كل منها يمثل
متبوعة بقيمة ) case ( اختيارا من البدائل المطروحة و كل بلوك من بلوكات البدائل يبدأ بكلمة
لمتغير الختيار - والتي تمثل الشرط - وبعد ذلك تأتي عبارة النتيجة.
والغرض من هذه الكلمة هو منع الكمبيوتر من تنفيذ عبارة )break ( ويختتم بلوك البديل بكلمة
النتيجة التالية!!!
وقد تبدو هذه العبارة غريبة للوهلة الولى ويتبادر للذهن سؤال ملح : ألم يتحقق الشرط الول مثل
فماذا يدفع الكمبيوتر لتنفيذ بقية عبارات النتائج؟؟
والجابة عن هذا السؤال هي أن عبارة الختيار متعدد البدائل ل ترسل للكمبيوتر أمرا بالتوقف بعد
) break( تحقق أي شرط فيها، لذا لزم الستعانة بكلمة
متبوعة بعبارة أو بعبارات ينفذها الكمبيوتر في ) default( وبعد نهاية بلوكات البدائل تأتي كلمة
حالة عدم تحقق أي من الشروط السابقة.
--------------------------------
الفصل الرابع: الحلقات التكرارية
عدة ++C كثيرا ما نحتاج في البرامج إلى تكرار أمر موجه للكمبيوتر عددا من المرات، وتوفر لغة
وسائل تمكن المبرمج من أداء هذا التكرار.
C وعادة ما تسمى هذه الوسائل " الحلقات التكرارية "، ويوجد العديد من الحلقات التكرارية في لغة
سنتناول منها هنا
for ) for loop (. -1 الحلقة
while ) while loop (. 2- الحلقة
.)do…. while ) do-while loop 3- الحلقة
وفيما يلي سنتناول كل حلقة بالدراسة من حيث الشكل العام و أسلوب الستخدام وأمثلة توضيحية.
for ) for loop الحلقة
لتكرار أمر معين ) أو مجموعة من الوامر( عددا من المرات وتحتاج الحلقة إلي for تستخدم الحلقة
ثلث عناصر أساسية كما هو موضح بالشكل التالي
for ) counter statement; condition; step(
و هذه العناصر هي:
وظيفة العداد هي تسجيل عدد مرات التكرار. : ) counter ( -1 العداد
والشرط الذي يحدد نهاية التكرار إذ يظل التكرار قائما حتى ينتفي condition ( -2 الشرط
الشرط.
وهي القيمة التي تحدد عدد مرات التكرار. : )step( -3 الخطوة
: for والشكل التالي يوضح برنامجا قمنا فيه باستخدام الحلقة
CODE
#include <iostream.h>
main)(
{
int counter;
for ) counter=1;counter<=20;counter++(
cout<<counter;
}
متبوعة بقوسين بينهما ثلثة عبارات ) for ( بدأت بكلمة for ومن البرنامج السابق نجد أن الحلقة
تفصل بينها علمة الفاصلة المنقوطة.
العبارة الولى تخزن القيمة البتدائية في العداد.
. والعبارة الثانية هي الشرط وهنا الشرط أن قيمة العداد أقل من أو تساوي 20
أما العبارة الثالثة فهي تحدد الخطوة، وفي هذا البرنامج يزاد العداد بمقدار 1 كل مرة تنفذ فيها
الحلقة.
. والبرنامج السابق ينتج عنه طباعة الرقام من 1 إلى 20
ملحظات:
يجب أن تفصل عن بعضها بالفاصلة المنقوطة، وهذا الخطأ for -1 العبارات الثلثة المكونة لحلقة
من الخطاء الشهيرة جدا في عالم البرمجة لذا وجب توخي الحذر.
في المثال السابق هي ( for -2 في حالة تكرار أكثر من أمر يتم استبدال العبارة التي تلي بداية الحلقة
ببلوك يحتوي العبارات المراد تنفيذها. );cout << counter ( العبارة
while ) while loop الحلقة
في هذه الحلقة التكرارية نحتاج إلى الشرط فقط وطالما كان هذا الشرط متحققا استمرت الحلقة في
التكرار..
موضحة بالشكل التالي while والصورة العامة للحلقة
CODE
while ) conditon (
{
statement 1;
statement 2;
.
.
statement n;
}
هو الشرط اللزم لداء التكرار، والعبارات بداخل أقواس البلوكات هي ) condition ( حيث
العبارات المراد تكرارها.
لطباعة العداد من 1 إلى 20 while والمثال الموضح بالشكل التالي يوضح استخدام الحلقة
CODE
#include <iostream.h>
main)(
{
int counter=1;
while ) counter <=20 (
{
cout<< counter;
counter++;
}
}
while: من المثال السابق يمكننا استخلص النتاتج التالية عن الحلقة
while. 1- تخصيص القيمة البتدائية للعداد تتم خارج الحلقة
.while 2- زيادة العداد تتم داخل الحلقة
:do-while الحلقة التكرارية
تختلف هذه الحلقة عن الحلقتين السابقتين في مكان كتابة الشرط ، حيث يكتب الشرط هنا بعد
العبارات المطلوب تكرارها.
do-while والشكل التالي يوضح الصورة العامة للحلقة
CODE
do
{
statement 1;
statement 2;
.
.
statement n;
}
while ) conditon (
أنها تنفذ العبارات المطلوب تكرارها مرة واحدة do-while وأهم ملحظة على الحلقة التكرارية
على القل حتى ولو كان الشرط غير متحقق !!!
وتفسير ذلك أن التحقق من الشرط يتم بعد التنفيذ وليس قبله كما في الحلقتين السابقتين.
: )Function & Macro ( الفصل الخامس: الدوال و الماكرو
معنى الدالة:
الدالة هي مجموعة من الوامر المحددة التي تعطى للكمبيوتر وغالبا ما تكون هذه الوامر مرتبطة
بأداء وظيفة محددة.
والدوال تمنح اللغة بعض المزايا مثل:
-1 توفر في حجم البرنامج، حيث نستعيض عن تكرار عدد السطور التي تؤدي مهمة الدالة بإعادة
استدعاء الدالة فقط.
-2 توفر مكتبة دائمة للمبرمج، حيث يمكن الحتفاظ بالدوال وإعادة استخدامها حين الحاجة دون
كتابتها من البداية.
-3 يؤدي استخدام الدوال الى زيادة وضوح البرنامج وتسهيل عملية تصحيحه، حيث يبدو البرنامج
مع استخدام الدوال مقسما إلى أجزاء محددة واضحة أو ما يسمى بالبلوكات.
وسنتناول الن طريقة استخدام الدوال في البرامج، ليتم استخدام الدالة يجب أول العلن عنها، وبعد
عملية العلن عن الدالة يمكننا استخدامها بواسطة ما يسمى باستدعاء الدالة، ولبد من كتابة
التعليمات التي تؤديها الدالة فيما يعرف باسم تعريف الدالة.
والمثال التالي مثال ) 1( يوضح استخدام دالة عرفها المبرمج
CODE
#include <iostream.h>
void DrawLine)(; )1(
void main)(
{
cout << “ This is the output of the function : “ << ‘\n’;
DrawLine)(; )2(
}
void DrawLine)(
{
for )I=1;I<=40;I++( )3(
cout<<’*’;
}
والتي صممناها لرسم سطر من العلمة ) DrawLine ( وفي هذا المثال استخدمنا الدالة المسماة
) * (
function ( وفي السطر المشار إلية برقم ) 1( في البرنامج السابق قمنا بالعلن عن الدالة أو
وهو مجرد ذكر اسم الدالة وأنواع المتغيرات التي تأخذها ونوع القيمة التي ) declaration
تعيدها.
وفي هذا المثال ل تأخذ الدالة أية متغيرات وهو الموضح بالقوسين الفارغين بعد اسم الدالة مباشرة،
والتي تسبق اسم الدالة. ) void ( ول تعيد الدالة قيما أيضا وهو الموضح بالكلمة
والمراد )function calling ( أما السطر المشار إلية برقم ) 2( ففيه قمنا باستدعاء الدالة أو
منه توجيه المر للكمبيوتر بتنفيذ مضمون الدالة.
،)function definition ( ومجموعة السطور المشار إليها بالرقم ) 3 ( هي تعريف الدالة أو
وتعريف الدالة يتم بين قوسي بلوكات " { " و " } " ويتضمن التعليمات المطلوب من الدالة تنفيذها،
وهنا تقوم الدالة بتنفيذ طباعة العلمة " *" أربعين مرة متتالية على نفس السطر مما يشكل الخرج
المطلوب من الدالة.
ومن أهم الملحظات التي يجب وضعها دائما في العتبار :
-1 يمكن أن يأتي تعريف الدالة قبل استدعائها، وفي هذه الحالة ل حاجة بنا للعلن عن الدالة في
سطر مستقل.
-2 ل يمكن بأية حال أن يتم استدعاء الدالة قبل العلن عنها أو تعريفها.
أنواع الدوال:
تصنف الدوال تبعا للقيمة التي تعيدها، وتبعا لذلك نجد النواع التالية:
وهي التي تعيد بيانا من النوع العددي الصحيح )int functions ( -1 دوال أعداد صحيحة
integer((.
والقيمة المعادة في هذه الحالة تكون من النوع ) float functions ( 2- دوال أعداد حقيقية
float ( ( . الحقيقي
وتعيد بيانا من النوع الحرفي وهو سلسلة من الرموز . ) string functions ( 3- دوال حرفيات
char(. ( وتعيد بيانا من النوع الرمزي ) char functions ( -4 دوال الرموز
ول تعيد قيما من أي نوع )void function ( 5- دوال ل تعيد قيما
مثال( 2
CODE
#include<iostream.h>
float sum)float x, float y(
{
float result;
result = x + y;
return result; )1(
};
void main)(
{
cout << sum) 4.5 , 8.9 (;
}
)main ( وتعريفها قبل الدالة الرئيسية )sum( نلحظ أننا قمنا بالعلن عن الدالة
متغيرين من النوع الحقيقي وتقوم بجمعهما وتعيد الناتج في صورة عدد ) sum ( وتأخذ الدالة
حقيقي.
وعملية إعادة الناتج من الدالة تتم في السطر المشار إلية بالرقم ) 1( وتتم باستخدام الكلمة
ويليها المتغير المراد إعادة قيمته ) return ( المحجوزة
معاملت الدوال:
) في المثال) 2 ) sum ( بعض الدوال تحتاج عند استدعائها إلى متغيرات مثل الدالة
والمعاملت هي القيم التي تحتاجها الدالة لداء مهمتها عليها ، في هذه الحالة جمع المعاملين.
التي استخدمناها في ) DrawLine ( وعلى العكس من ذلك توجد دوال ل تأخذ معاملت مثل الدالة
) المثال ) 1
)main function arguments ( معاملت الدالة الرئيسية
بدون معاملت أي تكون ) main ( كل البرامج التي تعرضنا لها حتى الن تستخدم الدالة الرئيسية
متبوعة بقوسين فارغين، وبعد معرفتنا بالدوال نتساءل أل يمكن أن نستخدم الدالة الرئيسية
بمعاملت؟
) والجواب على هذا السؤال أنه يمكن بالفعل استخدام الدالة الرئيسية بمعاملت والمثال التالي مثال) 3
يوضح برنامجا فيه الدالة الرئيسية تم استدعائها بمعاملتها
CODE
#include < iostream.h >
main )int argc, char*argv[](
{
if)afgc!=3(
{
cout<<” Arguments number error ….”;
exit)1(;
}
cout<<”the first argument is”<<argv[1]<<’\n’;
cout<<”the second argument is”<<srgv[2];
}
وهو من النوع العددي الصحيح، ويستخدم )argc ( نلحظ أن الدالة الرئيسية تستخدم معاملين هما
اختصار لعدد )argc ( لتخزين عدد المعاملت التي سيكتبها المستخدم عند استدعاء الدالة، والسم
)argument counter ( المعاملت
وهو عبارة عن مصفوفة حرفيات تختزن المعاملت التي يكتبها ) argv ( أما المعامل الثاني فهو
المستخدم عند استدعاء البرنامج.
وتكتب المعاملت الخاصة بالدالة الرئيسية عند استدعاء البرنامج فمثل لو كان البرنامج السابق في
)prog1.exe ( صورته القابلة للتنفيذ محفوظا باسم
وكتبنا السطر التي لتنفيذه:
C:> prog1 First Second
فإن المعاملت تختزن في مصفوفة المعاملت بالشكل الموضح بالجدول أدناه
[argv[ عنصر المصفوفة : 0 *** Prog القيمة المختزنة : 1
[argv[ عنصر المصفوفة : 1 **** First : القيمة المختزنة
[argv[ عنصر المصفوفة : 2 ** Second : القيمة المختزنة
ويقوم البرنامج بالتأكد من عدد المعاملت المعطاة فإذا كان غير ثلثة طبع البرنامج رسالة خطأ.
و لو كان العدد مساويا لثلثة ) كما هو الحال في السطر المعطى بعالية( فإن البرنامج يطبع قيمة
المعامل الول .
ثم ينتقل لسطر جديد ليطبع المعامل الثاني.
ويكون خرج البرنامج كالتي
the first argument is First
the second argument is Second
الماكرو:
الماكرو هو مجموعة أوامر مصممة لداء غرض معين، والمثال التالي يوضح برنامجا استخدمنا فيه
ماكرو لحساب مربع العدد
CODE
#include <iostream.h>
#define SQUARE)A( A*A
main)(
{
int x;
cout<< “ Please enter a number to calculate it’s square “;
cin >> x;
cout << “ The square of “<< x << “is :” << SQUARE)x(;
}
والبرنامج هنا ينتظر من المستخدم إدخال قيمة عددية للحصول على مربعها،
ويحسب البرنامج قيمة مربع العدد باستخدام الماكرو المعلن في السطر الثاني
#define SQUARE)A( A*A
ولحساب القيمة يقوم البرنامج باستدعاء الماكرو
SQUARE)x(;
والماكرو يشبه الدالة إلى حد ما وإن كان هناك اختلف بينهما نتناوله الن بالتفصيل.
يمر البرنامج بعدة مراحل قبل الحصول على النسخة القابلة للتنفيذ منه وهذه المراحل هي:
وتسمى هذه العملية بكتابة )Editors ( -1 كتابة البرنامج وحفظة باستخدام أحد برامج التحرير
ويسمى بالملف المصدر ) "cpp. " ويحتفظ بالملف في هذه الحالة بالمتداد ) coding ( الكود
source file(.
وينتج عن هذه العملية البرنامج الهدف الذي يحمل عادة ) compilation ( 2- عملية الترجمة
OBJ" . " المتداد
وينتج عن هذة العملية البرنامج التنفيذي الذي يحمل )Linking ( 3- عملية الربط بمكتبة اللغة
والبرنامج التنفيذي هو البرنامج الذي يتم تنفيذه بمجرد إدخال اسمه . ."EXE" المتداد
والدالة بعد كتابتها في البرنامج تمر بمرحلة الترجمة إلى لغة اللة ول تنفذ إل في مرحلة الربط، أما
الماكرو وأثناء عملية الترجمة فيتم استبداله في كل سطر يتم استدعاؤه فيه بنتيجته النهائية ول
ينتظر مرحلة التنفيذ كالدالة.
ويمتاز الماكرو عن الدالة بالسرعة والسهولة في الكتابة بالضافة لستخدامه أنواعا محايدة من
فهو ل ) )SQUARE)A ( البيانات ) فلم نشترط نوعا معينا من المتغيرات في تعريفنا للماكرو
يحتاج إلى تحديد النوع كما في الدوال.
وذلك بالضافة إلى حصولنا على ملف تنفيذي أصغر في حالة استعمال الماكرو.
وبصفة عامة يوصى باستخدام الماكرو في العمليات القصيرة التي ل تتعدى سطرا واحدا.
الفصل السادس :المصفوفات
المصفوفة هي مجموعة من العناصر من نفس النوع، وتكون عناصر المصفوفة مرتبة بحيث يمكننا
الوصول لي عنصر نريده بتحديد ترتيبه في المصفوفة.
والمصفوفات تنقسم لنوعين فهناك المصفوفات ذات البعد الواحد، والمصفوفات ذات البعدين.
مصفوفات البعد الواحد
المصفوفة ذات البعد الواحد هي مجموعة من العناصر مرتبة بحيث يمكن الوصول إلى أى عنصر فيها
باستخدام ترتيبه بالنسبة لول عنصر في المصفوفة
يأخذ أول عنصر الرقم صفر. ++C وفي لغة
والشكل التالي يوضح مصفوفة ذات بعد واحد
A= [ 2 3 4 5 6]
وعناصر المصفوفة مرتبة بدءا من العنصر الول والذي يأخذ الرقم صفر
. مساويا للقيمة 2 [A[ ويكون العنصر الول 0
وهكذا… ، A[1] = 3 ، A[2] = وبالمثل يكون 4
مصفوفات ذات بعدين
المصفوفة ذات البعدين تحتوي على عناصر من نفس النوع، ولكنها مرتبة في صفوف و أعمدة .
وبالتالي تختلف طريقة الوصول للعناصر إذ يلزم لتحديد العنصر استخدام رقم الصف و رقم العمود و
الشكل التالي يوضح مصفوفة ذات بعدين
وعناصر المصفوفة في هذه الحالة كما ذكرنا تحدد باستخدام رقمين رقم الصف ورقم العمود،
فالعنصر 12 يقع في العمود الول والصف الول أو بلغة الكمبيوتر
لحظ أن الترقيم في المصفوفة يبدأ بالرقم صفر دائما. .B[0][0]=12
وبالمثل يمكن تحديد العناصر المختلفة ، ويذكر رقم الصف أول ثم رقم العمود، والشكل التالي يوضح
B أمثلة لتحديد عناصر مختلفة من المصفوفة
CODE
B[1][2] = 35
B[2][1] = 80
B[0][2] = 15
B[2][2] = 16
والعلن عنها وتخصيص قيم ++C وسنتناول فيما يلي كيفية التعامل مع المصفوفات من خلل لغة
للعناصر وطباعة العناصر وغيرها من اساليب معالجة المصفوفات.
++C مصفوفة البعد الواحد في لغة
A المثال الموضح بالشكل التالي يوضح كيفية التعامل مع مصفوفة ذات بعد واحد بالسم
CODE
#include <iostream.h>
main)(
{
int A[4]; // )1(
for)int I=0; I<4; I++(
{
cout<<” Please enter the value of the element A[“ << I << ”]”;
cin >> A[I];
}
for)int I=0; I<4; I++(
{
cout<<” The value of the element A[“ << I << ”] is” << A[I];
}
}
ويقوم المثال بعد ذلك بعدة عمليات نتناولها بالتفصيل
السطر المشار إليه بالرقم) 1 ( يعلن عن المصفوفة وعناصر المصفوفة من النوع العددي الصحيح )
وعدد العناصر أربعة. )int
والعلن عن المصفوفة كالعلن عن المتغيرات العادية يذكر نوع المتغيرات أول ثم اسم المصفوفة
متبوعا بعدد العناصر بين قوسين مربعين.
الولى تقوم بتعبئة المصفوفة بالبيانات التي يدخلها المستخدم واحدا بعد الخر، ويلحظ for والحلقة
أنه ل بد لنا من حلقة تكرارية لدخال البيانات في المصفوفة.
الثانية فتقوم بعرض عناصر المصفوفة التي تم إدخالها عنصرا عنصرا. for أما الحلقة
: ++C المصفوفة ذات البعدين في لغة
في أحد الفصول الدراسية كانت نتائج ثلثة طلب كما هو موضح بالجدول التالي
والن لو طلب منا برنامج يمكنه التعامل مع هذا الجزء من النتيجة، فإننا نحتاج بكل تأكيد لمصفوفة
ذات بعدين والبرنامج التالي يوضح كيفية إنشاء مصفوفة ذات بعدين، وبعد ذلك يطلب من المستخدم
إدخال البيانات الموضحة في الجدول ويقوم بتخزينها في عناصر المصفوفة المناظرة، وبعد ذلك يطبع
البرنامج القيم المدخلة.
CODE
#include <iostream.h>
main)(
{
float Degrees[3][3]; // Array declaration
// Array Element entry
for )int I=0; I<3; I++(
{
for)int J=0; J<3; J++(
{
cout<<” Enter the result of subject ” << I << “for
student “<< J;
cin >> Degrees[I][J];
}
};
// Array elements display
for )int I=0; I<3; I++(
{
for)int J=0; J<3; J++(
{
cout<<” the result of subject ” << I << “for student “<< J
<<”is”;
cout<< Degrees[I][J];
}
};
}
لتخصيص البيانات للمصفوفة ولعرضها بعد for ويلحظ استعمال حلقتين تكراريتين من النوع
التخصيص وكل من الحلقتين التكراريتين تتكونان من حلقة خارجية تقوم بزيادة عداد العمدة وحلقة
الداخلية تقوم بزيادة عداد الصفوف.
وترمز العمدة هنا لرقم المادة بينما ترمز الصفوف لرقم الطالب.
) Classes & Objects ( الفصل السابع : الفصائل والكائنات
سنتناول في هذا الفصل بشيء من التفصيل الفصائل والكائنات لنتعرف عن قرب على برمجة الكائنات
الموجهة .
الفصيلة تتكون من بينات ودوال تتعامل مع هذه البيانات والشكل التالي )شكل 1( يوضح الصورة
العامة للعلن عن الفصيلة
CODE
class class_name{
private:
private data and functions
public :
public data and functions
}
والعلن عن الفصيلة يتكون من:
ويخضع اسم الفصيلة )class_name ( يليها اسم الفصيلة ) class ( أول : الكلمة المحجوزة
لقواعد عامة هي:
أو الكلمات التي ) Reserved words ( - أل يكون اسم الفصيلة أحد الكلمات المحجوزة باللغة
ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر التشغيل ) main ( تحمل معنى خاصا مثل
المصاحب للمترجم.
سواء صغيرة كانت أم كبيرة، )A-Z ( - يمكن أن يحتوي السم على أى حرف من الحروف البجدية
9 ( كما يمكن أن تحتوي على علمة الشرطة السفلى ) _ ( ولكن ل يجوز - وأي رقم من الرقام ) 0
أن يبدأ السم برقم.
-ل قيود على طول السم ، وتتيح هذه الميزة استخدام أسماء معبرة عن مضمونها، ومن الفضل
دائما استخدام السم المعبر عن محتوى الفصيلة لتسهيل التعامل مع الفصائل.
يختلف )MY_CLASS( فمثل اسم البيان ++C -الحروف الكبيرة و الصغيرة ليست متكافئة في لغة
.)My_Class ( وكلهما يختلف عن السم )my_class ( عن السم
وتلي هذه الكلمة ) private ( ثانيا: تحديد درجة الحماية ، ونبدأ عادة بدرجة الحماية الخاصة
البيانات و الدوال الخاصة بالفصيلة.
وسنتعرف ) public ( ثالثا: تحديد درجة حماية أخرى ،وفي هذا المثال استخدمنا الدرجة العامة
على درجات الحماية بالتفصيل في وقت لحق.
والمثال الموضح بالشكل التالي يوضح كيفية استخدام الفصيلة في برنامج.
CODE
01: #include <iostream.h>
02: class smallobj // class name
03:{
04: private:
05: int somedata; //class data
06: public:
07: void setdata )int d(; // member function to set data
08: {somedata= d;}
09: void showdata)( // mamber function to display data
10: { cout << “ \n Data is “ << somedata;}
11:};
12: void main)(
13:{
14: smallobj s1,s2; // define two objects of the class
15: s1.setdata)1096(; //call member function to set data
16: s2.setdata)200(;
17: s1.showdata)(;
18: s2.showdata)(;
19:}
يبدأ البرنامج بالتوجيه في السطر الول ، وفائدة هذا التوجيه إخبار المترجم بمكان الملف المحتوي
على تعريفات الدوال الساسية والتي سنستخدمها في البرنامج.
وتتابع السطور بعد ذلك كالتي:
ويلحظ التعليق المكتوب بعد العلمة )smallobj ( السطر 02 : تعريف فصيلة جديدة تحمل السم
. C " //" ، وهذة الميزة لم تسمح بها لغة
السطرين 04 و 05 : تعلنان عن بيان من النوع الصحيح.
السطر 06 : يعلن درجة الحماية العامة، بمعنى أن ما سيأتي بعد ذلك سيكون عاما فيمكن للفصائل
المشتقة أن تتعامل معه.
السطور من 07 إلى 10 فيهما تعريف الدالتين الوحيدتين في الفصيلة.
ويلحظ في السطر 10 كيفية الطباعة على الشاشة وهو أسلوب جديد لم يكن مستعمل من قبل في لغة
وسنتعرض للساليب الجديدة في فصل مستقل. .C
. )(main وبداية من السطر 12 يبدأ البرنامج فعليا كالعادة بالدالة
وفي السطر 14 نعرف كائنين من الفصيلة السابقة، ويلحظ أن تعريف الكائنات يتم كتعريف
المتغيرات العادية.
للكائن الول، وتجب ملحظة طريقة الستدعاء باستخدام ) )(setdata ( السطر 15 يستدعي الدالة
المؤثر ) .(، حيث يذكر اسم الكائن متبوعا بالمؤثر ) .( ثم اسم الدالة المراد تنفيذها مع تخصيص قيم
لمتغيرات الدالة.
.)s1,s لكل من الكائنين ) 2 ) )(showdata ( السطرين 17 و 18 يتم فيهما استدعاء الدالة
درجة حماية أعضاء الفصيلة:
تعرضنا لعبارة " درجة حماية أعضاء الفصيلة " والن نتناول هذه العبارة بشيء من التفصيل.
أن درجة الحماية هي تحديد مدى القدرة على التعامل مع أعضاء الفصيلة ) البيانات و الدوال (
والكلمات المستخدمة لتحديد درجة الحماية موضحة بالجدول التالي
دالة البناء :
ذكرنا سابقا أن دالة البناء ما هي إل عضو من الفصيلة وتحمل نفس اسمها، وتنفذ هذه الدالة تلقائيا
عند العلن عن كائن من الفصيلة.
ويمكننا أن نستفيد من هذه الدالة في تخصيص قيم لبعض بيانات الكائن عند العلن عنه.
و المثال التالي يوضح برنامجا قمنا فيه بالعلن عن فصيلة ودالة البناء تقوم بعملية تخصيص القيم
) a , b ( التي تأخذها لبيانات الفصيلة
CODE
# include “iostream.h”
class MyClass
{
int a,b;
public:
MyClass )int i, int j(
{
a=i;
b=j;
}
void Show)(
{
cout << a<< “ “<<b;
}
};
void main)(
{
MyClass C1)2,6(;
C1.Show)(;
}
لم يتم بالطريقة المعتادة ) MyClass ( نلحظ في هذا المثال أن العلن عن الكائن من الفصيلة
حيث قمنا باستخدام قوسين بعد اسم الكائن وبينهما قيمتين عدديتين.
والعلن هنا قام باستدعاء دالة البناء الخاصة بالفصيلة والتي بدورها تأخذ القيم المعطاة وتخصصها
الموجودين بالفصيلة. ) a , b ( للبيانين
نجد أنها تعرض القيم التي ) a , b ( والتي تعرض قيم المتغيرين ) )(Show ( وعند استدعاء دالة
) C تم تخصيصها عند العلن عن الكائن ) 1
مصفوفة الكائنات:
المصفوفة هي مجموعة من العناصر من نفس النوع، وجرت العادة أن نعرف مصفوفات من أنواع
المتغيرات المتاحة في اللغة.
يتمكن المبرمج من العلن عن مصفوفة من الكائنات أيضا بنفس الكيفية التي ++C و مع لغة
يستخدمها للعلن عن مصفوفة من المتغيرات العادية.
والمثال التالي يوضح كيفية العلن عن مصفوفة الكائنات
CODE
#include <iostream.h>
class Date
{ public:
int day,month,year;
set_date)int d, int m, int y(
{day=d; month=m; yaer=y;}
};
main)(
{
Date date_array[3];
date_array[0].set_date)2,3,1990(;
}
وهي الفصيلة التي أعلنا ) Date ( ونلحظ من هذا المثال أننا أعلنا عن مصفوفة كائنات من نوع
عنها قبل الدالة الرئيسية مباشرة.
ونتعامل مع عناصر مصفوفة الكائنات بطريقة مماثلة لتعاملنا مع عناصر المصفوفات الخرى،
للعنصر الول من عناصر ) set_date ( والسطر الثاني يوضح مثل كيفية استدعاء الدالة
المصفوفة.
استعمال المؤشرات مع الكائنات
في لغات البرمجة لها أهميتها القصوي ) والتي قد ل يدركها المبتدئ ( ) pointers ( المؤشرات
ونتيجة لهذة الهمية ظهرت الحاجة لستخدام المؤشرات مع الكائنات.
استخدام المؤشرات مع الكائنات، ويتم العلن عن مؤشر لكائن ما وللعلن عن ++C وتدعم لغة
Date ( الموضحة في المثال السابق نستخدم العبارة ) Date ( مؤشر لكائن من الفصيلة
كما بالمثال التالي ) ;*dptr
CODE
#include <iostream.h>
class Date
{ public:
int day,month,year;
set_date)int d, int m, int y(
{day=d; month=m; yaer=y;}
};
main)(
{
Date *dptr;
Date date;
Dptr -> day=3;
Date.day=4;
}
ومعاملة ، )dptr ( ومؤشر إلى كائن ) date ( ويلحظ أنه في هذا المثال قد تم العلن عن كائن
كل منهما تختلف عن الخر حيث نستخدم المؤثر ) -> ( مع المؤشر للكائن للوصول إلى البيان )
.) date ( فيه بينما استخدمنا المؤثر ) .( مع الكائن ) day
ويجب توخي الحرص دائما عند التعامل مع المؤشرات لتلفي الخطاء التي يمكن أن تحدث.
تم بحمد ال
gym hgsd