Débutant : Tester un programme [Résolu/Fermé]

Signaler
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
-
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
-
Salut à tous et toutes ! :D Je débute en programmation et j'aimerai tester mon programme. Je viens de suivre ces consignes :

"Le but de notre programme est de déterminer si une année saisie par l'utilisateur est bissextile. Il s'agit d'un sujet très prisé des enseignants en informatique quand il s'agit d'expliquer les conditions. Mille pardons, donc, à ceux qui ont déjà fait cet exercice dans un autre langage mais je trouve que ce petit programme reprend assez de thèmes abordés dans ce chapitre pour être réellement intéressant.

Je vous rappelle les règles qui déterminent si une année est bissextile ou non (vous allez peut-être même apprendre des choses que le commun des mortels ignore).

Une année est dite bissextile si c'est un multiple de 4, sauf si c'est un multiple de 100. Toutefois, elle est considérée comme bissextile si c'est un multiple de 400. Je développe :

Si une année n'est pas multiple de 4, on s'arrête là, elle n'est pas bissextile.

Si elle est multiple de 4, on regarde si elle est multiple de 100.

Si c'est le cas, on regarde si elle est multiple de 400.

Si c'est le cas, l'année est bissextile.

Sinon, elle n'est pas bissextile.

Sinon, elle est bissextile.
"

