Année bissextile

Résolu/Fermé
Anna - 19 nov. 2016 à 10:56
 Anna - 20 nov. 2016 à 12:31
Bonjour,

Mon prof nous a proposé une correction pour l'exercice suivant:

Exercice:
Une année bissextile (contient 366 jours) si elle est multiple de 4, sauf les années de début de siècle (qui se terminent par 00) qui ne sont bissextiles que si elles sont divisibles par 400.
Exemples
 1980 et 1996 sont bissextiles car elles sont divisibles par 4
 2000 est une année bissextile car elle est divisible par 400
 2100 et 3000 ne sont pas bissextiles car elles ne sont pas divisibles par 400.
Ecrire un algorithme qui permet de déterminer si un entier positif donne correspond a une année bissextile ou non.

Correction:
Algorithme Bissextile
Var
n : Entier
Début
Ecrire("Entrer l'annee="), Lire(n)
Si ( n Mod 400 = 0) OU (( n Mod 100 # 0) ET (n Mod 4) = 0))<0 ) Alors
Ecrire("Annee bissextile")
Sinon
Ecrire("Annee non bissextile")
FinSi
Fin.

J'ai pas compris cette instruction " Si ( n Mod 400 = 0) OU (( n Mod 100 # 0) ET (n Mod 4) = 0))<0 )" et surtt pourquoi "<0" . Qui peut m'expliquer svp. Merci d'avance.

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
19 nov. 2016 à 11:58
Bonjour,

Le problème avec les algorithmes c'est que chacun met la syntaxe qu'il veut et qu'il y a autant de façon d'écrire un algo qu'il n'y a de personnes (contrairement aux langages de programmation qui doivent respecter des règles strictes)

Pour moi le <0 ne sert à rien, quant au reste c'est tout simplement la traduction algorithmique de tes conditions pour avoir une année bissextile :

L'année est divisible par 4 (n Mod 4 = 0) donc bissextile UNIQUEMENT si elle n'est pas divisible par 100 (n Mod 100 # 0), SAUF SI elle est divisible par 400 (n Mod 400 = 0)

D'où la condition globale avec OU/ET qui t'a été donnée, bien qu'elle devrait plutôt être écrite dans l'ordre suivant pour optimiser le calcul :

Si (n Mod 4 = 0) ET ((n Mod 100 # 0) OU (n Mod 400 = 0))
3
Merci pour la réponse, votre solution est plus simple à comprendre, mais il me reste une remarque svp :
" Si (n Mod 4 = 0) ET ((n Mod 100 # 0) OU (n Mod 400 = 0))"

Autrement, ça nous donne:
Si ((n Mod 4 = 0) Et (n Mod 100 # 0)) OU ((n Mod 4 = 0) Et (n Mod 400 = 0))

Au niveau de 2ème instruction : si n Mod 400 = 0 ça nous donne automatiquement n Mod 4 =0,non ? donc, si c'est vrai à quoi sert de répéter ? peut-on mettre seulement
(n Mod 400 = 0) ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
19 nov. 2016 à 15:46
Oui, d'un point de vue logique on pourrait mettre
((n Mod 4 = 0) Et (n Mod 100 # 0)) OU (n Mod 400 = 0)
, c'est d'ailleurs ce que fait le corrigé que tu nous as donné.

Mais d'un point de vue informatique, il faut savoir que l'on a généralement des coupes-circuit lors des conditions booléennes. C'est à dire que si on a un ET et que la veur de gauche est FAUX alors on ne va même pas essayer de calculer la valeur de droite car on sait que de toute façon FAUX ET autre chose, ce sera toujours FAUX. De même si on a VRAI OU quelque chose, ça donnera toujours vrai.

En faisant
(n Mod 4 = 0) ET ((n Mod 100 # 0) OU (n Mod 400 = 0))
on a 3 chances sur 4 d'avoir faux pour (n Mod 4 = 0), donc on ne calculera le reste que dans un cas sur 4. Puis on va regarder (n Mod 100 # 0), qui sera vrai dans 99 cas sur 100, donc on ne calculera (n Mod 400 = 0) que dans 1 cas sur 100.

Alors qu'en faisant
(n Mod 400 = 0) OU ((n Mod 100 # 0) ET (n Mod 4 = 0))
qui était proposé dans le corrigé, on évaluera (n Mod 400 = 0) qui sera faux dans 399 cas sur 400, forçant le programme à évaluer (n Mod 100 # 0) qui sera vrai dans 99 cas sur 100, donc au calculera (n Mod 4 = 0) c'est à dire qu'on aura fait dans la plupart des cas les 3 calculs, alors qu'en choisissant un ordre plus malin on aurait pu n'en faire que 1 ou 2.

En moyenne le nombre de calculs
x Mod y
seront donc :
  • (n Mod 4 = 0) ET ((n Mod 100 # 0) OU (n Mod 400 = 0))
    → 1,26 calcul/entier
  • (n Mod 400 = 0) OU ((n Mod 100 # 0) ET (n Mod 4 = 0))
    → 2,9875 calcul/entier
0
Très bonne explication, je vous remercie.
0