گستردگی DSLR های رایج از محدوده ی ISO 50 تا ISO 25,600 می باشد.اگر شما علاقه مند به کار کردن در روشنایی کم هستید,ممکن است بخواهید دوربینی با ISO setting بالا جستجو کنید.اکثر سطح DSLR های عرضه شده در محدوده ی تقریبا ISO 100 تا ISO 1600 می باشد. DSLRهای سطح متوسط,مانند Canon EOS 50D می باشد,محدوده ای که حال عرضه شده از ISO 100 تا 6400 می باشد و برخی DSLR های بالاتر مانند Nikon D3 و Canon EOS 5D Mark II دارای ISO settings بالا تا حد 25,600 و همچنین setting پایین ISO 50,یا Sony Alpha A900 می باشد,دیگر DSLR بالاتر دارای ISO settings از200-6400 با ترقی می باشند.
ISO settings بالا با برخی مشکلات همراه است,مانند noise و بعضی اوقات خطوط درتصویر.نگه داشتن کیفیت تصویر در ISO settings بسیار بالا مشکل است.حال آنکه در ISO settings پایین تر(800-100) اغلب دوربین ها تصاویری با noise کمتر تولید می کنند,بزرگ تر شدن تفاوت ها در ISO settings بالا آغاز می شوند.Noise می تواند از طریق روش های دیجیتالی کاهش Noise ,کاهش یابد,اما این روش ها همچنین جزئیات تصویر را همراه با Noise کاهش می دهند.اگر عملکرد ISO بالا برای شما مهم می باشد,سعی کنید تصاویر نمونه که با دوربین های مورد نظر شما گرفته شده را مشاهده کنید و آن ها را مقایسه نمایید.همه ی دوربین ها برابر نیستند.
نویسنده:Bob Atkins
زبان ++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
محاسبه ی پیکسل,DSLR هایی که در حال حاضر قابل استفاده می باشند,در محدوده ای از تقریبا 6MP: Nikon D40, 18-55mm kit, $410 تا 22MP: Canon EOS 1Ds Mark III, $6999 می باشد.شما چه تعداد پیکسل نیاز دارید؟یک روش مشاهده ی مقایسه ی بزرگترین اندازه ی چاپی است که شما از هر دوربین می توانید بگیرید.برای این محاسبه من فرض می کنم که چاپ با 240ppi که معمولا عدد خوبی برای چاپ با کیفیت بالا می باشد.اگر تصویر از up close نمایش داده شده باشد,شما 300ppi نیاز دارید یا اگر از فاصله ی کمی بزرگتر باشد شما تفاوت زیادی در 180dpi نمی بینید,اما 240ppi عدد خوبی برای نمایش چاپ کیفیت بالا از فاصله ی نمایش معمولی می باشد.
| MP Count |
6 |
8 |
10 |
12 |
14 |
16 |
18 |
20 |
22 |
| Print size (240dpi) |
8.3″ x 12.5″ |
9.6″ x 14.4″ |
10.7″ x 16.1″ |
11.8″ x 17.7″ |
12.7″ x 19.1″ |
13.6″ x 20.4″ |
14.4″ x 21.7″ |
15.2″ x 22.8″ |
16″ x 24″ |
همانطور که می بینید یک دوربین 6MP می تواند یک تصویر با کیفیت عالی 10×8 بسازد که به بزرگی چاپی که اکثر مردم می خواهند می باشد و 10MP برای دادن چاپ با کیفیت بسیار بالا ی 14×11 کافی می باشد.
مهم است که توجه داشته باشید که در این ها اعدادی با احتیاط نسبتا زیاد می باشند.تعدادی از استفاده کنندگان چاپ های عالی 20×16 را از دوربین های 8MP مانند Canon EOS 30D, $637 گزارش داده اند,مخصوصا اگر تصویر برای چاپ های بزرگترتوسط نرم افزارهایی مانند Adobe Photoshop CS4 [Mac], $640, Genuine Fractals 5 یا Nik Sharpener بهینه سازی شده باشد.خط زیر این است که,بجز اینکه شما سعی بر گذراندن معاش با فروش چاپ های هنری کیفیت بالای 36×24 داشته باشید,هر نوع از DSLR های کنونی بایستی توانایی نتیجه دادن برای چاپ داشته باشند که از نظر بزرگی اندازه و بالا بودن کیفیت کافی باشد و بتواند نیاز یک عکاس متوسط را برطرف سازد.در صورتیکه محاسبه ی پیکسل,فاکتوری باشد که شما مطمئنا می خواهید هنگام انتخاب DSLR در نظر بگیرید,این تنها و یا مهمترین فاکتور نخواهد بود.
نویسنده:Bob Atkins
اندازه و وزن
اندازه , وزن و قیمت با یکدیگر پیش می روند,کوچکترین و سبک ترین دوربین ها کمترین گرانی خواهند داشت.اگر وزن و اندازه هر دو مهم هستند,پس DSLR های Olympus four-Thirds بسته ی مقدم خواهد بود.برای مثال 10MP
130mm x 91mm x 53mm,Olympus Evolt E-420 می باشد و 440g وزن دارد.هر چند مدل های 10MP APS-C از Nikon و Canon زیاد بزرگتر و سنگین تر نمی باشند.برای مثال Nikon D40x اندازه ی 124mm x 94mm x 64mm دارای 522g وزن می باشد در حالیکه Canon Digital Rebel XSi اندازه ی 126mm x 98mm x 65 mm دارای 502g وزن می باشد.
اهمیت وزن و اندازه بستگی به استفاده شما دارد. DSLR (با لنز) آنقدر کوچک نیست که در جیب ژاکت قرار گیرد.بنابراین تفاوت های کوچک اندازه و وزن موضوع بزرگی نخواهد بود,اگر شما در هر صورت یک کیف دوربین را حمل می کنید.
نویسنده:Bob Atkins