شرح بعض الدروس لبرمجة الكمبيوتر

الكاتب : شيخ وادي دوعن   المشاهدات : 1,174   الردود : 2    ‏2002-03-26
      مشاركة رقم : 1    ‏2002-03-26
  1. شيخ وادي دوعن

    شيخ وادي دوعن عضو

    التسجيل :
    ‏2002-03-25
    المشاركات:
    151
    الإعجاب :
    0
    بسم الله الرحمن الرحيم

    شرح بعض الدروس لبرمجة الكمبيوتر




    الدرس الأول --------->

    لغة C … نظرة تاريخية و ملامح عامة … :

    لغة C لغة متفردة في ملامحها ومنشآتها، وتتميز بأنها سلاح قوي للمبرمج، فهي تؤدي العديد مما لا تستطيع اللغات الأخرى – عالية المستوى- أن تؤديه كما تتيح للمبرمج التحكم بصورة أفضل في الكمبيوتر، ولذلك فإن لغة ال C قد أصبحت لغة العصر.

    و على الرغم من أن لغة الC ليست جديدة فإنها لغة سريعة التطور ، حيث أبتكرها " دينيس ريتشي" في أوائل السبعينات وقدمها بالاشتراك مع " بريان كارينجان" في كتابهما ( The C programming language )والذي يعد المرجع الأساسي في اللغة. ومنذ ذلك الحين واللغة في تطور مستمر.

    وتطورت لغة C تطورا سريعا ليظهر منها الامتداد الذي يطلق عليه C++ وتتميز لغة C++ باعتمادها أساسا جديدا من طرق البرمجة وهو ما يطلق عليه (Object Oriented Programming ).ومهدت لغة C++ الطريق لظهور لغة Visual C++ وهي الصورة الأحدث من اللغة والتي تعمل في بيئة الويندوز.

    ونتيجة تزايد استخدام لغة C قامت مؤسسة القياسات الأمريكية في عام 1983
    بعملية توحيد للهجات المختلفة التي كادت أن تنتشر للغة C فأصدرت اللغة القياسية التي يطلق عليها " ANSI C "وهي تحتوي على بعض الإضافات إلى اللغة الأصلية التي ابتكرها ريتشي.

    ما هو البرنامج:
    البرنامج اصطلاح يرمز لعدد محدد من الأوامر التي تعطى للكمبيوتر، بغرض تنفيذ مهمة محددة أو أداء وظيفة مطلوبة.

    ومن أهم ملامح البرمجة بلغة C أن البرنامج ما هو إلا معمار دقيق التصميم يعتمد في بنائه على البلوكات الجاهزة التي تتكامل معا لتصنع البناء الضخم.و البلوك أو مايسمى بالدالة ( function ) ما هو إلا مجموعة من الأوامر متعلقة بجزء محدد من البرنامج، وتنتج البلوكات من تقسيم البرنامج إلى أجزاء أصغر لكل وظيفته التي يتم تحديدها بالأوامر التي تكتب في البلوك.

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

    ونستطيع مع لغة C استخدام البلوكات الجاهزة الموجودة بمكتبات المبرمجين الآخرين، أو بناء مكتبة من الدوال للاستعانة بها وقت الحاجة.

    وهناك خطوات مطلوبة لتنفيذ أي برنامج وهي:
    1- كتابة البرنامج وحفظة على القرص باستخدام أحد برامج التحرير ( Editors)
    2- عملية الترجمة ( compilation ) وينتج عن هذه العملية البرنامج الهدف الذي يحمل عادة الامتداد " OBJ" .
    3- عملية الربط بمكتبة اللغة ( Linking) وينتج عن هذه العملية البرنامج التنفيذي الذي يحمل الامتداد "EXE". والبرنامج التنفيذي هو البرنامج الذي يتم تنفيذه بمجرد إدخال اسمه .

    وهناك العديد من برامج الترجمة الشهيرة على الكمبيوتر مثل " Terbo C" أو "Quick C" وتلك البرامج تحتوي على بيئة مجمعة تشمل محررا لكتابة البرنامج، و قوائم ذات نوافذ بها أوامر الحفظ والترجمة و الربط و التنفيذ.
    الدرس الثاني
    البرنامج الأول بلغة C :

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

    إن البرنامج يعتمد أساسا على الدالة printf فهي المسئولة عن طباعة العبارة المطلوب طباعتها على الشاشة. وعندما تتقدم في اللغة ستجد أن لغة C مبنية من دوال مختلفة لكل وظيفتها المحددة، كما ذكرنا سابقا.

    ولتؤدي الدالة printf المطلوب منها لا تستخدم بمفردها بل لابد أن تأتي بداخل الإطار الموضح بالشكل السابق حتى تتمكن من القيام بعملها.

    والإطار الذى يحوي البرنامج يبدأ بكلمة main يعقبها القوس الأيسر " { " والذي تتالى بعده عبارات البرنامج، ثم ينتهي بالقوس الأيمن " } ".

    ويطلق على الجزء المحتوى بين القوسين " { } " اسم البلوك (block) .و البلوك الذي يبدأ بكلمة (main) يسمى بلوك البرنامج.
    وفي المثال السابق يتكون البرنامج من بلوك واحد هو بلوك البرنامج.

    والسطر الأول من البرنامج والمحصور بين العلامتين " /* */" يسمى التعليق ويستخدم التعليق لكتابة الملاحظات على البرنامج، ومن المفيد دوما كتابة التعليقات لتسهيل مراجعة البرنامج .

    وعند ترجمة هذا البرنامج فإن مترجم لغة C يتجاهل تماما كل ما يأتي بين هاتين العلامتين. ويجوز أن تضيف إلى البرنامج ما تشاء من الملاحظات وفي أي مكان من البرنامج وبأي عدد من السطور مادمت تبدأ وتنتهي بالعلامتين المميزتين" /* " ، " */ ".

    أما السطر الثاني والذي يبدأ بالعلامة الخاصة " # " فيسمى بالتوجيه ( Directive ) وهو لا يمثل جزءا من منطق البرنامج ولكنه يستخدم لتوجيه المترجم أثناء الترجمة ، حيث يدله على مكان الملف " stdio.h " والذي يطلق عليه اسم ملف العناوين للدخل و الخرج أو (Standard Input Output header file )

    ويجب الالتزام بسطور التوجيه لأن هناك دوال لابد لها من إستدعاء ملفات خاصه بها، وعندما نستخدم دالة دون استخدام سطر التوجية الخاص بها نحصل على خطأ من المترجم عند بداية الترجمة.

    و هناك قواعد بسيطة لكتابة البرنامج بلغة C ولابد من مراعتها عند كتابة البرامج ومن هذه القواعد ما يمكن التسامح فيه فمثلا المسافات الخالية والسطور التي تفصل ما بين الكلمات والعبارات كلها اختيارية ويمكن الأستغناء عنها.

    ولكن هناك من القواعد ما يجب الإلتزام به :

    1- تكتب التوجيهات على سطر مستقل.
    2- تستخدم الدوال ( مثل printf ) في تكوين عبارات البرنامج ( staements) وتنتهي كل عبارة بفاصلة منقوطة. والفاصلة المنقوطة لاغنى عنها حتى لو كان البرنامج محتويا على عبارة واحدة، وأغلب الأخطاء التي نحصل عليها تكون نتيجة نسيان فاصلة منقوطة.
    3- تتطلب بعض الكلمات الخاصة باللغة أن نعقبها بمسافة خالية على الأقل وإلا تعرضنا لرسالة خطأ من المترجم عند ترجمة البرنامج.
    4- تكتب الكلمات المفتاحية للغة ( key words ) مثل أسماء الدوال (مثل printf ) بالحروف الصغيرة ( small letters).


    *****



    تستخدم الدالة printf لطابعة النصوص على الشاشة وهي كأي دالة أخرى تأتي متبوعة بقوسين نكتب بينهما النص المطلوب طباعته بين علامتي اقتباس.

    وكل ما نكتبة بين علامتي الاقتباس يظهر كما هو على الشاشة ولذلك يصطلح على تسميته بالحرفي ( string) .



    ونلاحظ أن العبارتين طبعتا على الشاشة دون أي فاصل بينهما.

    و لكننا حتما نريد الفصل بين العبارات المختلفة فمثلا ماذا لو أردنا الإنتقال لسطر جديد لتطبع العبارة الثانية على سطر مستقل؟

    إن الإنتقال لسطر جديد يستلزم إضافة علامة خاصة إلى نهاية الحرفي الأول، وتسمى هذه العلامة بعلامة السطر الجديد ( new line character ) وتكتب كالآتي ( \n)

    ومما يجب ملاحظته أن علامة السطر الجديد تكتب بداخل علامتي الاقتباس ولا تظهر على الشاشة كما هي !!!
    وذلك لأن المترجم يفهم العلامات الخاصة على نحو ما وتعتبر أمرا من الأوامر يقوم بتنفيذها بالصورة المطلوبة.


    ويمكن استخدام دالة الطباعة لتطبع على الشاشة محتويات بطاقة تحمل الاسم والعنوان
    ****


    التعامل مع الأعداد :
    يمكن باستخدام عبارة الطباعة و الدالة printf أن نعرض الأرقام على الشاشة بل يمكننا أيضا أن نجري العمليات الحسابية المختلفة فتتولى الدالة printf تقييم التعبيرات الحسابية وطباعة النتيجة على الشاشة.ومن الملاحظ أن الأعداد لا تحتاج لعلامات اقتباس.

    وفي لغة C يجب أن نفرق بين نوعين من الأعداد:

    الأعداد الصحيحة ( Integers)
    الأعداد الحقيقية ( Real numbers)

    أما الأعداد الصحيحة فهي تلك الأعداد التي لا تحوي كسورا. بينما تحتوي الأعداد الحقيقية على علامة عشرية ( بصرف النظر عن وجود كسر من عدمه).

    فورمات الأعداد:

    يلزم إخبار الكمبيوتر دائما عن نوع العدد باستخدام صيغة خاصة (فورمات) تأتي بداخل علامتي الأقتباس، لأن الكمبيوتر يتعامل مع كل نوعية من الأعداد بطريقة مختلفة تماما.


    وفي هذا البرنامج استخدمنا نوعين من الأعداد و لكل منهما لبفورمات الخاصة به فنجد أن رمز الفورمات المستخدم مع العدد الصحيح هو ( %d)
    والحرف ( d ) بهذا الرمز هو اختصار كلمة ( decimal ) بمعنى رقم عشري أي مكتوب بالنظام العشري.

    أما رمز الفورمات المستخدم لطباعة العدد الحقيقي فهو ( %f) والحرف ( f ) بهذا الرمز هو اختصار كلمة ( floating point number ) وهي الأعداد ذات العلامة العشرية.


    ويجب على المبرمج تحري الدقة التامة عند التعامل مع الفورمات ، فلا نستخدم فورمات الأعداد الحقيقية مع الأعداد الصحيحة أو العكس. لأن الخطأ في الاستخدام ينتج عنه نتائج غير صحيحة.

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


    ********
    1 5


    استخدام المتغيرات:

    يقوم الكمبيوتر بتخزين البيانات التي يحتاجها في الذاكرة والمتغيرات ما هي إلا عناوين خانات في الذاكرة التي نحفظ فيها البيانات. ولتسهيل الوصول للبيانات المختزنة يتم في لغات البرمجة عالية المستوى استبدال العناوين الرقمية بأسماء المتغيرات.

    ويكفينا هنا - لو كنا مبتدئين في البرمجة- أن نتذكر دائما أن المتغير ما هو إلا اسم لأحد الأماكن التي تختزن فيها البيانات في الذاكرة.
    وأسماء المتغيرات يصطلح عليها في لغة الC بأسماء البيانات ( Identifiers)
    وهناك قواعد محددة لاختيار أسماء البيانات وهي:

    ألا يكون اسم البيان أحد الكلمات المحجوزة باللغة ( Reserved words ) أو الكلمات التي تحمل معنى خاصا مثل( main ) ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر التشغيل المصاحب للمترجم.
    يمكن أن يحتوي الاسم على أى حرف من الحروف الأبجدية ( A-Z) سواء صغيرة كانت أم كبيرة، وأي رقم من الأرقام (0-9 ) كما يمكن أن تحتوي على علامة الشرطة السفلى ( _ ) ولكن لا يجوز أن يبدأ الاسم برقم.
    لا قيود على طول الاسم ، وتتيح هذه الميزة استخدام أسماء معبرة عن مضمونها، ومن الأفضل دائما استخدام الاسم المعبر عن محتوى المتغير لتسهيل عملية فحص البرنامج في حالة الخطأ من جهة، ولتسهيل عملية الإضافة والتعديل للبرنامج.
    الحروف الكبيرة و الصغيرة ليست متكافئة في لغة C فمثلا اسم البيان(MY_NUMBER) يختلف عن الاسم ( my_number) وكلاهما يختلف عن الاسم ( My_Number).

    الإعلان عن المتغيرات:
    ليتمكن المستخدم من استخدام المتغيرات التي يريدها يتطلب البرنامج المكتوب بلغة C الإعلان المسبق عن أسمائها ونوعياتها في مستهل البرنامج .

    وتصنف المتغيرات بحسب البيانات التي يمكن أن تختزن فيها فهناك المتغيرات الصحيحة ( أي التي تصلح لإختزان الأعداد الصحيحة) و هناك المتغيرات الحقيقية ( أي التي تختزن الأعداد الحقيقية)، ومع تقدمنا في اللغة سنتعرف على نوعيات أخرى من المتغيرات.


    وكما نرى في البرنامج أنه قد تم الإعلان عن متغيرين الأول ( a) وهو من النوع الصحيح (integer) وقد استخدمنا الكلمة int للإعلان عنه.
    وأما المتغير الثاني ( b) فهو يختزن الأعداد الحقيقية ( Real) وقد استخدمنا معه الكلمة float للإعلان عنه.

    وكما ذكرنا سابقا، نلاحظ أن عبارة الإعلان تنتهي بفاصلة منقوطة كسائر عبارات البرنامج، كما أنه يلزم ترك مسافة خالية على الأقل بعد كل من الكلمات المحجوزة ( int أو float)
    وبعد ذلك تقوم بقية البرنامج بطباعة محتوى المتغيرات a,b ولأننا لم نخزن في هذين المتغيرين أية بيانات فإن ما نحصل علية ليس إلا بعض المخلفات الموجودة في الذاكرة، وهي بلا معنى على الإطلاق
    تخزين البيانات في المتغيرات ( Assignment ):

    في البرنامج السابق لاحظنا أنه لابد من أن تختزن عددا ما في المتغير العددي الذي أعلنا عنه ويتم ذلك باستخدام عبارة التخصيص ( assignment statement) ويوضح الشكل التالي(2-13) برنامجا قمنا فية بالإعلان عن متغيرين و إختزان بيانين عدديين في كل منهما ، ثم نطبع محتويات هذين المتغيرين على الشاشة.

    عبارة التخصيص ( Assignment statment ) :
    إن العبارة
    a=1000;
    يمكن قرائتها على النحو التالي:
    " خصص العدد 1000 للمتغير a "
    ومن الجائز أن نخصص متغيرا لمتغير آخر ، ومعنى ذلك أننا نضع نسخة من المغير الأول في المتغير الثاني.

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

    ويوضح المثال التالي ثلاث عمليات تخصيص كالآتي:
    تخصيص قيمة عددية للمتغير " a"
    قسمة محتويات المتغير " a" على 2 وتخصيص الناتج للمتغير " b"
    جمع محتويات كل من " a" ، " b" وتخصيصها للمتغير " c".
    ومن الملاحظ في هذا البرنامج أنه قد تم إعلان المتغيرين " b" ، " c" في عبارة واحدة وقمنا بإستخدام علامة الفاصلة للفصل بينهما.

    ونتيجة البرنامج النهائية هي طباعة محتويات المتغير " c"

    التخصيص المتعدد:
    يمكننا في لغة C أن نخصص قيمة ما لأكثر من متغير في نفس العبارة كالآتي:
    a = b = c = 24;

    تخصيص قيم ابتدائية المتغيرات:

    يمكن أيضا شحن المتغير بقيمة إبتدائية أثناء الأعلان عنه كالآتي:
    float a = 5.6 ;
    ونقوم بشحن المتغيرات بقيمة ابتدائية عند الإعلان عنها لضمان تنظيف وعاء المتغير من مخلفات الذاكرة.

    *****

    6
    متغير الرمز ( char variable ):

    ذكرنا فيما سبق أننا سنلتقي مع أنواع أخرى من المتغيرات، والآن بعد أن تعرفنا على المتغيرات العددية نتعرف على نوع آخر من المتغيرات وهو ما يصلح لتخزين رمز واحد ( character) ويطلق على هذا النوع من المتغيرات الاسم ( char ).

    و الرموز التي يمكن تخزينها في هذا النوع من المتغيرات فهي قد تكون رموزا موجودة في جدول الكود آسكي ( ASCII code table) وهو جدول يحتوي الرموز المعتمدة من هيئة المواصفات القياسية الأمريكية، ويضم جميع الحروف والأرقام والعلامات الخاصة وعلامات التحكم والأرقام الكودية المناظرة لكل منها.

    و للإعلان عن متغير رمز بالاسم "a" مثلا نستخدم العبارة التالية:
    char a;
    ولتخصيص رمز ما لهذا المتغير فإننا نضعه بين علامتي اقتباس مفردتين كالآتي
    a = 'Z'
    و بهذا التخصيص أصبح متغير الرمز "a " محتويا على الحرف " Z"، ولطباعة محتويات المتغير الرمز نحتاج إلى توصيف جديد للفورمات وهو التوصيف" %c"

    ,هذا التوصيف يحتوي على الحرف الأول من كلمة character وهو مخصص لطباعة الرموز.

    والمثال التالي يوضح برنامجا قمنا فيه بالإعلان عن متغير رمز بالاسم " first_letter"
    ثم خصصنا لهذا المتغير الحرف " A" ثم طبعنا محتويات المتغير باستخدام التوصيف %c.
    وعند تنفيذ هذا البرنامج فإنه يطبع على الشاشة الحرف A.

    ومن أهم خصائص متغير الرمز أننا نستطيع أن نطبعه بطريقتين مختلفتين:
    1- باستخدام الفورمات %c.
    2- باستخدام الفورمات %d.

    في الحالة الأولى كما رأينا في المثال السابق فأن الرمز المختزن هو الذي يظهر على الشاشة.

    أما لو استخدمنا الفورمات %d فإن رقم الكود آسكي المناظر للرمز هو الذي يظهر على الشاشة.

    والمثال التالي يوضح استخدام نوعي موصفات الفورمات مع متغير الرمز


    ******

    7
    الدرس السايع

    تخزين الحرفيات في لغة C:

    إلى الآن تعلمنا كيفية التعامل مع المتغير الرمز ، والمتغيرات العددية.
    و سنتعلم الآن نوعا جديدا من المتغيرات وهو المتغير الحرفي ( string ) ولا ريب أن كل المبرمجين الذين سبق لهم التعامل مع لغات أخرى مثل البيسك قد تعودوا على إستخدام هذا النوع من المتغيرات…

    ولكن لغة C لاتحتوي متغيرا من هذا النوع بل تختزن الحرفيات بطرية خاصة كرموز متتابعة.

    وأحدى الطرق المستخدمة لتخزين الحرفيات هي استخدام نوع خاص من المتغيرات يسمى المؤشر (pointer)، الذي يشير إلى أول رمز في الحرفي المختزن في الذاكرة كما يتم تمييز نهاية الحرفي برمز خاص ، وبذلك يمكن الأستدلال على أولة و آخرة.

    المؤشرات ( pointers):
    المؤشر متغير كسائر المتغيرات ولكنه يختلف عنها فيما يختزنه من بيانات، فالمؤشر لا يختزن البيانات العادية مثل الأرقام أو الرموز. ولكنة يختزن فقط عناوين الذاكرة، ومن هنا جاء اسمة كمؤشر لأنة يشير مباشرة إلى أحد خانات الذاكرة.

    وتختلف طريقة الأعلان عن المؤشر بحسب البيان المخزون فيه، فإذا كان المؤشر يشير إلى عدد صحيح مثلا فيسمى في هذة الحالة ( مؤشر إلى عدد صحيح ) ويعلن عنه بعبارة كالعبارة التاليه:
    int *a;

    أما لو كان يشير إلى رمز من الرموز فيسمى في هذه الحالة مؤشر إلى رمز أو ( character pointer) ويعلن عنه بعبارة كالعبارة التاليه:

    char * a
    ونلاحظ أنه في كلتا الحالتين فأن " a" هو اسم المؤشر الذي اخترناه وهو يأتي مسبوقا بالعلامة " * " التي تدل على كونه مؤشرا. أما نوع المؤشر فهو يتم تحديدة وفقا لنوع البيان المشار إلية فقد يكون عددا صحيحا ( int ) أو حقيقيا ( real ) أو رمزا ( char ) وهي الأنواع الثلاثة التي عرفناها في لغة C

    والمثال التالي يوضح كيفية تخصيص متغير حرفي وطباعته على الشاشة، ونلاحظ أنه لطباعة الحرفي نقوم بطباعة المؤشر الذي يشير إليه مع استخدام توصيف جديد للفورمات وهو ( %s )

    وعند الأعلان عن مؤشر بالعبارة
    char *a;
    فأن هذا يؤدي إلى خلق الآتي:
    1- المؤشر " a " الذي يشير إلى أول حرف من الحرفي.
    2- المتغير" *a " الذي يحتوي على أول حرف من الحرفي.

    من المهم لمن كان جديدا على لغة C أن يحاول التدقيق في مفهوم المؤشرات فهي أداة قوية تساعد المبرمج على إنجاز مهام كثيرة في أقل وقت ممكن، ولكنها في نفس الوقت تمثل مصدرا للأخطاء ما لم تستخدم بصورة مناسبة.


    *****
    8
    عبارات الدخل والخرج:

    حتى الآن قمنا بالطباعة على الشاشة باستخدام الدالة printf لطباعة الخرج وفقا لصيغة محددة (فورمات). و لكن قد يحتاج المبرمج لإدخال البيانات في وقت تنفيذ البرنامج ويستلزم ذلك استخدام دوال لإدخال البيانات، وهو ما سنتعرض له الآن بشيء من التفصيل.

    أما الدالة المناظرة للدالة printf، والمخصصه لإدخال البيانات وفقا لصيغة محددة، فهي الدالة scanf ، ويعتبر الحرف " f" الذي تنتهي به كل من الدالتين هو الحرف الأول من كلمة "format "


    يبدأ البرنامج بالإعلان عن ثلاثة متغيرات من النوع الحقيقي " x,y,z " ثم يتم استقبال قيمة المتغير " x" من لوحة الأزرار بموجب العبارة :

    scanf ("%f",&x)
    ثم يتم استقبال المتغير الثاني"y" بعبارة مماثلة ثم يتم جمع المتغيرين " x,y " وتخصيص الناتج للمتغير " z"
    وفي النهاية نطبع قيمة المتغير " z " المحتوي على المجموع.

    عند تشغيل البرنامج سوف ينتظر إدخال قيمة المتغير "x" فإذا أدخلنا العدد المطلوب وأتبعنا ذلك بالضغط على الزر Enter ، فإن البرنامج يتوقف مرة أخرى منتظرا إدخال قيمة المتغير " y " متبوعة بالضغط على الزر Enter وعندئذ يوافينا البرنامج بالنتيجة.

    والآن فلننظر بتفحص لإحدى العبارات التي تحتوي على الدالة scanf فنلاحظ ما يلي:

    1- ضرورة استخدام توصيف للفورمات بنفس الأسلوب المتبع مع الدالة printf وفي المثال السابق قد استخدمنا التوصيف " %f " الذي يناظر المتغير الحقيقي "x" أو " y".
    2- لم تستخدم الدالة المتغير " x" أو "y" صراحة بل استخدمت صورة محورة منه وهي (&x) ، وهذه الصورة الجديدة تسمى مؤشر العنوان ( address operator ) وهي عبارة عن عنوان المتغير لا المتغير نفسه. أما المؤثر الجديد & فيسمى مؤثر العنوان إلى ( address-of operator)


    إدخال أكثر من قيمة متغير واحد بنفس العبارة:
    تماما كما مع الدالة printf يمكننا مع الدالة scanf استخدام عبارة واحدة ودالة واحدة لاستقبال قيم عدة متغيرات
    نلاحظ أن الجزء الخاص بالفورمات ( والواقع بين علامتي الاقتباس ) يحتوي على توصيفين للفورمات " %f %f " بنفس عدد المتغيرات التي تأتي مفصولة عن بعضها البعض باستخدام الفاصلة " , " ( أنظر العبارة المحتوية على الدالة scanf)

    ومن الملاحظات الهامه أن ترتيب الفورمات في الدالة scanf يجب أن يكون بنفس ترتيب المتغيرات التي سيتم إدخالها. وهذه الملاحظة غير واضحة في المثال السابق نظرا لأن كلا المتغيرين المراد إدخالهما من نفس النوع.


    الفصل بين المدخلات:
    في المثال السابق كانت المتغيرات تدخل كل على حدة متبوعا بالضغط على الزر Enter ، ولكن ماذا لو أردنا إدخال المتغيرين في سطر واحد؟؟؟

    المثال التالي يوضح الطريقة الجديدة لإدخال المتغيرين في سطر واحد ويتم الفصل بينهما بفاصلة ، ويتم ذلك بكتابة الفاصلة في البرنامج نفسه كفاصل بين توصيفات الفورمات.
    رسالة لتنبية مستخدم البرنامج :
    من عيوب الدالة scanf أنها لا يمكن استخدامها لطباعة أي نص على الشاشة كما مع دوال الدخل في لغة مثل البيسك . وهذا معناه ضرورة الاستعانة بدالة الطباعة
    printf إذا أردنا أن نطبع على الشاشة رسالة تنبه المستخدم إلى أن البرنامج ينتظر إدخال بيان مثل:
    Please Enter the number
    في المثال التالي نرى صورة محسنة لإدخال قيمتي متغيرين مع طباعة الرسائل اللازمة لتنبية المستخدم.

    ملاحظة هامة:
    لا يوصى باستخدام الدالة scanf لاستقبال الحرفيات من لوحة المفاتيح، حيث يتطلب الأمر احتياطات كثيرة . ولاستقبال الحرفيات من لوحة المفاتيح توجد طرق أفضل سيأتي الحديث عنها.
    طرق جديدة للتعامل مع الحرفيات:

    لقد رأينا من قبل كيف يمكننا تخزين الحرفي بالاستعانة بالمؤشرات حيث يشير المؤشر إلى الرمز الأول من الحرفي المختزن في الذاكرة . هذا من ناحية بداية الحرفي . أما من ناحية نهاية الحرفي فإن البرنامج من تلقاء نفسه يضيف إلى مؤخرة الحرفي الرمز الصفري ( NULL character ) وهو الرمز رقم صفر في جدول الكود آسكي.

    ويفيد هذا الرمز في تمييز مؤخرة الحرفي و بالتالي في تحديد طوله لتسهيل التعامل معه قراءة وكتابة ومعالجة بالطرق المختلفة.

    وفي الواقع أن هذه الطريقة برغم ما تحتويه من تفصيلات فنية دقيقة لكنها أفضل من الطرق المستخدمة في اللغات الأخرى التي تتوفر بها المتغيرات الحرفية ( string variables )، فمع هذه الطريقة في لغة C لا توجد أية قيود على طول الحرفي المستخدم.

    وهنا سنتناول طريقة أخرى لتمثيل الحرفيات وهي مصفوفة الرموز ( character arrays ) ومن اسم هذه الطريقة يتضح أنه يتم حجز خانات الذاكرة اللازمة للحرفي مقدما.

    الأعلان عن مصفوفة الرموز:

    لننشئ مصفوفة من الرموز فإننا نبدأ بالإعلان عنها في بداية البرنامج . ويشمل الإعلان اسم المصفوفة وسعتها ( size ) أي الحد الأقصى لعدد الرموز بها .

    فمثلا الجملة التالية يتم فيها الإعلان عن مصفوفة رموز بالاسم ( employee_name ):
    char employee_name[20];
    في هذا الإعلان يتم حجز عشرين خانة في الذاكرة تتسع كل منها لرمز واحد ، كما تخصص الخانة الأخيرة للرمز الصفري( NULL ).

    ولشحن هذه المصفوفة بأحد الحرفيات، فإن دالة خاصة تستخدم لهذا الغرض وهي الدالة ( strcpy ( a,b) ) حيث " a " هو اسم مصفوفة الرموز، و "b" هو الحرفي المراد تخزينه في المصفوفة.

    والمثال التالي يوضح الإعلان عن مصفوفة رموز بالاسم " a" تتسع لعشرين رمزا ثم ننسخ إلى عناصرها الحرفي " Hello again " وفي النهاية نطبع محتويات المصفوفة باستخدام دالة الطباعة printf مع استخدام الفورمات المناسبة للحرفيات %s.
    ومن الملاحظ في هذا البرنامج ظهور توجيه جديد هو :
    #include
    إن هذا التوجيه يصبح لازما عند استخدام الدالة strcpy حيث أن الملف " string.h" هو الملف الذي يحتوي على تعريف الدالة " strcpy " وبقية دوال الحرفيات، ويطلق على هذا الملف اسم ملف العناوين للحرفيات " string header file"

    والآن سنتناول طريقة عمل البرنامج بشىء من التفصيل، ولنبدأ بدالة الطباعة printf . فعندما تتعامل مع مصفوفة الرموز " a " فغنها تقرأ و تطبع عناصر المصفوفة واحدا بعد الآخر حتى تصادف الرمز الصفري فتتوقف.

    أما عن طريقة تخزين الرموز في المصفوفة فهناك نقاط جديرة باهتمامنا .

    إننا عندما نعلن عن المصفوفة " a[20]" فإن عناصر المصفوفة تأخذ الأرقام المسلسلة من " 0 " إلى " 19" كالتالي:
    a[0], a[1],…………………..,a[19]
    ولا يشترط عندما نخصص أحد الحرفيات لهذه المصفوفة أن نشغل جميع العناصر ( الخانات ) ففي المثال السبق مثلا عدد رموز الحرفي كانت 11 حرفا و استخدم العنصر الثاني عشر من المصفوفة لتخزين الرمز الصفري.

    طرق مختلفة لإدخال الحرفيات:

    ذكرنا من قبل أنه لا يوصى باستخدام الدالة scanf لإدخال الحرفيات من لوحة المفاتيح .والآن سنستعرض البدائل المختلفة التي تتيحها اللغة لإدخال الحرفيات.

    الدالة gets :
    يعتبر اسم الدالة اختصارا للعبارة " get string " وهي تقوم بقراءة الحرفي المدخل من لوحة المفاتيح ، وتضيف إليه الرمز الصفري ( NULL ) ثم تقوم بتخصيصه للمتغير المطلوب و الذي يستخدم كدليل للدالة. وصيغة الدالة كالآتي:
    gets(a);
    حيث " a " مصفوفة الرموز.


    وعندما يبدأ البرنامج سوف ينتظر منك إدخال الحرفي المطلوب وهو اسم الموظف " employee name " ثم يخصصه لمصفوفة الرموز المكونة من عشرين عنصرا. وفي النهاية يطبع البرنامج الاسم على الشاشة كتأكيد لتمام الاستلام و الحفظ.

    ويمكننا هنا إدخال الاسم محتويا على مسافات خالية وذلك على العكس من الدالة scanf التي تعتبر المسافة الخالية مماثلة للضغط على المفتاح Enter.
    ولكن هناك قيد على الحرفي المدخل إذ يجب مراعاة ألا يزيد طوله عن الحجم المحجوز للمصفوفة مع العلم بأن المترجم يستغل خانة من المصفوفة لتخزين الرمز الصفري. ففي هذا المثال لا يمكن إدخال أكثر من 19 رمز فقط.


    الدالة fgets :
    تستخدم هذه الدالة لقراءة حرفي من ملف أو جهاز للدخل ( input device ). ويتم تعريف الملف ( أو جهاز الإدخال ) ضمن صيغة الدالة نفسها كالتالي:
    fgets( a, n, stdin );
    حيث " a " مصفوفة رموز
    و " n " الحد الأقصى للرموز المدخلة.
    و " stdin" اسم جهاز الدخل القياسي ( لوحة المفاتيح )

    ويمكن بالطبع استبدال جهاز الدخل القياسي stdin باجهزة أخرى حسب الموقف و لكننا في الوقت الحالي سوف نكتفي بلوحة المفاتيح كجهاز للدخل .

    عند استخدام هذه الدالة في إدخال الحرفيات فإنها تضيف إلى مؤخرة الحرفي كلا من :
    1- علامة السطر الجديد ( \n ).
    2- الرمز الصفري ( NULL ).
    ولذلك فإنه مع هذه الدالة لابد وأن نخصص عنصرين في المصفوفة لهذين الرمزين .

    طرق مختلفة لطباعة الحرفيات:
    سنتناول الآن بعضا من دوال الخرج التي تصلح لطباعة الحرفيات بطريقة مبسطة.

    الدالة puts:
    اسم هذه الدالة إختصار للعبارة " put string " وهي الدالة المقابلة لدالة الدخل gets وصيغة هذه الدالة كالآتي:
    puts ( a);
    حيث a ثابت حرفي ، أو مصفوفة رموز.

    والمثال التالي يوضح استخدام هذه الدالة لطباعة رسالة لتنبيه المستخدم قبل استخدام الدالة gets لاستقبال البيان

    وعند تنفيذ البرنامج نلاحظ أن الاسم المدخل قد جاء على سطر مستقل بعد رسالة التنبيه . وذلك لأن الدالة puts عندما تطبع حرفيا على الشاشة تطبع في مؤخرته علامة السطر الجديد " \n"

    الدالة fputs:

    هذه الدالة هي المناظرة للدالة fgets فهي تستخدم لإرسال الخرج إلى ملف أو جهاز الخرج المذكور اسمه ضمن بارامترات الدالة.

    وصيغة الدالة كالآتي:
    fputs( a, stdout );
    حيث a مصفوفة رموز أو ثابت حرفي.
    و " stdout " اسم جهاز الخرج القياسي وهو جهاز الشاشة.

    ومن الطبيعي استبدال جهاز الشاشة كما يتطلب التطبيق.

    والدالة fputs تختلف عن puts في أنها لا تطبع علامة السطر الجديد في نهاية الحرفي.


    :mad: :eek: :(
     
  2.   مشاركة رقم : 2    ‏2002-03-26
  3. العنابي

    العنابي عضو

    التسجيل :
    ‏2007-07-22
    المشاركات:
    145
    الإعجاب :
    0
    thanks alot

    حياك الله اخي ........وادي دوعن
    تشكراتي ...على تلك الدروس الطيبه
    ...اسال الله ان يجعله في ميزان حسناتك
    ((في الاخير اشفيك زعلت عقب نعست عقب حزنت!!!!))
    تحياتي
    العنابــــــــــــــــــي
     
  4.   مشاركة رقم : 3    ‏2002-03-26
  5. أبو مروان

    أبو مروان عضو

    التسجيل :
    ‏2001-05-29
    المشاركات:
    81
    الإعجاب :
    0
    اخي وادي دوعن نشكرك كل الشكر على هذا الدرس
     

مشاركة هذه الصفحة