تبلیغات شما تبلیغات شما

آمار سایت

    آمار مطالب
    کل مطالب : 4042
    آمار کاربران
    افراد آنلاین : 9

    کاربران آنلاین

    آمار بازدید
    بازدید امروز : 938
    باردید دیروز : 3,060
    گوگل امروز : 0
    گوگل دیروز : 9
    بازدید هفته : 9,744
    بازدید ماه : 98,957
    بازدید سال : 98,957
    بازدید کلی : 6,545,985

آخرین فروش های موفق

سربارگذاری توابع

اکثر زبان های برنامه نويسی برنامه نويس را ملزم می کنند برای هر تابع نام منحصر بفردی را تعريف کنند. ويژگی چندريختی (polymorphism) در زبان ++C اين امکان را فراهم کرده که یک نام برای بیش از یک تابع به طور مشترک استفاده شود. اين عمل سربارگذاری توابع (function overloading) هم ناميده می شود. برای اينکه کامپايلر توابع هم نام را از هم تشخيص دهد نوع و تعداد پارامترهای توابع بايد با هم متقاوت باشد. کامپایلر از نوع آرگومان متوجه می شود کدام تابع فراخوانی شده است.


مثال.

#include <iostream.h>
float cube_number(float num);
int cube_number(int num);
int main() {
   float number;
   float number3;
   cout << "Please enter a number n";
   cin >> number;
   number3 = cube_number(number);
   cout << number << " cubed is " << number3;
   return 0;
}
int cube_number(int num) {
   return num * num * num;
}
float cube_number(float num) {
   return num * num * num;
}

متغيرهای محلی

متغيرهائی که درون تابع تعريف می شوند متغيرهای محلی (local variables) ناميده می شوند. محلی بر اين دلالت دارد که متغيرها تنها خاص تابع هستند و از متغيرهای هم نام در هر جای ديگر برنامه مجزا می باشند. تابع می تواند هر تغييری روی آنها بدهد بدون اينکه روی قسمت های ديگر برنامه اثر داشته باشد. متغيرهائی که خارج از هر بلاکی تعريف می شوند متغير های سراسری (global variables) ناميده می شوند و در کليه توابع قابل دسترسی هستند.


مثال. در برنامه زير متغير m سراسری است و توسط کليه توابع قابل دسترسی و تغيير است. درحاليکه دو متغير n از هم مستقل هستند و هرکدام تنها درون تابعی که اعلان شده اند تغيير می کنند.

#include <iostream.h>
int m;        // M is a global variable
int f(int n) {
   n++;
   return n;
}
int g() {
   m++;
   return m;
}
int main() {
   int n = 5;
   cout << "n = " << n << "n";
   cout << "f(n) = " << f(n) << "n";
   cout << "n = " << n << "n";
   m = 5;
   cout << "m = " << m << "n";
   cout << "g() = " << g() << "n";
   cout << "m = " << m << "n";
}

ارسال مقدار به تابع

وقتی مقداری به تابع ارسال می شود یک کپی از محتویات آرگومان به پارامتر نسبت داده می شود یعنی در اصل پارامتر یک کپی از متغیری است که به تابع ارسال می شود و مقدار آن خارج از تابع تغییر نمی کند. این روش ارسال یک متغیر با مقدار (passing variable by value) نامیده می شود. که روش معمول است. روش دیگر ارسال یک متغیر به تابع به صورت مرجع (called by reference) است. در این حالت به جای یک کپی از مقدار متغیر آدرس آن به تابع داده می شود بنابراين نام متغیر و نام پارامتربه یک مکان حافظه ارجاع می کنند. یعنی پارامتر متغیر جدیدی نیست بلکه همان متغیر قبلی با نام جدید است. در این حالت وقتی متغیر درون تابع تغییر می کند متغیر خارج از تابع هم تغییر می کند.

برای تعيين پارامتری به صورت مرجع کافی است علامت & (عملگر آدرس) قبل از پارامتر تابع در اعلان اضافه شود.


مثال. متغير m به صورت مقداری به تابع ارسال شده است. خروجی تابع عدد 1 است.

#include <iostream.h>
void f(int n) {
   n = 4;
}
int main() {
   int m = 1;
   cout << m << "n";
   f(m);
   cout << m << "n";
}

مثال. پارامتر number مرجع است.