Et je me suis retrouvé a quelque chose qui est différent de la correction proposée (https://openclassrooms.com/fr/courses
Donc mon programme est terminé, j'aimerai savoir comment vous le montrer (autre que par une capture d'écran). Et aussi comment tester une autre année que celle entrée au départ (2009 dans ce cas ci, qui n'est pas une année bissextile)

En attendant, voilà ce que j'ai fait http://www.noelshack.com/2013-36-1378657820-sans-titre.png
J'ai encadré en rouge ce que je pense juste.

Je n'ai non plus pas très bien compris le principe de la fonction input.


Voila merci d'avance ! Je précise que c'est la première fois que je me lance dans la programmation, ca fait 2h que je lis le tutoriel sur le site du zéro, donc soyez indulgent SVP :D

14 réponses

Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> année=input("Saisissez une année : ")
Saisissez une année : 2009
>>> année=int(année)
>>> type(année)
<class 'int'>
>>> if année%4==1:
... bissextile=False
... elif année%4==0 and année%100==0:
... bissextile=True
... elif année%400==0:
... bissextile=True
... else:
... bissextile=False
...
>>> if bissextile:
... print("L'année est bissextile")
... else:
... print("L'année n'est pas bissextile")
...
L'année n'est pas bissextile


Voila un copier/Coller tout bête ^^
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63598 internautes nous ont dit merci ce mois-ci


Bonsoir,

input est une fonction permettant une demande à un utilisateur. Cette fonction renvoie une chaine de caractères.

Pour travailler sur des nombres tu devras convertir ta chaine en entier, d'où la fonction int(chaine) dans ton code.

annee = input("Entrer année : ")
annee = int(annee)

sera équivalent à

annee = int(input("Entrer année : "))

Résultat un nombre!

On attaque ensuite l'algorithme concernant l'année bissextile.

Selon wikipedia, les années bissextiles sont

divisibles par 4 et non par 100
ou
divisibles par 400

Si on réfléchit un peu, en gros une année bissextile c'est divisible par 4 et soit divisible par 400 ou pas divisible par 100.

Au niveau opération ça donne ceci

annee % 4 == 0 and (annee % 100 != 0 or annee % 400 == 0)

Ce qui donne un code facile à compléter

annee = int(input("Entrer une année : "))
if annee % 4 == 0 and (annee % 100 != 0 or annee % 400 == 0):
print("annee bissextile")
else:
print("annee non bissextile")

Voilà en espérant t'avoir aidé...

Bonne continuation.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63598 internautes nous ont dit merci ce mois-ci

Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
Effectivement, ça corrige ma faute. Je partais du principe qu'une année bissextile est divisible par 100. D'où mes résultats illogiques.

#Juloblairot : en combinant le script que je t'ai donné et celui, tu obtiendras le programme que tu désires.
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
UP svp !
Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
Hello !

Ceci peut t'aider:

entier = 0 # variable égale à 0 ou 1. Initialisée à 0.
reponse = [ ] # liste contenant le résultat final

## Fonction vérifiant si le nombre entré est une annee bissxetile ##
def test_bissextile(year): # 'year' la variable d'entrée
resultat = [ ] # liste qui sera rempli au fur et à mesure du diagnostic
resultat.append(" ****Debut du test sur " + str(year) + "****\n")
if float(year) % 4 == 0: # Si le reste de la division par 4 est nul
resultat.append(" " + str(year)+ " est un multiple de 4.\n")
if float(year) % 100 == 0: # Si le reste de la division par 100 est nul
resultat.append(" " + str(year)+ " est un multiple de 100.\n")
if float(year) % 400 == 0: # Si le reste de la division par 400 est nul
resultat.append(" " + str(year)+ " est un multiple de 400.\n")
resultat.append(" " + str(year)+ " est une annee bissextile.\n")
else:# sinon
resultat.append(" " + str(year)+ " n'est pas un muiltiple de 400.\n")
resultat.append(" " + str(year)+ " n'est pas une annee bissextile.\n")
else:# sinon
resultat.append(" " + str(year)+ " n'est pas un muiltiple de 100.\n")
resultat.append(" " + str(year)+ " n'est pas une annee bissextile.\n")
else:# sinon
resultat.append(" " + str(year)+ " n'est pas un muiltiple de 4.\n")
resultat.append(" " + str(year)+ " n'est pas une annee bissextile.\n")

resultat.append(" ****Test terminé****\n\n")
return resultat



## On vérifie si la variable entrée est un entier ##
while entier == 0: # Tant que entier = 0
annee = raw_input("Entrez une une annee: \n")
try:
int(annee)
entier = 1 # Si 'annee' est bien un entier, dans ce cas entier = 1 et on sort de la boucle;
reponse = test_bissextile(annee)
for elem in reponse:
print elem
break # permet de sortir de la boucle
except ValueError: # Si 'annee' n'est pas un entier, on boucle
print "Entrez un nombre s'il vous plaît."


N'hésite pas à me dire ce que tu ne comprends pas ;)
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Alors merci à toi d'abord ! :D

Et ensuite, j'ai pas encore vu toutes les fonctions que tu utilises.

resultat.append(" " + str(year)+ " est un multiple de 100.\n")
if float(year) % 400 == 0:



Que signifie resultat.append ? Et pourquoi mettre des guillemets sans rien dedans ? Pareil, str(year) c'est juste pour afficher l'année (en précisant que c'est du type string c'est celà ?)
Pourquoi tu n'utilises pas print dans ce type de ligne ?

float correspond aux nombres a virgules (donc non multiple de 400 dans ce cas là) c'est ca ?
if float(year) %400==0: correspond à if année%400==0: non ? Pourquoi tu indiques le type de variable a chaque fois ? (il me semble qu'en C, il faut toujours rentrer le type de la fonction, c'est pour celà ?)



Pour la deuxième partie, correspondant à "si la variable entrée est un entier" :
Que signifie raw_input ?
Try est mis pour faire un test ? Quelle différence entre try et if alors ?

reponse = test_bissextile(année) ca signifie "si l'année est bien un entier alors, faire le test année bissextile au dessus. C'est ca ?

ExceptValueError: On autorise des valeurs fausses ? Je ne comprends pas cette ligne non plus ^^


Beaucoup de questions je suis désolé mais je débute vraiment. Merci de ton aide !
Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
Hello !!!

Effectivement il y a beaucoup de questions !!
Du coup ma question c'est : as-tu testé le script ?? Si oui, pourquoi ne pas ne l'avoir modifié en fonction de tes question ? :)

Je vais néanmoins répondre à quelques unes de tes questions :

1.
`resultat.append(" " + str(year)+ " est un multiple de 100.\n")'

`resultat' est une liste (
resultat = [ ] # liste qui sera rempli au fur et à mesure du diagnostic
). Sous python, pour ajouter un élément dans une liste, il faut utiliser la fonction `append()'. Donc j'ajoute la chaîne de caractères " " + str(year)+ " est un multiple de 100.n" à la liste `resultat'.

