مسیرها
/
Swift
Swift
/
تمرین‌ها
/
خرید خودروی دردسرساز
خرید خودروی دردسرساز

خرید خودروی دردسرساز

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

مقدمه

عملگرهای مقایسه

عملگرهای مقایسه دو مقدار از یک نوع را با هم مقایسه می‌کنند و یک مقدار Bool برمی‌گردانند (true یا false). اگر مقادیری از نوع‌های متفاوت را با هم مقایسه کنید، کامپایلر خطا می‌دهد.

عملگرهای مقایسه‌ی استاندارد در Swift عبارت‌اند از:

عملگر توضیح مثال
== برابر است با 1 == 1 («درست»)
!= برابر نیست با 1 != 2 («درست»)
< کوچک‌تر از 4 < 5 («درست»)
<= کوچک‌تر یا مساوی 4 <= 4 («درست»)
> بزرگ‌تر از 3 > 1 («درست»)
>= بزرگ‌تر یا مساوی 2 >= 2 («درست»)

دستورهای if و else

یک دستور شرطی بر اساس اینکه نتیجه‌ی یک شرط true باشد یا false، کد را اجرا می‌کند. رایج‌ترین دستور شرطی، دستور if است که یک بلوک کد را فقط زمانی اجرا می‌کند که شرطش true باشد. یک دستور if را با کلیدواژه‌ی if می‌نویسید؛ بعد از آن شرط و بلوکی از کد می‌آید که داخل آکولاد قرار گرفته است:

let wheelCount = 4
if wheelCount == 4 {
    print("Your vehicle is a car")
}
// Prints "Your vehicle is a car"

می‌توانید if را با یک بند else همراه کنید تا وقتی شرط false است، کد جایگزینی اجرا شود:

let precipitationInMM = 0.5
if precipitationInMM > 0.5 {
    print("You will need an umbrella")
} else {
    print("You will not need an umbrella")
}
// Prints "You will not need an umbrella"

برای آزمودن چند شرط پشت سر هم، دستورها را با else if به هم زنجیر کنید. یک دستور if به شاخه‌ی else نیازی ندارد، اما می‌توانید یکی را بگنجانید تا حالت‌هایی را پوشش دهید که هیچ‌کدام از شرط‌ها برقرار نیستند:

let favoriteFruit = "Apple"

if favoriteFruit == "Banana" {
    print("Your favorite fruit is a banana")
} else if favoriteFruit == "Orange" {
    print("Your favorite fruit is an orange")
} else if favoriteFruit == "Apple" {
    print("Your favorite fruit is an apple")
} else {
    print("Your favorite fruit is not a banana, orange, or apple")
}
// Prints "Your favorite fruit is an apple"

عبارت‌های if

در Swift مدرن، از دستورهای if می‌توان به‌عنوان عبارت‌هایی که یک مقدار تولید می‌کنند هم استفاده کرد. هر شاخه به یک مقدار ارزیابی می‌شود و همین، تخصیص نتیجه به‌صورت شرطی را آسان می‌کند:

let cpuBits = 32
let architecture = if cpuBits == 64 {
    "x86_64"
} else {
    "x86_32"
}

print(architecture)
// Prints "x86_32"

عملگر سه‌تایی

عملگر شرطی سه‌تایی کوتاه‌نویسی فشرده‌ای برای یک عبارت if-else است. این عملگر یک شرط را ارزیابی می‌کند و بسته به اینکه آن شرط true باشد یا false، یکی از دو مقدار را برمی‌گرداند.

این عملگر سه بخش دارد: condition ? trueExpression : falseExpression. اگر condition به true ارزیابی شود، trueExpression ارزیابی و برگردانده می‌شود؛ در غیر این صورت falseExpression ارزیابی و برگردانده می‌شود.

عملگر سه‌تایی برای انتخاب‌های ساده و یک‌خطی ایده‌آل است:

let showFahrenheit = true
let temperatureInCelsius = 30

let temperature = showFahrenheit ? temperatureInCelsius * 9 / 5 + 32 : temperatureInCelsius
print(temperature)
// Prints 86

مثال بالا معادل فشرده‌ای است از:

let showFahrenheit = true
let temperatureInCelsius = 30

let temperature = if showFahrenheit {
    temperatureInCelsius * 9 / 5 + 32
} else {
    temperatureInCelsius
}

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

در این تمرین، کدی می‌نویسید که به شما کمک می‌کند برای خرید خودرو آماده شوید.

سه کار در پیش دارید: یکی برای تعیین اینکه آیا از عهده‌ی پرداخت‌های ماهانه برمی‌آیید، یکی برای تعیین اینکه به چه گواهینامه‌ای نیاز دارید و یکی برای تخمین قیمت مناسب یک خودروی دست‌دوم.

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

همه‌ی نمایندگی‌های خودرو در شهر شما یک طرح تشویقی پنج‌ساله با سود ۰٪ اجرا می‌کنند و شما می‌خواهید از آن استفاده کنید. اما مطمئن نیستید که از عهده‌ی پرداخت‌های ماهانه‌ی خودروی موردنظرتان بربیایید.

