سرفصل:برنامه‌نویسی مقدماتی سی‌پلاس‌پلاس

From Wikiversity

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

فصل اول[edit]

همه نوع های داده از عدد مشتق می شوند، حتی کاراکتر ها که ۸ بیت هستند توسط جدول اسکی ، از عدد به کاراکتر تبدیل می شوند.

داده ها
حجم نوع
۲ بایت short int( عدد صحیح کوتاه)
۲ بایت unsigned short int(عدد صحیح کوتاه غیر منفی)
۴ بایت int(عدد صحیح)
۴ بایت unsigned int(عدد صحیح غیر منفی)
۴ بایت long int(عدد صحیح طولانی)
۴ بایت unsigned long int(عدد صحیح طولانی غیر منفی)
۸ بایت long long int(عدد صحیح بسیار طولانی)
۸ بایت unsigned long long int
۱ بایت char(حرف)
۱ بایت unsigned char(حرف غیر منفی)
۴ بایت float(اعداد ممیز دار)
۸ بایت double(اعداد ممیز دار دوگانه)
۱۲ بایت long double(اعداد ممیز دار دوگانه طولانی)
۲-۴ بایت wchar_t(حرف گسترده)

وقتی نوع داده ی عددی ای با unsigned نوشته شده باشد، یعنی دیگر شامل اعداد منفی نمیشود. یا وقتی میگوییم که نوع داده ای ۴ بایت است یعنی به محدوده عددی ۴ بایت یا ۳۲ بیت می تواند اعداد را بخواند. درواقع int:

11111111 11111111 11111111 11111111

۳۲ بیت است . برای بدست آوردن محدودیت کافیست عدد ۲ را به توان بیت کنید  :

2^32

و برای اعداد امضا شده در سی ++ کافیست که تقسیم بر ۲ کنید، نصفش را منفی و نصفش را مثبت اما آن نصف مثبت منهای ۱ کنید. نوع داده ی double که ازش به عنوان long float یا اعداد ممیز داره طولانی نیز یاد میشود ، ۸ بایت و پر استفاده در دقت می باشند.

فصل دوم[edit]

توابع[edit]

یک تابع یک بلاک یا قسمت کد است که هنگامی که خوانده شود اجرا می شود. کدی که در یک تابع نوشته شود، هر کجا خوانده شود همان کدی که داخل بر‌یس ({}) های تابع نوشته شده اجرا می شود. تابع ها می توانند حاوی آرگومان ها باشند. یعنی هر کجا که آن تابع فراخوانی می شود، یک داده نیز برای آن تابع تأیین شود. توابع باید با یک نوع داده تعریف شوند که با یک بازگشت با همان نوع داده تمام می شود. برای مثال یک تابع عدد صحیح یک مقدار عدد صحیح را باز میگرداند که اگر این بازگردانی نوشته نشود، هیچی بازنمیگردد.

تابع اصلی[edit]

هر برنامه سی یا سی پلاس پلاس باید یک تابع اصلی که کد های اجرایی برنامه درون آن نوشته می شود داشته باشد. اگر یک برنامه تابع اصلی نداشته باشد ، خطا گرفته می شود. اگر تابع اصلی را داشته باشیم اما کدی در آن ننوشته باشیم برنامه هیج خروجی ای ندارد.

فضای نام[edit]

فضای نام بخشی کد است که متغیر ها،کلاس ها، توابع و ... را از کل برنامه متمایز می کند. یعنی برای گرفتن یک مقدار داخل یک فضای نام یا باید از آن فضای نام در کل برنامه استفاده کرد یا با یک نشان (::) مقدار را از آن فضای نام گرفت. می توان گفت فضای نام برای ترتیب توابع و کلاس ها و متغیر ها در یک فضای جداگانه از فضای کل برنامه می باشد. اکثرا فضای نام استاندارد که تمامی توابع و کلاس های کتابخانه استاندارد سی پلاس پلاس را به عنوان فضای نام کل استفاده می کنند تا دیگر از نشان وضوح محدوده(::) استفاده نکنند.

شمول[edit]

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

اولین برنامه[edit]

#include <iostream>

using namespace std;

int main(){}

در خط اول کتاب خانه ورودی و خروجی سی پلاس پلاس را شامل کردیم، خط دوم همانطور که گفته شد از فضای نام استاندارد در کل برنامه استفاده می کنیم. خط آخر تابع اصلی برنامه است که کد باید بین {} ها قرار گیرد. این برنامه هیچ خروجی ای ندارد.

خطا ها[edit]

ارور ها در سی پلاس پلاس به چند دسته تقسیم می شوند:

