منتديات ماك للعرب  

العودة   منتديات ماك للعرب > ركن برمجة الماكنتوش > مجلس دورة ماك للعرب > الدروس

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

موضوع مغلق
 
LinkBack أدوات الموضوع انواع عرض الموضوع
  #1 (permalink)  
قديم 03-27-2008, 09:34 AM
الصورة الرمزية أبو بكر
Moderator
 
تاريخ التسجيل: Dec 2004
الدولة: أبوظبي - الإمارات
المشاركات: 621
Thanks: 0
Thanked 2 Times in 2 Posts
أبو بكر is on a distinguished road
افتراضي الدرس (٢) - لغة C - مبادئ اللغة

دورة ماك للعرب - برمجة Apple
Carbon القسم الأول - المبتدئ
لغة C
الدرس الثاني: مبادئ اللغة - مزيدا من لغة C
السبت الموافق 24-محرم- 1429هـ 2-2-2008م

_________________________________________________
المصدر: كتاب (داخل Carbon) - تأليف أبو بكر، جميع الحقوق محفوظة لماك للعرب فقط.
المرجع: داخل الماكنتوش وهو مرجع Apple الخاص بها.
_________________________________________________

لغة C الموحدة:
سنتناول في دروسنا لغة C القياسية الموحدة وهي التي تعرف باسم ANSI C.
ويقصد بـ ANSI «المعهد الأمريكي القومي للمقاييس» - American National Standards Institute-.
وأما فائدة ANSI C هي أن تضمن بأن النص البرمجي المكتوب يمكن نقله من نظام تشغيل معين إلى أخر دون ظهور المشاكل، فيمكن نقل البرنامج من الماكنتوش إلى Windows أو العكس.

الأهداف:
  • أنواع البيانات في لغة C.
  • تصنيف المتغيرات في لغة C.
  • الثوابت في لغة C.
  • الإشارات في لغة C.
  • المجموعات والأنماط.
  • استخدام أمر اختبار الشروط (إذا) if.
  • الحلقات في لغة C.
مصطلحات ومعناها:
  • Computer: وتعني باللغة العربية الحاسوب، ومن الخطأ أن نقول: الحاسب الآلي، أو الحاسب أو الكمبيوتر.
  • Code: النص البرمجي ويعرف أيضا باسم «الشيفرة» وأيضا يعرف باسم: «المصدر source»، ويقصد به ما يكتبه المبرمج من أوامر ونصوص لتشكل في النهاية برنامجا معينا، ويطلق على السطر الواحد أيضا.
  • Compiler: المترجم والذي يقوم بتحويل النص البرمجي أو الشيفرة، من اللغة المعنية (في حالتنا من لغة C) إلى تعليمات لغة الآلة، ولا يفهم هذه اللغة إلا وحدة المعالجة المركزية في الحاسوب CPU، ويقوم بحفظ التعليمات وجمعها في ملف الهدف، ويسمى الهدف باللغة الإنجليزية بـ: object.
  • Linker: الرابط أو الموصل، وهو البرنامج الذي يقوم بتحويل ملف الهدف إلى برنامج تطبيقي قابل للتنفيذ.
