برامج

لغة السي بالمثال [الأرشيف] - برامج نت

المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : لغة السي بالمثال


Lem_Chouaib
01-31-2008, 03:47 PM
بسم الله الرحمن الرحيم و الصلاة والسلام على أشرف المرسلين سيدنا محمد و آل بيته الطاهرين و من تبعهم بإحسان إلى يوم الدين أما بعد
إخواني الكرام تعد لغة ال C من أحسن اللغاة الحالية بل و أقواها فهي اللغة الوحيدة الخالية من الأخطاء كما أنها الغة التي كتب بها كل أنظمة التشغيل من أتقن هته اللغة فقد فتح على نفسه بابا لايقدر بثمن ولكن وللأسف تمتاز هته اللغة بصعوبتها فهي قريبة جدا من النظام و كثيرا ما يفشل الطلاب في تعلمها لأن تعلم هته اللغة ليس بالأمر السهل و لأن جل الكتب العربية و الفرنسية لم تعطي هته اللغة حقها خاصتا في مجال التطبيقات أو التمارين لأن هته اللغة لاتستطيع تعلمها من كتاب أو من طرف أستاد بل يجب عليك أن تكثر من التمارين و التطبيقات و أن تقرأ المئات من الأكواد حتى تتمكن من فهم هته اللغة لأن لغة ال C يجب و أقول يجب أن تفهم لا أن تحفظ وفهم هته اللغة لايأتي إلا بالتطبيق فمن هدا المنطلق قررت يا إخواني أن أقدم لكم مجموعة من التمارين و الأكواد مع شرحها حتى تتمكنو من فهم هته اللغة بالمثال و كما يقال بالمثال يتضح البيان .
سندرس مع بعضنا عدة أمثلة لأشهر المشاكل التي ستواجهك كمبرمج بلغة السي سنرى تمارين مع حلولها ل كل أدوات السي و سنناقش الحلول ونأخد ما يفيدنا فيها
سنركز على المفيد فقط أي سنشخص كل النقاط الصعبة في هته اللغة و نحللها لكي نستفيد منها سنبدأ ب الجمل الشرطية ثم إلى الحلقات سندرس الحلقات بالتفصيل مع حوالي 15 تمرين مع الحل ثم ننتقل إلى الجداول الرقمية سنشرحها مستعينين ب حوالي 20 تمرين و مثال ثم إلى السلاسل الحرفية حوالي 22تمرين ثم إلى كارثة السي إلى ما يهرب منها الناس المؤشرات سنقف كثيرا مع المؤشرات لأنهم العمود الفقرى لهته اللغة و أخيرا و ليس آخرا الدوال
ستكون التمارين متنوعة أي نحاول أن ندخل أكبر قدر ممكن من الموارد في الأكواد و كل التمارين ستكون مرفقة مع حلولها سنرى بإدن الله أشهر الخوارزميات المستعملة في حل المشاكل أي بإختصار سنحاول الإنطلاق مع السي و لكن بعقلية جديدة تماما
أنا بإدن الله سأتم هته السلسلة حتى الأخير بقي منكم أنتم إخواني الإلتزام بهته الدروس لأنها كما سترون ستفيدكم كثيرا ليس فقط في لغة السي بل في كل اللغات الأخرى .
سنبدأ أولا بالجمل الشرطية لن نقف معها كثيرا لأننا سنستعملها في كافة مشوارنا .

بسم الله الرحمن الرحيم
الجمل الشرطية
تعتبر الجمل الشرطية من أهم ركائز لغة السي و كل لغات البرمجة الأخرى بحيث أنه نادرا ما تجد كود لا يحتوي على جمل شرطية كما أن هته الجمل تساعد على ترتيب الكود و جعله دو صورة منطقية كما أنك بفضل هته الجمل تستطيع معالجة كل الإحتمالات التي يمكن أن يدخلها المستخدم أو الإحتمالات التي ستواجه البرنامج
فمثلا لو طلبت من المستعمل إدخال إسمه و أدخل رقما و قبله البرنامج فهدا يعتبر نقطة ضعف في برنامجك لأن الإسم لايحتوي على أرقام كما انك في المستقبل ستواجه عدة إحتمالات و مشاكل تتطلب منك كتابة أكواد منطقية مرتبة جيدا كل هدا تقدمه لك الجمل الشرطية و لكن إن فهمتها جيدا و عرفت إستعمالها
1- جمل IF_Else
if<expression logique> 1
<bloc d'instruction>2
else
<bloc d'instruction> 3
هنا يتوجب عليك و ضع شرط1 إدا تحقق هدا الشرط سيمر المترجم لتنفيد أوامر ما بعد الشرط 2 أما إدا لم يتحقق الشرط 1 فسيدهب المترجم مباشرتا إلى 3
if(A>B)
max=A;
else
max=B;
فلو كان A>B اي ان الشرط محقق سيقوم المترجم بإسناد قيمة A إلى max أما في حالة عدم تحقق الشرط فسيقوم المترجم بإسناد قيمة B إلى max
تستطيع عمل عدة جمل If مع بعضها البعض أي متداخلة
if(a==0)
if(b>c)
printf("b>c");
else
printf("a!=0);
ولكن لو نظرنا لهدا الكود البسيط سنلاحظ أنه غير منظم و غير مفهوم هدا في مثال بسيط كهدا فما بالك بالأكواد الكبيرة ستحصل على كارثة في النهاية
if(a==0)
{
if(b>c)
printf("b>c");
}
else
printf("a=!0);
نلاحظ أن الكود أصبح أكثر تنظيما و أصبح مفهوم أكثر من السابق .
توجد طريقة أحسن لإستعمال عدة جمل if بطريقة آمنة و أكثر تنظيم تنص هده الطريقة على ربط كل الشروط مع بعضها البعض ثم وضع جواب الشرط لكل شرط سنبين هدا في الكود التالي الدي يقوم بإيجاد العدد الأكبر من بين عددين
#include<stdio.h>
main()
{
int a,b;
printf("entrez deux nombre entiers :\n");
scanf("%i %i",&a,&b);
if(a>b)
printf("le max est : %i ",a);
else if(a<b)
printf("le max ext %i",b);
else
printf(" a=b");
return 0;
}
else الأخيرة نوضفها لدراسة الحالات الشادة أو لإندار المستخدم بوجود خطأ و هي تسند دائما لأول if كما أننا نستطيع الإستغناء عنها ولكن لا أنصح بهدا لأن لها دور كبير خاصتا في نسخ رسائل الأخطاء
.......
printf("Continue (y)es/ (n)o ");
getchar(c);
if(c=='y')
{
......}
else if(c=='n')
printf("Bye");
else
printf("Error pls enter n/n");
كما لاحظنا أنها تفيدنا جدا في تنبيه المستخدم بوجود خطأ و كما قلت سابقا لو أن البرنامج قبل كل المدخلات يعتبر هدا البرنامج ضعيف
الآن دعنا من كل هدا ونتجه إلى الأمثلة لأنها الأهم لفه لغة السي
التمرين الأول
لو طلب منا عمل برنامج يحدد العدد الأكبر من ثلاثة أعداد يدخلها المستخدم كيف سيكون الكود
#include<stdio.h>
main()
{
int max,a,b,c;
printf("introduisez trois nombres :\n");
scanf("%i %i %i ",&a,&b,&c);
if(a>b && a>c)
printf("le max est : %i ",a);
else if (b>c)
printf("le max est :%i",b);
else
print("le max est : %i",c);
return 0;
}
قمنا أولا بمقارنة a مع b و a مع c فلو تحقق الشرط فحتما a هو الأكبر ثم بعد دلك لمادا قمنا بمقارنة b مع c فقط و لم نقم بمقارنتها مع a ايضا لأنه و ببساطة إدا وصل المترجم إلى هدا الشرط فهدا يعني أن الشرط الأول لم يتحقق و هدا يعني أن a ليس أكبر من b
إدا لم يتحقق الشرط الأول و لا الثاني فحتما الشرط الثالث هو المحقق أي أن c هو أكبر الأعداد
و لكن لحظة مادا لو طلب منا عدم استعمال IF_else مع بعضهما كيف سنحل هدا المشكل ....
هنا يتوجب علينا إستعمال متغير رابع سنرى هدا
int a,b,c;
int max;
if(a>b)
max=a;
else
max=b;
if(c>max)
max=c;
printf(" le max est :%i\n",max);

ما رأيكم إستطعنا التغلب على المشكل و دللك بالتفكير المنطقي فقط لاحظو الفرق بين هدا الكود الدي في الأعلى الوكود التالي
int a,b,c ;
int max;
if(a>b)
max=a;
if(a<b)
max=b;
if(c>b)
max=c;
printf("le max est :%i",max);
هدا الكود ضعيف و فيه أمور زائدة فمثلا عند تحقق الشرط الأول (a>b) فقد فرغنا من المقارنة بين aو b فلمادا نعيد المقارنة من فهته الإخيرة ليس لها معنى أما المقارنة .
فمباشرتا إن كان a>b => أن max=a فإن لم يتحقق هدا الشرط لا نعيد مقارنة aمع b فنكتب else max=b
التمرين الثاني
لو طلب منا الآن أن نرتب الأعدا ترتيبا تصاعديا أي يقوم الستخدم بإدخال ثلاثة أعداد فيقوم البرنامج بترتيبها تصاعديا ثم يظهرها للمستخدم مثلا يدخل المستخدم 6 3 9 فيقوم البرنامج بترتيبها على النحو التالي 9 6 3
أول شيئ يجب أن نعرف كم متغير نحتاجه لعمل هدا البرنامج بالتأكيد سيحتاج إلى ثلاثة متغيرات يقوم بتخزين الأعداد الثلاثة فيها
ثانيا و هو الأهم كيف سيعمل البرنامج .?
فالنبدأ بدراسة البرنامج خطوة خطوة
لكي يرتب البرنامج الأعداد يجب أن يقوم بتبديل مواضعها أي تبديل أماكنها مثلا فلو كان لدينا a,b,c وكان b>a سيصبح الترتيب كالتالي b,a,c
ولكن المشكل يكمن في كيفية تبديل الأماكن فلو كتبنا مثلا if(a<b) a=b سيقوم البرنامج بإسناد قيمة b إلى a أي أن القيمة الحقيقية ل a قد حدفت وحلت مكانها قيمة b فيصبح عندنا b,b,c
لكي نقوم بحل هدا المشكل يجب أن نضيف متغير رابع نسميه المتغير المؤقتtemp لمادا مؤقت لأننا سنحجز فيه قيمة المتغيرات المراد تبديلها مؤقتا
فبدل ما نكتب if(a<b) a=b وهنا كما قلنا قد حدفنا قيمة aتماما
نكتب
if(a<b)
temp=a;
a=b;
b=temp;
لاحظو جيدا أولا وضعنا قيمةa فى المتغير المؤقت temp ثم أسندنا قيمة b ل a و هدا ما نريد ثم وضعنا قيمة المتغير temp التي هي أصلا قيمة a في b و بهدا نكون قد تمكنا من تبديل قيم a و b دون حدفهما أي منهما
و يكون كود البرنامج كالتالي
#include<stdio.h>
int a,b,c;
int temp;
printf("introdiusez trois nombres :\n");
scanf("%i %i %i ",&a,&b,&c);
if(a<b)
{
temp=a;
a=b;
b=temp;
}
if(a<c)
{
temp=a;
a=c;
c=temp;
}
if(b<c)
{
temp=b;
b=c;
c=temp;
}
printf(" les trois valeur après le tri :\t a=%i\t b=%i\t c=%i \n",a,b,c);
return 0;
}
أرجو من الإخوة فهم طريقة التبديل جيدا لأنكم ستحتاجون إليها كثيرا في المستقبل.
التمرين الثالث
سنقوم في هدا المثال بحل معادلة من الدرجة الثانية
أولا دائما السؤال الأول كم سنحتاج من متغير لحل البرنامج
ببالطبع سنحتاج إلى ثلاث متغيرات للقيم أ ب ج و نحتاج أيضا لمتغير لحساب الدلتا و سنحتاج ايضا لإستدعاء مكتبة math للإستفادة من خدماتها و حتى نتعلم التعامل مع المكتبات
ثانيا كيف سيعمل البرنامج
سيكون البرنامج مقسم إلى 4 أقسام
1- إدجال المتغيرات من طرف المستخدم
2- حساب الدلتا
3-دراسة حالات الدلتا و حساب الحلول
4- إظهار النتائج للمستخدم
سنرى كود البرنامج أولا ثم نناقش هدا الكود
#include<stdio.h>
#include<math.h>
int a,b,c;
double d;
printf("Calcule des solution réeles d'une équation du seconde");
printf("degré de la forme ax^2+bx+c=0\n\n");
printf("introduisez les valeur pour a,b,c\n");
scanf("%i %i %i ",&a,&b,&c);
d=pow(b,2)-4*a*c;

if(a==0 && b==0 && c==0)
printf("cette équation ne possède pas des solutions\n");
else if(a==0 && b==0)
printf("cette équation ne possède pas des solutions\n");
else if(a==0)
{
printf("la solution de cette equ du 1er degré est :\n");
printf("x=%.4f\n",(double)c/b);
}
else if(d<0)
printf("cette équ n'a pas de solution réeles\n");
else if(d==0)
{
printf("cette équ a une seul solution réele :\n");
printf("x=%.4f\n",(double)-b/(2*a));
}
else
{
printf("les solutions réeles de cette equ sont :\n");
printf("x1=%.4f\n",(-b+sqrt(d))/(2*a));
printf("x2=%.4f\n",(-b-sqrt(d))/(2*a));
}
return 0;
}
سنناقش الآن الكود
printf("Calcul des solutions réeles d'une équation du second");
printf("degré de la forme ax^2+bx+c=0\n");
printf("introduisez les valeurs a,b,c\n");
هنا قمنا بإعلام المستخدم أنه امام برنامج مجصص لحل معادلة من الدرجة الثانية ثم أعلمناه بأن يدخل ثلاثة أعداد هدا يا إخواني أمر مهم جدا يجب على برنامجك أن يكون مفهوم ومبسط و يستطيع أي شخص التعامل معه عندما تكتب برنامج ضع نفسك دائما في مكان المستخدم لان البرنامج لن يتعامل معك بل سيتعامل مع شخص آخر لدى فمن المهم أن تقوم بتعريف برنامجك و مساعدة المستخدم على فهم هدا البرنامج
d=pow(b,2)-4*a*c;
الدالة pow تنتمي إلى مكتبة math قمنا بالإستعانة بها لرفع قوة b أس 2 هدا مثال بسيط ولكنك ستحتاج إلى التعامل مع المكتبات كثيرا في المستقبل لأنها ستسهل عليك كتابة الأكواد
الآن ندهب إلى المهم
if(a==0 && b==0 && c==0)
printf("cette équation ne possède pas de solutions \n");
else if(a==0 && b==0)
printf("cette équation ne possède pas de solution\n");
من نسي هدا الكود فسيكون برنامجه كارثة مادا لو أدخل المستخدم ثلاثة أصفار أتدرون مالدي سيحدث سيتوقف البرنامج تماما و هده ميزة سيئة جدا ان يتوقف البرنامج عن العمل دون إرسال رسالة خطأ و المبرمج المحترف هو من يستطيع أن يكتشف كل الإحتمالات الممكنة الوقوع فعندما كتبنا هدا الكود لو أدخل المستخدم ثلاثة أصفار أو صفرين لن يتوقف البرنامج بل سيرسل له رسالة خطأ وهده نقطة مهمة جدا يجب أن تستوعبوها يجب أن تكون عندك نظرة واسعة لما سيواجهه برنامجك
else if(a==0)
{
printf("la solution de cette équation du 1er degré est :\n");
printf("x=%.4f\n",(double)c/b);
}
نفس الشيئ مادا لو أدخل المستخدم صفر في قيمة a ستصبح المعادلة من الدرجة الأولى و لم نكتب هدا الكود سيحسب البرنامج قيمة الدلتا و يدرس الحالات الممكنة مما سيأخد وقت أطول بالطبع في مثال كهدا لن يأخد وقت و لكن نحن نفكر دائما في المشاريع الكبيرة أخطاء كهده ستضعف من المشروع و زد على دالك عندم يرى المستخدم أن البرنامج قد إكتشف أن هده المعادلة من الدرجة الأولى سيكبر في عينه هدا البرنامج و يعلم أنه برنامج كامل و هده نقطة لصالحنا
لو يسأل سائل لمادا وضعنا الأقواس بعد جملة if في هدا الكود ولم نضعها في الجمل السابقة فنقول عندما يكون لديك حسابات أو أوامر عند تحقق الشرط فيجب عليك حصر هده الحسابات بالاقواس و إن لم تضع الأقواس سيظن المفسر أن هته الأوامر تابعة للبرنامج ككل وليست تابعة لجملة الشرط
فهنا ملاحظة مهمة جدا عندما يكون لديك شرط هنا مثلا
if(a==0)
وعند تحقق هدا الشرط تريد أن تربطه بحسابات أو نتائج فيجب حصرها بواسطة الأقواس حتى يعلم المفسر أن ما بين الأقواس تابع ل الشرط if a==0 فلو كتبتها بدون أقواس على النحو التالي
else if(a==0)
printf("la solution de cette équation du 1er degré est :\n");
printf("x= %i.4f\n",(double)c/b);
سيعتبر المفسر أن السطور التي ما بعد الشرط تابع للبرنامج ككل و ليست تابعة لجملة الشرط
هنا نلخص عندما يكون لديك حسابات و أوامر بعد الشرط يجب عليك حصرها بالأقواس أما إن لم يكن لديك أوامر و أردت أن تطبع رسالة للمستخدم مثلا فهنا لا يجب عليك وضع الاقواس
نقصد بالعبارة التالية %i.4f
أن تكون النتائج المعروضة تحتوي على أربعة أعداد بعد الفاصلة فقط
و العبارة التالية (double)c/b
أي أن يحول الناتج إلى double حتى يكون الناتج بالفاصلة
بقي لدينا الإحتمالات المتعلقة بالدالتا و ليس فيها شيئ صعب قمنا بدراسة الحالات الثلاثة لدالتا و لكن لاحظو جيدا في حالة else if(d<0)
printf("cette solution n'a pas de solution réele\n");
لم نقم بوضع الاقواس و هدا لأننا ليس لدينا حساب خاص بهده الحالة و لكن في الحالتين المتبقيتين قمنا بوضع الأقواس لأن لأننا قمنا بدراسة حلول .

