Soit un exercice avec l’intitulé suivant et réalisable avec des if… else… else if… :
Déterminer si une année est bissextile ou non demande de prendre plusieurs décisions :
L’année est-elle divisible par 4 ?
Si oui, l’année est-elle divisible par 100 ?
Si non, c’est une année bissextile.
Si oui, l’année est-elle divisible par 400 ?
Si non, ce n’est pas une année bissextile.
Si oui, c’est une année bissextile.
Ce processus de prise de décision peut être masqué au sein d’une fonction.
La fonction number(_:, isDivisibleBy:) a été intégrée à cette aire de jeux pour rendre l’exercice un peu plus simple. Voici une fonction incomplète permettant de déterminer si une année est bissextile ou non :
// Doit être vrai
isLeapYear(2000)
// Doit être faux
isLeapYear(1900)
// Doit être vrai
isLeapYear(2012)
// Doit être faux
isLeapYear(2017)
J’ai mis le code suivant mais je ne vois pas comment tester si ce n’est pas divisible par 100… Bref, je ne vois pas comment enchainer des conditions à réaliser uniquement si la précédente est vrai ou fausse.
Sans donner la réponse, quelqu’un pourrait-il donner une piste ?
func testConditions() -> Bool {
let condition1 = true
let condition2 = true
let condition3 = true
if condition1 == true {
if condition2 == true {
if condition3 == true {
// Code exécuté seulement si les 3 tests sont positifs
return true
}
}
}
// Code exécuté si l'un des 3 tests échoue
return false
}
Pas besoin de tester l’égalité avec true si la valeur est déjà de type Bool, ce qui permet une écriture plus compacte :
func testConditionsCompact() -> Bool {
let condition1 = true
let condition2 = true
let condition3 = false
if condition1 {
if condition2 {
if condition3 {
// Code exécuté seulement si les 3 tests sont positifs
return true
}
}
}
// Code exécuté si l'un des 3 tests échoue
return false
}
Je patauge.
Je teste les années avec des if mais, sur 4 dates données, le premier if ne teste que 3 dates, le second 2, le 3è une et la dernière aucune.
func isLeapYear(_ year: Int) -> Bool {
var anneeDivisiblePar4 = true
var anneeDivisiblePar100 = true
var anneeDivisiblePar400 = true
if number(year, isDivisibleBy: 4) {
anneeDivisiblePar4 = true
}
if number(year, isDivisibleBy: 100) {
anneeDivisiblePar100 = true
}
if number(year, isDivisibleBy: 400) {
anneeDivisiblePar400 = true
}
if anneeDivisiblePar4 == true {
if anneeDivisiblePar100 == false {
if anneeDivisiblePar400 == true {
return true
}
}
}
return false
}
Ou d’une autre manière, en évitant la comparaison du test de division 100 avec false, grâce à l’opérateur ! qui inverse une valeur boléenne. C’est plus « pro », mais moins visible dans le code par un novice.
func isLeapYear(_ year: Int) -> Bool {
if number(year, isDivisibleBy: 4) {
if !number(year, isDivisibleBy: 100) {
if number(year, isDivisibleBy: 400) {
return true
}
}
}
return false
}
Même si mon code est lourd , ne devrait il pas pour autant fonctionner ? Pourquoi tous les ‹ if › ne sont-ils pas testés ?
Je viens de tester ton code, il me retourne des false pour les 4 dates alors que :
// Doit être vrai
isLeapYear(2000)
// Doit être faux
isLeapYear(1900)
// Doit être vrai
isLeapYear(2012)
// Doit être faux
isLeapYear(2017)
C’est pas grave, en relisant l’énoncé, je pense que l’erreur viens de ta lecture de l’algorithme.
Déterminer si une année est bissextile ou non demande de prendre plusieurs décisions :
L’année est-elle divisible par 4 ?
Si oui, l’année est-elle divisible par 100 ?
Si non, c’est une année bissextile.
Si oui, l’année est-elle divisible par 400 ?
Si non, ce n’est pas une année bissextile.
Si oui, c’est une année bissextile.
J’ai vérifié sur Wikipédia :
Depuis l'ajustement du calendrier grégorien, l'année sera bissextile (elle aura 366 jours)
1 : si l'année est divisible par 4 et non divisible par 100, ou
2 : si l'année est divisible par 400.
Sinon, l'année n'est pas bissextile (elle a 365 jours).
Tu vérifie si l’année est divisible par 4 ET non divisible par 100 ET divisible par 400.
Alors que le bon test c’est :
(année divisible par 4 ET non divisible par 100) OU année divisible par 400
Et c’est exactement ce que j’ai tapé dans la fonction isDivisible(), écrite pour avoir une syntaxe similaire à la fonction number() utilisée par Fanfan.