الأربعاء، 27 فبراير 2013


بسم الله الرحمن الرحيم
مقدمة:البرنامج  Turbo C++ من إنتاج شركة بورلاند انترناشونال وهي نسخة شائعة الاستعمال للبرمجة بلغتي C++/C وهي مصممة للعمل مع الحاسبات الشخصية صنع شركة IBM والحاسبات المتوافقة معها..
تحتوي المجموعة ++Turbo C على مجموعتين مترابطتين من الأدوات – اللغة وبيئة التطوير:
  • اللغة C/C++ : توفر العمليات وأوامر التشغيل التي تستعملها لإنشاء برامجك الخاصة.
  • بيئة التطوير للغة ++Turbo C : وهي مجموعة من قوائم الاختيار والنوافذ والمزايا المفيدة التي تبسط عملية إنشاء برامج بلغة البرمجة C أو بلغة البرمجة C++.
مكونات الدرس:
 
  1. تحميل وتنصيب البرنامج Turbo C++ على الكمبيوتر.
  2. كتابة وتشغيل أول برنامج بلغة السي.
  3. مشاهدة المخرجات.

~~ تحميل وتنصيب البرنامج Turbo C على الكمبيوتر ~~
الطريقة الأولى:تستطيع تحميل برنامج الـ++Turbo C على جهازك من الموسوعة العربية على الوصلة التالية:

http://www.c4arab.com/downloads/TurboC++.exe
بعد أن تقوم بعميلة التحميل قم بفتح الملف عن طريق برنامج WinZip وستظهر لك النافذة التالية:
حدد القرص الصلب الذي تريد فك الضغط إليه وليكن الجزء الافتراضي  C:، ثم اضغط على Unzip.
بعد انتهاء عملية فك ضغط الملفات، ستخرج رسالة تفيدك بنجاح العملية اضغط OK ثم أغلق نافذة الـWinZip.
اتجه إلى المسار:
C:TCBIN
ستجد أيقونة دوس اسمها TC شبيهة بالشكل التالي:

انقر عليها مرتين وسيبدأ محرر التيربو سي بالعمل الآن..
ملاحظة: تأكد من وجود ذاكرة كافية على قرصك الصلب لتركيب البرنامج Turbo C حيث يتطلب هذا البرنامج حوالي 2MB من القرص الصلب.


الطريقة الثانية:
إذا كنت تملك أقراص الـTurbo C++ الثلاثة فقم بتنصيبها على جهازك عن طريق إتباع الخطوات التالية:
أولا: أدخل القرص الصلب #1 INSTALL/HELP في محرك الأقراص المرنة A ثم قم بفتحه ستجد مجموعة من الملفات من ضمنها ملف INSTALL ، قم بالنقر عليه مرتين للبدء في تنصيب البرنامج.
ثانيا: ستظهر لك رسالة حقوق الطبع للبرنامج INSTALL على الشاشة.
وتطلب منك الضغط على Enter للمتابعة أو على ESC للخروج.. اضغط مفتاح الإدخال بالطبع لتتابع تحميل البرنامج.
ثالثا: هذه هي أولى نوافذ تحميل البرنامج Turbo C.. تحثك هذه الشاشة على موقع وحدة التشغيل المصدر SOURCE – أي وحدة التشغيل التي سوف تقوم منها بنسخ أقراص البرنامج Turbo C الأصلية.
وحدة التشغيل المقترحة هي A ، اضغط بكل بساطة على مفتاح الإدخال Enter لقبول هذا الاقتراح.
رابعا: تسألك الشاشة التالية عن طريقة التركيب التي تريدها:

بالطبع سنختار الخيار الأول لكي يتم تنصيب برنامج Turbo C++ على حاسوبك؛ اضغط بكل بساطة على مفتاح الإدخال  Enter.
خامسا: يظهر بعد ذلك مربع على الشاشة يبين لك أسماء الأدلة التي سوف ينشئها البرنامج INSTALL في القرص الصلب من أجل البرنامج.
وكحالة مفترضة يقوم برنامج INSTALL بإنشاء دليل يدعى /TC وينشيء أيضا دليلين فرعيين يدعيان:
TC/INCLUDE
TC/LIB
للملفات المختلفة في النظام. سنقوم بقبول أدلة الأسماء المفترضة.
سادسا: يعرض أيضا في نفس الشاشة السابقة البند التالي:
Memory Modules….
ويتيح لك هذا الخيار عند انتقائه مجموعة أخرى من الخيارات تحدد لك كيفية قيام البرنامج TC++ باستعمال ذاكرة الحاسوب. تستطيع قلب جميع الخيارات إلى No ماعدا الخيار Install Small إذا أردت تركيب البرنامج بأقل حجم ممكن.
سابعا: وأخيرا انتقل باستخدام الأسهم إلى البند الأخير Start Installation ثم اضغط على مفتاح الإدخال Enter للبدء بعملية التركيب.
ثامنا: انطلاقا من هنا سيبدأ برنامج التنصيب INSTALL بتحميل جميع ملفات Disk#1 وفي حال الانتهاء سيطلب منك إدخال Disk #2 والضغط على أي مفتاح لإكمال عملية التنصيب وأخيرا يطلب منك إدخال Disk #3 والنقر على أي مفتاح لإكمال تنصيب البرنامج Turbo C++ وتجهيز جميع الملفات التي يحتاجها البرنامج على جهازك..
عد اكتمال عملية التنصيب اتجه إلى المسار:
C:TCBIN
ستجد أيقونة دوس اسمها TC شبيهة بالشكل التالي:

انقر عليها مرتين وسيبدأ محرر التيربو سي بالعمل الآن..

تهانينا لقد أكملت أولى خطوات الدرس، وإلى الخطوة التالية..

~~ كتابة وتشغيل أول برنامج بلغة السي ~~
قم بكتابة برنامج بلغة السي على محرر Turbo C++ بالشكل التالي:
Tc7
وبعد كتابة البرنامج سنقوم بحفظه من file /save as بالاسم الذي نريده وليكن C4ARAB.C ..
لتشغيل البرنامج على الجهاز نحتاج للقيام بخطوتين:1- عمل Compilation للبرنامج ليتحول إلى صيغة C4ARAB.obj ، من قائمةCompile  اختر Compile واختصاره Alt + F9 وسوف تظهر لك رسالة بالأخطاء الموجودة في البرنامج إذا وجدت أو رسالة بعدم وجود أي أخطاء في حال كان برنامجك خاليا من الأخطاء.

2- عمل Linking للبرنامج ليتحول على صيغة C4ARAB.exe ، من قائمة Compile اختر Link.
وستظهر لك رسالة تفيدك بان البرنامج تحول إلى صيغة exe بشكل سليم وبدون أي أخطاء.

تبقى لنا تشغيل البرنامج بعد أن أصبح على صيغة exe ، اختر أمر التشغيل Run من القائمة Run واختصاره Ctrl+F9  وستظهر لك نافذة سوداء تختفي بسرعة كبيرة، لا تقلق فهذا هو طبع الـTurbo C++ وسننتقل للخطوة الثالثة من الدرس لتتعلم كيف سترى نتائج برنامجك..

~~مشاهدة المخرجات~~هناك طريقتين لمشاهدة المخرجات أو نتائج تشغيل برنامجك..
الطريقة الأولى: من قائمة Window اختر Output وسوف تظهر لك نافذة فيها مخرجات برنامجك الذي قمت بتشغيله مسبقا.. وتستطيع القيام بذلك بسرعة من لوحة المفاتيح بالضغط على مفتاحي Alt+F5.
الطريقة الثانية: تستطيع إضافة السطر getch(); أو السطر getchar(); في نهاية الجزء الرئيسي main() من برامجك وهذا يؤدي لثبات نافذة المخرجات فور النقر على أمر Run ، شاهد الصورة
هذه الطريقة أسرع وأفضل خصوصا إذا كنت ممن يكثر استخدام محرر الـTurbo C++ لكتابة برامج بلغة السي..
~~~~~~~~~~~~
دورة في السي للكاتب MLN4EVER من منتديات الفريق العربي للبرمجة
لـــغة الـــــسي 

الفصل الأول : لغة 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 :

1- البرنامج الأول بلغة ال C

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

يوضح البرنامج التالي برنامجا صغيرا يطبع على الشاشة عند تشغيله العبارة
"Hello C "
CODE

#include <stdio.h>
main()
{
printf ( “Hello 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).


2-الطباعة على الشاشة

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

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

والبرنامج الموضح في الشكل التالي يحتوي على عبارتين تستخدم في كل منهما الدالة printf لطباعة حرفي معين على الشاشة
CODE

#include <stdio.h>
main()
{
printf(“Welcome ”);
printf(“ C Programmer”);
}


وناتج البرنامج موضح بالشكل التالي
CODE
 WelcomeC Programmer


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

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

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

ولنجرب إستخدام هذه العلامة وذلك كما هو موضح في الشكل التالى 
CODE

#include <stdio.h>
main()
{
printf(“Welcome \n”);
printf(“ C Programmer”);
}


وعند تنفيذ هذا البرنامج نحصل على النتيجة التالية 
CODE

Welcome
C Programmer


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

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

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 يجب أن نفرق بين نوعين من الأعداد:

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

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

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

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

ولتوضيح استخدام الفورمات انظر الشكل
CODE

#include <stdio.h>
main()
{
printf(“%d \n”,130);
printf(“%f\n”,130.5);
}


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

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

وعند تنفيذ البرنامج السابق نحصل على النتيجة الموضحة بالشكل 
CODE

130
130.5


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

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

مؤثر الجمع +
مؤثر الطرح -
مؤثر الضرب *
مؤثر القسمة /

والمثال التالي يوضح استخدام المؤثرات الحسابية مع الدالة (printf )
CODE

#include <stdio.h>
main()
{
printf(“%d\n”,128*2);
printf(“%f\n”,128.0/2);
}


وعند تنفيذ البرنامج نحصل على الناتج الموضح بالشكل التالي 
CODE

256
64.000000




4- استخدام المتغيرات

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

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

1-ألا يكون اسم البيان أحد الكلمات المحجوزة باللغة ( Reserved words ) أو الكلمات التي تحمل معنى خاصا مثل( main ) ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر التشغيل المصاحب للمترجم.
2-يمكن أن يحتوي الاسم على أى حرف من الحروف الأبجدية ( A-Z) سواء صغيرة كانت أم كبيرة، وأي رقم من الأرقام (0-9 ) كما يمكن أن تحتوي على علامة الشرطة السفلى ( _ ) ولكن لا يجوز أن يبدأ الاسم برقم.
3-لا قيود على طول الاسم ، وتتيح هذه الميزة استخدام أسماء معبرة عن مضمونها، ومن الأفضل دائما استخدام الاسم المعبر عن محتوى المتغير لتسهيل عملية فحص البرنامج في حالة الخطأ من جهة، ولتسهيل عملية الإضافة والتعديل للبرنامج.
4-الحروف الكبيرة و الصغيرة ليست متكافئة في لغة C فمثلا اسم البيان(MY_NUMBER) يختلف عن الاسم ( 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) وهو من النوع الصحيح (integer) وقد استخدمنا الكلمة int للإعلان عنه.
وأما المتغير الثاني ( cool.gif فهو يختزن الأعداد الحقيقية ( Real) وقد استخدمنا معه الكلمة float للإعلان عنه.

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

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);
}


وعند تنفيذ هذا البرنامج نحصل على النتيجة الموضحة بالشكل 
CODE

1000
796.5



عبارة التخصيص ( Assignment statment ) :

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

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

ويوضح المثال التالي ثلاث عمليات تخصيص كالآتي:
1- تخصيص قيمة عددية للمتغير " a"
2- قسمة محتويات المتغير " a" على 2 وتخصيص الناتج للمتغير " b"
3- جمع محتويات كل من " a" ، " b" وتخصيصها للمتغير " c".
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

الوصف | التأثير على شكل الناتج | النتيجة

%.0f | حذف جميع الأصفار الزائدة | 25
%.3f | إظهار ثلاث أصفار فقط بجوار العلامة | 25.000


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

والمثال التالي يوضح برنامجا لطباعة العدد 75 بصور مختلفة
CODE