إخواني الكرام أرجو منكم أن تفهمو الأكواد ولاتحفظوها فهدا مهم جدا في البرمجة

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


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



تم بحمد الله

Aboud Aboud
01-31-2008, 03:59 PM
شكرا لك اخي شرح ممتاز

Lem_Chouaib
01-31-2008, 11:34 PM
الحلقات أو الجمل التكرارية
كما يدل إسمها تستعمل الحلقات لتكرير عمل معين عدة مرات بكتابة الأمر مرة واحدة و لها فائدة كبيرة خاصتا فيما يتعلق ب الجداول و السلاسل الحرفية
لن نقف كثيرا في تعريفها فكل ما يهمنا هو التطبيق
في لغة السي يوجد ثلاث أنواع من الحلاقات

while1-
do while 2-
for 3-

من الوجهة النظرية تطبيفية كل هته الحلاقات تؤدي نفس العمل و لكن من وجهة نظر عملية فهناك إختلاف بين هته الجمل وهدا ما سنراه لاحقا
while1-
صيغة هته الجملة كالتالي
while(expressionn الشرط)
<bloc d'instriction الأوامر>

فهي تعمل نفس عمل الجمل الشرطية ولكن الإختلاف بينهما أن الجمل الشرطية تقوم بتنفيد الأمر مرة واحدة أما الحلاقات فتقوم بتنفيد الأمر عدة مرات
مثال
int i=0;
while(i<10)
{
printf(" %i",i);
i++;
}

