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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-10-2011, 04:08 AM المشاركة 9   
افتراضي



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



if (a> b) b = a;

// if the expression a> b is true, the variable "b" assumes the value of "a"

if (b <a) b = 10;

// if the expression a <b is true, the variable "b" assumes the value 10

if (a != b) b = 55;

// if the expression a != b (differ) is true, the variable "b" assumes the value 55

if ((a + b)> (b + d)) b + +;

// if the expression (a + b)> (b + d) is true, the variable "b" is incremented by one.








ملاحظات هامة :
عامل التخصيص فى لغة السى هو علامة التساوى (=) , عامل "مقارنة التساوى" يختلف عن علامة التساوى وهو (==) . لاختبار شرط لمتغير معطى نستخدم عامل مقارنة التساوى (==) كما يلى :



if (a == b) c = 10;





وهذا يختلف عن :


if (a = b) c = 10;





الشرط (a == b) يقوم بعمل مقارنة بين متغيريين , إذا كان الشرط صواب يتم تنفيذ c=10 .


فى أمر if الثانى , يوجد تعبير تخصيص بالتساوى (a = b) . عندما يقوم المترجم بترجمة هذا الأمر فأنه فى البداية يخصص للمتغير a القيمة الموجودة بالمتغير b وبعد ذلك يختبر الشرط فإن كانت النتيجة صواب يتم تنفيذ c = 10 .

لإضافة بلوكات من البرامج فى أمر if من الضرورى استخدام قوس الفتح (البداية) ({) وقوس الغلق(النهاية) (}) .
مثال :

if (PORTB == PORTC)
{ // Command block
a + +;
portb.f0 = 1;
d = c + e;
}





بناء if, else, if


اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-10-2011, 11:18 AM المشاركة 10   
افتراضي


بناء جملة if, else, if
يمكننا إنشاء ترتيبات متداخلة من خلال بناء جملة if, else, if . يتم إنشاء الترتيبات ببساطة عن طريق وضع أبنية جملة if متداخلة nested مع أبنية جملة if أخرى . الشكل العام لها كما يلى :





if (condition1) statement 1; else
if (condition2) statement 2; else
if (condition3) statement 3; else
if (condition4) statement 4;





مثال :



void main () {


int count = 10;
int signal = 5;


if (count> sign) + sign ++; else
if (count <sign) -- sign; else
if (count == sign) sign = 0;

}






يمكننا أيضا تنفيذ بلوكات باستخدام الأقواس ({and}) .

مثال :













void main () {


int count = 10;
int signal = 5;

if (counter> signal)
{ // Use command blocks in if-else-if
signal + +;
counter = 20;
}
else
if (count <sign)
{
sign--;
counter = 15;
}
else
if (count == sign) sign = 0;


}






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

الأمر Switch

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-10-2011, 11:22 AM المشاركة 11   
افتراضي


الأمر Switch
الأمر Switch "التحويل أو التبديل" هو الأوضح والأكثر أناقة لاتخاذ القرار ضمن البرمجة بلغة السى . وخلافا للأمر if "بناء switch لا يقبل التعبيرات expressionلاتخاذ قرار لكن يقبل فقط الثابت "constant.

switch (variable)
{
case constant1:
Statement 1A;
Statement 1B;
Statement 1N;
break;

case constant2:
Statement 2A;
Statement 2B;
Statement 2N;
break;

default;
Statement _default;
}






تتم المقارنة بين "قيمة المتغير variable الموجود بعبارة "switch مع "الثابت constant المحدد بجملة case" . إذا كان المتغير والثابت لهما قيم متساوية , يتم تنفيذ الأوامر التى تلى جملة case الموجود بها هذا الثابت . إذا لم يتواجد أى ثابت بنفس قيمة المتغير , عندئذ سوف يتم تنفيذ الأوامر المحدد بالجملة الافتراضية default.

مثال :




void main () {

int count = 10;
int signal = 5;

switch (counter)
{

case 2: signal + +;
break;

case 1: signal = 2;
break;

case 10: count--;
break;

default: signal = 0;
}




}









فى هذا المثال يتم مقارنة المتغير counter بالثوابت 2 و 1 و 10 . عندما تكون قيمة المتغير counter بالقيمة 10 , على سبيل المثال , عندئذ فإن الأمر الذى يجب تنفيذه هو (case 10: count--; ) (تناقص المتغير counter بواحد ) .

جملة Break مهمتها إنهاء تتابع الأوامر لجمل case.

جملة default هى آخر أمر فى تعبير switch .


الصورة الرمزية احمد الربعي
احمد الربعي
:: مهندس متميز ::
تاريخ التسجيل: Jun 2011
المشاركات: 591
نشاط [ احمد الربعي ]
قوة السمعة:
قديم 08-10-2011, 02:39 PM المشاركة 12   
افتراضي


ربنا يخليك ويبارك فيك -- انت اكثر من رائع يا بشمهندس -- لك مني كل التقدير والاحترام -- واتمني ان تكمل الموضوع لكي يستفيد منه الجميع -- وانا من محبي لغة السي جدا


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 09-10-2011, 02:14 AM المشاركة 13   
افتراضي


أبنية (هياكل) التكرار Repetition Structures
مقدمة :
الغرض من هذه الأبنية هو التكرار لمرة واحدة أو لعدة مرات لعبارة statementمعطاه أو مجموعة ( بلوك) من العبارات . يوجد فى لغة السى فى الأساس ثلاثة أنواع من أبنية التكرار هى :
· for
· While
· Do – While




