Programme de date en langage C

Mouaad1991 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
Mouaad1991 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je voudrais une correction de cet exercice en langage C avec le switch :
"Ecrire un programme qui lit une date et un nombre de jours (entier positive ou negative entre -20 et 20 ) et affiche la date anterieure ou posterieure en fonction d'un nombre de jours donnees"
j'ai essayer de le faire , mais j'ai fais surement des fautes dans les partitions des instructions.
je voudrais la correction avant le 11/01/2012 . Merci d'avance
Exemple:
12/03/2005 -6 06/03/2005

7 réponses

Mouaad1991 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   4
 
bon voila je l'ai fait le programme sachant que la date qui saisi l'utilisateur est valide:
#include<stdio.h>
#include<conio.h>
main()
{
unsigned int J,M,A,NBJ,ANT=0,B;
printf("Entrez la date J/M/A :");
scanf("%d %d %d ",&J,&M,&A);
printf("\nNBJ");
scanf("%d",&NBJ);
J=J+NBJ;B=(!(A%4)&&(A%100)||(A%400));
//cas positif
if(J>28&&B==0&&M==2)
{M=3;J-=28;}
else
if(J>29&&B==1&&M==2)
{M=3;J=J-29;}
else
if(J>31&&(M==1||M==3||M==5||M==7||M==8||M==10))
{M++;J=J-31;}
else
if(J>30&&(M==4||M==6||M==9||M==11))
{M++;J=J-30;}
else
if(J>31&&M==12)
{M=1;J=J-31;A++;}
else//cas negatif
if(J<1&&M==3&&B==0)
{M=2;J=J+28;}
else
if(J<1&&M==3&&B==1)
{M=2;J=J+29;}
else
if(J<1&&(M==5||M==7||M==10||M==12))
{M--;J=J+30;}
else
if(J<1&&(M==2||M==4||M==6||M==8||M==9||M==11))
{M--;J=J+31;}
else
if(J<1&&M==1)
{M=12;J=J+31;A--;}
ANT=1;
if(ANT)
printf("La date anterieure est %d/%d/%d",J,M,A);
else
printf("La date posterieure est %d/%d/%d",J,M,A);
getch();
}
4
chossette9 Messages postés 4239 Date d'inscription   Statut Contributeur Dernière intervention   1 311
 
Bonjour,

montre nous ce que tu as fait si tu veux de l'aide.

Cordialement.
0
Mouaad1991 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   4
 
J'ai pas trouver la solution de passer d'un switch a l'autre
#include<stdio.h>
#include<conio.h>
main()
{
unsigned int J,M,A;
int E;
printf("Entrez le J");
scanf("%u",&J);
printf("Entrez le M");
scanf("%u",&M);
printf("Entrez le A");
scanf("%u",&A);
printf("Entrez le E");
scanf("%d",&E);
fflush(stdin);
switch(J)
{
case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:
switch(E)
{
case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:
{
J=J-E;
printf("La date est %d %d %d",J,M,A);break;
}
case -20:case -19:case -18:case -17:case -16:case -15:case -14:case -13:case -12:case -11:case -10:case -9:case -8:case -7:case -6:case -5:case -4:case -3:case -2:case -1:
{
printf("ERROR de E");break;
}
default:printf("ERROR");break;
}

getch();
}
}
0
Mouaad1991 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   4
 
j'ai seulemet fais le premier mois pour tester
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Avant de coder, il faut avoir un algorithme qui tien la route, ce qui ne semble pas être le cas ici.
avec E entre -20 et 20, déjà tu ne peux pas changer de plus de 1 mois à la fois
Premier pas : savoir si E te fait changer de mois (premier switch, dépend du mois choisi). Si ce n'est pas le cas, ouf, c'est une simple addition/soustraction.
Si tu changes de mois, il y a un deuxième cas pour savoir où tu va arriver.
Bref, du boulot.
0
matthoffman Messages postés 405 Date d'inscription   Statut Membre Dernière intervention   47
 
Comme l'a dit char snipeur tu as encore beaucoup de boulot a faire.
Je te conseille d'aileurs de decouper ton code.

Il faut que tu prennes en compte le mois de Fevrier qui ne contient pas autant de jours que les autres, et puis que tu fasses gaffe aux annees bisextiles (go wikipedia si tu veux connaitre la regle).

Ensuite plutot que de faire tes cases bizarres la, utilises des if (a < 1 && b>21) ca ira 10 fois mieux deja.