#include <stdio.h>
main()
{
float x;
x=75;
printf(“%.0f\n”,x);
printf(“%.1f\n”,x);
printf(“%.2f\n”,x);
}


وعند تنفيذه نحصل على الناتج الموضح بالشكل
CODE

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);

}


وناتج هذا المثال هو الموضح بالشكل 
CODE

1
0.8
0.75



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

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

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

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

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

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

#include <stdio.h>
main()
{
char first_letter;
first_letter = ‘A’;
printf(“%c\n”,first_letter);
}


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

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

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

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

#include <stdio.h>
main()
{
char first_letter;
first_letter = ‘A’;
printf(“%c\n”,first_letter);
printf(“%d\n”,first_letter);

}



6- تخزين الحرفيات والمؤشرات(String & Pointer ) في لغة C:

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

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

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

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

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

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

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

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

#include <stdio.h>
main()
{
char *a;
a = “Welcome C programmer”;
printf(“%s\n”,a);
}


وناتج البرنامج هو الموضح بالشكل التالي 
CODE

Welcome C programmer


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

من المهم لمن كان جديدا على لغة 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);
}



user posted image

الفصل الثالث : الإدخال و الإخراج ( I/O )

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

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

والمثال التالي يوضح كيفية استخدام الدالة 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" من لوحة الأزرار بموجب العبارة :
CODE

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 استخدام عبارة واحدة ودالة واحدة لاستقبال قيم عدة متغيرات كما في المثال التالي
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 ( a,cool.gif ) حيث " a " هو اسم مصفوفة الرموز، و "b" هو الحرفي المراد تخزينه في المصفوفة.

والمثال التالي يوضح الإعلان عن مصفوفة رموز بالاسم " a" تتسع لعشرين رمزا ثم ننسخ إلى عناصرها الحرفي " Hello again " وفي النهاية نطبع محتويات المصفوفة باستخدام دالة الطباعة printf مع استخدام الفورمات المناسبة للحرفيات s%.
CODE

#include <stdio.h>
#include <string.h>
main()
{
char a[20];
strcpy(a,”Hello again”);
printf(“ %s\n”,a);
}


ومن الملاحظ في هذا البرنامج ظهور توجيه جديد هو :
CODE
#include <string.h>

إن هذا التوجيه يصبح لازما عند استخدام الدالة strcpy حيث أن الملف " string.h" هو الملف الذي يحتوي على تعريف الدالة " strcpy " وبقية دوال الحرفيات، ويطلق على هذا الملف اسم ملف العناوين للحرفيات " string header file"

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

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

إننا عندما نعلن عن المصفوفة " [a[20" فإن عناصر المصفوفة تأخذ الأرقام المسلسلة من " 0 " إلى " 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 باجهزة أخرى حسب الموقف و لكننا في الوقت الحالي سوف نكتفي بلوحة المفاتيح كجهاز للدخل .

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

ولذلك فإنه مع هذه الدالة لابد وأن نخصص عنصرين في المصفوفة لهذين الرمزين .
والمثال التالي يوضح استخدام هذه الدالة
CODE

#include <stdio.h>
main()
{
char employee_name[20+2];
fgets(employee_name,22,stdin);
printf(“ Employee: %s\n”,employee_name);
}


طرق مختلفة لطباعة الحرفيات:

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

الدالة puts:
اسم هذه الدالة إختصار للعبارة " put string " وهي الدالة المقابلة لدالة الدخل gets وصيغة هذه الدالة كالآتي:
CODE
puts ( a);

حيث a ثابت حرفي ، أو مصفوفة رموز.

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

#include <stdio.h>
main()
{
char employee_name[20+1];
puts(“Enter employee_name:  ”);
gets(employee_name);
puts(employee_name);
}


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

الدالة fputs:

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

وصيغة الدالة كالآتي:
CODE
fputs( a, stdout );

حيث a مصفوفة رموز أو ثابت حرفي.
و " stdout " اسم جهاز الخرج القياسي وهو جهاز الشاشة.

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

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

إن لغة C – كأي لغة أخرى – تتعامل مع التعبيرات، وتتكون التعبيرات من الثوابت و المتغيرات المرتبطة ببعضها البعض بواسطة المؤثرات.

والمؤثرات تنقسم إلى عدة أنواع هي:
1- المؤثرات الحسابية ( Arithmetic Operators )
2- المؤثرات العلاقية ( Relational Operators )
3- المؤثرات المنطقية ( Logical Operators )

المؤثرات الحسابية ( Arithmetic Operators ) :
تتيح لغة C استخدام العديد من المؤثرات الحسابية، منها المؤثرات الأساسية والتي تقوم بالعمليات الحسابية الأساسية وهي الموضحة أدناه

+ ( الجمع )
- ( الطرح )
* ( الضرب )
/ ( القسمة )
وبالإضافة لهذه المؤثرات توجد مؤثرات خاصة بلغة C وهي الموضحة أدناه

% ( باقي القسمة )
-- ( النقصان )
++( الزيادة )

وسنتناول بشيء من التفصيل استخدام هذه المؤثرات الخاصة.

مؤثر باقي القسمة
الصورة العامة لاستخدام هذا المؤثر هي : x % y
ويكون الناتج هو باقي قسمة " x " على " y " ، والشكل التالي يوضح استخدام المؤثر والناتج
CODE
7%3

ويكون الناتج لهذه العملية هو "1 " وهو باقي القسمة للعددين 3/7

مؤثرات الزيادة والنقصان (Decrement & Increment) :
من مزايا لغة ال C انها تستعمل الأداتين الحسابيتين ++ و – لزيادة القيم بمقدار 1أو انقاصها بمقدار 1 والمثال التالي يوضح طريقة الاستعمال :
CODE

X++;
++X;

ومعناه اضافة قيمة 1 الى X ويمكن كتابته بصورة مكافئة على النحو التالي :
CODE
X=X+1;

وبالطريقة نفسها يمكن انقاص 1 من قيمة X على النحو التالي :
CODE

--X;
X--;

وهو يكافيء الصورة : 
CODE
 X=X-1;

لكن هناك فرقا في سرعة التنفيذ , فالتعبير ++X اسرع من التعبير X=X+1
وهذه هي الفائدة من جراء استخدام مثل هذه الأدوات

المؤثرات العلاقية ( Relational Operators ) :
يرجع اسم المؤثرات العلاقية الى العمليات المختصة بالقيم التي بينها علاقات وهو اجراء عمليات مقارنة بين كميات حسابية او رمزية , وتكون نتيجة منطقية وهي اما نعم (true) أو لا (false)
وفي لغة السي تعامل النتيجة (false) على انها صفر " 0 " وتأخذ النتيجة (true) أية قيمة غير الصفر والمشهور أنها " 1 " .
ويبين الشكل التالي المؤثرات العلاقية :
نفرض ان : int a=b=3

user posted image


المؤثرات المنطقية ( Logical Operators ) :

user posted image


الفصل الخامس : اتخاذ القرار

تعرضنا حتى الآن لبرامج متتالية الأوامر، حيث ينفذ الكمبيوتر العبارات الموجودة في البرنامج بالترتيب الذي وردت به .

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

وسنتعرض هنا لطرق اتخاذ القرار في لغة الC وكيفية تغيير تسلسل التنفيذ تبعا للشروط الموضوعة.

العبارة الشرطية البسيطة ( if statement):

تكوين العبارة الشرطية البسيطة كما هو موضح بالشكل 
CODE

if ( condition )
statement;


حيث ( condition ) هو الشرط و ( statement ) هو القرار المراد اتخاذه عند تحقق الشرط المعطى.
وعندما ترغب في تنفيذ أكثر من عبارة بتحقق الشرط نستبدل العبارة التي تمثل القرار المراد اتخاذه ببلوك به العبارات المراد تنفيذها.
ولتوضيح استخدام العبارة الشرطية البسيطة أنظر البرنامج التالي
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 سنتناول منها هنا
1- الحلقة for ( for loop ).
2- الحلقة while ( while loop ).
3- الحلقة do…. while ( do-while loop).
وفيما يلي سنتناول كل حلقة بالدراسة من حيث الشكل العام و أسلوب الاستخدام وأمثلة توضيحية.

الحلقة for ( for loop):
تستخدم الحلقة for لتكرار أمر معين ( أو مجموعة من الأوامر) عددا من المرات وتحتاج الحلقة إلي ثلاث عناصر أساسية ( انظر الشكل التالي)
CODE
for ( counter statement; condition; step)


و هذه العناصر هي:
1- العداد ( counter ) : وظيفة العداد هي تسجيل عدد مرات التكرار.
2- الشرط ( condition): والشرط الذي يحدد نهاية التكرار إذ يظل التكرار قائما حتى ينتفي الشرط.
3- الخطوة(step) : وهي القيمة التي تحدد عدد مرات التكرار.

والشكل التالي يوضح برنامجا قمنا فيه باستخدام الحلقة for : 
CODE

#include <stdio.h>
main()
{
int counter;
for ( counter=1;counter<=20;counter++)
 printf(“%d”,counter);
}

ومن البرنامج السابق نجد أن الحلقة for بدأت بكلمة ( for ) متبوعة بقوسين بينهما ثلاثة عبارات تفصل بينها علامة الفاصلة المنقوطة.
العبارة الأولى تخزن القيمة الابتدائية في العداد.
والعبارة الثانية هي الشرط وهنا الشرط أن قيمة العداد أقل من أو تساوي 20.
أما العبارة الثالثة فهي تحدد الخطوة، وفي هذا البرنامج يزاد العداد بمقدار 1 كل مرة تنفذ فيها الحلقة.
والبرنامج السابق ينتج عنه طباعة الأرقام من 1 إلى 20.