خطای نحو:

وقتی شما نحو نوشتن در سی پلاس پلاس را رعایت نکردید.Syntax Error

خطای اجرا-هنگام:

وقتی از همگردانی برنامه با موفقیت بیرون آمد شد، ولی موقع اجرا برنامه متوقف یا دچار خطا شد میگوییم یک خطای اجرا-هنگام یا موقع اجرا بوجود آمده.Runtime Error

خطای معنای:

وقتی همگردان متوجه نشود شما چه نوشته اید این خطا رخ می دهد.Semantic Error

خطای پیوند دهنده:

وقتی تابع اصلی را اشتباه بنویسید رخ می دهد.Linker Error

خطای منطقی:

هنگامی که خروجی اشتباه است ولی درست به نظر می آید خطای منطقی رخ می دهد.Logical Error

کلاس ها[edit]

کلاس ها از برنامه نویسی شئ گرا استفاده می کنند. یعنی هر چیزی که داخل یک کلاس باشد بهش شئ میگوییم. کلاس ها برای ترتیب دهی توابع و متغیر ها بسیار مفید هستند. اکثر دستور های سی پلاس پلاس مانند:

std::string

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

std::string re="SALAM";

system(re.c_str());

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

std::string

یک تابعی به نام :

c_str()

وجود دارد که کلاس رشته ها را تبدیل به رشته های زبان برنامه نویسی سی یا شبیه این می کند:

std::string s="SALAM";

char ss[4];

ss[0]='S';ss[1]='A';ss[2]='L';ss[3]='A';ss[4]='M';

اعداد در سی پلاس پلاس از صفر شروع می شوند. خط اول کلاس رشته سی پلاس پلاس بود. خط دوم یک رشته-مانند زبان سی. خط سوم هم تعریف حرف به حرف یک کلمه.

و حالا بدون تبدیل می توان از رشته حرف های سی استفاده کرد:

system(ss);

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

کتابخانه استاندارد[edit]

کتابخانه استاندارد سی پلاس پلاس، که حاوی بیش از ده کتابخانه است، جزئیات اصلی این زبان برنامه نویسی می باشد. تمامی کلاس ها و اشیاء موجود در این کتابخانه در فضای نامی به اسم :

std

قرار دارند. برای همین است که برای برخی دستورات نیاز به گذاشتن :

std::

است که می توان با استفاده از فضای نام استاندارد در برنامه از این هم استفاده نکرد.

فصل سوم[edit]

خروجی[edit]

کتابخانه ورودی و خروجی سی پلاس پلاس، با نام :

<iostream>

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

ostream,istream

یعنی:

cout,cin

انجام می دهیم.

cout(see out) یعنی بیرون را ببین(نوشتن خروجی)

cin (see in) یعنی داخل را ببین(گرفتن ورودی)

این دو شئ جزء کتابخانه استاندارد سی پلاس پلاس هستند. پس یعنی راه دسترسی به این دو شئ استفاده از فضای نام استاندارد است.

درواقع:

#include <iostream>
using namespace std;
int main(){
   cout<<"سلام";
}

یا

#include <iostream>
int main(){
   std::cout<<"سلام";
}

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

#include <iostream>
int main(){
   std::cout<<"test "<<"the "<<"code "<<".";// test the code .
   std::cout<<"test the code .";// test the code .
}

همانطور که دیدید ۴ کلمه را جداگانه نوشتیم و در خط بعد سر هم نوشتیم. ولی خروجی هر دو خط یکسان است. ولی خروجی هایک مشکلی دارند است. آن هم این که در انتهای هر خروجی خط جدیدی به طور خودکار تولید نمی شود. شاید فکر کنیم خروجی به این صورت است:

test the code .

test the code .

اما در اصل این است:

test the code .test the code .

برای حل این مشکل دو راه حل هست:

#include <iostream>
int main(){
   std::cout<<"test "<<"the "<<"code "<<"."<<std::endl;// test the code . 1
   std::cout<<"test the code ."<<'\n';// test the code . 2
}

std::endl:

یک شئ از کتابخانه ورودی و خروجی سی پلاس پلاس که دستور تولید خط جدید را می دهد.

'\n':

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

'\r': بازگرداندن مکان نمای ترمینال یا جایی که کد اجرا می شود، به ابتدای خط

'\n': تولید خط جدید

'\b': پسبرد

'\a': صدای اخطار

'\f': خط جدید از جایی که مکان نما قرار دارد

'\t': یک تب یا یک فاصله بزرگ

'\v': یک تب یا فاصله ی بزرگ عمودی