أنواع البيانات الرئيسية:
لقد سبق أن تناولنا بعض أنواع البيانات في لغة C، إلا أننا سنتعرف الأن على مجموعة جديدة من البيانات مهمة جدا في دراستنا لبرمجة الماكنتوش، وكما سنتعرف على حجم كل نوع منها وهو المساحة التي يتم تخصيصها من الذاكرة للمتغير الذي ينتمي إلى هذا النوع.
  • أولا: مجموعات الأعداد الرياضية في لغة C، وهي على قسمين:
    • 1- مجموعة الأعداد الصحيحة، وهي على ثلاثة أنواع:
      • النوع الأول: مجموعة الأعداد الصحيحة القصيرة: Short Integer وتكتب بلغة C اختصارا: short، وحجم أي عنصر ينتمي إلى هذه المجموعة (2 بايت).
      • النوع الثاني: مجموعة الأعداد الصحيحة: Integer، وتكتب بلغة C اختصارا: int، وحجم أي عنصر ينتمي إليها يتحدد بناء على نوع المترجم، فبعض المترجمات يعتمد الحجم (4 بايت) أو (2 بايت).
      • النوع الثالث: مجموعة الأعداد الصحيحة الطويلة: Long Integer، وتكتب بلغة C اختصارا: long، وحجم أي عنصر ينتمي إليها (4 بايت -دائما في نظام الماكنتوش٠)
    • 2- مجموعة الأعداد الحقيقية، وهي على ثلاثة أنواع:
      • النوع الأول: مجموعة الأعداد الحقيقية: Real Numbers وتكتب بلغة C اختصارا: float، وحجم أية قيمة فيها تساوي (4 بايت)
      • النوع الأول: مجموعة الأعداد الحقيقية المضاعفة: Double Real Numbers وتكتب بلغة C اختصارا: double، وحجم أية قيمة فيها تساوي (8 بايت)
      • النوع الثالث: مجموعة الأعداد الحقيقية الطويلة: Long Double Real Numbers وتكتب بلغة C اختصارا: long double، وحجم أية قيمة فيها تساوي (16 بايت).
  • ثانيا: المجموعات الأخرى: وتشتمل على مجموعة الحرف char، ومجموعة القيمة المنطقية البولينية bool:
    • 1- مجموعة الحرف character، وتكتب بلغة C اختصارا: char، وهي مجموعة يتم استخدامها لتعريف متغيرات نوعها حرفي، أي بدلا من التعبير باستخدام الأرقام، يمكننا استخدام هذه المجموعة للتعبير عن الأحرف، وهذه المجموعة حجم أي عنصر فيها هو (1 Byte)، لذلك أي عنصر ينتمي إلى هذه المجموعة يتسع لحرف واحد فقط.
    • 2- مجموعة القيمة المنطقية البولينية Boolean، وتكتب بلغة C اختصارا: bool، وهي مجموعة تحتوي على قيمتين فقط، وهما: true و flase. أي أن العنصر الذي ينتمي إليها لا يتم حفظ فيه إلا واحدة من القيمتين.
تصنيف المتغيرات في لغة C:
تصنّفُ المتغيرات في لغة C من حيث طريقة استخدامها على أنها ثلاثة أصناف، ويهمنا الصنف الأول والثاني فقط -حاليا-:
  • التصنيف الأول: المتغيرات المحلية Local Variables، وهي المتغيرات التي يتم الإعلان عنها ضمن الروتين أو ضمن وسائطه، وفي هذه الحالة لا تستخدم إلا داخل هذا الروتين فقط.
  • التصنيف الثاني: المتغيرات العامة أو العالمية Global Variables، وهي المتغيرات التي يتم الإعلان عنها في بداية البرنامج (عادة) وبعيدا عن الروتينات (أي خارج جميع الروتينات بعكس المتغيرات المحلية)، ولهذا نستطيع استخدامها في أي جزء من أجزاء البرنامج.
  • التصنيف الثالث: المتغيرات المشتركة أو الخارجية External Variables، وهي المتغيرات التي يشترك فيها أكثر من ملف واحد أو برنامج واحد، وسنستخدمها لاحقا في دورس Carbon.
الثوابت في لغة C:
الثوابت Constants بعكس المتغيرات، لا تتغير قيمتها، بل تبقى قيمها محفوظة في الذاكرة حتى يتم إنهاء البرنامج، ويتم تعريف الثابت كما يلي:
كود:
const int MyID = 200511858;
نلاحظ أن الكلمة const إذا حذفت أصبح MyID متغيرا عاديا من النوع int، وبعبارة أخرى لتثبيت أي متغير ابدأ الإعلان عنه بالكلمة const.

أمثلة عن المتغيرات والثوابت:
كود:
const int kID = 200511858;
bool gDone = false;
int gState;
long gRefCon;

