Structure date c

Signaler
Messages postés
6
Date d'inscription
jeudi 27 août 2009
Statut
Membre
Dernière intervention
23 novembre 2011
-
Messages postés
6
Date d'inscription
jeudi 27 août 2009
Statut
Membre
Dernière intervention
23 novembre 2011
-
<<
on considère la structure date definie comme suite :
typedef struct date
{ int jours;
int mois;
int année;
} date;
écrire une fonction qui ajoute un nombre n de jours à une date
exemple : 20+ 15/10/2011 = 04/11/2011.>>

le nombre de jours etant quelconque .
Merci de bien vouloir m'aider .
A voir également:

13 réponses

Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
Salut,
qu'est-ce qui te pose problème précisément ? La façon d'écrire la fonction ou le calcul ?
Est-ce que tu as déjà écris un morceau de ce code ?

Pop70
Messages postés
6
Date d'inscription
jeudi 27 août 2009
Statut
Membre
Dernière intervention
23 novembre 2011

En fait j'arrive pas a commencer mon programme ! Ce qui me pose probleme evidemment c'est le fait qu'il ai des mois a 28, 29, 30 et 31 jours .
J'ai eu de la part d'un prof ceci :

" #include<stdio.h>
#include<conio.h>

typedef struct
{
int jour,mois,annee;
} date;


void main()
{
clrscr();

date d;
int j,total;
do
{
printf("Entrez le nombre de jours à ajouter <=30");
scanf("%d",&j);
}while(j>30);
printf("Entrez la date");
scanf("%d %d %d",&d.jour,&d.mois,&d.annee);
total=j+d.jour;

if((total<=29 && d.mois==2)||(total<=30 &&(d.mois==4||d.mois==6||d.mois==9||d.mois==11))||(total<=31))
{
printf("La date résultant est=%d %d %d",total,d.mois,d.annee);
}
else
{
if(d.mois==2)
{
printf("La date résultant est=%d %d %d",total-29,d.mois+1,d.annee);
}
else if(d.mois==4||d.mois==6||d.mois==9||d.mois==11)
{
printf("La date résultant est=%d %d %d",total-30,d.mois+1,d.annee);
}
else
{
printf("La date résultant est=%d %d %d",total-30,d.mois+1,d.annee);
}
}

getch();

}
>>
Mais je ne sais pas comment passer de n<30 à n quelconque !
sinon mon prof nous a parlé d'une autre méthode qui consiste à je cite : (n'ajouter qu'un jour au début et puis généraliser pour n jours) personnellement j'ai pas vraiment compris ce qu'il voulait dire par là mais si ça te dit quelque chose fait le moi savoir .
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
Ajouter un jour puis généraliser, ça veut dire : faire la fonction qui ajoute un seul jour, puis l'appeler n fois, dans une autre fonction qui a pour but d'ajouter n jours :

#include<stdio.h>
// j'ai enlever conio.h (sur mon compilo j'en ai pas besoin)

typedef struct
{
    int jour;
    int mois;
    int annee;
} date;


void ajouteJour (date *date_struct) // Fonction qui ajoute un seul jour
{
    if (date_struct->mois 12 && date_struct->jour 31) // Si on est le dernier jour de l'annee,
    {
        date_struct->annee++;   // on change d'annee,

        date_struct->mois = 1;  // et on passe au 1er janvier.
        date_struct->jour = 1;

        return;
    }


    if (date_struct->mois == 2) // Sinon, si on est en Février,
    {
        if ((date_struct->annee % 4) == 0)  // lors d'une année bissextile,
        {
           if (date_struct->jour == 29) // et le 29 du mois,
           {
                date_struct->mois++;    // on change de mois
                date_struct->jour = 1;  // et on repasse au 1er du mois.
                return;
           }
        }
        else
        {
            if (date_struct->jour == 28)    // sinon, c'est le 28 que
            {                               // s'effectue ce changement.
                date_struct->mois++;
                date_struct->jour = 1;
                return;
            }
        }
        date_struct->jour++;    // Et si on est pas à la fin du mois, on change tout simplement de jour.
        return;
    }
    else if (date_struct->mois < 8) // Si c'est un autre mois mois, inferieur à Août,
    {
        if ((date_struct->mois % 2) == 1) // alors s'il est multiple de 2,
        {
            if (date_struct->jour == 31)    // il a 31 jours, et si on est le 31ème,
            {
                date_struct->mois++;    // on passe au mois suivant,
                date_struct->jour = 1;  // et on remet le jour à 1.
                return;
            }
        }
        else
        {
            if (date_struct->jour == 30) // sinon, il a 30 jours, et si on est le 30ème
            {
                date_struct->mois++;    // on passe au mois suivant,
                date_struct->jour = 1;  // et on change de jour.
                return;
            }
        }
        date_struct->jour++;    // Et si on est pas à la fin du mois, on change juste de jour.
        return;
    }
    else    // Sinon, si le mois est supérieur ou égal à Août, c'est l'inverse :
    {
        if ((date_struct->mois % 2) == 0) // ceux qui sont multiple de 2
        {
            if (date_struct->jour == 30)    // ont 30 jours,
            {
                date_struct->mois++;
                date_struct->jour = 1;
                return;
            }
        }
        else
        {
            if (date_struct->jour == 31)    // et les autres 31.
            {
                date_struct->mois++;
                date_struct->jour = 1;
                return;
            }
        }
        date_struct->jour++;
        return;
    }

    return;
}


