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

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

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

مقدمه

عدد

سوئیفت دو دسته‌ی اصلی از عددها را ارائه می‌دهد: عددهای صحیح و عددهای ممیز شناور.

می‌توانید برای خوانایی بیشتر، در عددهای نوشته‌شده در کد زیرخط بگذارید: 1_000_000 دقیقاً همان 1000000 است. عددهای ممیز شناور را می‌توان در نماد اعشاری یا نمایی نوشت.

در بیشتر موارد، برای عددهای صحیح از Int و برای عددهای ممیز شناور از Double استفاده می‌کنید:

let speed: Int = 42                           // Explicit Int
let pi: Double = 3.14                         // Explicit Double
let giga: Double = 1_000_000_000              // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34  // Double in scientific notation

عملگرهای حساب

سوئیفت عملگرهای حساب استانداردی برای محاسبه‌های عددی ارائه می‌دهد:

عملگر توضیح مثال
+ جمع 4 + 6 برابر است با 10
- تفریق 15 - 10 برابر است با 5
* ضرب 2 * 3 برابر است با 6
Caution

سوئیفت از نظر نوع ایمن است و اجازه نمی‌دهد نوع‌های عددی متفاوت در عملیات حسابی با هم ترکیب شوند. نمی‌توانید یک Int و یک Double را مستقیماً با هم جمع یا ضرب کنید؛ ابتدا باید یکی از این دو نوع را به نوع دیگر تبدیل کنید.

تقسیم

عملگر / تقسیم را انجام می‌دهد. وقتی هر دو عملوند عدد صحیح باشند، تقسیم صحیح بخش اعشاری را حذف می‌کند:

5.0 / 2.0 // 2.5 (Double division)
5 / 2     // 2 (integer division truncates the remainder)

تقسیم یک عدد ممیز شناور ناصفر بر صفر به inf یا -inf می‌انجامد. تقسیم 0.0 بر 0.0 مقدار nan را تولید می‌کند (عدد نیست). در مقابل، تقسیم یک عدد صحیح بر صفر باعث خطای زمان کامپایل یا زمان اجرا می‌شود:

print(5.0 / 0.0)  // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0)  // Prints nan

// The following line will not compile:
// print(5 / 0) // Error: Division by zero

عملگر باقیمانده

عملگر باقیمانده (%) باقیمانده‌ی حاصل از تقسیم دو عدد صحیح را محاسبه می‌کند:

5 % 2  // 1
-5 % 2 // -1

// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Note

در سوئیفت، % یک عملگر واقعی باقیمانده است، نه یک عملگر پیمانه. نتیجه همیشه علامت عملوند اول (مقسوم) را می‌گیرد، بدون توجه به علامت عملوند دوم:

5 % -2  // 1
-5 % 2  // -1

گرد کردن عددهای ممیز شناور

می‌توانید یک عدد ممیز شناور را با متد rounded() گرد کنید. به‌طور پیش‌فرض، rounded() به نزدیک‌ترین عدد صحیح گرد می‌کند. همچنین می‌توانید یک قاعده‌ی گرد کردن مشخص، مانند .up یا .down، تعیین کنید:

let x = 3.14
let y = x.rounded()      // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up)   // 4.0

استنتاج نوع

وقتی یک ثابت یا متغیر عددی را بدون تعیین نوع اعلام می‌کنید، سوئیفت نوع آن را استنتاج می‌کند:

  • عددهای کامل به‌طور پیش‌فرض Int در نظر گرفته می‌شوند.
  • عددهای دارای نقطه‌ی اعشاری به‌طور پیش‌فرض Double در نظر گرفته می‌شوند.
let x = 42         // Inferred as Int
let y = 42.0       // Inferred as Double
let z: Double = 42 // Explicitly typed as Double

تبدیل نوع

برای انجام عملیات بین مقدارهایی با نوع‌های متفاوت، یکی از مقدارها را با سازنده‌های نوع مانند Double(_:) یا Int(_:) تبدیل کنید:

let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0

let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)

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

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

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

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

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

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

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

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

dailyRateFrom(hourlyRate: 60)
// Returns 480.0

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

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

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

monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129

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

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

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

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0

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

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

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

در Exercism ثبت‌نام کنید تا Swift را همراه با 35 مفهوم116 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.