Algorithme pour le calcul de la fête de Pâques

Bonjour, comme je l'ai cherché sur le forum et que je n'ai rien trouvé. Voici une petite routine pour calculer la date de Pâques. Ce n'est pas mis en forme. Le calcul est valable pour le calendrier Grégorien et jusqu'en 4099, enfin, c'est ce qui est écrit sur le site?
(Easter Date Algorithme)
http://dates.gmarts.org/eastalg.htm#geteasterdatec

void setup() {

Serial.begin(9600); // open the serial port at 9600 bps:

Paques();
}

void loop() {

}

void Paques() {

  int a;
  int b;
  int c;
  int d;
  int e;
  int f;
  int g;
  int h;
  int j;
  int k;
  int m;
  int n;
  int p;
  int y =2016;// c'est l'année 
  int dy;
  int mth;

      a = y / 100;
    b = y % 100;

    c = (3 * (a + 25)) / 4;
    d = (3 * (a + 25)) % 4;

    e = (8 * (a + 11)) / 25;

    f = (5 * a + b) % 19;

    g = (19 * f + c - e) % 30;

    h = (f + 11 * g) / 319;

    j = (60 * (5 - d) + b) / 4;
    k = (60 * (5 - d) + b) % 4;

    m = (2 * j - k - g + h) % 7;

    n = (g - h + m + 114) / 31;
    p = (g - h + m + 114) % 31;

    dy = p + 1;
    mth = n;

Serial.print("Pour l'année ");
Serial.println(y);
Serial.print("jour de paque : ");
Serial.println( dy);
Serial.print(" N° mois : ");
Serial.println( mth);

}

dommage :slight_smile:

en faire une petite fonction qui prend en paramètre l'année et retourne par référence le jour et le mois serait encore mieux :slight_smile:

1 Like

Bonjour,
Pour ne pas perdre la main et très rapidement car je n'ai pas beaucoup de temps :

constexpr byte tailleMax = 4;
char serieChiffres[tailleMax + 1]; // +1 pour le '\0'
constexpr char marqueurDeFin = '\n'; // 

int n, p;

void setup() {
  
  Serial.begin(115200); // open the serial port at 9600 bps:

}

void loop() {
  if (!serieChiffresRecu()) {
    Paques((atoi(serieChiffres)), &p, &n);
    Serial.print("jour de paque : ");
    Serial.println(p);
    Serial.print(" N° mois : ");
    Serial.println(n);
  }
}

void Paques(int y, int *leJour, int *leMois) {

  int a, b, c, d, e, f, g, h, j, k, m;


  a = y / 100;
  b = y % 100;

  c = (3 * (a + 25)) / 4;
  d = (3 * (a + 25)) % 4;

  e = (8 * (a + 11)) / 25;

  f = (5 * a + b) % 19;

  g = (19 * f + c - e) % 30;

  h = (f + 11 * g) / 319;

  j = (60 * (5 - d) + b) / 4;
  k = (60 * (5 - d) + b) % 4;

  m = (2 * j - k - g + h) % 7;

  *leMois = (g - h + m + 114) / 31;
  *leJour = ((g - h + m + 114) % 31) + 1;

  Serial.print("Pour l'année ");
  Serial.println(y);


}

bool serieChiffresRecu() {
  static byte indexserieChiffres = 0;
  boolean serieChiffresEnCours = true;
  int r = Serial.read();
  if (r != -1) { // on a reçu un caractère
    if (r == marqueurDeFin) {
      serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
      indexserieChiffres = 0; // on se remet au début pour la prochaine fois
      serieChiffresEnCours = false;
    } else {
      if ((r != '\r') && (indexserieChiffres < tailleMax))
        serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
    }
  }
  return serieChiffresEnCours;
}

Il y a très certainement mieux à faire mais je n'ai pas trop de temps.
Vous saisissez l'année dans le moniteur série et vous appuyez sur entrée ...

J'ai choisi les pointeurs ...

Bonne journée.

1 Like

ça fait très C et moins C++ :slight_smile:


je retournerai l'opposé pour ne pas avoir le NOT dans le test ou changer le nom de la fonction, ce serait plus lisible de manière naturelle "si j'ai reçu une série de chiffre, alors je la traite"

constexpr byte tailleMax = 4;
char serieChiffres[tailleMax + 1]; // +1 pour le '\0'
constexpr char marqueurDeFin = '\n'; // 

int n, p;

void setup() {
  
  Serial.begin(9600); // open the serial port at 9600 bps:

}

void loop() {
  if (serieChiffresRecu()) {
    Paques((atoi(serieChiffres)), p, n);
    Serial.print("jour de paque : ");
    Serial.println(p);
    Serial.print(" N° mois : ");
    Serial.println(n);
  }
}

