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 ses clients au sujet des tarifs de certains projets. Tu vas écrire quelques fonctions utilitaires pour calculer rapidement les coûts pour les clients.

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

Un client contacte le freelance pour se renseigner sur ses tarifs. Le freelance lui explique qu'il travaille 8 heures par jour. Cependant, le freelance ne connaît que son tarif horaire pour le projet. Aide-le à estimer un tarif journalier à partir d'un tarif horaire.

Implémente la fonction dailyRateFrom(hourlyRate:), qui prend l'argument hourlyRate contenant le tarif horaire du freelance.
La fonction doit renvoyer le tarif journalier calculé à partir du tarif horaire.

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

Il arrive qu'un client souhaite engager le freelance pour une période plus longue. Le freelance est prêt à accorder une remise au client, mais seulement si celui-ci l'engage pour au moins un mois. Il y a en tout 22 jours travaillés. Aide le freelance à calculer son tarif mensuel, arrondi à l'entier le plus proche, à partir de son tarif horaire et du pourcentage de remise qu'il est prêt à accorder sur le tarif plein.

Implémente la fonction monthlyRateFrom(hourlyRate:withDiscount:), qui prend les arguments hourlyRate, le tarif horaire du freelance, et withDiscount, la remise que le freelance est prêt à accorder au client. La fonction doit renvoyer le tarif mensuel arrondi à l'entier le plus proche.

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

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

Un autre jour, un chef de projet propose au freelance de travailler sur un projet avec un budget fixe. Étant donné le budget fixe et le tarif horaire du freelance, aide-le à calculer le nombre de jours qu'il travaillerait jusqu'à épuisement du budget. Tiens compte du fait que dans ce scénario, le freelance est toujours prêt à accorder la remise, quel que soit le nombre de jours travaillés. Le résultat doit être arrondi à l'entier inférieur.

Implémente la fonction workdaysIn(budget:hourlyRate:withDiscount:), qui prend les arguments :

  • budget, le budget du projet.
  • hourlyRate, le tarif horaire du freelance.
  • withDiscount, la remise que le freelance est prêt à accorder au client.

La fonction doit renvoyer le nombre de jours travaillés du freelance sur le projet, arrondi à l'entier inférieur.

workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
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.