آموزش| توابع (قسمت سوم)
به نام خدا
در ++C اگر تابع نتيجه اي را برنگرداند فقط زماني که اجراي تابع به آکولاد بسته پايان تابع يا دستور ;return مي رسد کنترل از آن برمي گردد . واگر تابع نتيجه اي را برگرداند دستور ;return expression مقدار نتيجه عبارت (expression) را به احضار کننده تابع برمي گرداند.
مثال زير از تابع Macimum (که تابعي تعريف شده توسط برنامه نويس است) استفاده مي کند و بزرگترين عدد ميان سه عدد صحيح را پيدا کرده و آنرا به عنوان نتيجه برمي گرداند
روال کار اين برنامه بدين صورت است که ابتدا سه عدد صحيح را از ورودي مي گيرد آنها را به تابع Maximum انتقال مي دهد در اين تابع بزرگترين عدد صحيح پيدا مي شود و سپس به تابع Main برگردانده مي شود و در خروجي چاپ ميشود.
کد:
#include <iostream.h>
#include <conio.h>
int maximum(int, int, int); /* پيش نمونه تابع */
int main()
{
int a, b, c;
cout << "Enter three integers : ";
cin >> a >> b >> c;
/* آرگومانها براي صدا زدن تابع ماکزيمم هستند a, b , c */
cout << "Maximum is: " << maximum(a, b,c) << endl;
getch();
return 0;
}
/*تعريف تابع ماکزيممهستند
maximum پارامترهاي تابع x,y,z */
int maximum(int x, int y, int z)
{
int max = x;
if(y > max)
{
max = y;
}
if(z > max)
{
max = z;
}
return max;
}
نمونه خروجي اين تابع
کد:
Enter three integers : 9 8 95
maximum is : 95
پيش نمونه تابع يکي از مهمترين ويژگيهاي ++C است .پيش نمونه تابع اطلاعاتي از قبيل نام تابع و نوع داده برگشتي تابع وتعداد پارامترهايي که تابع بايد دريافت کند و اوناع پارمترها و ترتيب قرار گرفتن آنها را به کامپايلر ميدهد.و کامپايلر از پيش نمونه تابع براي بررسي درست بودن احضارهاي تابع استفاده مي کند. در نسخه هاي اوليه C اين نوع بررسي انجام نمي شد به همين دليل امکان داشت که احضارهاي تابع بدون کشف خطا و به صورت نادرست انجام شود . اينگونه احضارهاي نادرست مي توانست به خطاهاي fatal , nonfatal (مخرب و غير مخرب)(خطاهاي ظريف منطقي که پيدا کردن آنها به سادگي امکان پذير نبود) زمان اجرا منجر شود. پيش نمونه توابع اين مشکلات را برطرف کرده.
يکي از ويژگيهاي مهم پيش نمونه توابع تبديل نوع آرگومانهاست .يعني آرگومانها را وادار به تبديل به يک نوع خاص کنيم
براي مثال تابع رياضي کتابخانه اي ()sqrt را حتي اگر پيش نمونه تابع در سرفايل math.h يک ارگومان Double براي آن مشخص کرده .مي توان با يک آرگومان صحيح احضار کرد و باز هم تابع همچنان به درستي کار خواهد کرد.
دستور
مقدار (sqrt(4 را به درستي ارزيابي کرده و مقدار 2 را در خروجي چاپ مي کند.
پيش نمونه تابع سبب مي شود کامپايلر قبل از انتقال مقدار به تابع ()sqrt مقدار آرگومان 4 را که مقداري صحيح است به مقدار 4.0 از نوع double تبديل کند.
به صورت کلي قبل از احضار تابع مقاديري از آرگومان ها که با انواع داده اي پيش نمونه تابع متناظر نيستند به نوع درست تبديل مي شوند.
اگر از قوانين ارتقاء نوع در ++C پيروي نکنيم اين تبديلات منجبر به نتايج نادرست مي شود.اين قوانين (قوانين ارتقاء نوع) مشخص مي کنند که چگونه انواع داده اي به انواع داده اي ديگر تبديل مي شوند بدون اينکه اطلاعاتي در اين تبديلات از بين برود.در ()sqrt مثال بالا نوع int به صورت اتوماتيک به نوع double تبديل شد بدون اينکه در تبديلات اطلاعاتي از بين برود.تبديل انواع داده اي بزرگتر به انواع داده اي کوچکتر(مثلا" تبديل بلند long به کوتاه short) باعث مي شود که مقادير آنها تغيير کند.
استفاده معمول ارتقاء نوع در هنگامي است که نوع آرگومان تابع با نوع پارامتر مشخص شده در تعريف تابع سازگار نيست تبديل مقادير به کوچکترين نوع داده ميتواند منجر به مقادير نادرست شود.مقادير آرگومان تابع به نوع پارامتر پيش نمونه تابع تبديل مي شوند دقيقا" مثا اينکه در متغير هايي از آن نوع جايگزين شده اند . اگر تابع ()square در زير
کد:
//Function definition
int square(int y)
{
return y*y;
}
که از يک پارامتر صحيح استفاده مي کند با آرگومان اعشاري احضار شود اين آرگومان به نوع int کوچکترين نوع تبديل مي شود و تابع ()square معمولا" يک مقدار نادرست بر مي گرداند .براي مثال (square(4.5 مقدار 16 را برميگرداندو 20.25 را برنمي گرداند.
ليست انواع داده اي از بالاتريد به پايين ترين نوع در زير آورده شده
کد:
long double
double
float
unsigned long int (همنام با unsigned long)
long int (همنام با long)
unsigned int (همنام با unsigned)
int
unsigned short int (همنام با unsigned short)
short int (همنام با short)
unsigned char
short
char
خطاهايي که ممکن است در اين مورد با آن مواجه شويم
- فراموشي در قرار دادن سميکالن در پايان پيش نمونه توابع خطاي دستوري محسوب مي شود.
- اگر احضار تابعي با پيش نمونه تابع سازگار نباشد خطاي دستوري اتفاق مي افتد.
- اگر پيش نمونه تابع و تعريف تابع با هم سازگار نباشند اين نيز يک خطاي دستوري است.
به عنوان مثال اگر پيش نمونه تابع زير
کد:
int maximum(int x, int y, int z)
{
int max = x;
if(y > max)
{
max = y;
}
if(z > max)
{
max = z;
}
return max;
}
به صورت
کد:
void maximum(int x, int y, int z);
نوشته شود کامپايلر پيغام خطا مي دهد زيرا نوع برگشتي void در پيش نمونه تابع متفاوت با نوع برگشتي int در عنوان تابع است.
- در سلسله مراتب ارتقاء نوع تبديل از نوع داده بالاتر به نوع داده پايين تر مي تواند مقدار نوع داده را نيز تغير دهد.
- هنگامي که قبل از اولين احضار تابع تعريف نشده باشد , ننوشتن پيش نمونه يک تابع خطاي دستوري است.
نکاتي درباره مهندسي نرم افزار
- در ++C پيش نمونه توابع مورد نياز هستند براي بدست آوردن پيش نمونه توابع کتابخانه استاندارد از سرفايل کتابخانه هاي مربوط ,
از دستور پيش پردازنده include# استفاده مي کنيم
- اگر تعريف تابع قبل از اولين استفاده از تابع در برنامه ظاهر شود در آن صورت , احتياجي به پيش نمونه تابع نيست. در اين حالت تعريف تابع به صورت پيش نمونه تابع عمل
مي کند.
سرفايل ها :
هر کتابخانه استاندارد سرفايل مربوط به خود که شامل پيش نمونه تمام توابع در آن کتابخانه و تعريف هاي انواع داده اي مختلف و ثابتهاست که اين توابع به آنها نياز دارند را دارد
در ليست زير بعضي از سرفيل هاي کتابخانه استاندارد ++C ارائه شده
___________________________________________________________________
-------------------------------------------------------------------------------------------------------------------------
سرفايل کتابخانه استاندارد شرح عملکرد
-------------------------------------------------------------------------------------------------------------------------
<assert.h> حاوي ماکروها و اطلاعات تشخيص خطاست که به برنامه نويس در اشکال زدائي
کمک مي کند .
<ctyre.h> حاوي پيش نمونه توابعي است که کاراکتري را براي ويژگيهاي مشخص آزمايش
مي کند.و نيز حاوي پيش نمونه توابعي است که براي تبديل حروف کوچک به حروف
بزرگ به کارمي رود و برعکس .
<float.h> حاوي حدود اعشاري سيستم است.
<limits.h> حاوي حدود صحيح سيستم است.
<math.h> حاوي پيش نمونه توابع رياضي کتابخانه اي است.
<stdio.h> حاوي پيش نمونه توايع کتابخانه اي ورودي/خروجي استاندارد و اطلاعات مربوطه است
که توسط آنها مورد استفاده قرار مي گيرد.
<stdlib.h> حاوي پيش نمونه توابع تبديل اعداد به متن , متن به اعداد , تخصيص حافظه , اعداد تصادفي
و انواع ديگري از توابع مفيد است.
<string.h> حاوي پيش نمونه توابع پردازش رشته هاي زبان c است.
<time.h> حاوي پيش نمونه توابع و انواع داده اي براي کار با ساعت (time) و تاريخ (date) است.
<iostream.h> حاوي پيش نمونه توابع براي توابع ورودي و خروجي استاندارد است.
<iomanip.h> حاوي پيش نمونه توابع دستکاري کننده هاي جريان است که امکان فرمت بندي جريان
داده ها را فراهم مي سازد.
<fstream.h> حاوي پيش نمونه توابعي است که اطلاعات ورودي را از فايل روي ديسک مي خواند
و خروجي اش را در فايل روي ديسک مي نويسد.
___________________________________________________________________
شما مي توانيد سر فايل هايي را براي خود ايجاد کنيد . سرفايل هاي ايجاد شده توسط برنامه نويس بايد با h. به پايان برسد.
سرفايل هاي ايجاد شده توسط شما ميتوانند با دستور پيش پردازنده include# به برنامه اضافه شوند. براي مثال سرفايل
square.h با دستور زير مي تواند به بالاي برنامه اضافه شود
منبع : C++ How TO PROGRAM