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 :

1er mois de chaque trimestre entre deux dates


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut 1er mois de chaque trimestre entre deux dates
    Bonjour,

    Voici l'algorithme que j'ai du mal à mettre en place.

    On dispose de 2 dates au format JJ/MM/AAAA.
    On souhaite faire la liste des 1ers mois de chaque trimestre compris entre ces 2 dates. (Les trimestres dans lesquels sont inclus les 2 dates doivent aussi figurer).

    Comment peut-on s'y prendre ?

    Merci d'avance.
    @+
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  2. #2
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    tu peux préciser un peu plus??
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  3. #3
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    Par exemple, tu as les dates suivantes :
    - 01/01/2005
    - 20/08/2006

    Cela doit te sortir la liste :
    - 01/2005 - 01/01/2006 est dans le trimestre qui commence par ce mois
    - 04/2005
    - 07/2005
    - 10/2005
    - 01/2006
    - 04/2006
    - 07/2006 - 20/08/2006 est dans le trimestre qui commence par ce mois
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    soit a l'an départ
    soit m le mois de départ
    j le jour départ

    si j=1 et modulo(m,3)=1 alors date départ est dans la liste

    puis faire

    si m>12 alors
    a=a+1
    m=1
    fin si
    si modulo (m,3)=1 alors date 1/m/a est dans la liste
    m=m+1
    tant que date(1,m,a)< date arrivée
    Elle est pas belle la vie ?

  5. #5
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    Merci pour ton aide.

    Je suis arrivée à faire quelque chose qui marche. Voici le code des 2 fonctions nécessaires. Elles sont directement écrites en PHP mais je pense que cela reste compréhensible.

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    // les paramètres sont de type MM/AAAA
    // cela retourne un tableau associatif de type $r["01/2006"] = "1e trimestre"
    function intervalle_trimestres($debut,$fin)
    	{
    		$r = array();
    		list($mois_min,$annee_min)=explode("/",$debut);
    		list($mois_max,$annee_max)=explode("/",$fin);
     
    		// infos sur le trimestre de debut
    		$tab_deb = $this->no_trimestre_mois($mois_min);
    		$trim_debut = $tab_deb[0];
    		$mois_debut = $tab_deb[1];
     
    		// infos sur le trimestre de fin
    		$tab_fin = $this->no_trimestre_mois($mois_max);
    		$trim_fin = $tab_fin[0];
    		$mois_fin = $tab_fin[1];
     
    		// parcours des années
    		for ($index_a = $annee_min ; $index_a <= $annee_max ; $index_a++)
    		{
    				if ($index_a == $annee_min)	// si on en est à l'année de début
    				{
    					 $m_deb_trait = $mois_debut;	// mois de début		
    					 if ($index_a == $annee_max)	// si c'est la date de fin : mm année
    					 {
    							if ($trim_debut == $trim_fin)	// si mm trimestre
    							{
    									$r[sprintf("%02d", $m_deb_trait)."/".$index_a] = $trim_debut."e trimestre";
    							}
    							else
    							{
    									for ($i = $trim_debut ; $i<= $trim_fin ; $i++)	// parcours des trimestres
    									{
    											$r[sprintf("%02d", $m_deb_trait)."/".$index_a] = $i."e trimestre ".$index_a;	// 01/2005 => 1er trimestre
    											$m_deb_trait = $m_deb_trait + 3;
    									}
    							}
    						}
    						else
    						{
    								// il y a une année qui suit
    								for ($i = $trim_debut ; $i<= 4 ; $i++)	// parcours des trimestres								
    								{
    										$r[sprintf("%02d", $m_deb_trait)."/".$index_a] = $i."e trimestre ".$index_a;	// 01/2005 => 1er trimestre
    										$m_deb_trait = $m_deb_trait + 3;
    								}
    						}
    				}
    				else
    				{
    					// annee supérieure à celle du début
    					if ($index_a != $annee_max)
    					{
    							$m_deb_trait = 1;	// mois de début
     
    							for ($j=1;$j<=4;$j++)	// on remplit tous les trimestres de l'année
    							{
    									$r[sprintf("%02d", $m_deb_trait)."/".$index_a] = $j."e trimestre ".$index_a;
    									$m_deb_trait = $m_deb_trait + 3;
    							}
    					}
    					else
    					{
    							// année maximale
    							$m_deb_trait = 1;	// mois de début
     
    							// on remplit tous les trimestres de l'année
    							for ($k=1;$k<=$trim_fin;$k++)
    							{
    									$r[sprintf("%02d", $m_deb_trait)."/".$index_a] = $k."e trimestre ".$index_a;
    									$m_deb_trait = $m_deb_trait + 3;
    							}
    					}
    				}
    		}
    		$r = array_reverse($r, TRUE);
    		return $r;
    	}
     
    // fonction retournant le trimestre et le n° du 1er mois de celui ci
    	function no_trimestre_mois($p_mois)
    	{
    			$tab = array();			
    			// 1 <= m <= 3			
    			if(($p_mois >= 1) and ($p_mois <= 3))
    			{
    				$tab = array(1, 1);				
    			}
    			// 4 <= m <= 6
    			if(($p_mois >= 4) and ($p_mois <= 6))
    			{
    				$tab = array(2, 4);		
    			}
    			// 7 <= m <= 9
    			if(($p_mois >= 7) and ($p_mois <= 9))
    			{
    				$tab = array(3, 7);		
    			}
    			// 10 <= m <= 12
    			if(($p_mois >= 10) and ($p_mois <= 12))
    			{
    				$tab = array(4, 10);		
    			}
    			return $tab;
    	}
    En espérant que cela puisse aider quelqu'un.
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  6. #6
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Euh dans le genre j'aime me compliquer la vie tu as fait un beau truc.

    Bon un numéro de mois c'est un entier . Des mois il y en a 12 par an donc le nombre de mois c'est une entier.

    Pour obtenir le trimestre auquel appartient un mois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     trimestre = ( mois + 2 ) / 3
    (où '/' repésente la division entière bien entenud).

    Pour obtenir le numéro du premier mois d'un trimestre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    premier_mois = ( trimestre - 1 ) * 3 + 1
    ca me parait un peu plus court que :
    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
     
    function no_trimestre_mois($p_mois)
    	{
    			$tab = array();			
    			// 1 <= m <= 3			
    			if(($p_mois >= 1) and ($p_mois <= 3))
    			{
    				$tab = array(1, 1);				
    			}
    			// 4 <= m <= 6
    			if(($p_mois >= 4) and ($p_mois <= 6))
    			{
    				$tab = array(2, 4);		
    			}
    			// 7 <= m <= 9
    			if(($p_mois >= 7) and ($p_mois <= 9))
    			{
    				$tab = array(3, 7);		
    			}
    			// 10 <= m <= 12
    			if(($p_mois >= 10) and ($p_mois <= 12))
    			{
    				$tab = array(4, 10);		
    			}
    			return $tab;
    	}
    qu'en penses-tu?
    Chef de Projet SAP. Certifié Prince2 Practitioner
    ---------------------------------------------------
    Anakin Skywalker turned to the Dark Side after his failed attempt to upgrade R/2-D2 to R/3-D2.

  7. #7
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    En effet, j'arrive à cette fonction plus propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	function no_trimestre_mois($p_mois)
    	{
    			$trimestre = ($p_mois + 2) / 3;
    			$trimestre = substr($trimestre, 0, 1);
     
    			$premier_mois = ($trimestre - 1) * 3 + 1;
     
    			$tab = array($trimestre, $premier_mois);		
    			return $tab;
    	}
    En tout cas, merci beaucoup pour ton aide !
    Penses-tu aussi que je me suis compliquée la vie pour l'autre fonction ?
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

  8. #8
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Ben je l'ai pas regardée en détail mais pour faire la liste des premiers mois
    il faut deja faire la liste des trimestre et tu a sla fonctionqui renvois les premiers mois de chaque trimestre.
    Premiere chose
    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
     Si annee_date_1 = annee_date_2.
      |  Alors Si trimestre_date1 = Trimestre_date2
    ---> Aucun moi à afficher
      | Sinon NombreDeTrimestreAAfficher = trimestre_date2 +TrimestreDate1    
    --> on parcours les trimestre qui separe les trimestre dans lesquels sont les  
    -- >2 date ( SOit en fait le trimestre 2 ou le 3 ou le 2 et le 3)
      |
      |    Pour i Allant de trimestre_date_1+1 a trimestre Date2 +2
      |    |      afficher MoisDuTrimestre(i)
      |    |
      |     FinPour
      Sinon
    --> on affiche les trimestre en le trimestre de Date1 et la fin de l'année
      |    Pour i de (4-trimestre_date1+1) A '
      |    | afficher mois_du_trimestre(i)
      |    FinPour
    ---> On affiche tous les Premiers mois des trimestre des année séparant les 2 dates
      |  Pour annee de (annee_de_date1 +1) a (anne_de_date2-2)
      |  | Pour i de 1 a 4
      |  | |      afficher mois_du_trimestre(i)
      |   |  FinPour
      |   Fin Pour
    ---> et enfin les trimestre du debut d el'année de Date2 au triestre de Date 2
      |  Pour i de 1 à (trimestre_de_date2 -1)
      |  | afficher moois_du_Trimestre(i)
      |  Finpour
      FinSI
    Ce n'est sans doute pas optimisé mais c'est propre et ca reprend le probleme tel que tu l'exposes
    Chef de Projet SAP. Certifié Prince2 Practitioner
    ---------------------------------------------------
    Anakin Skywalker turned to the Dark Side after his failed attempt to upgrade R/2-D2 to R/3-D2.

  9. #9
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    Merci bien pour ton aide. Je pense que nous avons eu le même raisonnement cette fois-ci. Encore merci.
    N'oubliez pas le tag .
    Merci de ne pas envoyer de MP pour des problèmes techniques.

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

Discussions similaires

  1. [Dates] nombre de mois entre deux dates
    Par Mat_DZ dans le forum Langage
    Réponses: 14
    Dernier message: 23/11/2006, 16h10
  2. Nombre de mois entre deux dates
    Par boulaxx dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/09/2006, 15h22
  3. Réponses: 2
    Dernier message: 21/07/2006, 14h04
  4. [Dates] Les mois entre deux dates
    Par kagura dans le forum Langage
    Réponses: 2
    Dernier message: 28/06/2006, 11h38
  5. comment obtenir l’intervalle de mois entre deux date
    Par looc 6699 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/02/2005, 11h08

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