do while 2-
do<bloc d'instruction>
while(expression)
هي شبيهة جدا بجملة while مع الإختلافات التالية
*جملة while تقوم بالتحقق من الشرط قبل تنفيد الاوامر
*جملة do while تقوم بالتحقق من الشرط بعد تنفيد الأوامر أي أن الأوامر ستنفد على الأقل مرة واحدة
هده الميزة ستساعدنا كثيرا خاصتا في التحقق من مدخلات المستخدم
لاحظو هدا المثال
float n;
do
{
printf("introduisez un nombre entre 1 et 10\n");

scanf("%f ",&n);
}

while(n<1 || n>10);
فهنا يلزمنا على الاقل تنفيد الأمر مرة واحدة حتى يتمكن الستخدم من إدخال الرقم ثم بعد دالك نقوم بفحص الرقم المدخل
و معنا هدا الكود كرر الطلب من الستخدم بإدخال عدد بين 1و10 حتى يدخل عددا بين 1و 10فستبقى الرسالة تظهر حتى يدخل المستخدم عدد بين 1و10
for 3-
تعتبر جملةfor أقوى الجمل التكرارية و أكثرها إستعمالا لأنها تمتاز بقوة و فعالية كبيرة
تستخدم جملة فور بالصيغة التالية
for(exp; exp;exp)
<bloc d'instruction>
for(i=0;i<20;i++)
printf(" %i i:",i);
أولا قمنا بإعطاء العداد قيمة مبدئية ثم القيمة القصوى للعداد ثم الدرجة التي ستضاف لقيمة العداد عند كل مرة

