Création
d'entreprise
Posez votre question Signaler

Programme de date en langage C

Mouaad1991 5Messages postés 9 janvier 2012Date d'inscription 25 mars 2012Dernière intervention - Dernière réponse le 16 janv. 2012 à 00:06
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
Lire la suite 

Programme de date en langage C »

13 réponses
Réponse
+0
moins plus
Bonjour,

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

Cordialement.
Mouaad1991- 9 janv. 2012 à 15:22
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();
}
}
Mouaad1991- 9 janv. 2012 à 15:23
j'ai seulemet fais le premier mois pour tester
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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 :)
matthoffman- 10 janv. 2012 à 10:20
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
Char Snipeur- 10 janv. 2012 à 10:44
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.
matthoffman- 10 janv. 2012 à 10:55
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 :)
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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;
}
Ajouter un commentaire
Réponse
+0
moins plus
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();
}
Ajouter un commentaire
Ce document intitulé « Programme de date en langage C » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?