پرداخت ماهانه برابر است با قیمت کل خودرو تقسیم بر تعداد ماه‌های این دوره‌ی پنج‌ساله.

تابع canIBuy(vehicle:price:monthlyBudget:) را پیاده‌سازی کنید که این پارامترها را می‌گیرد:

  • vehicle - اسم خودرویی که می‌خواهید بخرید.
  • price - قیمت خودرویی که می‌خواهید بخرید.
  • monthlyBudget - مبلغی که می‌توانید هر ماه بپردازید.

تابع باید بسته به شرط‌های زیر، پیام مربوطه را برگرداند:

  • اگر پرداخت ماهانه‌ی خودرو کمتر از یا برابر با بودجه‌ی ماهانه باشد، پیام "Yes! I'm getting a <vehicle>" را برگردانید.
  • اگر پرداخت ماهانه‌ی خودرو تا ۱۰٪ (با احتساب خود ۱۰٪) بیشتر از بودجه‌ی ماهانه‌ی شما باشد، پیام "I'll have to be frugal if I want a <vehicle>" را برگردانید.
  • اگر پرداخت ماهانه‌ی خودرو بیش از ۱۰٪ بالاتر از بودجه‌ی ماهانه‌ی شما باشد، پیام "Darn! No <vehicle> for me" را برگردانید.
canIBuy(vehicle: "1974 Ford Pinto", price: 516.32, monthlyBudget: 100.00)
// returns "Yes! I'm getting a 1974 Ford Pinto"
canIBuy(vehicle: "2011 Bugatti Veyron", price: 2_250_880.00, monthlyBudget: 10000.00)
// returns "Darn! No 2011 Bugatti Veyron for me"
canIBuy(vehicle: "2020 Indian FTR 1200", price: 12_500, monthlyBudget: 200)
// returns "I'll have to be frugal if I want a 2020 Indian FTR 1200"

2. تعیین کنید که به چه نوع گواهینامه‌ای نیاز دارید

تصمیم گرفته‌اید یک خودروی دست‌دوم بخرید و باید تعیین کنید برای راندن آن به چه نوع گواهینامه‌ای نیاز دارید.

تابع licenseType(numberOfWheels:) را پیاده‌سازی کنید که پارامتر numberOfWheels را می‌گیرد؛ این پارامتر تعداد چرخ‌های خودرویی است که می‌خواهید بخرید.

تابع باید بسته به شرط‌های زیر، پیام مربوطه را برگرداند:

  • اگر تعداد چرخ‌ها ۲ یا ۳ باشد، پیام "You will need a motorcycle license for your vehicle" را برگردانید.
  • اگر تعداد چرخ‌ها ۴ یا ۶ باشد، پیام "You will need an automobile license for your vehicle" را برگردانید.
  • اگر تعداد چرخ‌ها ۱۸ باشد، پیام "You will need a commercial trucking license for your vehicle" را برگردانید.
  • اگر تعداد چرخ‌ها هر عدد دیگری باشد، پیام "We do not issue licenses for those types of vehicles" را برگردانید.
licenseType(numberOfWheels: 2)
// returns "You will need a motorcycle license for your vehicle"
licenseType(numberOfWheels: 6)
// returns "You will need an automobile license for your vehicle"
licenseType(numberOfWheels: 18)
// returns "You will need a commercial trucking license for your vehicle"
licenseType(numberOfWheels: 0)
// returns "We do not issue licenses for those types of vehicles"

3. تخمینی از قیمت یک خودروی دست‌دوم محاسبه کنید

حالا که تصمیمتان را گرفته‌اید، می‌خواهید مطمئن شوید که در نمایندگی قیمت منصفانه‌ای می‌پردازید. چون می‌خواهید یک خودروی دست‌دوم بخرید، قیمت به سن خودرو بستگی دارد. برای یک تخمین تقریبی، فرض کنید اگر خودرو کمتر از ۳ سال سن داشته باشد، ۸۰٪ قیمتی را هزینه دارد که هنگام نو بودن داشت. اگر حداقل ۱۰ سال سن داشته باشد، ۵۰٪ قیمت را هزینه دارد. اگر خودرو حداقل ۳ سال سن داشته باشد اما بیش از ۱۰ سال نداشته باشد، ۷۰٪ قیمت اولیه را هزینه دارد.

تابع calculateResellPrice(originalPrice:yearsOld:) را پیاده‌سازی کنید که پارامتر originalPrice، یعنی قیمت اولیه‌ی خودرو، و پارامتر yearsOld، یعنی سن خودرو بر حسب سال، را می‌گیرد. تابع باید قیمت فروش مجدد خودرو را برگرداند.

calculateResellPrice(originalPrice: 1000, yearsOld: 1)
// returns 800
calculateResellPrice(originalPrice: 1000, yearsOld: 5)
// returns 700
calculateResellPrice(originalPrice: 1000, yearsOld: 15)
// returns 500
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Swift Exercism

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

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