www.bencool.com
السلام عليكم ورحمة الله وبركاته
أهــلاً ومرحــباً بزائرنا الكريـم تتشرف ادارة النتدى واعضاءها بتسجيل معنا في هذا المنتدى المتواضع منتدى معهد التكنلوجيا فيا الف مرحـبا بـك مـعنا

www.bencool.com

المنتدى الحضرمي الاصيل لخدمات الحاسوب يرحب بجميع زواره الكرام
 
الرئيسيةالبوابةاليوميةمكتبة الصورس .و .جبحـثالأعضاءالمجموعاتالتسجيلدخول

شاطر | 
 

 تعلم لغة c++ من الصفر

اذهب الى الأسفل 
كاتب الموضوعرسالة
Admin
Admin
Admin
Admin

عدد المساهمات : 316
نقاط : 3291
السٌّمعَة : 0
تاريخ التسجيل : 07/11/2012

مُساهمةموضوع: تعلم لغة c++ من الصفر    10/3/2013, 22:34



نظراً لعدم توفر مواضيع مستمرة في العديد من المواقع العربية تشرح مواضيع البرمجة من الصفر , أنشأت هذا الموضوع لأطرح المواضيع المتعلقة ببرمجة التطبيقات الخاصة بالويندوز و الويب.
و أسأل الله أن يوفقني في هذا العمل

هذا الموضوع منقول من زيزي زووم من الاخ E.ALI

الـفــهرس

1. لغات البرمجة Programming languages
2. Your first C++ program
3. المكونات الأساسية Basic elements of cpp
4. المخرجات Outputs
5. أنواع البيانات Data types
6. الثوابت , المتغيرات , المدخلات Constants - Variables - Inputs
7. المدخلات Inputs part 2
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
لـغــات الــبــرمــجة Programming languages

البرمجة هي عملية كتابة أوامر الى جهاز الكمبيوتر , ثم يقوم الجهاز بتنفيذ هذه الاوامر خلال سلسلة من الخطوات , تتم كتابة الأوامر من خلال لغات برمجة , قسمت إلى قسمين ( لغات منخفضة المستوى , لغات عالية المستوى ).

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

أما اللغات عالية المستوى فهي اللغات القريبة الى لغة البشر , لذلك هي أسهل من المنخفضة المستوى , الأوامر التي تُكتب بوساطة هذه اللغات لا يتم تنفيذها مباشرة , بل تحتاج الى مفسر تقوم بتحويلة الى لغة الحساب , ثم يتم تنفيذ الاوامر , لذلك فان تنفيذ الأوامر تكون أبطأ من الأوامر المكتوبة بوساطة لغات منخفضة المستوى , من الأمثلة على هذه اللغات : الفيجوال بيسك , الجافا , C++.

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

لكتابة الأوامر في لغة C++ نحتاج الى مترجم , المترجمات كثيرة , لكني سأختار مترجم Microsoft visual C++ , هناك نسخة مجانية من المترجم يمكنك تحميلها من هنا http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
Your first program

كل برنامج C++ يتم كتابته في ملف امتداده .cpp وهو ملف خاص للسي بلاس بلاس , البرنامج الواحد يحتوي على ملف cpp واحد أو أكثر , هذه الملفات تجمع وتسمى مشروع Project أو Solution.

لتشغيل مشروع سي++ يتطلب من المترجم استدعاء الملفات اللازمة لتشغيل هذا المشروع , لكن ماهي هذه الملفات؟

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

في سي++ , اذا أردت استخدام بعض الأوامر , يجب عليك أولاً استدعاء الملفات التي تمكنك من استخدام هذه الأوامر , بعد ذلك يقوم المترجم باستدعاء هذه الملفات عند التشغيل.


بعد تنصيب وتشغيل مترجم مايكروسوفت , سيكون هكذا شكله



اضغط على New Project لإنشاء مشروع جديد , في النافذة التي ستظهر اختر نوع المشروع Empty project , اكتب اسب مناسب للمشروع ثم اضغط Ok



لقد قمت بانشاء المشروع , بعد انشاء المشروع تحتاج الى انشاء ملف cpp حتى تتمكن من كتابة الاوامر بلغة سي++ , توجه الى Solution explorer تجده على اليسار ثم اضغط زر يمين على اسم المشروع Add ---> New Item

