قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2013, 03:07 AM المشاركة 33   
افتراضي



1-7-5 بناء switch / case :
تستخدم عبارة switch / case فى تنفيذ عبارة أو مجموعة عبارات , يتم اختيارها عن طريق "قيمة تعبير"expression.
شكل هذه العبارة كما يلى :

كود:
switch (expression) { case const1: statement1; statement2; case const2: statement3; ………… statement4; case constx: statement5; statement6; default : statement7; statement8; }


يتم تقييم التعبير expression ثم يتم مقارنة قيمته مع الثوابت ( const1,const2,…constx) . يبدأ التنفيذ من عند العبارة التى تلى الثابت الذى يطابق قيمة التعبير expression . الثوابت يجب أن تكون قيم لأعداد صحيحة integer أو أحرف characters . جميع العبارات التى تلى الثابت المطابق سوف يتم تنفيذها , حتى نهاية بناء switch . ولأن ذلك ليس من الطبيعى أن يكون مرغوب فيه , يمكن أن تستخدم عبارات break لإنهاء كل مجموعة من العبارات للسماح لسريان البرنامج بالخروج من بناء switch يشكل آمن .
الحالة الافتراضية default اختيارية , لكنها تسمح للعبارات التى تحتاج للتنفيذ عندما لا يكون هناك تطابق للثوابت .
مثال:

كود:
#include <16F877.h> //register definition file for #fuses HS,NOWDT //a Microchip PIC16F877 #use delay(clock=10000000 //setup the RS232 port for standard output #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8) #include <stdio> void main(void) { unsigned char c ; port_b_pullups(TRUE); set_tris_b (0xFF) ; // set port B for all input while(1) { c = input_b( ) & 0xF ; // read the lower nibble of port B switch( c ) { case '0' " case '1' : // you can have multiple cases case '2' : // for a set of statements case '3' : printf("c is a number less than 4 \n"); break; // break to skip out of the loop case '5' : // or just one is ok .. printf("c is a 5 \n") ; break; default : printf("c is 4 or is > 5 \n"); } } }

هذا البرنامج يقرأ القيمة من المنفذ port B , ويخفى الأربعة بتات العليا . يتم مقارنة قيمة النبل المنخفض من المنفذ port B مع الثوابت بعبارة case . إذا كان الحرف "0" أو "1" أو "2" أو "3" يتم طباعة النص "c is a number less than 4" إلى المخرج القياسى . إذا كان الحرف "5" يتم طباعة النص
""c is a 5 إلى المخرج القياسى . إذا لم يكن الحرف أى من هذه الحالات , يتم تنفيذ العبارة الافتراضية وطباعة "c is 4 or is > 5" . بمجرد أن يتم تنفيذ عبارات الحالة المناظرة , سوف يعود البرنامج إلى قمة حلقة while والتكرار .

1-7-6 بناء عبارات Break و Continue و Goto :

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2013, 04:44 PM المشاركة 34   
افتراضي


1-7-6 بناء عبارات Break و Continue و Goto :
تستخدم هذه العبارات فى تعديل تنفيذ عبارات for , while, do/while switch/case .

عبارة Break :
تستخدم عبارة break للخروج من عبارة for أو do/while أو switch/case . إذا كانت العبارات متداخلة واحدة داخل الأخرى , فإن عبارة break سوف تخرج فقط من مجموعة العبارات الراهنة .

البرنامج التالى سوف يقوم بطباعة قيمة المتغير "c" إلى الخرج القياسى , كلما استمر المتغير "c" فى التزايد من "0" إلى "100" , بعد ذلك يتم إعادة تهيئته بالقيمة "0" .
فى حلقة while الداخلية : يتم تزايد المتغير "c" حتى يصل القيمة "100" , وبعد ذلك يتم تنفيذ عبارة break . عبارة break تتسبب فى خروج تنفيذ البرنامج من حلقة while الداخلية ويستمر التنفيذ لحلقة while الخارجية .
فى حلقة while الخارجية : يتم تحديد المتغير "c" بالقيمة "0" , ويعود التحكم إلى حلقة while الداخلية . تستمر هذه العملية فى تكرار نفسها إلى الأبد .