ملاحظات:
1- العبارات الثلاثة المكونة لحلقة for يجب أن تفصل عن بعضها بالفاصلة المنقوطة، وهذا الخطأ من الأخطاء الشهيرة جدا في عالم البرمجة لذا وجب توخي الحذر.
2- في حالة تكرار أكثر من أمر يتم استبدال العبارة التي تلي بداية الحلقة for (في المثال السابق هي العبارة ( printf ( " %d",counter); ) ببلوك يحتوي العبارات المراد تنفيذها.


الحلقة while ( while loop):
في هذه الحلقة التكرارية نحتاج إلى الشرط فقط وطالما كان هذا الشرط متحققا استمرت الحلقة في التكرار..
والصورة العامة للحلقة while موضحة بالشكل التالي
CODE

while ( conditon )
{
statement 1;
statement 2;
 .
 .
statement n;
}


حيث ( condition ) هو الشرط اللازم لأداء التكرار، والعبارات بداخل أقواس البلوكات هي العبارات المراد تكرارها.
والمثال الموضح بالشكل التالي يوضح استخدام الحلقة while لطباعة الأعداد من 1 إلى 20
CODE

#include <stdio.h>
main()
{
int counter=1;
while ( counter <=20 )
{
 printf(“%d”,counter);
counter++;
}
}


من المثال السابق يمكننا استخلاص النتاتج التالية عن الحلقة while:
1- تخصيص القيمة الابتدائية للعداد تتم خارج الحلقة while.
2- زيادة العداد تتم داخل الحلقة while

الحلقة التكرارية do-while:
تختلف هذه الحلقة عن الحلقتين السابقتين في مكان كتابة الشرط ، حيث يكتب الشرط هنا بعد العبارات المطلوب تكرارها.
والشكل التالي يوضح الصورة العامة للحلقة do-while
CODE

do
{
statement 1;
statement 2;
 .
 .
statement n;
}
while ( conditon 


وأهم ملاحظة على الحلقة التكرارية do-while أنها تنفذ العبارات المطلوب تكرارها مرة واحدة على الأقل حتى ولو كان الشرط غير متحقق !!!
وتفسير ذلك أن التحقق من الشرط يتم بعد التنفيذ وليس قبله كما في الحلقتين السابقتين.





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

مقدمة

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


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

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

مراحل البرنامج
في نهاية هذا الدرس سوف تستطيع الإجابة عن السؤال التالي:
ما هي المراحل التي يمر فيها البرنامج؟
------------------------------------------------------------
هل أنت مستعد لتلقي الدرس الأول من دروس السي ؟؟
إذا لم يكن لديك متسع من الوقت فلا تقرأ الدرس……وارجع إليه في وقت آخر !!!
فدروس السي تحتاج إلى تركيز ووقت كافي ………لأن السي هي عبارة عن لغة من لغات البرمجة القوية………وهي من اللغات المشهورة في العالم التي تجرى عليها تطبيقات كثيرة في حياتنا العملية فهنالك برامج كثيرة كتبت بلغة السي وهذا يرجع لقوتها، فيا ترى هل جهزت نفسك لكي ترحل معنا في رحلة إلى فضاء الكمبيوتر في زيارة للغة السي!!!
لن أطيل الكلام لأني متأكد بأنك متلهف لقراءة الدروس والسفر في أغوار هذه اللغة ، لذلك قبل أن ابدأ الدروس لدي نصيحة واحدة لك وهي:

 
التجربة وتطبيق الأمثلة وعدم الاكتفاء بالقراءة


اخبرني كيف تجهز الشاي؟
بالطبع سوف تستغرب من سؤالي …ولكن دع الاستغراب جانبا وجاوبني عن سؤالي، لا تقل بأنك لا تعرف الإجابة ، طبعا الإجابة واحدة وهي تسخين الماء واضافة الشاي له ثم أخيرا تضيف السكر في كوبك حسب رغبتك……وفي النهاية صحتين وعافية، إذن لقد مررت بأكثر من مرحلة لكي تصل أخيرا إلى إعداد كوب الشاي اللذيذ !!!
وهكذا هو السي……فإنك حينما تكتب برنامجا في السي فإنك تمر بعدة مراحل لكي ترى نتيجة البرنامج ،وهذه المراحل ثابتة وهي تمثل كالتالي:
1- مرحلة التحريرediting
في هذه المرحلة تقوم أنت بكتابة البرنامج وتحريره
2- مرحلة التجميع 
وهي تضم مرحلتين أساسيتن هما:
· ترجمة compiling
· ربط البرنامج linking
3- مرحلة التنفيذ executing
وتلك كانت المراحل الأساسية التي يمر بها البرنامج لكي يظهر النتيجة ولكن هنالك مرحلة رابعة تتم فقط في حالة وجود أخطاء في البرنامج وهي
4- مرحلة اكتشاف الأخطاء debugging
وطبعا لا يوجد داعي لشرح هذه المرحلة ، فأنت بالطبع سوف تكتشفها عند كتابة برنامج ، ليس معنى كلامي هو التأكيد على وجود الأخطاء في كتابة البرامج ولكن هذا شيء طبيعي ما دمت تتعلم لغة السي ………فأنت ستواجهك أخطاء كثيرة عند كتابة البرامج فأنت في طور تعلم لغة السي وما أدراك ما السي؟؟؟؟ ولكن لا تقلق فمع تطبيق البرامج واكتشاف الأخطاء وتصحيحها سوف تتعود مع مرور الوقت على اكتشاف أخطائك بنفسك لكي تتجنبها مستقبلا.

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

المترجم

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

 



مرحبا بك في هذا الدرس الذي أتوقع بأن تستمع به كثيرا لانه درس تطبيقي.
والآن لكي تكتب برنامجا بلغة السي فإنك تحتاج الى برنامج مترجم .
ماذا نعني ببرنامج المترجم؟
هو برنامج يقوم بتحويل البرنامج الذي كتبه إلى برنامج تطبيقي يقوم بإظهار النتائج أو اكتشاف الأخطاء.
وطبعا هنالك عدة برامج ترجمة لذلك السؤال يطرح نفسه
ما هي برامج المترجم وما هو أفضلها؟
من بين برامج المترجم نجد المشهور منها
Borland c++ 3.1
وتوجد منه نسختين هما 3.1 و 5.02
Visual c++ 

بالنسبة لي فأنا أفضل البرنامج الأول ربما لأنني تعاملت معه كثيرا خلال أيام الدراسة
ولكل شخص اختياره فأنت تستطيع التعامل مع الاثنين ولن تجد فرقا كبيرا بينهما ، لذلك سوف تجدني من خلال الدروس أتعامل مع المترجم الأول .
والآن المفروض أن يكون لديك برنامج مترجم تجده في الأسواق اختر أنت الذي تريده ولكني مثلما قلت لك سوف أتعامل مع Borland c++ 3.1
الأن اذهب إلى هذا البرنامج وستجده يحتوي على نوعين من البرامج واحد يعمل تحت ويندوز والاخر يعمل تحت الدوس وطبعا جميعنا يفضل البرامج التي تعمل تحت ويندوز لذلك اختر منه البرنامج التالي
Bcw.exe

كيف يعمل البرنامج؟
قم أولا بتشغيل البرنامج وهنالك ملاحظة مهمة جدا وهي أن هذا البرنامج سوف يفتح آخر برنامج كتبته لذلك لكي تتخلص من هذا البرنامج اختر window من القائمة ثم اختر منها close all .
والآن قم بفتح ملف جديد عن طريق اختيار New من القائمة File.
سوف اقوم بكتابة برنامج بسيط جدا ، وسوف تجد شرحه في الدروس القادمة ، ولكني كل ما أطلبه منك هو نقل البرنامج كما هو وكتابته في برنامج المترجم لكي تتعرف فقط على بيئة المترجم ، بالطبع أعلم بأنك ربما لم تستوعب البرنامج كله ، وهذا شيء يضايقك ، ولكن تمهل فهذه الطريقة سوف تساعدك كثيرا في فهم البرنامج.
والبرنامج هو:

 



#include
void main (void)
{
printf("hi……this is the first program for me ");
}
 

والآن اكتبه كما كتبته لك
ثم قم بتخزينه بإسم معين ، بالنسبة لي فأنا خزنته بإسم lesson1.cpp وطبعا cpp هي امتداد نقوم بكتابته بجانب اسم الملف لكي يتعرف عليه البرنامج على انه برنامج كتب بلغة السي.
والآن اذهب إلى compile من القائمة ثم اختر منها make وسوف تلاحظ أن البرنامج قام بفتح نافذة جديدة وهي تقوم بإظهار نتيجة عملية التجميع ثم اضغط على ok والآن انتهت مهمة التجميع على خير بدون أخطاء واخيرا نريد نحن تشغيل البرنامج وطبعا الكل متلهف على معرفة نتيجة البرنامج لذلك اخترrun من القائمة run واكتشف بنفسك النتيجة.
اعتقد بأنك الآن أخذت فكرة عن برنامج المترجم وأين نكتب البرنامج بالضبط ، يا ترى هل تريد أخذ قسطا من الراحة أم تريد تكملة المشوار والذهاب لمعرفة ماذا تخبئ لنا الدروس من مفاجأت ومعلومات في لغة السي!!!



الأساسيات

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

أساسيات لغة السي:
1- تحتل الدالة الأساسية main() أهمية كبيرة لأنها ترشد المبرمج إلى بداية البرنامج ، ومن الضروري وجودها في كل برنامج.

2- يتبع كلمة main هلالين ( ) وتدل على بداية دالة . وبعد هذا يأتي الرمز { ليدل على بداية الدالة والرمز } ليدل على نهايتها.

3- لإضافة تعليقات في البرنامج فيجب أن يحدد التعليق بين الرموز/ * */ كما في المثال / * Hello in c4arab*/ وباستعمال هذان الرمز فإنك تخبر الآلة بتجاهل هذه الجملة وعدم تنفيذها ، وهي ضرورية كثيرا حينما تتبادل البرنامج مع غيرك ليتسنى لهم فهم برنامجك من خلال التعليقات التي تكون قد أضفتها من خلال برنامجك ، وكذلك فإن هذه التعليقات سوف تفيدك كثيرا حينما ترجع بعد فترة طويلة من الوقت إلى برنامجك و بهذا سوف تستفيد منه في معرفة نوع برنامجك ، وأيضا هنالك نقطة مهمة فإنك بمقدورك كتابة التعليقات باللغة العربية ما دام المترجم compiler سوف يتجاهلها.
سوف اتكلم لاحقا عن التعليقات بشكل موسع وذلك لأهميتها.

4- يجب استعمال semicolons الفاصلة المنقوطة عند نهاية كل جملة وهي تدل على انتهاء الجملة كما في المثال الآتي:

 


printf("Hello in c4arab");
 


5- نستطيع كتابة لغة السي بأي نسق نريده ، وذلك لأنها حرة الشكل ، كما في المثال التالي:

 



main()
{
printf("Hello everyone");
}
 

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

 



main(){printf("Hello everyone");}
 


6-لغة السي تفرق بين الحروف الصغيرة والحروف الكبيرة ، وهكذا فهي تفرق بين scanf و Scanf .

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


الهيكل العام للبرنامج
بعد نهاية هذا الدرس سوف تستطيع الإجابة عن الأسئلة التالية:
1- ماذا نعني ب #include؟
2- لماذا استخدمنا الملف stdio.h؟
3- ماذا نعني بالإجراء وكيف نستخدمه ؟
4- ما هو الهيكل العام لكتابة أي برنامج بلغة السي؟

--------------------
حياكم الله مرة ثانية ، التقينا مجددا مع دروس السي ، في هذا الدرس سوف أقوم بشرح البرنامج الذي اتعبتك في كتابته من دون فهمه (ماذا تقول؟؟ هل نسيت البرنامج السابق؟؟) سوف اقوم بتذكيرك به مرة أخرى.

 


#include

void main(void)
{
puts("hi….this is the first program for me");
}
 

والآن دعنا نفهم معا كل كلمة في البرنامج بالتفصيل.
طبعا كما تلاحظ فإنه في بداية البرنامج كتبنا العبارة التالية
 


#include
 

فيا ترى ماذا تعني وهي هي مهمة؟
تسمى تلك توجيهات المترجم ، والتوجيه #include سوف يقوم بمهمة معينة وهي إخبار المترجم بأن يضم الملف stdio.h إلى البرنامج الذي تقوم بكتابته .
بالطبع تتسائل الآن بينك وبين نفسك لماذا أضفنا ؟؟

لقد أضفناها وذلك لأننا احتجنا إلى كتابة الأمر puts وهذا الأمر لن يتعرف عليه برنامج المترجم إلا إذا كتبنا الملف 
.
وطبعا الملف stdio.h يحتوي على أوامر ومعلومات وإعلانات كثيرة تهمنا كثيرا في كتابة البرنامج لذلك من وجهة نظري اعتبر هذا الملف هو جوهر الملفات في برنامج المترجم.
لا تنشغل كثيرا بفهم النقطة السابقة فشيئا شيئا سوف تستوعبه كثيرا مع كتابة البرامج في الدروس القادمة.
والآن انتقلنا للسطر التالي في البرنامج وهو
 


void main(void)
 

يا ترى ماذا نعني بتلك العبارة السابقة؟

لتبسيط الأمر سوف أقوم بتقسيم العبارة السابقة إلى ثلاثة أقسام كالتالي:
(المتغيرات) اسم الدالةfunction_name القيمة التي ترجع بعد الإجراء

إذن في البرنامج السابق كتبنا void مكان القيمة التي ترجع بعد الإجراء ونعني بكلمة void بأن البرنامج لن يرجع بأي قيمة ، يا ترى هل استوعبت كلامي؟؟؟ مرة أخرى أقول بأنك سوف تستوعبه شيئا فشيئا عند كتابة المزيد من البرامج.
ثم كتبنا مكان اسم الدالة main وهذه الدالة رئيسية ومهمة في معظم البرامج التي تكتب بلغة السي ، وطبعا نستطيع إضافة أكثر من دالة لكي تقوم الدالة بوظيفة معينة وسوف نذكر المزيد من الدالات خلال الدروس القادمة.
وبعد أن أنهينا كتابة الإجراء
قمنا بوضع القوس
{
وطبعا كتبنا في داخله العبارة التي نريد تنفيذها ولقد كانت بهذه الطريقة

 


puts("hi…..this is the first program for me")
 

الأمرputs يقوم بطباعة العبارة التي تليه لكي تظهر كما هي مكتوبة أي تقوم بوظيفة الكتابة على الشاشة وطبعا هنالك أكثر من إجراء تستطيع استخدامه لغرض الكتابة على الشاشة.
طبعا تذكر أن العبارة التي تريد طباعتها يجب أن تكون بين قوسين
( ---------------)
ويجب أن تكون الجملة محاطة بعلامات الترقيم
("-------------")
وأيضا بعد الانتهاء منها يجب وضع الفاصلة المنقوطة في النهاية بعد غلق القوس
("------------");
وأخيرا بعد الانتهاء من هذا الإجراء يجب غلقه بالقوس
}
وهذا يدل على نهاية البرنامج
الخلاصة:
الشكل العام لكتابة أي برنامج هو:

 


#include< إسم الملف>
القيمة التي ترجع للإجراء إسم الدالة (المتغيرات)
{
-----------;
-----------;
الأوامر المطلوب تنفيذها
-----------;
-----------;
}
 


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

التكرار for
هلا ومرحبا.......كيف أصبحت أو كيف أمسيت اليوم؟؟
يا ترى إلى أي مدى وصل تجاوبك مع هذه الدروس ......لا تنسى إذا كان لديك أي تعليق فنحن بانتظاره لكي نجدد في كتابة الدروس لمعرفة الأفضل لك ولغيرك.
الدرس الذي سوف نتعلمه معا اليوم هو درس رائع وهو التكرار.
إذن بعد نهاية هذا الدرس سوف تتمكن من الإجابة عن الاسئلة التالية:
1- ما معنى التكرار؟
2-ما هي أنواع التكرار؟
3-ما هو الأساس الذي تقوم عليه كل نوع من التكرار؟

---------------------------------------------
التكرار (Loop)

قد يصادفك حينما تكتب برنامج في السي احتياجك إلى إعادة جزء أو عدة أجزاء من البرنامج مرات عديدة ،لذلك وجد التكرار وهو يقوم بإعادة أجزاء من البرنامج عدة مرات أو حتى يتحقق شرط معين تكون قد وضعته للبرنامج..
فيا ترى من الذي سيقوم بهذا التكرار؟؟؟
هنالك ثلاثة أنواع من التكرار تسمح لك بالتكرار هي:
1- تكرار for.
2- تكرار while.
3- تكرار do …while.


وسوف نقوم نحن بتعليمك الأنواع الثلاثة وعليك أنت باختيار التكرار المناسب لبرنامجك.
تكرارfor

وهو يسمح بتكرار جزء معين من البرنامج عدة مرات، والقاعدة الأساسية لهذا التكرار هي:

 


for(عبارة تمهيدية;عبارة الشرط;عبارة الزيادة )
{
الأوامر;
}
 

ثم دعنا نأخذ المثال الآتي وذلك حتى تكون عملية الفهم أسرع.

 



for(x=0;x<100;x++)
{
printf("This is my best site to learn Cn");
printf("Tell all your friends about this siten");
}
 


دعنا نتعرف معا بالتفصيل على هذه القاعدة :
1- في السطر الأول نكتب كلمة for ثم نفتح قوس ونكتب في أول خانة عبارة التمهيد وهي تنفذ مرة واحدة عند بداية التكرار كما في المثال السابق x=0

2- في الخانة الأخرى نكتب الشرط الذي سوف يمثل استمرار التكرار كما في المثال السابق x<100 بحيث يختبر هذا الشرط في كل مرة يقوم بالتكرار ، فإذا كان الشرط صحيحا فإن التكرار سيستمر أما إذا كان خاطئا فسيتوقف التكرار .

3- أما في الخانة الأخيرة نكتب عبارة الزيادة وهي تنفذ بعد كل تكرار كما في المثال السابقx++ وبذلك سوف تقوم بزيادة قيمة المتغير وسوف يقوم بزيادة قيمة المتغير بمقدار واحد.

ثم يأتي القوس { ومن بعده نكتب الأوامر التي نريد تنفيذها كما في المثال السابق، وهي سوف تتكرر مائة مرة ، طبعا نستطيع وضع اكثر من عبارة ، وأخيرا كل ما علينا هو أن نغلقها بالقوس }

ملاحظة: إذا كنا نريد تكرار الأمر مرة واحدة فقط ، فنحن بإمكاننا التخلي عن الأقواس { و } ، أما في حالة كتابة اكثر من أمر فيجب وضع الأقواس.
وهكذا نكون قد انتهينا من التكرار for بكل بساطة .

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


التكرار while
التكرار while
وهذا التكرار يقوم بتكرار غير محدد من المرات حتى يتحقق شرط معين ، والقاعدة الأساسية لهذا التكرار هي :

 


while(الشرط)
{
………….;
…………الأوامر;
}
 


دعنا نأخذ المثال التالي:

 


while(num<99)
{
printf("This is a correct numbern");
num++;
}
 



دعنا نتكلم بالتفصيل عن هذا التكرار:

1- عند كتابة الشرط فإن البرنامج سوف يقوم بتكرار الأوامر ما دام الشرط صحيحا ، أما إذا كان الشرط خاطئا فإن التكرار سوف يتوقف ، ففي المثال السابق نستطيع القول بأنه ما دام الرقم اقل من 99 فإن العبارة سوف تطبع .

2- بعد طباعة الجملة سوف ينتقل إلى العبارة الأخرى وهي num++ وبذلك سوف يزيد الرقم .

3- وهكذا سوف تتم تكرار العبارة إلى إن تصل إلى الرقم 99 ومن بعدها سوف يتوقف التكرار.

وهكذا كان هذا هو تكرار while نأمل أن تكون قد استوعبته.

التكرار do...while
تكرار do...while

وهذا التكرار يعتبر شديد الشبه بابن عمه while ولكن كل الاختلاف في مكان كتابة الشرط ، وهنالك ميزة لهذا التكرار ، فيا ترى ما هي هذه الميزة؟
هل اخبرك بها ..أم اتركك تكتشفها بنفسك؟؟؟؟
هل أثرت فضولك؟؟؟؟؟؟؟؟
حسنا سوف اخبرك بها عند نهاية شرح هذا التكرار….......
القاعدة الأساسية لهذا التكرارهي:

 


do{
…………..;
………….;
الأوامر;
}while(الشرط)
 

دعنا نأخذ المثال التالي:

 



do{
printf("This is the three kind of loopn");
count++;
}while(count!=77)
 


والآن سوف نقوم بشرح هذا المثال:
1- حينما يبدأ هذا التكرار ، فهو سوف يمر بكلمة do ثم سيدخل جسم التكرار ، وسيقوم بطباعة العبارة الموجودة .

2- بعد هذا سوف يمر بالعبارةcount ++ وهي سوف تخبره بزيادة العداد مرة واحدة.

3- و أخيرا سوف يخرج من التكرار وسيمر بالشرطcount!=77وسوف يقوم باختبار الشرط فإذا كان يساوي 77 فإنه سوف يوقف التكرار ، أما إذا كان لا يساوي 77 فإنه سوف يعيد التكرار ويعيد طباعة الجملة ، وهكذا سوف يستمر بطباعة الجملة إلى أن يكون الشرط خاطئا ومن بعدها سوف يخرج من التكرار.

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


التعليقات
بعد نهاية هذا الدرس سوف تستطيع الإجابة عن الاسئلة التالية:
1- ما هي التعليقات؟
2- ما هي اللغة المستخدمة في كتابة التعليقات؟
3- ما هي الفائدة من كتابة التعليقات؟
4- ما هي الكمية المحدد لي لإضافة التعليقات؟
5- كيف أضيف التعليقات؟
6- أين أضع التعليقات؟

--------------------------
مرحبا بك ، اخبرني كيف أصبحت مع السي ؟؟(هل ندمت على قراءة الدروس السابقة؟؟) إذا احسست بأنك غير قادر على تكملة المشوار لتعلم لغة السي فاتمنى أن تراسلني لكي تخبرني في أي نقطة وجدت صعوبة لكي أتدارك الأمر واكتبها بأسلوب ميسر ومفهوم وشيق ، والآن ماذا تتوقع أن تتعلم من هذا الدرس ؟بالطبع تضحك لأن عنوان الدرس يدل عليه (التعليقات) لذلك لا حاجة للسؤال!! كل ما افعله هو تنشيط لذاكرتك فقط، والآن هيا بنا نبحر معا في هذا الدرس الذي ربما يراه البعض غير مهم ولكنه مهم جدا وأكثر مما تتصور.
ما هي التعليقات؟commnets

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

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

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

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

هل تصدق إذا قلت لك بأن البرامج الناجحة هي البرامج التي تحتوي على تعليقات ؟؟
سوف تكتشف هذا إذا إرسل لك يوما برنامجا بدون أي تعليق ، فانظر كيف سيضيع وقتك وأنت تحاول أن تفهم الغرض من البرنامج.

أود إضافة تعليقات ولكني لا أعلم كيف أضيفها وكم أضيف من التعليقات؟

سؤال مهم…………وإجابته تعتمد على نوع البرنامج الذي تكتبه ……ففي كل البرامج ضع تعليق في بدايته يصف إسم البرنامج ومصمم البرنامج وجملة صغيرة عن البرنامج تشرح فيها ما هو هدفك من البرنامج مثلا إظهار نتائج الناجحين .
وعند كتابة البرنامج ضع تعليق بجانب كل دالة لتشرح ما هو عملها بالضبط.
كيف أضيف التعليقات ؟

تستطيع إتباع القاعدة التالية
 

/*هنا أكتب أي تعليق أريد إضافته للبرنامج*/
 

كما في الأمثلة التالية:

 



/*this program talk about the sum between two numbers*/
 

وأيضا تستطيع إضافة نص بأكمله يتكون من أكثر من سطر

 



/*Hello programmer……………..join with me to write a program about the factorial for any number enter from the user……..it is an easy program …………let's do it together*/
 

وأيضا أريد إخبارك بشيء…………فأنت تستطيع إضافة تعليق بهذه الطريقة التي تكتب بلغة السي بلس بلس

 



//hi………it's me
 

وتلك الطريقة أي اضافة // ومن ثم كتابة التعليق تنفع لإضافة سطر واحد فقط .
أين أَضع التعليقات؟
أنظر إلى هذا البرنامج البسيط ومن ثم تمعن في أي الأماكن وضعت التعليقات

 



/*this program will ask the user to enter two number and then print it*/

#inlcude

int main(int)
{
/*ask the user to enter two numbers*/

printf("Enter two numbers ,please");
scanf("%d%d",x,y);
/*the program will print the both of the numbers*/
printf("your's numbers are:%d %dn",x,y);
/*end of the program*/
return(0);
}
 


إذن تستطيع إضافة التعليقات في أي مكان ترغب به في البرنامج ولكن هنالك نقطة مهمة يجب أن تنتبه لها………فأنت لا تستطيع إضافة تعليق في وسط الأوامر مثلا

 



prin/*hi……..programmer*/tf
 


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

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


محتويات أشهر مكتبات السي Header files

بسم الله الرحمن الرحيم
محتويات أشهر مكتبات السي Header files
محتوى الدرس:
  1. محتويات مكتبة alloc.h.
  2. محتويات مكتبة bios.h.
  3. محتويات مكتبة conio.h.
  4. محتويات مكتبة ctype.h.
  5. محتويات مكتبة dir.h.
  6. محتويات مكتبة dos.h.
  7. محتويات مكتبة graphics.h.
  8. محتويات مكتبة io.h.
  9. محتويات مكتبة math.h.
  10. محتويات مكتبة process.h.
  11. محتويات مكتبة signal.h.
  12. محتويات مكتبة stdarg.h.
  13. محتويات مكتبة stdio.h.
  14. محتويات مكتبة stdlib.h.
  15. محتويات مكتبة string.h.
  16. محتويات مكتبة time.h.
  17. محتويات مكتبة iostream.h.
  18. محتويات مكتبة iomanip.h.
  19. محتويات مكتبة fstream.h.
(1)
alloc.h

malloce( )
realloc( )
sbrk( )
farmalloc( )
farrealloc( )
free( )
farcalloc( )
farcoreleft( )
farfree( )
brk( )
calloc( )
coreleft( )
(2)
bios.h

bioskey( )
biosprint( )
biostime( )
bioscom( )
biosdisk( )
biosequip( )
(3)
conio.h


textattr( )
textcolor( )
textbackground( )
textmode( )
ungetch( )
wherex( )
wherey( )
window( )
insline( )
kbhit( )
lowvideo( )
movetext( )
mormvideo( )
putch( )
puttext( )
getch( )
getche( )
getpass( )
gettext( )
gettextinfo( )
gotoxy( )
highvideo( )
cgets( )
clreol( )
clrscr( )
cprintf( )
cputs( )
cscanf( )
delline( )
(4)
ctype
.h

isupper( )
toascii( )
tolower( )
toupper( )
islower( )
isprint( )
ispunct( )
isspace( )
isascii( )
iscntrl( )
isdigit( )
isgraph( )
_tolower( )_
toupper( )
isalnum( )
isalphal( )
(5)
dir.h


mktemp( )
rmdir( )
searchpath( )
setdisk( )
getcwd( )
getdisk( )
mkdir( )
fnmerge( )
fnsplit( )
getcurdir( )
 
chdir( )
findfirst( )
findnext( )
 
(6)
dos.h


pokeb( )
randbrd( )
randbwr( )
segread( )
setblock( )
setcbrk( )
setdate( )
setdta( )
settime( )
setvect( )
setverify( )
sleep( )
sound( )
unixtodos( )
unlink( )
importb( )
int89( )
int86x( )
intdos( )
intdosx( )
intr( )
keep( )
MK_FP( )
nosound( )
output( )
outputb( )
parsfnm( )
peek( )
peekb( )
poke( )
geninterrupt( )
getcbrk( )
getdate( )
getdta( )
getfat( )
getfatd( )
getfree( )
getpsp( )
gettime( )
getvect( )
getverify( )
harderr( )
hardresume( )
hardretn( )
inport( )
absread( )
abswrite( )
allocmem( )
bdos( )
bdosprt( )
country( )
ctrlbrk( )
delar( )
disable( )
dosexterr( )
dostounix( )
enable( )
FP-OFF( )
FP_SEG( )
freemem( )
(7)
graphics.h


sector( )
setactivepage( )
setallpalette( )
setaspectratio( )
setbkcolor( )
setcolor( )
setfillpattern( )
setfillstyle( )
setgraphbufsize( )
setgraphmode( )
setlinestyle( )
setpalette( )
setrgbpalette( )
settextjustify( )
settextstyle( )
setusercharsize( )
setviewport( )
setvisualpage( )
setwritemode( )
textheight( )
textwidth( )
grapherrormsg( )
graphresult( )
imagesize( )
initgraph( )
installuserdriver( )
installuserfont( )
line( )
linerel( )
lineto( )
moverel( )
moveto( )
outtext( )
outtextxy( )
pieslice( )
putimage( )
putpixel( )
rectangle( )
registerbgidriver( )
registerbgifont( )
restorecrtmode( )
getdrivername( )
getfillpattern( )
getfillsettings( )
getgraphmode( )
getimage( )
getlinesettings( )
getmaxcolor( )
getmaxmode( )
getmaxx( )
getmaxy( )
getmodename( )
getmoderange( )
getpalette( )
getpalettsize( )
getpixcel( )
gettextsettings( )
getviewsettings( )
getx( )
gety( )
graphdefaults( )
_graphfreemen
_graphgetmem( )
arc( )
bar( )
bar3d( )
circle( )
cleardevice( )
clearviewport( )
closegraph( )
detectgraph( )
drawpoly( )
ellipse( )
fillellipse( )
fillpoly( )
floodfill( )
getarccoords( )
getaspectratio( )
getbcolor( )
getcolor( )
getdefaultpalette( )
(8)
io.h


setmode( )
settime( )
sopen( )
tell( )
unlock( )
vsscanf( )
write( )
filelength( )
getftime( )
ioctl( )
isatty( )
lock( )
lseek( )
open( )
read( )
chsize( )
close( )
creat( )
creatnew( )
creattemp( )
dup( )
dup2( )
eof( )
_chmod( )
_close( )
_creat( )
_open( )
_read( )
_write( )
access( )
chmod( )
(9)
math.h


modf( )
poly( )
pow( )
pow10( )
sin( )
sinh( )
sqrt( )
tan( )
tanh( )
fmod( )
frexp( )
ldexp( )
idiv( )
log( )
lob10( )
matherr( )
matherr( )
ceil( )
cos( )
cosh( )
div( )
ecvt( )
exp( )
fabs( )
floor( )
_matherr( )
acos( )
asin( )
atan( )
atan2( )
atof( )
bypot( )
cabs( )
(10)
process.h


spawnv( )
spawnve( )
spawnvp( )
system( )
exit( )
spawnl( )
spawnle( )
spawnlp( )
spawnlpe( )
execlpe( )
execve( )
execvp( )
execvpe( )
_exit( )
abort( )
execl( )
execle( )
execlp( )
(11)
signal.h


signal( )
raise( )
(12)
stdarg.h


va_start( )
va_end( )
va_arg( )
(13)
stdio.h


setvbuf( )
sprintf( )
sscanf( )
strerror( )
tmpfile( )
tmpnam( )
ungetc( )
vfprintf( )
vfscanf( )
vprintf( )
vscanf( )
vsprintf( )
gets( )
getw( )
perror( )
printf( )
putc( )
putchar( )
puts( )
putw( )
remove( )
rename( )
rewind( )
scanf( )
setbuf( )
fprintf( )
fputc( )
fputchar( )
fputs( )
fread( )
freeopen( )
fscanf( )
fseek( )
fsetpos( )
ftell( )
fwrite( )
getc( )
_strerror( )
fclose( )
fcloseeall( )
feof( )
ferror( )
fflush( )
fgetc( )
fgetchar( )
fgetpos( )
fgets( )
fileno( )
flushall( )
fopen( )
(14)
stdlib.h


randomize( )
realloc( )
srand( )
strtod( )
strtol( )
strtoul( )
swab( )
system( )
ultoa( )
ultra( )
itoa( )
labs( )
lfind( )
lsearch( )
ltoa( )
malloc( )
putenv( )
qsort( )
rand( )
random( )
atoi( )
atol( )
bsearch( )
calloc( )
ecvt( )
exit( )
fcvt( )
free( )
gcvt( )
getenv( )
_exit( )
_lrotl( )
_trotr( )
_rotl( )
_rotr( )
abort( )
abs( )
acvt( )
atexit( )
atof( )
(15)
string.h


strnset( )
strpbrk( )
strrchr( )
strrev( )
strset( )
strspn( )
strstr( )
strtok( )
strupr( )
strdup( )
strerror( )
stricmp( )
strlen( )
strlwr( )
strncat( )
strncmp( )
strnicmp( )
fmovmem( )
setmem( )
strcat( )
strchr( )
strcmp( )
strcmpi( )
strcmp( )
strcpy( )
memchr( )
memcmp( )
memcpy( )
memcpy( )
memicmp( )
memmove( )
memset( )
movedata( )
(16)
time.h


time( )
szset( )
localtime( )
stime( )
difftime( )
gmtime( )
asctime( )
ctime( )
(17)
iostream.h


ws
hex
oct
flush
dec
endl
ends
(18)
iomanip.h


setiosflags( )
resetiosflag( )
setbase( )
setprecision( )
setw( )
setfill( )
(19)
fstream.h


caux
cerr
cprn
cin
cout
 

دوال الإدخال و الإخراج في لغة سي

بسم الله الرحمن الرحيم

دوال الإدخال و الإخراج في لغة سي


في هذا الدرس سنتعرف على دوال جديدة مختلفة كثيراً عن الدرس السابق ... سنتعرف الآن على دوال مختصة في الإدخال و الإخراج  I/O:

أولاً:
دالة الإخراج :
 
printf( );
 
طبعاً هذه الدالة من الدوال الأساسية جداً في لغة السي لا أعتقد أن هناك من يجهلها و هذه الدالة تأخذ متغر إلى متغيرين .

الأول يكون دائم من نوع سلسلة حرفية و المتغير الاول إجباري , أما المتغير الثاني فهو غير إجباري و يكون من نوع 
va_list   طبعاً هو ليس من الأنواع القياسية
في  لغة سي و لكنه مفيد جدا في أن الدالة تأخذ عدد غير محدد من القيم مثل ما يحصل مع الدالة printf و scanf  و لكن عمل هذا النوع معقد جداً
و لن أتطرق له هنا ...المهم لو اردنا أن نطبع الجملة التالية :
 
Hi I am Talal
 
ما علينا إلا كتابة الآتي:
 
printf ("Hi I am Talal");
 
ولكن ماذا لو أردنا أن نكتبها هكذا:
 
Hi I am
Talal
 
سوف نكتبها هكذا :
 
printf ("Hi I am nTalal");
 
لاحظ  هنا وجود علامة الـ n وهي تعني new line ( سطر جديد )
وهناك الكثير من العلامات التي تؤدي اغراض معينة مثل:
1. نقل المؤشر 8 مسافات و نستخدم لذلك علامة t .
2. إخراج صوت الصافرة ( بيب ) , ونستخدم العلامة a.
3. إرجاع المؤشر مسافة خلفية و نستخدم لذلك b .

ولكن ماذا لو اردت أن نطبع العلامة ؟!؟
الحل هو كتابتها كالتالي:
 
printf ("Hi I am Talal");
 
سنلاحظ أن المخرج على الشاشة هو :
 
Hi I am Talal
 
والحال ايضاً نفس الشئ مع الـ ؟ و الـ ' و الـ "
فما عليك إلا كتابتها مرتين ؟؟ و "" و ' ' .

ولنرى الان هذا البرامج على السريع :
 
#include "stdio.h"
main ( )
{
        int a = 5, b = 10, c ;
        float f = 45.5 ;
        char ch = 'Y' ;
        char name[10] = "Talal" ;

        c = a + b ;
        printf ("The int c = %d n",c) ;
        printf ("The float f = %f n",f) ;
        printf ("The char ch = %c n",ch) ;
        printf ("The string name = %sn",name) ;
    return 0 ;
}
 
لاحظ أن المخرجات ستكون بالشكل التالي :
 
The int c = 15
The float f = 45.5
The char ch = Y
The string name = Talal
 
لاحظ أن %d تكون توصيف لمتغير من نوع int ,
و الـ %f تكون لتوصيف متغير من نوع float ,
والـ %c تكون لتوصيف متغير من نوع char أي حرف واحد ,
والـ %s تكون لتوصيف متغير من نوع string حرف أو أكثر .

ثانياً: 
دالة الادخال
 
scanf ( ) ;
 
وهي دالة لإدخال أي نوع من أنواع الـ Data Type .
وممكن نشوف هذا المثال و يكون كافي :
 
#include "stdio.h"
main ( )
{
        int a ;
        char string[20] ;
        printf ("nEnter an int VALUE: ") ;
        scanf ("%d",&a) ;
        printf ("nEnter a string: ") ;
        scanf ("%s",string) ;
        printf ("The int value is:%d ,,, the string is:%sn", a, string) ;
    return 0 ;
}
 
لنلقي نظرة على البرنامج بسرعة :
في الأول عرفنا متغيرين الاول من نوع int و الثاني من نوع char
وهي مصفوفة لأن الجمل في السي هي عبارة عن مصفوفة من نوع char .
ثم طبعنا عبارة تطلب من المستخدم إدخال قيمة من نوع int
ثم إستخدمنا الدالة scanf لإدخال هذه القيمة في المتغير a ,
لاحظ أننا كتبنا a& وليس a و هذا مطلب اساسي لجميع المتغيرات
ماعدا نوع string , وهذا موضوع في الـ Functions يسمى
Call By reference. وذلك لأن قيمة a ستتغير بعد ما نستدعي هذه الدالة .
ثم قمنا بطلب آخر من المستخدم و هو إدخال جملة و لكن هذه المرة لم نقم بكتابة string& لماذا ؟ 
لأن المصفوفة في السي عبارة عن مؤشر Pointer و علامة * مع علامة & لا تكتب .
ثم في السطر الأخير طبعنا القيموة a و قيمة المصفوفة string .
- تذكر هذا المثال جيداً لأننا سوف نقوم ببعض المقارنات بين الدالة scanf و دالة أخرى سنراها في هذا الدرس .
 
ثالثاً: 
دوال الإدخال
 
1. getchar ( ) ;
2. getche ( ) ;
3. getch ( ) ;
 
وهذه دوال إدخال حرف واحد و هي متشابهه في الشكل و لكن مختلفة في الأداء نوعاً ما .
الدلة الأولى : getchar توجد ضمن ملف التوجية stdio.h و تستخدم لإدخال حرف واحد ويظهر على الشاشة بعد الكتابة ولا ينتقل إلى الأمر الذي بعده إلا إذا ضغط المستخدم على مفتاح Enter .

مثال:
 
char ch ;
ch = getchar() ;
printf ("%c",ch) ;
 

الدلة الثانية : getche وتوجد ضمن ملف التوجية conio.h و تستخدم ايضاً لإدخال حرف واحد و يظر على الشاشة إلا أنها تختلف عن الدالة getchar في أنها لا تحتاج الضغط على مفتاح Enter للإنتقال للأمر التالي...
مثال:
 
char ch ;
ch = getche() ;
printf ("%c",ch) ;
 

الدالة الثالثة : getch ( محبوبتي :D ) وتوجد ضمن ملف التوجية conio.h ومع هذه الدالة الأمر مختلف عن الدالتين السابقتين, فالدالتين
السابقتين كان الحرف يظهر على الشاشة و لكن هنا لا يظهر و لا يطلب من المستخدم الضغط على مفتاح Enter للإكمال .
مثال :
 
char ch ;
ch = getch();
printf("%c",ch);
 

طبعاً أولاً نفذ هذه الدوال الثلاث و ضعها في برنامج .
 
ثم لنرى فائدة من فوائد الدالة الأخيرة getch إذا كنت من مستخدمي منتجات بورلاند فلابد من أنك قد مملت ان ينفذ البرنامج
 و عند الإنتهاء منه تضغظ على مفتاحي Alt + F5 لترى آخر النتائج , الدالة getch تحل لك هذه المشكلة كل ما عليك هو ان
تكتب في نهاية الدالة main الجملة التالية
 
getch();
 
و جرب و سترى ان هذا يحل لك الاشكال ... ;)


و هذا أيضاً إذا كنت تريد ان تري المستخدم شئ و ستمسح الشاشة بعدها
ماهو الحل بالتأكيد الدالة getch و بعدها قم بمسح الشاشة .
- مسوي دعاية لهالدالة كأنها متنج تلفزيوني أبغا أبيعه – :D .

وتستخدم هذه الدالة أيضاً في حركات كتابة أرقام السر لأنه ليس من
المفروض ان يرى المستخدم رقمة السري ولا لا ؟!؟ ;)