اختر نوع العنصر ملف cpp C++ file واكتب اسم مناسب له ينتهي بـ.cpp مثلا basics.cpp


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

اقتباس :
محرر Codes المتطور:
#include <iostream>

using namespace std;

int main()
{

system("PAUSE");
return 0;

}



الان اضغط على مفتاح f5 ليتم ترجمة المشروع وبناءه وتشغيله و في الانافذة التي تليها اختر Yes , ستظهر لك شاشة كونسول كالاتي



اذا ظهرت هذه النافذة فقد تم انشاء مشروعك وتشغيله بنجاح.

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ\


مكونات أساسية Basic elements of Cpp

برنامج سي++ عبارة عن مجموعة من برامج ثانوية , تسمى دوال Functions , بعض الدوال تسمى بالدوال الجاهزة أو المعرفة مسبقاً Predefined function وهي دوال تم كتابتها سابقاً وهي جاهزة للاستخدام فمثلاً اذا تريد ايجاد الجذر التربيعي للعدد x فانه تقوم باستخدام دالة جاهز sqrt(), ولكن ليس كل ما يحتاجه المبرمج موجود مسبقاً في الدوال , لذلك يُمكنك سي++ من كتابة دوال خاصة بك حتى تستدعيها عند الحاجة.

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

التعليقات Comments

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

هذه الصيغة العامة لكتابة تعليق في سي++
اقتباس :
محرر Codes المتطور:
//This is a comment
// This is another comment
هناك نوعان من التعليقات في سي++ , تعليق ذو سطر واحد كما هو وضح في الأعلى , وتعليق ذو أسطر متعددة وهذه صيغتها
اقتباس :

محرر Codes المتطور:
/* This is a multiple line comments
it prints more than one line
in C++
*/
هذه التعليقات يتم تجاهلها من قبل المرتجم , أي أنه لن يتم قراءة التعليقات على أنها جزء من اوامر سي++.
هنا مثال جيد لكيف تقوم باستخدام التعليقات.
الكود:

محرر Codes المتطور:
cout << 7+8 << endl; // It will print 15
الجزء cout << 7+8 << endl; سيتم ترجمته من قبل Compiler ولكن التعليق يتم تجاهله.
برنامجك الأول Your first program

لنرجع الى البرنامج الذي تم شرحه في القسم 2

محرر Codes المتطور:
int main()
{

system("PAUSE");
return 0;
}
عندما تقوم بكتابة أي برنامج سي++ يجب أن يحتوي على هذه الاكواد , السطر الأول , كما ذكرت أن كل برنامج سي++ يحتوي على دالة رئيسية وهي main()n ثم يتم فتح قوسين بهذا الشكل { تكتب هنا الأوامر } , system("PAUSE") n هي دالة جاهزة للاستخدام وتستخدم لمنع البرنامج من الاغلاق التلقائي بل ينتظر المستخدم أن يضغط على أي زر على الكيبورد حتى يغلق البرنامج , لاحظ في نفس السطر وجود هذا الرمز ; وهو ضروري في سي++ , يجب كتابة هذا الرمز بعد الانتهاء من كل أمر , في السطر الذي يليه reutrn0 وهو جزء من الدالة main يقوم بارجاع قيمة 0 الى الكمبيوتر حتى يعرف الكمبيوتر اذا ما تم تشغيل البرنامج بنجاح أو فشل في ذلك.


في الواقع عليك أن تحفظ هذا التركيب حتى تكتب برامجك في سي++ , ولكن في المستقبل لن تحتاج الى الحفظ.
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــت

المخرجات Outputs

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

الأمر الخاص بكتابة نص هو cout , تقوم بكتابة هذا الأمر دالة الدالة الرئيسية main

محرر Codes المتطور:
int main()
{
std::cout << "hello" ;
system("PAUSE");
return 0;

}
ولكن اذا جرت تشغيل البرنامج ستظهر رسالة خطأ , لأنك لم تقم باستدعاء الملف الخاص بالأمر cin ( ملاحظة : هذه الملفات التي توجد بها الدوال و الاوامر الجاهزة تسمى header files), كيف تقوم باستدعاء هذا الملف؟

اقتباس :
محرر Codes المتطور:
#include <header file name>
اذا اردت مثلا استدعاء ملف اسمه Robots تكتب

