|
| دوره كامله فى لغه السى | |
| | كاتب الموضوع | رسالة |
---|
ملك الظلام
المشرف العام...}
| موضوع: دوره كامله فى لغه السى السبت أبريل 18, 2009 5:21 am | |
| بسم الله الرحمن الرحيم لقد تم افتتاح دوره جديده فى لغه السى للتعلم و الاستفاده و الافاده لنا و لكم وشكرا جزيرا سيتم البدء فى الدروس اليوم | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 5:21 am | |
| يا هلا بكل شخص أراد تعلم لغة السي، وصراحة هذه خطوة كبيرة يبادر بها من يريد تعلم هذه اللغة القوية ، لأنها ليست لغة للهواة بل هي لغة للمبرمجين ، لأنها بكل صراحة لا تحتوي على عبارات أنيقة مزينة ، بمعنى من تعامل مسبقا مع لغة الباسكال فإنه سوف يلاحظ فرقا في طريقة الأوامر.
أما من لم يتعامل مسبقا مع أي لغة أخرى ، فأنا أقول له لا تخف! فنحن نحن في هذه الدروس نتعامل مع الجميع وكأنهم لأول مرة يتعاملون مع ما يسمى بلغات البرمجة لذلك سوف نأخذ بيدك خطوة خطوة لكي نعلمك أساس السي ومن بعده تكمل المشوار عبر تعلم الكثير ونحن سنظل هنا ننتظر أي سؤال منك لكي نساعدك عليه . لقد اشتهرت لغة السي كثيرا فأصبحت من اكثر لغات البرمجة رواجا ، وهي تعتبر لغة متوسطة المستوى بحيث تقع في مكان ما بين الباسكال والبيسك واللغة الآلية المباشرة ، ولكنها بالرغم من ذلك فهي لغة سريعة وقابلة للنقل تسمح للمبرمجين ببلوغ مستوى اللغة الآلية .
هل تعلم لماذا اشتهرت لغة السي؟ ويعود سبب اشتهار لغة السي إلى كونها تعمل بسرعة بالغة لدرجة يجوز مقارنتها مع اللغات التجميعية وهي في نفس الوقت سهلة نسبيا للتعلم والاستخدام. وتعتبر لغة السي لغة مركبة ، تتطلب من المبرمج أن يفكر بكل برنامج كمجموعة مقاطع blocks تؤلف مجتمعة برنامجا متكامل . والآن دعنا نترك الكلام النظري ونتجه مباشرة للدروس العملية فهيا انطلق معنا لنبحر معا للغوص بحثا عن أسرار السي . | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 5:22 am | |
| في نهاية هذا الدرس سوف تستطيع الإجابة عن السؤال التالي: ما هي المراحل التي يمر فيها البرنامج؟ ------------------------------------------------------------ هل أنت مستعد لتلقي الدرس الأول من دروس السي ؟؟ إذا لم يكن لديك متسع من الوقت فلا تقرأ الدرس……وارجع إليه في وقت آخر !!! فدروس السي تحتاج إلى تركيز ووقت كافي ………لأن السي هي عبارة عن لغة من لغات البرمجة القوية………وهي من اللغات المشهورة في العالم التي تجرى عليها تطبيقات كثيرة في حياتنا العملية فهنالك برامج كثيرة كتبت بلغة السي وهذا يرجع لقوتها، فيا ترى هل جهزت نفسك لكي ترحل معنا في رحلة إلى فضاء الكمبيوتر في زيارة للغة السي!!! لن أطيل الكلام لأني متأكد بأنك متلهف لقراءة الدروس والسفر في أغوار هذه اللغة ، لذلك قبل أن ابدأ الدروس لدي نصيحة واحدة لك وهي:
التجربة وتطبيق الأمثلة وعدم الاكتفاء بالقراءة
اخبرني كيف تجهز الشاي؟ بالطبع سوف تستغرب من سؤالي …ولكن دع الاستغراب جانبا وجاوبني عن سؤالي، لا تقل بأنك لا تعرف الإجابة ، طبعا الإجابة واحدة وهي تسخين الماء واضافة الشاي له ثم أخيرا تضيف السكر في كوبك حسب رغبتك……وفي النهاية صحتين وعافية، إذن لقد مررت بأكثر من مرحلة لكي تصل أخيرا إلى إعداد كوب الشاي اللذيذ !!! وهكذا هو السي……فإنك حينما تكتب برنامجا في السي فإنك تمر بعدة مراحل لكي ترى نتيجة البرنامج ،وهذه المراحل ثابتة وهي تمثل كالتالي: 1- مرحلة التحريرediting في هذه المرحلة تقوم أنت بكتابة البرنامج وتحريره 2- مرحلة التجميع وهي تضم مرحلتين أساسيتن هما: · ترجمة compiling · ربط البرنامج linking 3- مرحلة التنفيذ executing وتلك كانت المراحل الأساسية التي يمر بها البرنامج لكي يظهر النتيجة ولكن هنالك مرحلة رابعة تتم فقط في حالة وجود أخطاء في البرنامج وهي 4- مرحلة اكتشاف الأخطاء debugging وطبعا لا يوجد داعي لشرح هذه المرحلة ، فأنت بالطبع سوف تكتشفها عند كتابة برنامج ، ليس معنى كلامي هو التأكيد على وجود الأخطاء في كتابة البرامج ولكن هذا شيء طبيعي ما دمت تتعلم لغة السي ………فأنت ستواجهك أخطاء كثيرة عند كتابة البرامج فأنت في طور تعلم لغة السي وما أدراك ما السي؟؟؟؟ ولكن لا تقلق فمع تطبيق البرامج واكتشاف الأخطاء وتصحيحها سوف تتعود مع مرور الوقت على اكتشاف أخطائك بنفسك لكي تتجنبها مستقبلا.
وربما مللت من الكلام في هذا الدرس لذلك سوف ننطلق بسرعة الى الدرس التالي الذي سوف تقوم فيه بكتابة أول برنامج لك في لغة السي ، فالتعليم التطبيقي أفضل بكثير من النظري ، هل ما زلت هنا؟؟؟ هيا بسرعة انطلق إلى الدرس الذي بعده
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 5:23 am | |
| في نهاية هذا الدرس سوف تستطيع الإجابة عن الاسئلة التالية: ماذا نعني ببرنامج المترجم؟ ما هي أشهر برامج المترجم؟ أين اكتب البرنامج وكيف أقوم بتشغيله ؟
مرحبا بك في هذا الدرس الذي أتوقع بأن تستمع به كثيرا لانه درس تطبيقي. والآن لكي تكتب برنامجا بلغة السي فإنك تحتاج الى برنامج مترجم . ماذا نعني ببرنامج المترجم؟ هو برنامج يقوم بتحويل البرنامج الذي كتبه إلى برنامج تطبيقي يقوم بإظهار النتائج أو اكتشاف الأخطاء. وطبعا هنالك عدة برامج ترجمة لذلك السؤال يطرح نفسه ما هي برامج المترجم وما هو أفضلها؟ من بين برامج المترجم نجد المشهور منها 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 واكتشف بنفسك النتيجة. اعتقد بأنك الآن أخذت فكرة عن برنامج المترجم وأين نكتب البرنامج بالضبط ، يا ترى هل تريد أخذ قسطا من الراحة أم تريد تكملة المشوار والذهاب لمعرفة ماذا تخبئ لنا الدروس من مفاجأت ومعلومات في لغة السي!!! | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 5:23 am | |
| هلا وغلا يا ترى هل ما زلت معنا؟؟ إذن أهنئك فأنت لديك الصبر لتعلم هذه اللغة طبعا لكل لغة لا بد من أساس وليس عليك الآن سوى قراءة هذه الأساسيات لأنك سوف تتعود عليها بعدإذن مع الكتابة المستمرة للبرامج لذلك خذ لك كوب من الشاي أو القهوة وأنت تقرأ هذا الدرس لكن تذكر أن لا تكثر من المنبهات حتى لا يصيبك الأرق ليلا
أساسيات لغة السي: 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 .
وهكذا لكي تكون محترفا في لغة السي يجب عليك التمرن دائما على مختلف أنواع البرامج ، و محاولة اكتشاف الأخطاء دائما وتصحيحها ، وتأكد دائما بأنك ما دمت مع برامج نت فإنك ستتعلم الكثير عن لغة السي وغيره… لذلك تسلح بالإرادة والإصرار وستكون بإذن الله محترفا في لغة السي . |
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 5:25 am | |
| حياكم الله مرة ثانية ، التقينا مجددا مع دروس السي ، في هذا الدرس سوف أقوم بشرح البرنامج الذي اتعبتك في كتابته من دون فهمه (ماذا تقول؟؟ هل نسيت البرنامج السابق؟؟) سوف اقوم بتذكيرك به مرة أخرى.
#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< إسم الملف> القيمة التي ترجع للإجراء إسم الدالة (المتغيرات) { -----------; -----------; الأوامر المطلوب تنفيذها -----------; -----------; }
يا ترى هل أحسست بالملل وأنت تقرأ الدرس؟ لا ألومك فلغة السي في بدايتها ملل وأوسطها حماس ونشاط وآخرها تعب (لأنك سوف تكتب برامج معقدة) وفي آخر النهاية إذا صح القول سوف تحس بتفوق وأنت تنشأ برامج قوية بهذه اللغة الرائعة. لا تنسى أن ترسل لي ملاحظاتك حول هذه الدروس لكي أقوم بتطويرها لكي تظهر في أفضل صورة لك ولغيرك. ------------------------------------------------ الواجب -------- 1- ماذا نعني ب #include؟ 2- لماذا استخدمنا الملف stdio.h؟ 3- ماذا نعني بالإجراء وكيف نستخدمه ؟ 4- ما هو الهيكل العام لكتابة أي برنامج بلغة السي؟
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:50 pm | |
| هلا ومرحبا.......كيف أصبحت أو كيف أمسيت اليوم؟؟ يا ترى إلى أي مدى وصل تجاوبك مع هذه الدروس ......لا تنسى إذا كان لديك أي تعليق فنحن بانتظاره لكي نجدد في كتابة الدروس لمعرفة الأفضل لك ولغيرك. الدرس الذي سوف نتعلمه معا اليوم هو درس رائع وهو التكرار. إذن بعد نهاية هذا الدرس سوف تتمكن من الإجابة عن الاسئلة التالية: 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 بكل بساطة .
والآن هيا بنا ننطلق لتعلم الأنواع الأخرى من التكرار. لكن لي ملاحظة وهي لابد أن تطبق كل برنامج اكتبه لك لأنك لن تتعلم البرنامج ولن تستوعبه حتى ترى النتيجة بعينيك . الواجب | ما معنى التكرار؟ | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:51 pm | |
| التكرار while وهذا التكرار يقوم بتكرار غير محدد من المرات حتى يتحقق شرط معين ، والقاعدة الأساسية لهذا التكرار هي : while(الشرط) { ………….; …………الأوامر; }
دعنا نأخذ المثال التالي: while(num<99) { printf("This is a correct numbern"); num++; }
دعنا نتكلم بالتفصيل عن هذا التكرار:
1- عند كتابة الشرط فإن البرنامج سوف يقوم بتكرار الأوامر ما دام الشرط صحيحا ، أما إذا كان الشرط خاطئا فإن التكرار سوف يتوقف ، ففي المثال السابق نستطيع القول بأنه ما دام الرقم اقل من 99 فإن العبارة سوف تطبع .
2- بعد طباعة الجملة سوف ينتقل إلى العبارة الأخرى وهي num++ وبذلك سوف يزيد الرقم .
3- وهكذا سوف تتم تكرار العبارة إلى إن تصل إلى الرقم 99 ومن بعدها سوف يتوقف التكرار.
وهكذا كان هذا هو تكرار while نأمل أن تكون قد استوعبته. |
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:51 pm | |
| تكرار 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 فإنه سوف يعيد التكرار ويعيد طباعة الجملة ، وهكذا سوف يستمر بطباعة الجملة إلى أن يكون الشرط خاطئا ومن بعدها سوف يخرج من التكرار.
وبعد أن انتهينا من شرح هذا التكرار فيا ترى هل اكتشفت الميزة التي تميزه عن باقي التكرارات الأخرى …..لم تكتشفها!! حسنا سوف أخبرك بها…..إن ميزة هذا التكرار تتمثل في أنه يقوم بطباعة الأمر مرة واحدة على الأقل حتى ولو كان الشرط خاطئا ….لان الشرط يمر به في نهاية التكرار بعكس الأنواع الأخرى من التكرارات. وهكذا انتهى درسنا عن التكرار …..أتمنى أن تكون قد استوعبته ، وتأكد بأن اقصر الطرق لتعلم السي هو تطبيقها….لذلك هيا سارع إلى فتح برنامج السي، وطبق بنفسك ما تعلمته من هذا الدرس…… وتمنياتي لك بالتوفيق! |
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:52 pm | |
| بعد نهاية هذا الدرس سوف تستطيع الإجابة عن الاسئلة التالية: 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
فمن الخطأ أن تضيف البرنامج في وسط الأوامر بل تستطيع إضافتها بعد أوقبل الجمل والأوامر الرئيسية. ولقد كان ذلك هو درس التعليقات ، اتمنى أن تكون قد اقتنعت بأن التعليقات مهمة جدا…دعنا نغير جو السي الجاد ولأخبرك بقصة طريفة . كان أستاذ للغة السي قد طلب من طلابه كتابة برامج معينة بلغة السي ، وطبعا منهم المجتهد ومنهم الكسول………وكان هنالك صديقان يكتبان البرامج معا فهم يقسمان العمل بينهما………وكل شخص منهم كتب برنامجان فأصبح مجموع البرامج هي أربعة وعند تسليم البرامج للأستاذ……وضع لكل شخص منهم نصف الدرجة بالرغم من أن البرامج مكتملة وتعمل بطريقة صحيحة ، فاستغربوا من ذلك وسألوا الاستاذ لماذا نصف الدرجة، ولم يخطر في ذهن أي شخص منهم بأن الاستاذ قد كشف لعبتهم هذه في المشاركة في كتابة الواجب…….فكيف اكتشف الاستاذ طريقتهم؟
بكل بساطة حينما كتب كل شخص منهم البرنامجين ، كتب كل شخص منهم في أعلى البرنامج اسمه ، ظن منهما بأن كل واحد سوف ينتبه لذلك ويغير الاسم لاسمه ، ولكن للأسف لم ينتبها لذلك ……………فكان سر اكتشاف الاستاذ لهم هو التعليقات…………!!! |
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:53 pm | |
| بسم الله الرحمن الرحيم محتويات أشهر مكتبات السي Header files محتوى الدرس:
محتويات مكتبة alloc.h. محتويات مكتبة bios.h. محتويات مكتبة conio.h. محتويات مكتبة ctype.h. محتويات مكتبة dir.h. محتويات مكتبة dos.h. محتويات مكتبة graphics.h. محتويات مكتبة io.h. محتويات مكتبة math.h. محتويات مكتبة process.h. محتويات مكتبة signal.h. محتويات مكتبة stdarg.h. محتويات مكتبة stdio.h. محتويات مكتبة stdlib.h. محتويات مكتبة string.h. محتويات مكتبة time.h. محتويات مكتبة iostream.h. محتويات مكتبة iomanip.h. محتويات مكتبة 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( )
|
( 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
(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
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:53 pm | |
| بسم الله الرحمن الرحيم دوال الإدخال و الإخراج في لغة سي
في هذا الدرس سنتعرف على دوال جديدة مختلفة كثيراً عن الدرس السابق ... سنتعرف الآن على دوال مختصة في الإدخال و الإخراج 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 ( محبوبتي ) وتوجد ضمن ملف التوجية conio.h ومع هذه الدالة الأمر مختلف عن الدالتين السابقتين, فالدالتين السابقتين كان الحرف يظهر على الشاشة و لكن هنا لا يظهر و لا يطلب من المستخدم الضغط على مفتاح Enter للإكمال . مثال :
char ch ; ch = getch(); printf("%c",ch);
طبعاً أولاً نفذ هذه الدوال الثلاث و ضعها في برنامج .
ثم لنرى فائدة من فوائد الدالة الأخيرة getch إذا كنت من مستخدمي منتجات بورلاند فلابد من أنك قد مملت ان ينفذ البرنامج
و عند الإنتهاء منه تضغظ على مفتاحي Alt + F5 لترى آخر النتائج , الدالة getch تحل لك هذه المشكلة كل ما عليك هو ان
تكتب في نهاية الدالة main الجملة التالية
getch();
و جرب و سترى ان هذا يحل لك الاشكال ...
و هذا أيضاً إذا كنت تريد ان تري المستخدم شئ و ستمسح الشاشة بعدها ماهو الحل بالتأكيد الدالة getch و بعدها قم بمسح الشاشة . - مسوي دعاية لهالدالة كأنها متنج تلفزيوني أبغا أبيعه – .
وتستخدم هذه الدالة أيضاً في حركات كتابة أرقام السر لأنه ليس من المفروض ان يرى المستخدم رقمة السري ولا لا ؟!؟
رابعاً: دالة الإدخال 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 ولها نفس المعاملات تماماً و تستخدم بنفس الطريقة .
عموما أسألوا لي التوفيق من الله تعالى . وأسال الله لكم التوفيق و النفع بما لدي و أن أنتفع بما لديكم .
مع تحياتي | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:55 pm | |
| بسم الله الرحمن الرحيم دوال التعامل مع الحروف و السلاسل الحرفية هنا نتطرق إلى دوال بعيدة كل البعد عن الدوال السابقة الذكر فالدوال السابقة هي دوال تزيين و تحسين مخرجات فقط . أما هنا فسنتطرق إلى دوال مهمة للمبرمج نفسة و لطبيعة برنامجة العملية . منها: أولاً: الدوال التي تهتم بالحروف و هي تندرج تحت ملف الامتداد 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 ); و الجدول أدناه يبين كيفية تحديد قيم المقارنه:
< 0 | string1 less than string2 | 0 | string1 Equal to string2 | > 0 | string1 greater than string2 |
ومثلها الدالة strncmp و لكنها تأخذ متغير ثالث وهو عدد الحروف المراد مقارنتها . فمثلاً لو كان لدينا برنامج به مجموعة أسماء و اردنا أن نعرف كم واحد يبدأ إسمة بـــ"عبد" مثل عبدالله و عندالرحمن و .... إلخ الاحرف المشتركة بين هذه الاسماء هي عبد فقط و لذلك نستخدم الدالة strncmp و نعطي المتغير الثالث قيمة 3 هكذا : int a ; char *str1 = "abdullah", *str2 = "abdurahman" ; a = strncmp(str1, str2, 3) ; هنا ستعيد الدالة صفر للمتغير a.
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:55 pm | |
| . الدالة:
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 من عدد إلى جملة ومن جملة إلى عدد و هي مهمة جدا جدا جدا و سنأخذ مثال عملي لأهميتها في آخر هذا الدرس . | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:56 pm | |
| 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 خانات و إلا ستكون النتيجة غير صحيحة .
_________________________________________________________________________________________________________________________________آمل أن أكون قد وفقك في إيصال الفكرة لكم و أن تكونوا قد استوعبتموها ... مع تحياتي ,,,
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:57 pm | |
| بسم الله الرحمن الرحيم لقد تعلمتم المصفوفات وكيفية التعامل معها أي التعامل مع البيانات داخلها وقد ذكر الإخوان بعض طرق البحث في المصفوفة مثل البحث الثنائي ولكن بالنسبة للطريقة التي سوف ندرسها ستكون أسهل في الفهم من البحث الثنائي ولفهم الطريقة أكثر سوف نضع هذا الخوارزم (عدد من الخطوات القريبة من شكل البرنامج) خوارزم البحث عن قيمة ما في مصفوفة باستخدام مفهوم البحث المتتالي:
- البدابة
- أدخل س(وهي القيمة المراد البحث عنها)
- ص=صفر (عداد تكراري يبدا من أول قيمة في المصفوفة ويتحرك إلى نهاية المصفوفة)
- ع=صفر (عدد مرات وجود تلك القيمة المختارة داخل المصفوفة)
- إذا كان س يساوي العنصر الذي رقمه ص اجعل
ع=ع+1
- ص=ص+1
- إذا كان ص أقل من عدد عناصر المصفوفة إذهب إلى الخطوة خمسة
- إذا كان ع =صفر
إطبع (قيمة س غير موجودة في المصفوفة)
- إذا كان ع لايساوي صفر
إطبع (قيمة س موجودة في المصفوفة ع من المرات)
- النهاية
لتطبيق هذا الخوارزم بلغة C :#include "IOSTREAM.H" void main (void) { int array[7]; int counter; int value; int isfound = 0; for (counter = 0 ; counter < 7 ; counter ++) { cout << " array ["<< counter<<"]="; cin >> array [counter]; } cout << " nnENTER THE VALUE YOU WHONT TO SEARCH : "; cin >> value ; for (counter = 0 ; counter < 7 ; counter ++) if ( value == array[counter]) { cout << value << " FOUND "< | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:57 pm | |
| السلام عليكم و رحمة الله و بركاته
الملفات مع السي هل فكرت يوماً بعمل برنامج ولنقل مثلاً لمكتب عقاري ؟ هل فكرت يوماً بعمل برنامج يقوم بعمل معين ولكنك تحتاج إلى البيانات الموجوده فيه مسبقاً و لا تريدها ان تضيع بمجرد إقفال البرنامج ؟
الحل سيكون إستخدام الملفات بالتأكيد ...فهي المعنى الحقيقي للبرمجة و هي التي تقوم بجعل البرامج العديمة الفائدة مفيدة جداً , فتخيل برنامج Word مثلاً بدون الملفات ؟!!! لن يكون له اي فائدة عدى القليل جداً .
طبعاً اقصد بالملفات هي الحفظ و الفتح التي تقوم بها يوميا تقريباً في برامجك .
عموماً لن نطيل في هذه المقدمات كثيراً و لنبداء البرمجة بإستخدام الملفات :
الملفات في أي لغة لن تتعامل معها مباشرة ( أي بإسم الملف ) و لكنك ستتعامل مع مؤشر إلى الملف و لنبدأ: أولاً كيف يمكننا أن نعرف مؤشر إلى ملف ؟ ________________________________________________________________________________1. التعريف : FILE *file_pointer; مع العلم ان كلمة FILE لابد ان تكون بالحروف الكبيره و file_pointer هي كلمة إختيارية تختارها أنت و لتكن مثلاً fp لسهولة الإستعمال و لكن لابد أن تسبق بالعلامة * فقط في التعريف ( كما هو موضح في الأعلى ) أي أن المتغير سيكون مؤشر للملف. __________________________________________________________________________________ 2. فتح الملف : لابد من فتح الملف قبل إستخدامة مثلة مثل فتح ( تشغيل ) الكمبيوتر قبل إستخدامة ولفتح الملف سنستعمل الدالة التالية : FILE *fopen ( const char *filename, const char *mode ) ; الـ filename هو إسم الملف الذي يكون ظاهر للمستخدم مثلاً talal.txt و الـ mode هو طبيعة فتح الملف فهناك اكثر من صفة لفتح الملف سأذكرها بعد قليل فلو كان لدينا هذا التعريف : FILE *fp; و نريد ان نفتح ملف إسمة talal.txt فسنفتحه بالطريقة التالية : fp = fopen( "talal.txt", "w" ) ; إذا لم يتمكن النظام من فتح الملف سنعيد في الـ fp قيمة NULL . و لنرى الصفات التي تفتح عليها الملفات : الطريقة | الوصف | r | open a text file for reading أي فتح ملف للقراءة | w | open a text file for writing أي فتح ملف للكتابة و إذا كان الملف موجود يقوم بمسح محتوياته | a | (open a text file for appending (adding info to the END of file فتح للإضافة إلى النهاية | +r | ( opening a text file for update ( reading and writing فتح ملف للتحديث ( قرائة و كتابة ) | +w | open a text file for update. If the file exists it is truncated to zero length. If it does not exists it is created يفتح ملف للتعديل ( للقرائة و الكتابة ) إذا كان الملف موجود فإنة تلغى محتوياته أما إن لم يكن موجود فإن النظام ينشأة | +a | open a text file for update ( reading and writing ). Writing is only allowed at the end of file. But any part of the file can be readed. If the file does not exists the system create it فتح الملف للتعديل و التحديث و لكن الإضافة تكون في نهاية الملف و بينما القرائة تكون من أي مكان في الملف. إذا لم يكن الملف موجود اصلاً فإن النظام تقوم بإنشاء هذا الملف. | Adding a 'b' changes the file type from text to binary. Apart from that the string will have the same effect. و عند إضافة الحرف 'b' إلى نوع الفتح سيتغير من فتح ملف من نوع text إلى فتح من نوع binary. و سيكون لملف الـ Binary نفس خصائص الحروف بالـ text . |
إذاً إذا أردنا أن نفتح ملف للقرائة منه ماذا نفعل ؟ الجواب هو كالتالي : fp = fopen("talal.txt", "r"); و إذا أردنا فتح الملف للقراءة و الكتابة معاً يمكننا ذلك بطرق أحدها: fp = fopen("talal.txt", "r+"); // OR by using w+ OR using a+ ________________________________________________________________________________ 3. إغلاق الملف : كما فتحنا الملف في البداية لابد من اإغلاقة عند الإنتهاء منه أليس كذلك ؟!! بالتأكيد سنغلقة في حال إنتهينا من إستعمال الملف و الدالة المسؤلة عن إغلاق الملف هي: int fclose(FILE *file_pointer ); هكذا فقط . فلو كان عندنا التعريف التالي : FILE *fp ; fp = fopen("talal.txt", "w") ; سنغلق هذا الملف هكذا : fclose ( fp ) ; فقط, هذا كل ما في الأمر. أليس هذا سهلاً ؟!! وإذا لم ينفتح الملف لأي سبب من الأسباب كأمتلاء الذاكرة, ستعيد الدالة القيمة NULL. _________________________________________________________________________________
4. الإدخال و الإخراج من الملفات ( I/O with files ) : الآن قد انتهينا من كيفية فتح و إغلاق الملفات إلى هذه النقطة لم نتعلم كيف نحفظ ما قمنا بعمله, للقيام بذلك هناك عدة دوال مسؤالة عن هذا الشيء منها: الدالة الأولى هي : int putc( char ch, FILE *file_pointer ); و هي موجوده ضمن ملف stdio.h . و لنأخذ مثال على هذه الدالة : #include "stdio.h" main() { FILE *fp ; char ch ; fp = fopen("talal.txt", "w"); while( ( ch = getche() ) != 'r' ) putc(ch, fp);
fclose(fp) ; return 0 ; } لقد قمت بتنفيذ هذا البرنامج فوجدت ملف إسمة talal.txt في نفس المجلد الذي يوجد به الكود الذي نفذتة فوجدت بداخلة الجملة التي كتبتها و هي : Hi this is Talal بعد تنفيذ البرنامج الأول لنقم بكتابة هذا الكود بعده :
#include "conio.h" #include "stdio.h" main() { FILE *fp ; char ch ; fp = fopen("talal.txt", "r"); while( (ch = getc(fp) ) != EOF ) printf("%c",ch);
fclose(fp) ; return 0 ; } هذا الكود يقوم بقرائة الملف و طباعة محتواه على الشاشة , و لكن ما هي و ظيفة الدالة getc ؟ هذه دالة للقرائة من ملف و هي على الصيغة التالية : char getc( FILE *file_pointer ) ; و هي توجد في الملف stdio.h , ولشرح هذا البرنامج بالتفصيل : عرفنا مؤشر إلى ملف بإسم fp , ثم قمنا بفتح الملف بإستخدام الدالة fopen و فتحناه على صيغة قرائة من ملف 'w' , الان مؤشر الملف على اول حرف في الملف , ثم دخلنا الدوارة while فنقراء أول حرف و نضع قيمتة في الـ ch و نقارنة بالقيمة EOF و هي تعني End Of File ( نهاية الملف ) فنستمر في القرائة من الملف و نطبع على الشاشة قيمة الـ ch إذا لم تكن EOF | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى السبت أبريل 18, 2009 2:58 pm | |
| الدالة : fprintf (file_pointer, " ",,,) ; وهي مثل الدالة printf تماماً ولكنها تختلف في أن البراميتر الأول هو مؤشر الملف و مثلها أيضاً الدالة : fscanf (file_pointer, " " ,,,) ; وهي مثل الدالة scanf تماماً و لكن البراميتر الأول مؤشر للملف الذي نريد أن نقرأ منه .
لنأخذ هذا البرنامج على الدالتين السابقتين : #include "stdio.h" main() { FILE *fp; char name[40]; int id; float gpa;
fp = fopen("std.txt","w");
if(fp == NULL) printf("nCan't Open File..."); else { do { printf("nEnter Name, id, gpa: "); scanf("%s %d %f",name, &id, &gpa); fprintf(fp,"%s %d %.2fn",name, id, gpa); }while( id != 0 ); } fclose(fp); return 0; } في هذا المثال فتحنا الملف STD.txt في الأول, و تأكدنا أن الملف لم يرجع NULL (أي أن الملف قد فتح) بالشرط أعلاه : if(fp == NULL) printf("nCan't Open File..."); و هذا الشرط مهم جداً لعمل برنامج كامل يعمل في جميع الأحوال. بعد ذلك عملنا دواره do…..While حتى يدخل المستخدم رقم صفر لأي طالب. بعد ذلك قمنا بالطلب من المستخدم أن يدخل الإسم و الرقم و المعدل GPA, و إستقبلنا المدخلات بالأمر scanf, و حتى هنا لا يوجد شئ جديد, بعدها قمنا بالطباعة في الملف بالأمر fprintf و بعدها قمنا بإغلاق الملف.
ثم بعد ذلك سنكتب البرنامج التالي: #include "stdio.h" main() { FILE *fp; char name[40], ch; int id; float gpa; fp = fopen("std.txt","r");
if(fp == NULL) printf("nCan't Open File..."); else { fscanf(fp, "%s %d %f",name, &id, &gpa); fscanf(fp, "%c", &ch);
while( id != 0 ) { printf("Name:%s, ID:%d, GPA:%.2fn",name, id, gpa); fscanf(fp,"%s %d %f",name, &id, &gpa); fscanf(fp, "%c", &ch); } } fclose(fp); return 0; } ماذا سنجد ؟!؟ سنجد المعلومات التي كتبناها في البرنامج الذي سبق هذا . و لكن قد يسئل البعض لماذا وضعنا هذه الجملة : fscanf(fp, "%c", &ch); اقول أولاً لنرجع للبرنامج الذي سبق هذا و في الجملة التالية بالذات : fprintf(fp,"%s %d %.2fn",name, id, gpa);
أقول اننا طبعا سطر جديد في الملف بالأمر n و السطر الجديد هو عبارة عن char فكما طبعنا في الملف سطر جديد لا بد أن نقرأ هذا الحرف بالأمر: fscanf(fp, "%c", &ch); فجرب ان تزيل هذه الجملة و سترى النتيجة .
و هناك ايضاً بعض الدوال التي سنكتفي بذكر تعريفها فقط : char *fgets ( char *s, int n, FILE *File_pointer) ; وهذه الدالة تقراء في المتغير s حتى الحرف n-1 أو حتى نهاية السطر . int fputs ( const char *s, FILE *FILE_pointer ) ;
وهاتان الدالتان مثل الدوال gets و puts تماماً غير انها للملفات .
والدوال السبقة هي دوال للملفات المنتظمة أي تقراء و تطبع سطر بسطر بالترتيب . ________________________________________________________________________________
أما الآن فسندخل في الملفات العشوائية Random Files : و لملفات العشوائية يوجد عدد من الدوال لذلك وهي غالباً للكاتبة و القرائة بالسجلات Structures و من هذه الدوال : size_t fread ( void *ptr, size_t size, size_t n, FILE *file_pointer ) ; فالباراميتر الأول يأخذ السجل المراد القرائة فيه و المتغير الثاني يأخذ حجم السجل و المتغير الثالث يأخذ غالباً الرقم ( واحد ) أي عدد السجلات في كل مرة و المتغير الرابع يأخذ مؤشر الملف , و سنأخذ مثال على هذه الدالة و الدوال الباقية مجتمعه في مثال واحد .
الدالة الثانية : size_t fwrite(const void *ptr, size_t size, size_t n, FILE *file_pointer ) ; وهي نفس الدالة السابقة تماماً ولكن هذه الدالة للكتابة فقط .
الدالة الثالثة : int fseek (FILE *File_pointer, long offset, int whence ); وهذه الدالة تستخدم في التنقل عبر الملف, فالمتغير الأول عبارة عن مؤشر للملف المراد التنقل فيه , و المتغير الثاني عبارة عن عدد الحروف المراد قفزها, و المتغير الثالث عبارة عن مكان القفز و هو أما ان يكون من بداية الملف SEEK_SET أو من المكان الحالي SEEK_CUR او من النهاية SEEK_END .
فلو كان عندنا السجل التالي : typedef struct { datatype data; }RECORD; ,ومن ثم عرنا متغير R من نوع RECORD كالتالي : RECORD R ; و كتبنا في الملف و لنقل 100 سجل ... و اردنا أن نذهب للسجل الأخيرفي الملف فكيف يكون ذلك ؟! الحل سيكون بالأمر fseek ولكن هل سيكون كالتالي : ؟! fseek ( fp, 0, SEEK_END ) ; و لنفرض جدلاً ان هذا الكلام صحيح !! لنترجم هذا الامر لنعرف صحتة من خطأه ... الامر يقول اقفز من نهاية الملف الذي يؤشر عليه fp بمقدار صفر بايت . إذاً سيكون المؤشر عندها على نهاية الملف و ليس على آخر سجل و لنجعله يقف على آخر سجل سنغير الامر كالتالي : fseek ( fp, - sizeof(RECORD) , SEEK_END ) ; يعني علمنا الآن ان امقدار السالب يعمل على الإرجاع للخلف .
أما الان سنأخذ الدالة : long ftell ( FILE *File_pointer ) ; و هي تعطينا عدد البايتات من بداية الملف حتى موضع مؤشر الملف, ومن اهم إستخداماتها هي معرفة عدد السجلات في الملف و لنأخذ هذه الدالة التي أنشأناها كمثال لهذه العملية : int size ( FILE *fp) { int c;
fseek( fp, 0, SEEK_END) ; c = ftell(fp) ; c = c / sizeof(RECORD) ; return c ; } وهذه الدالة تعيد لنا عدد السجلات في الملف و اعتقد انها قد اوضحت جيداً كيفية إستعمال الدالة ftell .
والان لنأخذ مثال عام على الملفات العشوائية و تبين كيفية القرائة و الكتابة من الملف و تبين كيفية إستخدام الدالة size التي كتبناها أعلاه و أليكم هذا المثال: #include "stdio.h" #include "stdlib.h" //------------------------------------- struct data { int id; float gpa; }; //------------------------------------- int size(FILE *fp) { int c;
fseek(fp, 0, SEEK_END); c = ftell(fp); c = c / sizeof(struct data); return c ; } //------------------------------------- void readrec(struct data *r) { printf("n Enter the ID No: "); scanf("%d",&r->id); printf("n Enter the GPA: "); scanf("%f",&r->gpa); } //------------------------------------- main() { FILE *fp; struct data r; int ch=0 ;
fp=fopen("struct.txt","w");
printf("n Enter (1)to write. (0)to EXIT."); scanf("%d",&ch);
while(ch!=0) { readrec(&r);
fwrite(&r,sizeof(struct data),1,fp); system("cls"); printf("n Enter (1)to write. (0)to EXIT."); scanf("%d",&ch); }
fclose(fp);
fp=fopen("struct.txt","r");
while((fread(&r,sizeof(struct data),1,fp)) != 0) { printf("nID:%dttGPA:%.2f",r.id,r.gpa); }
printf("nnnThe File Contane: %d Record..",size(fp));
fclose(fp); printf("nn");
}
و للزيادة أيضاً هناك الدالة : remove(char *file_name) ; و تعطى هذه الدالة String الذي هو إسم الملف أو مكانه و تقوم هذه الدالة بحذف الملف من الجهاز . ملاحظه:أي دالة يكون أحد البراميتر التي ترسل لها هو إسم ملف مثل fopen أو remove نستطيع إرسال اسم الملف كــ Path أي هكذا:remove("C:\talal\talal.txt");بشطر أن نكتب بدل العلامة '' ----> '\' كما هو موضح في الأعلى.
آمل أني قد وفقت في الشرح و لا تنسونها من دعائكم ,,, | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى الأحد أبريل 19, 2009 3:35 am | |
| بسم الله الرحمن الرحيم
السجلات في سي Structures in C
قبل البداء و الخوض في موضوع السجلات في لغة سي سنتطرق إلى خاصية في لغة سي و هي عبارة عن تغيير النوع ( type casting )
عن طريق الامر typedef و هي خاصية تعريف نوع من نوع آخر, كالتالي:
typedef النوع المغير له النوع الاصلي ;
مثلاً نريد ان تعمل الكلمة INT كالنوع int تماماً و سيكون ذلك بالامر:
typedef int INT;
هنا نستطيع ان نقول :
INT a;
و سيوكن تماماً مثل :
int a;
و لنأخذ هذا الكود على سبيل المثال و به فكرة جميلة تقريباً هي فكرة النوع string في سي++ ولو أن الامر string في سي++ عبارة عن كلاس و به الكثير من الدوال المسانده و تحميل المتغيرات و غيرها من هذه الأمور و لكن لنطالع هذا المثال:
#include "stdio.h" #include "string.h"
typedef char* string;
main() { string a;
a = (string) malloc(sizeof(char));
strcpy(a, "talal");
printf(a); }
لاحظ انه في السطر السادس عرفنا المتغير a من نوع string و قد جعلنا الــ string مكافئة للامر char* أي جعلنا string عباره عن مؤشر إلى char ( سلسلة حرفية ) و قد قمنا بعمل هذا كله في السطر الثالث, و لا يمكننا ان نستخدم مؤشر لحروف char* بدون حجز قيمة لها في الذاكرة و قد عملنا ذلك في السطر السابع, و بعد ذلك اسندنا قيمة للــ string و طبعناها في السطرين الثامن و التاسع على التوالي.
و لربما تتسائل ما فائدة هذا الشئ و ماهي علاقته في موضوع السجلات و لكننا سنتناول هذا الموضوع قريباً في هذا الدرس.
_________________________________________________________________________________
* كيفية تعريف السجل في لغة سي: أولاً لابد ان نعلم ان كلمة struct كلمة محجوزه في لغة سي و سي++ , و نستطيع تعريف السجل كالتالي:
struct (إسم السجل) { أعضاء السجل };
- طبعاً هذه الطريقة هي أحدا الطرق التي تستطيع تعريف السجل بها.
فلو اردنا ان نعرف سجل إسمه data و يحتوي على إسم من نوع char* و العمر من نوع int إذا سيكون التعريف كالتالي:
struct data { char namr[30]; int age; };
و تبعاً لهذا التعريف سيكون السجل data نوع كأي نوع آخر مثل int, floar, char,… . و لتعريف متغير من نوع السجل نعرفه كالتالي:
strcut اسم المتغير اسم السجل ;
فلو اردنا ان نعرف متغير student من السجل data أعلاه فسنعرفه كالتالي:
struct data student ;
* كيفية الوصول لأعضاء السجل : الأمر بسيط جداً و هو كالتالي :
(عضو السجل).(المتغير من نوع السجل)
فلو اخذنا السجل data و عرفنا منه متغير student كالتالي :
struct data student ;
الان المتغير student يتكون من قسمين و هما قسمي السجل name و الــ age الموجوده في السجل data و سنصل لعضوين name و age كالطريقة اعلاه هكذا:
student.name & student.age
الآن لدينا متغيرين الاول student.name من نوع char* و الثاني student.age من نوع int إذا استطيع ان اقول :
student.age = 16 ; strcpy(student.name, "Talal");
و لنأخذ هذا المثال على الإدخال و الإخراج في السجل :
#include struct data { char namr[30]; int age; };
int main() { struct data student;
printf("nPlease Enter The name and the age: "); scanf("%s%d",student.namr, &student.age);
printf("nName:%s, Age:%dnn",student.namr, student.age);
return 0; }
طبعاً في المثال السابق قمت بتعريف السجل خارج الــ main أي Global و هذا الذي افضله, و يمكن ان نقوم بتعريف السجل داخل الــ main أو داخل أي دالة أخرى.
- و الآن نأتي لفائدة الجملة typedef مع السجلات : لقد ذكرنا في هذا الدرس ان السجل بعد تعريفة يكون نوع مثل أي نوع من int, char, float ... و ذكرنا أيضاً أن الجملة typedef تعرف نوع من نوع. و تعريف متغير من سجل متعب نوعاً ما أو بالأصح غير مألوف, و أكيد أن السي لن تترك شئ كهذا بدون عملية التسهيل لمحبيها و لكن السي جعلت هناك طريقتين و لنبداء بالأولى منها:
- الطريقة الأولى: عند تعريف السجل التالي:
struct data { char name[30]; int age; };
الآن بإستخدام الجملة typedef سنعرف نوع نختار لإسمة من نوع السجل struct data كالتالي:
typedef struct data Mydata ;
و إذا اردت ان اعرف student من السجل اعلاه عند كتابة الجملة
typedef struct data Mydata ;
سيكون كالتالي :
Mydata student ; | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى الأحد أبريل 19, 2009 3:36 am | |
| بدون كلمة struct في كل مره نعرف متغير من السجل لأن Mydata أصبح نوع مثله مثل:struct data.
- الطريقة الثانية : و هذه هي الطريقة المحبذه لي و الاسلم و هي كالتالي : typedef struct { (الأعضاء) }إسم السجل ; فلو اردنا ات نعرف سجلنا السابق data بهذه الطريقة سيكون كالتالي: typedef struct { char name[30] ; int age; }data ; و إذا أردنا ان نعرف المتغير student من ( النوع ) data نعرفه كالتالي : data student ; هل وضحت سهولت إستخدام typdef بدل من التعريف العادي ؟! طبعاً في باقي الدرس سوف نستخدم هذه الطريقة بدل من التعريف العادي.
•السجلات المتداخلة: في كثير من الأحيان تحتاج إلى وضع سجل داخل سجل, مثلاً في السجل السابق data كان هناك العضو name و لو اردنا ان يكون هذا العضو سجلاً بحد ذاته يحتوي على عنصرين هما الاسم الاول و الاسم الثاني سنقوم بتعريف السجلات الاصغر و الداخلية إلى أن نصل إلى السجل الأكبر فلو اردنا ان نمثل الفكرة السابقة على شكل كود للسي سنعرف السجل الاصغر و هو الذي يحتوي على الاسم الأول و الاسم الثاني هكذا : typedef struct { char first[15] ; char last[15] ; }name ; و من ثم سنعرف السجل الأكبر الذي يحوي الاسم و العمر الذي اسميناه في السابق data هكذا: typedef struct { name std_name ; int age ; }data ; لاحظوا ان العضو الأول من السجل data عبارة عن سجل إسمة std_name من نوع name .
و يبقى السؤال هنا إلى أنه كيف سنصل للأعضاء الداخلية للسجل std_name عند تعريف متغير student من نوع data ؟! الجواب بسيط جداً و هو كالتالي : strcpy(student.std_name.firsr, "Talal") ; strcpy(student.std_name.last, "Abdullah") ; إذا كلما اردنا ان نصل إلى العضو نضع إسم المتغير ثم '.' ثم العضو ( إذا كان العضو الاول سجل ) و هكذا ...
•مصفوفة السجلات :
لقد علمنا ان السجل نوع كأي نوع من انواع البيانات, لذلك من الممكن ان يكون السجل مصفوفة ايضاً و الطريقة سهله جداً كالتالي: structure_name var[NUM] ; فلو اخذنا السجل : typedef struct { char name[30]; int age; }data; و اردنا ان نعرف مصفوفة من نوع data يسكون كالتالي: data student[100] ; طبعاً العدد 100 إختياري . و نحن في السابق أخذنا نوع student من السجل data و سيكون سجل واحد و لكن هنا سيتضح اهمية السجلات فعندما عرفنا student كمصفوفة من نوع data أصبح كأنه لدينا 100 طالب و كل عنصر في المصفوفة عباره عن سجل بحد ذاته. و للوصول إلى محتويات السجل نتبع الطريقة التاليه : student[indix].name & student[indix].age … و غالباً تستخدم مصفوفة السجلات إذا كان العدد محدداً أما إذا كان العدد غير محدد نستخدم طريقة من طريق الــ Data Structure منها اللنك لست درسنا القادم.
•السجلات و المؤشرات :
و نعيد و نكرر انه بعد تعريف السجل يصبح نوع كأي نوع آخر من انواع البيانات, إذا يمكن للسجل ان يكون مؤشر ( Pointer ) و العمليه كالتالي: typedef struct { char name[30]; int age; }data; و سنعرف مؤشر للسجل كالتاالي : data *s ; فالنأخذ البرنامج التالي للتوضيح : #include #include
typedef struct { char name[30]; int age; }data;
int main() { data *s, std;
s = &std; // Assign std to s
strcpy(std.name,"Talal"); std.age = 20;
printf("std.name = %s, std.age = %dnn",std.name, std.age); printf("s->name = %s, s->age = %dnn",s->name, s->age); return 0; } طبعاً نلاحظ الآن ظهور العلامة '->' بدل من النقطة عند إستخدام المتغير s ؟! لماذا ؟ الجواب : لأنه مؤشر لسجل و مؤشر السجل يستعمل في لغة السي و السي++ هذه العلامة بدلاً من العلامة '.' , و هذا من الاختلافات التي تميز لغة السي و السي++ عن باقي اللغات مثل الجافا و الدلفي فهي لا تفرق إذا كان مؤشر أو لا . إذا قاعدة في لغة سي و سي++ هي إنه عند إستخدام مؤشر لسجل نستخدم -> بدلاً من '.' طبعاً هناك طريقة أخرى و هي هكذا:(*s).name بدل s->nameطبعاً العلامة '->' أسهل .
| |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى الأحد أبريل 19, 2009 3:37 am | |
| •السجلات و الدوال :
عند إستخدام السجلات مع الدوال إما أن يكون السجل مرسل للدالة أو إما ان يكون معاد من الدالة و إما ان يكون مستخدم في ضمن الدالة . الحالة الأخيره معروفة و عملنا عليها في السابق داخل الدالة main و الــ main دالة اصلاً. أما الحالتين الأولى و الثانيه فسنتطرق لها الآن.
- أولاً السجل معامل من معاملات الدالة : أي أن نرسل السجل للدالة و الدالة تقوم بالعمليات على هذا السجل مثلاً: طباعة, معالجة, ... إلخ و لنأخذ هذا المثال و نشرحة بعد قرائة المثال جيداً:
//----------------------------------------------------------
#include #include //---------------------------------------------------------- typedef struct { char name[30]; int age; }data; //---------------------------------------------------------- void display(data r); //---------------------------------------------------------- main() { data std;
strcpy(std.name,"Talal"); std.age = 20;
display(std); }
//---------------------------------------------------------- void display(data r) { printf("(r.name) = %s,n(r.age) = %dnn",r.name, r.age); }
//----------------------------------------------------------
و في هذا المثال لقد كتبنا رأس الدالة كالتالي:
void display(data r) ;
أي أنه يوجد دالة إسمها display تستقبل السجل r من نوع data ولا تقوم بإرجاع شئ. و عند إستدعاينا الدالة و بعد إعطائها القيم كالتالي:
display( std ) ;
ارسلنا لها السجل كاملاً لتسقبله و تطبعه في جسم الدالة display .
و لنأخذ مثالاً آخر لإعطاء قيم السجل في الدالة و طبعاتها في الــ main :
#include #include
typedef struct { char name[30]; int age; }data;
void assign(data *r);
main() { data std;
assign(&std); printf("std.name = %s,nstd.age = %dnn",std.name, std.age); }
void assign(data *r) { strcpy(r->name,"Talal"); r->age = 20; }
و في هذا المثال كتبنا رأس الدالة ( التعريف ) هكذا :
void assign(data *r) ;
و جعلنا r كمؤشر لأن قيمة r ستتغير ( نحن نريد ذلك ) لإعطائها القيم. و قمنا بإرسال السجل كالتالي :
assign( &std ) ;
لأن الدالة assign تستقبل مؤشر للسجل لذلك نرسل لها عنوان السجل و ليس السجل نفسه. و داخل الدالة assign إستخدمنا r->name و r->age لأن r في الدالة مؤشر ( و مع المؤشرات نستخدم -> بدلاً من '.' ) .
- ثانياً إرجاع سجل من الدالة : أي أن الدالة تقوم بإرجاع السجل عند الانتهاء من عملها و نستطيع تغيير البرنامج السابق ليرجع السجل بدلاً من إرسال السجل كعنوان و إستقباله كمؤشر. سيتغير البرنامج ليصبح هكذا :
#include #include
typedef struct { char name[30]; int age; }data;
data assign(void);
main() { data std;
std = assign(); printf("std.name = %s,nstd.age = %dnn",std.name, std.age); }
data assign(void) { data r; strcpy(r.name,"Talal"); r.age = 20; return r; }
و هنا عرفنا الدالة كالتالي :
data assign(void) ;
أي أن الدالة assign لا تستقبل شئ و القيمة المرجعة من الدالة هي عباره عن سجل من نوع data . و قمنا بإستدعا الدالة هكذا :
std = assign() ;
أي أن القيمة المرجعة من الدالة ستوضع قيمتها في السجل std . و في جسم الدالة assign عرفنا المتغير r من نوع سجل data و أعطينا لها قيم و قمنا بإرجاع هذا السجل من الدالة عن طريق الامر
return r ; | |
| | | ملك الظلام
المشرف العام...}
| موضوع: رد: دوره كامله فى لغه السى الأحد أبريل 19, 2009 3:37 am | |
| •إسناد السجلات :
نستطيع ان نسند سجلين لبعضهما البعض لكن شريطة أن يكونا من نفس النوع . فلو أنشئنا السجل التالي :
typedef struct { char name[30]; int age; }data;
و عرفنا منه متغيرين هكذا :
data a, b ;
و أعطينا المتغير a هذه القيم :
strcpy( a.name, "talal" ) ; a.age = 20 ;
فبإمكاني ان اسند للمتغير b نفس محتويات المتغير a عن طريق هذه الجملة :
b = a ;
•إعطاء السجل أكثر من إسم أو إعطائه المتغيرات لحظة بناء السجل :
فلو كان لدينا السجل التالي :
typedef struct { char name[30]; int age; }data, MyData ;
أستطيع أن اعرف المتغيرات سواء كان بــ data أو بــ MyData و كلها صحيحه. فلو قلت :
MyData student ;
أو
data student ;
كانا سواء . و هذا هو إعطاء السجل اكثر من إسم , أما إعطاء السجل أكثر من متغير لحظة بناء السجل و بدون تحديد إسم للسجل يكون كالتالي :
struct { الاعضاء }إسم المتغير ;
فلو اردنا ان نعمل على 100 طالب فقط و متأكيدن أن العدد لن يزيد عن 100 طالب فالأفضل بناء السجل هكذا :
struct { char name[30] ; int age ; } student;
و هكذا يصبح student متغير و نقول :
student. name & student. age
طبعاً إلى الآن تعلمنا كيف ننشئ السجل بثلاثة طرق بقي الطريقة الرابعة و الاخيره و هي كالتالي:
struct (إسم السجل) { الاعضاء }(المتغيرات) ;
أي نستطيع أن ننشئ سجل الطالب الذي تكرر علينا كثيراً بالطريقة الرابعه هكذا :
struct data { char name[30] ; int age ; } student;
هنا student سيكون متغير و data هو إسم السجل و هنا نستطيع في كل مرة نحتاج فيها لإنشاء سجل أن نشئ سجل بالطريقة :
struct data VAR ;
و إستعمال student كمتغير جاهر غير محتاج للتعيرف .
** نقطة أخيره : في كل جزئ من أجزاء البرامج التي كتبتها و التعريفات و إنشاء المتغيرات في الدرس إستخدمت غالباً التعريف التالي :
typedef struct { char name[30]; int age; }data;
و أنشئت المتغيرات كالتالي :
data VAR ;
ممكن تغييره إلى
struct data { char name[30] ; int age ; };
و لكن تعريف المتغير سيكون :
struct data VAR ;
و قد نوهت على ذلك من قبل و لكن الذكرى تنفع المؤمنين.
مع تحياتي ,,, و إلى اللقاء في الدرس القادم بإذن الله .
| |
| | | Howba
عضو جديد...}
| موضوع: رد: دوره كامله فى لغه السى الجمعة أكتوبر 25, 2013 5:59 pm | |
| شكرا على الشرح الوافي ومزيد من التقدم والارتقاء وجزاكم الله خير
| |
| | | | دوره كامله فى لغه السى | |
|
مواضيع مماثلة | |
|
| صلاحيات هذا المنتدى: | لاتستطيع الرد على المواضيع في هذا المنتدى
| |
| |
| تصويت | | هل اعجبكم هذا الاستايل؟ | نعم ,انه افضل بكثير من الاول | | 80% | [ 4 ] | لا بأس به , لكن الاول كان افضل | | 20% | [ 1 ] | هذا الاستايل سىء , الاول افضل | | 0% | [ 0 ] |
| مجموع عدد الأصوات : 5 |
|
أفضل 10 أعضاء في هذا المنتدى | |
تدفق ال | |
مواقع صديقة | |
|