مسیرها
/
C++
C++
/
تمرین‌ها
/
نرخ‌های فریلنسر
نرخ‌های فریلنسر

نرخ‌های فریلنسر

تمرین یادگیری

مقدمه

انواع عددی داخلی در C++ را می‌توان به اعداد صحیح و اعداد اعشاری تقسیم کرد. اعداد صحیح، اعداد کاملی مانند 0، 691 یا -2 هستند. اعداد اعشاری، اعدادی با ممیز هستند، مانند 6.02214076، 0.1 یا -1.616.

اعداد صحیح

مثال زیر اعلان و مقداردهی اولیه‌ی چهار متغیر متفاوت را نشان می‌دهد

int m_morales{9241};              // base 10: 0-9
int a_apaec{0x24CD};              // base 16: 0-9 and A-F
int m_gargan{0b10010000011001};   // base  2: 0-1
int b_reilly{022031};             // base  8: 0-7
                                  // Leading with a 0 not the letter o.

وقتی مقداری را به یک متغیر int اختصاص می‌دهید، می‌توانید این کار را مستقیماً با یک «لیترال» انجام دهید. لیترال عددی است که مستقیماً در کد نوشته شده، مانند 9241. برای چندین مبنای نمایش، لیترال‌های صحیح متفاوتی وجود دارد. لیترال‌های صحیح دهدهی رایج‌ترین‌اند و از ارقام 0 تا 9 استفاده می‌کنند. با افزودن یک پیشوند ویژه، مانند 0x، می‌توان از مبناهای دیگر استفاده کرد. مثال بالا عدد 9241 را با چهار نمایش و پیشوند متفاوت نشان می‌دهد. همه‌ی متغیرها با مقدار یکسانی مقداردهی اولیه می‌شوند.

برای جزئیات بیشتر درباره‌ی سیستم‌های نمایش مختلف، نگاهی به یک آموزش کوچک بیندازید.

می‌توانید برای خوانایی بیشتر، ارقام را با یک آپاستروف جدا کنید. 9'241 با 0b0100'100'0001'1001 یا 92'4'1 یکسان است.

اعداد اعشاری

لیترال‌های اعشاری دو گونه‌اند. علاوه بر شکل شهودی 0.0024، می‌توان از نماد علمی آن، 2.4e-3، استفاده کرد. رایج‌ترین نوع اعشاری، double است.

محاسبات

C++ از +، -، *، /، ( و ) و % برای ساخت عبارت پشتیبانی می‌کند. حاصل عملیات بین دو عدد صحیح نیز یک عدد صحیح است. 5 / 2 مقدار 2 را برمی‌گرداند. وقتی یکی از انواع دخیل، یک نوع اعشاری باشد، حاصل نیز اعشاری خواهد بود. 5.0 / 2 و 5 / 2.0 مقدار 2.5 را برمی‌گردانند. % عملگر باقیمانده است و باقیمانده‌ی تقسیم صحیح را برمی‌گرداند: 5%3 برابر 2 است.

عملگر انتساب

عملگر انتساب، یک لیترال را به یک متغیر اختصاص می‌دهد. این کار همیشه از راست به چپ انجام می‌شود و هرگز برعکس آن رخ نمی‌دهد.

int length = 5;
int width = 2;
length = width;

در اینجا مقدار صحیح 5 به متغیر length اختصاص می‌یابد. سپس مقدار صحیح 2 به متغیر width اختصاص می‌یابد. در نهایت مقدار width در متغیر length کپی می‌شود و مقدار پیشین 5 از بین می‌رود. همچنین در نظر بگیرید که ما مقدار width را فقط در لحظه‌ی عمل انتساب به length نسبت می‌دهیم. بنابراین، اگر مقدار width در زمانی بعدتر تغییر کند، بر مقداری که length می‌گیرد تأثیری نخواهد داشت.

عملگر انتساب را می‌توان با دیگر عملگرها (حسابی و بیتی) ترکیب کرد؛ به این‌ها عملگرهای compound assignment می‌گویند: +=، -=، *=، /=، %=. این عملگرها با انجام یک عمل روی مقدار فعلی متغیر، آن را تغییر می‌دهند.