#include <iostream.h>
void demo(float &number);
int main () {
   float num1;
   cout << "Please enter a number. n";
   cin >> num1;
   cout << "Before the demo function your number is " << num1 << "n";
   demo(num1);
   cout << "After the demo function your number is still " << num1 << "n";
   return 0;
}
void demo(float &number) {
   number = number * 3;
   cout << "Inside the demo function the number is now " << number << "n";
}

بهترين موتورهای جستجو

گوگل به عنوان موتور جستجوی پيشرو در بين ديگر موتورهای جستجو شناخته شده است. بيشتر از 72% جستجوها در گوگل صورت می گيرد و اين رقم همچنان رو به رشد است. علت اين امر تا حدودی به دليل سادگی آن است، خصوصا اگر Google Toolbar را در مرورگر خود نصب کرده باشيد يا از Google Chrome استفاده می کنيد.

موتورهای جستجوی بسياری غير از گوگل موجود هستند که امکانات متفاوتی را در اختيار می گذارند. لينک های تعدادی از محبوب ترين موتورهای جستجو در زير آمده است.

Alta Vista Google
Amazon Grokker
Answers Info
AOL Search Lycos
Ask Mamma
Bing MSN Search
Dogpile Snap
Ebay Soople
exalead Windows Live
Excite Yahoo

دستور return

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

وقتی اجرا به دستور return می رسد از تابع خارج شده مقدار برگشتی را به فراخواننده تابع برمی گرداند. اگر تابعی مقداری را بر نمی گرداند از کلمه void استفاده کنيد. در اين صورت تابع به دستور return نياز ندارد.

تابع ممکن است دارای چند دستور return باشد تا بتواند در شرايط متفاوت مقادير مختلف را برگرداند. در اين صورت اولين دستورreturn که اجرا می شود موثر است.


مثال. برنامه زير دو عدد را از ورودی گرفته عدد بزرگتر را نمايش می دهد.

#include <iostream.h>
int larger_of( int , int );
int main() {
   int x, y, z;
   cout <<"Enter two different integer values: ";
   cin >> x >> y;
   z = larger_of(x,y);
   cout << "nThe larger value is " << z;
   return 0;
}
int larger_of( int a, int b) {
   if (a > b) return a;
   else return b;
}


همان طور که قبلا گفته شده است main هم يک تابع است البته با کمی تفاوت. تابع main نیازی به پروتوتایپ ندارد و اتوماتيک هنگام اجرای برنامه فراخوانی می شود و هرگز در کد برنامه صدا زده نمی شود تابع main يک عدد صحيح را می تواند برگرداند که صفر يا غيرصفر است. اگر اجرای برنامه بطور موفق به انتها رسيده باشد مقدار صفر و در غيراينصورت يک مقدار غيرصفر در مقابل دستور return نوشته می شود.

فراخوانی تابع

هر زمان که به تابع نياز باشد نام آن صدا زده می شود. اين عمل فراخوانی تابع ناميده می شود. برنامه يا تابعی ک تابع را فراخوانی می کند فراخواننده تابع (function caller) ناميد می شود. هنگام فراخوانی تابع، مقدار آرگومان های تابع بايد مشخص شود.

اگر تابع مقدار برگشتی دارد هنگام فراخوانی مقدار برگشتی در یک متغیر باید ذخیره شود. يعنی سمت راست تابع علامت مساوی و یک متغیر همنوع مقدار برگشتی تابع قرار می دهیم.


مثال. تابع square به صورت زير در برنامه اصلی صدا زده می شود.

double sq = square(num);
cout << sq;
يا
cout << square(num);

مثال. فراخوانی تابعی که آرگومانی ندارد. تابع مربع اعداد 1 تا 10 را نمايش می دهد.

#include <iostream.h>
void squares();
main() {
   squares();
}
void squares() {
   int loop;
   for (loop=1;loop < 10;loop++);
      cout << loop*loop;
}


پروتوتايپ تابع

کامپایلر ++C نمی تواند تابعی را صدا بزند که چیزی درباره آن نمی داند. باید قبل از فراخوانی تابع به کامپایلر اجازه دهید بداند تابع چیست و چه کار می کند. یک راه برای انجام این کار اطمینان از نوشتن بدنه تابع قبل از فراخوانی آن است. را ه دیگر استفاده از پروتوتايپ تابع (prototype) است. پروتوتايپ تابع شرحی از نام، نوع برگشتی و نوع آرگومانهای تابع به کامپايلر ارائه می دهد. به اين ترتيب هنگام فراخوانی تابع کامپايلر صحت فراخوانی را بررسی می کند که آيا نوع و تعداد آرگومانهای ارسال شده به تابع و استفاده از مقدار برگشتی صحيح است يا خير.


