IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Apprentissage]Tuto de Swinnen


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut [Apprentissage]Tuto de Swinnen
    Comme annoncé dans ma présentation: "J'ai besoin de vous!"
    Tout ce passe plutôt bien pour mes débuts avec le tuto. Mais j'ai ce script qui m'interroge. Je crois que j'ai fait plus compliqué que nécessaire mais j'ai pas pu faire mieux. Qu'en pensez-vous?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    # -*- coding: iso-8859-15 -*-
    #Ecrivez un programme qui convertisse un nombre entier de secondes fourni
    #au départ, en un nombre d'années, de mois, de jours, de minutes et de secondes.
    #(Utilisez l'opérateur modulo : % ). J'en ai bavé.
     
    a=43707862               #Secondes données au départ par moi
    b=31536000               #Secondes dans une année
    c=2592000                #Secondes dans un mois de 30 jours
    d=86400                  #Secondes dans un jour, attention il n'y a pas d'heure.
    e=60                     #Secondes dans une minute
     
    if a%b>0:                                                #modulo sec totale, sec*an >0
        print (a-a%b)/b,"an(s)",                             #impossible à expliquer dans un langage humain!
        if a%b%c>0:
            print (a%b-a%b%c)/c,"mois",                      #ma méthode est sans doute trop compliquée
            if a%b%c%d>0:
                print (a%b%c-a%b%c%d)/d,"jours",
                if a%b%c%d%e>0:
                    print (a%b%c%d-a%b%c%d%e)/3600,"minutes",
                    print a%b%c%d%e, "secondes"
    Résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IDLE 1.2.2      ==== No Subprocess ====
    >>> 
    1 an(s) 4 mois 20 jours 21 minutes 22 secondes
    >>>

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Tu as saisi le principe, mais je te conseille de passer par des variables intermédiaires, histoire de rendre ton code plus lisible, en plus ça te permet d'éviter d'imbriquer plein de niveaux, si tu ne veux pas afficher le superflu, teste à la fin

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonjour,

    Ce n'est pas tout à fait juste. Qu'essaies-tu de faire avec ces tests ? Ne pas afficher les valeurs à 0 ? Ce n'est pas l'effet que ça a dans ton code. Ton premier test vérifie que a n'est pas un multiple de b sinon ton programme n'affiche rien. Donc si tu mets dans a, par exemple, le nombre de secondes correspondant à deux ans ton code n'affichera rien.

    Ensuite, l'opérateur / correspond à la division entière lorsque ses deux arguments sont des entiers (pour l'instant du moins, plus tard il faudra utiliser //). Donc (a-a%b)/b est égal à a/b tout simplement.

    La division par 3600 est bizarre... C'est le nombre de secondes dans une heure mais tu n'affiches pas d'heures. Je me demande si ce n'est pas un oubli dans l'énoncé...

    Il reste le petit problème que tu as défini le mois à 30 jours, et l'année à 365 jours (au lieu de 12 mois). Tu pourras donc avoir des réponses comme (1 an 12 mois 3 jours 1240 minutes 6 secondes).

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    Merci oiffrig pour ta réponse,

    Je me disais bien qu'il fallait simplifier mais je ne comprend pas pourquoi tu dis qu'il faut tester à la fin.

    Merci Dividee,
    Qu'essaies-tu de faire avec ces tests ? Ne pas afficher les valeurs à 0 ?
    Non, justement éviter d'avoir des valeurs du type 1an, 12 mois, 37 jours, etc.... Si a%b>0, j'ai donc un reste en secondes (si j'ai bien compris l'usage du modulo), ce qui m'intéresse pour la suite, si la valeur est = 0, je n'ai que des années pleines.
    Ensuite, l'opérateur / correspond à la division entière lorsque ses deux arguments sont des entiers (pour l'instant du moins, plus tard il faudra utiliser //). Donc (a-a%b)/b est égal à a/b tout simplement.
    Là y'a un problème en effet, je comprend ton argument, j'ai vérifié les calculs.
    La division par 3600 est bizarre... C'est le nombre de secondes dans une heure mais tu n'affiches pas d'heures. Je me demande si ce n'est pas un oubli dans l'énoncé...
    Il n'y a pas d'heure demandée dans l'énoncé en effet. Mais il doit y avoir moyen de faire le calcul des heures sans les afficher.

    J'ai vérifié la somme de mon résultat, eh ben c'est faux, j'aurais du le faire avant.

    Bon, j'y retourne.

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par jargenty Voir le message
    Si a%b>0, j'ai donc un reste en secondes (si j'ai bien compris l'usage du modulo), ce qui m'intéresse pour la suite, si la valeur est = 0, je n'ai que des années pleines.
    Et si tu n'as que des années pleines, tu dois juste afficher le nombre d'années, non ? Mais comme tu fais le test avant d'afficher le nombre d'années, si tu n'as que des années pleines ton programme n'affichera rien du tout.

    Citation Envoyé par jargenty Voir le message
    Là y'a un problème en effet, je comprend ton argument, j'ai vérifié les calculs.
    Il n'y a pas d'heure demandée dans l'énoncé en effet. Mais il doit y avoir moyen de faire le calcul des heures sans les afficher.
    Je pense qu'on interpète l'énoncé de façon différente; pour moi, si on ne demande pas d'heures il ne faut pas les calculer, du coup, vu qu'il faut bien tenir compte des secondes qui se sont passées, on peut se retrouver avec un nombre de minutes > 60, par exemple 1240 min (=20 heures et 40 minutes). Vu qu'il s'agit certainemement d'un oubli dans l'énoncé, je te conseille de calculer le nombre d'heures et de l'afficher; le problème a plus de sens ainsi de toute façon.

    Tu ferais bien d'utiliser des variables pour stocker les résultats intermédiaires, comme l'a dit oiffrig, et de leur donner des noms plus expressifs que a,b,c,d. Cela facilitera la compréhension de l'algorithme (et sa mise au point).

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Par défaut
    OK, mais sacré nom, la marche est haute pour un néophyte.

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Avec une variable intermédiaire, c'est effectivement plus simple à lire. J'ai ajouté les heures, mais il te sera facile de les retirer si nécessaire (sans les heures, on trouve 1264 minutes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    a=43707862               #Secondes données au départ par moi
    b=31536000               #Secondes dans une année
    c=2592000                #Secondes dans un mois de 30 jours
    d=86400                  #Secondes dans un jour, attention il n'y a pas d'heure.
    e=60                     #Secondes dans une minute
     
    f=3600                   # Secondes dans une heure
     
    ans=a//b
    reste=a % b
     
    mois=reste//c
    reste=reste % c
     
    jours=reste//d
    reste=reste % d
     
    heures=reste//f
    reste=reste % f
     
    minutes=reste//e
    secondes=reste % e
     
    print ans, "an(s)", mois, "mois", jours, "jours", heures, "heures", minutes, "minutes", secondes, "secondes"
     
    # affiche: 1 an(s) 4 mois 20 jours 21 heures 4 minutes 22 secondes
     
    # Vérification:
    print secondes + minutes*60 + heures*3600 + jours*86400 + mois*2592000 + ans*31536000
     
    # affiche bien: 43707862 secondes
    On pourrait aussi utiliser divmod() qui calcule en même temps la division entière et le reste et renvoie un tuple composé des 2 résultats.

    Tyrtamos

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dividee Voir le message
    Tu ferais bien d'utiliser des variables pour stocker les résultats intermédiaires, comme l'a dit oiffrig, et de leur donner des noms plus expressifs que a,b,c,d. Cela facilitera la compréhension de l'algorithme (et sa mise au point).
    Voici un exemple de variable plus expressif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sec={
       "mn" : 60,
       "hh" : 3600,
       "d" : 86400,
       "m" : 2592000,
       "y" : 31536000,
    }
    Puis tu utilises sec["mn"], sec["m"] etc dans tes calculs...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [Python 2.X] Mise en place CGI tuto livre swinnen
    Par P.G dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 16/02/2015, 00h38
  2. [Inutile] Vos solutions pour l'exo 8.32 du tuto de Swinnen
    Par PauseKawa dans le forum Général Python
    Réponses: 1
    Dernier message: 21/02/2011, 00h40
  3. apprentissage non supervisé .......
    Par ratbert dans le forum Statistiques, Data Mining et Data Science
    Réponses: 7
    Dernier message: 22/02/2008, 12h23
  4. apprentissage du C est-il necessaire pour C++ ?
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 02/05/2002, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo