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

Ada Discussion :

Erreur à l'exécution : calcul veille et lendemain d'une date


Sujet :

Ada

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Erreur à l'exécution : calcul veille et lendemain d'une date
    Bonjour à tous

    Pratiquant l'Ada en faculté, j'ai dû réaliser un petit code permettant de determiner le lendemain et la veille d'une date donnée.

    J'ai pour cela utilisé plusieurs (voire tout un tas) de procédures pour notamment savoir si l'année est bisextille, le nombre maximum de jours en un mois...

    Le programme me demande d'entrer une date, puis écrit la date du lendemain et de la veille.

    La compilation fonctionne, mais à l'execution....
    Ca ressemble plutot à ça :
    23
    mai
    1990
    24 -- ça devrait être le lendemain

    -1075651064
    22 -- ça devrait être la veille lendemain

    -1075651064

    A noter que la date du lendemain est bonne si je met par exemple le 31 mars 165 et celle de la veille si je mets le 1 janvier 1990...

    Ainsi, si quelqu'un à la moindre idée d'ou pourrait provenir le problème, je lui
    en serais reconnaissant ^^.
    Je soupçonne pour ma part un problème dans les procèdures demain et veille, sûrement lié à l'utilisation de pred et succ, qui me paraît pourtant juste ici..

    Merci à tous de votre attention.

    Le code en question:
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    with ada.text_io;
    with ada.integer_text_io;
    
    procedure exodate is
    subtype Tjour is positive range 1..31;
    type Tmoi is (jan,
    	fev,
    	mar,
    	avr,
    	mai,
    	jui,
    	jul,
    	aou,
    	sep,
    	oct,
    	nov,
    	dec);
    subtype Tannee is integer;
    type Tdate is record
    jour: Tjour;
    moi: Tmoi;
    annee: Tannee;
    end record;
    package p_moi is new ada.text_io.enumeration_io(Tmoi);
    
    
      FUNCTION bisextille(
    	annee: Tannee) 
    RETURN boolean IS --année bisextille si div par 4 et pas par 100 OU div par 400
    BEGIN
    RETURN (annee rem 4 = 0 and annee rem 4 /= 0) OR (annee rem 400 = 0);
    END bisextille;
    
      FUNCTION maxjour(
    	moi: Tmoi;
    	annee: Tannee)
    RETURN Tjour is
    BEGIN
    	CASE moi IS
    	WHEN jan|mar|mai|jul|aou|oct|dec => RETURN 31;
    	WHEN avr|jui|sep|nov => RETURN 30;
    	WHEN fev => 
    		IF bisextille(annee) THEN RETURN 29; 
    		ELSE RETURN 28; 
    		END IF;
    	END CASE;
    END maxjour; 
    
    
    -- PROCEDURE ENCORE NON UTILISEE
      FUNCTION validdate( -
    	date: Tdate)
    RETURN boolean IS 
    BEGIN
    -- la seule vérification à fair concerne le nombre de jour
    -- le sous-type moi limite sa valeur de 1 à 12 et j'estime
    -- qu'on peut prendre n'importe quel entier pour une année.
    
    	IF date.jour > maxjour(date.moi,date.annee) THEN RETURN FALSE;
    	ELSE RETURN TRUE;  END IF;
    END validdate;
    -----------------------------
    
      PROCEDURE lendemain(
    	auj: in Tdate;
    	demain: out Tdate) IS
    BEGIN
    	IF auj.jour = maxjour(auj.moi,auj.annee) THEN  
    	demain.jour := 1;
    	  IF auj.moi = dec THEN  
    	  demain.moi:=jan;
    	  demain.annee:= auj.annee + 1;
    	  ELSE
    	  demain.moi := Tmoi'Succ(auj.moi);
    	  END IF;
    	ELSE
    	demain.jour := auj.jour + 1;
    	END IF;
    END lendemain;
    
      PROCEDURE veille(
    	auj: in TDate;
    	hier: out Tdate) IS
    BEGIN
    	IF auj.jour = 1 THEN
    	  IF auj.moi = jan THEN 
    	  hier.moi:=dec; 
    	  hier.annee:= auj.annee - 1;
    	  hier.jour := 31;
    	  ELSE
    	  hier.moi := Tmoi'Pred(auj.moi);
    	  hier.jour := maxjour(Tmoi'Pred(auj.moi),auj.annee);
    	-- demain étant en out, je ne peux l'utiliser pour l'appel de ma fonction
    	  END IF;
    	ELSE
    	hier.jour := auj.jour - 1;
    	END IF;
    END veille;
    
      PROCEDURE affich(
    	date: in  Tdate) IS
    BEGIN
    ada.integer_text_io.put(date.jour,2);
    ada.text_io.new_line;
    p_moi.put(date.moi);
    ada.text_io.new_line;
    ada.integer_text_io.put(date.annee,4);
    ada.text_io.new_line;
    END affich;
    
      PROCEDURE lire(
    	date:  out Tdate) IS
    BEGIN
    ada.integer_text_io.get(date.jour);
    p_moi.get(date.moi);
    ada.integer_text_io.get(date.annee);
    END lire;
    
    --/\  VALEURS DE TEST /\
    --------------------------
    test1, Test2: Tdate;
    --------------------------
    
    BEGIN
    lire(test1);
    lendemain(test1, test2);
    affich(test2);
    veille(test1, test2);
    affich(test2);
    END exodate;

  2. #2
    Invité
    Invité(e)
    Par défaut
    salut,

    Entre autre, il semble que tu ais oublié d'affecter l'année dans veille et lendemain.

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Mea culpa, j'ai fait une erreur bien basse la / =.
    Le pire étant que je n'aurais jamais pensé que ce soit aussi simple..
    Merci beaucoup pour ton aide!

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

Discussions similaires

  1. Erreur à l'exécution lors de la creation d'une fenetre
    Par jmc18100 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 04/06/2015, 15h18
  2. Calcul du semestre à partir d'une date
    Par mohamed_ dans le forum SAS Base
    Réponses: 8
    Dernier message: 01/06/2015, 10h19
  3. [XL-2003] Calcul nombre après et avant une date
    Par franckym44 dans le forum Excel
    Réponses: 4
    Dernier message: 31/05/2013, 12h27
  4. Aide pour un script qui calcule le temps passé depuis une date
    Par Mooneer dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 25/05/2008, 15h23
  5. calcul l'age apartir d'une date donnée
    Par DJERDJAR YACINE dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 05/07/2007, 02h28

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