Les guillemets sans rien dedans c'est simplement pour faire jolie lors de l'impression dans la console :) ça représente un « espace ». Donc tu peux les supprimer si tu en as envie.

La fonction `str()' appliquée à la donnée `year' permet de convertir `year' en string (= chaîne de caractères).

Concernant les `print'. Je te laisse remplacer les `resultat.append()' par des `print' et de voir le résultat (c'est toujours mieux de tester :) ).


2.
`raw_input()'

C'est une fonction qui renvoie toujours une chaîne de caractères. Elle joue le même rôle que `input()' (tu peux donc le remplacer les intervertir). A partir de là, tu devrais réaliser que le nombre entré par l'utilisateur, arrive dans le script comme une chaîne de caractères (string). Il me faut donc convertir cette chaîne en nombre (réel : `float( )' ; entier : `int( )') pour effectuer le prochain calcul.
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Ton script ? Non je ne l'ai pas testé désolé ^^
Le mien je l'ai testé mais je n'allais pas retaper tout le programme a chaque fois que je voulais tester. Du coup j'ai essayé pour 2008 et 2009 et l'année est affichée non bissextile

D'accord pour "append()" je n'avais pas encore vu.

D'accord pour raw_input. Je comprends mieux du coup
Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
3.
`if float(year) % 400 == 0:'

Donc je répète, `float(year)' convertit converti la donnée entrée en nombre. Avec le modulo (`%') on vérifie le reste de la division. En gros, ici la condition du `if' signifie : « Si le reste de la division year/400 est nul, alors : »


4.
`try......except'  

`Try' te permet de tester un condition, si elle est respectée, tu agis ! Si elle ne l'est pas (`except'), bin tu agis mais d'une autre façon.
Dans mon script, `try/except' te permet de savoir si l'utilisateur a bien entré un nombre entier. Et si ce n'est pas le cas (`ValueError'), je préviens l'utilisateur par un `print'.
Pour moi c'est beaucoup plus intéressant d'utiliser ça plutôt qu'un `if/else'.
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Ok pour le float(year). Je peux rentrer dès le début year en tant que nombre comme ça il n'est pas besoin de le répeter a chaque fois (sauf si je veux le repasser en str). C'est cela ?

D'accord je comprends. Mais je ne vois pas trop la différence avec le if/else du coup.
Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
Et enfin:

5.
`reponse = test_bissextile(année)'

Cette ligne seule, te dit simplement que la variable `reponse' est le résultat de la fonction `test_bissextile' appliquée à la variable `annee'.



Voilà !!!

si tu as d'autres questions, n'hésites pas.

Conseil: testes les limites du script ;)
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
D'accord merci ! Très complet comme réponses merci beaucoup !
Il y a plusieurs choses que je n'ai pas vue pour le moment, ca me restreint donc a une ou deux possibilités je crois.
Encore merci !
Je re test mon script mais cette fois en le définissant pour pouvoir réessayer de le réutiliser.

Je peux faire le même départ :

année=input("Saisissez une année : ") 
Saisissez une année : 2009
>>> année=int(année)
def test_bissextile(année):
if année%400==0:
Et je recopie mon code. Je test de suite !
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
J'avais oublié de rajouter bissextile=str au début.
Avec 2003 l'année est affichée bissextile.
Je n'arrive pas a relancer le programme...

année=2003
test_bissextile(année) #Ne fonctionne pas
test_bissextile(2003) #ne fonctionne pas non plus mais normal
Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
Que donne ton script actuellement? (tu peux me l'envoyer en inbox)
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
D'accord je t'envoie ca
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Bon bah j'abandonne là ^^ Ca fait bien une petite heure que je cherche, je ne trouve pas comment faire une chose assez simple

Je veux faire un programme qui trouve, à partir d'une valeur que l'utilisateur choisi, la première année bissextile.
Exemple si je tappe 2001, je veux qu'il me dise que 2001 n'est pas bissextile mais que 2004 l'est

# -*-coding:Latin-1 -*

import os

bissextile=str

année=input("Saisissez une année de départ : ")
année=int(année)


if année%400==0 or (année%4==0 and année%100==0):
bissextile=True
else:
bissextile=False

if bissextile:
print("BISSEXTILE")

else:
while bissextile is not True:
print(année+1)
année+=1


os.system("pause")


Voila, j'ai un problème avec ma boucle while. Mais je n'arrive pas à comprendre comment faire ca. J'ai déjà essayé de rajouter un

if bissextile is True:
break


mais ca ne marche pas. Merci de l'aide possible !

N'essaie pas, fais le ou ne le fais pas.
Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
Re-hello !

Hum... ça doit te faire un genre de boucle infinie, non? (ou rien peut-être...).

Pourquoi ne pas faire au plus simple:

annee_entree = input("Entrez une annee: \n")
annee = int(annee_entree)

## Fonction vérifiant si le nombre entré est une annee bissxetile ##
def test_bissextile(annee):
if (annee % 4 == 0) and (annee % 100 == 0) and (annee % 400 == 0):
pass
else:# sinon
annee = test_bissextile(annee+1)
return annee

#----------- Programme principale -----------#
annee = test_bissextile(annee_entree)

if annee != annee_entree:
print " " + str(annee_entree) + " n'est pas bissextile.\n"
print " mais " + str(annee) + " est bissextile.\n"
else:
print " " + str(annee) + " est bissextile.\n"

ça devrait marcher nickel.
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Ca a l'air plus simple en effet ^^
Oui ca me fait une boucle infinie en mettant 2002 2003 2004 etc...

Que signifie le
pass
?
Le
return annee
signifie qu'il faut reccommencer la boucle pour année+1 c'est ca ?

Je peux mettre les deux parties du programme sur le meme blocnote ?
Messages postés
146
Date d'inscription
mardi 25 juin 2013
Statut
Membre
Dernière intervention
2 septembre 2014
11
Le "pass" permet de sortir de la boucle if quand la condition est respectée. Donc en gros, si l'année est bissextile, tu sors de la boucle if et la fonction retourne l'année.

"return annee" c'est la fin de la fonction "test_bissextile. Lorsque l'année est bissextile, la fonction te la "sort" (d'où la ligne annee = test_bissextile(annee_entree) dans le programme principal).

On retourne dans la fonction "test-bissextile" que si l'année donnée n'est pas bissextile (d'où le else : annee = test_bissextile(annee+1) ).

Ensuite oui tu peux mettre ces deux parties dans un même fichier où simplement garder la fonction dans un fichier et utilise la partie "programme principal" dans la console.

Je te conseille de tester le script et de le changer à ton aise si tu ne comprends pas certaines choses.
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Ahhhhh c'est pour ca que mon prog' ne marchait pas. Je pensais que si la condition était valide, la boucle était automatiquement close (d'ou la boucle infinie que j'ai faite)
Ok pour le return

D'accord, j'ai compris, merci ! :) Si j'ai une idée de programme a créer pas trop difficile, je m'y met !
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
D'accord merci à toi :) C'est plus simple en effet !

Simplement, je ne comprends pas la différence entre
année%100==0
et
année%100 !=0 

"Simplement, je ne comprends pas la différence entre

année%100==0

et

année%100 !=0 "


annee % 100 == 0 -> annee est divisible par 100

annee % 100 != 0 -> annee n'est pas divisible par 100

En fait annee % 100 va retourner le reste de la division annee / 100
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
D'accord ! Donc année%100 !=0 revient a dire année%100==1 c'est celà ?
Utilisateur anonyme
Non, tout simplement que le reste de la division est différent de 0, je vois pas en quoi le fait de dire différent soit gênant, si ?
Messages postés
1286
Date d'inscription
dimanche 4 avril 2010
Statut
Membre
Dernière intervention
21 mai 2019
76
Euh nan du tout mais je voulais savoir si ca correspondait a la meme chose, mais non au final, j'ai relu une partie du tuto
Merci !