Signaler

Enregistrement [Résolu]

Posez votre question oook - Dernière réponse le 9 févr. 2017 à 15:33 par oook
Bonjour,

J'essaie de bien comprendre la notion d'enregistrement en algorithme, pour cela j'ai pensé à faire qlq exercice en demandant votre guide.

Ecrire une structure de donnée qui permet de définir une date par le jour, le quantième, le mois et l’année.
Écrivez les fonctions lendemain et veille qui retournent les dates du lendemain et de la veille d'une date passée en paramètre.

ma proposition :



type

JOUR = (LUNDI, MARDI, MERCREDI, JEUDI , VENDREDI, SAMEDI, DIMANCHE)
QUANTIEME = 1 . . 3 1
MOIS = (JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN , JUILLET , AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE) ;
Date= struct
Jour : JOUR
quantieme : QUANTIEME
mois : MOIS
annee : Entier
finStruct

Fonction lendemain ( var d : date ) : date
debut

si (d.mois = FEVRIER) ET (d.jour = 28) alors
d.jour <-- 1
sinon
si (d.mois = DECEMBRE) alors
d.jour <-- 1
d.mois <-- 1
d.annee <-- d.annee + 1
sinon

si ( d.mois = (JANVIER,MARS,MAI,JUILLET, AOUT,OCTOBRE)) ET (d.jour = 31) alors
d.jour <-- 1
d.mois <-- d.mois + 1

sinon

d.jour <-- d.jour+1
finsi
finsi
finsi
fin

Fonction veille ( var d : date ) : date
debut



Svp qui peut dire est ce que je peux continuer comme ça pour la fonction veille ou bien c'est faux ? si oui, qui peut me dégager les fautes svp.
Utile
+0
plus moins
Disons que l'idéal serait plus que tu choisisses un langage de programmation simple d'accès (par exemple python) et que tu testes par toi-même ce que donne ton programme.

En tout cas ce qui est sûr c'est le programme est écrit bizarrement.

Tu as trois types de mois :
- les mois de 31j
- les mois de 30j
- le mois de 28/29j (février) selon qu'on est une année bissextile ou pas

Il te faut donc un test pour vérifier dans quelle catégorie de mois on est, ce qu'on pourrait écrire avec
switch case
en C ou par une suite de
if ... else if ...
dans d'autres langages. Tu peux aussi faire appel à une fonction auxiliaire qui te donne le nombre de jour dans un mois étant donnés ce mois et cette année.

def nombre_de_jours(mois, annee):
  if mois in [1, 3, ... ]: # janvier, mars...
    return 31
  elif mois == 2: # février
    if (annee - 2016) % 4 == 0: # bissextile ?
      return 29
    else:
      return 28
  else: # avril, juin...
    return 30


Ensuite calculer le lendemain est simple. Il faut d'abord vérifier que la date du jour est bien dans le mois (donc une valeur comprise entre 1 et le résultat de nombre_de_jours(mois, annee)). Si c'est le cas la date du jour est bien formée, et donc ça a un sens de continuer.

Si c'est le cas, de deux choses l'une. Soit la date du jour correspond au dernier jour, et il faut passer au 1 du mois suivant, soit ce n'est pas le cas et on se contente de l'incrémenter. Même principe avec le mois, mais c'est plus facile car il suffit de vérifier si on est en décembre

def demain(aujourdhui):
  (jour, mois, annee) = aujourdhui
  longueur_mois = nombre_de_jours(mois, annee)
  assert jour >= 1 and jour <= longueur_mois
  assert mois >= 1 and mois <= 12
  jour_demain  = jour  + 1 if jour < longueur_mois else 1
  mois_demain  = mois  + 1 if jour_demain == 1 else mois
  annee_demain = annee + 1 if mois_demain == 1 else annee
  return (jour_demain, mois_demain, annee_demain)


Bonne chance
oook- 9 févr. 2017 à 15:33
Merci beaucoup, je vais essayer une autre fois.
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !