Parcours
/
Swift
Swift
/
Exercices
/
Tarifs d'un freelance
Tarifs d'un freelance

Tarifs d'un freelance

Exercice d'apprentissage

Introduction

Les nombres

Swift propose deux grandes catégories de nombres : les entiers et les nombres à virgule flottante.

  • Les entiers représentent des nombres sans partie fractionnaire, comme 0, 1, -1, 42 et -273.
  • Les nombres à virgule flottante représentent des nombres dotés d'une partie fractionnaire, comme 0.0, 3.14 et -1.36969e-10.

Tu peux insérer des tirets bas dans les littéraux numériques pour en améliorer la lisibilité : 1_000_000 est identique à 1000000. Les littéraux à virgule flottante peuvent s'écrire en notation décimale ou exponentielle.

Dans la plupart des cas, on utilise Int pour les entiers et Double pour les nombres à virgule flottante :

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

Opérateurs arithmétiques

Swift fournit les opérateurs arithmétiques standards pour les calculs numériques :

Opérateur Description Exemple
+ Addition 4 + 6 donne 10
- Soustraction 15 - 10 donne 5
* Multiplication 2 * 3 donne 6
Caution

Swift est un langage à typage sûr : il n'autorise pas le mélange de types numériques différents dans les opérations arithmétiques. Tu ne peux pas additionner ou multiplier directement un Int et un Double ; tu dois d'abord convertir l'un des deux types pour qu'il corresponde à l'autre.

Division

L'opérateur / effectue la division. Quand les deux opérandes sont des entiers, la division entière tronque toute partie fractionnaire :

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

Diviser un nombre à virgule flottante non nul par zéro donne inf ou -inf. Diviser 0.0 par 0.0 produit nan (Not a Number). En revanche, diviser un entier par zéro provoque une erreur à la compilation ou à l'exécution :

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

L'opérateur de reste

L'opérateur de reste (%) calcule le reste de la division de deux entiers :

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

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

En Swift, % est un véritable opérateur de reste, et non un opérateur modulo. Le résultat porte toujours le signe du premier opérande (le dividende), quel que soit le signe du second :

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

Arrondir les nombres à virgule flottante

Tu peux arrondir un nombre à virgule flottante avec la méthode rounded(). Par défaut, rounded() arrondit à l'entier le plus proche. Tu peux aussi fournir une règle d'arrondi précise, comme .up ou .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

Inférence de type

Quand tu déclares une constante ou une variable numérique sans annotation de type, Swift en déduit le type :

  • Les nombres entiers sont déduits comme des Int.
  • Les nombres avec un point décimal sont déduits comme des Double.
let x = 42         // Inferred as Int
let y = 42.0       // Inferred as Double
let z: Double = 42 // Explicitly typed as Double

Conversion de type

Pour effectuer des opérations entre des valeurs de types différents, convertis l'une des valeurs à l'aide d'initialiseurs de type comme Double(_:) ou 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)

Instructions

Dans cet exercice, tu vas écrire du code pour aider un freelance à communiquer avec un chef de projet. Ta tâche consiste à fournir quelques utilitaires pour calculer rapidement les tarifs journalier et mensuel, éventuellement avec une remise donnée.

Nous commençons par établir quelques règles entre le freelance et le chef de projet :

  • Le tarif journalier correspond à 8 fois le tarif horaire.
  • Un mois compte 22 jours facturables.

Parfois, le freelance propose d'appliquer une remise sur son tarif journalier (par exemple pour ses clients les plus fidèles ou pour ses clients à but non lucratif).

Les remises sont modélisées par des nombres décimaux représentant des pourcentages, par exemple 25.0 (25 %).

1. Calculer le tarif journalier à partir d'un tarif horaire

Implémente une fonction appelée dailyRateFrom pour calculer le tarif journalier à partir d'un tarif horaire passé en paramètre. Le contrat définit qu'une journée compte 8 heures facturables.

dailyRateFrom(hourlyRate: 60)
// Returns 480.0

Le tarif journalier renvoyé doit être un Double.

2. Calculer le tarif mensuel à partir d'un tarif horaire et d'une remise

Implémente une fonction monthlyRateFrom pour calculer le tarif mensuel remisé. Elle prend deux paramètres : un tarif horaire et la remise en pourcentage.

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

Le tarif mensuel renvoyé doit être arrondi à l'entier supérieur (arrondi au plafond).

3. Calculer le nombre de jours travaillés complets à partir d'un budget, d'un tarif horaire et d'une remise

Implémente une fonction workdaysIn qui prend un budget, un tarif horaire et une remise, et calcule combien de journées de travail complètes cela couvre.

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

Le nombre de jours renvoyé doit être arrondi à l'entier inférieur (arrondi au plancher).

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Swift Exercism

Prêt à commencer Tarifs d'un freelance ?

Inscris-toi sur Exercism pour apprendre et maîtriser Swift avec 35 concepts116 exercices, et un vrai mentorat humain, le tout gratuitement.