رابعاً: 
دالة الإدخال gets :
توجد هذه الدالة ضمن ملف التوجية stdio.h , و تستخدم في إدخال عبارة حرفية -string- وتستخدم كالتالي:
 
gets ( str ) ; // str is type of array of char …. 
 
لنرى المثال التالي :
 
#include "stdio.h"
#include "conio.h"
main ()
{
        char name[20] ;
        printf ("nPlease Enter Your name: ") ;
        gets (name) ;
        puts (name) ;
        printf ("n%s",name);
        getch ();
    return 0 ;
}
 

طبعاً يوجد في البرنامج دالة جديدة علينا وهي الدالة puts وهي نفس الدالة gets ولكن puts للإخراج , وتستخدم كما في المثال .

ولكن نفذوا البرنامج السابق وبدل من الجملة
 
gets (name);
 
ضعوا :
 
scanf ("%s",name) ;
 
ثم قم بإدخال إسمك كاملاً لنقل ثلاثياً و لاحظ المخرجات !!!
ستجد أن المطبوع هو إسمك الأول فقط و ذلك بسبب أن الدالة scanf
تقراء حتى يواجهها أول فراغ فتتوقف عن القرائة !! إذا ما هو الحال ؟!
الحل هو إستخدام الدالة gets جرب و لاحظ النتائج بنفسك .
التجربة خير برهان .