void ajoutPlrsJours(date *date_struct, int nb_jours)    // Ajoute plusieurs jours.
{
    int i;
    for(i=0; i < nb_jours; i++) // ajoute un jour après l'autre.
        ajouteJour(date_struct);
}

int main ()
{
    date test_date;
    test_date.annee = 2011;
    test_date.mois = 12;
    test_date.jour = 28;


    printf("%02d/%02d/%04d\n", test_date.jour, test_date.mois, test_date.annee);

    ajoutPlrsJours(&test_date,5);

    printf("%02d/%02d/%04d\n", test_date.jour, test_date.mois, test_date.annee);

    return 0;
}



L'algo est simple, c'est comme avec les bosses des mains : bosse->31 jours, creux->30 jours. Il en ressort un motif de 1 sur 2 qui a 30 jour, sauf en Août qui lui a 31 jours aussi.
Pour Février je le traite à part, si l'année est bissextile -> 29 jours, sinon 28 (d'où modulo 4).



C++dialement,
Pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
(Dsl pour les fautes (enlevé, multiples...) je clique toujours sur "Envoyer" sans relire...


Pop70
Messages postés
6
Date d'inscription
jeudi 27 août 2009
Statut
Membre
Dernière intervention
23 novembre 2011

Un grand Merci a toi POP70 !!
Messages postés
14804
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 septembre 2020
92
Hello,
@hamriham123: je te conseille de mettre le nom de Pop70 sur ton compte-rendu de TP...


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Salut, le code me semble un peu long.
Surtout qu'en corrigeant les copies, les profs vérifient rapidement d'ou provient un code, eux aussi ont internet! (je forme des programmeurs en tant que prof...) et cppfrance plutôt bien référencé par google. Bref...

Je ferais autrement (va savoir la note?) : transformer la date donnée en timestamp UNIX (nombre de secondes écoulées depuis le 1er janvier 1970) il y a certainement une fonction de la LibC qui fait ça; puis ajouter le nombre de secondes correspondant à 20 jours, pour retransformer ce nouveau timestamp en jour, mois, an à partir du pointeur de la structure passé en argument de la fonction.

Anecdote, l'histoire du 1er janvier 70 produira une panique similaire au passage en l'an 2000 puisque le timestamp UNIX est stocké sur un int, dont la capacité est limitée à 4 milliards de seconde, ce qui entrainera un dépassement de capacité de cette variable en 2038.
Messages postés
6
Date d'inscription
jeudi 27 août 2009
Statut
Membre
Dernière intervention
23 novembre 2011

En fait, j'avais pas demandé à POP70 de me passer le code en entier mais juste, m'expliquer ce que notre prof voulait qu'on fasse ; "Ajouter un jour puis généraliser, ça veut dire : faire la fonction qui ajoute un seul jour, puis l'appeler n fois, dans une autre fonction qui a pour but d'ajouter n jours : " aurait suffit mais monsieur s'est pris la peine d'écrire le programme et me le passer(En plus c'est meme pas un TP qu'on a, je bloque dessus c'est tout)!
Vous en faites tout un plat !
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
mais non
Messages postés
6
Date d'inscription
jeudi 27 août 2009
Statut
Membre
Dernière intervention
23 novembre 2011

En fait, vous auriez pas des exercices portant sur les structure de donnée a me proposer?
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Tu ne vas pas le croire, mais le code de POP70 est très bien pour ça.
Il n'y a pas vraiment d'exercices, mais un peu de théorie et beaucoup, beaucoup d'applications.
Il y a ça qui n'est pas mal http://perso.enstimac.fr/~gaborit/lang/CoursDeC/CoursDeC-node8.html en application pour le sujet initial, la date.
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Regarde aussi du côté de time.h tu y trouveras des fonctions très intéressantes.
Messages postés
6
Date d'inscription
jeudi 27 août 2009
Statut
Membre
Dernière intervention
23 novembre 2011

Merciii =)