int main()
{
	int State = kID;
	long RefCon;
	int result = 0;
	
	printf("%s%d%s", "\nConstant Value = ", kID, "\n");
	
	gState = 10;
	printf("%s%d%s", "Global variable value gState = ", gState, "\n");
	printf("%s%d%s", "Global variable value gDone = ", gDone, "\n");

	gRefCon = gState + 2;
	RefCon = gRefCon;
	RefCon++;
	printf("%s%d%s", "Local variable value RefCon = ", RefCon, "\n");
	printf("%s%d%s", "Local variable value State = ", State, "\n");

	return result;
}
في السطر الأول تم تعريف الثابت kID وهو من النوع int وتم إعطاؤه القيمة 200511858، وهو رقم كبير نسبيا. لاحظ أننا بدأنا اسم الثابت بالحرف k إشارة إلى أن هذا الاسم المعرف هو Constant (ثابت).
وفي السطر الثاني تم تعريف المتغير gDone ونوعه بوليني وتم إعطاؤه القيمة الافتراضية false. لاحظ أن قيمة false=0 وقيمة true=1.
والسطر الثالث تم الإعلان عن المتغير gState ونوعه int. لم يتم حفظ أي قيمة افتراضية في هذا المتغير. وكذلك في السطر الرابع تم تعريف المتغير gRefCon وهو ينتمي إلى مجموعة الأعداد الصحيحة الطويلة.
لاحظ أن اسم المتغيرات السابقة بدأ بالحرف g وهو اختصار كلمة Global للدلالة على أنها متغيرات عالمية. والفرق بين المتغيرات العالمية أنها تستخدم في أي جزء من أجزاء البرنامج. وأما الذي جعلها عالمية هو الإعلان عنها خارج جميع روتينات البرنامج. ومن هذه اللحظة سنستخدم هذا الاصطلاح:
اسم الثوابت يبدأ بالحرف k، حتى لو لم تكن عالمية.
اسم المتغيرات العالمية فقط يبدأ بالحرف g.

بعد ذلك وفي السطر الخامس يبدأ تعريف الروتين الأساسي main.
وفي السطر السابع إلى السطر التاسع يتم الإعلان عن بعض المتغيرات وهي ثلاثة وتعرف بأنها متغيرات محلية لأن الإعلان عنها تم داخل الروتين الأساسي، فهي تستخدم من داخله ولا نستطيع استخدامها في مكان آخر.

بعد ذلك لاحظ استخدام الثابت لطباعة قيمته، كم تلاحظ أيضا أننا نستطيع تغيير قيمة المتغير العالمي gState وطباعة قيمته. وهكذا مع بقية المتغيرات.
ثم يعود الروتين الأساسي بقيمة المتغير result وينتهي تنفيذ البرنامج.

الإشارات في لغة C:
إن الإشارة في البرمجة لها أهمية كبيرة، فهي تعد أسرع الطرق للوصول إلى المتغيرات وتختصر الطريق على المعالج عند البحث عن أي متغير يتم طلبه لمعرفة قيمته واستخدامها في المعادلات أو تمريرها إلى روتين آخر. فعند استخدامها يتم تزويد المعالج بعنوان المتغير في الذاكرة، ويقوم المعالج بالقفز مباشرة إلى مكان المتغير المذكور في المؤشر. وتخيل لو أننا لم نستخدم المؤشر وطلبنا من المعالج طباعة قيمة متغير ما، فإنه سيقوم بالبحث عنه في الذاكرة وذلك يتطلب وقتا يقدر (بالنانو ثانية) وهي جزء من مليار جزء من الثانية. فما سيكون الحال لو كان البرنامج يحتوي على عشرات آلاف المتغيرات ؟. ومن أهميتها أنه في بعض الأحيان يكون حجم الوسيطة هائل جدا بحيث لا يسمح لتمرير البيانات كلها إلى روتين معين، فالحل حينها هو استخدام الإشارة، ومثال ذلك: ملف وثيقة برنامج Excel تخيل لو أن حجمه أكثر من 100 ميجا بايت، وأردنا أن نقوم بحفظه على القرص فإنه من المستحيل تمرير البيانات المسجلة في الملف من الذاكرة إلى القرص دون استخدام الإشارة، ومن المذهل فعلا أن حجم الإشارة هو بحجم مسار البيانات (لناقل) من الذاكرة إلى المعالج والعكس، وهو 4 بايت إذا كان المعالج يعمل بعنونة 32bits و 8 بايت إذا كان المعالج يعمل بعنونة 64bits.
لاحظ معي هذا المثال:
int x; يعرف هذا المثال المتغير x وهو من نوع الأعداد الصحيحة. ولاحظ هذا المثال: int *x; تجد أنه يعرف المتغير x على أنه إشارة لعدد صحيح.
أي أنه يشير إلى مكان في الذاكرة. مثال توضيحي:
كود:
int x;
int *pX;
	