وأيضاً هناك دوال مشايهه سأذكرها على عجالة وهي :
 
putchar ();
 
وهي مثل الدالة puts ولكن هذه لإخراج حرف واحد فقط فعندما نكتب :
 
putchar ( 'a' ) ;
 
يكون المخرج على الشاشة حرف a .
وعندما تكتب الفقرة التاليه في برنامج :
 
char ch ;
ch = getchar () ;
putchar(ch);
 
وهذه الدالة موجوده في ملف التوجية stdio.h .
وأختها putch ولكن موجودة في ملف التوجية conio.h ولها نفس المعاملات تماماً و تستخدم بنفس الطريقة .



عموما أسألوا لي التوفيق من الله تعالى .
وأسال الله لكم التوفيق و النفع بما لدي و أن أنتفع بما لديكم .


مع تحياتي ,,,أخوكم / طلال.

دوال لتزيين و تحسين المخرجات

السلام عليكم و رحمة من الله وبركاته

دوال تحسين و تزيين المخرجات


أولاً: 
من الدوال المثيرة في أي لغة هي الدوال لتي تتحكم في الالوان من خلفية الشاشة و من لون النص المكتوب . و من تحديد مكان للنص و الكتابة فيه .
إذا كنت تستخدم أحد منتجات بورلاند مثل:  Turbo C أو++Turbo C أو++Boland C فهذه الدوال تعمل مباشره هناك تحت ملف conio.h و إليكم هيه:
 