مثال. پروتوتايپ تابع square.

double square(double n);


پروتوتايپ تابع مشابه اعلان تابع است منتها هميشه به سمیکولن(;) ختم می شود. یعد از تکميل تابع با استفاده از امکانcopy-and-paste اديتور می توانيد هدر تابع را کپی کرده و پروتوتايپ آنرا بسازيد. فقط دقت کنيد در انتهای آن علامت سميکولن را اضافه کنيد.

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

تعريف تابع

تعريف تابع (function definition) شامل کدهائی است که هنگام فراخوانی تابع بايد اجرا شود. تعريف تابع شامل دو قمت است: اعلان و بدنه. اولين خط تعريف تابع اعلان يا هدر است که اسم تابع، نوع مقدار برگشتی و آرگومان های تابع را مشخص می کند. بعد از هدر بدنه تابع قرار می گيرد. بدنه تابع بلاکی از دستورات است که درون يک جفت آکولاد محصور می شود و هر زمان که تابع فراخوانی می شود اجرا می شود.

فرم کلی تعريف تابع به صورت زير است:

return_type function_name( arg-type name-1,...,arg-type name-n)
{
   /* statements; */
}


مثال. تابع مربع يک عدد.

double square(double n)        /* function header */
{
   return n * n;                    /* function body */
}


اعلان تابع

در تابع مثال فوق خط double square(double n) اعلان تابع است. خط اعلان شامل 3 قسمت است:

1.نوع برگشتی
نوع برگشتی تابع نوع داده مقداری است که توسط تابع محاسبه و به برنامه فراخوان برگردانده می شود. نوع برگشنی می تواند از هر نوع استانداردی باشد. اگر نوع برگشتی تابع قيد نشده باشد از نوع int درنظر گرفته می شود. اگر تابع مقداری را بر نمی گرداند نوع برگشتی آن void بايد تعريف می شود.

2.نام تابع
تابع اولیه که برنامه با آن شروع می شود main نام دارد. بقیه توابع هر نام دلخواهی می توانند بگیرند. نام تابع از قوانین نامگذاری متغیرها تبعیت می کند. بهتر است نام تابع بیان کننده کاری که تابع انجام می دهد باشد. مثلا اگر تابع برای محاسبه مربع یک عدد است نام هایی مثل square_num یا number_square یا num_2 مناسب است.

3.لیست پارامترها
تابع می تواند هیچ، یک یا چند پارامتر داشته باشد. اگر تابعی پارامتر بگيرد به اين معنی است که به مقاديری نياز دارد تا روی آنها کار کند. در مثال تابع مربع، عددی که می خواهید مربع کنید باید به تابع داده شود. این عدد پارامتر تابع است. پارامترها از هر نوع داده ای می تواند باشد.. اگر تابع بيش از يک پارامتر بگيرد پارامترها توسط کاما جدا می شوند و نوع و نام هر پارامتر باید جداگانه مشخص شود. برای اعلان تابعی بدون پارامتر پرانتز بايد خالی بماند.

مثال. تابع زير دارای سه آرگومان x، y و z است.

void func1(int x, float y, char z)

توجه کنيد که در انتهای اعلان تابع علامت سميکولن وجود ندارد واگر گذاشته شود کامپايلر پيغام خطا صادر می شود.

گاهی بين پارامتر و آرگومان اشتباه پيش می آيد. يک پارامتر (parameter) يک محلی در هدر تابع است که برای ذخيره مقدار آرگومان عمل می کند. پارامترهای تابع ثابت هستند و در طی اجرای برنامه تغيير نمی کنند. يک آرگومان مقدار وافعی ارسال شده به تابع توسط دستور فراخوانی است. هر زمان که تابعی فراخوانی می شود آرگومان های مختلف می تواند به آن ارسال شود. درون تابع به آرگومان ها توسط نام پارامترهای متناظر دسترسی می شوند.

بدنه تابع

قسمت دوم تعريف تابع بدنه تابع (function body) است که با آکولاد {} محصور می شود و مشابه بلاکی از کد است. بدنه تابع بلافاصله بعد از اعلان تابع قرار می گيرد. دستورات لازم که برای انجام وظيفه تابع در اينجا نوشته می شود. وقتی تابع فراخوانی می شود اجرای آن از ابتدای بدنه تابع شروع می شود و وقتی به انتهای تابع يا دستور return برسد پايان می پذيرد.

تابع ممکن است مقداری را به فراخواننده خود برگرداند. مقدار برگشتی تابع باید از همان نوعی باشد که در اعلان تابع ذکر شده است در غیر اینصورت با خطای mistake erroe مواجه می شوید.


مثال. در برنامه زير تابع square برای محاسبه مربع عدد صحيح توسط تابع اصلی فراخوانی می شود.

#include <iostream.h>
double square(double n);
int main() {
   double num;
   do {
      cout << "What do you want to know the square "
      << "of (enter 0 to quit): ";
      cin >> num;
      cout << "The square of " << num << " is "
      << square(num) << ".n";
   } while (num != 0);
}
double square(double n) {
   return n * n;
}

توابع در ++C در اين بخش توضيح داده می شود. توابع بلاک های مستقلی از کد هستند که کار خاصی را انجام می دهند. هنگامی که برنامه نياز به انجام آن کار دارد تابع را صدا می زند. تابع اساس برنامه نويسی ساختيافته است که باعث بالارفتن کارائی برنامه ها و آسانتر شدن برنامه نويسی می شود. نحوه ايجاد و فراخوانی تابع به علاوه متغير های محلی و نحوه ارسال و دريافت پارامترهای تابع، توابع پيش ساخته و بازگشتی نيز شرح داده می شود.

تعريف تابع
فراخوانی تابع
دستور return
ارسال مقدار به تابع
متغيرهای محلی
سربارگذاری توابع
توابع پيش ساخته
فايل های ضميمه
توابع بازگشتی


تابع (function) بلاکی ازکد است که تحت يک نام گروه بندی می شود. بدين ترتيب بلاک کد می تواند بعد با استفاده از نامش اجرا شود. اين عمل فراخوانی تابع (function call) ناميده می شود. وقتی تابعی فراخوانی می شود دستورات درون تابع اجرا می شود. در انتهای تابع اجرا به همان محلی که تابع فراخوانی شده بود برمی گردد. ممکن است پارامترهایی به تابع ارسال شود. معمولا تابع معمولا مقداری را به برنامه فراخوان برمی گرداند.

برنامه ای که از تابع استفاده می کند به صورت ساختيافته (structured) است. يعنی وظايف توسط بخش های مستقل انجام می پذيرد. برنامه نويسی ساختيافته روی طراحی به روش top-down تاکيد دارد. در اين روش مسئله به وظايف مختلف تقسيم می شود و هر وظيفه توسط يک تابع انجام می پذيرد. بدنه تایع اصلی کوچک می شود و جزئيات درون توابع قرار می گيرند. به اين ترتيب نوشتن و اشکال زدائی برنامه های پيچيده آسانتر می شود. علاوه بر اين استفاده مجدد توابع در برنامه های ديگر ميسر می شود.

هر تابع بايد تنها يک کار را انجام دهد و از انجام چند کار در يک تابع بايد پرهيز شود.


نوع داده string

برای ذخيره رشته ها غير از آرايه کاراکتری انتخاب های ديگری هم وجود دارد. ++C شیء string را برای متغير های رشته ای دارد که برای استفاده باید فایل هدر ضميمه شود. string متدها و خواص خود را دارد که می توانید استفاده کنید. خاصیت طول یکی از خواص string است.


مثال.

#include <iostream.h>
#include <string.h>
int main() {
   string stringA = "C++",
   string stringB = "Is Cool",
   cout << "Length of stringA = " << stringA.length() << endl;
   cout << "Length of stringB = " << stringB.length() << endl;
   return 0;
}


روش ديگر برای کارکردن با رشته ها استفاده از اشاره گرهاست. برای اين منظور کافی است فضائی در حافظه درنظر گرفته شده رشته ای که به null ختم می شود را در آن ذخيره کرد. اشاره گری به اولين کاراکتر اين رشته به عنوان شروع رشته مشابه وقتی که رشته درون آرايه ذخيره می شود کار می کند.


مثال. وقتی دستور زير اجرا می شود رشته جائی در حافظه ذخيره می شود و آدرس شروع آن در اشاره گر message قرار می گيرد.

char *message = "Great Caesar's Ghost!";

اعلان فوق مشابه تعريف زير است:

char message[] = "Great Caesar's Ghost!";


آرایه های کاراکتری (رشته)

يکی از کاربرد های گسترده آرایه به صورت آرایه کاراکتری است. یک آرایه کاراکتری را به عنوان رشته ای از کاراکترها می توان در نظر گرفت. رشته (string)‌ به مجموعه ای از کاراکترها گفته می شود که برای ذخیره متن استفاده می شود.


مثال. دستور زير آرايه کاراکتری با اندازه 10 ايجاد می کند. اين آرايه می تواند رشته ای با حداکثر طول 9 را ذخيره کند.

char UserName[10];


C++ انتهای ‍يک رشته را با کاراکتر null می شناسد. کاراکتر null کاراکتر با کد اسکی صفر است که به صورت '' نوشته می شود. بنابراين يک محل از آرايه کاراکتری برای ذخيره کاراکتر null بايد کنار گذاشته شود.

مثال. برای ذخيره يک رشته 10 کاراکتری نياز به آرايه کاراکتری با اندازه 11 کاراکتر است.

چون رشته در آرايه به صورت کاراکتری ذخيره می شود که به null ختم می شود تمام چيزی که برای تعريف يک رشته نياز است اشاره گری به ابتدای آن است. همانطور که گفته شد اسم آرايه اشاره گری به اولين عنصر آن است. بنابراين تنها به اسم آرايه برای دسترسی به رشته ای که درون آرايه ذخيره شده نياز است. کتابخانه استاندارد ++C شامل توابعی برای کارکردن با رشته ها است. برای ارسال رشته ای به اين توابع بايد از نام آرايه استفاده شود. برای دريافت و نمايش متغيرهای رشته ای توسط دستورات cin و cout هم به همين صورت می توان عمل کرد.

cin >> UserName;
cout << UserName;

البته خواندن رشته به صورت فوق روش خيلی خوبی نيست زيرا اگر متن ورودی شامل فضای خالی باشد آنرا بعنوان جداکننده مقادير می شناسد. علاوه بر اين اگر طول رشته وارد شده بيشتر از فضای درنظر گرفته شده در متغير رشته ای باشد باعث بروز مشکل در برنامه می شود.

روش ديگر برای دريافت يک رشته از ورودی استفاده از متد getline شیء cin است. در اين حالت متن ورودی می تواند شامل فضاهای خالی هم باشد.


مثال. برنامه زير متنی با حداکثر طول 24 کاراکتر را از ورودی دريافت می کند و به متغير name اختصاص می دهد. کاراکتر NULL در انتها اضافه می شود.

#include <iostream.h>
int main() {
   char name[25];
   cout << "Please enter your name n";
   cin.getline(name,25);
   cout << "Hello " << name << endl;
   return 0;
}


مقداردهی اولیه آرایه کاراکتری

مشابه آرايه های ديگر آرايه های کاراکتری را می توان هنگام اعلان مقداردهی اوليه کرد. می توان کاراکترها را مجزا درون آکولاد نوشت يا از يک ثابت رشته ای که درون علامت (") قرار دارد استفاده کرد. در حالت دوم کامپايلر اتوماتيک کاراکتر null را در انتهای رشته درج می کند.

char string[10] = { 'h', 'e', 'l', 'l', 'o', '' };
char string[10] = "hello";

وقتی آرايه توسط رشته "hello" مقداردهی می شود در حافظه به صورت زير ذخيره می شود:

آرايه کاراکتري

اگر اندازه آرايه ذکر نشود کامپايلر اندازه آرايه را با توجه به تعداد کاراکترهای رشته ای محاسبه می کند. در اعلان زير آرايه با اندازه 6 کاراکتر مقداردهی می شود.

char string[] = "hello";

توابع C++ که روی رشته ها کار می کنند طول رشته را با پيدا کردن کاراکتر null محاسبه می کنند. يکی از مشکلاتی است که ممکن است در برنامه بروز کند. اين است که کاراکتر null گم بشود در نتيجه برنامه رشته را تا رسيدن به کاراکتر با کد اسکی صفر در حافظه گسترش می دهد.

تبلیغات شما تبلیغات شما

کدهای اختصاصی