Du travail en perspective, bon courage :)
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
en fait, février à 28 jours, en effet, mais les autres mois ont soit 30 soit 31 jours, chaque mois est quasiment n cas à part entière.
L'idéale est de faire un tableau pour les mois :
char mois[14]={31,31,28,31,30,31,30,31,31,30,31,30,31,31];
j'en mets 14, comme ça mois[m] te donne directement le nombre de jours du mois en court et les deux nombre restant permettent de connaitre sans débordement le nombre de jour du mois précédent et du mois suivant. Comme ça la condition est simple : if(J+E>mois[M] || J+E<1)changement_de_mois
0
matthoffman Messages postés 405 Date d'inscription   Statut Membre Dernière intervention   47
 
Pas exactement, il faut changer mois[3] en fonction de l'annee (car annee bisextile fevrier = 29 jours), d'ou ma remarque sur Fevrier.

Pour la tableau c'est une solution, meme si je ne pense pas que rajouter un 31 de chaque cote soit necessaire.
On peut tres bien reculer dans l'annee ou incrementer l'annee, de plus ton tableau a 14 elements fonctionne si l'utilisateur rentre un nombre de jours compris (en gros) entre -30 et -1 et 1 et 30, mais si on veut ajouter un nombre de jours de 365 par exemple, ba on sort du tableau, donc la solution est bancale :S

Mais deja ca lui donne de bonnes pistes pour avancer
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
oui, pardon, tu as raison.
Pour les nombre supérieur à 20, c'est hors sujet, relit le premier message :
(entier positive ou negative entre -20 et 20 )
à la rigueur on peut ajouter un test voir si ce que rentre l'utilisateur est dans les clous ou non.
0
matthoffman Messages postés 405 Date d'inscription   Statut Membre Dernière intervention   47
 
Ah oui, j'avais zappe cette consigne (c'est pas tres generique tout ca ^^).
Bon ba alors ta solution serait la plus simple a implementer en effet :)
0

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

Posez votre question
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
Utilise ctime, time et consorts (d'accord c'est un exercice d'école, on apprend malheureusement pas à utiliser les bibliothèques existantes de la vraie vie, c'est le défaut récurrent de l'enseignement et des enseignats qui sont dans leur bulle !)
<code><gras>johand@osiris: ~/src/CCM/C $ cat calendar.c
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define DELAY 20

int main(int c, char *argv[])
{
time_t now;

now = time(NULL);

printf("Now:\t\t%s\n", ctime(&now));
now -= (DELAY) * 86400 ;
printf("%d days ago:\t\t%s\n", DELAY, ctime(&now));

return EXIT_SUCCESS;
}

johand@osiris: ~/src/CCM/C $ ./calendar
Now: Mon Jan 9 17:17:30 2012

20 days ago: Tue Dec 20 17:17:30 2011</gras</code
0
Mouaad1991 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   4
 
j'ai pas compris ce que tu as ecrit Mr , je suis un debutant en langage c, tu peut m'aider plus que ca , et ne pas oublier : 'avec le switch' Mercii
0
vordano Messages postés 1685 Date d'inscription   Statut Membre Dernière intervention   316
 
salut
voici ce que j'ai pensé:

la variable nb détermine le nombre de jour entre -20 et +20
les variables j,m et a définissant la date a incrémenter ou décrémenter
le tableau mois[12] //le 12 n'est pas fixé, j'ai pas tout pensé encore ^^
if(j+nb<1){//nb est négatif + changement de mois vers précédent
res_m=m-1;
if(res_m<1){
res_m=12;
res_a=a-1;
}else{res_a=a;}
res_j=mois[res_m]+(mois[m]-nb);//j'ai fait ça vite fait, c'est probablement faux, la flemme de réfléchir plus loin, mais le calcul se fait entre le nb de jour de m et res_m, j et nb

}else if(j+nb>mois[m]){//nb est positif + changement de mois vers suivant
res_m=m+1;
if(res_m>12){
res_m=1;
res_a=a+1;
}else{res_a=a;}
res_j=mois[res_m]+(mois[m]-nb);//j'ai fait ça vite fait, c'est probablement faux, la flemme de réfléchir plus loin, mais le calcul se fait entre le nb de jour de m et res_m, j et nb
}else{
//faire le calcul quand on change pas de mois, donc res_j=j+nb;
}
0