________________________________________________________________________________
1. دالة مسح الشاشة: 
وهي تستخدم لمسح الشاشة و وضع المؤشر في أول عمود من الصف الأول على الشاشة و تستخدم بالشكل التالي :
 
clrscr( );
 
_________________________________________________________________________________
2. دالة تغيير موضع المؤشر: 
تستخدم لوضع المؤشر في العمود x من الصف y وتأخذ الصورة التالية :
 
gotoxy(int x, int y);
 
__________________________________________________________________________________
3.دالة تغيير لون الكتابة:
وتستخدم لتغيير لون الكتابة التي ستطبع بعد هذه الدالة وتأخذ الصيغة:
 

textcolor(color number);
OR
textcolor(color name);
 


ويتم تحديد اللون أما بالرقم او بالإسم .
اللون
اللون E
رقمة
أسود
BLACK
0
أزرق
BLUE
1
أخضر
GREEN
2
سماوي
CYAN
3
أحمر
RED
4
بنفسجي
MAGENTA
5
بني
BROWN
6
رمادي فاتح
LIGHT GRAY
7
رمادي غامق
DARK GRAY
8
أزرق فاتح
LIGHT BLUE
9
أخضر فاتح
LIGHT GREEN
10
سماوي فاتح
LIGHT CYAN
11
أحمر فاتح
LIGHT RED
12
بنفسجي فاتح
LIGHT MAGENTA
13
أصفر
YELLOW
14
أبيض
WHITE
15


لكن يجب أن نتتبه أنه مع هذه الدوال يجب أن تستخدم
cprintf بدل printf
ونستبدل علامة سطر جديد New Line
 ' n '    بــ   ' rn '
 
________________________________________________________________________________
4.دوال تغيير لون الخلفية: 
وتستخدم لتغيير لون خلفية الكتابة وتأخذ الصيغة :


 
textbackground(color number);
OR
textbackground(color name);


ومعاملاتها هي نفس معاملات الـ textcolor مع ملاحظة أن هذه الدالة لا تأخذ غير الألوان من الرقم 1 إلى 7 المذكورين في الجدول.
و تستبدل جميع دوال الإدخال و الإخراج عند إستخدام الالوان من صيغتها الطبيعية إلى صيغتها مسبوقة بالحرف c المأخوذ من color .
لذا تصبح الــ cscanf <---- scanf.
 
ملاحظة: 
إذا إستخدمة الدالة textbackground لتحديد لون لخلفية و أتبعتها بالدالة clrscr سيتم مسح الشاشة باللون الذي تم تحديدة .
أما إذا لم تستخدم الدالة clrscr فإن لون الخلفية سيخصص للكلمات التي تكتب فقط بينما يبقى لون الشاشه كما هو .
وأذكر أن جميع هذه الدوال تندرج تحت الهيدر فايل conio.h
أي يجب أن تكتب في أول البرنامج:
 
#include
 
_______________________________________________________________________________

*أما إذا كنت من مستخدمي منتجات ماسكروسوفت مثل ++Visual C فإن الدوال السابفة الذكر لن تعمل معك بل لا بد من كتابتها
 و هذه هي الدوال السابقة مكتوبة بلغة السي بإستخدام win API :

 

void clrscr()
 
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
    SetConsoleCursorPosition(hConsole, coordScreen);
}
//--------------------------------------------------------------------------------- void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//---------------------------------------------------------------------------------- void textbackground(int color)
{

      __BACKGROUND = color;
      SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
      __FOREGROUND + (color << 4));
}
//----------------------------------------------------------------------- 
void textcolor(int color)
{
      __FOREGROUND = color; 
     SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
     color + (__BACKGROUND << 4));
}

________________________________________________________________________________
*مثال شامل للمفاهيم السابقة :
ومن التطبيقات المثير في السي في رسم القوائم Menu
وهذا مثال عام يمكنكم تعديله لبرامجكم حسب الحاجة:

 
#include "stdio.h"
#include "conio.h"

#define numberchoices 6
#define menulength 9
#define menuposx 40-menulength/2
#define menuposy (25-numberchoices)/2
#define UP 72
#define DOWN 80
#define ENTER 13
#define ESCAPE 27

void center(char word[], int totallen);
void border(int x1,int y1,int x2,int y2);

void main()
{
     char menuchoice[numberchoices][menulength+1] = {"Choice #1", "Choice #2", "Quit", "Choice #4", "Choice #5", "Choice #6"};
     char ch;
     int x,currentchoice=1;
 
     _setcursortype(0);
    border(3,2,77,24);
    do 
   {
       _setcursortype(0);
       textbackground(0);  
       textcolor(7); /*reverse  black on white*/ 
     
        for (x=0;x < numberchoices;x++)
        /*Write menu options*/ 
             gotoxy(menuposx,menuposy+x);
             center(menuchoice[x],menulength);
        }
      
        textbackground(7);
        textcolor(0);
        gotoxy(menuposx,menuposy+currentchoice-1);
        center(menuchoice[currentchoice-1],menulength); /*position cursor on current option*/ 

        do
        {
            ch=getch(); /*wait For a key to be pressed*/ 
            textbackground(0);
            textcolor(7); /*reverse white on black*/ 
            gotoxy(menuposx,menuposy+currentchoice-1);
            center(menuchoice[currentchoice-1],menulength); /*un-highlight current option*/ 

            if (ch==UP)
                currentchoice = (currentchoice + numberchoices-2)%numberchoices + 1;
            else if (ch==DOWN)
                    currentchoice = 1 + currentchoice%numberchoices;

            textbackground(7);
            textcolor(0);   /*reverse  black on white*/             gotoxy(menuposx,menuposy+currentchoice-1);
            center(menuchoice[currentchoice-1],menulength); /*highlight new option*/ 
        } while((ch != ENTER) && (ch != ESCAPE));

        textbackground(0);
        textcolor(7);
        _setcursortype(2);

        if (ch == ENTER)
        {
            switch(currentchoice)
            {
                case 1:
                    clrscr();
                    cprintf("Hello");
                break;
                case 3:
                    ch=ESCAPE; // FORCE EXIT                 break;
            }
        }
   } while(ch != ESCAPE);
}

void center(char word[], int totallen)
{
    int length;
    int count;

    length=strlen(word);
    for ( count = 0 ; count < (totallen-length)/2 ; count++ )
        cprintf(" ");
    cprintf("%s",word);
   
    for ( count = 0 ;(totallen-length)/2 + length + count < totallen ; count++ )
         cprintf(" ");
}