سنتجه الآن نحو التطبيقات مباشرتا لأننا لن نستطيع فهم الجمل التكرارية دون تطبيقها
التمرين الاول
سنقوم في هدا التمرين بالطلب من المستخدم بإدخال عدد معين من الأعداد ثم يقوم البرنامج بإظهار حاصل جمع وضرب هته الأعداد مع بعضها ثم يقوم بحساب المعدل
أولا بواسطة الجملة while
أولا نقوم بسؤال المستخدم عن كمية الأعداد التي يريد حسابها و سنرمز لهدا المتغير ب n
ثم نخصص حلقة تقوم بقراءة الاعداد كلها و عند الإنتهاء من إدخال الأعداد يقوم البرنامج بحساب مجموع الأعداد و حاصل ضربها و المعدل
#include<stdio.h>
main()
{
int n,nomb;
int i;
long som;
double prod;
printf("introduisez le nombre des donees :\n");
scanf("%i ",&n);
som=0;
prod=1;
i=1;
while(i<=n)
{
printf("introduisez nombre %d :",i);
scanf("%d ",&nomb);
som+=nomb;
prod*=nomb;
i++;
}
printf("la somme des %d nombres ét :%ld\n",n,som);
printf("le produit des %d nombres est :%.0f \n", n,prod);
printf("la moyenne des %d nombres est : %0.4f \n", i, (float)som/n);
return 0;
}

