مسیرها
/
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)

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

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

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

مشتری‌ای با فریلنسر تماس می‌گیرد تا درباره‌ی نرخ‌هایش بپرسد. فریلنسر توضیح می‌دهد که او روزی ۸ ساعت کار می‌کند. اما فریلنسر فقط نرخ ساعتی خود برای پروژه را می‌داند. به او کمک کنید نرخ روزانه را بر اساس نرخ ساعتی تخمین بزند.

تابع dailyRateFrom(hourlyRate:) را پیاده‌سازی کنید؛ این تابع آرگومان hourlyRate را می‌گیرد که نرخ ساعتی فریلنسر را در خود نگه می‌دارد.
تابع باید نرخ روزانه را بر اساس نرخ ساعتی برگرداند.

dailyRateFrom(hourlyRate: 60)
// Returns 480.0

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

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

گاهی مشتری می‌خواهد فریلنسر را برای مدت طولانی‌تری استخدام کند. فریلنسر حاضر است به مشتری تخفیف بدهد، اما فقط در صورتی که مشتری او را حداقل برای یک ماه استخدام کند. در مجموع ۲۲ روز کاری وجود دارد. به فریلنسر کمک کنید نرخ ماهانه‌اش را بر اساس نرخ ساعتی و درصد تخفیفی که حاضر است روی نرخ ثابت اعمال کند محاسبه کند، گردشده به نزدیک‌ترین عدد صحیح.

تابع monthlyRateFrom(hourlyRate:withDiscount:) را پیاده‌سازی کنید؛ این تابع آرگومان‌های hourlyRate را می‌گیرد که نرخ ساعتی فریلنسر را در خود نگه می‌دارد، و withDiscount که تخفیفی را در خود نگه می‌دارد که فریلنسر حاضر است به مشتری بدهد. تابع باید نرخ ماهانه را گردشده به نزدیک‌ترین عدد صحیح برگرداند.

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

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

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

تابع workdaysIn(budget:hourlyRate:withDiscount:) را پیاده‌سازی کنید؛ این تابع آرگومان‌های زیر را می‌گیرد:

  • budget که بودجه‌ی پروژه را در خود نگه می‌دارد.
  • hourlyRate که نرخ ساعتی فریلنسر را در خود نگه می‌دارد.
  • withDiscount که تخفیفی را در خود نگه می‌دارد که فریلنسر حاضر است به مشتری بدهد.

تابع باید تعداد روزهای کاری فریلنسر روی پروژه را به پایین گردشده برگرداند.

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Swift Exercism

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

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