Programme en C

Résolu/Fermé
Yazou92 Messages postés 181 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 30 avril 2013 - 5 mars 2009 à 19:50
Yazou92 Messages postés 181 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 30 avril 2013 - 6 mars 2009 à 17:43
Bonjour,

j'ai un devoir pour demain, je doit faire un programme en C qui détermine le jour du lendemain de la date que l'utilisateur aura introduite de la façon suivante: 02122006 = 02 12 2006 et le programme doit afficher le lendemain du 2 décembre 2006 et le 3 décembre 2006. Mais le problème c'est le 31 décembre et le 28 février si l'année est bissextile.

J'ai fais ce code qui marche mais d'après mon maître je peux le simplifier mais je sais pas comment faire

Voici le Code: (Je sais il est long ^^)


#include <stdio.h>
#include <stdlib.h>


int bissextile(int annee_saisie)
{
if(annee_saisie % 4 == 0 && annee_saisie % 100!= 0) //on test si l'année entrée est divisible par 4 ET pas par 100
{
return 1; //si oui on renvoi vrai
}

if(annee_saisie % 400 == 0) //sinon si l'année est divisible par 400
{
return 1; //si oui on renvoi vrai
}

return 0; //sinon on renvoi faux

}

void print_mois(int mois)
{
switch(mois)
{
case(1):
printf("janvier ");
break;
case(2):
printf("fevrier ");
break;
case(3):
printf("mars ");
break;
case(4):
printf("avril ");
break;
case(5):
printf("mai ");
break;
case(6):
printf("juin ");
break;
case(7):
printf("juillet ");
break;
case(8):
printf("aout ");
break;
case(9):
printf("septembre ");
break;
case(10):
printf("octobre ");
break;
case(11):
printf("novembre ");
break;
case(12):
printf("decembre ");
break;
}
};

int main(int argc, char *argv[])
{
int date_saisie;
int annee;
int jour;
int mois;
int annee_demain;
int jour_demain;
int mois_demain;
int erreur=0;

printf("Veuillez entre une date et le programme vous donnera le lendemain, exemple de date 01012000= 1 janvier 2000 :\n");

do
{
erreur=scanf("%d",&date_saisie);

if(erreur!=0)
{
jour=date_saisie /1000000;
mois=date_saisie /10000 % 100;
annee=date_saisie % 10000;
printf("Pour la date du %d ",jour);
print_mois(mois);
printf("%d\n",annee);
}

if(annee <= 0||annee >= 10000)
{
erreur = 0;
}

if(mois < 0 || mois > 12)
{
erreur = 0;
}

if(jour <= 0)
{
erreur = 0;
}

jour_demain = jour+1;
mois_demain = mois;
annee_demain = annee;

if(mois == 2)
{
if(bissextile(annee))
{
if(jour > 29)
{
erreur = 0;
}
else if(jour == 29)
{
jour_demain = 1;
mois_demain = mois+1;
}
}
else if(jour > 28)
{
erreur = 0;
}
else if(jour == 28)
{
jour_demain = 1;
mois_demain = mois+1;
}
}

else if(mois == 1||mois == 3||mois == 5||mois == 7||mois == 8||mois == 10||mois == 12)
{
if(jour > 31)
{
erreur = 0;
}
else if(jour == 31)
{
jour_demain = 1;
mois_demain = mois+1;
if(mois_demain == 13)
{
mois_demain = 1;
annee_demain = annee+1;
}
}
}

else if(mois != 2)
{
if(jour > 30)
{
erreur=0;
}
else if(jour == 30)
{
jour_demain = 1;
mois_demain = mois+1;
}
}

if(erreur == 0)
{
printf("inscrivez une date correcte\n");
}
}
while(erreur == 0);

if(jour_demain == 1)
{
printf("Le jour du lendemain est le %der ",jour_demain);
}
else
{
printf("Le jour du lendemain est le %d ",jour_demain);
}
print_mois(mois_demain);
printf("%d\n",annee_demain);

system("PAUSE");
return 0;
}




Merci de votre aide

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
5 mars 2009 à 22:28
Un tableau de pointeurs sur des char est un tableau dont chacune des cases pointera sur une adresse mémoire contenant un mot. Voici un tableau de pointeur sur un char : char *nomMois[]={"Janvier","Fevrier",...};
char *nomMois[5], va créer un tableau de 5 cases de type char*. Ainsi nomMois[0] contiendra une adresse mémoire correspondant à l'adresse de "Janvier". Donc puts(nomMois[0]) ou printf("%s\n",nomMois[0]); affichera Janvier à l'écran.
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
5 mars 2009 à 21:29
Salut,
Oui c'est vrai que tu peux vraiment simplifier.
Tout d'abord, tu peux utiliser un tableau de pointeurs sur char pour contenir le nom des mois.
Par exemple : char *nomMois[]={"Janvier","Fevrier",...};
Tu peux aussi utiliser un tableau d'int pour contenir le nombre de jours par mois (année non bissextile).
Par exemple : int nbJoursParMois[]={31,28,31,...};
Cela t'évitera déjà pleins de if.
Pour l'entrée de la date, tu peux faire simplement : scanf("%d/%d/%d",&jour,&mois,&annee);
Ainsi tu récupères en une ligne, jour mois et annee.
Pour le jour d'après :
int nbJours=nbJoursParMois[mois-1];
if (isBissextile(annee)) nbJours++;

if ( jour<nbJours) {
    jourSuiv=jour+1;
}
else if (mois < 12) {
    jourSuiv=1;
    moisSuiv=mois+1;
}
else {
    joursSuiv=1;
    moisSuiv=1;
    anneeSuiv=annee+1;
}

Tu peux aussi utiliser une structure pour regrouper jour, mois et annee.
Voilà, je pense que tu as de quoi d'améliorer ton code. Je pense que tu peux diviser par trois le nombre de lignes.

Cdlt
0
Yazou92 Messages postés 181 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 30 avril 2013 16
5 mars 2009 à 22:23
Merci beacoup,

effectivement ça me raccourci le code.

Mais fiddy, je comprend pas très bien quand vous dites que je doit utiliser une table de pointeur sur char pour contenir les mois.


Je fais du C que depuis 6 mois, je suis encore qu'un apprenti de premiere année, si vous pouvez être plus explisite car mes connaissance en language C sont enore limiter, DSL ^^


Merci d'avance
0
Yazou92 Messages postés 181 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 30 avril 2013 16
5 mars 2009 à 22:41
Ah OK



Je comprend mieux, donc cette opération va m'éviter tous les breaks, mais es-que je doit déclarer le nomMois comme une variable ou je le laisse comme il est??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
6 mars 2009 à 00:43
char *nomMois[]={"Janvier","Fevrier",...};
C'est une variable. N'oublie pas de remplacer les trois petits points par les autres mois de l'année quand même.
De même pour :
int nbJoursParMois[]={31,28,31,...};
0
Yazou92 Messages postés 181 Date d'inscription jeudi 15 janvier 2009 Statut Membre Dernière intervention 30 avril 2013 16
6 mars 2009 à 17:43
OKi merci a vous tous, j'ai fais un 5.2 sur 6 a mon devoir

C gentil de votre aide
0