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 :

programme détermiant la date du prochain vendredi 13. [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 18
    Points
    18
    Par défaut programme détermiant la date du prochain vendredi 13.
    Bonjour,
    Voilà, je suis étudiant et débute en programmation avec Python.
    J'aimerais écrire un programme permettant d'afficher le prochain vendredi 13 connaissant la date d'aujourd'hui.
    J'ai quelques idées, j'ai écrit un programme mais il ne fonctionne pas ! J'aimerais donc avoir votre avis là-dessus afin de comprendre le problème.
    le programme est en pièce jointe pour ceux qui veulent tester

    sinon le voici:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    js="lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"
    j=input("Entrer le jour: ")
    d=int(input("Entrer la date du jour: "))
    m=int(input("Entrer le numéro du mois: "))
    a=int(input("Entrer l'année: "))
    k=0
    M30=[4,6,9,11]
    M31=[1,3,5,7,8,10,12]
    while j!=js[k]:
            k=k+1
    print(k)
    if a%400==0 or a%4==0 and a%100!=0:
            while m<=12:
                    if m in M30: #si m est un mois de 30j
                            while js[k%7]!=js[4] or d!=13 and d<31:
                                    if js[k%7]==js[4] and d==13:
                                            print(m%12,a)
                                    k=k+1
                                    d=d+1
                            m=m+1
     
                    elif (m%12) in M31:
                            while js[k%7]!=js[4] or d!=13 and d<32:
                                    if js[k%7]==js[4] and d==13:
                                            print(m%12,a)
                                    k=k+1
                                    d=d+1
                            m=m+1
                    else:
                            while js[k%7]!=js[4] or d!=13 and d<30:
                                    if js[k%7]==js[4] and d==13:
                                            print(m%12,a)
                                    k=k+1
                                    d=d+1
                            m=m+1
            m=m%12        
    else:
            while m<=12:
                    if m in M30: #si m est un mois de 30j
                            while js[k%7]!=js[4] or d!=13 and d<31:
                                    if js[k%7]==js[4] and d==13:
                                            print(m%12,a)
                                    k=k+1
                                    d=d+1
                            m=m+1
     
                    elif (m%12) in M31:
                            while js[k%7]!=js[4] or d!=13 and d<32:
                                    if js[k%7]==js[4] and d==13:
                                            print(m%12,a)
                                    k=k+1
                                    d=d+1
                            m=m+1
                    else:
                            while js[k%7]!=js[4] or d!=13 and d<29:
                                    if js[k%7]==js[4] and d==13:
                                            print(m%12,a)
                                    k=k+1
                                    d=d+1
                            m=m+1
            m=m%12

    ven.13.py

    Voilà, je vous remercie par avance

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En Python, il y a plein de modules intéressants qui permettent de faire beaucoup de choses facilement: il faut les utiliser!

    Par exemple, il y a le module "datetime" qui permet de faire tes calculs sans effort:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import datetime
     
    date = datetime.date.today()
    print("Date du jour:", date)
     
    njs = date.weekday()
    print("Numéro du jour de semaine (0=lundi):", njs)
     
    deltavend = (7-njs+4)%7
    print("A ajouter pour avoir le vendredi suivant:", deltavend)
     
    vend = date + datetime.timedelta(deltavend)
    print("Date du vendredi suivant:", vend)
    print()
     
    print("Les 10 prochains vendredi 13 à partir d'aujourd'hui:")
    i, imax = 0, 10
    while i<imax:
        if vend.day==13:
            print(vend)
            i += 1
        vend += datetime.timedelta(7)
    Ce qui donne:

    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
    Date du jour: 2015-12-20
    Numéro du jour de semaine (0=lundi): 6
    A ajouter pour avoir le vendredi suivant: 5
    Date du vendredi suivant: 2015-12-25
     
    Les 10 prochains <vendredi 13> à partir d'aujourd'hui:
    2016-05-13
    2017-01-13
    2017-10-13
    2018-04-13
    2018-07-13
    2019-09-13
    2019-12-13
    2020-03-13
    2020-11-13
    2021-08-13

  3. #3
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Oui bonjour,
    merci de m'avoir répondu aussi rapidement,
    Je suis en fait pas autorisé par mes professeurs à utilisé certaines fonctions pré-installées de Python en tant que débutant, c'est bien pour cela que mon programme est très très long.
    Le problème c'est que je sais pas pourquoi mon script ne fonctionne pas

    Merci beaucoup

  4. #4
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Merci quand même

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    Salut,

    Citation Envoyé par tuxedo95 Voir le message
    Le problème c'est que je sais pas pourquoi mon script ne fonctionne pas
    La vraie question est de savoir pourquoi il devrait fonctionner i.e. quel algorithme utilisez-vous pour être sur que çà va fonctionner? Si l'algorithme ne fonctionne pas, sa traduction en Python ne marchera pas non plus. Et si l'algo. fonctionne on pourra alors s'assurer qu'il a été traduit correctement.
    note: si vous ne postez que du code, il faut comprendre l'algorithme que vous avez essayé de réaliser puis jauger la validité de l'algo. vs. la cohérence de sa traduction en code. Pas grand monde pourra passer autant de temps pour faire cela et çà réduit le nombre de ceux qui pourraient vous aider.

    Citation Envoyé par tuxedo95 Voir le message
    Je suis en fait pas autorisé par mes professeurs à utilisé certaines fonctions pré-installées de Python en tant que débutant, c'est bien pour cela que mon programme est très très long.
    Votre programme est long parce qu'il contient beaucoup de répétitions.
    On peut les éviter en créant des abstractions nommées "fonctions".
    Cela permet de créer un code plus lisible et comme on peut tester les fonctions indépendamment l'une de l'autre, la mise au point est plus facile.

    - W

  6. #6
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Oui, le code proposé au 1er message est trop compliqué => c'est comme ça qu'on apprend qu'avant de "pisser des lignes de code", il vaut mieux réfléchir à l'algorithme le plus adapté au problème.

    Par exemple ici, la partie complexe est, à partir de n'importe quelle date (j, m, a), de calculer la date du jour suivant.

    Voilà comment on peut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if j==[31,28+int((a%4==0 and a%100!=0) or a%400==0),31,30,31,30,31,31,30,31,30,31][m-1]:
        # traitement du jour fin de mois
        if m==12:
            j, m, a = 1, 1, a+1 # traitement du dernier jour de l'année
        else:
            j, m = 1, m+1 # traitement du dernier jour des autres mois
    else:
        j += 1 # traitement du jour en cours de mois
    A noter qu'avec Python, la conversion en entier d'un booléen est 1 pour True et 0 pour False: cela permet d'obtenir 29 jours pour février dans les années bissextiles et 28 jours pour les autres.

    A partir de la date d'aujourd'hui (j=20, m=12, a=2015) et du jour de semaine d'aujourd'hui (js=6 pour 0=lundi), calculons les 10 prochains <vendredi 13>:

    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
    i, imax = 0, 10 # on va chercher les 10 prochains vendredi 13 à partir d'aujourd'hui 
    while i<imax:
        # calcul du jour suivant
        if j==[31,28+int((a%4==0 and a%100!=0) or a%400==0),31,30,31,30,31,31,30,31,30,31][m-1]:
            # traitement du jour fin de mois
            if m==12:
                j, m, a = 1, 1, a+1 # cas particulier du dernier jour de l'année
            else:
                j, m = 1, m+1 # traitement des mois en cours d'année
        else:
            j += 1 #traitement du jour en cours de mois
     
        js = (js+1)%7 # jour de semaine suivant
     
        if j==13 and js==4:
            # on a trouvé un nouveau vendredi 13
            print(str(j)+'/'+str(m)+'/'+str(a)) 
            i += 1
    Et on trouve (c'est heureux!) les mêmes dates que précédemment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    13/5/2016
    13/1/2017
    13/10/2017
    13/4/2018
    13/7/2018
    13/9/2019
    13/12/2019
    13/3/2020
    13/11/2020
    13/8/2021
    Tu peux voir à quel point l'algorithme s'est simplifié et se comprend mieux.


    [Edit] cerise sur le gâteau, voilà comment on peut calculer le jour de semaine:

    Cf méthode 2 de https://fr.wikibooks.org/wiki/Curios...te_donn%C3%A9e

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # à partir de la date (j, m, a), on calcule js tel que 0=lundi, 1=mardi, ..., 6=dimanche 
    c = (14 - m)//12
    a2 = a - c
    m2 = m + 12*c - 2
    js = (j + a2 + a2//4 - a2//100 + a2//400 + (31*m2)//12 +6) % 7

  8. #8
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    C'est fabuleux ! Je vous remercie d'avoir "éclairci" mon esprit !
    Merci BEAUCOUP !

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 351
    Points : 36 875
    Points
    36 875
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    [Edit] cerise sur le gâteau, voilà comment on peut calculer le jour de semaine:

    Cf méthode 2 de https://fr.wikibooks.org/wiki/Curios...te_donn%C3%A9e

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # à partir de la date (j, m, a), on calcule js tel que 0=lundi, 1=mardi, ..., 6=dimanche 
    c = (14 - m)//12
    a2 = a - c
    m2 = m + 12*c - 2
    js = (j + a2 + a2//4 - a2//100 + a2//400 + (31*m2)//12 +6) % 7
    Si on sait calculer le jour de la semaine à partir d'une date, on peut regarder quel sera le jour de la semaine des différents prochains mois.
    Plutôt que d'avoir autant d'itérations que de jours, on aura une itération par mois.
    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
    def js(j, m, a):
        c = (14 - m)//12
        a -= c
        m = m + 12 * c - 2
        return (j + a + a//4 - a // 100 + a // 400 + (31 * m)// 12 + 6) % 7
     
    m, a = 12, 2015
    ix = 0
    while ix < 10:
        m += 1
        if m > 12:
            m, a = 1, a + 1
        j13 = js(13, m, a)
        if j13 == 4:
           print (13, m, a)
           ix += 1
    Citation Envoyé par tuxedo95 Voir le message
    C'est fabuleux ! Je vous remercie d'avoir "éclairci" mon esprit !
    Merci BEAUCOUP !
    Apprendre à programmer c'est comme pour le tennis ou la natation, c'est pas en regardant les autres nager ou taper dans une balle que vous allez apprendre quoi que ce soit.

    - W

  10. #10
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Oui merci pour vos conseils, mais apprendre c'est à la fois chercher par soi-même. D'où le premier code proposé par moi. Evidemment il y a du chemin à faire pour se perfectionner. Mais pour se perfectionner il faut aussi voir à quoi ressemble la perfection...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment coder "get date du dernier vendredi" ?
    Par michauko dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 05/06/2008, 09h33
  2. [Dates] Comment réupérer la date du prochain dimanche ?
    Par lolymeupy dans le forum Langage
    Réponses: 7
    Dernier message: 16/05/2008, 12h05
  3. Réponses: 3
    Dernier message: 28/08/2007, 09h52
  4. [Dates] retrouver le vendredi d'une semaine donné en php
    Par amel95140 dans le forum Langage
    Réponses: 3
    Dernier message: 04/04/2007, 17h44
  5. [Dates] date du prochain Samedi?
    Par 3psilOn dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2005, 18h52

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