'\\': برای نوشتن خود بک اسلش یا \

یک مثال کلی:

#include <iostream>
using namespace std;
int main(){
   cout<<"Salam \n"<<"Khoobid\f"<<"Shoma\t Doost\n Aziz\\?"<<endl;
}

خروجی:

Salam

Khoobid   

       Shoma    Doost

Aziz\?

ورودی[edit]

گرفتن ورودی در برخی موارد کاملا شبیه نوشتن خروجی می باشد. با این تفاوت که از کاربر نوشته را میگیرد و در یک متغیر با نوع داده مورد نظر می ریزد. این عملیات با شئ

std::cin

که یک شئ از کتابخانه

istream

که در کتابخانه ورودی و خروجی شامل شده است می باشد.

مانند:

#include <iostream>
int main(){
   std::string str;
   std::cout<<"Voroodi: ";
   std::cin>>str;
}

نوشتن خروجی در قبل از گرفتن ورودی به عنوان پیش ورودی به حساب می آید یعنی خروجی شبیه این می شود:

Voroodi:

برای مثال به عنوان ورودی می نویسیم سلام:

Voroodi: Salam

و دکمه اینتر را فشار می دهیم.سپس برنامه ورودی را میگیرد و به صورت نوع داده رشته(رشته به معنی رشته ای از حروف است) در متغیر

str

هر چه به عنوان ورودی نوشتیم را ذخیره می کند.

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

Voroodi: Salam khoobi?

ورودی تنها این را می خواند:

Salam

و همین را به متغیر ما می دهد. برای این مشکل هم راه حلی وجود دارد:

#include <iostream>
int main(){
   std::string str;
   std::cout<<"Voroodi: ";
   std::getline(cin,str);
}

با استفاده از این تابع:

std::getline()

که دو آرگومان عملیات ورودی و متغیر را حداقل نیازمند است، می توان کل یک خط را به عنوان ورودی گرفت. مثلا:

Voroodi: Salam khoobi?

اکنون خوانده می شود:

Salam khoobi?

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

#include <iostream>
int main(){
   std::string esm;
   int sen;
   std::string famili;
   std::string shoghl;
   char avalesm;
   std::cout<<"Voroodi: ";
   std::cin>>esm>>sen>>famili>>shoghl>>avalesm;
   std::cout<<esm<<' '<<sen<<' '<<famili<<' '<<shoghl<<' '<<avalesm<<' '<<std::endl;
}

در اینجا ما ۵ تا متغیر را وارد ورودی کردیم، متغیر ها با یک فاصله به جلو می روند یعنی اگر:

Voroodi: reza 33 ahmadi barname_nevis r

هر کدام به متغیر خودشان میروند:

esm= "reza"; sen= 33; famili= "ahmadi"; shoghl= "barname_nevis"; avalesm= 'r';

این قابلیت در

std::getline()

وجود ندارد و دچار خطا می شود.

و اگر نوع داده ای اشتباه وارد شود باعث خطا یا اشتباه شدن می شود مثلا:

Voroodi: 33 reza ahmadi r barname_nevis

می شود:

esm="33"; sen=0; famili="ahmadi"; shoghl="r"; avalesm='b';

داده های حرف و رشته، از آنجایی که خود رشته ها بر پایه حرف ها هستند، اگر یک رشته وارد یک حرف شود تنها حرف اول آن خوانده می شود. ولی اگر به صورت عادی یعنی:

char avalesm="reza";

نوشته شود دچار خطا می شود، زیرا حرف های ساده باید با اپراتور های ' ' یا کوت نوشته شوند.

std::flush[edit]

این شئ یکی از قابلیت های مهم ورودی و خروجی است. فلاش اگر به جای

std::endl

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

#include <iostream>
int main(){
   std::cout<<"Khobi?"<<std::flush;
   std::cout<<"\rKhobam"<<std::endl;
}

در این برنامه یک عملیات خروجی با متن

Khobi?

جریانش ادامه دارد تا عملیات بعدی که در ابتدا به یک حرف گریزان می رسیم که تمرکز یا مکان نمای خط را به اول خط می آورد یعنی اگر

Khobi?+

باشد و + مکان نمای ما، به :

+Khobi?

انتقال میابد یعنی اگر هر چه بنویسیم جای آن متن را میگیرد.

بعد تغییر مکان نما متن:

Khobam

می آید که خروجی را تبدیل به :

Khobam

می کند.

اما اگر حرف گریزان

\r

را نگذاریم به این شکل می شود:

Khobi?Khobam

زیرا مکان نما در پس از علامت سوال متن اول قرار دارد.