كود:
#include <16F877.h> //register definition file for #fuses HS,NOWDT //a Microchip PIC16F877 #use delay(clock=10000000 //setup the RS232 port for standard output #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
#include <stdio>
void main(void) { int c ;
while(1) { while(1) { if (c >100) break ; // this will take us out of this while +cc ; #include <16F877.h> //register definition file for #fuses HS,NOWDT //a Microchip PIC16F877 #use delay(clock=10000000 //setup the RS232 port for standard output #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
#include <stdio>
void main(void) { int c ;
while(1) { while(1) { if (c >100) break ; // this will take us out of this while +cc ; //block , clearing c… printf("c = %d \n" , c ); } c = 0 ; //clear c and then things will begin again . }// printing the values 0 – 100 , 0 – 100 , etc } //block , clearing c…
printf("c = %d \n" , c ); } c = 0 ; //clear c and then things will begin again . }// printing the values 0 – 100 , 0 – 100 , etc }

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2013, 04:49 PM المشاركة 35   
افتراضي


عبارة Continue :
عبارة continue سوف تسمح للبرنامج ببدء التكرار التالى لحلقة while أو do/while أو for . عبارة continue تشبه عبارة break فى أن كلاهما يوقف تنفيذ عبارات الحلقة عند هذه النقطة . الاختلاف هو أن عبارة continue تبدأ الحلقة مرة أخرى , من القمة , فى حين أن عبارة break تخرج من الحلقة تماما .
مثال :
كود:
#include <16F877.h> //register definition file for #fuses HS,NOWDT //a Microchip PIC16F877 #use delay(clock=10000000 //setup the RS232 port for standard output #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8) #include <stdio> void main(void) { int c ; while(1) { c = 0 ; while(1) { if (c >100) continue ; // this will cause the printing to // stop when c > 100 , because the // continue will cause the rest of // this loop to be skipped +cc ; printf("c = %d \n" , c ); // no code after the continue // will be executed } } }
فى هذا المثال , قيمة المتغير "c" سوف يتم طباعتها حتى تصل إلى القيمة "100" . عند هذه النقطة سوف يبدو البرنامج كما لو كان أنه قد توقف , فى حين أنه فى الحقيقة , مازال يعمل . ببساطة يتم تخطى عبارات التزايد والطباعة printf( ) .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2013, 04:52 PM المشاركة 36   
افتراضي


عبارة Goto :
تستخدم عبارة goto للتنفيذ الحرفى "لقفز" jump تنفيذ البرنامج إلى "لافتة" label كعلامة لتنفيذ العبارة التالية . هذه العبارة غير منظمة وصارمة , لكن فى النظام المدمج فإنها قد تكون إسلوب جيد لتوفير بعض الكود والذاكرة المستخدمة . "اللافتة" label يمكن أن تكون قبل أو بعد عبارة goto بالدالة .
شكل عبارة goto كما يلى :
كود:
goto identifier ; …….. identifier : statement ; or identifier : statement ; …… goto identifier ;


اللافتة label تكون اسم صالح بلغة السى أو معرف متبوع بالنقطتين ( : ) .


كود:
#include <16F877.h> //register definition file for #fuses HS,NOWDT //a Microchip PIC16F877 #use delay(clock=10000000 //setup the RS232 port for standard output #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8) #include <stdio> void main(void) { int c , d ; while(1) { start_again : c = 0 ; d = -1 ; while(1) { if (d == c) goto start_again ; // ( stuck? Bail out !) d = c ; // d will remember where we were if(c > 100) continue ; // this will reinitiate this // while loop ++c ; // d will checked to see if c is stuck Printf("c = %d \n" , c ) ; // because c won't change ( > 100 !!) } } }

فى هذا المثال , يتم تهيئة c و d لقيم مختلفة .
العبارة if(d==c) تختبر القيم وطالما أنهما غير متساويين , فإن التنفيذ يستمر خلال التخصيص d = c .
إذا كانت c أقل من أو تساوى "100" , يستمر التنفيذ خلال عبارة تزايد c .
يتم طباعة قيمة c وتبدأ حلقة while من جديد .
قيم c و d سوف تستمر فى الاختلاف بمقدار "1" حتى تصبح c أكبر من "100" , عندما تكون قيمة c بالقيمة "101" , فإن عبارة continue سوف تتسبب فى تخطى عبارات تزايد c والطباعة .
إذا اصبحت if(d ==c) "صواب" TRUE , لأنهما الآن متساويين , وسوف تتسبب goto فى قفز تنفيذ البرنامج إلى "اللافتة" start_again . وتكون النتيجة طباعة قيمة c من "0" إلى "100" مرة تلو الأخرى .

1-8 الدوال Functions :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2013, 05:22 PM المشاركة 37   
افتراضي


1-8 الدوال Functions :
الدالة هى "تغليف" لمجموعة (بلوك) عبارات والتى يمكن أن تستخدم أكثر من مرة فى البرنامج . بعض اللغات تشير إلى الدوال بمسمى "البرامج الفرعية" subroutines أو "الإجراءات" procedures . عامة يتم كتابة الدوال لتجزئة عناصر عمليات البرنامج إلى أجزاء رئيسية . هذا يسمح للمبرمج بتصحيح كل عنصر ثم استخدام هذا العنصر مرة تلو الأخرى .
أحد المميزات الأساسية لاستخدام الدوال هى تطوير (إنشاء) "مكتبة" library . بمجرد إنشاء الدوال التى تنفذ مهمة معينة , يمكن حفظها واستخدامها فيما بعد لتطبيق آخر , أو حتى بمبرمج آخر . هذا يوفر الوقت ويحفظ الاستقرار , لأن الدوال التى تم إنشاؤها قد استخدمت وتم إعادة إستخدامها , واختبارها , وإعادة اختبارها .
الدالة قد تقوم بأداء مهمة معزولة (مستقلة) لا تتطلب أى "بارامترات" parameters . كما أن الدالة قد تتقبل بارامترات ليكون لديها دليل عند إجراء المهمة المصممة لها . الدالة قد لا تتقبل فقط ولكن علاوة على ذلك فإنها قد "تعيد أو ترجع" return قيمة . حتى إذا كانت الدالة تتقبل بارامترات متعددة , إلا أنها يمكنها فقط إعادة قيمة واحدة . فيما يلى بعض الأمثلة :

كود:
sleep( ) ; // this function performs a 1 second delay , // with no parameters, in or out
printf("this is a parameter %d" , x ) ; // printf will print its parameters
c = getchar( ) ; // getchar will return a value from the // standard input



الشكل القياسى للدالة كما يلى :

كود:
type function_name( type param1 , type param2 , …) { statement1 ; statement2 ; ………….. statementx ; }


الصيغة : "النوع" type , يتبعه "الاسم" name , يتبعه " الأقواس" ( ) . الأقواس , أو معامل الدالة , تشير للمترجم إلى "الاسم" name المطلوب تنفيذه كدالة .
نوع الدالة أو بارامتراتها يمكن أن تكون أى نوع متغير صحيح مثل int , char , float . النوع يمكن أيضا أن يكون "فارغ" void. النوع "الفارغ" void نوع صحيح ويستخدم للدلالة عدم وجود بارامتر أو عائد . النوع الافتراضى للدالة هو "العدد الصحيح" int .
لذلك فإن إعلان الدالة قد يكون بالشكل التالى :
كود:
unsigned char getchar(void) { while ( ( PIR & 0x20) == 0 ) ; // wait for character to arrive return RCREG ; // return its unsigned char value to the caller }


فى هذا المثال , الدالة getchar( ) لا تتطلب أى بارامتر وتعيد قيمة unsigned char عند تمام تنفيذها . الدالة getchar( ) هى واحدة من دوال المكتبة الكثيرة والمتوفرة بمترجم لغة السى والمتاحة لاستخدام المبرمج والتى سوف نناقشها تفصيليا وبعمق فيما بعد .
1-8-1 النموذج الأولى وتنظيم الدالة :


الصورة الرمزية محمود جابر
محمود جابر
:: مهندس متواجد ::
تاريخ التسجيل: May 2007
الدولة: مصر
المشاركات: 61
نشاط [ محمود جابر ]
قوة السمعة:
قديم 21-02-2013, 05:40 PM المشاركة 38   
افتراضي


بارك الله فيك


الصورة الرمزية moutcha
moutcha
:: مهندس متواجد ::
تاريخ التسجيل: Nov 2005
الدولة: المغرب
المشاركات: 181
نشاط [ moutcha ]
قوة السمعة:
قديم 21-02-2013, 06:35 PM المشاركة 39   
افتراضي


مزيد من العطاء


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2013, 08:24 PM المشاركة 40   
افتراضي


السلام عليكم

شكرا جزيلا لجميع الأخوة المشاركين

مع تمنياتى بدوام التوفيق



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:07 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)