اقتباس :
محرر Codes المتطور:
#include <Robots>
الملف الخاص بالأمر cin هو iostream , اختصار لـ input - output stream , يجب استدعاء هذا الملف اذا أردت استخدام أوامر الاخراج و الادخال.
اقتباس :

محرر Codes المتطور:
#include <iostream>
استدعاء ملفات header تتم في بداية البرنامج أي قبل كتابة أي كود يجب استدعاء الملفات اللازمة , الشكل العام لبرنامج يقوم باظهار نص hello تكون كالآتي
اقتباس :

محرر Codes المتطور:
#include <iostream>


int main()
{
std::cout << "hello" ;
system("PAUSE");
return 0;

}
قم بتشغيل البرنامج , سيظهر النص hello و لكن مشكلة هذا النص أنه ملتص بالنص الافتراضي الذي يظهر دائما في سي++ Press any key to continue




لحل هذه المشكلة يجب ادراج الأمر الخاص بالتوجيه الى سطر جديد وهو endl , اختصار end line كالآتي
اقتباس :

محرر Codes المتطور:
std::cout << "hello" << std::endl ;
اذا قمت بتشغيل البرنامج ستجد الجملة في سطر جديد , وهذا أمر جيد.
لكن مهلاً , ما قصة std::n؟ في الحقيقة هذا الكود هو كود سي و ليس سي++ (سي++ تطوير للغة سي , لغة سي أقدم من سي++) , كلما اردت استخدام اوامر الادخال و الاخراج يجب ادخال std:: ولكن الأمر متعب بعض الشيء , في سي++ يمكن القضاء على std:: من خلال ارداج الكود الاتي قبل الدالة الرئيسية
اقتباس :

محرر Codes المتطور:
using namespace std;

سيكون الكود العام كالآتي , طبعاً يمكنك الان التخلص من std::

اقتباس :
محرر Codes المتطور:
#include <iostream>

using namespace std;

int main()
{
cout << "hello" << endl ;
system("PAUSE");
return 0;

}
اذا أردت كتابة جملة اخرى في سطر جديد , يمكنك استخدام الأمر cout مرة أخرى , أو يمكنك ان تكتبها بعد أمر نهاية السطر endl

اقتباس :
محرر Codes المتطور:
cout << "hello" << endl << "welcome to c++" ;
النص سيكون ملصق بـالجملة press any key to continue , ماذا تفعل؟ تستخدم الأمر endl.


استخدمت الامر endl للتوجه الى سطر جديد , يمكن استخدام أمر اخر للتوجه الى سطر جديد وهو n\ , تكتبه كما لو تقوم بكتابة نص عادي كالآتي

اقتباس :
محرر Codes المتطور:
cout << "hello \nwelcome to c++\n" ;
عليك أن تنتبه الى انك اذا وصعت مسافة بعد حرف n فان الحرف الذي يليها ستكتب في سطر جديد ولكن بعد مسافة واحدة , واذا كانت مسافتين تكتب بعد مسافتين وهكذا..

الامر الاخر هو امر طباعة مسافة كبيرة Tab "تقريبا 5 مساحات فارخة" بين حرفين, تستخدم t\

اقتباس :
محرر Codes المتطور:
cout << "hello \twelcome to c++\n" ;


لاحظ , اذا اردت طباعة الرمز " في الشاشة , أول كود ستكتبه هو الآتي

اقتباس :
محرر Codes المتطور:
cout << " I'm priting the symbol " in cpp" ;
هذا الكود غير صحيح , لو حاولت تشغيل البرنامج ستظهر لك رسالة خطأ , والسبب أن الرمز " في سي++ تعني بداية أو نهاية نص , المرة الأولى التي كتبت فيها الرمز " تعني بداية نص و في المرة الثانية تعني نهاية نص , أي ان النص الذي سيطبع هو فقط I'm priting the symbol , و لكن in cpp لن يكون من ضمن النص المطبوع لأنه لم تسبقها الرمز " , بينما ; سيعتبر نص لأن سبقه الرمز " , لهذا ان أردت اظهار الرمز " في الشاشة عليك استخدام \ ثم كتابة الرمز , كالآتي

اقتباس :
محرر Codes المتطور:
cout << " I'm priting the symbol \" in cpp\n" ;


ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــت

أنواع البيانات Data types