x = 20;
pX = &x;
	
*pX = 11;
printf("%s%d", "\n\nThe value of x = ", x);
في السطر الأول تم تعريف المتغير x وهو من النوع int، وفي السطر الثاني تم تعريف المتغير pX وهو إشارة إلى عدد صحيح.
لاحظ في السطر الثالث تم حفظ القيمة 20 في المتغير x، وفي السطر الرابع تم تسجيل عنوان المتيغر x في الإشارة pX، أي أن المتغير pX يشير الأن إلى موقع x، ولا يحفظ قيمة المتغير x.

أما في السطر الخامس تم تغيير قيمة المتغير x عن طريق الإشارة pX، ومثل هذا التغيير يسمى بالدخول غير المباشر، القيمة الحالية 11، وقبل هذا التعديل كانت القيمة 20.
وفي السطر السادس تم طباعة قيمة المتغير x، وهي القيمة 11.
ملاحظة مهمة:
في السطر الثالث عند حفظ القيمة 20 في المتغير x، يقوم المعالج بالبحث أولا عن المتغير x، ويتطلب ذلك وقتا، ثم بعد أن يتم العثور على المتغير يقوم المعالج بتسجيل القيمة المطلوبة، أما في السطر الخامس لا يقوم المعالج بالحبث عن المتغير x، بل يذهب إليه تلقائيا عن طريق عنوانه المسجل داخل متغير الإشارة pX ثم يقوم بتسجيل القيمة المطلوبة، وتعد هذه الطريقة أسرع بكثير من الأولى. فاستخدام الإشارات يؤدي إلى زيادة السرعة.

المجموعات والأنماط:
  • تعلمنا كيف نعرّف المتغيرات أو نعلن عنها، ونقول عنها أنها تنتمي إلى مجموع الأعداد الصحيحة أو الحقيقية، فكيف يتم تعريف هذه المجموعات؟ هذا ما سنتعرف عليه الأن بمشيئة الله عز وجل.
  • أولا يجب أن نعلم أن المجموعة في لغة C تُعرَفُ بالنمط، والنمط هو نوع من أنواع البيانات، ويكون النمط (أو المجموعة) على نوعين فقط:
    • النوع الأول وهو الذي لا يحتوي على عناصر خاصة، كمجموعات الأعداد التي سبق دراستها، ويُعْرَفُ بالمجموعة الرياضية.
    • والنوع الثاني هو الذي يحتوي على عناصر خاصة، ويسمى بالبناء. لا ننس أن كلا النوعين يطلق عليهما اسم النمط.
  • ومما يجدر الإشارة إليه أن المجموعات int و short و long .. الخ، تم تعريفها داخليا في لغة C أثناء إنشائها. فسنستخدم هذه التعريفات للإعلان عن مجموعات جديدة كما يلي:
    كود:
    typedef int MyInt;
    typedef MyInt AnotherInt;
    type def long MyLong;
    MyInt x = 10;
    AnotherInt y = 2;
    MyLong z = x + y;
  • في السطر الأول تم تعريف المجموعة MyInt بنفس أسلوب المجموعة int، فهما الأن متساويتان، لاحظ أمر تعريف المجموعة typedef.
  • وكذلك تم تعريف المجموعات MyLong و AnotherInt.
  • كما تم تسجيل بعض القيم في المتغيرات x و y و z.
