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");
لم نقم بوضع الاقواس و هدا لأننا ليس لدينا حساب خاص بهده الحالة و لكن في الحالتين المتبقيتين قمنا بوضع الأقواس لأن لأننا قمنا بدراسة حلول .
إخواني الكرام أرجو منكم أن تفهمو الأكواد ولاتحفظوها فهدا مهم جدا في البرمجة
هدا مالدينا الآن بخصوص الجمل الشرطية و لكنها سترافقنا طوال مدة السلسلة لأن التطبيقات المفيدة ل الجمل الشرطية تكون مصحوبة مع الجداول و السلاسل الحرفية .
سندرس في القسم التالي من هته الدروس الجمل التكرارية و سنحاول التركيز عليها أكثر و تقديم أمثلة أكثر
أرجو أن تكونو قد إستفدتم من هدا الدرس المتواضع و من له ملاحظة أو تعقيب فلا يبخل علينا حتى تعم الفائدة
تم بحمد الله
إخواني الكرام تعد لغة ال 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");
لم نقم بوضع الاقواس و هدا لأننا ليس لدينا حساب خاص بهده الحالة و لكن في الحالتين المتبقيتين قمنا بوضع الأقواس لأن لأننا قمنا بدراسة حلول .
إخواني الكرام أرجو منكم أن تفهمو الأكواد ولاتحفظوها فهدا مهم جدا في البرمجة
هدا مالدينا الآن بخصوص الجمل الشرطية و لكنها سترافقنا طوال مدة السلسلة لأن التطبيقات المفيدة ل الجمل الشرطية تكون مصحوبة مع الجداول و السلاسل الحرفية .
سندرس في القسم التالي من هته الدروس الجمل التكرارية و سنحاول التركيز عليها أكثر و تقديم أمثلة أكثر
أرجو أن تكونو قد إستفدتم من هدا الدرس المتواضع و من له ملاحظة أو تعقيب فلا يبخل علينا حتى تعم الفائدة
تم بحمد الله
