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

مشاهدة النسخة كاملة : دروس راائعة ومهمة في تعلم لغة ++C


مضاد حيوي
02-03-2005, 11:35 AM
تعلم سي بلس بلس


الدرس الاول

اساسيات سي بلس بلس

مساء الخير

انا اقول مساء الخير لانني لا افتح الانترنت الا في المساء واظنكم جميعا كذلك سنبدء اليوم سلسلة دروس عن لغة سي بلس بلس انها لغة صعبة ولكنها قوية جدا اريدك ان تعرف معلومة هامة كلمة كانت لغة البرمجة صعبة كلما كانت قوية واذا كنت تتعلم لغة الآن واحسست بسهولتها فيجب ان تعلم انها لغة ليست قوية هذا رأيي الخاص واظنه شئ صحيح احب ان تعرف معلومة اخرى ان لغة سي بلس بلس ليست هي لغة سي مع التشابه الكبير لاوامر ودوال اللغتين المهم معنا الآن اننا نتعامل مع لغة سي بلس بلس واضيف شئ اخير انك اذا لم تفهم هذه الدروس فمعنى ذلك انني اخفقت في الشرح والتوضيح وتأكد حينها ان العيب عندي انا وليس عندك ولكي نبدء دروسنا يجب عمل الآتي.

1- اذا لم تكن قد قرأت مقالي على هذه الصفحة عن كيف تتعلم لغة برمجة جديدة للمبتدئين فمن فضلك أقرأه الآن

2- ارجو ان تغفر لي اي اخطاء املائيه فأنا اكتب بسرعة

3- ارجو ألا تعتبر كتابتي لمصطلحات انجليزية بحروف عربية جهل او غباء مني ولكن فقط لاسباب خاصة بتحرير الصفحة فالسهل عندي كتابة كل شئ باللغة الانجليزيه ولكن لن تكون هذه الدروس مفيد – ألست معي في ذلك – ارجو ذلك



متطلبات العمل

1- كومبايلر للغة ودعني اقول لك ماهو الكومبايلر حتى وان كنت تعرفه انه البرنامج الذي يحول البرنامج الذي تكتبه الى برنامج تنفيذي قابل للتشغيل والتوزيع والبيع الى آخر ذلك وهناك انواع كثيرة مثل



Borland C++

Microsoft Visual C++

Watcom C/386

DJGPP.

انا انصح بالكومبايلر الاول او الثاني أما الثالث والرابع فلم اجربهم ولست في حاجة اليهم ولست اقصد بذلك الا تستعملهم ولكن فقط لم اجربهم

استعد انت الآن لبداية التعلم اما انا من ناحيتي فسوف اطفئ سيجارتي (ادعو لي بالاقلاع عن التدخين) لكي نبدء فورا

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

Hello World

بالطبع هم يخاطبون العالم ولهم الحق في ذلك ولكن انا سوف اطبع رسالة هالو آراب

Hello Arab

مع عدم وجود اي عنصرية مني فأنا لست كذلك ولن أكون ولكن اسمحو لي بتحية من اكتب لهم لا تنزعج معي دائما قد اكون رغاي بعض الوقت ولكن ليس كل الوقت





// This is the 1st lesson

#include <iostream.h>



int main()

{

cout<<"HEY, Hello ِArabs";

return 0;

}



دعونا نشرح ما كتبنا لقد بدأت بالعبارة الآتية



// This is the 1st lesson

عند كتابة // معناها انني اكتب ملاحظات وبالتالي كل ما يليها لايهم الكومبايلر عند الترجمة وفائدة الملاحظات عظيمة فكلما كتبت جزء من البرنامج وضحت هاتين العلامتين وبعدها ماتريد ان تقوله لنفسك او لمن يراجعون بعدك ماذا تفعل فاءذا عدت لتعديل البرنامج بعد فترة من الزمن سيكون ذلك رائع ان تتذكر افكارك في البرنامج موضع التعديل والآن الى التعليمة التالية لقد كتبنا

#include <iostream.h>



العلامة # يليها امر include هي من تعليمات المعالج المبدئي

Preprocessor directive

لاحظ ان اوامر اللغة تكتب بالحروف الانجليزية الصغيرة



يلي ذلك مابين القوسين <> اسم ملف ينتهي بالامتداد h

هذا النوع من الملفات يسمى header files

وهي ملفات تأتي مع كومبايلر اللغة وان كنت ستتعلم في مرحلة متقدمة من هذه الدروس عملية انشاء ملفاتك الخاصة وهي عبارة عن ملفات يوجد بها تعريف لاوامر اللغة المستخدمة داخل برنامجك وبالتالي لكل مجموعة اوامر ملفاتها الخاصة لا تقلق سوف تعرف كل ذلك قريبا

اذا الاوامر المستخدمة في مثالنا السابق يحتاج الملف iostream.h

وهذا الملف هام جدا ورئيسي دائما ضم هذا الملف باستخدام الامر

#include <iostream.h>



ملخص

#include
من اوامر لغة سي ++ (المعالج المبدئي)

iostream.h
ملف او هدير فايل لتعريف الاوامر المستخدمة

<>
اقواس لوضع الملف المطلوب ضمه او تحميله بينهما


ببساطة شديدة الامر cout الذي سيلي شرحة يحتاج الملف

iostream.h



ننتقل الآن لشرح التعليمة التالية



int main()

ومعناها الاعلان عن الدالة او جسم البرنامج الرئيسي الذي من خلاله نستدعي كل شئ ونعمل كل شئ وسوف نضع بداخله الاوامر كلها

ولكن ما هو الامر int

انه من اوامر الاعلان عن نوع المتغيرات ودعني اوضح ذلك



امر اللغة الذي يعلن عن المتغير
نوع المتغير

int
الاعلان عن اعداد صحيحة

float
الاعلان عن اعداد عشرية

char
الاعلان عن حروف

void
لاشئ




وسوف نتعرض للانواع الاخرى فيما بعد وكمثال



int x = 5;

int y = 65;

float z = 4.677777;

float q = 77.5443;

char *b = “Mohamad Hasan”;

char *c = "My Home Page”;

لقد اعلنا ان الدالة الرئيسية للبرنامج نوعها او ستعيد في نهاية عملياتها عدد صحيح فقد تحتاج مثلا لعمل دالة لضرب عددين في بعضهما والنتيجة تعيدها الدالة حسب نوع الاعلان

ويحدد ذلك الامر return وكما ترى اعاد الامر القيمة صفر وهو بالطبع عدد صحيح نتيجة الاعلان عن دالة تعيد اعداد صحيحة

فمثلا لو انشأنا دالة لاعادة اعداد عشرية يجب ان تعيد في نهايتها اعداد عشرية مثلا



float NewFunc ()

{

float x , y , z;

x = 10.5;

y = 11.67887;

z = x * y;

return z;

}

لقد اعادت الدالة حاصل ضرب 10.5 * 11.67887 وحاصل الضرب هو عدد عشري لان نوع الدالة اعداد عشرية وهكذا دعنا نعود لبرنامجنا الاصلي



int
نوع الدالة تعيد اعداد صحيحة

main
اسم الدالة الرئيسية اساسي وهام

()
قوسين مغلقين لايوجد داخلهم شئ في هذه المرحلة




الى التعليمة التالية القوس {

يجب ان يفتح به الدالة وتنتهي به ايضا لاحظ الاتجاه الى اليسار في بداية الدالة والى اليمين في نهايتها لتحديد بلوك الاوامر

والآن الى التعليمة التالية





cout<<"HEY, Hello ِArabs";



الامر cout يليه القوسين << مفتوحين الى اليمين معناها اخراج ما بين علامتي الاقتباس



Cout <<
امر طباعة على الشاشة

" "
علامات اقتباس لطبع الرسالة التي بينهما كما هي




الى الامر الاخير





return 0;



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

وتتفق معى انه لايجب ان يكون صفر دائما ولكن كيفما تريد وحسب العمليات ولكن المهم ان يكون عدد صحيح 1 او 2 او غيرها لاننا اعلنا عن ذلك وعلينا الالتزام به والا سوف يعطي الكومبايلر رسالة خطأ

والى الامر الاخير }

انه قوس نهاية البلوك ولاحظ انه الى اليسار ليغلق البلوك الذي فتح بمثله ولكن الى اتجاه اليمين والآن انتهى برنامجنا الافتتاحي والى ملاحظاتنا



تذكر أن



1- اوامر اللغة تكتب بحروف صغيرة small letters

2- البرنامج يبدء بأوامر المعالج المبدئي لضم الملفات # include

3- الدالة الرئيسية main يجب ان تكون موجودة