أما عن تعريف البناء فهو كما يلي:
كود:
struct MyData 
{
	int myID;
	long refCon;
	int size;
	long sizeRef; 
};
  • يبدأ تعريف البناء باستخدام الأمر struct وهو اختصار كلمة structure وتعني البناء، يليها اسم البناء المراد تعريفه وهو في هذه الحالة MyData، وبعد ذلك يتم كتابة عناصر هذا البناء ضمن الأقواس الكبيرة (الحاصرتين). تكتب عناصر البناء بنفس طريقة الإعلان عن المتغيرات، فمثلا العنصر myID هو متغير نوعه int تابع للبناء MyData.
  • البناء الآن جاهز للاستخدام، لكن يجب أن نعرّف متغيرا يكون نوعه هذا البناء على النحو التالي:
    كود:
    MyData myVar;
  • فالمتغير myVar لم يعد نوعه كالمتغيرات التي سبق أن استخدمناها، وإنما الأن أصبح متغيرا نمطيا ويستخدم كالتالي:

    كود:
    myVar.myID = 200511885;
    myVar.refCon = 10;
    myVar.size = myVar.refCon * 20;
    myVar.sizeRef = 100;
  • لاحظ أن عناصر البناء MyData هي عناصر للمتغير myVar، لأنه ينتمى إلى هذا البناء، لاحظ أننا لا نستطيع تسجيل قيمة معينة داخل المتغير myVar دون تحديد العنصر فمن الخطأ أن نكتب:
    كود:
    myVar = 1000;
    وإنما يجب علينا تحديد العنصر المراد تسجيل قيمة فيه، وطريقة تحديد العنصر هي: أن تكتب اسم المتغير متبوعا بالنقطة الفاصلة بين المتغير وبين عناصره، وبعد ذلك تكتب اسم العنصر المراد تسجيل القيمة فيه، يجب أن يكون اسم العنصر معرفا داخل البناء.
    وتستطيع طباعة قيم عناصر البناء كما يلي:
    كود:
    printf ("%d", myVar.refCon);
الحلقات في لغة C:
  • تستخدم الحلقات في البرمجة لتكرار وإعادة تنفيذ سطر ما أو مجموعة من الأسطر بناء على شرط يتم تحديده من خلال الحلقة، وتزودنا لغة C بثلاث حلقات مختلفة:
  • حلقة for وحلقة do..while وحلقة while، كما تسمى for بحلقة العداد، وهي أبسط أنواع الحلقات في جميع لغات البرمجة وتستخدم كما يلي:
    كود:
    	int i;
    	for (i=1; i<=10;i++)
    		printf("%d%s", i, "   ");
  • عند تنفيذ الأسطر السابقة سيظهر على الشاشة في نافذة Console هذا السطر:
    كود:
    1   2   3   4   5   6   7   8   9   10
  • في السطر الأول تم تعريف المتغير i كما سبق أن تعلمنا.
  • وفي السطر الثاني تم كتابة الحلقة for، بعد أمر الحلقة for يجب تحديد ثلاثة نقاط بين الأقواس، ويفصل بينها بالفاصلة المنقوطة ( ; )، وأول هذه النقاط هي قيمة المتغير i عند بدأ الحلقة لأول مرة، وفي هذا المثال قيمته = 1، وتسمى هذه القيمة بالقيمة الابتدائية (Initial Value)، ثم بعد ذلك الفاصلة المنقوطة، وشرط الحلقة وفي هذه الحالة كما في المثال أن قيمة المتغير i أصغر من أو تساوي 10، وذلك يعني أن هذه الحلقة سيعاد تنفيذها طالما أن قيمة المتغير أصغر من أو تساوي 10.
    والنقطة الأخيرة هي طريقة تغيّر قيمة المتغير i، وغالبا ما تكون بإضافة 1 إلى المتغير أو طرح 1 منه. وفي المثال السابق يتم إضافة 1.
  • ملاحظة: i++ تعني i=i+1، أي أن قيمة i ستزيد بمقدار واحد.
  • وبالنسبة للسطر printf، يتم تنفيذه كل ما تغيرت قيمة i طالما أنها لا تخالف الشرط، فأول مرة عند تحديد القيمة الإبتدائية للمتغير i وهي 1، يقوم الحاسوب بفحص الشرط كأنه يقول: قيمة i هي 1، وهي أصغر من أو تساوي 10 وهذا صحيح، فالشرط قد تحقق فيتم تنفيذ جملة الحلقة وهي printf في هذا المثال، ويتم طباعة قيمة i متبوعة بمسافة، فيظهر على الشاشة الرقم 1، ثم بعد ذلك يقوم الحاسوب بتعديل قيمة i بناء على التغير المذكور في الحلقة وهو هنا i++ فتصبح قيمة i هي 2، ويتم فحص الشرط مرة ثانية ويتم طباعة قيمة i الحالية (الجديدة) وهي 2 متبوعة بمسافة، ويظهر على الشاشة الرقم 2 بجانب الرقم السابق 1، ويتم تعديل قيمة المتغير i مرة ثالثة لتصبح 3 وهكذا.. حتى تصبح قيمة i تساوي 10، وهنا يتحقق الشرط أيضا لأن قيمة i أصغر من أو تساوي 10، فيتم طباعة 10 متبوعة بمسافة، ثم يتم تعديل قيمة i لتصبح 11، ويقوم الحاسوب أيضا بفحص الشرط كالعادة، ويجد أن قيمة i لا تنطبق على الشرط لأنها تخالفه فهي ليست أصغر من أو تساوي 10، وعندها سيتم إيقاف الحلقة ولن يتم تنفيذ جملة printf ولذلك أخر رقم يظهر على الشاشة هو 10. لاحظ أننا باستخدام الحلقة for قمنا بطباعة 10 أرقام بطريقة متتالية وسهلة وسريعة. قم الأن بتغيير شرط الحلقة ليكون i <= 100 (قيمة i أصغر أو تساوي 100) وقم بتنفيذ البرنامج، ستجد أن الحاسوب يقوم بالعد وطباعة القيم من 1 إلى 100.. لعلك عرفت الأن أهمية الحلقات..