الهدف من برنامج سي++ هو التعامل مع البيانات , البرامج المختلفة تتعامل مع بيانات مختلفة , على سبيل المثال , البرنامج المصمم لحساب راتب موظفين سيقوم باضافة , ضرب , قسمة و طرح أرقام , وبعض هذه الأرقام قد تمثل عدد الساعات , أو تمثل الراتب لكل ساعة. والبرنامج المصمم لترتيب أسماء الطلبة سيحتاج الى بيانات مثل الاسم الأول و اسم العائلة , لا يمكن اجراء عمليات حسابية على هذه البيانات ( لا يمكن طرح حرف "ع" من كلمة "علي" ليكون الناتج "لي" ) , اذن لا يمكن اجراء حسابات رياضية الا على البيانات الرقمية , في سي++ هناك مجموعة من البيانات تتعامل مع الأرقام بدون فواصل عشرية هي مجموعة Integral ومجموعة أخرى تتعامل مع الفواصل العشرية Floating-point , في هذا الرابط يوجد جدول يوضح هاتين المجموعتين http://msdn.microsoft.com/en-us/library/cc953fe1(v=VS.71).aspx , فمثلاً int , bool و char كلها Integral data types تتعمل مع الأرقام الصحيحة فقط , لكل نوع من البيانات مدى معين من الأرقام يمكنها التعامل معها , وهي موضحة في هذا الجدول http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.71).aspx , مثلاً char يمكنها التعامل مع الأرقام من -128 الى 127 , اذا اعطيت هذا النوع من البيانات الرقم 128 فلن تقبله.

في البرمجة الحديثة , تُستخدم ثلاثة أنواع من integral data types وهي int , bool , char.

int : راجع الجدول لتعرف المدى , يمكنك كتابة ارقام صحيحة مثل 5098 , ولكن لا يمكنك استخدام فواصل مثل 59.0 وان كان الرقم يمثل 59 الا أنه ليس من نوع int , كما انه لا يمكنك استخدام الفواصل التي بهذا الشكل 808,9 لأن سي++ سيعتبره رقمين 808 و 9.

bool : المدى يمتان فقط , هما True و False , تستخدم هذا النوع من البيانات للتعامل مع العمليات المنطقية Logical operations.