كما رأينا قام البرنامج أولا بطلب من المستخدم أن يدخل عدد حتى يعرف كمية الأعداد التي يريد حسابها و المتغير n يرمز لكمية الأعداد و بالتالي فهو الحد الاقصى لتكرار الحلقة
و بعدها قمنا بتهيئة المتغيرات som و prod الدي يرمز إلى حاصل ضرب الأعداد و أسندنا له قيمة 1 لأنه لو أسندنا له قيمة 0 كما في som سيكون كل حاصل الضرب 0
ولكن لمادا قمنا بوضع قيم مبدأية لهته النتغيرات
لأنه في لغة السي لا تستعمل المتغير دون إعطائه قيمة مبدئية فيجب تهيئة كل المتغيرات بقيم مبدأية
بعدها قمنا بوضع شرط الحلقة
while(i<=n)
n هو كمية الأرقام المدخلة و i يمثل القيمة الإبتدائية للحلقة أي أن الحلقة ستنفد n مرة
بعد دلك كلما أدخل الستخدم عددا سيقوم البرنامج بإضافته لقيمة som وقيمةprod و الكتابة
som+=nomb;
prod+=nomb;
تعد إختصارا لالكتابة التالية
som=som+nomb;
prod=prod*nomb
و بعد دلك قمنا بزيادة العداد i درجة إلى الأمام
الآن سنقوم بتشخيص هته الحلقة خطوة خطوة
القيمة المبدئية لi هي 1 و نفرض مثلا أن المستخدم أراد جمع و ضرب ثلاثة أعداد أي أن n تساوي ثلاثة
أول شيئ يقوم المترجم بفحص الشرط و سيجده محقق لأن1 أقل أو يساوي3مادام الشرط محقق سيمر المترجم إلى مابعد الشرط أي سيقوم بإضافة العدد إلى som ثم يقوم بضرب العدد في prod ثم ينزل فيجد الكتابة التالية++i فيقوم بإضافة واحد إلى i فتيصبح لدينا iتساوي إثنان i=2 ثم يصعد إلى فوق ليفحص الشرط مجددا فيرى أن الشرط محقق لأن إثنان أقل من ثلاثة فيقوم بإضافة الأعداد كما في الأول ثم ينزل إلى i فيضيف لها واحد فتصبح ثلاثةi=3 و يفحص الشرط مجددا فيجده محقق فيقوم بالإضافة ثم ينزل إلى i و يضيف لها واحد فتصبح أربعةi=4 و عندما يفحص الشرط يجده غير محقق لأن أربعة أكبر من ثلاثة هنا لم بيتحقق الشرط مالدي سيفعله المترجم سيخرج تماما من الحلقة و يدهب لتنفيد ما بعد الحلقة أي سيقوم بإظهار النتائج
هده هي طريقة عمل الحلقات

بطريقة do while

som=0;
prod=1;
i=1;
do
{
printf("introduisez nombre %d :",i);
scanf("%i ",&nomb);
som+=nomb;
prod*=nomb;
i++;
}
while(i<=n);

كما قلنا سابقا جملة do while تقوم بتنفيد الأوامر قبل التحقق من الشرط جرب في هدا البرنامج وضع 0 لقيمة n يعني هدا أن الشرط غير محقق لأن أي تساوي 1و مع دلك سيقوم البرنامج بتنفيد الحلقة مرة واحدة حتى مع عدم تحقق الشرط


بطريقة for
for(som=0;prod=1;i=1; i<=n;i++)
{
som+=nomb;
prod*=nomb;
}