انتهى شرح هذا الدرس، سنقوم الأن بكتابة برنامج من خلال ما تعلمناه في هذا الدرس.

بهذا تكون قد اجتزت مرحلة مهمة في تعلّم لغة C.. أهنئك أخي المبرمج. وإليك أسئلة المناقشة وورشة العمل لتحسّن من مستواك بسرعة، وعليك أخي أن تجيب عليها وتنشرها في قسم الإجابات ولن يتم اعتمادها قبل التأكد من صحتها.

ملاحظة: تم تقييم كل سؤال بنقاط محددة، وسأقوم بجمع النقاط لكل مشترك على حدة وإعطائها لكم عبر منتدى البرمجة في موقع ماك للعرب.

أسئلة ومناقشة:
س1: (5 نقاط)
استخدم طريقة تعريف النمط لوصف سيارة مراعيا ذكر المواصفات التالية:
لون السيارة، موديلها، هل تحتوي على ناقل حركة أتوماتيكي، ناقل حركة جبلي؟ سرعتها القصوى، سعة خزان البنزين، كم عدد الركاب الذين تتسع لهم السيارة. لا تنس أن لون السيارة يعتبر عنصرا، وكذلك موديلها وسرعتها وهكذا.. أعط النمط هذا الاسم: Automobile. (تذكر هناك فرق بين النمط والبناء، والمطلوب تعريف نمط).

س2: (8 نقاط)
قم بكتابة برنامج ليقوم بعملية عد الأرقام من الرقم 100 وحتى الرقم 200. على أن يطبع في كل سطر 10 أرقام فقط. (تلميح استخدم حلقة for لعملية العد، واستخدم الأمر if لمعرفة عدد الأرقام التي تمت طباعتها في السطر الواحد (لا يجب أن تزيد على 10 أرقام). واستخدم الحرف الخاص
مثال يوضح نتائج تنفيذ البرنامج:
20 19 18 17 16 15 14 13 12 11
30 29 28 27 26 25 24 23 22 21 وهكذا..

س3: (7 نقاط)
إكتشف الأخطاء وصححها إن وجدت في كل مما يلي:

كود:
for i==1; i++
كود:
if (x = 5)
كود:
if (x==2)
كود:
printf ("d%@, "This is a test");
كود:
if (x>2)
printf("%s", "x is greater than two")
else
كود:
int MyFunc()
{
x = 2;
if(y ==2)
printf("%s", "x is two)
else
printf( "%s", "y is not two");
return;
}

بانتظار استفساراتكم وأسئلتكم وإجاباتكم، وبالتوفيق إن شاء الله.
__________________
أبو بكر

آخر تعديل بواسطة أبو بكر ، 03-28-2008 الساعة 04:09 PM.
موضوع مغلق

  منتديات ماك للعرب > ركن برمجة الماكنتوش > مجلس دورة ماك للعرب > الدروس

أدوات الموضوع
انواع عرض الموضوع

ضوابط المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا يمكنك اضافة مرفقات
لا يمكنك تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة


الساعة الآن »05:58 AM.


Powered by vBulletin®
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
جميع الحقوق محفوظة لموقع ماك للعرب ٢٠٠٢-٢٠٠٨م
Ad Management by RedTyger