j'ai édité mon message en rajoutant une version commenté de mon code (peut-être un peu trop d'ailleurs...)
Tes commentaires permettent d'y voir un peu plus clair. Donc si je résume ton algorithme sur un exemple :
*) aujourd'hui on est le 1er juillet
*) tu te déplaces au premier vendredi qui suit
*) si c'est un 13 OK sinon tu continues vers le vendredi suivant.
Bon c'est acceptable disons voire correct. Je trouve néanmoins ton code assez compliqué. Tant qu'à faire, je chercherais le premier 13 du mois qui suit le jour donné et je me déplacerais de 13 du mois en 13 du mois.
Bon, finalement, j'ai tenté de mettre cette méthode au point et ça donne ceci :
#include <stdio.h>
#include <time.h> /* juste pour struct tm */
int estBissextile(int a)
{
return ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0);
}
/*
Renvoie le premier 13 du mois postérieur à ma_date qui doit être valide et
complet (jour entre 1 et 31, mois entre 1 et 12, dimanche =0).
Retourne le jour de la semaine
*/
int prochain13(struct tm *ma_date)
{
int nbj[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int m = ma_date->tm_mon, j = ma_date->tm_mday;
/* Nombre de jours du mois courant */
int n = nbj[m - 1] + (m == 2 && estBissextile(ma_date->tm_year));
/* Jour de la semaine du prochain 13 */
ma_date->tm_wday = (ma_date->tm_wday + 13 + (j >= 13) * n - j) % 7;
/* Mise à jour au prochain 13 */
if (j >= 13)
{
if (m == 11)
{
ma_date->tm_year++;
ma_date->tm_mon = 0;
}
else
ma_date->tm_mon++;
}
ma_date->tm_mday = 13;
return ma_date->tm_wday;
}
int main(void)
{
struct tm ma_date;
ma_date.tm_wday = 4; /* dimanche = 0, vendredi = 5 */
ma_date.tm_mday = 13; /* 1<= jour du mois <= 31 */
ma_date.tm_mon = 1; /* 1<= mois <= 12*/
ma_date.tm_year = 2028;
while (prochain13(&ma_date) != 5)
;
printf("Vendredi %d/%d/%d\n", ma_date.tm_mday, ma_date.tm_mon,
ma_date.tm_year);
return 0;
}
bonjour,
bon voici ma cogitation sur le sujet, j'ai pas fait comme impose !
Ayant eu du mal a dechiffrer, j'ai prefere reflechir naivement à comment faire et j'ai pondu cela :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int Fonction_bissextile (int annee)
{
int resultat;
if ((annee % 4) == 0 )
{
resultat = 1; // on ajoute + 1 jour a fevrier;
}
else
{
resultat = 0;
}
return resultat;
}
int main (void)
{
int Njour[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/* point de depart jeudi 1 juillet
jeudi ---> jour=4
juillet ---> mois =7
annee ---> annee=2010
*/
int jour = 5;
int annee = 2010;
int fin = 2015;
char *NomMois[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
//char *NomJour[] = {"Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"};
int i,j,k,bissextile;
for (i=annee;i<fin;i++)
{
bissextile=Fonction_bissextile(j);
for(j=0;j<12;j++)
{
for(k=1;k<Njour[j]+bissextile;k++)
{
//printf("%s %d %s %d\n",NomJour[jour],k,NomMois[j],i);
if ((jour ==5) && (k==13))
{
printf("vendredi 13 %s %d \n",NomMois[j],i);
}
if (jour > 6) { jour = 0; }
jour++;
}
}
}
return 0;
}
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.