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

Algorithmes et structures de données Discussion :

Nombre d'années en fonction d'un nombre de mois et du mois courant


Sujet :

Algorithmes et structures de données

  1. #1
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut Nombre d'années en fonction d'un nombre de mois et du mois courant
    Salut,
    voici mon problème :
    - j'ai un nombre de mois sur lequel s'étale un calendrier
    - j'ai un mois de départ qui est le mois courant
    - je voudrais afficher un menu de sélection des années du calendrier en fonction du nombre de mois sur lequel il s'étale

    ex :
    currentMonth = 8;
    nbMonths = 12;

    Mon menu de sélection des années devrait donc comporter deux années, 2006 et 2007.

    Au début je partais sur :
    nbYears = nbMonths / 12;
    Ce qui dans ce cas précis me donne 1 et ceci ne fonctionne que si le mois courant est janvier, 1. Comment faire pour prendre en compte le mois courant dans le calcul du nombre d'années ?

    Voici ce que j'ai fait pour l'instant mais qui me semble compliqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    currentYear = 2006;
    currentMonth = 8;
    nbMonths = 10; // Nombre de mois du calendrier
    monthsCounter = 1;
    for(nbYears = 1; monthsCounter <= nbMonths; currentMonth++) {
         if(currentMonth == 13) {
              currentMonth == 1;
              nbYears++;
         }
         monthsCounter++;
    }
    J'ai le sentiment qu'il est possible de trouver cela beaucoup plus facilement, arithmétiquement par exemple. Quelqu'un aurait-il une idée sur la question ?
    Merci d'avance et a+
    Vive les roues en pierre

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En fait, j'aurais enlevé le nombre de mois restant avant de finir l'année et tu reprends ton idée de départ (à partir de janvier donc) pour le nombre d'années restantes.

  3. #3
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    (avec toutes les paranthèses pour bien différencier l'ordre de calcul mais tu pourras en enlever )

    nbYears = (nbMonths + currentMonth) / 12 +
    ((((nbMonths + currentMonth) mod 12) == 0)?0:1)

    avec "/" représentant une division entière (pour récupérer un entier) et "mod" le modulo, donc le reste de la division

    nb au cas où sur l'opérateur ?:
    (condition booléenne)?résultat si vrai:résultat si faux
    Si la condition est égale à TRUE, la valeur utilisée sera le premier résulat indiqué, sinon le second.


    Exemple avec "currentMonth = 8;" et "nbMonths = 12;" :

    nbYears = (12+8)/12 + ((((12+8) mod 12) == 0)?0:1)
    nbYears = 20/12 + (((20 mod 12) == 0)?0:1)
    nbYears = 1 + ((8 == 0)?0:1)
    nbYears = 1 + ((FALSE) ?0:1)
    nbYears = 1+1
    donc 2

    Si tu as nbMonths=4, on obtiens
    nbYears = 12/12 + ((0 == 0)?0:1)
    nbYears = 1 +0
    donc 1, qui est le bon résultat
    --
    Arnaud DANEELS

  4. #4
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    et petite note si le résultat qui t'intéresse est une année.
    Calcule directement l'année 2007 sans passer par nbYears en faisant


    BeginYear = CurrentYear;
    EndYear = BeginYear + (nbMonths + currentMonth) / 12 -
    ((((nbMonths + currentMonth) mod 12) == 0)?1:0);

    et pour mieux expliquer l'opérateur ?: au cas où quelqu'un qui lirait se pose la question (j'ai rencontré plusieurs développeurs pro qui ne connaissaient pas) :

    ça équivaut à une fonction :

    MaFonction ( variable Cond de type Booléenne ; variable A de type Integer ; variable B de type Integer) avec une valeur de retour de type Integer
    --début--
    si Cond
    alors renvoyer A
    sinon renvoyer B
    --fin--

    en clair, un exemple :
    MaFonction (C:Bool;A:Int;B:Int) : Int
    {
    if C
    then
    return A;
    else
    return B;
    }

    utilisation :
    X = toto + MaFonction(I est un entier pair, 2, 0)
    avec X et I donnés.

    Et cela est valable avec n'importe quel type, tant que A et B sont de même type
    --
    Arnaud DANEELS

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut,
    merci beaucoup pour vos réponses.
    Je vais essayer d'appliquer la méthode de adaneels de ce pas.
    A+ ^^
    Vive les roues en pierre

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 07/05/2015, 00h12
  2. Réponses: 3
    Dernier message: 20/04/2015, 20h13
  3. Réponses: 6
    Dernier message: 05/01/2009, 11h18
  4. Réponses: 3
    Dernier message: 05/09/2006, 01h47
  5. [Interbase] Compter le nombre d'année
    Par SebCBien dans le forum InterBase
    Réponses: 3
    Dernier message: 03/01/2005, 13h23

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