Je suis en train d'écrire un code qui affiche seulement True ou False selon l'heure de coucher ou de lever du soleil (sur une planète particulière) sur la base des informations suivantes, mais mon code ne convient pas pour certains cas de figure.
La fonction qui reçoit trois valeurs entières en argument : - l'heure de lever du soleil (entre 0 et 23) - l'heure du coucher du soleil (entre 0 et 23) - l'heure actuelle (entre 0 et 23)
et qui renvoie une valeur booléenne vraie si le soleil est levé à l'heure donnée en troisième argument et fausse, s'il est couché. On supposera que le soleil ne se lève et ne se couche au plus qu'une seule fois par jour. Il est toutefois possible que le lever ait lieu après l'heure du coucher, ce qui signifie dans ce cas que le soleil est levé au début de la journée, puis qu'il se couche, puis qu'il se lève à nouveau plus tard dans la journée. Enfin, si l'heure du lever est la même que l'heure du coucher : - soit toutes deux valent 12, cela signifie que le soleil ne se lève pas de la journée - soit toutes les deux valent 0, cela signifie que le soleil ne se couche pas de la journée.
Voici le code que j'ai écrit:
def soleil_leve(lever, coucher, actuelle):
actuelle >= 0 and actuelle <23
if coucher == lever == 0: # l'heure du lever est la même que l'heure du coucher
return True
elif coucher == lever == 12: # l'heure du lever est la même que l'heure du coucher
return False
elif actuelle >= lever and actuelle < coucher: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
return True
else:
return False
lever = int(input())
coucher = int(input())
actuelle = int (input())
print(soleil_leve(lever, coucher, actuelle))
Ce code marche bien avec les valeurs: (6, 18, 5), (6, 18, 10), (6, 18, 18), (6, 18, 0), (0, 0, 5), (12, 12, 0), (12, 12, 23), (15, 8, 8), (12,13,12), (12,19,8).
Il ne marche pas avec les valeurs:
(15, 8, 6) qui devrait afficher "True" mais affiche "False"
(16, 10, 23) qui devrait afficher "True" mais affiche "False"
(15, 8, 15)qui devrait afficher "True" mais affiche "False"
J'espère pouvoir trouver une solution avec votre aide.
elif actuelle >= lever and actuelle < coucher: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
et si coucher < lever? Je n'ai pas testé ceci:
if coucher < lever:
lever -= 24
Places les lignes avant le elif et remplaces le elif par un if.
-
J'ai décidé de faire le test. La bonne solution est de remplacer le elif par ceci:
elif lever<coucher and lever<=actuelle<coucher or coucher<lever and not coucher<=actuelle<lever:
- Edité par PierrotLeFou il y a environ 5 heures
Bonjour PierrotLeFou Merci de votre contribution. Votre code a effectivement résolu les problèmes que j'ai évoqués plus haut, mais il y un autre aspect qui donne un résultat contraire à celui attendu. C'est surtout quand "lever" et "coucher" valent tous 12. On devrait avoir "False" dans ce cas, mais c'est "True" qui s'affiche. Exemples:
(12, 12, 0), (12, 12, 12) et (12, 12, 23) affichent "True" alors que c'est "False" qui est attendu.
elif actuelle >= lever and actuelle < coucher: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
et si coucher < lever? Je n'ai pas testé ceci:
if coucher < lever:
lever -= 24
Places les lignes avant le elif et remplaces le elif par un if.
-
J'ai décidé de faire le test. La bonne solution est de remplacer le elif par ceci:
elif lever<coucher and lever<=actuelle<coucher or coucher<lever and not coucher<=actuelle<lever:
- Edité par PierrotLeFou il y a environ 5 heures
Bonjour PierrotLeFou Merci de votre contribution. Votre code a effectivement résolu les problèmes que j'ai évoqués plus haut, mais il y un autre aspect qui donne un résultat contraire à celui attendu. C'est surtout quand "lever" et "coucher" valent tous 12. On devrait avoir "False" dans ce cas, mais c'est "True" qui s'affiche. Exemples:
(12, 12, 0), (12, 12, 12) et (12, 12, 23) affichent "True" alors que c'est "False" qui est attendu.
PierrotLeFou
Votre code marche bien dans tous les cas de figure. C'est moi qui avait commis une erreur en gardant à la fois "return False" et "return True" après l'instruction 'elif coucher == lever == 12:'.
Je ne comprends pas les == 0 et == 12 de tes premières conditions.
Si tes heures de lever et de coucher sont égales, c'est le cas quelle que soit cette heure, pas seulement à midi ou minuit.
Je ne comprends pas les == 0 et == 12 de tes premières conditions. Si tes heures de lever et de coucher sont égales, c'est le cas quelle que soit cette heure, pas seulement à midi ou minuit.
c'est dans l'énoncé du problème
Enfin, si l'heure du lever est la même que l'heure du coucher : - soit toutes deux valent 12, cela signifie que le soleil ne se lève pas de la journée - soit toutes les deux valent 0, cela signifie que le soleil ne se couche pas de la journée.
Mais il n'y a dans ce cas besoin d'un traitement spécifique que pour le 0, pas pour le 12 qui se comporte comme n'importe quel autre nombre : a <= x < b vaudra toujours False si a == b.
C'est d'ailleurs une autre amélioration possible au code, en Python actuelle >= lever and actuelle < coucher peut plus simplement s'écrire lever <= actuelle < coucher.
Merci pour vos contributions. Je ne maîtrise pas encore l'utilisation des fonction, mais je dois écrire un autre code à la suite du précédent qui affiche les heures de 0 à 23 et qui marque d'un astérisque (*) les heures où il fait nuit. Cette-ci nous avons deux soleils (E1515 et E666). Le programme doit lire en entrée:
- l'heure de lever du soleil E1515 - l'heure du coucher du soleil E1515 - l'heure de lever du soleil E666 - l'heure du coucher du soleil E666.
Ce code va donc utiliser la fonction soleil_leve pour afficher ligne par ligne chacune des heures de la journée, depuis 0 jusqu'à 23, suivies d'une espace et d'une astérisque s'il fait nuit à cette heure. Voici par exemple ce qu'on doit afficher lorsqu'on utiliser en entrée les valeurs 6n 18, 10 et 21:
J'ai commencé à écrire le code ci-dessous, mais je suis bloqué parce que c'est la première fois que j'utilise les fonctions.
def soleil_leve(leve_E1515, coucher_E1515, leve_E666, coucher_E666, actuelle):
actuelle = coucher_E1515 == coucher_E666 # la nuit tombre quand les 2 soleils sont couchés
for actuelle in range(0, 24): # actuelle = heure actuelle pour les deux soleils
actuelle = actuelle + 1
res = actuelle + '*' # pour faire suivre les chiffres où il fait nuit d'une étoile
if coucher_E1515 == leve_E1515 == 0: # L'heure du lever est la même que l'heure du coucher pour le premier soleil mais il fait nuit
return res
elif coucher_E1515 == leve_E1515 == 12: # L'heure du lever est la même que l'heure du coucher mais il fait jour
return ()
elif leve_E1515<coucher_E1515 and leve_E1515<=actuelle<coucher_E1515 or coucher_E1515<leve_E1515 and not coucher_E1515<=actuelle<leve_E1515:
return () #pour le cas où il ne fait pas nuit
else:
return res # pour le cas où il fait nuit
if coucher_E1515 == leve_E666 == 0: # L'heure du lever est la même que l'heure du coucher pour le deuxième soleil mais il fait nuit
return res
elif coucher_E1515 == leve_E666 == 12: # L'heure du lever est la même que l'heure du coucher
return ()
elif leve_E666<coucher_E666 and leve_E666<=actuelle<coucher_E666 or coucher_E666<leve_E666 and not coucher_E666<=actuelle<leve_E666:
return () #pour le cas où il ne fait pas nuit
else:
return res # pour le cas où il fait nuit
return actuelle
leve_E1515 = int(input())
coucher_E1515 = int(input())
leve_E666 = int(input())
coucher_E666 = int(input())
print(soleil_leve(leve_E1515, coucher_E1515, leve_E666, coucher_E666, actuelle)) # pour afficher les heures de 0 à 23 avec des astérisques '*'
comme le disent PierroLeFou et josmiley, la fonction soleil_leve, c'est la même qu'à l'étape précédente.
Pour chaque heure, il faut l'appeler une fois pour le 1er soleil, et une seconde fois pour le second soleil. Ensuite, tu regardes si les 2 soleils sont couchés, tu mets un astérisque (astuce qui pourrait te servir False+False=0, True+False=1, True+True=2, sachant que Faux(False) correspond à soleil couché et Vrai(True) à soleil levé)
Merci à vous tous pour les idées que vous m'avez fournies. Toutefois, je ne vous pas toujours comment faire pour avoir les astérisques à côtés des chiffres (2* par exemple) étant donnée qu'on ne peut pas additionner chiffres et lettres.
voila par exemple ma fonction qui fonctionne, maintenant faut le programme qui va avec.
def soleil_leve(x, y, z):
if y == x == 0: # l'heure du lever est la même que l'heure du coucher
return True
elif y == x == 12: # l'heure du lever est la même que l'heure du coucher
return False
elif x<y and x<=z<y or y<x and not y<=z<x: # L'heure actuelle est entre l'heure du lever et l'heure du coucher
return True
else:
return False
Merci d'avance pour vos précieux conseils et aides
- Edité par pourtanteltourne 26 avril 2024 à 15:28:27
ça serait mieux en donnant des noms explicites aux variables.
Ton code répond à la demande initiale (qui a été résolu au cours du sujet) mais il y a eu une demande pour un second problème issu du 1er, dans le cas où il y a 2 soleils (en espérant que la personne revienne près de 4 ans après sa demande initiale)
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Python c'est bon, mangez-en.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Python c'est bon, mangez-en.
Le Tout est souvent plus grand que la somme de ses parties.
Python c'est bon, mangez-en.
Le Tout est souvent plus grand que la somme de ses parties.