Visual C++
بسم الله الرحمن الرحیم
به وبلاگ آموزش Visual C++ خوش آمدید. در این وبلاگ سعی شده با ارائه مثالهای کاربردی به ارتقای سطح علمی برنامه نویسان C++ کمک شود. لازم به تذکر است برای استفاده از مطالب این وبلاگ باید آشنایی قبلی با برنامه نویسی C++ و MFC داشته باشید.
توجه : چنانچه قسمتی از کد بریده شده بود اندازه متن صفحه را کوچک کنید.
1- ریاضیات و ++C
آیا عدد N جزو سری اعداد فیبوناچی است یا خیر
تعیین تعداد N باکتری تولید شده از N باکتری اولیه در N دقیقه
تبدیل رادیان به درجه ، گراد و بالعکس
توزیع دو جمله ای در آمار
تشخیص اینکه ایا عددی اعشاری هست یا خیر
محاسبه ریشه های معادله دو مجهولی با استفاده از اشاره گرها
محاسبه فاکتوریل یک عدد
محاسبه ریشه (رادیکال) یک عدد با فرجه ای غیر از ۲
کار با توابع مثلثاتی
منحنی نرمال
تشخیص اینکه آیا عددی کامل است یا خیر
محاسبه تعداد صفرها بین ممیز و اولین عدد غیر صفر در اعداد کوچکتر از یک
تشخیص کبیسه بودن سال میلادی
تشخیص اینکه ایا عددی اول است یا خیر
توزیع پواسون
محاسبه تعداد ارقام یک عدد
محاسبه لگاریتم در مبنایی غیر از ۱۰
یافتن Nامین عدد فیبوناچی
محاسبه تعداد ذره جرم معینی از یک ماده
نکته : برای استفاده از توابع ریاضی تعریف شده در Visual C++ مانند لگاریتم حتما فایل هدر #include "math.h" و در Visual C++.Net فایل #include "cmath.h" به فسمت فایل های هدردر فایل اصلی پروژه که دارای پسوند(*.CPP) می باشد، اضافه کنید.فایل اصلی پروژه فایلی است که کدهای برنامه را در آن می نویسید و به صورت (View.CPPنام برنامه یا Dlg.Cppنام برنامه) می باشد. نام CMathDlg نام فرضی است که برای پروژه انتخاب کردم.
توصیه می کنم برای اطلاع از توابع ریاضی به فایل math.h یا cmath.h مراجعه کنید.
تشخیص اینکه ایا عددی اعشاری هست یا خیر
در Visual C++ تابعی به نام modf وجود دارد که قسمت صحیح و اعشاری عدد را در صورت وجود بر می گرداند. پس برای تشخیص اعشاری بودن یا نبودن یک عدد تابعی به نام IsFloatNumber(double Number) و از نوع BOOL ایجاد و کد زیر را در آن بنویسید:
BOOL CMathDlg::IsFloatNumber(double Number)
{
BOOL bFloat=FALSE;
double FloatPart=0,IntPart=0;
FloatPart=modf(Number,&IntPart);
if(FloatPart!=0)
{
bFloat=TRUE;
}
return bFloat;
}
در کد بالا چنانچه قسمت اعشاری عدد برابر با صفر گردد تابع مقدار ۱ یعنی TRUE را بر می گرداند. همانطور که در قسمت قبل توضیح دادم متغیر IntPart مقدار قسمت صحیح عدد را در خود نگه می دارد.
در علم احتمالات ، احتمال واقع شدن دقیقا k پیروزی در n آزمایش تکراری به وسیله رابطه زیر نشان داده می شود:
P(k)=C(n,k)Pkqn-k
q احتمال شکست و برابر با q=1-P می باشد. عبارت C(n,k) ترکیب نام دارد. برای محاسبه ترکیب و توزیع دو جمله ای باید دو تابع جداگانه بنویسیم. ابتدا تابعی برای ترکیب به نام Combination(long n,long k) و از نوع long ایجاد و کد زیر را در آن تایپ می کنم:
long CMathDlg::Combination(long n,long k)
{
long r=0;
r=n-k;
return (Factorial(n))/Factorial(k)*Factorial(r);
}
تابع فاکتوریل را در قسمت فاکتوریل عدد توضیح دادم. حال برای محاسبه توزیع دو جمله ای تابعی به نام
Pk(long n,long k,double P) واز نوع double ایجاد کنید و کد زیر را در آن تایپ کنید:
double CMathDlg::Pk(long n, long k, double P)
{
double q=1-P;
return (double)Combination(n,k)*(pow(P,k))*(pow(q,(n-k)));
}
مثالی رادر این زمینه حل می کنیم.
خانواده ای دارای ۶ فرزند است. احتمال اینکه ۲ تا پسر و ۴ تا دختر باشد چقدر است.
چون احتمال پسر یا دختر بودن 1/2 است بنابراین n=6،k=2، P=1/2،q=1-P می باشد. پس اگر مقدار ها را به جای پارامتر تابع قرار دهید خواهید دید که جواب برابر با 0.234375 می باشد.
تعیین تعداد N باکتری تولید شده از N باکتری اولیه در N دقیقه
در این مثال محاسبه می کنیم که از چند باکتری بعد از مدت معینی چقدر باکتری تولید خواهد شد. برای این کار تابعی به نام
BacteriaGrowth(long nPrime, long reGenerationTime, long Period, BOOL bMinute) و از نوع double ایجاد کنید. سپس کد زیر را در آن تایپ کنید:
double CMathDlg::BacteriaGrowth(long nPrime, long reGenerationTime, long Period, BOOL bMinute)
{
long double Num=0;
if(bMinute==FALSE)
{
reGenerationTime*=60;
Period*=60;
Num=(Period*0.301+(reGenerationTime*log10(nPrime)))/reGenerationTime;
}
else if(bMinute)
{
Num=(Period*0.301+(reGenerationTime*log10(nPrime)))/reGenerationTime;
}
return (double)pow(10,Num);
}
در تابع فوق reGenerationTime به مفهوم زمان تجدید نسل می باشد. nPrime تعداد باکتری اولیه و Period مدت زمانی است که می خواهیم بدانیم بعد از این مدت چه تعداد باکتری به وجود می آید و bMinute تعیین می کند.آیا زمان برحسب دقیقه باشد یا ساعت. به عنوات مثال از ۳ سلول باکتری با زمان تجدید نسل ۱۵ دقیقه ای بعد از ۴ ساعت چه تعداد باکتری به وجود می آید. nPrime=3، reGenerationTime=15، Period=4 hours . جواب تقریبا برابر است با ۱۸۹۲۸۸ باکتری.
تبدیل رادیان به درجه ، گراد و بالعکس
برای کار با توابع مثلثاتی لازم است که گاهی رادیان به درجه یا گراد و بالعکس تبدیل شود. برای منظور تابعی به نام GRD(double Number,LPCTSTR Unit) و از نوع double ایجاد و کد زیر را در آن بنویسید:
double CMathDlg::GDR(double Number, LPCTSTR Unit)
{
double Num=0;
if(Unit==_T("D to R"))
{
Num=Number*PI/180;
}
else if(Unit==_T("R to D"))
{
Num=Number*180/PI;
}
else if(Unit==_T("G to R"))
{
Num=Number*PI/200;
}
else if(Unit==_T("G to D"))
{
Num=Number*180/200;
}
else if(Unit==_T("R to G"))
{
Num=Number*200/PI;
}
else if(Unit==_T("D to G"))
{
Num=Number*200/180;
}
return (double)Num;
}
در تابع فوق تمام تبدیلات مورد نیاز انجام می شود می توانید از آن در توابع مثلثاتی استفاده کنید.
آیا عدد N جزو سری اعداد فیبوناچی است یا خیر
برای تشخیص اینکه آیا عدد N جزو سری اعداد فیبوناچی است یا نه باید از فرمول زیر استفاده کنیم:
X=5N2-4 Or X=5N2+4
که اگر X به دست آمده در هریک از معادلات فوق دارای جذر کامل باشد(یعنی اعشاری نباشد مانند جذر ۱۶) آن عدد جزو سری اعداد فیبوناچی است. مثلا عدد ۲ را در نظر بگیرید چنانچه این عدد را به جای N قرار دهیم جواب برابر ۱۶ می شود و چون ۱۶ دارای جذر کامل می باشد (۴ ) پس عدد ۲ جزو سری اعداد فیبوناچی است ولی اگر X به دست آمده از هردو معادله دارای جذر کامل نباشد آن عدد جزو سری اعداد فیبوناچی نیست.
اکنون تابعی می نویسیم که این کار را انجام دهد. برای این منظور تابعی به نام IsFibonacci(long Number) و از نوع BOOL ایجاد و کد زیر را در آن بنویسید:
BOOL CMathDlg::IsFibonacci(long Number)
{
BOOL bFibonacci=FALSE;
double X=0,X2=0;
double y=0,n=0,n2=0,y2=0;
X=sqrt((5*Number*Number)-4);
X2=sqrt((5*Number*Number)+4);
y=modf(X,&n);
y2=modf(X2,&n2);
if(y==0||y2==0)
{
bFibonacci=TRUE;
}
return (BOOL) bFibonacci;
}
باز در تابع فوق از تابع modf که قسمت صحیح و اعشاری را بر می گرداند استفاده کردیم. چنانچه متغیر y يا y2 برابر صفر شد یعنی عدد ما جذر کامل داشته پس عدد مورد نظر جزو سری اعداد فیبوناچی می باشد.