4- يفتتح البرنامج بالقوس} ويغلق بالقوس{

5- الملف الذي انشأته سيقوم برنامج التحرير بحفظه باسم ينتهي بالامتداد cpp

6- جميع سطور البرنامج وبعد نهاية الاوامر والاعلانات نضع الفاصلة المنقوطة ;

بعد اقواس افتتاح البرنامج وبعد اوامر المعالج المبدئي وبعد اسم الدالة حاليا اقول لك نضعها فقط بعد الاوامر داخل بلوك الدالة ومعناها نهاية الامر اهتم بذلك

ماذا لو اعلنا عن نوع الدالة الرئيسية بالامر void ومعناه غير مطلوب منها اعادة شئ سيكون الامر return بدون قيم بالطبع او كما يلي



// This a modification no. 1

#include <iostream.h>



void main()

{

cout<<"HEY, Hello ِArabs";

return ;

}

لاحظ الامر return لم يوضع بعده قيم

وتذكر ان مايلي // هي عبارة عن ملاحظات لسطر واحد فقط وكلما وضعت سطر ملاحظات ضع هاتين العلامتين في بداية السطر

// This is a remark no. 1

// And this is the remark no. 2

// It is no. 3



وهناك اسلوب اخر لكتابة الملاحظات في عدة سطور بأن تبدء بالعلامة /*

ثم تكتب ما شئت من ملاحظات في اي عدد من السطور ثم تنهيها بالعلامة */

مع ملاحظة الاتجاهات وتكون الملاحظات السابقة بالاسلوب الذي شرحناه كما يلي



/*

This is a remark no. 1

And this is the remark no. 2

It is no. 3

*/

لاحظ الفرق لكي يتضح لك الشرح استخدم ايهما او ما تراه اسهل لك منهم اقصد من الاسلوبين السابقين



الى اللقاء في الدرس القادم


مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:09 PM
تعلم سي بلس بلس



الدرس الثاني



أوامر الاشتراطات




مساء الخير

من انتقلوا معنا الى الدرس الثاني يبدو انهم سوف يكملون المسيرة الى اخرها واتمنى انا ان اكملها معهم .

كما تحدثنا عن اللغات بصفة عامة وقلنا ان الاشتراطات من الامور الهامة في اي لغة والآن لانريد ان نعيد ما قلناه سابقا لندخل مباشرة في موضوع اليوم

المعنى البسيط والقريب لموضوع اليوم انك تريد من برنامجك ان يفعل اشياء معينه عند تحقق شروط معينه ولكن كيف نصيغ هذه الاوامر هذا هو موضوع اليوم

انك ترى الشروط دائما وربما بدون ان تدري فأول شئ فعلته اليوم عند اتصالك بالانترنت هو ادخال كلمة السر – أليس كذلك – نعم هو كذلك ولا شئ غيره – ان برنامج الاتصال قد وضع شرط صحة كلمة السر لكي يمكنك من الدخول وربما اشياء اخرى مثل عدم انتهاء مدة الاشتراك وصحة اسم المستخدم وهكذا كلها شروط انها ايضا موضوعنا هذا اليوم ومعظم الشروط المستخدمه لقيمتين هي هل هما متساويتان ام احدهما اكبر او اصغر بالاضافة الى المعاملات البولينية Boolean operators

ومن درس منكم علم الجبر سوف يتذكرها بسرعة ام من نسى او لم يدرسها اصلا فالموضوع بسيط جدا لانك تمارسه في حياتك اليومية ربما دون ان تدري وهي

AND , OR , NOT

كمثال من الحياة اليومية

Ask Mohamad AND Ali

يجب ان تسأل محمد وعلى وليس واحد منهم فقط بل يجب ان يكون السؤال للاثنين

Ask Mohamad OR ALI

اي يجب ان تسأل محمد او على يكفي فقط واحد منهم

Ask Mohamad NOT Ali

اي يجب ان تسأل محمد وليس على فلو سألت على فان الشرط غير متحقق



الجدول التالي يعبر عن طريقة صياغة المعاملات البولينية في لغة سي++



التعبير أو الصيغة
التفسير

||
OR

&&
AND






والجدول التالي يعبر عن العلاقات الشرطية وكيف تصاغ في لغة سي++



التعبير أو الصيغة
التفسير

>
اكبر من فتحة القوس في اتجاه الاكبر

<
اصغر من

==
يساوي (تذكر انهم علامتين متجاورتين

>=
اكبر من او يساوي

<=
اصغر من او يساوي

!=
لا يساوي




تذكر جيدا خطأ من السهل ان تقع فيه ان الشروط غير التخصيص بمعنى انك عندما تخصص قيمة لمتغير فاءنك لابد ان تستخدم علامة يساوي واحدة فقط مثل



A=5;

B=A;

C=18;



اما في صياغة شرط فاءنك لابد ان تضع علامتين اذا اشترطت التساوي مثل

if (A==B)

if (A==18)

ارجو ان تنتبه لذلك



ولنأخذ مثال اليوم فقد تأخرنا كثيرا



// This is a remark do you remember ?

// It has no effection , just for you , is it?





#include <iostream.h>



int main()

{

int Num;

cout<<"Please input a Number : ";



cin>>Num;

if(Num < 50)

{

cout<<"The Number is less than 50";

}



if(Num == 50)

{

cout<<"The Number is equal to 50";

}



if(Num > 50)

{

cout<<"The Number is bigger than 50";

}

return 0;

}



السطور ذات اللون الازرق قد سبق شرحها لك في الدرس الاول – اذا كنت لا تتذكر عد الى الدرس الاول للمراجعة



لقد بدأت السطور الحمراء بالامر

cin<<Num;



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

وألآن الى الاوامر التالية موضع شرحنا اليوم



if(Num < 50)

{

cout<<"The Number is less than 50";

}

والقاعدة هي الامر if ويفتح قوسين عاديين بينهما شروط حسب القاعدة السابق شرحها في اول الموضوع ثم قوس لبداية بلوك تعليمات واحد لفتح بداية بلوك والاخر للتحديد نهاية بلوك ومابداخل القوسين عدة تعليمات ينفذها البرنامج اذا تحقق الشرط



وهنا الشرط هو انك اذا ادخلت قيمة اصغر من 50 فمعنى ذلك تحقق الشرط وعليه سوف يطبع البرنامج الرسالة



cout<<"The Number is less than 50";



واذا لم يتحقق الشرط فلن يطبع الرسالة السابقه بل سيتحول الى السطور التالية



if(Num == 50)

{

cout<<"The Number is equal to 50";

}

بنفس الاسلوب السابق يختبر الامر if ماذا كان الرقم الذي ادخله المستخدم يساوي 50 فاذا كان ذلك صحيحا فسوف يقوم بتنفيذ الامر او الاوامر التي بداخل بلوك الشروط وهي



cout<<"The Number is equal to 50";



فاءذا لم يتحقق الشرط فسوف لن ينفذ البرنامج مابداخل بلوك الشروط وينتقل الى السطور التالية



if(Num > 50)

{

cout<<"The Number is bigger than 50";

}

فاذا تحقق الشرط هو ان العدد المدخل اكبر من خمسون فسوف ينفذ البرنامج الامر او الاوامر التي بداخل بلوك الشرط وهو الامر



cout<<"The Number is bigger than 50";



والا فسوف ينتقل البرنامج الى السطور التالية

return 0;

}

حيث ينتهي البرنامج ويخرج وتذكر قوس اغلاق البلوك وهو البلوك الرئيسي للدالة main





البرنامج السابق هو برنامج بسيط يقوم باستقبال رقم منك ليتعرف عليه ما اذا كان هذا الرقم اصغر من او يساوي او اكبر من 50 وفي كل حالة حسب ماتدخل من ارقام سوف يطبع لك الرسائل



· الرقم اصغر من 50

· الرقم يساوي 50

· الرقم اكبر من 50

بالطبع سوف تحصل على اجابة واحدة من الثلاثه حسب المدخلات



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



if (A == 5 && B == 7)

{

نفذ هذه الاوامر عند تحقق الشرط

}

الشرط هو ان تكون قيمة المتغير A تساوي خمسة وقيمة المتغير B تساوي 7 لتنفيذ ما بداخل بلوك الشروط فاءذا كانت مدخلاتك كما يلي



A
B
مدى تحقق الشرط

3
2
لايتحقق الشرط

5
3
لايتحقق الشرط

3
7
لايتحقق الشرط

5
7
يتحقق الشرط

7
5
لايتحقق الشرط

1
2
لايتحقق الشرط




ولمثال آخر بلوك الشروط التالية



if (A > 5 || B <= 7)

{

نفذ هذه الاوامر عند تحقق الشرط

}

وقد كان الشرط السابق ان تكون قيمة A اكبر من 5 أو قيمة B اصغر من او تساوي

7 فلو كانت ادخالاتك كمايلي



A
B
مدى تحقق الشرط

3
2
لايتحقق الشرط

5
3
لايتحقق الشرط

3
7
لايتحقق الشرط

7
2
يتحقق الشرط

10
8
لايتحقق الشرط

10
7
يتحقق الشرط




دائما يكون امامك حالة من اثنين مهما كانت الشروط التي تضعها

· الحالة الاولى تحقق الشرط او بمعنى آخر TRUE

· الحالة البديلة عدم تحقق الشرط او بمعنى FALSE



ان مابداخل اقواس الشروط ولا اقصد بلوك الشروط هو عملية حسابية – دائما كل شئ بالنسبة للكومبيوتر هي عمليات حسابية كل شي في الدنيا يمكن ان يعبر عنه بارقام من اسمك الى صورتك مرورا بخريطة بلدك او نوع الفاكهة التي تحبها – كل شئ نعم كل شئ هو عمليات حسابية – ربما نتطرق الى ذلك لااحقا – لاادري قد يجبرنا احد الامثلة على شرح ذلك – وناتج العملية الشرطية بالنسبة للكومبيوتر هو اما TRUE لينفذ مابداخل بلوك الشروط او FALSE لينفذ شروط اخرى داخل بلوك else اذا كان موجودا او يستكمل باقي سطور البرنامج كما حدث مع المثال السابق هذا يقودنا الى امر آخر من اوامر الشروط وهو في لغة c++ ودائما يكون تابع للامر if وهو الامر

else



انت لاتحتاج الآن لان اقول لك ان اوامر لغة سي في مجملها تكتب بحروف صغيرة ودعني اكمل شرح الامر السابق انه امر غير مستقل انه تابع بالطبع انت توافقني على ذلك انك لايمكن ان تسمع شخص يقول والا – الا اذا كان قد ذكر اشياء قبلها اذا هذا الامر تابع فاذا كنت تكره الاشخاص التابعين من ذوي الشخصيات الضعيفة فارجو الا يمتد بغضك هذا الى الامر else لانه امر هام ويسهل خطوات كثيرة وان كان يسهل الاستغناء عنه ودعنا نعبر عن ذلك بعدة سطور



if(GiveMe >= 50)

{

cout<<"Thank you – I like to take more than or equal 50 Rayals";

}

else

{

cout<<"I am very angry – I don’t like to take less than 50 Rayals";

}



جزء البرنامج السابق يعبر عن رد فعل احد الشحاذين فاذا اعطيته مبلغ اكبر من او يساوي 50 ريالا سوف يتحقق الشرط والنتيجة تكون TRUE لينفذ مابداخل بلوك الشروط لينفذ الامر الخاص بطبع رسالة شكر ليخبرك بأنه (الشحاذ ولست انا بالطبع) يقول لك شكرا انا دائما احب ان تعطيني مبلغ خمسون ريالا او اكثر واذا لم يتحقق الشرط اي ان نتيجة العملية الحسابية FALSE كأن تكون قد اعطيته اقل من 50 ريالا فسوف ينتقل التنفيذ مباشرا الى البلوك التابع else لينفذ مابداخل بلوكه وهي هنا رسالة ضيق وتبرم بأنه لايحب ان يأخذ اقل من خمسون ريالا حتى لوكانت المبلغ يقل بهللة واحدة فقط عن الخمسون ريالا انها عمليات حسابية ياصديقي العزيز وانا انصح من يمتهنون هذه المهنه ببرمجة روبوت بجزء البرنامج السابق مع مزيد من الشكر والأدعية في حالة تحقق الشرط وتبرم وضيق ولامانع من سيل من الشتائم في حالة عدم تحقق الشرط . ياله من روبوت رائع وسوف يختزن بداخله مبالغ مالية كثيرة سواء لخفة دمه في حالة تحقق الشرط او لقلة ادبه في حالة عدم تحقق الشرط.

سوف تختتم هذا الدرس بهذا الملخص الذي قد يقود الى قاعدة هامة



if(FALSE)

{

Not executed if its false

}

else

{

do all of this

}

إلى اللقاء في الدرس القادم إنشاء الله
لاتنسونا من دعائكم الصالح


مضاد حيوي
كلية لطب

أبو تركي
02-03-2005, 12:19 PM
يا سلام عليك (مضاد حيوي )

موضوع رائع وجهد جبار

تسلم يمينك

مضاد حيوي
02-03-2005, 12:20 PM
تعلم سي بلس بلس

الدرس الثالث

الحلقات والتكرارات




مساء الخير

سندخل في الموضوع مباشرة بدون لف أو دوران مع ان الموضوع يتعلق بالدوران والتكرار لقد تحدثنا عن فكرة الحلقات التكرارية او Loops في المقال العام عن البرمجة اذا لم تكن قد قرأته من فضلك راجعه الآن

طريقتين لعمل هذه الحلقات الاسلوب الاول بلامر for والثاني بالامر while

لنأخذ جزئية البرنامج التالي



#include <iostream.h>

int main()

{

int x;

for(x=0;x<100;x++)

{



cout<<x<<endl;

}

return 0;

}





السطور ذات اللون الازرق تناولنا شرحها بالدرس الاول أما السطور ذات اللون الاحمر فهي موضوع دراستنا اليوم

تقوم الحلقات التكرارية بتنفيذ عدة اوامر موضوعة داخل بلوك ونقصد ببلوك مابين القوسين } مجموعة اوامر{ الى ان تنتهي الحلقات او عدد الحلقات المحددة منك وعددها في مثالنا السابق 100 حلقة تكرارية وبدقة تبدء الحلقات من رقم صفر الى رقم 99 ومعنى ذلك ان العدد الاجمالي 100 حلقة بعد حساب الصفر من ضمن الارقام انتبه لذلك وتذكر ان المتغير x يجب الاعلان عنه قبل استخدامه وذلك حسب نوع استخدامك له وهنا استخدمنا نوعه كعدد صحيح بالطبع يمكنك استخدامه كعدد عشري واليك صيغة الامر بالتفصيل





الصيغة
التفسير

for
امر اللغة لعملية التكرار

(
قوس مفتوح يوضح بداخله بارامترات الامر

x=0;
المتغير = رقم بداية الحلقات

x<100;
شرط نهاية الحلقات

x++
المتغير يزيد بمقدار واحد مع بداية كل حلقة – لاتضع بعده فاصلة منقوطة

)
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة

{
قوس بداية بلوك الاوامر المطلوب تكرارها

بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها

}
قوس نهاية بلوك الاوامر المطلوب تكرارها




بداخل بلوك الاوامر تم تنفيذ الامر

cout<<x<<endl



وهو امر يقوم بطبع قيمة x التي تتغير في كل مرة ابتداء من صفر حسب ماذكرت ان

X=0 وتزيد في كل مرة بمقدار 1 حسبما ذكرت ان x++ وذلك حتى يصل الى 99 حسبما ذكرت ان x<100

وendl تعني end of line اي انتقل الى سطر جديد كلما طبعت قيمة حتى لا يسرد طبع الارقام متجاورة بل يطبع على كل سطر قيمة المتغير وبالتالي ستكون مخراجات البرنامج كما يلي

0

1

2

3

4

.

.

.

99



لنستفيد اكثر من قوة الحلقات التكرارية وايضا نرى امكانات اخرى لها بوضع حلقة داخل حلقة كما يلى في البرنامج الذي يطبع جدول الضرب من جدول واحد حتى جدول 12



#include <iostream.h>

int main()

{

int x , y , z;

for(x=1;x<13;x++)

{

for(y=1;y<13;y++)

{

z = x * y;

cout<<x<<”*”<<y<<”=”<<z<<endl;

}

}



return 0;



}

كما تعلم ان السطور الزرقاء سبق دراستها ولكن ننوه فقط اننا اعلنا عن ثلاث متغيرات لاعداد صحيحة الاول للحلقة الاولى والثاني للحلقة الثانية والثالث لاحتواء حاصل الضرب وهو الهدف من البرنامج.

بنفس ماسبق شرحه وضعنا حلقة تكرارية تبدء من رقم واحد وتنتهي برقم 12 وتزيد بمقدار واحد واوامر هذه الحلقة مكتوبة للتوضيح بخلفية صفراء حيث بدأت الحلقة بالصيغة السابق شرحها ثم قوس بداية البلوك وقوس نهاية البلوك حيث يوضع مابين القوسين سلسلة اوامر لتنفيذها كما سبق واتفقنا عليه



for(x=1;x<13;x++)

{



اوامر مطلوب تنفيذها


}



وبداخل اقواس البلوك للحلقة الاولى مطلوب وضع اوامر للتنفيذ فكانت اوامر التنفيذ داخل البلوك عبارة عن حلقة اخرى وما المانع فالحلقات وغيرها هي نفسها اوامر والحلقه الاخرى كانت عبارة عن عداد يعد من الرقم 1 الى الرقم 12 وهي ايضا تحتاج الى صيغة معينة واقواس بلوك للتنفيذ وهي موضوعة في البرنامج بخلفية خضراء كما يلي

for(y=1;y<13;y++)

{

z = x * y;

cout<<x<<"*"<<y<<"="<<z<<endl;

}

وبداخل بلوك الاوامر للحلقة الثانية وضعنا عدة اوامر لتفى بالغرض الذي من اجله تم عمل البرنامج وهو جدول الضرب – عبارة عن معادلة لحساب حاصل ضرب المتغيرين x و y

ويوضع الناتج في المتغير z كما يلي



z = x * y;

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



· يبدء البرنامج بالدخول الى الحلقه الاولى ويخصص للمتغير اكس القيمة واحد حيث انها قيمة عداد البداية ثم يدخل الى داخل اقواس بلوكه لتنفيذ ما بداخله فيجد حلقه اخرى فيبدء بتنفيذها وطلبت الحلقة ان يكون متغيرها واي يبدء بالقيمة واحد وينتهي بالقيمة 12 ثم تدخل الحلقة الثانية الى بلوك اوامرها فتجد معادلة يضرب فيها قيمة اكس التي هي واحد الآن وتتغير قيمة واي فيها ثم طبع النتائج وتظل الحلقة الداخلية تنفذ بتغير واي مع ثبات اكس بالطبع وتكون النتائج كما يلى



1 * 1 = 1

1 * 2 = 2

1 * 3 = 3

.

.

.

1 * 12 = 12

وعند وصول نهاية عداد الحلقة الداخلية الى 12 وهو نهاية الحلقة ينتهي تنفيذ الحلقة فيستمر البرنامج فيجد امامه قوس نهاية الحلقه الخارجية ذو الخلفية الصفراء فيعود الى الحلقة الخارجيه حيث تزيد قيمة اكس بمقدار واحد وتصبح قيمتها = 2 فيدخل الى بلوك اوامره كما سبق فيجد حلقة اخرى تبدء من واحد وتنتهي ب 12 وبداخلها معادلة وامر طبع فيكون التنفيذ كما يلي

2 * 1 = 2

2 * 2 = 4

2 * 3 = 6

.

.

.

2 * 12 = 24



وهكذا يستمر التنفيذ الى ان تصل الحلقة الخارجية الى نهايتها بالرقم 12 واثناء ذلك تنفذ الحلقة الداخلية من بدايتها الى نهايتها اي من 1 الى 12 وتطبق المعادلة وامر الطبع ليكون اخر تنفيذ كما يلي

12 * 1 = 12

12 * 2 = 24

12 * 3 = 36

.

.

.

12 * 12 = 144



شرح صياغة امر الطبع بالصورة التالية





cout<<x<<"*"<<y<<"="<<z<<endl;



مابداخل علامات الاقتباس دائما يطبع كما هو وهو مميز اعلاه بالخلفية الخضراء وكل مايوضع داخل علامة الاقتباس يطبع نصه كما هو اما ماهو خارج علامات الاقتباس بين ازواج الاقواس >>متغير>> فيطبع قيمة المتغير وليس اسم المتغير فمثلا x لاتطبع x ولكن تطبع قيمتها فمثلا 1 – 2 – 3 ----- 12 حيث انها متغيرات وتميز اعلاه بالخلفية الصفراء وذلك للحصول على شكل مقبول يوضح العملية المطلوبة لتظهر النتائج بالصورة



12 * 12 = 144



والآن الى النوع الثاني من الحلقات وهو ابسط من السابق ولكن السابق اكثر استخداما واكثر قوة



While



#include <iostream.h>



int main()

{

int x=0;

while(x<100)

{

cout<<x<<endl;

x++;



}

return 0;

}



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



while(x<100)



وبعد الاعلان عن المتغير اكس خلاصة شرح الامر السابق (أعد تنفيذ ما بداخل البلوك طالما اكس او المتغير اقل من 100 ثم اقواس بلوك تضع ماشئت بداخله من اوامر وقوس نهاية البلوك ويزيد معنا فقط عداد للمتغير ليزيده بالمقدار الذي تريده ويوضع في اي مكان داخل الحلقة او حسب افكارك عن البرنامج المهم لاتنساه والا سوف يدور البرنامج داخل الحلقة الى الابد حيث ان شرط نهايتها ان تزيد اكس عن 100 وطالما لم تضع عداد زياده للمتغير فلن يتحقق الشرط وبالتالى لن تنتهي الحلقه الى الابد ويظل يعمل الكومبيوتر بلا نهاية للبرنامج ويميز العداد بالخلفية الصفراء واليك جدول صياغة الامر الذي تعودنا عليه.



الصيغة
التفسير

while
امر اللغة لعملية التكرار

(
قوس مفتوح يوضح بداخله بارامترات الامر

X<100
المتغير مع شرط لنهاية الحلقة

)
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة

{
قوس بداية بلوك الاوامر المطلوب تكرارها

بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها

x++;
ولا تنسى عداد الزياده او النقصان ليتحقق الشرط لانهاء تنفيذ الحلقة

}
قوس نهاية بلوك الاوامر المطلوب تكرارها






لقد ذكرت لك كلمة عداد الزيادة او النقصان نعم يمكن ان يتناقص العداد اذا كانت صيغة البرنامج كما يلي وذلك لطبع قيمة المتغير تناقصيا من 99 الى صفر بعد ان كان في البرنامج السابق تصاعديا من صفر الى 99 ويكون التعديل كما يلي



#include <iostream.h>



int main()

{

int x=99;

while(x>0)

{

cout<<x<<endl;

x--;



}

return 0;

}



بدء هنا تخصيص المتغير مع الاعلان بالقيمة 99 ثم شرط التكرار ان يكون متى كانت قيمة المتغير اكبر من الصفر ثم عداد تناقصي يظل يطرح واحد من القيمة الى ان يصل الى الصفر ثم يطرح من الصفر 1 فتصبح قيمته –1 وبالتالي لايتحقق الشرط حيث ان قيمة –1 ليست اكبر من الصفر وتنتهي الحلقه كما نريد




مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:33 PM
تعلم سي بلس بلس

الدرس الرابع



الدوال


مساء الخير

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

· تقسيم البرنامج الى اجزاء صغيرة تستدعى وقت اللزوم

· عدم ازدحام الدالة الرئيسية للبرنامج بأوامر كثيرة

· تقسيم البرنامج الى اجزاء يمكن اختبارها منفصلة لسرعة تحديد الخلل بالبرنامج

· توفير المجهود والوقت والتفكير بعمل مكتبة خاصة بك تعيد استخدام الدوال التي استخدمتها في برنامج وذلك في برنامج آخر عند اللزوم

· تقسيم العمل بين المبرمجين عن العمل في مشروع جماعي لانتاج برنامج كبير

· تبادل الخبرات بين مطوري البرامج بنشر اجزاء يستخدمها الآخرون في برامجهم

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



#include <iostream.h>

int main()

{

int x , y , z;

for(x=1;x<13;x++)

{

for(y=1;y<13;y++)

{

z = x * y;

cout<<x<<”*”<<y<<”=”<<z<<endl;

}

}



return 0;



}

لوكنت قد تذكرت الآن فان البرنامج كان يقوم بعمل جدول الضرب من جدول واحد الى جدول 12 واحتوى كامل التعليمات داخل الدالة الرئيسية دعنا نستخدم الدوال ولنسمي هذه الدالة DoiT



#include <iostream.h>

void DoiT (void);



int main()

{

DoiT ();

}



// This is the new function

void DoiT (void)

{

int x , y , z;

for(x=1;x<13;x++)

{

for(y=1;y<13;y++)

{

z = x * y;

cout<<x<<”*”<<y<<”=”<<z<<endl;

}

}



return ;



}

مايخص الدالة الجديدة مكتوب باللون الاحمر فقبل الدالة الرئيسة main تم الاعلان عن نموذج الدالة او ما يسمى prototype بهذا الشكل



void DoiT (void);



وفيه نخبر الكومبايلر بشكل وما ستكون عليه الدالة كما يلي



الصيغة
التفسير

void
ماهي القيمة التي سوف تعيدها الدالة للدالة التي استدعيت منها وذلك بالامر return هنا استخدمنا void بمعنى لاشئ وبالتالي علينا استبدال return 0 التي استخدمناها في الدرس الثالث الى الامر return فقط حيث اننا اعلنا ان الدالة غير مطلوب منها اعادة شئ

DoiT
اسم تختاره لدالتك بحيث يكون معبرا قليلا عما ستفعل انا هنا لم اختر اسم معبر

(
قوس لاحتواء البارامترات التي ستمرر للدالة

void
البارامترات التي ستمرر للدالة وهنا اخترنا void بمعنى لن نمرر لها شئ

);
قوس اغلاق لمجموعة البارامترات يليها فاصلة منقوطة






والآن الى باقي سطور البرنامج لاستكمال الشرح

int main()

{

DoiT ();

}

كما سبق ولابد ان نعلن عن الدالة الرئيسية للبرنامج وهو الزام ثم داخل بلوك الدالة الرئيسية قمنا بالنداء على الدالة للتنفيذ وذلك بكتابة اسمها ثم قوسين لايوجد بينهما شئ هل تتذكر لماذا لان البارامترات المطلوب تمريرها للدالة لم تعطى اي void ولكن بالطبع لاتكتب void ولكن يكون ذلك في الاعلان عن الدالة فقط وهو على الصورة التالية



DoiT();



تلى ذلك قوس نهاية البلوك للدالة الرئيسة ثم جسم او هيكل الدالة نفسها ويبدء بنفس الاعلان عن اسم الدالة او البروتوتايب ولكن بدون فاصلة منقوطة في النهاية وكما تلاحظ وسبق ان قلنا ان الفاصلة المنقوطة لاتأتي بعد main() وبنفس الطريقة لاتأتي في مقدمة بلوك الدالة

void DoiT (void)

{

ضع اوامر الدالة هنا



}

ثم قوس بداية بلوك الدالة ثم مابداخلها من اوامر وقوس النهاية ودعنا ننتهز فرصة الدوال لاعطاءمزيد من التحسينات على البرنامج حيث ان البرنامج ينتج فقط جدول الضرب من جدول 1 الى جدول 12 فلماذا لانجعلها دالة عامة تنتج مايحلو لنا من جداول ضرب من المؤكد انك تتفق معي في ذلك وبذلك نستفيد من قوة الدوال وتصبح دالة عامة غير موجهه لمهمة ثابته فنحن نريد ان نحدد نحن بداية الجداول ونهايتها فتارة تطبع من جدول 7 الى جدول 20 وتارة تطبع من جدول 17 الى 40 وهكذا اليس هذا افضل سوف نمرر للدالة قيمة البداية وقيمة النهاية مع اجراء التعديلات اللازمة لذلك.



#include <iostream.h>

void DoiT (int Start , int End);



int main()

{

int Start , End;

cout<<"Please input start value ?: ";

cin>>Start;

cout<<"Please input end value ?: ";

cin>>End;

DoiT (Start , End);

}



// This is the new function

void DoiT (int Start , int End)

{

int x , y , z;

for(x=Start;x<End+1;x++)

{

for(y=Start;y<End+1;y++)

{

z = x * y;

cout<<x<<”*”<<y<<”=”<<z<<endl;

}

}



return ;



}



لتسهيل الامر عليك وضعت لك لون اصفر على التعديلات التي اجريتها للوصول الى الهدف المنشود لقد وضعنا في اقواس البروتوتايب اعلان عن تمرير متغيرين صحيحين الى الدالة



void DoiT (int Start , int End);

ثم داخل الدالة الرئيسية اعلنا عن استخدام متغيرين جديدين من نوع الاعداد الصحيحة هما

int Start , End;



تلى ذلك امر بطبع رسالة تطلب منك ادخال قيمة بداية الجدول وبعده امر بعملية الادخال نفسها ليعرف البرنامج القيمة المبدئية لبداية الجدول



cout<<"Please input start value ?: ";

cin>>Start;



مثلهما تماما للمتغير الثاني ليعرف البرنامج قيمة النهاية والتي كانت ثابتة سابقا على القيمة 12 ونحن نريد برنامج اكثر مرونة ومطوع لكل الحالات



cout<<"Please input end value ?: ";

cin>>End;

بعد ان ادخلت قيمة البداية والنهاية فكما ذكرنا تم تعديل الدالة لتمرير متغيرين لها يتغيران مع كل ادخال والآن لننادي الدالة ممرين لها القيمتين الذين ادخلهما مستخدم البرنامج



DoiT (Start , End);



ثم اجرينا تعديل على اسم الدالة نفسها ليوافق البروتوتايب او اعلان الدالة الجديد في مقدمة البرنامج طبعا بدون فاصلة منقوطة

// This is the new function

void DoiT (int Start , int End)

{

ثم تلى ذلك وضع القيمة Start الممررة للدالة كبداية عداد للحلقتين بدلا من القيمة 1 وكذلك المتغير End الممرر الى الدالة كنهاية لعداد الحلقتين بدلا من القيمة 13 في مثال الدرس الماضي



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



#include <iostream.h>

void DoiT (int Start , int End);



int main()

{

int Start , End;

A1:

cout<<"Please input start value ?: ";

cin>>Start;

cout<<"Please input end value ?: ";

cin>>End;



if (Start >= End) goto A1;



DoiT (Start , End);

}

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



الى مثالنا الاخير وهو دالة تعيد قيمة ويممر اليها بيانات



#include <iostream.h>

float Mul (float A , float B);



int main()

{

float A , B , R;

cout<<"Please input A ?: ";

cin>>A;

cout<<"Please input end B ?: ";

cin>>B;





R = Mul (A , B);



cout<<R;



}



float Mul (float A , float B)

{

return A*B;

}

الدالة الجديدة اسميناها Mul وتعيد هذه الدالة قيمة عشرية وهي حاصل ضرب قيمتين عشريتين تم تمريرها اليها وكما ترى المثال بسيط ومعظم اجزائه سبق شرحها





مضاد :1ongue: حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:35 PM
تعلم سي بلس بلس

الدرس الخامس

حالات التبديل وأوامر القفز


مساء الخير

قد تحتاج في برنامجك الى قائمة (او حالة تشابه ذلك) تطلب من المستخدم ادخال رقم الاختيار او الضغط على زر معين لانجاز مهمة ومما سبق دراسته يمكن وضع عدة شروط لتنفيذ دالة معينة حسب الاختيار ولكننا سنعرض اليوم امر يقوم بتسهيل مثل هذه العمليات ولندخل في الموضوع مباشرة



#include <iostream.h>

#include <conio.h>



void Input (void);

void Display (void);

void Modify (void);



int main()

{

char input;



StartMenu;



cout<<"1. Enter Data";

cout<<"2. Display Data";

cout<<"3. Modify Data";

cout<<"4. Exit";

cin>>input;





switch (input)

{



case 1: Input(); break;



case 2: Display(); break;



case 3: Modify(); break;



case 4: return 0; break;



default:

cout<<"Error, bad input, quitting";

goto StartMenu;

}



return 0;



}



void Input (void)

{

//This the input function

;

;

;

}



void Display (void)

{

//This the display function

;

;

;

}

void Modify (void)

{

//This the modify function

;

;

;

}






الاوامر ذات اللون الازرق سبق شرحها اما الاوامر والتعليمات ذات الخلفية الصفراء فهي موضوعنا اليوم – بدء البرنامج بأمر من اوامر المعالج المبدئي وذلك بضم الملف

<conio.h> وهو لازم للامر switch موضع دراستنا اليوم



تلى ذلك تعريف لمتغير input ثم رسائل طبع على الشاشة تخبر مستخدم البرنامج بقائمة البرنامج والازرار التي ينبغي ان يضغطها لتحقيق عنصر القائمة الموجود ثم يتوقف ليطلب ادخال قيمة الاختيار ما بين الارقام من 1 الى 4 ولندخل الآن الى الامر





switch (input)

{









}



وتتضح صيغته كما تعودنا من الجدول التالي





الصيغة
التفسير

switch
هو الامر الذي ندرسه الان ومعناه اختبار ما بداخل القوسين

(
قوس مفتوح لاحتواء متغير

input
متغير سبق الاعلان عنه وادخل من المستخدم او تم حسابه حسب فكرة البرنامج

)
اغلاق القوس الذي يحتوي المتغير المطلوب اختباره

{
قوس بداية البلوك

هنا توضع الاوامر بالصيغة التي سيلي شرحها

}
قوس نهاية البلوك – لاتنساه من فضلك






وبداخل بلوك الامر switch توضع الاوامر بالصيغة التاليه



الصيغة
التفسير

case
الامر التابع للامر الرئيسي switch

1
حالة الادخال المطلوب دراستها كأن يكون الادخال 1 أو 2 وهكذا او حسب نوع المدخل وفكرة البرنامج

:
نقطتين تلى قيمة المتغير للتنفيذ في حالة تطابقها مع الادخال او الحسابات

ضع هنا مايحلو لك من معادلات او استدعاء لدالة او اوامر حسب فكرة البرنامج وقد وضعت انا استدعاء لدالة

break;
انتهاء الاوامر ليعرف نهاية الحالة




تكرر الاوامر السابقة لجميع الحالات المطلوب اختيارها حتى نصل الى جزئية هامة وهي ماذا يجب على البرنامج ان ينفذ اذا كان الادخال لايتطابق مع كل الحالات السابقة فالبرنامج طلب ادخال اي رقم من 1 الى 4 فماذا لو ادخل المستخدم غير ذلك لابد ان يكون للبرنامج قرار في هذه الحالة وعليك اضافة الحالة الخاصة التالية قبل قوس اغلاق بلوك switch بالصيغة التالية





الصيغة
التفسير

default
الامر التابع للامر الرئيسي switch للحالة الخاصة بعدم تطابق الادخال مع الحالات التي سبق دراستها

:
نقطتين تلى الامر السابق

ضع هنا مايحلو لك من معادلات او استدعاء لدالة او اوامر حسب فكرة البرنامج وقد وضعت انا امر بطبع رسالة خطأ وامر آخر بالقفز لبداية البرنامج لاعادة العملية لان الادخال خطأ

break;
انتهاء الاوامر ليعرف نهاية الحالة وهو اخياري هنا لعدم وجود اوامر بعده بل يوجد قوس نهاية البلوك switch






ملاحظة هامة:

لم نتعرض لامر القفز goto في درس منفصل لبساطته ولكن سنشرحه هنا بسرعة هذا الامر عبارة عن الامر نفسه يليه عنوان لايهم اين يكون هذا العنوان ولكن كل مايهم عدم تكرار نفس العنوان بنفس الاسم في نفس الدالة ولامانع من تكرار او استخدام نفس الاسم ولكن في دوال اخرى حيث تعمل الدوال بصفة منفصلة وانا اخترت العنوان StartMenu

يليه نقتطين ولامانع ان تختار ما يحلو لك من اسماء شرط عدم تكرارها كما سبق وذكرنا وهذه هي صيغة كتابة الامر







الصيغة
التفسير

goto
امر القفز المطلوب دراسته

StartMenu
العنوان الذي اخترته

;
الفاصلة المنقوطة التي تلي جميع الاوامر

StartMenu:
العنوان ويليه نقتطين لتعريف البرنامج بأنه عنوان وهو اختياري ولايهم اين يوضع بل يوضع في اي مكان حسب فكرة البرنامج والمهم ان يكون ضمن نفس الدالة




ملاحظة اخرى

لو لاحظت انني وضعت العنوان StartMenu قبل بدايه اوامر طبع القائمة ليعاد طبعها وادخال المتغيرات متى كان الادخال خطأ وبتوجيه من الامر goto ولكني وضعته بعد الامر



char input;

لانه اعلان ولا يهم البرنامج اعادة الاعلان بل قد يعترض الكومبايلر نفسه اذا فعلت ذلك



مضاد :bye1: حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:41 PM
تعلم سي بلس بلس

الدرس السادس

هياكل البيانات


مساء الخير

نتناول اليوم موضوع رائع وقوي جدا من الناحية البرمجية- لقد تعلمت فيما سبق كيف تعلن عن بيانات حسب نوعها وقد كنت تعلن عنها بصورة منفصلة الآن وبنفس الطريقه سوف نعلن عنها ولكن في صورة مجمعة لتكون هيكل للبيانات وهذا الموضوع مفيد جدا في برمجه قواعد البيانات وسترى فوائد ذلك ولو اننا لم ندرس تخزين البيانات في ملفات على الاقراص حيث سنتناول ذلك في درس قادم ولكن عند تجميع البيانات في هياكل اذا قمت بتخزين الهيكل نفسه سيتم تخزين جميع عناصره دفعة واحدة دون ان تنسى اي عنصر وبالتالي يعطيك ميزة اضافيه عما لو كنت تعلن عن البيانات في صورة منفصلة كما سترى

ومثالنا اليوم عن قاعدة البيانات الافتراضية التالية سوف ندرسها بالطريقه العاديه وبطريقة هياكل البيانات لتعرف الفرق وتفهم الموضوع وفي نفس الوقت تدرك ميزات وفوائد هياكل البيانات

لنفرض ان هناك مصنع يعمل على فترتين ولكل عامل فيه سجل بيانات بالطبع لعامل الفترة الاولى والآخر لعامل الفترة الثانية ونفترض للتبسيط ان بيانات كل عامل تحتوي على اسمه ورقمه الوظيفي وراتبه اليومي حتى انه لوتغيب احدى الفترات وضع راتب يومه بالقيمة صفر حتى يتم حساب راتبه الشهري بصورة صحيحة وسيكون الاعلان عن البيانات بالصورة التاليه لنتفق عليها وفيها فائدة تكرار اشياء سبق الاشارة اليها في دروس سابقه

الصيغة
المتغير او وعاء البيانات

char [30]
اسم الموظف افترضنا انه متغير حرفي سعته 30 حرف

int
الرقم الوظيفي للموظف وهو عدد صحيح

float
الراتب اليومي للموظف وهو عدد عشري لان الراتب من المؤكد انه سيحتوي على كسور


دعنا الآن نعلن عن هذه البيانات بالصورة العادية لنعرف الفرق

بيانات موظف الفترة الاولى

char [30] Name1;

int Code1;

float Wage1;

بيانات موظف الفترة الثانية



char [30] Name2;

int Code2;

float Wage2;

الصورة السابقه لتمثيل بيانات البرنامج مع اثنين من الموظفين يعملون لفترتين وكلما ادخلت بيانات اسم موظف الفترة الاولى سوف تستخدم المتغير Name1 وللفترة الثانية ستستخدم المتغير Name2 فماذا لو بدلت المتغيرين بالخطأ بالطبع سيحدث خلل كبير بالبرنامج دعنا نمثل ماسبق تماما بالطريقة الجديده عن طريق استخدام هياكل البيانات

استخدام هياكل البيانات



struct OurDataBase

{

char [30] Name;

int Code;

float Wage;

}L1,L2;

انظر الى الصورة السابقه كم هي مختصرة انها رائعة وانا ارى فيها اختصار مفيد ودعنا نرى كيف نصيغ ذلك بالجدول الذي تعودنا عليه للتوضيح


الصيغة
التفسير

struct
هو الامر الذي ندرسه الان ومعناه الاعلان عن هيكل بيانات

OurDataBase
اسم الهيكل سميه كما شئت

{
قوس بداية البلوك

ضع ما يحلو لك من انواع بيانات داخل البلوك

}
قوس نهاية البلوك – لاتنساه من فضلك

L1,L2;
متغيرات اختياريه ترمز لمن سيشارك في استخدام البيانات المعلنه للهيكل


كما رأيت بالمثال لم نستخدم متغير اسم للموظف الاول وآخر للموظف الثاني بل استخدمنا متغير واحد وسوف يتشارك اي عدد حسب تصميم الهيكل في استخدام بيانات الهيكل ولنوضح ذلك

للتعبير عن اسم الموظف الاول او موظف الفترة الاولى

L1.Name

للتعبير عن اسم الموظف الثاني او موظف الفترة الثانية

L2.Name

للتعبير عن رقم الموظف الاول او موظف الفترة الاولى

L1.Code

للتعبير عن رقم الموظف الثاني او موظف الفترة الثانية

L2.Code

للتعبير عن الراتب اليومي للموظف الاول او موظف الفترة الاولى

L1.Wage

للتعبير عن الراتب اليومي للموظف الثاني او موظف الفترة الثانية

L2.Wage

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

L1.Name = “Mohamad Hasan”;

L1.Code = 120;

L1.Wage = 13.50;



L2.Name = “Ahamd Ali”;

L2.Code = 270;

L2.Wage = 0;

بالطبع هذه فكرة برنامج ويمكن اضافة المزيد من التحسينات من خلال تحليل البيانات فمثلا جمع المتغير L1.Wage لمدة شهر سوف يعطيك راتبه الشهر وجمع القيم التي تساوي صفر للمتغير L1.Wage لمدة شهر سوف يعطيك عدد ايام غيابه خلال الشهر وهذا يبقى دور تحليل البيانات لاستخلاص نتائج ومخرجات – المثال السابق كان لتوضيح الفكرة فقط.


مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:44 PM
تعلم سي بلس بلس

الدرس السابع

المصفوفات


مساء الخير

المصفوفات من الادوات الهامة في لغات البرمجة لتخزين قيم عددية او حرفية تحت نفس الاسم بمعنى آخر دعنا نرى المثال التالي لتخزين عدد

int A;

A=5;

في هذا المثال لم نستطع ان نخزن في المتغير المعلن عنه وهو عدد صحيح سوى قيمة واحدة فقط ولو حاولت (بالطبع تتفق معي في هذا ) تخزين قيمة اخرى فسوف تلغي القيمة الاولى لتحل محلها القيمة الجديده تقوم المصفوفات بعلاج هذه المشكلة مثال لذلك.

int A[50];

اعلن عن مصفوفة اعداد صحيحة تستطيع تخزين خمسون عدد صحيح كما يلي

A[0] = 5;

A[1] = 10;

.

A[49] = 300;

مع ملاحظة ان التعبير التالي سوف يعتبر خطأ جسيم مع لغة سي++

A[50] = 200;

رغم ان المصفوفة تتسع ل 50 رقم الا ان المصفوفة تبدء من العنصر A[0] وتنتهي بالعنصر A[49] وبذلك يكون مجموع العناصر 50 كما طلبت شاملا الرقم صفر وفي لغة سي++ دائما نبدء العد من صفر وليس من 1

ويمكن ان تكون المصفوفة ذات اتجاهين مثل

15 65 33 44

1 0 11 22

33 52 11 17

18 25 14 41

لتمثل بلغة سي ++ كما يلي

int A[4][4];

حيث يكون العدد 44 المظلل بالاحمر هو

A[0][0] = 44;



ويكون العدد 18 المظلل بالاخضر هو

A[3][3] = 18;

وافضل طريقة لتعبئة وتخصيص قيم لمصفوفة وللتعامل مع المصفوفات بصفة عامة هي عمل looping باستخدام for او غيرها كما سبق ووضحنا ذلك وكمثال لملئ المصفوفة التالية بالقيمة صفر


int A[100];

int I;

for (I = 0 ; I < 100 ; I++)

{

A[I] = 0;

}

بالطبع الدوران السابق يغير قيمة العداد من صفر الى 99 ووضعنا داخل البلوك تخصيص لعناصر المصفوفة وبدلا من وضع قيمة عددية لتشير لعنصر بالمصفوفة وضعنا رمز العداد حيث انه سوف يتغير مع الدوران الذي يحدث وبالتالي تتخصص القيم حسب الترتيب

ولتخصيص القيم صفر مثلا لمصفوفه ذات اتجاهين

int A[10][10] , I , J;

for (I = 0 ; I < 10 ; I++)

{

for (J = 0 ; J < 10 ; J++)

{

A[I][J] = 0;

}

}

بوضع دورتين واحدة تدور على الصفوف حتى تنهيها وتعود لتغير الصف وهكذا كما سبق وتعلمت

ولنا في المصفوفات مآرب أخرى

لاتحتوي لغة سي ++ على تعريف ثابت وداخلي للمتغيرات الحرفية ولذلك يتم تلافي ذلك باستخدام المصفوفات ربما يعترض واحد من المتابعين لهذه الدروس بأن الامر char يقوم بذلك نعم هو كذلك ولكنه يعرف المتغير على انه حرف واحد فقط ونحن سنتحايل عليه بالمصفوفات كما يلي

char Q;

Q = ‘A’;

عرفنا المتغير Q على انه حرف وبالتالي لانستطيع تخزين فيه سوى القيمة A فاءذا طلبت طباعة قيمة المتغير Q سيقوم البرنامج بطبع الحرف A فماذا لو اننا نريد تخزين عدة حروف تمثل اسم شخص اذا علينا بمصفوفة حروف كما يلي

char Q[40];

Q = “Mohamad Hasan”;

هل رأيت كيف تغلبنا على ذلك اعتمد الصيغة السابقة مؤقتا حتى الوصول لدرس يعطيك مزايا اكثر وشرح اوضح للمتغيرات الحرفية


مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:45 PM
تعلم سي بلس بلس

الدرس الثامن

المتغيرات الحرفية


مساء الخير

لقد تحدثنا في الدرس السابق عن تخزين الحروف في مصفوفات وألان سوف نعيد ما قلناه بشئ من التفصيل لنأخذ مثال مشابه لما سبق تماما

char A[50];

سوف تتذكر الآن ماقلناه بأن المصفوفة السابقة تقوم بتخزين اسم او مجموعة حروف عددها 50 حرف شاملا المسافات التي بين الاسماء فعند ضغطك على قضيب المسافات يعتبر حرف ولكنه ليس له شكل لينتج المسافة بين الكلمات المهم ان المجموع 50 حرف تبدء المصفوفة من صفر الى 49 كما قلنا سابقا ان مصفوفات سي++ تبدء من صفر وليس من واحدد ولذلك الاعداد من صفر الى 49 هي 50 عدد وبالتالي عدد الحرف المخزنة هي 50 حرف كما سبق وطلبت وتم تلبية طلبك كل ذلك قلناه سابقا ولكن دعني اضيف بأن عدد الحروف التي سوف تدخلها سوف تكون 49 فقط وليس 50 لان سي++ تضيف في نهاية المتغير الحرف رقم 50 من عندها وهو الحرف \0 وهو يعني نهاية المتغير الحرفي ليعرف نظام التشغيل بأن هذه هي نهاية المتغير ولا يوجد شئ بعدها والرمز السابق يطلق عليه NULL character

وخلاصة القول ان تعلن عن المصفوفة بعدد يزيد بواحد عن سعتها المدخلة

لا تتضايق مما تفعلة سي++ من اضافة رمز على حسابك الخاص في نهاية المتغير انك تفعل ذلك وانا ايضا افعل ذلك فعند كتابة فقرة مكونة من حروف نضع نقطة في نهاية الكلام لنفيد القارئ بأن الكلام انتهى – أليس كذلك


استخدام المؤشرات للاعلان عن متغيرات الحروف

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

char *A;

وهذه طريقة اخرى للاعلان عن متغيرات حرفية تحتوي مميزات اكبر

A = new char [50];

ولنأخذ طريقة صياغة الامر السابق بجدولنا المعتاد


الصيغة
الشرح

A
اسم المصفوفة المفترض

=
لابد ان توضع لتون الصيغة صحيحة

New
من اوامر اللغة للاعلان عن متغير جديد

char
نوع المصفوفة (حروف)

[50];
قوسين بينهم سعة المصفوفة




والجديد في الصيغة السابقة هو انك بعد ان تنتهي من جميع العمليات الخاصة بالمصفوفة السابقة يمكن ان تلغيها ولذلك لتفريغ المساحة الخاصة بها من الذاكرة وهذه هي سي++ القوية جدا وذلك بالصيغة التالية



delete [A] ;

ادخال المتغيرات الحرفية

بالطبع ليس عندك مشكلة الآن في ادخال المتغيرات الحرفية باستخدام cin ولكن لزم هنا التنويه بأن هذا الامر بالفعل سوف يدخل الحروف ولكنه سوف يتوقف عن الادخال عند الضغط على قضيب المسافة فلو انك تريد ادخال الاسم Mohamad Hasan الى متغير حرفي سوف يستقبل الاسم Mohamad وعند ضغطك على قضيب المسافة لادخال بقية الاسم Hasan

حينها سوف يتوقف ولا يقبل الا الجزء الاول من الاسم وعليه استخدام احد عناصر فئة cin والفئات سوف نشرحها في درس قادم وهو

cin.getline (A,50,’\n’);

وصيغتة كما يلي

الصيغة
الشرح

cin.getline
الامر المشتق من cin

(
قوس احتواء البارامترات

A
اسم المصفوفة السابق الاعلان عنها

,
فاصلة بين بارامترين

50
طول او عدد الحروف المتوقع ادخالها

,
فاصلة بين بارامترين

‘\n’
معناه سطر جديد بعد المتغير ويمكنك اهمال هذا البارامتر

);
قوس نهاية احتواء البارامترات والفاصلة المنقوطة لانها ادخال الصيغة كلها


مزيدا من الدوال التي تتعامل مع المتغيرات الحرفية

انها عدد من الدوال للمقارنة بين الحروف والتعامل معها كما سيلي شرحه

char Name1 [30] = “MOHAMAD HASAN”;

char Name2 [30] = “mohamad hasan”;

int L;

L = strcmp (Name1 , Name2);

الدالة strcmp تقارن بين متغيرين حرفيين مع الاخذ في الاعتبار حالة الحروف الصغيرة والكبيرة فالحرف A بالنسبة لها غير الحرف a وتعيد قيمة عدد صحيح يخزن في المتغير الصحيح L كما يلي



القيمة المعادة
الشرح

اصغر من الصفر
عندما يكون الاسم الاول اصغر من الثاني

تساوي صفر
عندما يتساوى الاسمان

اكبر من الصفر
عندما يكون الاسم الاول اكبر من الثاني


ربما يسأل احدكم سؤال ما معنى ان يكون اسم اكبر من اسم حيث ان اسم يساوي اسم هو شئ مفهوم اي تطبق الحروف فما معنى ان يكون اكبر او اصغر – نعم ربما يهمك فقط عملية التساوى كأن تدخل كلمة سر يتم مقارنتها مع كلمة اخرى مخزنة داخل الحاسب للتعرف على الشخص اما حالة ان يكون الاسم اكبر او اصغر فهي نادرة الاستخدام وتستخدم فقط في ترتيب الاسماء ابجديا ومعنى اكبر ان يكون ترتيب الحروف في جدول اسكي للاسم الاكبر يلي ترتب الحروف للمتغير الاصغر .

في المثال السابق لن تكون قيمة L تساوي صفر رغم ان الحروف واحدة للاسمين ولكن مرة حروف صغيرة ومرة حروف كبيرة ولكن هناك الدالة التالية التي لاتهتم بحالة الحروف



char Name1 [30] = “MOHAMAD HASAN”;

char Name2 [30] = “mohamad hasan”;

int L;

L = strcmpi (Name1 , Name2);



هذه الدالة strcmpi سوف تعطي قيمة = صفر لان الاسمين متساويين وهي لاتهتم بحالة الحروف

الحاق متغير حرفي بآخر strcat



char Name1 [30] = “Mohamad”;

char Name2 [30] = “Hasan”;

int L;

strcat (Name1 , Name2);

تقوم الدالة بالحاق الاسم الثاني بالاول ليصبح الاسم الثاني عبارة عن الاسمين مدموجين وتكون النتيجة ان المتغير الثاني Name2 بعد العملية السابقة يصبح حاملا القيمة

Mohamad Hasan



تحويل الحروف الصغيرة الى كبيرة strupr



char Name [30] = “mohamad hasan”;

strupr (Name);

بعد العملية السابقة يتحول المتغير Name الى MOHAMAD HASAN


تحويل الحروف الكبيرة الى صغيرة strlwr



char Name [30] = “MOHAMAD HASAN”;

strlwr (Name);

بعد العملية السابقة يتحول المتغير Name الى mohamad hasan



قياس طول متغير حرفي strlen

char Name [30] = “MOHAMAD HASAN”;

int L;

L = strlen (Name);

بعد العملية السابقة سيتم قياس طول المتغير الحرفي او عدد حروفه ويوضع كعدد بالمتغير L حيث سبق الاعلان عنه كعدد صحيح

واليك مثال يشمل كل ما سبق شرحه

#include <iostream.h> //For cout

#include <string.h> //For many of the string functions

int main()

{

char name[50]; //Declare variables

char lastname[50]; //This could have been declared on the last line

cout<<"Please enter your name: "; //Tell the user what to do

cin.getline(name, 50, '\n'); //Use gets to input strings with spaces

// or just to get strings after the user presses enter



if(!strcmpi("Mohamad", name)) //The ! means not,strcmpi returns 0 for

{ //equal strings

cout<<"That's my name too."<<endl; //Tell the userif its my name



}

else //else is used to keep it from always

{ //outputting this line

cout<<"That's not my name."

}



cout<<"What is your name in uppercase..."<<endl;

strupr(name); //strupr converts the string to uppercase

cout<<name<<endl;

cout<<"And, your name in lowercase..."<<endl;

strlwr(name); //strlwr converts the string to lowercase

cout<<name<<endl;

cout<<"Your name is "<<strlen(name)<<" letters long"<<endl; //strlen returns

//the length of the string

cout<<"Enter your last name:";

gets(lastname); //lastname is also a string

strcat(name, " "); //We want to space the two names apart

strcat(name, lastname); //Now we put them together, we a space in

//the middle

cout<<"Your full name is "<<name; //Outputting it all...

return 0;



}



مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:48 PM
تعلم سي بلس بلس

الدرس التاسع

الملفات




مساء الخير



في هذا الدرس سوف نتعرض لتخزين البيانات واسترجاعها من الملفات بالطبع مافائدة ادخال كم كبير من البيانات اذا لم نستطع تخزينها واسترجاعها ان اوامر الحفظ بالبرامج التي تستخدمها من اهم الاوامر التي تستخدمها وان امر فتح ملف ماهي الا عملية استرجاع لبيانات سبق حفظها بملف وهذا هو موضوعنا اليوم.

عندنا اليوم فئتين هامتين للعمليتين السابق ذكرهما ألا وهما الحفظ والاسترجاع وبالاضافة الى الفئتين سيكون بصحبتنا الملف fstream.h كرأس ملف للتعريفات الخاصة بالفئتين

الفئة الاولى ifstream

ستتولى هذه الفئة القراءة من الملفات اي عملية استرجاع البيانات او فتح الملفات



الفئة الثانية ofstream

ستتولى هذه الفئة الكتابة في الملفات اي عملية حفظ البيانات



ولنأخذ مثال للتوضيح

ifstream MyFile (“mydata.txt”);



ولنرى طريقة صياغة الامر بالجدول المعتاد

الصيغة
الشرح

ifstream
اسم الفئة الخاصة بفتح الملفات

MyFile
بارامتر اختياري تختاره لاستدعاء دوال الفئة

(“mydata.txt”);
بين قوسين وعلامتي اقتباس تضح اسم الملف المراد فتحه ولايغيب عنك انه يجب ان يكون ملف موجود على القرص




يستخدم البارامتر الاختياري لاستدعاء دوال الفئة سواء لفتح او اغلاق الملف وكل ملف يفتح سواء للكتابة او القراءة لابد ان يغلق بعد تمام العملية واذا نسيت ذلك فتأكد من ضياع بياناتك وهذا يحدث كثيرا عند اغلاق الكومبيوتر بغير الطريقه الصحيحة حينها تكون البرامج قد قامت بفتح ملفات ولم تغلقها لانك اغلقت الجهاز حينها تحدث اخطاء ويقوم نظام تشغيل الوندوز باستدعاء scandisk للتصحيح هذه المشكلة



MyFile.close();

البارامتر السابق تعريفه للفئة يقوم باستدعاء احد الدوال الهامه وهي دالة اغلاق الملف كما ذكرنا لك سابقا واليك مثال كامل لعمليات الحفظ والاسترجاع لتتضح الصورة امامك كاملة.







#include <fstream.h>

#include <iostream.h>





int main()

{

char str[10];

ofstream svfile("example.txt");

svfile<<"I want to save this line of data as an example";

svfile.close();



ifstream rdfile("example.txt");

rdfile>>str;

cout<<str;

rdfile.close();

}

تم الاعلان عن معاملين افتراضيين هما svfile ليعمل مع الفئة ofstream لتخزين البيانات والمتمثلة تخزين العبارة I want to save this line of data as an example

بعد ذلك استخدم معامل الفئة لاغلاق الملف بالدالة close

والمعامل الثاني rdfile ليعمل مع الفئة ifstream لقراءة البيانات من الملفات وبالتحديد الملف المذكور example.txt ثم تحميل البيانات الى متغير حرفي سبق الاعلان عنه واستخدام معامل الفئة لاغلاق الملف



المشكلة الواجب التنبيه عليها انه مع الفئة ofstream واذكرك بأنها هي التي تحفظ الملفات ان الملف الذي اعطيتها اسمه اذا لم يكن موجود فسوف ينشأ اما اذا كان موجود فسوف يلغى مابداخله وهذه مشكله فربما انك تفتح ملف موجود وتريد اضافة بيانات له او تعديل بيانات فيه ولذلك يجب اعطاء وتمرير بارامترات للدالة المستخدمة كما يلي



Flag
Function

ios::app
Opens an output file for appending.

ios::ate
Opens an existing file (either input or output) and seeks the end.

ios::in
Opens an input file. Use ios::in as an open_mode for an ofstream file to prevent truncating an existing file.

ios::out
Opens an output file. When you use ios::out for an ofstream object without ios::app, ios::ate, or ios::in, ios::trunc is implied.

ios::nocreate
Opens a file only if it already exists; otherwise the operation fails.

ios::noreplace
Opens a file only if it does not exist; otherwise the operation fails.

ios::trunc
Opens a file and deletes the old file (if it already exists).

ios::binary
Opens a file in binary mode (default is text mode).






ifstream svfile("mydata.txt", ios::nocreate);


مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:49 PM
تعلم سي بلس بلس

الدرس العاشر

اوامر بدء التشغيل


مساء الخير

لايوجد برامج قابلة للتشغيل على نظام تشغيل دوس سوى الملفات ذات الامتداد .bat و.com و .exe ومع نظام وندوز نفس الامتدادات ماعدا .com الذي اختفى مع وندوز ولكن ربما يعترض البعض بأنهم تحت نظام وندوز يستطيعون تشغيل معظم الامتدادات مثل ملف ذو امتداد .doc اي ملف ميكروسوفت ورد بمجرد النقر على ايكونة الملف فكيف يتم ذلك وهل يتعارض ذلك مع ماقلناه سابقا.

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

لنقوم بعمل تطوير للدالة الرئيسيه لبرنامج ليتقبل اوامر عند بدء تشغيله

int main(int argc, char * argv[])



الصيغة
الشرح

int argc
متغير عدد صحيح يشير الى عدد الاوامر المضافة عند بدء التشغيل وذلك بعد اسم البرنامج

char * argv[]
كما ترى مصفوفة متغيرات حرفية تشمل عدة اوامر تخزن في المصفوفة ويفصل بينهما مسافات وتذكر مت نكرره دائما عناصر المصفوفات تبدء بالعنصر رقم صفر في لغة سي++




لاتضع قيمة للمتغير argc سيقوم البرنامج بتخصيص هذه القيمة ولكن داخل البرنامج اذا كشفت عن قيمة المتغير وكانت تساوي صفر وكانت رغبتك ان يدخل مستخدم البرنامج اسماء للبرنامج ليعمل عليها فيمكنك حينئذ ان توقف تشغيل البرنامج وتعطيه رسالة تحذير او خطأ بأنه لم يفعل المطلوب هل عرفت الآن فائدة هذا المتغير

اما المصفوفة argv فهي تحتوي المتغير الاول في العنصر argv[0] والثاني في المتغير سيكون بعنصر المصفوفة argv[1] وهكذا

مثال



Myprog.exe mydatafile.txt

سيكون Myprog.exe هو البرنامج و mydatafile.txt هو الامر المخزن في المصفوفه argv[0]

ويمكنك ايضا ان تضيف المسار الموجود فيه الملف المراد تحميله دون ان يعتبر ذلك امر اضافي مثل



Myprog.exe c:\myfolder\mydatafile.txt

ولايكون دائما سطر الاوامر او البيانات المبدئية هي اسماء ملفات بل يمكن ان تكون ارقام يعمل عليها البرنامج عند بدء تشغيله مع الاخذ في الاعتبار ان تدخل في صورة حروف ويتم استخدام اوامر اللغة في تحويله الى ارقام يمكن العمل عليها


مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:56 PM
تعلم سي بلس بلس

الدرس الثاني عشر

المتغيرات العامة والمحلية



مساء الخير

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



#include <iostream.h>



int A,B,C;

void first (void);

void second (void);

void third (int X);





int main()

{

int D,E,F;

/*

يمكنك هنا التعامل مع المتغيرات A,B,C لانها متغيرات عامة خاصة

بكل البرنامج واي تعديل فيها سينعكس على قيمتها عن اعادة

استخدامها في اي جزء من البرنامج واي دالة

*/



/*

يمكنك هنا التعامل مع المتغيرات D,E,F لانها متغيرات محلية خاصة

بهذه الدالة واي تعديل فيها سيؤثر فقط داخل هذه الدالة

*/



/*

لايمكنك التعامل مع المتغيرات G,H,I لانها متغيرات محلية لدالة اخرى



*/



/*

لايمكنك التعامل مع المتغيرات K,L,M لانها متغيرات محلية لدالة اخرى



*/



}



void first (void)

{

int G,H,I;



/*

يمكنك هنا التعامل مع المتغيرات A,B,C لانها متغيرات عامة خاصة

بكل البرنامج واي تعديل فيها سينعكس على قيمتها عن اعادة

استخدامها في اي جزء من البرنامج واي دالة

*/



/*

يمكنك هنا التعامل مع المتغيرات G,H,Iلانها متغيرات محلية خاصة

بهذه الدالة واي تعديل فيها سيؤثر فقط داخل هذه الدالة

*/



/*

لايمكنك التعامل مع المتغيرات D,E,F لانها متغيرات محلية لدالة اخرى



*/



/*

لايمكنك التعامل مع المتغيرات K,L,M لانها متغيرات محلية لدالة اخرى



*/



}



void second (void)

{

int K,L,M;



/*

يمكنك هنا التعامل مع المتغيرات A,B,C لانها متغيرات عامة خاصة

بكل البرنامج واي تعديل فيها سينعكس على قيمتها عن اعادة

استخدامها في اي جزء من البرنامج واي دالة

*/



/*

يمكنك هنا التعامل مع المتغيرات K,L,Mلانها متغيرات محلية خاصة

بهذه الدالة واي تعديل فيها سيؤثر فقط داخل هذه الدالة

*/



/*

لايمكنك التعامل مع المتغيرات G,H,I لانها متغيرات محلية لدالة اخرى



*/



/*

لايمكنك التعامل مع المتغيرات D,E,F لانها متغيرات محلية لدالة اخرى



*/




}



void third (int X);

{

int A,B,C;



/*

يمكنك هنا التعامل مع المتغيرات A,B,C لانها اصبحت متغيرات محلية

في هذه الدالة والتغيير فيها لن يؤثر الا هنا فقط ولن يؤثر على

قيمتها في باقي البرنامج لاعادة الاعلان عنها كمتغير محلي للدالة

*/



/*

يمكنك الاعلان عن اي نوع من المتغيرات بالرموز والاسماء التي تفضلها

ما عدا المتغير X فقد تم تمريره للدالة وبالتالي كل متغير يمرر لداله

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

عام فقط سيصبح متغير محلي – هذه ملاحظة هامة جدا

*/







/*

لايمكنك التعامل مع المتغيرات G,H,I لانها متغيرات محلية لدالة اخرى



*/



/*

لايمكنك التعامل مع المتغيرات D,E,F لانها متغيرات محلية لدالة اخرى



*/



}



مضاد :p حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:59 PM
تعلم سي بلس بلس

الدرس الثالث عشر

المؤشرات


مساء الخير

المؤشرات في سي ++ من الاشياء التي تبدو غامضة وقد يبدو في بعض الاحيان انها تتعامل مع اشياء غامضة وقد يطرح سؤال لماذا استخدامها انا احب استخدامها مع قلة استخدامي لها الا في الاشياء التي تحتاجها لقد نوهنا عنها في درس سابق ولكن اود ان اقوال انها من مميزات سي++ انها تجعلك تقترب من ذاكرة الكومبيوتر كثيرا سأوضح لك ببساطة شديدة طبيعة عمل المؤاشرات او pointers المؤشرات اما ان تعطيك عنوان متغير بالذاكرة او تعطيك القيمة التي يحملها هذا العنوان كمثال عند سؤالك عن رقم غرفة محمد على بفندق السعادة الاجابة ستكون 813 وهذا يشبه السؤال عن عنوان تخزين متغير بالذاكرة أو ان تسأل عمن يسكن الغرفة رقم 813 بفندق السعادة فستكون الاجابة انه محمد علي وهو يشبه السؤال عن قيمة المتغير المخزن في عنوان ذاكرة

ان اي متغير يسبق بالعلامة * يعتبر مؤشر ودعني اوضح بمثال الفرق بين الاعلان عن مؤشر والاعلان عن قيمة

int x;

سبق وتعاملنا مع هذه الحالة انها اعلان عن متغير اسمه x كمتغير عددي صحيح ولكن

int *x;

انه مؤشر – اذا ما الفرق بينهما الاول يشير الى متغير سيحمل قيمة عدد صحيح وهي حالة عادية وقد تعودنا عليها اما المؤشر فهو يشير الى عنوان تخزين المتغير x بالذاكرة هل وضحت الآن ان الذاكرة تتكون من وحدات تخزين ولابد ان يكون لكل وحدة تخزين رقم بالطبع نحن نتعامل مع ارقام ويسمى هذا الرقم عنوان اي ان المؤشر يشير الى عنوان ذاكرة ودعنا نستخدم مصطلح لو حفظناه عن ظهر قلب لن يختلط علينا الامر كلما رأينا علامة المؤشر * عند الاعلان عن مؤشر نقول at address of ولنقل على التعليمة التالية

int *x;

at address of x;

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

اسرة ابو الفضل تتكون من اربعة افراد ويقيمون بحجرات فردية بفندق السعادة

تبدء ارقام غرف اسرة ابو الفضل بالغرفة رقم 13

لسنا هنا في حاجة الى اسئلة اخرى فالاجابة معرفة انهم يسكنون بالغرف 13و14و15و16

لمجرد معرفة اول غرفة وعدد الغرف

نفس الشئ الاعلان عن مؤشر يعطي عنوان بداية التخزين ونوع المتغير يحدد عدد البايتات التي يحتاجها المتغير ليخزن والنوع المذكور هو int فاءذا رجعت للدروس الاولى ستجد معلومات عن ذلك هل ادركت الآن اهمية الاعلان عن نوع المتغير بالنسبة للكومبايلر بنفس الطريقة التي تخبر بها موظف الفندق ان يحجز لاسرتك اربعة غرف دون معرفة العدد لن يستطيع خدمتك.

ولكن ليكن هنا شخص اكثر انتباها ليتذكر اننا استخدمنا المؤشرات في درس المتغيرات الحرفية لجز مكان لمتغير حرفي فكيف يعرف طول المتغير كنت ربما ستدخل اسمك بالكامل او جزء منه لنتذكر الاعلان

char *MyName;

الاجابة كانت في نفس الدرس ارجو العودة اليه وهي ان البرنامج يلحق \0 والتي تعني نهاية المتغير الحرفي او مصفوفة الحروف في نهاية الادخال وبالتالي عرفت بداية التخزين من المؤشر ونهايته من وجود NULL TRMINATOR ملحق بنهايته



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

Ptr = &X;

Address of x;

لنحفظ العبارة الثانية عن ظهر قلب وتعالى الى المثال



#include <iostream.h>



int main()

{

int x; //A normal integer

int *pointer; //A pointer to an integer

pointer=&x; //Read it, "pointer equals the address of x"

cin>>x; //Reads in x

cout<<*pointer; //Note the use of the * to output the actual number stored in x



return 0;



}

ولنفسر خطوة بخطوة استخدام المؤشرات مع مثال خارجي



int x;

اعلان عادي عن متغير يحمل قيمة عددية صحيحة وسبق دراستها

التشابة : x هو انسان نوعة ذكر نرجو حجز غرفة بفندق السعادة تناسب سكن لذكر

int *pointer;

اعلان عن متغير لمؤشر من نوع عدد صحيح اي يمكنه حمل عنوان ذاكرة تخزين عدد صحيح

التشابة : استمارة الاقامة بالفندق التي يسجل فيها ارقام غرف النزلاء الذكور

pointer = &x;

المؤشر والذي يمكنه حمل عناوين تخزين لاعداد صحيحة سيحمل عنوان تخزين المتغير x وذلك بمساوته ب &x اي address of x

التشابة : اكتب على استمارة الذكور البيضاء رقم غرفة السيد x فهي تصلح لذلك



Cin>>x;

عملية ادخال للمتغير بطريقة الادخال العادية ليعرف الكومبيوتر قيمة

التشابة : ما هو الاسم الحقيقي للسيد x لنفرض الادخال كان انه السيد ابوالكلام

cout<<*pointer;

اطبع ما بالعنوان pointer والذي يحمل قيمة عنوان تخزين x بالطبع ستكون الاجابة هي قيمة x وتناظر تماما الطبع المباشر لقيمة x بالامر cout<<x

التشابه اذكر لي اسم من يسكن برقم الغرفة المدون على الاستمارة الخاصة بالذكور ستكون الاجابة انه السيد ابو الكلام لان العنوان المدون على الاستمارة هو حيز التخزين او رقم الغرفة 813 وهذه الغرفة يسكنها السيد ابو الكلام وعليه كانت الاجابة

مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 12:59 PM
الدرس الحادي عشر

الفئات


مساء الخير

الفئات تميز لغة سي++ وتعطيها ادوات قوية جدا فقد تقوم بعملها انت والكثير منها يأتي اليك جاهزا لتسهيل عملك واظهار برامجك في شكل جيد بقدر ماساعدت مطوري البرامج بقدر ماجعلتهم دائمي الاطلاع على ماهو جديد منها وعودة دائمة الى كتب اللغة الصادرة من الشركات مثل بورلاند وميكروسوفت والبرمجة تحت الوندوز ماهي الا فئات عديدة تورث صفاتها الى برامجك لتعمل تحت الوندوز ربما يكون هذا رد على من يقول اننا ندرس اللغة تحت الدوس انها مقدمة وعودة الى موضوعنا فالفئات تشبه الى حد كبير هياكل البيانات التى سبق وشرحناها في درس سابق ولكن يمكن ان يكون احد اعضائها دالة تعمل معها ويمكن ان تورث احدى الفئات صفاتها الى فئة اخرى واليك الشكل العام للفئة وستكون الفئة التي سننشئها تحت اسم MyExample

#include <iostream.h>

class MyExample //Standard way of defining the class

{

public:

//This means that all of the functions below this(and any variables)

//are accessible to the rest of the program.

//NOTE: That is a colon, NOT a semicolon...

MyExample(); //Constructor

~MyExample(); //Destructor

void setspeed(int p);

int readspeed();

//These functions will be defined outside of the class

protected:

//This means that all the variables under this, until a new type of

//restriction is placed, will only be accessible to other functions in // the class. NOTE: That is a colon, NOT a semicolon...

int processorspeed;

}; //Do Not forget the trailing semi-colon

MyExample::MyExample()

{ //Constructors can accept arguments, but this one does not

processorspeed = 0;

//Initializes it to zero

}

MyExample::~MyExample()

{ //Destructors do not accept arguments

}

//The destructor does not need to do anything.

void MyExample::setspeed(int p)

{ //To define a function outside put the name of the function

//after the return type and then two colons, and then the name

//of the function.

processorspeed = p;

}

int MyExample::readspeed()

{ //The two colons simply tell the compiler that the function is part

//of the clas

return processorspeed;

}



int main()

{

MyExample compute;

//To create an 'instance' of the class, simply treat it like you would

//a structure. (An instance is simply when you create an actual object

//from the class, as opposed to having the definition of the class)

compute.setspeed(100);

//To call functions in the class, you put the name of the instance,

//a period, and then the function name.

cout<<compute.readspeed();

//See above note.

return 0;

}



الشرح



لقد بدئنا بالسطور التالية

#include <iostream.h>



class MyExample //Standard way of defining the class

{

public:



الامر calss للاعلان عن فئة يليه اسم الفئة وهو اختياري وتذكره جيدا فسوف تلتزم به فيما بعد في صياغة باقي هيكل الفئة ثم قوس لبداية بلوك الفئة ثم الامر public: وهو بالطبع يعنى عام وكل متغير او دالة تعلن بعده معناها يمكن استخدامها في بقية اجزاء البرنامج يلي ذلك الاعلان عن باني الفئة وهي دالة تنفذ آليا بمجرد بداية عمل الفئة وصيغتها كما يلي

MyExample(); //Constructor

اسمها ليس اختياريا ولكن عليك الالتزام باسم الفئة التي انشأتها ويوضع تحت هذه الدالة كما سيلي تفصيله ما تحتاج من تخصيص لمتغيرات عند بداية البرنامج

يلي ذلك هادم الفئة وهي دالة تستدى ايضا آليا عند انتهاء عمل الفئة ويمكن ان تضع فيها اوامر لتحرير الذاكرة مثلا من متغيرات تم تخصيصها او تهمل وضع اي شئ فيها حسب فكرة البرنامج وتكون بنفس اسم الفئة يسبقها العلامة ~ كما بالصيغة التالية



~MyExample(); //Destructor



كل ما سبق كان تحت الامر public: كما تتذكر ثم تحته ايضا فنحن لم ننهي العمل معه بعد وضعنا اعلان عن دالتين عامتين هما

void setspeed(int p);

int readspeed();

ثم دخلنا بعد ذلك الى الامر protected: ومعناه كل ما سيعلن عنه بعد ذلك لا يستخدم الا في الدوال اعضاء الفئة ولا يستخدم في باقي اجزاء البرنامج وكان ذلك في الصورة التالية

protected:



int processorspeed;

}

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



MyExample::MyExample()

{

processorspeed = 0;

}

بدء الاعلان عن الدالة بوضع اسم الفئة ثم اسم الدالة وبالطبع اسم الفئة واسم الدالة شئ واحد كما اتفقنا ان باني الفئة يأخذ اسم الفئة كفرض عليك ثم وضعنا قيمة ابتدائية للمتغير processorspeed تساوي صفر انتهازا لفرصة ان هذه الدالة اول ما ينفذ عند العمل على الفئة

ثم بناء دالة هادم الفئة وكما سبق شرحة هو ايضا اسم الفئة يسبقها العلامة ~ وهي اخر دالة تنفذ وذلك كما يلي

MyExample::~MyExample()

{ //Destructors do not accept arguments

}

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



void MyExample::setspeed(int p)

{

processorspeed = p;

}



لقد كان الاعلان عن الدالة داخل هيكل الفئة بالصورة التي تعودنا عليها وهي

void setspeed(int p);



عبارة عن دالة لاتعيد قيمة بناء على الامر void ثم اسم الدالة وبين القوسين القيمة التي ستمرر للدالة وهنا عبارة عن تمرير عدد صحيح للدالة كل ذلك سبق ان شرحناه ولكن الجديد هنا هو عنوان الدالة عند أنشائها كان كما يلي



void MyExample::setspeed(int p)



void
نوع الدالة

MyExample
اسم الفئة التي تنتمي لها

::
زوجين من نقطتين فوق بعضهما

setspeed
اسم الدالة

(int p)
القيم الممرة للدالة




سوف اوفر عليك جهد التفكير في ذلك ضع نفس الاعلان عن الدالة كما هو وبعد نوع الدالة وقبل اسمها ضع اسم الفئة يليها نقتطتين وهذه امثلة

الاعلان داخل الفئة
شكل الاعلان في تعريف وبناء الدالة

void seeme (void)
voidItsCalssName::seeme (void)

int seeme (void)
int ItsCalssName:: seeme (void)

float seeme (void)
float ItsCalssName:: seeme (void)

void seeme (int a)
void ItsCalssName:: seeme (int a)

void seeme (float a)
void ItsCalssName::seeme (float a)

int seeme (float a)
int ItsCalssName:: seeme (float a)




كان ذلك على فرض ان اسم الفئة التابع لها هو ItsCalssName والذي يناظر معنا MyExample

ثم تم بعد ذلك بناء باقي الدوال او الدالة الباقية كما يلي

int MyExample::readspeed()

{

return processorspeed;

}

تم الانتهاء من بناء الفئة ودوالها حسب فكرة البرنامج ثم دخلنا الى الدالة الرئيسية بالبرنامج وأي برنامج آخر لنستدعي الفئة ونراها كيف تعمل

int main()

{

MyExample compute;



compute.setspeed(100);

cout<<compute.readspeed();

//See above note.

return 0;

}



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

والاعلان عنه يكون باسم الفئة ثم هو اي المتغير الافتراضي كما يلي



MyExample compute;

بعد ان اخترت اسم المعامل اصبح فرضنا عليك عدم تغييره ولاستدعاء دالة ضع اسم المعامل يليه نقطة والدالة المطلوبة تماما كما كان في هياكل البيانات

compute.setspeed(100);

استدعينا الدالة setspeed والمعلن عنها داخل الفئة بالشكل التالي للتذكره

void setspeed(int p);



وبالتالي مررنا اليها قيمة عددية وهي 100 وهل لاحظت شئ لقد استدعينا دالة عضو للفئة خارج فئة كيف ذلك – نعم لقد وضعناها تحت بند public وقد قلنا عما يندرج تحته اقصد الامر public ان دواله يمكن استخدامها في اي مكان وهي دوال عامة

تم تمرير القيمة 100 للدالة setspeed فبدء استدعاء باني الفئة ليخصص للمتغير القيمة صفر وبعد ذلك استعيت الدالة المطلوبة حيث يوجد بداخلها امر لتخصيص القيمة المررة للمتغير processorspeed وداخل الدالة الرئيسة للبرنامج تم استدعاء دالة عامة من دوال الفئة وهي الدالة readspeed وهي تعيد قيمة المتغير processorspeed وذلك لطباعتها وهي 100 ايضا لتريك ان متغيرات الفئة مرئية بالنسبة لباقي الفئات دون الحاجة لاعادة الاعلان عنها داخل كل دالة من دوال الفئة.


مضاد حيوي
كلية الطب

مضاد حيوي
02-03-2005, 01:01 PM
تعلم سي بلس بلس

الدرس الرابع عشر

خاتمة


مساء الخير

هذه هي خاتمة سلسلة الدروس المختصرة جدا لقد ركزت على الاشياء الهامة التي تفيد المبتدئين وابتعدت عن الاشياء التي تزعجهم وقد ينفرون من تعلم هذه اللغة واترك لك الطريق مفتوح فقد وقفت على اول الطريق انك تحتاج الى كورس متقدم ومزيد من التمارين انا اشك في قدرتي على اضافة هذا الكورس في صفحتى لاني انفقت وقت طويل جدا في تحضير هذه الدروس وكذلك في تحريرها وتحميلها الى الموقع واختبارها وكذلك في تلخيصها وليس ادل على طول وقت التلخيص من قول احد الزعماء واظنه مصطفى كامل عندما كتب لصديقه خطاب طويل مكون من عدة صفحات وكتب له في آخر الخطاب آسف للتطويل لعدم وجود وقت للايجاز .

ربما يقول شخص آخر ان الكورس كان للبرمجة تحت الدوس ويبدو ان الكثير يظن ان نظام الدوس قد انتهى ان الاجابة على هذا السؤال تحتاج لشرح طويل وباختصار ان الدوس موجود ويعمل في خلفية الوندوز وهو ركيزة اساسية لم يتم الاستغناء عنها حتى تاريخه لكنك تستخدم برامج تحت الوندوز فربما تخيلت عدم وجود دوس بل ازيد على ذلك ان الكورس ليس صالح فقط لنظام دوس بل هو لنظام يونيكس ايضا وهذه هي لغة سي وسي++ بميزاتها العديده التي تجعلها صالحة للنقل تحت انظمة مختلفة وربما يتفوق عليها في ذلك فقط لغة جافا ++ ولكن شتان الفرق بينهما فليس من المعقول كتابة برنامج مثل ميكروسوفت اوفيس مثلا بلغة جافا – هذا شئ غير معقول

وبلا شك ان للبرامج تحت الوندوز سحر خاص وواجهة رائعة عندما تدرسها سوف لن تجد فرق كبير من حيث فكر البرمجة وما درسناه ولكن اسلوب البرمجة مختلفة واوامر المكتبات التي تسهل عملك اكثر ودراستها يحتاج لوقت اطول وقد يطرح سؤال ان الاوامر التي درسناها قليلة جدا نعم هذا صحيح لان لغة سي ++ اوامرها قليلة جدا ولكن دوال المكتبات والفئات كثيرة ولا تعد ولا تحصى فقط استعين بما يحلو لك منها وافضل مصدر لها هي كتب اللغة الصادرة من الشركة المنتجة للكومبايلر وعدة التشغيل اللازمة والكتب العربية سواء المؤلفة منها او المترجمة وفي مجال الكومبيوتر بصفة عامة قليل منها ما هو جيد انها بالنسبة لكتب تشغيل البرامج اكثر مؤلفيها من غير المتخصصين انا اعرف سلسلة كتب لها مؤلف يكتب في كل شئ – فهل هذا شئ معقول وما سلسلة الكتب المترجمة فالكثير منها يحتوي اخطاء وكمثال ارسلت لدار نشر شهيرة بأن كتابهم يحتوي اخطاء كثيرة فردوا بأن هذا غير صحيح مما اضطرني لذكر خمسون مثالا بارقام الصفحات مع العلم ان الكتاب مبذول فيه جهد واضح وردوا اخيرا بالاعتذار واستعدادهم لتعويضي عن الكتاب بأصل الكتاب المترجم عنه كان ذلك منذ عام وطلبوا عنواني ولا ادري لماذا لم يصل الكتاب حتى الآن واكثر من ذلك لااعرف مصير القراء الآخرين الذين اشتروا كتاب بهذا المستوى اضيف انني اشتريت الكتاب فقط لعدم وجود اصله الانجليزيه والتكلفة العالية جدا لشراءه من مصدره والسؤال الاهم لماذا يترجم كتاب امريكي في موضوع البرنامج نفسه باللغة الانجليزيه ولن يكون في يوم من الايام بالعربية اضف الى ذلك ان قوائم المساعدة ورسائل الاخطاء كلها بالانجليزية غير متاعب الطبع واخطاء الترجمة فلماذا لايطبع الكتاب الاصلي طبعة شرق اوسطية رخيصة على غرار الطبعات الاسيوية بالهند والفلبين وغيرها والاهم ان من يدروس مثل هذا البرنامج تتوفر لديهم القدرة على القراءة بالانجليزية واذا لم يدرسوه بالانجليزية فلن يكون لديهم القدرة على العمل مع البرنامج اصلا.

فنصيحة ابتعد عن تلك الانواع من الكتب سوف تحس انها افادتك جزئيا ولكن سوف تقف عند هذه المرحلة لانك تعودت على الكتب المترجمة وليس هناك مابعد ذلك غير ذلك تجد الكتب الاصلية قد اخذت عناية كبيرة في التدقيق واسلوب التأليف لانهم في الغالب فريق عمل مؤهل وليس شخص تعلم برنامج وقام بالتأليف وهو غير متخصص اصلا ولكنها تجارة لتدرك صحة هذا الكلام حاول ان تقارن بين نسختين احدهما مما تعج به الاسواق والاخرى من مصدرها الاصلي لتجدالفرق الهائل




واخيرا لكم مني كل تحية وتمنيات بالتوفيق







مضاد حيوي
كلية الطب

المتميز
02-03-2005, 01:17 PM
أخي مضاد حيوي ...

سطرت إبداعك بمواضيعك الجميلة ...

موضوعك أكثر من رااائع ...

وأكيد إنك تعبت فيه .. الله يكتب أجرك فيه ..

وإن شاء الله ينفع الطلاب والطالبات في دراستهم ...


أكرر شكري وامتناني إليك ... أخي الكريم ...


أخلص التحايا....



[[ تم دمج المواضيع الأربع عشرة في موضوع واحد حفاظاً على الترتيب العام ]]

الدبابة
02-03-2005, 10:04 PM
مشكور وجزاك الله خير............
لكن عندي سؤال الشرح من عندك والا من برنامج او cd يعني هل انت متقن اللغة حتى نعرض الاسئله عليك والا لا.....؟
تحياتي.........

Dew Drop
02-03-2005, 10:38 PM
الله يعطيك العافيه على الموضوع

وتسلم على مجهودك الكبير

واكيد انك تعبت فيه كتير

وانا عندي اقتراح

يعني ليش مايكون هذا الموضوع في قاعة كلية الحاسبات عشان يستفيد أكبر عدد من الاعضاء

واتمنى انو الاخ مضاد حيوي يشاركني الرأي في الموضوع وكمان المشرف العام والمراقب العام

مع احترامي وتقديري للجميع وشكري لك على موضوعك الرائع

حزينة
03-03-2005, 04:05 PM
ماشاء الله تبارك الله

شرح جميل

تحياتي