void Paques(int y, int &leJour, int &leMois) {

  int a, b, c, d, e, f, g, h, j, k, m;


  a = y / 100;
  b = y % 100;

  c = (3 * (a + 25)) / 4;
  d = (3 * (a + 25)) % 4;

  e = (8 * (a + 11)) / 25;

  f = (5 * a + b) % 19;

  g = (19 * f + c - e) % 30;

  h = (f + 11 * g) / 319;

  j = (60 * (5 - d) + b) / 4;
  k = (60 * (5 - d) + b) % 4;

  m = (2 * j - k - g + h) % 7;

  leMois = (g - h + m + 114) / 31;
  leJour = ((g - h + m + 114) % 31) + 1;

  Serial.print("Pour l'année ");
  Serial.println(y);


}

bool serieChiffresRecu() {
  static byte indexserieChiffres = 0;
  boolean serieChiffresEnCours = false;
  int r = Serial.read();
  if (r != -1) { // on a reçu un caractère
    if (r == marqueurDeFin) {
      serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
      indexserieChiffres = 0; // on se remet au début pour la prochaine fois
      serieChiffresEnCours = true;
    } else {
      if ((r != '\r') && (indexserieChiffres < tailleMax))
        serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
    }
  }
  return serieChiffresEnCours;
}

Dommage j'aime bien les pointeurs même si c'est plus lisible par référence :wink:
Mais je vous suis quand même car c'est bien plus simple et vous avez raison :wink:

:slight_smile:

sinon plutôt cela

bool serieChiffresRecu() {
  static byte indexserieChiffres = 0;
  boolean serieChiffresEnCours = true;
  int r = Serial.read();
  if (r != -1) { // on a reçu un caractère
    if (r == marqueurDeFin) {
      serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
      indexserieChiffres = 0; // on se remet au début pour la prochaine fois
      serieChiffresEnCours = false;
    } else {
      if ((r != '\r') && (indexserieChiffres < tailleMax))
        serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
    }
  }
  return ! serieChiffresEnCours;
}

et pour la lisibilité du code

int numJour, numMois;
void loop() {
  if (serieChiffresRecu()) {
    Paques((atoi(serieChiffres)), numJour, numMois);
    Serial.print("jour de pâques : ");
    Serial.println(numJour);
    Serial.print(" N° mois : ");
    Serial.println(numMois);
  }
}

:joy:

C’est vrai, j’aurai du avoir le réflexe de le faire :wink:
Bonne journée

pas sûr de comprendre le smiley

un chiffre est reçu s'il n'y a plus de réception en cours, donc il faut mettre le NOT

sinon avec votre nouveau code il faut changer le nom de la variable dans la fonction pour qu'elle soit parlante

bool serieChiffresRecu() {
  static byte indexserieChiffres = 0;
  boolean receptionTerminee = false; // <=== ici changement de nom
  int r = Serial.read();
  if (r != -1) { // on a reçu un caractère
    if (r == marqueurDeFin) {
      serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
      indexserieChiffres = 0; // on se remet au début pour la prochaine fois
      receptionTerminee = true;
    } else {
      if ((r != '\r') && (indexserieChiffres < tailleMax))
        serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
    }
  }
  return serieChiffresEnCours;
}

ou alors pas de variable du tout

bool serieChiffresRecu() {
  static byte indexserieChiffres = 0;
  int r = Serial.read();
  if (r != -1) { // on a reçu un caractère
    if (r == marqueurDeFin) {
      serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
      indexserieChiffres = 0; // on se remet au début pour la prochaine fois
      return true;
    } else {
      if ((r != '\r') && (indexserieChiffres < tailleMax))
        serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
    }
  }
  return false;
}

Oui @J-M-L c'est encore bien mieux et encore plus simple :wink:
Décidément la simplicité c'est pas mon fort :wink:

PS : Je n'avais pas lu les messages précédents, oui le smiley n'est pas justifié :wink:
Dans mon idée lorsque le tableau est rempli, la condition est vraie mais ce n'était pas mon choix de départ donc j'ai tord sur toute la ligne ...
Vous avez raison, il faut toujours rester lisible pour soit et pour les autres.
La dernière version est la meilleure :wink:
Bonne journée.

Désolé J-M-L pour la mise en forme sommaire, philippe86220 a fait le boulot mieux que moi.
Longue vie au forum qui est une mine d'information.

Bonsoir @lr17db

J’ai été formé par @J-M-L, c’est lui qui m’a appris à programmer :wink:
Ce forum est exceptionnel, vous avez raison, c’est une mine d’informations.

Bonne soirée

vous vous êtes appris à programmer tout seul pour la plus grosse partie, le forum a été là quand vous aviez besoin d'une clarification

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.