// we start with 0 people
int people{};
// we need 0 eggs
int eggs{};
// two people joined:
people += 2;
// people is now 2
// let's add 3 eggs per person
eggs += 3 * people;
// eggs is now 6

متغیرهای people و eggs با مقدار 0 مقداردهی اولیه می‌شوند. سپس مقدار صحیح 2 را به مقدار موجود 0 در متغیر people اضافه می‌کنیم و نتیجه را دوباره به people اختصاص می‌دهیم. اکنون people برابر 2 می‌شود. بعداً برای هر نفر 3 تخم‌مرغ اضافه می‌کنیم که در کل 6 تخم‌مرغ می‌شود. حالا این 6 را به مقدار موجود 0 در متغیر eggs اضافه می‌کنیم و آن را دوباره به eggs اختصاص می‌دهیم. اکنون eggs برابر 6 خواهد بود. عبارت معادل آن people = people + 2 و eggs = eggs + (3 * people) خواهد بود.

دستورالعمل‌ها

در این تمرین، کدی می‌نویسید که به یک فریلنسر کمک می‌کند با مدیر پروژه ارتباط برقرار کند. وظیفه‌ی شما این است که چند ابزار فراهم کنید تا نرخ‌های روزانه و ماهانه را به‌سرعت محاسبه کنند، به‌صورت اختیاری همراه با تخفیف مشخص‌شده.

ابتدا چند قاعده را بین فریلنسر و مدیر پروژه تعیین می‌کنیم:

  • نرخ روزانه ۸ برابر نرخ ساعتی است.
  • یک ماه ۲۲ روز قابل صورتحساب دارد.

گاهی فریلنسر پیشنهاد می‌دهد که روی نرخ روزانه‌اش تخفیف اعمال کند (برای نمونه برای وفادارترین مشتریان یا مشتریان غیرانتفاعی).

تخفیف‌ها به‌صورت اعداد اعشاری مدل‌سازی می‌شوند که درصد را نشان می‌دهند، برای نمونه 25.0 (۲۵٪).

1. محاسبه‌ی نرخ روزانه با داشتن نرخ ساعتی

تابعی به اسم daily_rate پیاده‌سازی کنید که نرخ روزانه را با داشتن نرخ ساعتی به‌عنوان پارامتر محاسبه کند. قرارداد تعیین می‌کند که یک روز ۸ ساعت قابل صورتحساب دارد.

daily_rate(60)
// => 480.0

نرخ روزانه‌ی برگشتی باید از نوع double باشد.

2. محاسبه‌ی قیمت پس از تخفیف

تابعی به اسم apply_discount پیاده‌سازی کنید که قیمت پس از تخفیف را محاسبه کند. این تابع باید دو پارامتر بگیرد: قیمت اولیه و نرخ تخفیف بر حسب درصد.

apply_discount(150, 10)
// => 135.0

مقدار برگشتی همیشه باید از نوع double باشد و به هیچ شکلی گرد نشود.

3. محاسبه‌ی نرخ ماهانه با داشتن نرخ ساعتی و تخفیف

تابعی به اسم monthly_rate پیاده‌سازی کنید که نرخ ماهانه‌ی تخفیف‌خورده را محاسبه کند. این تابع باید دو پارامتر داشته باشد: نرخ ساعتی و تخفیف بر حسب درصد.

monthly_rate(77, 10.5)
// => 12130

نرخ ماهانه‌ی برگشتی باید به نزدیکترین عدد صحیح به بالا گرد شود (سقف گرفته شود).

4. محاسبه‌ی تعداد روزهای کاری کامل با داشتن بودجه، نرخ ساعتی و تخفیف

تابعی به اسم days_in_budget پیاده‌سازی کنید که بودجه، نرخ ساعتی و تخفیف را می‌گیرد و محاسبه می‌کند که این مبلغ چند روز کاری کامل را پوشش می‌دهد.

days_in_budget(20'000, 80, 11.0)
// => 35

تعداد روزهای برگشتی باید به نزدیکترین عدد صحیح به پایین گرد شود (کف گرفته شود).

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
C++ Exercism

آماده‌اید نرخ‌های فریلنسر را شروع کنید؟

در Exercism ثبت‌نام کنید تا C++ را همراه با 19 مفهوم100 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.