void border(int x1,int y1,int x2,int y2)
{
    int temppos;

    gotoxy(x1,y1);
    cprintf("ة");
        for (temppos=x1;x2-temppos>1;temppos++)
            cprintf("ح");
    cprintf("»");
        for (temppos=y1+1;y2-temppos>0;temppos++)
        {
            gotoxy(x1,temppos);
            cprintf("؛");
            gotoxy(x2,temppos);
            cprintf("؛");
        }
    gotoxy(x1,y2);
    cprintf("ب");
        for (temppos=x1;x2-temppos>1;temppos++)
            cprintf("ح");
    cprintf("¼");
    gotoxy(x1,y1);
}


 
____________________________________________________________________________

وهذا مثال آخر بسيط نوع ما:
وهو لتببين كيفية إستخدام الدوال السابقة:
 
#include "conio.h"
int main(void)
{
    int i, j;
    clrscr();
        for ( i=0 ; i < 9 ; i++ )
        {
            for ( j=0 ; j < 80 ; j++ )
                cprintf("c");
            cprintf("rn");
            textcolor(i+1);
            textbackground(i);
        }
    return 0;
}



 
______________________________________________________________________________
وهذا مثال آخر على دالة gotoxy :



 
#include "conio.h"
int main(void)
{
        clrscr();
        gotoxy(35, 12);
        cprintf("WooooooW it's easy in C");
        getch();
    return 0;
}

______________________________________________________________________________
 
و هناك أيضاً الدالتين :


 
int wherex( void ); // Return the current x location of the cursor 

int wherey( void ); // Return the current y location of the cursor 



 
وهي من ضمن الملف conio.h وهذا إذا كانت من مستخدمي منتجات
بورلاند أما إذا كنت من مستخدمي الفجول سي كمبايلر فهذه هي
دوال بلغة السي بإستخدام الــ win API :
 
int wherex( void )
{
        BOOL bSuccess;
        CONSOLE_SCREEN_BUFFER_INFO cinfo;

        bSuccess = GetConsoleScreenBufferInfo(m_hConsole, &cinfo);
        PERR( bSuccess, "GetConsoleScreenBufferInfo" );

    return cinfo.dwCursorPosition.X;
}

int wherey( void )
{
        BOOL bSuccess;
        CONSOLE_SCREEN_BUFFER_INFO cinfo;

        bSuccess = GetConsoleScreenBufferInfo(m_hConsole, &cinfo);
        PERR( bSuccess, "GetConsoleScreenBufferInfo" );

    return cinfo.dwCursorPosition.Y;
}


_______________________________________________________________________________
 
والدالة دليلي 
 
void delay(int);



 
وهي دالة تؤخر العمل بحسب القيمة المعطاة وهذا أيضاً إذا كنت من
مستخدمي منتجات بورلاند و إذا كنت من مستخدمي منتجات
مايكروسوفت فهذه هي طريقة محاكاة الدالة مكتوبة بلغة السي:


 
for (int j = 0; j < 0xFFFFFF; j++)
            ; // delay loop 



 
كل ما عليك هو وضع هذه الــ for داخل اللوب تبعك مثل:


 
#include"stdio.h"
#include"conio.h"
#include"windows.h"
main()
{
        int i, j;
        for (i = 0 ;(!_kbhit()) ; i++)
        {
            gotoxy(10, 10);
            printf("i=%d ",i);
            for ( j = 0; j < 0xFFFFFF; j++)
                    ; // delay loop 

        }
}



 

جرب أن تحذف هذه الفقره و إنظر ما هي النتيجة


 
for (int j = 0; j < 0xFFFFFF; j++)
     ; // delay loop 



 
و كلما زدت في عدد الـــ F  كلما زاد وقت الانتظار و العكس كلما قللت منها قل وقت الانتظار.
بالنسبه لعمل الدالة kbhit  فلن أشرحها هنا و لكنني سأكتفي بشرح مايكروسوفت عنها:
Return Value:
_kbhit returns a nonzero value if a key has been pressed. Otherwise, it returns 0.
Remarks:
The _kbhit function checks the console for a recent keystroke. If the function returns a nonzero value, a keystroke is waiting in the buffer. The program can then call _getch or _getcheto get the keystroke.

مع مراعاة أنه مع كتابة أي من هذه الدالة في برنامج الفجول سي++ ( دوال الــ API ) لابد من إدراج الملف windows.h ضمن البرنامج

أتمنى من الله أن أكون قد وفقت في الطرح  و أراكم في دروس أخرى مع لغة السي ...
مع تحياتي ,,,

أخوك: طلال ...
 

دوال التعامل مع الحروف و السلاسل الحرفية

بسم الله الرحمن الرحيم
دوال التعامل مع الحروف و السلاسل الحرفية


هنا نتطرق إلى دوال بعيدة كل البعد عن الدوال السابقة الذكر فالدوال السابقة هي دوال تزيين و تحسين مخرجات فقط .
 أما هنا فسنتطرق إلى دوال مهمة للمبرمج نفسة و لطبيعة برنامجة العملية .
منها:
 أولاً: الدوال التي تهتم بالحروف و هي تندرج تحت ملف الامتداد ctype.h .
_________________________________________________________________________________________________________________________________

1. الدالة
 
int isalnum ( char ch );
 
و هذه الدالة تتأكد من إذا كان الحرف المدخل من الأعداد 0 – 9 أو من الحروف A-Z أو a-z , فإذا كان المدخل رقم او حرف
 فإن الدالة تعيد القيمة غير الصفر ( غالباُ واحد ) و إذا لم يكن حرف و لا رقم فإن الدالة تعيد القيمة صفر . ولنفسر اسم هذه الدالة بالغلة الإنكليزية يكون:
Is Alphabetic  or is Number ?
لنرى كيف نستخدمها :
 
char ch = 'y' ; // or any number from 0 - 9 
if ( isalnum (ch) != 0 )
     printf("%c is alphanumeric. n");
 
و من هنا يتضح كيف نستخدمها ._________________________________________________________________________________________________________________________________
2. الدالة : 
 
int isalpha ( char ch);
 
ولها نفس خصائص الدالة أعلاة و لكنها تختلف عن سابقتها بأنها تعيد صفر حتى ولو كان قيمة الـ ch عدد . 

 
_________________________________________________________________________________________________________________________________
3. الدالة: 
 

وصفهاالدالة
Function Key تسأل إذا كانint iscntrl ( char ) ;
تسأل إذا كان رقمint isdigit ( char ) ;
  Space تتأكد إذا كان الحرف قابل للطباعة ولكن من غير الــint isgraph( char ) ;
 تسأل إذا كان نوع الحرف صغيرint islower( char ) ;
تسأل إذا كان الحرف قابل للطباعة و يتضمن من ذلك المسافةint isprint ( char ) ;
يسأل إذا كان الحرف المدخل مسافةint isspace( char ) ;
 يسأل إذا كان نوع الحرف كبيرint isupper ( char ) ;
 hex يسأل إذا كان الحرف من نوعint isxdigit ( char ) ;



 طبعاً أنا ذكرت جميع الدوال على هذه الصيغة:
 
int theFunction ( char ) ;
 
في الحقيقة هذه الدوال لا تأخذ قيمة من نوع char بل تأخذها من نوع int أي الآسكي كود تبع الحرف .
 ولكن إذا أرسلت لأحد الدوال متغير من نوع int سيقبل و لكن على أساس أنه كود آسكي . و قد وضعت انا المتغيرات من نوع char وذلك لتسهيل فهم الدوال .
ولكن ألا تلاحظ أن جميع هذه الدوال تبدأ بالكلمة is ؟
والكلمة is تدل في الاجليزية على صيغة سؤال و السؤال جوابة يكون إما رفض و هو القيمة صفر ( 0 ) و إما قبول و هي غير تلك القيمة.

وهذ مثال يحسب عدد الحروف و الأرقام في جملة معينة :
 
#include "stdio.h"
#include "ctype.h"
void main()
{
        char str[10] ;
        int d_count ;      // digit counter 
        int c_count ;      // char counter 
        int i;                 // for the loop 

        d_count = c_count = i = 0 ;

        printf(" Please Enter a string: ");
        gets(str);

        while ( str[i] != '' )
        {
                if( isalpha(str[i]) != 0 )
                    c_count++ ;
                else if ( isdigit (str[i]) != 0 )
                    d_count++ ;
            i++ ;
        }

        printf("There is %d digits and %d chat... ",d_count, c_count);
    return 0 ;
}
 
لاحظوا أن هذه الدوال تأخذ حرف واحد و ليست جملة.


ويوجد هناك ايضاً داتين هما :
 
char toupper ( char ch) ;
char tolower ( char ch) ;
 
و تستخدمان هكذا :
 
char ch = 'Y' ;
char cc ;
cc = tolower ( ch ) ;
 
و هكذا تستخدم الدالة toupper و اسم هاتين الدالتين تدلان على معناهما.
ولكن هاتين الدالتين للحروف فقط ... ولكن ماذا لو أردنا للكلمات أي للجمل ؟
الحل لن يخرج عن حلين :
الاول : إستخدام while loop و الأخر دالة سنتطرق لها بعد قليل .

 
_________________________________________________________________________________________________________________________________
يهذا نكون انهينا تقريباً دوال التعامل مع الحروف و الآن ننتقل إلى دوال التعامل مع الجمل وهي تندرج تحت الملف string.h وهذه هي : 

1. الدالة 
 
int strlen ( chat *s) ;
 
فلو كانت عندنا مصفوفة حرفية كالتالي:
 
int length ;
char str[20] = "Hi I am Talal" ;
 
ثم إستدعينا الدالة كالتالي:
 
Length = strlen (str) ;
 
ماذا سوف تكون النتيجة ؟
هل ستقول 20 الجواب قطعاً لا ...20 هو حجم المصفوفة و لكن طول الجملة هو 13.
 و سترى فائدتها في مثال شامل لكل هذه المفاهيم بعد قليل إن شاء الله .

 
_________________________________________________________________________________________________________________________________
2. الدالة : 
 
char *strcat ( char *des, const char *str ) ;
 
وظيفتها هي إلحاق الجملة الثانية في نهاية الجملة الألى و تعيد الدالة مؤشر إلى الدالة المضاف إليها.
 ولكن ليس من الضروري ان تجعل هناك مؤشر للجملة المعدلة و لكن الجملة des ستعدل أوتوماتيكياً.

 
_________________________________________________________________________________________________________________________________
4. الدالة : 
 
char *strncat ( char *des, const char *str, int n) ;
 
وهي نفس الدالة السابقة ولكن تضيف أول n حرف من str إلى الـ des حيث أن الـn هي قيمة من نوع int أي قيمة صحيحة .

 
_________________________________________________________________________________________________________________________________
5. الدالة: 
 
int strcmp( const char *string1, const char *string2 );
 
و الجدول أدناه يبين كيفية تحديد قيم المقارنه:

< 0string1 less than string2
0string1 Equal to string2
> 0string1 greater than string2



ومثلها الدالة strncmp و لكنها تأخذ متغير ثالث وهو عدد الحروف المراد مقارنتها .
فمثلاً لو كان لدينا برنامج به مجموعة أسماء و اردنا أن نعرف كم واحد يبدأ إسمة بـــ"عبد" مثل عبدالله و عندالرحمن و .... إلخ
الاحرف المشتركة بين هذه الاسماء هي عبد فقط و لذلك نستخدم الدالة strncmp و نعطي المتغير الثالث قيمة 3 هكذا :
 
int a ;
char *str1 = "abdullah", *str2 = "abdurahman" ;
a = strncmp(str1, str2, 3) ;
 
هنا ستعيد الدالة صفر للمتغير a.


 
_________________________________________________________________________________________________________________________________
6. الدالة: 
 
char *strcpy( char *des, const char *str ) ;
 
وهذه الدالة تنسخ محتويات الجملة الثانية في الجملة الأولى و يتم مسح ما في الجملة الأولى. مثال هذه الدالة سيكون مع الدالة القدمة.

 
_________________________________________________________________________________________________________________________________
7. الدالة: 
 
char *strchr ( const char *s, char c ) ;
 
وظيفة هذه الدالة هي البحث عن المتغير c في الجملة s , وتعيد مؤشر على الحرف إذا كان موجود .
لنرى هذا المثال :
 