char : تتعامل مع الأحرف " رقم واحد , رمز واحد , حرف واحد" مثل الرمز - أو = أو & أو رقم 5 أو حرف g , فقط شيء واحد , الرقم 55 مثلا غير صحيح لانه اكثر من رقم , الرمز )( غير صحيح لأنه اكثر من رمز , حتى المساحة الفارغة ' ' يعتبر رمز أي انه لا استخدام مساحة ثم رمز اخر.


المجموعة الثانية وهي Floating-Point data types , يمكنك هنا استخدام الفواصل العشرية.

float , double يمكنك فيهما كتابة الرقم 55.690 أو بدون فواصل مثل 943 , الفرق بينهما هو في المدى , راجع الرابط السابق.

العمليات الحسابية

يمكنك اجراء الحسابات الرياضية على أنواع البيانات في المجموعتين , الجمع + الطرح - القسمة / و الضرب * وعملية اخرى وهي باقي القسمة % تجري فقط على Integrals

اجراء العمليات الحسابية تتم بقواعد , الضرب و القسمة و باقي القسمة تتم اولاً , ثم الطرح و الجمع

اقتباس :
محرر Codes المتطور:
5*6-10=20
لكن اذا كنت تملك في العملية الحسابية الواحدة ضرب و قسمة فان الاولوية تكون من اليسار, مثلا:

اقتباس :
محرر Codes المتطور:
10/2*3+5 = 20
وان تواجدت اقواس فان الأولوية تكون دائماً لها

اقتباس :
محرر Codes المتطور:
10/2*(3+50)=40
البرنامج الآتي يقوم بتلخيص ما سبق

اقتباس :
محرر Codes المتطور:
#include<iostream>

using namespace std;

int main()

{
cout << 6 * 5 << endl; //output : 30
cout << "5.0 + 3.5 = " << 5.0 + 3.5 << endl; //output : 5.0 + 3.5 = 8.5
cout << "16.3 - 5.2 = " << 16.3 - 5.2 << endl; //output : 16.3 - 5.2 = 11.1
cout << "1980 % 2 = " << 1980 % 2 << endl; //output : 1980 % 2 = 0

system("PAUSE");
return 0;


}

تحويل أنواع البيانات Converting data types

اذا كتبت امر طباعة ناتج 5.0 + 3.5 فان المخرجات تكون 8.5 , يمكنك ان تأمر البرنامج بظهار 8 فقط بدون الفواصل العشرية , وذلك من خلال التحويل الى احد انواع بيانات integral التي تقبل هذا الرقم وهو int. مثلا لتحويل 7.6 الى عدد صحيح تستخدم هذا الكود

اقتباس :
محرر Codes المتطور:
static_cast<int>(7.6)
لتحويل 900 الى double سيكون الناتج 900 بدون فواصل

اقتباس :
محرر Codes المتطور:
static_cast<double>(900)
كما يمكنك تحويل احد الرموز الى الرقم الذي يقابله , اذا اردت ان تعرف الرقم الخاص للرمز A, وهو 65

اقتباس :
محرر Codes المتطور:
static_cast<int>('A')
والعكس صحيح , لتحويل 65 الى الرمز A

محرر Codes المتطور:
static_cast<char>(65)

النصوص String type

النص عبارة عن تسلسل رموز, فالنص يمكنه أن يكون فارغ , يحتوي على رمز , رمزين , مئمة رمز... , String الذي يحتوي على فراغ " " يسمى بـnull or emprty كل رمز في النص له موقع يبدأ الترتيب من صفر , مثلا موقع حرف c في كلمة computer وهو صفر و حرف u هو 4.

البرنامج الآتي يلخص كل ماسبق.

اقتباس :
محرر Codes المتطور:
#include<iostream>

using namespace std;

int main()

{
cout << static_cast<int>((5.8 * 70) - 8 % 4 * (0-0.2)) << endl; //output : 406
cout << static_cast<int>('_') << endl; //output: 95
cout << static_cast<char>(68) << endl; //output : D
cout << static_cast<int>('d') << endl; //output : 100
cout << static_cast<double>(80) - static_cast<int>('&') << endl; //output 42 , the answer will be in integer

system("PAUSE");
return 0;


}
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
الثوابت , المتغيرات , المدخلات Constants - Variables - Inputs

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

لتخزين البيانات تحتاج الى خطوتين :
1- تطلب من الكمبيوتر تخصيص أو حجز مكان في الذاكرة.
2- تدخل بيانات الى هذا المكان في الذاكرة.

الـثوابت

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

عندما تقوم بتخزين هذه البيانات في الذاكرة يجب أن تذكر بأنها بيانات ثابتة لاتتغير وهذه تسمى Named constants, اذن Name constants عبارة عن قيمة ثابتة في الذاكرة غير مسموح بتغييره فترة تشغيل البرنامج.

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

اقتباس :
محرر Codes المتطور:
const DataType Name = value;
حيث DataType يمثل نوع البيانات أو القيمة , Name أي اسم تجده مناسب ولكن هناك شروط لهذه الأسماء تجدها (هــنا) , و Value تعني القيمة المدخلة بحيث يجب ان تتناسب مع نوع البيانات.

مثال , معامل تحويل الانتش الى سنتيمتر

اقتباس :
محرر Codes المتطور:
const double convert = 2.54;
النوع يجب ان يكون double لان القيمة عبارة عن ارقام عشرية , لكن اذا كتبت int سيتخلص البرنامج تلقائيا من الأرقام ما بعد الفاصلة فتكون القيمة 2.

امثلة اخرى على الثوابت

اقتباس :
محرر Codes المتطور:
const int NO_OF_STUDENTS = 20;
const char blank = ' ';
تذكر أن هذه ثوابت لا تتغير فترة تشغيل البرنامج.

المتغيرات

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

طريقة تخصيص مكان للمتغيرات في الذاكرة تشبه الثوابت لكن بدون كلمة const

اقتباس :
محرر Codes المتطور:
DataType Name = value;
أحياناً قد تكون القيمة غير معرفة بالتالي لا داعي لكتابة القيمة تكتفي فقط بالاسم و النوع

محرر Codes المتطور:
double AVG_STUDENTS_SCORE;
و أحياناً أخرى تحتاج الى انشاء اكثر من متغير ولكن من نفس النوع

اقتباس :
محرر Codes المتطور:
int AVG_TEST1 , AVG_TEST2 , AVG_TEST3;
المتغيرات و الثوابت من نوع string

حتى تستطتيع التعامل مع المتغيرات و الثوابت من نوع String تحتاج الى استدعاء ملف string الى البرنامج

محرر Codes المتطور:
#include<string>
ثم تعرفها كأي متغير أو ثابت اخر.

المدخلات

المدخلات في سي++ عبارة عن ادخال قيم للمتغيرات عند فترة تشغيل البرنامج , لادخال قيم الى المتغيرات تتبع القاعدة الاتية

اقتباس :
محرر Codes المتطور:
cin >> variable1 >> variable2 >> variable3 ;
ويجب ان تقوم باستدعاء الملف iostream

المثال الآتي يوضح ذلك

اقتباس :
محرر Codes المتطور:
#include<iostream>
#include<string>

using namespace std;

int main()

{
const int NO_TESTS = 3;
double avgTest1 , avgTest2 , avgTest3 , AVG;
string message = "Thank you\n";
cout << "Enter the average of students score in test1 and test2 and test3" << endl;
cout << "AVG in test1 : ";
cin >> avgTest1;
cout << "AVG in test2 : ";
cin >> avgTest2;
cout << "AVG in test3 : ";
cin >> avgTest3;

AVG = (avgTest1 + avgTest2 + avgTest3) / NO_TESTS;
cout << "The average score is : " << AVG << endl << message;

system("PAUSE");
return 0;


}
كل امر cin يعني ان المترجم سيوقف البرنامج حتى يقوم المستخدم بادخال قيمة من الكيبورد الى المتغير , هذه القيمة لا يمكن ان تكون فارغة , لو تستمى بالضغط على Enter أو space الى الابد فالبرنامج لن يفعل شيء حتى تدخل قيمة للمتغير.
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
المدخلات Inputs part 2

اذا كتبت البرنامج الآتي

اقتباس :
محرر Codes المتطور:
#include<iostream>

using namespace std;

int main()

{
int a, b;
double z;
char ch1, ch2;
cin >> z >> ch1 >> a;

system("PAUSE");
return 0;


}
وقام المستخدم بادخال هذه القيمة 36.78b34 عند طلب البرنامج منه ذلك ( بمجرد تشغيل البرنامج سيطلب منه ادخال قيم ) السؤال المطروح ماذا ستكون قيمة كل متغير من المتغيرات التي عرفناها سابقا؟

أولاً توجه الى الكود cin >> z >> ch1 >> a تجد أن أول متغير للمدخلات هو z , و هذا المتغير نوعه double . اذن , البرنامج سوف يخزن قيمة double داخل هذا المتغير , أي رقم سواء كان بفواصل عشرية أو لا (كما شُرح سابقا) , أي أن قيمتها في المثال السابق تساوي 36.78 فالبرنامج سيقوم بادخال هذه القيمة الى المتغير z , ما أن يصل البرنامج الى حرف b سيتنقل الى المتغير الآخر لان المتغير z لايقبل هذه القيمة.

المتغير الذي يليه هو ch1 وهو عبارة عن char بمعنى أنه سيخزن قيمة واحدة , في هذه الحالة الحرف b , ثم ينتقل البرنامج الى المتغير التالي وهو a الذي هو عبارة عن int أي يخزن رقم صحيح فقط وهو 34 , لو كانت المدخلات 36.78b3N فان الحرف N لن يتم تخزينه في البرنامج وكأنه غير موجود.

افترض انك كنت تملك نفس الكود ولكن المدخلات كانت 36.78 وضغطت على Enter , البرنامج سيقوم بتخزين هذه القيمة في المتغير الأول z , ثم سيطلب منك ادخال قيمة للمتغير التالي مثلاً كانت القيمة A سيتم تخزينها في ch1 وثم سيطلب منك ادخال قيمة للمتغير a مثلاً كتبت 0.45 , سيقوم البرنامج أولاً بتحويله الى int ثم تخزينه بالقيمة 0 , وللتأكد من ذلك اكتب الكود الذي يقوم بطباعة قيمة كل متغير.

اقتباس :
محرر Codes المتطور:
#include<iostream>

using namespace std;

int main()

{
int a, b;
double z;
char ch1, ch2;
cin >> z >> ch1 >> a;
cout << "********************" << endl;
cout << "z = " << z << endl;
cout << "ch1 = " << ch1 << endl;
cout << "a = " << a << endl;

system("PAUSE");
return 0;


}





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

لتوضيح أكثر قم بتعريف هذه المتغيرات مع امر ادخال القيم اليها
اقتباس :
محرر Codes المتطور:
char ch1,ch2;
int num;

cin >> ch1 >> ch2 >> num;
افترض أن المدخلات كانت كالآتي
A 25
سيقوم البرنامج أولاً بادخال قيمة الى ch1 وهو A , ثم ينتظر ادخال قيمة الى ch2 , عندما يقوم المستخدم بادخال المسافة لن يقوم البرنامج بالتعامل معه بل سيتجاهله وسيتمر في طلب قيمة الى المتغير , ثم يدخل المستخدم القيمة 25 ويضغط على Enter , سيقوم البرنامج بادخال القيمة 2 الى المتغير ch2 و القيمة 5 الى المتغير num.

كيف تطلب من البرنامج قراءة المسافات و الأسطر الجديدة على انها قيم؟
تقوم باستخدام الدالة cin.get(char variable)n المتغير الموجود داخل القوس يجب أن يكون من النوع char لأن المسافة سيتم تخزينها على اساس انها رمز.

الان في هذا الكود ستكون المدخلات كما هي
A 25

اقتباس :
محرر Codes المتطور:
cin >> ch1;
cin.get(ch2);
cin >> num;
يمكنك الكتابة بشكل اخر

اقتباس :
محرر Codes المتطور:
cin >> ch1 ;
cin.get(ch2) >> num;
ماهي قيمة كل متغير ؟ أولاً سيقوم البرنامج بادخال قيمة الى ch1 وهو A ثم سيطلب منك ادخال قيمة الى ch2 وفي نفس البرنامج سيعتبر ادخال مسافة عبارة عن قيمة يقوم بتخزينها الى المتغير , وأخيراً يطلب قيمة الى num , يمكنك التأكد من قيمة كل دالة عن طريق امر الطباعة.

اقتباس :
محرر Codes المتطور:
cout << "ch1 = " << ch1 << endl;
cout << "ch2 = " << ch2 << endl;
cout << "num = " << num << endl;
هناك دالة اخرى وهي cin.ignore(intEXP , charEXP)n هذه الدالة تقوم بتجاهل كل المدخلات intEXp مرة (يجب ان يكون عدد صحيح طبعا) حتى يقوم المستخدم بادخال قيمة تشبه charEXP (عبارة عن أي رمز سواء رقم او حرف او رمز اخر) , وعندما يقوم المستخدم بادخال هذه القيمة سيقوم البرنامج يتنفيذ السطر التالي من الكود.

مثلا cin.ignore(100 , 'A')n سيقوم البرنامج بتجاهل كل المدخلات 100 حتى يقوم بادخال القيمة A , وبعد ادخال هذه القيمة سينفذ الكود الذي يليه.

هذا المثال يوضح ذلك

اقتباس :
محرر Codes المتطور:
int num1 , num2;
cin >> num1;
cin.ignore(100 , '5');
cin >> num2;
افترض ان المدخلات كانت كالآتي
محرر Codes المتطور:
3 6 8 9 5 6
سيقوم البرنامج أولاً بادخال قيمة الى num1 وهي 3 , ثم في السطر التالي سيقوم بتجاهل كل القيم 100 مرة الا القيمة 5 , يعني 6 سيتجاهلها , 8 كذلك و 9 أيضاً , ما أن يصل الى 5 سيقوم بتنفيذ الكود التالي وهو ادخال قيمة الى المتغيرnum2.

من المهم ان تعرف ان cin.ignore(100 , '5'); n لايعني انه لو قام المستخدم بادخال الرقم 57 فان البرنامج سيتجاهله. ان وظيفة هذه الدالة قراءة الرموز فقط , و الرقم 5 عبارة عن رمز , اذن سيقوم البرنامج بتنفيذ الكود التالي بمجرد الوصول الى الرقم 5.
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ



الرجوع الى أعلى الصفحة اذهب الى الأسفل
http://bencool.7olm.org
 
تعلم لغة c++ من الصفر
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
www.bencool.com :: ركن البرامج المشروحة والمهمة-
انتقل الى: