تبليغاتX
C++ آموزش

اوایلی که برنامه نویسی به وجود آمد باید برنامه به صورت یک قطعه بزرگ

نوشته میشد که باعث میشد بعضی مجموع دستورات چندین بار تکرار بشوند

بعلاوه خطا یابی وتغییر وفهم برنامه خیلی مشکل بود.

بنابراین قرار بر این شد که بجای تعداد زیادی(چند ده هزار)خط دستور پشت

سرهم برنامه را به تعدادی برنامه های کوچک مجزا با ورودی خروجی های

مشخص ایجاد نمایند تا برنامه اصلی با توجه به نیازها با دادن ورودی مناسب

و اجرا دیگر برنامه ها اهداف برنامه را تامین کند نتیجه این که تعدادی برنامه

کوچک داریم که خطا یابی و فهمشان بدلیل کوچک بودنشان آسان است.

}(لیست پارامترها)نام تابع    نوع مقدار بازگشتی تابع

مجموعا دستورات

{

شکل کلی توابع بصورت بالا می باشد حالا یه مثال می زنم که هیچی مثل

مثال شفاف کننده نیست

#include

#include

void star(){

cout<<"*******";

}

int main(){

cout<<"this is main"<

star();

getch();

return 0;

}

در این مثال نوع باز گشتی تابع star  بدون نوع یعنی void  تعریف شده  چرا که

این تابع قرار نیست چیزی بعنوان خروجی به برنامه بر گرداند لیست پارامتر ها

هم خالیست چرا که این تابع نیازی به ورودی هم ندارد.

خب حالا می خوایم برنامه رو کامپایل کنیم

اول تابع main رو پیدا میکنبم بعد اجراش می کنیم خط اول روی مانیتور عبارت

This is main را چاپ می کنیم و نشانه گر مانیتور رو به خط بعد می بریم

بعد خط بعد رو اجرا می کنیم که برای این کارمجبوریم تابع star را پیدا کنیم

و اجرا کنیم بعد از اجرا آن به خط بعدی تابع main برمیگردیم یعنی خط

سوم بقیش را هم خودتان میدانید

خب حالا فرض کنید می خواهیم تابع star تعداد مشخصی ستاره چاپ کند

پس تابع ما ورودی می خواهد. یعنی پارامتر می خواهد حالا مثال را با دقت

بخوانید.

#include

#include

void star(int n){

int i;

for(i=0;i

cout<<"*";

}

int main(){

int a;

star(3);

cin>>a;

star(a);

getch();

return 0;

}

یک تابع می تواند چند پارامتر داشته باشد

void star(int a,int b,float a)

تابع در صورتی که نوع بازگشتی داشته باشد به صورت زیر استفاده می شود

#include

#include

int fabs(int a){

if(a<0)a=-a;

return a;

}

int main(){

int n;

cin>>n;

n=fabs(n);

cout<

getch();

return 0;

}

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

returnبه برنامه بر گردانده شده برای گرفتن این مقدار باز گشتی باید عبارت

فراخوانی کننده تابع را برابر یک متغیر مناسب قرارداد در واقع نام تابع حاوی

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

مقدار را بعنوان نتیجه از تابع گرفت اما روش هایی برای بازگشت چند مقدار از

تابع وجود دارد که بعدا ذکر خواهد شد.

اما در مورد متغیرهای عمومی و محلی. به متغیر هایی که درون لیست پارامترها

یا درون توابع تعریف می شوند متغیر های محلی گویند این متغیر ها فقط از

درون توابع خودشان قابل دسترسی هستند و توابع دیگر نمی توانند مقادیر متغیر

های محلی تابع دیگری را تغییر دهند.البته میشود موقع فراخوانی تابع به متغییرهایی

که در لیست پارامترها تعریف شده اند مقدار اولیه داد. با توجه به مفاهیم ذکر شده

توابع مختلف می توانند متغییر های محلی هم نام داشته باشند که هیچ دخلی هم با

هم ندارند و هر کدام کار خود را می کنند. متغییر های محلی بعد از پایان اجرای

تابع از حافظه حذف می شوند.

اما متغییر های عمومی متغیر هایی هستند که خارج از توابع ومعموما قبل از تعریف

تابع mainتعریف می شوند این متغیر ها در سراسر برنامه قابل دسترسی اند

اگردریک تابع یک متغیر محلی هم نام با متغییر عمومی تعریف شود متغییر عمومی

باروش های معمولی قابل دسترس نخواهد بود و از آن به بعد متغییر محلی بدون

هیچ گونه دخالتی از جانب متغییر عمومی کار خود را می کند برای دست یابی به

متغییر عمومی در تابع مذکور در چنین وضعی اگر فرض کنیم نام متغییر aباشد

باید بجای aبنویسیم ::aدر واقع a به تنهایی یعنی متغییر محلی و::aیعنی متغییر

عمومی

کلاسهای حافظه

تمام متغیر ها دارای دو ویژگی هستند

1.حوزه ی متغیر

2.طول عمر متغیر

 

حوزه ی متغییر می گوید که متغییر در چه جاهایی از برنامه قابل دسترسی است

مثلا متغیر های محلی فقط درون تابعی که درآن تعریف شده اند قابل دست یابی اند

همچنین طول عمر یک متغیر محلی از زمان اجرا تابع شروع می شود و با خاتمه

اجرا تابع تمام میشود

 

انواع کلاسهای حافظه

 

کلاس حافظهautomatic

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

کلاس حافظهstatic

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

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

پایان اجرا تابع از بین نمیروند و مقدار خود را برای اجرا بعدی تابع حفظ میکنند

تفاوت متغیر استاتیک عمومی با متغیر عمومی در حوزه ی متغییر است

متغییر عمومی در تمام برنامه قابل دستیابی است اما متغیر استاتیک عمومی

فقط در توابعی که بعد از تعریف متغیر مذکور تعریف شده اند قابل دستیابی اند

نکته مهم دیگر این که متغیر های استاتیک چه عمومی وچه محلی مقدار اولیه ی

صفر دارند بر خلاف دیگر متغیر ها.

کلاس حافظه یextern

تمام متغیر های عمومی(متغیر هایی که خارج از توابع تعریف می شوند) عضو

این کلاس اند

این متغیر ها در تمام زمان اجرا برنامه وجود دارند و در تمام برنامه قابل

دستیابی اند

 

کلاس حافظه register

این کلاس حافظه به کامپایلر پیشنهاد می کند متغیر در ثبات های CPUایجاد

شوند این کار باعث افزایش سرعت کار بامتغیر مذکور میشود چرا که سیستم

عامل مجبور نیست برای کار با آن به ثبات ها منتقلش کند ودوباره نتایج

را به RAMبرگرداند.

از آنجا که CPUثبات های کوچک ومحدودی دارد این کلاس حافظه محدودیت

هایی دارد

1.فقط برای متغیر های محلی قابل استفاده است

2.فقط برای انوع صحیح و کاراکتری واشاره گرها قابل تعریف است

3.نمی توان اشاره گری به متغیری با این کلاس تعریف کرد

4.دستور استفاده از این کلاس حالت پیشنهاد داردو اگر CPUنتواند ثباتی

در اختیار برنامه قرار دهد متغیر در RAMایجاد می شود.

 

register int a;

static char c;

معمولا کلاس هایautomatic وextern را برای تعریف متغیر نمی نویسند

البته نوشتنشان خوانایی برنامه را افزایش میدهد

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

هست بی خیال میشم

 

تا به حال توبع را قبل از تابع mainتعریف می کردیم اما می توانیم الگوی

توابع را قبل از تابع mainتعریف کنیم وبعد از تابع mainخود توابع را تعریف

کنیم به مثال دقت کنید

#include

#include

الگوی تابع     int fabs(int a);

int main(){

int n;

cin>>n;

n=fabs(n);

cout<

getch();

return 0;

}

 خود تابع    int fabs(int a){

if(a<0)a=-a;

return a;

}

همچنین در الگوی توابع برای پارامترها می توانید نام پارامتر را ننویسید و فقط

نوع آن را ذکر کنید چرا که در الگوی تابع کامپایلر فقط می خواهد بداند تابع

چند پارامتر واز چه نوعی دارد.

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

 تابعی میتواند از طریق پارامتر ها مقادیری به برنامه بر گرداند.

 

در یافت این پست به صورت پی.دی.اف

+ نوشته شده توسط سجاد مهدی بیرقدار در پنجشنبه ششم اردیبهشت 1386 و ساعت 1:42 |