#include "string.h"
#include "stdio.h"
int main(void)
{
        char string[15];
        char *ptr, c = 'r';

        strcpy(string, "This is a string");
        ptr = strchr(string, c);
        if (ptr) // OR if( ptr != NULL )
            
printf("The character %c is at position: %dn", c, ptr-string);
        else
            printf("The character was not foundn");
    return 0;
}
 
وتعيد الدالة NULL إذا لم يوجد الحرف المراد البحث عنه . 
في هذا المثال عرفنا مصفوفة string تتكون من 15 حرف , ثم إستدعينا الدالة strcpy لستنخ الجلمة This is a string إلى المتغير string , ثم جعلنا بالدالة strchr المتغير ptr يشرإلى الحرف الموجود بالمتغير c الذي هو r , ثم تحققنا إذا كانت الـ ptr تساوي null فهذا معناه أن الحرف الموجود بالمتغير c غير موجود بالجملة string .
 
هذه هي أهم الدوال الموجوده في الملف string.h و ليست كلها بل اهمها . وهناك بعض الدوال سأذكرها بسرعة و لن اشرحها :
الدالتين : 
 
char *strlwr(char *s) ;
char *strupr(char *s) ;
 
الدالة strlwr تحول جميع الحروف التي بالحالة الكبيرة إلى الحالة الصغيرة و الدالة strupr تعمل العكس, وهذه هي الدالة التي لمحت عليها من قبل.

 
_________________________________________________________________________________________________________________________________
الدالة : 
 
char *strstr( const char *str, const char *str_set) ;
 
هذه دالة للبحث عن جملة داخل الجملة , إذا كانت موجوده في فإن الدالة تعيد مؤشر إلى أول حرف من str_set داخل str .
 أما إذا كانت غير موجودة فإن القيمة NULL تعاد من الدالة .
 

 
_________________________________________________________________________________________________________________________________
الدالة: 
 
char *strpbrk(const char *str, const char *str_char_set) ;
 
هذه الدالة تبحث عن أي حرف من الجملة str_char_set  داخل الجملة str فعندما تصادف أول حرف في من الحروف الموجودة في str_char_set تعيد الدالة مؤشراً إلى ذلك الحرف , وإذا لم تكن أي من حروف موجودة فإن الدالة تعيدNULL . لنرى هذا المثال الذي يعمل على إزالت أي علامة من العلامات التالية {.,!;'/?-} من النص المدخل :
 
#include "string.h"
#include "stdio.h"
void main(void)
{
        char text[80] ;
        char *ptr ;

        printf("Enter a string contaning puncuations: n");
        gets(text);
        ptr = text ;

        while(ptr != '')
        {
            ptr = strpbrk(ptr, ".,!;'/-/" );
            if(ptr != '')
                *ptr = ' ';
        }
        printf("n%snn",text);
    return 0;
}
 
_________________________________________________________________________________________________________________________________
الدالة : 
 
char *strrev(char *s) ;
 
لا تعليق على هذه الدالة فقط قوموا بتنفيذ هذا البرنامج وسترون النتيجة:
 
#include "string.h"
#include "stdio.h"
void main()
{
        char text[80] ;
        char *ptr ;

        printf("Enter a string contaning puncuations: n");
        gets(text);
        ptr = text ;

        while(ptr != '')
        {
            ptr = strpbrk(ptr, ".,!;'/-/" );
            if(ptr != '')
                *ptr = ' ';
        }
        printf("n%snn",text);
}
 
_________________________________________________________________________________________________________________________________
الدالة :
 
char *strset ( char *s , char ch ) ;
 
وهذه الدالة تقوم بتغيير جميع حروف الجملة s إلى المتغير ch شوفوا هذا المثال للتوضيح :
 
#include "stdio.h"
#include "string.h"
int main(void)
{
        char string[10] = "123456789";
        char symbol = 'c';

        printf("Before strset(): %sn", string);
        strset(string, symbol);
        printf("After strset(): %sn", string);
    return 0;
}
 
دعونا نأخذ بعض التمارين قبل الدخول في دوال الـ stdlib.h.

طيب طلب منا السؤال أن نحسب كم كلمة of موجوده في القطعة التالية :
 
The strstr() function searchs for first occurrence of a substring within a string. If the sub string is found, strstr() returns a pointer to the begging of the substring. If the substring is not found, strstr() returns the null value.
 
الحل ببساطة هو إستخدام الدالة strstr وسيكون الحل هكذا :
 
#include "stdio.h"
#include "string.h"
void main()
{
        char text[] = "The strstr() function searchs for"
                            "first occurrence of a substring within"
                            "a string."
                            "If the sub string is found, strstr() returns"
                            "a pointer to the beging of the substring."
                            "If the substring is not found, strstr()"
                            "returns the null value." ;
        char *ptr ;
        int of_cont = 0 ;

        ptr = text ;
        do
        {
            ptr = strstr(ptr,"of");
            if( ptr != '')
            {
                of_count++;
                ptr++ ;
            }
        }while(ptr != '') ;
    printf("nThe word 'of' appers %d times.nn");
}
 

إلى هنا نتوقف عن مكتبة الـ string.h ولو أنه يوجد أيضا الكثير مما لم نقف عندها إطلاقاً و لكن هذه الدوال كافية جدا لعمل اعقد البرامج .


الآن ننطلق مع مجموعة صغيرة من دوال الـ stdlib.h :
سنختصر هذه الدوال إلى دوال الــ convert من عدد إلى جملة ومن جملة إلى عدد و هي مهمة جدا جدا جدا و سنأخذ مثال عملي لأهميتها في آخر هذا الدرس .
 
_________________________________________________________________________________________________________________________________
1. دالة : 
 
int atoi( const char *s) ;
 
وهذه الدالة تحول الجملة المكونه من أرقام إلى أعدد صحيحة من نوع int يمكن التعامل معها بالضرب و الجمع كأي عدد آخر.
إذا كانت الجملة مثلاً 1234m56 فالجملة المعادة هي 1234 تحول الجملة إلى أعداد حتى تصل إلى أول حرف ليس برقم و كذلك الحال لو إستبدلنا الحرف m في الجملة السابقة بالعلامة '.' سيكون المخرج نفسة .
لنرى هذه المثال على كيفية إستخدامها :
#include "stdlib.h"
#include"stdio.h"
int main(void)
{
        int n;
        char *str = "1234m56";

        n = atoi(str);
        printf("string = %s integer = %dn", str, n);
    return 0;
}
 
إذا لم يكن هناك مجال لتحويل الجملة مثل الجملة '' 12345. '' فالدالة تعيد القيمة صفر . _________________________________________________________________________________________________________________________________
2. الدالة :
 
float atof(const char *s ) ;
 
وهي تعمل نفس عمل الدالة السابقة و لكن تغير إلى float و ليس int .
لنرى هذا المثل :
 
#include "stdlib.h"
#include "stdio.h"

int main(void)
{
        float n;
        char *str = "1234.56";

        n = atoi(str);
        printf("string = %s float = %.2fn", str, n);
    return 0;
}
 
_________________________________________________________________________________________________________________________________
3. الدالة :
 
char *itoa(int value, char *string, int readx ) ;
 
هذه الدالة تحول الرقم value إلى جملة في المتغير string
و دائماً إجعل الـ readx قيمتها 10 .
و السبب في ذلك كما هو من أجل التحويل للقيم السالبة و هذا هو نص ما قالته مايكروسوفت بهذا الخصوص:
If radix equals 10 and value is negative, the first character of the stored string is the minus sign ( – ).

و لنرى هذا المثال :
 
#include "stdlib.h"
#include "stdio.h"

int main(void)
{
        int number = -12345;
        char string[25];

        itoa(number, string, 10);
        printf("integer = %d string = %sn", number, string);
    return 0;
}
 
والصراحة بحثت إن كان هناك دالة تحول من نوع float إلى جملة فلم أجد للأسف .

ولكن يجب  أن تكون حذر عند إستخدام هذه الدالة و تتأكد من حجم المصفوفة التي ستضع العدد بها لا تجعلها صغيرة ولكي تريح بالك من هذه المشكلة قم بالتعريف التالي على الكود السابق:
 
char *string ;
 
نفذ الآن ستلاحظ ان الدالة ستعيد NULL ؟!؟! إذاً ماهو الحل :
قم بوضع هذا السطر قبل ان تستخدم المتغير string :
 
string = (char*) malloc(sizeof(char)) ;
 
بهذا السطر سيعمل برنامجك 100%.

طبعاً أخذنا الدالة isalpha و isdigit ولكن هذه الدوال لا تعمل على الجمل بل على الأحرف فقط إذاً ما هو الحال ؟!؟ 
لنرى هذة الدالة التي تقوم بعمل الدالة isalpha ولكن للجمل ...
فهي تعيد صفر إذا كانت أحد حروف الجملة غير حرف و تعيد واحد إذا كانت حروف الجملة جميعها حروف أو مسافات .
 
#include "stdlib.h"
#include "stdio.h" // for malloc only
#include "ctype.h"
#include "conio.h"
int isalphas(const char *s);
main()
{
        char *s;
        clrscr();
        s = (char*) malloc(sizeof(char));
        gets(s);
        if(isalphas(s) != 0 )
            printf("all are alphabit ...");
        getch();
    return 0;
}
int isalphas(const char *s )
{
        int i,t,s;
        i = 0;
        t = 1;        while( a[i] != '' && t == 1 )        {            s = isalpha( a[i] );            if(s == 0)            {                if(a[i]!=' ' && a[i]!='_')                    t=0;            }            i++;        }            if(a[0]=='')                t=0;    return t;
}
 
ولكن ماذا لو أرد أن تعمل برنامج لإدخال إيميل الإي ميل طبعاً سيحتوي على علامة @ أو من الممكن ان يحتوي على علامة _ ماهو الحل ؟!؟ 
نفس البرنامج السابق ولكن غير الشرط الذي داخل الدالة isalphas إلى
 
if( s[i] != ' ' && s[i] != '@' && s[i] != '_')
      t =  0;
 
فهذا كافي لحل الإشكال ...


الآن قبل النهاية سنأخذ مثال لحل أكبر إشكال قد يواجه أي مبرمج ..
فلو كنت قد عملت برنامج وطلبت من المستخدم ان يدخل عدد ( تأكدوا عدد وليس حرف ) ماذا سيحدث ؟!؟!
مثل هذا البرنامج :
 
int a;
printf("nPlease Enter a number: ");
scanf("%d",&a);
 
فلو أدخل المستخدم اي حرف مثلاً g ستكون النتيجة وخيمة قد تنهي البرنامجح فوراً !!!
الحل هو أن ندخلها على شكل مصفوفة من نوع char ومن ثم نتأكد من إن كانت حروف من الدالة التي كتبتها أعلاه مع بعض الإختلافات وبعدها نحول الجملة إلى int أو float حسب ما نريد.. لنرى البرنامج الآن:
 
#include "stdlib.h"
#include "stdio.h"
#include "ctype.h"
#include "conio.h"

int isdigits(const char *str);

main()
{
        char s[30] ;
        int y ;
        long value ;

        printf("nEnter a value: ");
        gets(s);
        y=isdigits(s);

        do
        {
            if(y != 0)
                  break;

            printf("please reenter the value: ");
            gets(s);
            y = isdigits(s);
        }while(y == 0);
       
        value = atol(s);
        printf("nThe value is: %ldnn",value);
        getch();
    return 0;
}
//------------------------------------------ 
int isdigits( const char *str )
{
        int i,t,s;
        i = 0;
        t = 1;
        while( str[i]!='' && t==1 )
        {
            s=isdigit( str[i] );
            if(s==0)
                t=0;
            i++;
        }
        if(str[0]=='')
            t=0;
    return t;
}
 
جربوا هذا البرنامج و سترون انه لا يقبل غير اعداد فقط و لكن يجب الحذر لأن لا يكون الرقم المدخل اكبر من 10 خانات و إلا ستكون النتيجة غير صحيحة ;) .

 
_________________________________________________________________________________________________________________________________
آمل أن أكون قد وفقك في إيصال الفكرة لكم و أن تكونوا قد استوعبتموها ...
مع تحياتي ,,,

أخوكم / طلال .



ليست هناك تعليقات:

إرسال تعليق