يستخدم بناء for أساسا فى التكرار "لعدد محدد من المرات" (أى تكرار محدد) باستخدام "متغير تحكم كعداد" .
يستخدم بناء while أساسا لتكرار مجموعة من التعليمات طالما أن "شرط" صواب true (أى تكرار مشروط) .
بناء Do – While مثل While يختلفان فقط فى "وقت تحليل أو اختبار الشرط" .

لنتناول كل تكرار على حدة :

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

شكل بناء أمر for :
For (initialization; condition; increment) statement;

Or

For (initialization; condition; increment)
{
...
command A1
command A2
...
}






حيث :
initialization: هو تعبير يستخدم لتهيئة متغير التحكم فى الحلقة للبدء .
condition: هو الشرط الذى يحدد استمرار تكرار الحلقة من عدمه , طالما أن هذا الشرط صواب فسوف تستمر الحلقة فى التنفيذ .
increment: هو تزايد فى القيمة مع كل دورة تكرار للحلقة .

مثال :
int count;

for (count = 0; count = 10; count ++) PORTB = count;






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

مثال آخر :
int v, d;

for (v = 0
; v = d; v ++)

{
Command A
Command B
}






هذ المثال يعمل بالطريقة التالية :
1- تخصيص القيمة صفرللمتغير v .
2- تنفيذ الأوامر Command Aو Command B.
3- تزايد المتغير v بواحد .
4- بعد هذا التزايد يتم مقارنة القيمة الجديدة مع قيمة المتغير d ويتكررالتتابع بدءا من الخطوة رقم 2 .
5- ينتهى التكرار عندما يتحقق الشرط v = d .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 09-10-2011, 02:16 AM المشاركة 14   
افتراضي


الفائدة الرئيسية لحلقة for هى مرونتها , فهى تقبل أى تعبير صالح بلغة السى حتى لو كان هذا التعبير ليس له علاقة مباشرة بالحلقة .
المثال البسيط لتطبيق حلقة for هو إنشاء تأخيرات بزمن صغير small time delaysكما بلى :



int delay;

for (delay = 0; delay <1000; delay ++);






هذه الحلقة تسبب استمرار عملية التزايد فى المتغير delayبدءا من الصفر وحتى يساوى 1000 .

لاحظ أن قطعة البرنامج التالية صالحة للاستخدام :
for (n = 0; (n <100) && portb.f0; n ++)






فى المثال السابق يتم تزايد المتغير n 100 مرة طالما أن الطرف RB0 يظل فى الحالة المرتفعة . عندما يتحول الطرف RB0 إلى الحالة المنخفضة تنتهى على الفور الحلقة لعدم تحقق الشرط
(n <100) && portb.f0 (&& العامل المنطقى "و" ) .

مثال لبرنامج : وميض ليدات متصلة بأطراف المنفذ PORTBبالميكروكونترولر PIC.
سوف يقوم البرنامج التالى بالعد حتى 100,000 . لاحتواء هذا العدد يجب أن نستخدم متغير من النوع long ولكننا نفضل المتغير من النوع int حتى نتمكن من فهم تركيب حلقتان متداخلتان. للعد حتى 100,000 من الضرورى أن يكون لدينا متغير يعد حتى 100 وآخر يعد حتى 1000لأن (1000 * 100 = 100,000) .
كود:
/************************************************ برنامج تأخير زمنى باستخدام الحلقات المتداخلة إعداد: Eng.F.Abdelaziz http://www.eeecb.com/vb/index.php ************************************************/ void delay (void) // دالة التأخير { int count1, count2; for (count1 = 0; count1 <100; count1 ++) // حلقتان متداخلتان for (count2 = 0; count2 <1000; count2 ++); } void main () { TRISB = 0; while (1) { PORTB =0; delay (); // إستدعاء دالة التأخير PORTB =~ PORTB; // عكس حالة أطراف المنفذ delay (); } }




الأمر While


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 09-10-2011, 02:19 AM المشاركة 15   
افتراضي


ربنا يخليك ويبارك فيك -- انت اكثر من رائع يا بشمهندس -- لك مني كل التقدير والاحترام -- واتمني ان تكمل الموضوع لكي يستفيد منه الجميع -- وانا من محبي لغة السي جدا
أخى الكريم

شكرا جزيلا لك

تقدير أعتز به

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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 09-10-2011, 11:44 AM المشاركة 16   
افتراضي


الأمر While
عبارة whileهى الأمر النموذجى لإنشاء حلقات تكرار لا نهاية لها فى البرنامج .
فى بداية بناء while يتم اختبار "صحة الشرط" . إذا كانت النتيجة صواب true , يتم تنفيذ جميع (بلوك) العبارات الموجودة بداخل حلقة while . عند العودة إلى بداية الحلقة يتم اختبار "صحة الشرط" مرة أخرى , فإذا كانت النتيجة صواب true, يتم تنفيذ بلوك العبارات مرة أخرى , وهكذا حتى تنتهى حلقة while .

مثال :


void main () {

while (1) //
اختبار الشرط (هل مابين القوسين صواب؟ ) , فى هذه الحالة جواب دائما صواب
}
statement 1;
statement 2;
statement n;
}
}








مثال آخر :




void main () {

int a = 25;

while (a = 5)
{
a ++;
PORTB = a;
}
}








لاحظ أنه فى هذا المثال نتيجة شرط حلقة whileالموجود عند مدخلها : هل a=5 ؟ ... لا .. لأن a=25 كما هو فى تعريف وتخصيص المتغير a . أى أن النتيجة تكون خطأ false ولن يتم تنفيذ الحلقة حتى يكون الجواب صواب true أى حنى يكون a=5 .

الأمر do-while



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