لاحظو إخواني قوة هته الجملة و وضوحها في سطر واحد قمنا بتهيئة كل المتغيرات كما قلت تعتبر جملة for من أحسن الجمل ولكن لا نستطيع الإعتماد على جملةfor دائما لأنه توجد حالات لا نستطيع تنفيدها بهاته الجملة
فمثلا لو طلب منا عمل تحديد للأعداد التي يدخلها المستخدم أي يجب أن تكون محصورة بين 5 و 10 في هته الحالة جملة do while هي التي ستفيدنا
do
{
printf("introduisez le nobre des donnees :\n");
scanf("%d ",&n);
}
while(n<5 || n>10);

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

التمرين الثاني

سنقوم في هدا التمرين بإيجاد باقي قسمة عددين سيقوم المستخدم بإدخال عددين ثم يقوم البرنامج بإيجاد باقي القسمة بين العددين
توجد طريقة سهلة جدا بإستخدام المعامل % فمثلا لكي نجد باقي القسمة بين a و b نقوم بكتابة الكود التالي
c=a%b;
قيمة c تحتوي على باقي قسمة a على b
وكننا لن نستخدم هته الطريقة لأنها سهلة و لن تفيدنا في فهم الحلقات سنقوم بإيجاد طريقة أخرى تمكننا من إيجاد الباقي بإستعمال الحلقات
أخواني الكرام لو أردنا إيجاد باقي قسمة 9 على 2 مثلا سنقوم بطرح 2من 9 عدة مراة على النحو التالي
9-2=7
7-2=5
5-2=3
3-2=1
حتى نحصل على عدد لانستطيع طرحه من 2 و هدا العدد هو باقي القسمة
جربو هدا المثال على عدة أعداد سترون أن العدد المتبقي هو باقي القسمة
الآن كيف سنترجم هته العملية إلى c و نحولها إلى برنامج
أولا سنطلب من الستخدم إدخال عددين
ثم سنقوم بوضع حلقة تقوم بطرح العدد الثاني من الأول حتى كما في المثال حتى نحصل على العدد الأخير
#include<stdio.h>
main()
{
int num1, num2;
int i;
int res;
printf("introduisez le 1er numero : \n");
scanf("%d ",&num1);
printf("introduisez le 2eme numero :\n");
scanf("%d",num2);
res=num1;
i=0;
while(res>=num2)
{
res-=num2;
i++;
}
printf(" RÉULTAT : %d \n",res);
return 0;
}

لاحظو مع جملة فور كيف سيتكون الحلقة
for(res=num1;i=0;res>=num2;i++)
res-=num2;


أظن الأمور بدأت تتضح الآن
سننتقل إلى أمور اكثر تعقيدا نوعا ما لا حظو التمرين التالي

التمرين الثالث
نفس التمرين الأول و لكن مع بعض التعديلات لن نحدد في هدا التمرين كمية مدخلات المستخدم سنتركه يدخل الأعداد كما يشاء و إدا أراد التوقف عن إدخال الأعداد يكتب 0فيقوم البرنامج بحساب مجموع و حاصل ضرب كل الأعداد التي أدخلها المستخدم ثم يحسب المعدل
و سنقوم بحصر الأعداد التي يدخلها المستخدم بين 1و 15 وإدا أدخل عدد أكبر من 15 ينبهه البرنامج بإصدار بيب صوتي
لاحظو كود البرنامج أولا
#include<stdio.h>
main()
{
int nomb;
int som=0;
int prod=1;
int n=0;
do
{
printf("Entrer le %d nombre (0) pour Quiter:\n", i);
scanf("%d",&nomb);
if(x<0 || x>15)
printf("\a");
else if(nomb)
{
i++;
som+=nomb;
prod*=nomb;
}
else if(!nomb && n>0)
{
printf(" la somme dé chifres ét %d\n", som);
printf("le produit dé chifres ét %d\n",prod);
printf(" la moyenne des chifre est %f\n",(float)som/n);
}
}
while(nomb);
return 0;
}

قمنا أولا بتعريف المتغيرات التي يحتاجها البرنلمج ثم أسندنا لها قيم أولية لأنه كما قلنا يجب تهيئة المتغيرات قبل إستعمالها
المتغير nomb خاص بالعدد الدي يدخله المستخدم
المتغير n هو عداد الحلقة
المتغيرsom يقوم بحفظ حاصل الجمع
المتغير prod يقوم بحفظ حاصل الضرب

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

