PDA

View Full Version : آموزش: آموزش برنامه نویسی C++‎‎ و آموزش برنامه نویسی C از مقدماتی تا پیشرفته



alireza.zahani
شنبه 24 خرداد 1393, 07:47 صبح
با سلام به همگی
در این تایپیک قصد آموزش برنامه نویسی C++‎‎‎‎‎‎‎‎‎‎ و آموزش برنامه نویسی C از مقدماتی تا پیشرفته (http://www.usprojeh.com/Searchs/ParametrSearchGroup/Search41.html) را داریم.
البته با ذکر منبع از لیست زیر هم دوستان میتونند به طور مستقیم به قسمت آموزش ها برن و یا از طریق همین تایپیک مطالب رو دانلود کنند.
1-->توضیح انواع بنیادی(آموزش ++C و آموزش C - قسمت اول -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project298.html)
2-->دستورات cout و cin (آموزش ++C و آموزش C- قسمت دوم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project299.html)
3-->آرایه ها(آموزش ++C و آموزش C - قسمت سوم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project300.html)
4-->رشته های کاراکتری(آموزش ++C , C - قسمت چهارم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project301.html)
5-->عملگرها(آموزش ++C , C - قسمت پنجم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project302.html)
6-->چند عملگر برای خلاصه کردن اعمال حسابی(آموزش ++C , C - قسمت ششم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project303.html)
7-->دستورات کنترل برنامه(آموزش ++C , C - قسمت هفتم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project304.html)
8-->ساختار انتخاب if-else(آموزش ++C , C - قسمت هشتم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project305.html)
9-->دستور تکرار while(آموزش ++C , C - قسمت نهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project306.html)
10-->دستور تکرار for(آموزش ++C , C - قسمت دهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project307.html)
11-->مثال (آموزش ++C , C - قسمت یازدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project308.html)
12-->مراجع (References)(آموزش ++C , C - قسمت دوازدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project309.html)
13-->آرایه ها بعنوان اشاره گرها(آموزش ++C , C - قسمت سیزدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project310.html)
14-->تبدیل (cast) انواع داده ای(آموزش ++C , C - قسمت چهاردهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project311.html)
15-->نوع داده شمارشی (enumeration)(آموزش ++C , C - قسمت پانزدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project312.html)
16-->برنامه نویسی رویه ای (تابعی)(آموزش ++C , C - قسمت شانزدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project313.html)
17-->دستور ifndeF#‎ و استفاده در سرفایلها(آموزش ++C , C - قسمت هفدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project314.html)
18-->توبع ریاضی از کلاس cmath(آموزش ++C , C - قسمت هجدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project315.html)
19-->توابع مفید کار بر روی رشته های سبک C(آموزش ++C , C - قسمت نوزدهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project316.html)
20-->رشته های کلاس string(آموزش ++C , C - قسمت بیست و یکم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project317.html)
21-->پارامترهای مرجع و const(آموزش ++C , C - قسمت بیست و دوم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project318.html)
22-->آرگومان های پیش فرض توابع(آموزش ++C , C - قسمت بیست و دوم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project319.html)
23-->استفاده از جریان(stream) های string(آموزش ++C , C - قسمت بیست و سوم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project320.html)
24-->تولید اعداد تصادفی(آموزش ++C , C - قسمت بیست و چهارم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project321.html)
25-->پارامترهای از نوع آرایه(آموزش ++C , C - قسمت بیست و پنجم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project322.html)
26-->توابع بازگشتی(آموزش ++C , C - قسمت بیست و ششم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project323.html)
27-->نوع متغیرها از نظر مدت ماندگاری(آموزش ++C , C - قسمت بیست و هفتم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project324.html)
28-->توابع inline(آموزش ++C , C - قسمت بیست و هشتم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project325.html)
29-->سربارگذاری (overload) توابع (آموزش ++C , C - قسمت بیست و نهم -مقدماتی تا پیشرفته) (http://www.usprojeh.com/ProjectView/Project326.html)

alireza.zahani
شنبه 24 خرداد 1393, 07:49 صبح
توضیح انواع بنیادی (http://narming.persianblog.ir/post/34/))آموزش C,C++ - مقدماتی -بخش اول)

توضیح انواع بنیادی
ممکن است به عبارت ثابت لفظی(literal constant) برخورد کنید. یک لیترال(literal) ثابتی است که اسم آن همان مقدار آن باشد، مثل عدد 23 یا کاراکتر 'A' و...

int
اعداد صحیح(کامل) را نگه میدارد. پیشوندهای short و long فقط بازه مقادیری که int نگه میدارد را تغییر میدهند. معمولاً از int استفاده میشود اما درجاهایی که مقدار فضای مصرفی برنامه مهم است، از short استفاده کنید، هرجا هم که میخواهید مقادیری فراتر از بازه مقادیر int را ذخیره کنید، از int64__ استفاده کنید. کلمات کلیدی intn__ خاص مایکروسافت هستند، بنابراین اگر از این انواع استفاده کنید، در کامپایلری که این انواع را نداشته باشد، کد شما خطا خواهد داد.
میتوانید مقادیر لیترال مبنای شانزده را در کد خود وارد کنید، به فرم: عدد0x مثلاً اگر number یک عدد int باشد، number = 0x10 معادل number = 16 هست، چراکه 10 در مبنای شانزده برابر 16 در مبنای ده است.

bool
مخفف نام boolean است که میتواند مقدار true(درست) یا false(نادرست) داشته باشد(true و false کلمات کلیدی هستند). معمولاً در تبدیل اعداد، عدد صفر 'نادرست' و اعداد غیر صفر، 'درست' در نظر گرفته میشوند.

char
کاراکتر به یک نشانه میگویند که در مجموعه کاراکترهای زمان اجرا وجود دارد. مثلاً 'a' یک نشانه یا کاراکتر است(در ++C هر کاراکتر منفرد در دوتا ' قرار میگیرد). این مجموعه کاراکترها برای ++ASCII ، Microsoft C هست. مجموعه کاراکترهای اسکی(ASCII) را میتوانید در MSDN مشاهده کنید(در قسمت ASCII character set). چون هر char یک بایت فضا میگیرد و 256 حالت دارد، بنابراین یکی از 256 کاراکتر مختلف را میتوان در آن نگهداری کرد. وقتی که مجموعه کاراکترها را در MSDN میبینید(مثلاً در قسمت 127-0)، هرکدام یک عدد در زیر ستون Dec دارند، در حقیقت مقدار هر کاراکتر یک عدد است. مثلاً کاراکتر A را در نظر بگیرید، اگر در ستون Dec مقدار آن 65 است. این یعنی وقتی A را بصورت عدد استفاده کنیم 65 هست و وقتی نمایش کاراکتری آن را داشته باشیم، A خواهد بود(در اصل وقتی A در حافظه بخواهد ذخیره شود، عدد 65 در یک بایت بعنوان A ذخیره میشود، که آن عدد خود بصورت یک عدد دودویی ذخیره میشود، چون در نهایت هرچیزی در حافظه کامپیوتر بصورت یک سری ارقام دودویی که یا صفر هستند یا یک، ذخیره میشود). البته این موضوع بعداً در کاربرد روشنتر خواهد شد. اما از اینجا این را درنظر داشته باشید که هر کاراکتر متناظر با یک عدد است(که به آن کد کاراکتر هم میگویند، که البته با ستون Code در MSDN متفاوت است).

char
همانطور که مجموعه کاراکتری ASCII وجود دارد، مجموعه های دیگری هم وجود دارند. زمانی که ASCII را تعریف کردند فقط یکسری از علایم بعلاوه حروف و اعداد انگلیسی را در آن در نظر گرفتند(همانطور که در MSDN میبینید). البته بیش از این هم جا نداشت! چرا که فقط یک بایت با 256 حالت در اختیار داشت. اما بعداً با رواج اینترنت و همچنین تلاش برای تولید نرم افزارهایی با پشتیبانی چندین زبان، نیاز به یکسری کد برای کاراکتر های سایر زبان ها احساس شد. چون ASCII قابل گسترش در یک بایت نبود، یک مجموعه کاراکتری جدید با دو بایت فضا ایجاد کردند و نامش را Unicode گذاشتند(که از Universal code (کد جهانی) می آید، چرا که برای داشتن تمام کدهای کاراکتری لازم در تمام جهان ابداع شد). wchar_t (یا همان wchar_t__) برای در برداشتن کاراکترهای یونی کد(Unicode) به ++C اضافه شده است. بنابراین مثلاً برای استفاده از کاراکترهای فارسی، از این نوع استفاده کنید.

enum
مخفف enumeration در انگلیسی است، که 'شمارشی' ترجمه میشود. این نوع را درجای خود توضیح خواهیم داد.

float و double
انواعی برای ذخیره اعداد اعشاری با ممیز شناورند. مثلاً عددی مثل: 123.456. تفاوتشان در اندازه شان هست، اندازه double دو برابر float میباشد. شما برای مشخص کردن ثابت هایی از نوع اعشاری، میتوانید از نماد علمی هم استفاده کنید، مثلاً برای ده بتوان 3- بنویسید: 10e-3 که e نماینده توان است(بزرگ و کوچک بودنش فرقی ندارد، اما باید بدون فاصله بنویسید)، یا مثلاً 1508E+30(که همان 1508E30 هست).



تعیین اندازه یک نوع یا متغیری از آن نوع
اگر میخواهید بدانید که یک نوع در کامپیوتری که برنامه شما اجرا میشود چند بایت است، یک عملگر که کلمه کلیدی هم هست، در ++C وجود دارد به نام sizeof. مثلاً (sizeof(int اندازه یک int را برمیگرداند، یا مثلاً اگر متغیر number داشته باشید، (sizeof(number اندازه number را برمیگرداند(وقتی sizeof را بر روی یک متغیر اعمال میکنید، میتوانید پرانتزها را نگذارید و بنویسید: sizeof number). این عملگر را برای نوع void نمیتوانید بکاربرید، و هیچ گاه مقدار 0 برنمی گرداند.

alireza.zahani
شنبه 24 خرداد 1393, 07:50 صبح
دستورات cout و cin (آموزش ++C و آموزش C- قسمت دوم -مقدماتی تا پیشرفته)


دستورات cout و cin
این دستورات برای ورودی-خروجی استفاده میشوند. خروجی روی مانیتور هست و ورودی را از صفحه کلید توسط کاربر دریافت میکند. توجه کنید که اینها دراصل دستور نیستند. فقط اشیاءی از نوع کلی stream هستند.

cout
برای خروجی روی مانیتور استفاده میشود. شکل استفاده از آن چنین است:

;endl >> نام متغیر >> "پیغام" >> cout

این یک شکل کلی است که نشان میدهد ابتدا یک پیغام روی مانیتور چاپ شود، بعد مقدار یک متغیر و در انتها به سطر بعدی منتقل شود. endl که از end of line آمده است، به معنی آخر خط میباشد و مکان نما(یعنی خط فاصله چشمک زن در پنجره خروجی، که محل قرارگیری کاراکتر بعدی را نشان میدهد و به آن cursor میگویند) را به ابتدای سطر بعد میبرد.

cin
برای در یافت ورودی از سوی کابر استفاده میشود. مقدار دریافتی در متغیری که در دستور مشخص شده نگهداری خواهد شد. شکل کلی دستور:

;نام متغیر << نام متغیر << cin

هر تعداد متغیر که بخواهید میتوانید در دستور cin وارد کنید.

چند مثال و نکته
ابتدا به قطعه کد قسمت 'اولین برنامه ++C' که قبلاً ارائه دادیم برگردید و کاربرد دستورات cin , cout را مشاهده کنید. حالا به مثال دیگری توجه کنید:

کد قالب بندی شده:
#include
using namespace std;

/*
It's a multiple line comment,
you can write your comments in more than one line
*/

int main()
{
int num1,
num2;

cout << "Please enter two numbers : "; // it's a one line comment
cin >> num1 >> num2;
cout << "The entered numbers are : " << num1 << " and " << num2 << endl;

cout << "Size of int in this computer is : " << sizeof(int) << endl;

cout << "It's in the first line\nIt's in the second one\n";

system( "pause" );
return 0;
}
تحلیل:
توضیحات (comments)
هرجایی از کد(خارج از یک رشته کاراکتری) میتوانید بعد از دوتا \ یک توضیح بیاورید، یعنی مثلاً در آخر یک دستور توضیح دهید که هدف از این دستور چیست. کامپایلر توضیحات را نادیده میگیرد، یعنی انگار که وجود ندارند. \\ یک توضیح یک خطی را فراهم میکند، برای وارد کردن یک توضیح در چند خط، بجای استفاده از \\ در ابتدای هر توضیح در هر خط، میتوانید در ابتدای توضیحات *\ را وارد کنید و در انتهایش(که ممکن است چند خط بعد باشد) \* را وارد کنید.

تحلیل عملکرد برنامه
ابتدا دو عدد num1 و num2 را تعریف کرده ایم. بعد با چاپ یک پیغام از کابر درخواست میکنیم که دو عدد را وارد کند. با دستور cin منتظر دریافت اعداد میشویم. در اینجا کاربر باید یک عدد را وارد کرده و سپس یک یا چندبار کلید space را بزند تا چند کاراکتر جای خالی(white space) ایجاد شود (یعنی بین اعداد فاصله بیفتد)، آنگاه عدد دیگر را وارد کرده و کلید Enter را بزند. حتی کاربر میتواند بین وارد کردن دوعدد، فقط کلید Enter را بزند(بجای space). سپس برنامه پیغامی میدهد و اعداد دریافت شده را چاپ میکند. دستور بعد اندازه یک int را برحسب تعداد بایت چاپ میکند. دستور بعد در دو سطر چاپ میشود، با اینکه از endl استفاده نکرده ایم. این عمل با استفاده از 'n\' در پیغام، انجام شده است. اما در ++C کاراکترهایی که بعد از \ در یک رشته کاراکتری(یعنی همان پیغام) می آیند، معنای خاصی میدهند. تمام اینها یک کاراکتر تنها هستند، مثلاً 'n\' یک کاراکتر است، بهمین خاطر میتوانیم آنرا در دوتا ' بگذاریم(چرا که اگر رشته کاراکتری بود باید در دوتا " میگذاشتیم). یعنی در هر جای یک رشته(یعنی همان رشته کاراکتری) که تایپ کنید n\ بعد از چاپ شدن یک سطر جدید تولید خواهد کرد. حتی میتوانید به تنهایی به جای endl بنویسید 'n\' و بعد از اجرای برنامه یک خط جدید در خروجی خواهید داشت.
غیر از 'n\' کاراکترهای ویژه دیگری هم داریم که در زیر آورده شده اند و استفاده آنها درست مانند 'n\' میباشد. در این کاربرد، به کاراکتر \ میگویند escape character و به این کاراکترهای ویژه escape sequence میگویند.

t\ : مکان نما را به اندازه یک تب جلو میبرد(یعنی مانند آنکه یکبار دکمه تب در کامپیوتر کاربر زده شود).
r\ : مکان نما را به ابتدای سطر فعلی میبرد. به این عمل carriage return گویند.
a\ : بوق(alert) سیستم را بصدا درمی آورد.
\\ : یک کاراکتر \ را چاپ میکند.
'\ : یک کاراکتر ' را چاپ میکند (البته برای ' نیازی به \ نیست).
"\ : یک کاراکتر " را چاپ میکند.
b\ : آخرین کاراکتر را از خروجی حذف میکند(معادل backspace).

هرکدام از اینها را در چاپ یک رشته امتحان کنید.

alireza.zahani
شنبه 24 خرداد 1393, 07:50 صبح
آرایه ها (http://narming.persianblog.ir/post/32/)(آموزش ++C و آموزش C - قسمت سوم -مقدماتی تا پیشرفته)


آرایه ها (http://narming.persianblog.ir/post/32/)
وقتی نیاز به چندین متغیر با یک نوع و مرتبط به یک موضوع دارید، از آرایه استفاده کنید. یک آرایه فقط مجموعه ای از متغیرهای همنوع است، مثلاً آرایه ای از int ها:
;[int iarray[5 یک آرایه با ظرفیت 5 عدد صحیح با نام iarray ادعا میکند. مثلاً میتوانید نمره های 5 دانش آموز را بجای نگهداری در پنج متغیر جداگانه، در عناصر این آرایه نگهدارید. برای مقدار دهی به یک عنصر آرایه: ;23 = [iarray[0 به عنصر اول آرایه مقدار 23 رامیدهد. همچنین برای دسترسی به مقدار عنصر اول از [iarray[0 استفاده کنید. اندیس(عدد درون کروشه ها) عناصر آرایه از صفر شروع میشود تا یکی کمتر از تعداد عناصر آرایه، پس آخرین عنصر با [iarray[4 در دسترس قرار میگیرد. آرایه iarray فقط یک بعد دارد، اما میتوان آرایه هایی با ابعاد بیشتر هم داشت. اگر آرایه یک بعدی را مجموعه ای از جعبه ها در نظر بگیرید، آرایه دو بعدی میشود جعبه هایی که درون آنها جعبه های دیگری وجود دارد. یک آرایه دو بعدی: ;[4][int iarray2[3 یک آرایه را تعریف میکند که بعد اول آن اندازه 3 و بعد دوم آن اندازه 2 دارد. یعنی 3 جعبه که در هر کدام 2 جعبه دیگر قرار دارد.
آرایه سه بعدی ;[2][5][int iarray3[4 اندازه بعد سوم آن 2 است.

به شکل زیر توجه کنید، تا تصویر بهتری از آرایه ها داشته باشید:

نمایش تصویری آرایه ها

میتوان گفت، آرایه یک بعدی مجموعه ای از متغیرهای ساده، آرایه دو بعدی مجموعه ای از آرایه های یک بعدی، آرایه سه بعدی مجموعه ای از آرایه های دوبعدی است. آرایه های با اندیس های بالاتر بندرت استفاده میشوند.

مقداردهی اولیه به آرایه ها
برای آرایه یک بعدی: ;{1,2} = [int ar[2 به عنصر اول مقدار 1 و به دوم 2 میدهد. برای آرایه دو بعدی: ;{{3,4},{1,2}} = [2][int ar[2 ، آکولاد بازوبسته درونی اول برای سطر اول و دومی برای سطر دوم است (البته آکولادهای درونی اختیاری هستند، اما برای خوانایی بیشتر بهتر است بگذارید) یعنی {1,2} به سطر اول مقدار میدهد، طوریکه به ستون اول مقدار 1 و به ستون دوم مقدار 2 میدهد.
برای آرایه سه بعدی: ;{ {{7,8},{5,6}} , {{3,4},{1,2}} } = [2][2][int ar[2 قسمت {{3,4},{1,2}} به سطر اول مقدارمیدهد، طوریکه {1,2} به ستون اول آن مقدار میدهد، طوریکه 1 برای عمق اول آن و 2 برای عمق دوم قرار میگیرد. مثلاً [ar[1][0][1 مقدار 6 را میدهد، چراکه در سطر دوم({{7,8},{5,6}}) در ستون اول({5,6}) مقدار عمق دوم را برمیگرداند. اگر عمق اول را مشخص کرده بودیم([ar[1][0][0) پنج میداد، یا اگر سطر اول را مشخص کرده بودیم ([ar[0][0][1) دو میداد. البته مقدار اولیه دهی به آرایه های سه بعدی کمتر پیش می آید.
اگر در مقدار دهی اولیه آرایه، به یک عنصر از آن مقدار ندهید کامپایلر به آن مقدار صفر میدهد، مثلاً در ;{{1,2}} = [2][int ar[2 هر دو ستون سطر دوم مقدار صفر میگیرند. اگر میخواهید به تمام مقادیر آرایه مقدار صفر دهید، آرایه را هنگام تعریف برابر {} قرار دهید، مثلاً بنویسید : ;{} = [2][2][int ar[2

نکته: مقداردهی اولیه آرایه فقط در هنگام تعریف آرایه امکان پذیر است.

نکته: در مقدار دهی اولیه به یک آرایه میتوانید اندازه بعد اول را مشخص نکنید و کامپایلر خود با توجه به تعداد مقادیر اولیه ای که فراهم آورده اید اندازه آنرا تعیین میکند. اما اندازه سایر ابعاد را همیشه باید مشخص کنید. مثلاً: ;{{int ar[][2] = {{1,2},{3,4

تعیین تعداد عناصر یک آرایه
اگر مثلاً [int ar[2][3 را داشته باشیم، عبارت (sizeof(ar مقدار 24 را میدهد که اندازه کل آرایه است، چراکه 2x3 یا 6 تا عنصر از نوع int دارد، و چون هر int چهار بایت میگیرد، پس 6x4 یا 24 بایت کل آرایه میگیرد. پس ما اندازه کل آرایه را داریم و اندازه هر عنصر میشود (sizeof(int چراکه نوع هر عنصر int است، در نهایت (sizeof(ar) / sizeof(int اندازه کل آرایه را به اندازه هر عنصر آن تقسیم میکند و تعداد عناصر آرایه را میدهد (/ عمل تقسیم را انجام میدهد).

مثالی برای استفاده از آرایه ها

کد قالب بندی شده:
#include
using namespace std;

int main()
{
int ar[2][3] = {1};

cout << "Enter a number : ";
cin >> ar[1][2];
cout << "Your number is : " << ar[1][2] << endl;

cout << "\n\nElement in first row and first column of the array is : " << ar[0][0]
<< "\nand for the second column : " << ar[0][1];

cout << "\n\nNumber of elements in the array is : " << sizeof(ar) / sizeof(int) << endl;

system("pause");
return 0;
}
تحلیل
برنامه ابتدا عددی را از کاربر در عنصر[2] [1] از آرایه ar میگیرد (یعنی در عنصر سطر دوم-ستون سوم از آرایه مقدار دریافتی از کاربر قرار میگیرد)، سپس آنرا چاپ میکند. سپس عناصر [0][0] و [1][0] را نمایش میدهد که اولی مقدار 1 دارد چون مقداردهی اولیه شده، و دومی مقدار 0 چون مقداردهی اولیه نشده. در آخر نیز تعداد عناصر آرایه نمایش داده میشود.

alireza.zahani
شنبه 24 خرداد 1393, 07:51 صبح
رشته های کاراکتری (http://narming.persianblog.ir/post/31/)(آموزش ++C , C - قسمت چهارم -مقدماتی تا پیشرفته)


رشته های کاراکتری (http://narming.persianblog.ir/post/31/)

یک مجموعه از کاراکترها را یک رشته کاراکتری(یا بطور خلاصه 'رشته' یا string) میگویند. مثلاً "This is a string" یک نمونه از رشته هاست. یک ثابت رشته ای همیشه در دوتا " قرارمیگیرد. اما ما دونوع رشته داریم:
1.مجموعه ای از char ها(که به رشته های سبک C-style) C) (منظور زبان C است) هم معروف اند)
2.از نوع کلاس string

رشته های سبک C
رشته های اصلی ++C هستند. برای این به فرمت C مشهورند که قبل از ++C در C وجود داشتند. این رشته ها در اصل آرایه ای از کاراکترها هستند. مثلاً رشته "char str[7] = "String ، که از 6 کاراکتر بعلاوه کاراکتر پایان رشته(که خود کامپایلر اضافه میکند) تشکیل شده و در هنگام تعریف مقدار اولیه گرفته است.

کاراکتر پایان رشته که به آن کاراکتر پوچ پایان دهنده (terminating null character) هم میگویند، در اصل یک کاراکتر است که وقتی چاپ شود یک فاصله چاپ خواهد شد(البته کاراکتر فاصله چیز دیگری است و کد اسکی آن 32 است)، و نام اصلی آن کاراکتر پوچ (null) است که در اینجا برای مشخص کردن پایان یک رشته از آن استفاده میشود. کد اسکی آن 0 است و بصورت کاراکتری '0\' نوشته میشود، بنابراین از کاراکتر '0' که کداسکی 48 دارد و یک 0 چاپ میشود متمایز میگردد. پس هر جایی که این کاراکتر در یک رشته قرار گیرد پایان آنرا مشخص میکند(حتی اگر بعد از آن کاراکترهای دیگری قرار داشته باشند) و در اعمال مختلفی که روی رشته انجام میشود معیار پایان آن قرار میگیرد. مثلاً وقتی یک رشته را با دستور cout << str چاپ کنید، فقط تا قبل از کاراکتر پوچی که در رشته قرار دارد چاپ میشود.

هر ثابت رشته ای که در بین دوتا " قرار میگیرد شامل یک '0\' هم در پایان خود هست، هرچند که شما چنین چیزی را مشخص نمیکنید، بنابراین وقتی با دستور "char str[7] = "String یک رشته را تعریف میکنید، کاراکتر هفتم آن '0\' قرار میگیرد (و مثلاً کاراکتر ششم g هست).
روش دیگر برای مقدار دهی یک آرایه کاراکتری(که در اصل نمایشگر یک رشته است) استفاده از مقداردهی هر کاراکتر بطور جداگانه است، مثلاً {'0\','char str[7] = {'S','t','r','i','n','g که همان String را نمایش میدهد، اما چون خودمان هر کاراکتر را مشخص کرده ایم، باید '0\' را هم مشخص کنیم.

برای مقدار دهی اولیه تهی('0\') به تمام اعضای یک آرایه کاراکتری میتوانید از عبارت {'char str[7] = {'\0 استفاده کنید، یا اینکه بجای '0\' بگذارید 0 چراکه همانطور که میدانید میتوان بجای نوشتن یک کاراکتر بین دوتا ' کد اسکی آنرا نوشت.

برای دریافت یک رشته از کاربر، اگر مثلاً [char str[7 را تعریف کرده باشیم، دستور cin >> str یک رشته را از کاربر دریافت میکند. البته باید تعداد کاراکترهای رشته ای که کاربر وارد میکند از طول آرایه کاراکتری ما کمتر باشد، یعنی برای str فقط 6 کاراکتر را از کاربر میتوان دریافت کرد(چرا که کاراکتر آخر را برای '0\' نگه میداریم و دستور cin بعد از دریافت رشته از سوی کاربر هفتمین کاراکتر را '0\' خواهد گذاشت). البته کاربر میتواند کمتر از 6 کاراکتر هم وارد کند، مثلاً اگر 3 تا وارد کند، کاراکتر چهارم مقدار '0\' خواهد گرفت و کاراکترهای پنجم تا هفتم تغییری نخواهند کرد.

اما اگر میخواهید با این مشکل مواجه نشوید که کاربر تعداد بیشتری کاراکتر وارد کند و برنامه شما هنگ کند، از دستور ;('cin.getline(str,4,'y استفاده کنید، که با استفاده از تابع getline یک ورودی به طول 4(با حساب کردن '0\') را از کاربر میگیرد و در str قرار میدهد، اگر زودتر از آن به کاراکتر y برسد، تا قبل از آن را در str قرار میدهد (در اصل y در اینجا حائل(delimiter) است). هریک از str و 4 و y یک آرگومان تابع getline هستند که شما میتوانید بجای آنها هرچیز دیگری از همان نوع بگذارید. اما مقداری که برای آرگومان دوم(4) در نظر میگیرید، باید با حساب کردن '0\' حداکثر برابر طول آرایه ای که در آرگومان اول مشخص میکنید باشد. یعنی اگر طول آرایه شما 7 هست، حداکثر 7 را میتوانید برای آرگومان دوم در نظر بگیرید و getline شش کاراکتر را از ورودی گرفته و در str قرار میدهد و کاراکتر هفتم را '0\' میگذارد.چنانچه کاربر کاراکتر های بیشتری وارد کند، اگر بعداً دستورات ورودی بیشتری در برنامه داشته باشیم، این کاراکترها را دریافت خواهند کرد، یعنی هیچ وقت ورودی های کاربر از بین نمیروند و در بافر ورودی قرارمیگیرند تا اینکه با یک دستور ورودی خوانده شوند یا با دستوری دیگر یا رسیدن به انتهای برنامه حذف شوند.
getline یک نمونه دو پارامتری هم دارد، مثلاً مثال قبل را میتوانید اینگونه بنویسید: (cin.getline(str,4 با این دستور کاراکترها تا جایی از کاربر دریافت میشوند که کلید Enter زده شده باشد یا اینکه به حد 3 کاراکتر رسیده باشند(این نمونه از دستور مشابه ('cin.getline(str,4,'\n هست، چراکه فشاردادن کلید Enter مقدار 'n\' را تولید میکند). این شکل از دستور برای زمانی مناسب است که یک حداکثری برای اندازه ورودی کاربر در نظر گرفته ایم اما حداقلی در نظر نداریم.

یکی از مزیت های getline به cin در دریافت رشته ها: getline رشته ای که بین آن فاصله وجود دارد را هم یکجا میگیرد، اما cin همیشه تاجایی که کاربر یک کاراکتر فاصله وارد کرده است میخواند. بنابراین getline میتواند کل 34 12 را با یک دستور بخواند، اما cin در هر بار فقط یک قسمت را میخواند، اول 12 وبعد 34 را دریافت میکند.

توجه: 'توابع مفید برای کار برروی رشته ها' و 'رشته های نوع string' بعد از توضیح توابع در قسمت های بعدی آورده خواهند شد.

alireza.zahani
شنبه 24 خرداد 1393, 07:51 صبح
عملگرها (http://narming.persianblog.ir/post/30/)(آموزش ++C , C - قسمت پنجم -مقدماتی تا پیشرفته)


عملگرها (http://narming.persianblog.ir/post/30/)

به هر مجموعه ای از کاراکترها که بتواند بین یا قبل از دو مقدار یا متغیر قرارگیرد و عملی روی آنها(یا با استفاده از آنها) انجام داده و بطور اختیاری مقداری برگرداند، یک عملگر میگویند. مثلاً + یک عملگر است(عملگر جمع) که از یک کاراکتر '+' تشکیل شده، بین دو مقدار یا متغیر قرار میگیرد، عمل جمع را با استفاده از آنها انجام داده و مجموع آنها را برمیگرداند.

به مقادیر یا متغیرهایی که عملگر بین یا قبل و بعد از آنها قرار میگیرد و عملی را با آنها انجام میدهد، عملوند میگویند. مثلاً در 4 + 5 اعداد 5 و 4 عملوندهای عملگر جمع هستند، پس عملگر جمع دو عملوند دارد(میگیرد).

به عملگرهایی که فقط یک عملوند دارند یگانی(unary) میگویند. مثلاً عملگر جمعی که یک عملگر بگیرد هم داریم، که در اصل استفاده ای ندارد، چراکه مثلاً 2+ و 2 یکی هستند(اما عملگر یگانی منفی کاربرد برگرداندن مقدار منفی را دارد). عملگرهایی که دو عملوند میگیرند را دوتایی(binary) میگویند، مثل عملوند تفریق(-). عملوندهایی که سه تا عملوند میگیرند را سه تایی(ternary) میگویند، مثل عملگر انتخاب(:?). بعداً خواهید دید که رفتار عملگرها را میتوانید تغییر دهید.

عملگرهای حسابی
جمع : + ، تفریق(منفی) : - ، ضرب : * ، تقسیم : / ، باقیمانده : %

عملگر منفی یک عملوند میگیرد و منفی آنرا برمیگرداند، مثلاً 2- عدد 2 را منفی میکند.

عملگر / خارج قسمت تقسیم عملوند چپ به راستش را میدهد. اما میگوییم 'تقسیم صحیح' چراکه بعد از تقسیم دو عدد ممکن است باقیمانده ای ایجاد شود، میدانید که اگر تقسیم را ادامه دهیم باید در خارج قسمت ممیز قرار دهیم و جلو رویم، در آخر دیگر خارج قسمت یک عدد 'صحیح' نخواهد بود(اعشاری میشود). مثلاً خارج قسمت تقسیم 7 بر 2 ، 3.5 میشود، اما اگر خارج قسمت را صحیح در نظر بگیریم(یعنی قسمت اعشاری را در نظر نگیریم) میشود 3. در ++C هم عملگر تقسیم خارج قسمت را بصورت یک عدد صحیح میدهد، در نتیجه حاصل 7/2 میشود 3.

عملگر % باقیمانده تقسیم عملوند سمت چپ بر راستش را میدهد، مثلاً حاصل 2%7 میشود 1 چون باقیمانده تقسیم 7 بر 2 یک میشود.

اولویت عملگرها (Operator Precedence)
وقتی عبارتی شامل چندین عملگر را مینویسید، هر عملگر کی محاسبه میشود؟ مثال مشهور ریاضی آن 4*3+2 است، که اگر اول 2 با 3 جمع شود(5) و بعد در 4 ضرب(*) شود، حاصل 20 میشود، اما اگر اول 3 در 4 ضرب(12) و بعد با 2 جمع شود، حاصل 14 میشود، و 20 با 14 مساوی نیست! بنابراین اینکه حاصل کدام عملگر ابتدا محاسبه شود شاید در نتیجه عبارت تأثیرگذار باشد. پس در برنامه نویسی(مثل ریاضی) عملگرها اولویت گذاری شده اند. بنابراین مثلاً عملگر ضرب زودتر از جمع محاسبه میشود.

اولویت عملگرهای حسابی
هر دسته که در یک آکولاد قرار دارند اولویت یکسان دارند و از راست به چپ اولویت کم میشود:
{منفی و مثبت یگانی} {ضرب و تقسیم و باقیمانده} {جمع و تفریق}

شرکت پذیری عملگرها (Operator Associativity)
اگر در یک عبارت چندین عملگر که اولویت یکسان دارند داشته باشیم(مثلاً چندین جمع و تفریق)، حالا هرکدام کی محاسبه میشوند؟ اینجا شرکت پذیری مهم میشود. شرکت پذیری دو حالت دارد : راست به چپ و چپ به راست. مثلاً + چپ به راست شرکت پذیر است. یعنی اینکه ابتدا چپ ترین جمع حساب میشود، سپس سمت راست آن و بترتیب تا راست ترین جمع. مثلاً در 4+3+2 ابتدا 2 با 3 جمع میشود و حاصل با 4 جمع میشود. البته دراینجا شرکت پذیری در نتیجه تأثیری نمیگذارد، اما در برخی عبارات حاصل را تغییر میدهد.

شرکت پذیری عملگرهای حسابی
چپ به راست: ضرب ، تقسیم ، باقیمانده ، جمع ، تفریق
راست به چپ: منفی و مثبت یگانی

در ++C اولویت و شرکت پذیری عملگرها مشخص شده است. میتوانید آنها را در قسمت Operator Precedence and Associativity از MSDN مشاهده کنید.

عملگر پرانتز که همیشه شامل یک پرانتز باز یا ) و یک بسته یا ( میشود، میتواند ابهام و دردسرهای محاسبه حاصل یک عبارت را برطرف کند. چراکه همیشه محاسبات از درونی ترین پرانتز شروع و به بیرونی ترین ختم میشود. مثلاً با داشتن (4*3)+2 دقیقاً میدانیم که ابتدا باید ضرب و بعد از آن جمع انجام شود. اما 4*(3+2) نشان میدهد که ابتدا جمع و سپس ضرب انجام میشود.

بنابراین برای آسان و سریع تر خواندن کدی که مینویسید و همچنین کاهش خطا در آن و تغییر آسانتر آن، از پرانتزها استفاده کنید. با استفاده از پرانتزها دیگر نیازی به دانستن اولویت و شرکت پذیری عملگرها برای نوشتن کد ندارید.

البته اولویت ها طوری هستند که در عبارات معمول و ساده، وقتی از پرانتز استفاده نمیکنید هم به همان نتیجه ای دست خواهید یافت که پرانتزها را میگذاشتید. اما پرانتزها شما را از صحت عبارات مطمئن میسازند و در معمولاً در عبارات پیچیده لازم میشوند.

alireza.zahani
شنبه 24 خرداد 1393, 07:52 صبح
چند عملگر برای خلاصه کردن اعمال حسابی (http://narming.persianblog.ir/post/29/)(آموزش ++C , C - قسمت ششم -مقدماتی تا پیشرفته)


چند عملگر برای خلاصه کردن اعمال حسابی (http://narming.persianblog.ir/post/29/)

عملگرهای ++ و -- برای افزایش و کاهش یک متغیر به اندازه یکی استفاده میشوند. مثلاً اگر int num = 23 را داشته باشیم، ++num به num یکی اضافه میکند و 24 میشود، اما --num از آن یکی کم میکند. این دستورات را میتوان بطور مستقل در یک دستور جدا بصورت ;--num یا در یک دستور دیگر مانند ;--cout << num استفاده کرد. بهرحال از num یکی کم خواهد شد، اما استفاده همزمان از آن در یک دستور دیگر، به کاهش تعداد خطوط برنامه کمک میکند.

وقتی دستور cout قبل را اجرا کنید خواهید دید که بازهم مقدار 23 چاپ میشود! در اینجا یکی از num کم میشود اما نکته ای وجود دارد. ما دو نوع از عملگر ++ داریم : پیش افزایشی(preincrement) و پس افزایشی(postincrement)، پس افزایشی همانی است که دیدید و بعد از نام متغیر قرارمیگیرد اما پیش افزایشی قبل از نام متغیر می آید مانند num++ (و همین دو نوع برای -- هم وجود دارد: پیش کاهشی و پس کاهشی). هر دونوع این عملگرها از این نظر که یکی به متغیری اضافه یا از آن کم میکنند فرقی ندارند، اما عملگرها پیش کاهشی و افزایشی وقتی یک متغیر را تغییر میدهند، مقدار تغییر یافته آنرا برمیگردانند، بنابراین همین مقدار تغییر یافته در عباراتی که عملگرها در آن قرار دارند استفاده میشود. مثلاً cout << --num اگر num مقدار 23 داشته باشد، عدد 22 را چاپ میکند، در صورتی که همین دستور با --num مقدار 23 را چاپ میکرد، چرا که پس کاهشی مقدار تغییر یافته را در دستوری که در آن قرار دارد استفاده نمیکند. البته فقط در دستوری که عملگر پس کاهشی در آن قرار دارد مقدار قبلی متغیر استفاده میشود، وگرنه متغیر تغییر یافته است و بعداً هرجا استفاده شود همان مقدارش که یکی کم شده است استفاده خواهد شد. پس این عملگرها معمولاً وقتی درون دستورات دیگر استفاده میشوند، تفاوتشان اهمیت پیدا میکند.

گفته میشود که چون مثلاً پس افزایشی باید عمل اضافی نگهداری مقدار موقت قبلی متغیر را انجام دهد، از نظر سرعت برنامه بهتر است هرجا که بشود از پیش افزایشی استفاده شود، اما این تفاوت فقط ممکن است در یک جای خاص خود را نشان دهد(مثلاً جایی که استفاده زیاد و پشت سرهم از این عملگر بشود).

هرجا که نکاتی در مورد پیش افزایشی مطرح شد در مورد پیش کاهشی هم صدق میکند و همینطور در مورد پس افزایشی و کاهشی.

شما برای اضافه کردن یک مقدار به یک متغیر، مثلاً برای اضافه کردن 2 به num باید از دستور num = num + 2 استفاده کنید، اما راه بهتر و خلاصه تر استفاده از عملگر =+ هست: num += 2 که دوتا به num اضافه میکند. برای عملگرهای - و / و * و % هم اینچنین عملگر معادلی وجود دارد.
مثلاً num /= 3 متغیر num را بر 3 تقسیم کرده و خارج قسمت آنرا در num قرار میدهد.


متغیرهای const
کلمه کلیدی const از constant به معنی ثابت می آید و میتوان برای مشخص کردن عدم تغییر یک متغیر از آن استفاده کرد. یعنی بعد از آنکه متغیر تعریف و مقداردهی اولیه شد دیگر نمیتوان مقدار آنرا تغییر داد. برای تعریف یک متغیر از نوع const کلمه کلیدی const را در ابتدای تعریف متغیر قبل از نوع داده آن بیاورید. مثلاً const int c_num = 23 متغیر c_num را با خاصیت const تعریف میکند.

اگر بعد از تعریف c_num داشته باشید c_num = 24 یک خطای زمان کامپایل تولید میکند. چرا که مقدار c_num نمیتواند تغییر کند. هر دستور دیگری هم که c_num را تغییر بدهد، خطا تولید میکند.

متغیر const باید در هنگام تعریف، مقدار اولیه هم بگیرد(چراکه بعداً نمیتوان مقدار آنرا تغییر داد) وگرنه یک خطای زمان کامپایل تولید میشود.

وقتی که میدانیم یک متغیر نباید تغییر کند، const از این تغییر احتمالی جلوگیری میکند(مثلاً وقتی سرعت نور(یا هرچیز ثابت دیگری) را در یک متغیر ذخیره کنیم).

استفاده از define# برای تعریف ثوابت
define# مانند include# یک دستور پیش پردازنده است. از این دستور میتوان برای تعریف ثوابت درون برنامه استفاده کرد. در حقیقت این دستور ثابت مورد نظر را تعریف نمیکند، اما نامی برای آن مشخص میکند، آنگاه در مرحله پیش پردازش هرجا که نام ثابت بکار رفته باشد با مقدار آن جایگزین میکند. بنابراین متغیری تعریف نمیشود و مانند آن است که خود ما مقدار آن ثابت را در برنامه نوشته باشیم. البته define# استفاده های دیگری نیز دارد.

این دستور را هر کجای برنامه در یک سطر منفرد میتوانید قرار دهید(و چون یک دستور پیش پردازنده است نباید ; در آخر آن بگذارید)، البته معمولاً آنرا قبل از تابع main و بعد از دستورات include# قرار میدهند.

چون استفاده از متغیرهای const فضایی از حافظه اصلی را برای متغیر میگیرد، اما استفاده از define# فضایی اشغال نمیکند، هرجا که فضای اشغال شده از حافظه اصلی توسط برنامه برای شما مهم است، از define# استفاده کنید. اما در کل استفاده از متغیرهای const بهتر است.

مثالی از شکل این دستور: 23 define NUM# که ثابت NUM را با مقدار 23 تعریف میکند.

مثالی از کاربرد این دستور:
کد قالب بندی شده:
#include
using namespace std;

#define NUM 23

int main()
{

cout << "NUM is a constant: " << NUM << endl;

return 0;
}

توجه: معمولاً نام ثابت ها را با حروف بزرگ مشخص میکنند.

دستور undef#
این دستور یک ثابت تعریف شده با define# را به حالت تعریف نشده درمی آورد. مثلاً پس از دستور undef NUM# ثابت NUM تعریف نشده خواهد بود، یعنی اگر از این نام بدون تعریف مجدد آن در برنامه استفاده کنید، خطایی دریافت میکنید.

برای مقدار دهی مجدد یک ثابت تعریف شده با define# میتوانید آنرا تعریف نشده کنید و دوباره با مقدار مورد نظر تعریف کنید، البته تبدیل به تعریف نشده اجباری نیست و فقط میتوانید دوباره تعریف کنید، اما این کار بهتر است چون ممکن است بعضی کامپایلرها خطایی مبنی بر تعریف مجدد تولید کنند(در VS فقط یک اخطار(warning) تولید خواهد شد که جنبه آگاهی دارد و شما میتوانید برنامه را بسازید، اما خطاها(errors) اجازه ساخت دوباره برنامه را نمیدهند).

هرجا بخواهید از تعریف نشده بودن یک ثابت اطمینان حاصل کنید میتوانید از undef# استفاده کنید، بنابراین برای استفاده از undef# لازم نیست حتماً ثابت را قبلاً با define# تعریف کرده باشید.

alireza.zahani
شنبه 24 خرداد 1393, 07:53 صبح
دستورات کنترل برنامه (http://narming.persianblog.ir/post/28/)(آموزش ++C , C - قسمت هفتم -مقدماتی تا پیشرفته)


دستورات کنترل برنامه (http://narming.persianblog.ir/post/28/)

وقتی دستورات برنامه را به همان ترتیبی که زیر هم مینویسیم اجرا میشوند، این ساختار ترتیبی برنامه است، یعنی هر دستور به ترتیبی که ظاهر میشود اجرا میشود. اما دو ساختار دیگر نیز کمک کننده هستند: ساختار انتخاب و تکرار.

دستور انتخاب if
با دستور if میتوان درستی یک عبارت را بررسی کرد و براساس آن عملی را انجام داد. مثلاً ممکن است در برنامه بخواهیم یک عدد را بعنوان ID(شناسه) شخصی بگیریم و بعد اگر مقدار خاصی بود عملی را انجام دهیم. در اینجا از دستور if میتوان استفاده کرد. ابتدا بهتر است یک برنامه نمونه که از دستور if استفاده میکند را ببینید. این برنامه عددی را بعنوان ID شخص میگیرد و اگر مقدار آن 1 بود به کاربر بعنوان Admin خوش آمد میگوید.
کد قالب بندی شده:
#include
using namespace std;

int main()
{
int ID = 0;

cout << "Hello, please enter your ID : ";
cin >> ID;

if (ID == 1)
cout << "Welcome Admin" << endl;

return 0;
}
پس از اجرای این برنامه باید عددی را بعنوان ID وارد کنید، اگر ID وارد شده 1 باشد، برنامه پیغام خوش آمد گویی را میدهد. دستور if در این برنامه برای انتخاب این است که آیا پیغام خوش آمد گویی چاپ شود یا نه و این را براساس اینکه ID یک هست یا نه انتخاب میکند(یعنی 'مساوی بودن ID با 1' شرط انتخاب است). شکل دستور if اینگونه است:
کد قالب بندی شده:
if ( condition )
statement;
condition شرط انتخاب است و دستور هم فقط یک دستور تنهاست.

یک نکته را اینجا بگویم: استفاده از معادل های فارسی ممکن است خوب باشد، اما اگر شما با زبان انگلیسی آشنایی لازم را پیدا نکنید، نمیتوانید براحتی از منابع مرتبط با ++C موجود در اینترنت یا هرجای دیگر که به زبان انگلیسی هستند استفاده کنید(مثلاً از MSDN). حتی خود برنامه نویسی هم با دانستن بهتر انگلیسی راحت تر میشود. یعنی میتوان گفت اگر واقعاً قصد کار در زمینه برنامه نویسی یا هرچیز دیگری مرتبط با کامپیوتر را دارید، باید انگلیسی تان را قوی کنید، چرا که بیشتر منابع بروز انگلیسی هستند. در عین حال دیگر نیازی به گرفتن کتاب هم نخواهید داشت و از هزاران کتاب در زمینه های مختلف کامپیوتری که بصورت ebook در اینترنت موجودند میتوانید استفاده کنید یا از آموزشهایی که در سایتها موجودند و... بهره برید . یک نکته دیگر هم تعامل با کاربران موجود در اینترنت است که واقعاً کمک کننده است. مثلاً خیلی از سایت ها مثل همین جا یک انجمن(forum) برای برنامه نویسی دارند و کاربران در آنها با انگلیسی به بحث در مورد مباحث مختلف مشغولند. شما هم با کمی انگلیسی میتوانید به این جمع ها وارد شوید و مثلاً سؤالاتی بپرسید ، از اطلاعات دیگران استفاده کنید و پاسخ آنها را بدهید.
اما یادگیری انگلیسی برای کامپیوتر آسان و مفرح است! البته با این روش: ابتدا مقدمات قواعد دستور زبان انگلیسی را بلد باشید(مثل ساختار جملات، افعال و...) یعنی در همان حدی که در دبیرستان یاد میگیرید. حالا براحتی میتوانید متون را درک کنید. فقط میماند 'کلمات جدید'، از این به بعد هرجا کلمه جدیدی را در کامپیوتر مشاهده کردید فوراً معنی آنرا یافته و بخاطر بسپارید. استفاده از برنامه Babylon را توصیه میکنم که در اصل مجموعه ای از دیکشنری هاست و براحتی معانی و مترادف ها را در اختیارتان میگذارد و با یک کلیک روی کلمه ای که نمیدانید معنی را برای شما نمایش میدهد. البته ممکن است برخی از دیکشنری ها را نداشته باشید که باید از اینترنت یا جای دیگر بگیرید و به Babylon اضافه کنید. دیکشنری های Oxford هم برای Babylon وجود دارند که توصیه میشود به آن اضافه کنید.

خوب دوباره برگردیم به برنامه نویسی خودمان!

با ساختار دستور if آشنا شدید، در برنامه نمونه ای که مشاهده کردید، شرط ما ID == 1 بود. عملگر == با = ارتباطی ندارد. عملگر = برای انتساب است، اما == برای تست برابر بودن است. این گونه عملگرها مقدار منطقی true یا false برمیگردانند. متغیرهای bool هم که قبلاً معرفی شدند برای نگهداری مقادیر منطقی(true یا false) هستند. بنابراین از متغیرهای bool هم میتوان در شرط ها استفاده کرد.

در دستور if ما فقط یک دستور را مشخص کردیم تا در صورت درستی شرط اجرا شود اما برای داشتن چندین دستور باید با آکولاد باز و بسته دستورات را محصور کنیم. مثلاً دستور if زیر در صورت برقراری شرط، دو دستور cout را اجرا میکند:
کد قالب بندی شده:
if (ID == 1)
{
cout << "Welcome Admin" << endl;
cout << "Learn C++ as soon as possible!" << endl;
}
حتی اگر فقط یک دستور هم داشته باشید میتوانید از آکولادها استفاده کنید.

عملگرهای رابطه ای(Relational Operators)
این عملگرها چون true یا false را برمیگردانند، نتیجه شان میتواند بعنوان عاملی در عبارات منطقی استفاده شود.

== : برابری ، =! : نابرابری ، > : کوچکتر ، < : بزرگتر
=> : کوچکتر یا مساوی ، =< : بزرگتر یا مساوی

برای عملگر نابرابری، مثلاً (x != 1) یعنی x برابر نباشد با یک.

مراقب باشید بین اجزای عملگرهای چند قسمتی فاصله نیندازید، مثلاً در =< بین = و < اگر فاصله بیفتد دیگر یک عملگر بعنوان بزرگتر مساوی نخواهید داشت بلکه دو عملگر انتساب و بزرگتر نوشته اید و چون به شکل مناسبی استفاده نشده اند خطای زمان کامپایل تولید میکنند.

توجه: وقتی دارید یک شرط برابری مینویسید ممکن است اشتباهاً = را بجای == بکار برید. این اشتباه ممکن است تولید خطا نکند، چراکه عملگر = مقداری را که به متغیر سمت چپ آن نسبت میدهد، بعنوان نتیجه برمیگرداند و کامپایلر از این مقدار با یک تبدیل بجای یک مقدار منطقی استفاده میکند. بنابراین شرطی مانند ID == 1 اگر ID = 1 نوشته شود، همیشه درست خواهد بود! چراکه ابتدا مقدار 1 به ID نسبت داده میشود و سپس عملگر = همان مقدار 1 را برمیگرداند و چون کامپایلر یک مقدار bool میخواهد، مقدار int برگشتی را به bool تبدیل میکند(چون غیر صفر است true در نظرگرفته میشود) و چون همیشه 1 هست، همیشه true خواهد بود و مثلاً ID = 0 همیشه false خواهد بود.
پس ما در اینجا دو ضرر کردیم! یکی اشتباه شدن شرط و دیگری تغییر ناخواسته مقدار متغیر. خطایی هم که رخ نداده، پس برنامه اجرا میشود اما با نتایج نادرست. بنابراین در اشکال زدایی برنامه هایتان به این مورد توجه داشته باشید.

عملگرهای منطقی(Logical Operators)
مثلاً اگر در یک شرط بخواهید بدانید آیا x>1 و y<2 هست (یعنی دو شرط را با هم and کنید) از عملگر && استفاده کنید: (x>1 && y<2)، این عملگر روی دومقدار منطقی(> و < مقادیر منطقی برمیگردانند) عمل and را انجام داده و حاصل که یک مقدار منطقی است را برمیگرداند.

&& : AND (اگر هردو عملوند true باشند true وگرنه false برمیگرداند)
|| : OR (اگر هر دو عملوند false باشد false وگرنه true برمیگرداند)
! : NOT (نقیض عملگر خود را برمیگرداند)

برای OR، دوخط عمودی را با دوبار زدن کلیدهای Shift و \ تایپ کنید.

برای NOT، مثلاً در (x!) عملگر ! نقیض x را برمیگرداند(x یک متغیر bool است)، پس اگر true باشد false برمیگرداند، یا مثلاً در ((x == 6)!) نقیض برابری x با 6 را برمیگرداند، پس مانند شرط x مساوی با 6 نباشد هست (x != 6).

مثال: شرط ( (y != x) || (x <= 3) ) میگوید که y با x برابر نباشد یا x کوچکتر مساوی 3 باشد.

میبینید که پرانتزها چقدر به رفع ابهام و درک سریع شرط ها کمک میکنند و اینکه خود پرانتز هم بعنوان یک عملگر مقداری را بر میگرداند.