زبان ++C یک سری از توابعی را که عملکردهای گوناگون ریاضی را انجام می دهند.توابعی که در کتابخانه های گوناگون تعریف شده اند و این بستگی به کامپایلری که شما استفاده می کنید دارد.
توابعی که در کتابخانه ی cmath تعریف شده اند به صورت زیر می باشند:
| acos |
cos |
fmod |
modf |
tan |
| asin |
cosh |
frexp |
pow |
tanh |
| atan |
exp |
ldexp |
sin |
|
| atan2 |
fabs |
log |
sinh |
|
| ceil |
floor |
log10 |
sqrt |
|
توابع اضافی تعریف شده در کتابخانه ی cstdlib به صورت زیر می باشند:
| abs |
labs |
srand |
| div |
ldiv |
rand |
|
منبع:www.functionx.com
آموزش زبان برنامه نویسی سی پلاس پلاس:
اگر چه به عنوان یک برنامه نویس زرنگ شما می توانید هر تابعی را برای انجام کار مورد نظرتان بسازید,زبان ++C توابعی را که از قبل ساخته شده اند فراهم آورده است,بنابراین کافی است که آن ها را به برنامه تان اضافه کنید بدون آن که به چگونگی کار کردن آن ها دقت توجه کنید,همه ی چیزی که نیاز است بدانید این است که این تابع ها چه کاری انجام می دهند.توابعی که بخشی از زبان ++C می باشند از اعتبار بالایی برخوردارند,ما شایستگی آن ها را تست کرده ایم و آن ها کاملا معتبر هستند.توابع داخلی ++C برای محدوده ی کار های گوناگونی از قبیل جبر , هندسه , مثلثات و مالیه و … ساخته شده اند.از طرف دیگر در مورد توابعی که بخشی از استاندارد ++C هستند,هر کامپایلر مجموعه ای از تئابع خود را حمل می کند و قابل استفاده در کامپایلر های دیگر نباشد.Borland C++ Builder کتابخانه ای بسیار غنی ازتوابع را فراهم آورده است.
اعلان یک مقدار یا یک عبارت
اکثر مقادیری که شما در برنامه تان استفاده می کنید نیاز به مدتی برای تطبیق انتخاب شما دارند.برای مثال,هنگامی که سن شخصی را در خواست می کنید شما به یک مقدار مثبت نیاز خواهید داشت.شما انتظار ندارید که سن کسی 26- باشد.++C تابعی را فراهم کرده است که می تواند برای بررسی مقدار یا عبارت پاسخ با معیارها ی انتخاب شما استفاده شود.این تابع assert() نامیده می شود و در کتابخانه ی cassert از std namespaceتعریف شده است.شیوه ی استفاده از آن به صورت زیر می باشد:
void assert(int Expression);
تابع assert() عبارت را به عنوان آرگومان درنظر گرفته و آن را تست می نماید.این تابع در همین زمینه به صورت عبارت های شرطی که در درسهای بعدی این کتاب آن ها را خواهیم آموخت,استفاده می شود.اگر عبارت صحیح باشد,assert() آن را تصدیق کرده و به کامپایلر اجازه می دهد با عملکرد بعدی ادامه دهد.اگر عبارت اشتباه باشد,assert() یک پیام را نمایش می دهد.اگر چه ما هنوز عبارت های شرطی را نیاموخته ایم,مثال زیر سن دانش آموز را درخواست می کند و معتبر بودن را تایید می کند اگر که سن دانش آموز بیش از 8 سال باشد:
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
float StudentAge;
cout << "Type Student's Age: ";
cin >> StudentAge;
assert(StudentAge > 8);
cout << "Student Age: " << StudentAge << "\n\n";
return 0;
}
منبع:www.functionx.com
آموزش زبان برنامه نویسی سی پلاس پلاس:متغیر های عضو یک فضای نام مانند متغیر های دیگری هستند که از آن ها استفاده می کنیم.آن ها می توانند مقادیر خود را از توابع بیرونی درخواست کنند.به مثال زیر توجه کنید:
#include <iostream>
using namespace std;
namespace InterestAndDiscount
{
. . .
}
. . .
int main()
{
using namespace InterestAndDiscount;
double GetThePrincipal();
cout << "Loan Processing\n";
cout << "Enter the following values\n";
Principal = GetThePrincipal();
cout << "Rate (between 0 and 100): ";
cin >> Rate;
cout << "Time (number of years): ";
cin >> Time;
cout << "\nInterest on a loan";
cout << "\nPrincipal: $" << Principal;
cout << "\nRate: " << Rate << "%";
cout << "\nTime: " << Time << " years";
cout << "\nInterest: $" << CalcInterest();
cout << "\nMaturity Value: $" << CalcMaturityValue();
return 0;
}
double GetThePrincipal()
{
double P;
cout << "Principal: $";
cin >> P;
return P;
}
همچنین متغیر عضو یک فضای نام می تواند به صورت آرگومان به تابع پاس شود.هنگام پاس کردن آرگومان اگر روال using namespace وارد شده بود,می توانید آن را مانند دیگر متغیر ها پاس کنید.در غیر اینصورت باید عضو فضای نام را با عملگر :: معین کنید.در مثال زیر یک عضو از متغیر تنها با نام متغیر پاس شده است,چون که قبلا using namespace دارد.عضو های دیگر به طور نمایشی با تعیین پاس شده اند:
#include <iostream>
using namespace std;
namespace InterestAndDiscount
{
. . .
}
. . .
int main()
{
using namespace InterestAndDiscount;
void GetThePrincipal(double& p);
void RateAndTime(double &r, double &t);
cout << "Loan Processing";
cout << "\nEnter the following values\n";
GetThePrincipal(Principal);
RateAndTime(InterestAndDiscount::Rate, InterestAndDiscount::Time);
cout << setiosflags(ios::fixed) << setprecision(2);
cout << "\nInterest on a loan";
cout << "\nPrincipal: $" << Principal;
cout << "\nRate: " << Rate << "%";
cout << setiosflags(ios::fixed) << setprecision(0);
cout << "\nTime: " << Time << " years";
cout << setiosflags(ios::fixed) << setprecision(2);
cout << "\nInterest: $" << CalcInterest();
cout << "\nMaturity Value: $" << CalcMaturityValue();
return 0;
}
void GetThePrincipal(double& P)
{
cout << "Principal: $";
cin >> P;
while( P < 0 )
{
cout << "Enter a positive number: $";
cin >> P;
}
}
void RateAndTime(double &rate, double &time)
{
do {
cout << "Rate (between 0 and 100): ";
cin >> rate;
} while(rate < 0 || rate > 100);
do {
cout << "Time (Nbr of Years): ";
cin >> time;
} while(time <= 0 || time >= 30);
}
منبع:www.functionx.com
آموزش زبان برنامه نویسی سی پلاس پلاس:برای پیاده سازی یک تابع عضو,بیرون از بدنه ی (body) فضای نام,نوع بازگشت آن را معین کرده و سپس نام فضای نام و بعد عملگر دسترسی به حوزه “::” قرار دهید.به مثال زیر توجه کنید:
namespace InterestAndDiscount
{
double Principal;
double Rate;
int Time;
double GetInterestRate();
double CalculateInterest();
double CalculateMaturity();
}
InterestAndDiscount::GetInterestRate()
{
return Rate / 100;
}
InterestAndDiscount::CalculateInterest()
{
return Principal * GetInterestRate() * Time;
}
InterestAndDiscount::CalculateMaturity()
{
return Principal + CalculateInterest();
}
برای پیاده سازی توابع عضو یک فضای نام تو درتو بیرون از فضای نام اصلی باید هر عضو تابع را برای مشخص شدن تابع (یا متغیر) که فراخوانی می کنید,معین نمایید.به مثال زیر توجه کنید:
namespace InterestAndDiscount
{
double Principal;
double Rate;
int Time;
double GetInterestRate();
double CalculateInterest();
double CalculateMaturity()
namespace Discounter
{
double Maturity;
double DiscountRate;
double TermOfDiscount;
double Discount();
}
}
. . .
InterestAndDiscount::Discounter::Discount()
{
return Maturity * DiscountRate * TermOfDiscount;
}
منبع:www.functionx.com
مانند یک متغیر تابع نیز می تواند قسمتی از فضای نام باشد.برای ایجاد تابع در یک فضای نام,نوع return تابع را معین کنید و سپس نام و بعد آرگومان های آن را درون پرانتز معین نمایید.به مثال زیر توجه کنید:
namespace InterestAndDiscount
{
double Principal;
double Rate;
int Time;
double CalculateDiscount();
double CalculateInterest();
double CalculateMaturity();
}
یک تابع عضو فضای نام می تواند با استفاده از عملگر دسترسی به حوزه ,در دسترس قرار گیرد.
در اینجا دو راه اصلی برای پیاده سازی تابع عضو وجود دارد.در قسمت بدنه ی (body) فضای نام که محل پیاده سازی می باشد,بدنه ی تابع را با نماد آکولاد باز } و آکولاد بسته { معین نمایید.تابعی که عضوی از فضای نام است,دسترسی کامل به متغیر هایی که عضو همان فضای نام است دارد.بنابراین شما مجبور نیستید,متغیر های عضو را به صورت آرگومان هایی به توابع پاس کنید.به مثال زیر توجه کنید:
#include <iostream>
using namespace std;
namespace InterestAndDiscount
{
double Principal;
double Rate;
int Time;
double GetInterestRate()
{
return Rate / 100;
}
double CalculateInterest()
{
return Principal * GetInterestRate() * Time;
}
double CalculateMaturity()
{
return Principal + CalculateInterest();
}
}
int main()
{
using namespace InterestAndDiscount;
Principal = 12500; // $
Rate = 12.25; // %
Time = 4; // Years
cout << "Interest Calculation";
cout << "\nPrincipal: $" << Principal
<< "\nRate: " << Rate << "%"
<< "\nTime: " << Time << " years"
<< "\nInterest: $" << CalculateInterest()
<< "\nMaturity: $" << CalculateMaturity() << "\n\n";
return 0;
}
نتیجه ی اجرای برنامه به صورت زیر خواهد بود
Interest Calculation
Principal: $12500
Rate: 12.25%
Time: 4 years
Interest: $6125
Maturity: $18625
اگر فضای نام تو درتو توابع خود را داشته باشد,همچنین شما می توانید آن ها را در بدنه ی (body) فضای نام تو درتو پیاده کنید.به مثال زیر توجه کنید:
namespace InterestAndDiscount
{
double Principal;
double Rate;
int Time;
double GetInterestRate()
{
return Rate / 100;
}
double CalculateInterest()
{
return Principal * GetInterestRate() * Time;
}
double CalculateMaturity()
{
return Principal + CalculateInterest();
}
namespace Discounter
{
double Maturity;
double DiscountRate;
double TermOfDiscount;
double Discount()
{
return Maturity * DiscountRate * TermOfDiscount;
}
}
}
بعد از تکمیل محلی توابع عضو فضای نام تو درتو ,می توانید به اعضای آن دسترسی داشته باشید و مقادیر آن ها را در تابع main() به صورتی که در بالا انجام شد نمایش دهید.
منبع:www.functionx.com
1-برای نشان دادن پاس کردن آرگومان با مرجع و با مرجع ثابت برنامه را به صورت زیر تغییر دهید:
-
#include <iostream>
using namespace std;
// Rectangle
double MomentOfInertia(const double& b, const double& h)
{
return b * h * h * h / 3;
}
// Semi-Circle
double MomentOfInertia(const double& R)
{
const double PI = 3.14159;
return R * R * R * R * PI/ 8;
}
// Triangle
double MomentOfInertia(const double& b, const double& h, const int&)
{
return b * h * h * h / 12;
}
int main()
{
double length, height, radius;
void GetBaseAndHeight(double&, double&);
void GetRadius(double&);
cout << "Enter the dimensions of the rectangle\n";
GetBaseAndHeight(length, height);
cout << "Rectangle\n"
<< "Moment of inertia with regard to the X axis: ";
cout << "I = " << MomentOfInertia(length, height) << "mm\n\n";
cout << "Enter the radius of the semi-circle\n";
GetRadius(radius);
cout << "Semi-Circle\n"
<< "Moment of inertia with regard to the X axis: ";
cout << "I = " << MomentOfInertia(radius) << "mm\n\n";
cout << "Enter the dimensions of the triangle\n";
GetBaseAndHeight(length, height);
cout << "\nTriangle\n"
<< "Moment of inertia with regard to the X axis: ";
cout << "I = " << MomentOfInertia(length, height, 1) << "mm\n";
cout << "\n\n";
return 0;
}
// Passing arguments by reference
void GetBaseAndHeight(double& B, double& H)
{
cout << "Enter Base: ";
cin >> B;
cout << "Enter Height: ";
cin >> H;
}
void GetRadius(double& R)
{
cout << "Enter Radius: ";
cin >> R;
}
|
|
2-برنامه را مانند زیر تست کنید:
-
Enter the dimensions of the rectangle
Enter Base: 18.85
Enter Height: 15.55
Rectangle
Moment of inertia with regard to the X axis: I = 23625.5mm
Enter the radius of the semi-circle
Enter Radius: 14.25
Semi-Circle
Moment of inertia with regard to the X axis: I = 16192.7mm
Enter the dimensions of the triangle
Enter Base: 8.95
Enter Height: 11.25
Triangle
Moment of inertia with regard to the X axis: I = 1061.94mm
|
|
3-بعد از تست برنامه به محیط برنامه نویسی خود بازگردید.
4-برای پیش بردن,پاس کردن ترکیبی از آرگومان ها,برنامه را به صورت زیر تغییر دهید:
-
#include <iostream>
using namespace std;
// Rectangle
// This function receives one argument by reference and two arguments
// by constant references
void MomentOfInertia(double& moment,
const double& b, const double& h)
{
moment = b * h * h * h / 3;
}
// Semi-Circle
// This function receives one argument by reference and one by
// constant reference
void MomentOfInertia(double& moment, const double& R)
{
const double PI = 3.14159;
moment = R * R * R * R * PI/ 8;
}
// Triangle
// This function receives one argument by reference, two arguments by
// constant references and one argument by value
void MomentOfInertia(double& moment,
const double& b, const double& h, const int&)
{
moment = b * h * h * h / 12;
}
int main()
{
double length, height, radius, mRectangle, mSemiCircle, mTriangle;
void GetBaseAndHeight(double&, double&);
void GetRadius(double&);
cout << "Enter the dimensions of the rectangle\n";
GetBaseAndHeight(length, height);
MomentOfInertia(mRectangle, length, height);
cout << "Rectangle\n"
<< "Moment of inertia with regard to the X axis: ";
cout << "I = " << mRectangle << "mm\n\n";
cout << "Enter the radius of the semi-circle\n";
GetRadius(radius);
MomentOfInertia(mSemiCircle, radius);
cout << "Semi-Circle\n"
<< "Moment of inertia with regard to the X axis: ";
cout << "I = " << mSemiCircle << "mm\n\n";
cout << "Enter the dimensions of the triangle\n";
GetBaseAndHeight(length, height);
MomentOfInertia(mRectangle, length, height, 1);
cout << "\nTriangle\n"
<< "Moment of inertia with regard to the X axis: ";
cout << "I = " << mRectangle << "mm\n";
cout << "\n\n";
return 0;
}
// Passing arguments by reference
void GetBaseAndHeight(double& b, double& h)
{
cout << "Enter Base: ";
cin >> b;
cout << "Enter Height: ";
cin >> h;
}
void GetRadius(double& R)
{
cout << "Enter Radius: ";
cin >> R;
}
|
|
5-برنامه را مانند زیر تست کنید:
-
Enter the dimensions of the rectangle
Enter Base: 12.85
Enter Height: 8.85
Rectangle
Moment of inertia with regard to the X axis: I = 2969.01mm
Enter the radius of the semi-circle
Enter Radius: 5.55
Semi-Circle
Moment of inertia with regard to the X axis: I = 372.59mm
Enter the dimensions of the triangle
Enter Base: 10.75
Enter Height: 6.75
Triangle
Moment of inertia with regard to the X axis: I = 275.511mm
|
|
6-به محیط برنامه نویسی خود بازگردید.
منبع:www.functionx.com
هنگامی که تابع یک آرگومان دریافت می کند,یکی از دو عمل را با توجه به مقدار آرگومان انجام خواهد داد:می تواند خودش مقدار را اصلاح کند یا از آرگومان برای اصلاح آرگومان دیگر یا متغیر دیگر خود استفاده کند.اگر بدانید که تابع برای تغییر مقدار آرگومان در نظر گرفته نشده است,بایستی آن را به کامپایلر اطلاع دهید.این حفاظت حداقل برای دو هدف می باشد,ابتدا کامپایلر مطمئن می شود که آرگومان تامین شده دست نخورده خواهد ماند.اگر تابع سعی بر تغییر (اصلاح) آرگومان داشته باشد,کامپایلر Error خواهد داد تا شما متوجه شوید که به یک عملکرد غیر از آنچه خواسته شده برخورد کرده است.دوم,سرعت اجرا را افزایش می دهد.
برای آن که به کامپایلر اطلاع دهید که مقدار آرگومان شما باید ثابت بماند,از کلمه ی کلیدی const قبل از نوع داده ی (data type ) آرگومان استفاده نمایید.برای مثال اگر شما یک تابع مانند void Area(const string Side)j ایجاد کنید,تابع Area() مقدار آرگومان Side را نمی تواند تغییر دهد.تابعی را که برای محاسبه و برگرداندن محیط مستطیل فرض شده است درنظر بگیرید.اگر طول و عرض را از تابع دیگری به نام main() دریافت کندبرنامه ی زیر عملکرد قانع کننده ای خواهد داشت(به تابع Perimeter() که دو آرگومان می گیرد توجه کنید):
#include <iostream>
using namespace std;
float Perimeter(float l, float w)
{
double p;
p = 2 * (l + w);
return p;
}
int main()
{
float length, width;
cout << "Rectangle dimensions.\n";
cout << "Enter the length: ";
cin >> length;
cout << "Enter the width: ";
cin >> width;
cout << "\nThe perimeter of the rectangle is: "
<< Perimeter(length, width) << "\n\n";
return 0;
}
نتیجه ی اجرای برنامه به صورت زیر خواهد بود
Rectangle dimensions.
Enter the length: 35.55
Enter the width: 28.75
The perimeter of the rectangle is: 2044.12
|
همانطور که می بینید تابع Perimeter() مقادیر length یا width تغییر نمی دهد.برای تقویت هدف وظیفه,بایستی آن را برای کامپایلر شفاف سازی کنید.برای ثابت نمودن آرگومان های length و width ,ایجاد تابع Perimeter() را به صورت زیر تغییر دهید:
float Perimeter(const float l, const float w);
|
شما می توانید یک یا تعداد بیشتری آرگومان را ثابت کنید و دستوری برای اینکه کدام آرگومان ثابت باشد,نمی باشد.
منبع:www.functionx.com