ببساطة الكود عرف هدا بواسطة هده العبارة (while nomb) أي مادام nomb عدد مختلف عن الصفر تسمى هده الطريقة بالمنطقية logical أو bool
و يعتبر المتغبير المنطقي 0 دلالة على الخطأ أو العكس و يعتبر 1 دلالة عن الصح أو المواصلة كنا نستطيع كتابتها على النحةو التالي
while(nomb!=0)
لأن لها نفس صيغة
while(nomb)

نلخص من جديد عمل الحلقة
سيبقى do تعمل حتى ينتفي الشرط وإنتفاء الشرط يكون بإدخال المستخدم ل 0

ننتقل الآن إلى داخل الحلقة
printf("Entrer le %d nombre :\n", i);
scanf("%d",&nomb);
if(x<0 || x>15)
printf("\a");


قمنا ب الطلب من المستخدم بإدخال عدد ثم فحصنا هدا العدد ثم يأتي هنا شرط أخر كما قلنا في التمرين يجب أن يحصر البرنامج الأعداد التي يدخلها المستخدم بين 1 و 15 وهدا ما قامت به جملة if و الرمز ||يعبر عن( أو) or فإدا أدخل المستخدم مثلا 20يقم الجهاز بإصدار بيب أو تنبيه صوتي و دالك بواسطة
printf("\a");or

ثم أضفنا جملة شرط أخرى
else if(nomb)
{
i++;
som+=nomb;
prod*=nomb;
}

جملة الشرط هته تلعب نفس دور جملة (while nomb)
أي إدا كان nomb عدد صحيح مختلف عن الصفر قم بتنفيد الأوامر التالية
i++;
som+=nomb;
prod*=nomb;

ولكن لحظة ألم نقل أن الحلقة لن تنفد إدا أدخل المستخدم 0 فمادام شرط الحلقة لم يتحقق فبالتالي الحلقة لن تنفد فلمادا وضعنا هته العبارة إدا
else if(nomb)

إخواني الكرام نحن قلنا في السابق أن جملة do while تنفد مرة واحدة على الأقل فلو كان أول عدد أدخله المستخدم عبارة عن صفر ستنفد الحلقة و هنا سيكون برنامجنا متناقض لأنك تقول للمستخدم أدخل صفر لكي تخرج ثم يدخل صفر و ينفد البرنامج هدا ببساطة تناقض و أقولها مرة ثانية يجب أن ننظر للكود بنظرة واسعة جدا و ندرس كل الإحتمالات خاصة مع لغة السي

else if(!nomb && n>0)
{
printf(" la somme dé chifres ét %d\n", som);
printf("le produit dé chifres ét %d\n",prod);
printf(" la moyenne des chifre est %f\n",(float)som/n);
}

ما معنى هته الجملة
else if(!nomb && n>0)

الرمز !يمثل العكس أو عدم المساوات نحن قلنا أن
else if(nomb)

معناها إدا كان نومب مختلف عن الصفر و بإضافة الرمز !سنتحصل على العكس أي أن عبارة
else if(!nomb)

معناها إدا كان nomb يساوي الصفر
الآن نعود إلى العبارة الأولى
else if(!nomb && n>0)

معنى هته العبارة انه إدا أدخل المستعمل صفر و كان عداد الحلقة أكبر من الصفر أي أن المستخدم أدخل أعدادا من قبل فقم ب نسخ النتائج للمستخدم
لو لم نكتب هته العبارة سيقوم المستخدم بإدخال الأعداد ثم عند الإنتهاء يقوم بإدخال 0 سيتوقف البرنامج دون تقديم النتائج للمستخدم و بهد صار البرنامج بدون فائدة
ولهدا قمنا بفحص العداد n فإدا كان العداد أكبر من الصفر معناه أنه يوجد نتائج مخزنة في المتغيرات som و nomb اما إدا كان العداد يساوي الصفر معناه أن المستخدم لم يدخل أعداد فلا داعي لنسخ النتائج على الشاشة لأنه لاتوجد نتائج أصلا


و بهدا نكون قد إنتهينا من التمريتن الثالث تمرين بسيط ولكن يفيدنا في كثير من الأمور و الأخطاء الشائعة الحدوث

مازلنا مع الحلقات ستكون التمارين التالية صعبة نوعا ما و هدا راجع لتعقيدات لغة السي و لكن سنحاول تبسيطها و الإستفادة منها قدر الإمكان

Lem_Chouaib
02-01-2008, 06:23 PM
شكرا لك اخي شرح ممتاز

بارك الله فيك أخي الكريم و شكرا على المرور

hmada_horani
02-01-2008, 07:18 PM
thank you

Hmada Horani