Aidez moi en program c

Résolu/Fermé
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009 - 27 oct. 2009 à 22:24
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009 - 30 oct. 2009 à 19:22
Bonjour,
svp aidez moi pour resoudre un program c qui permet de calculer la difference entre deux dates par jour ;
il faut verifier si les deux dates sont valides ou non;
si ils sont valides il faut etre prudent pour les années bisextilles qui contienne 366 jours et fevrier 29 jours;
mais pour les année normale 365 jours et fevrier 28 jours;

EXEMPLE
22/12/2009 et 22/11/2009
difference= 30


si vous avez trouvez une solution svp envoyez la par email (x-men1919@hotmail.fr)
je vous remercie d'avance ... ;

6 réponses

votre question n'est pas claire!
0
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009
27 oct. 2009 à 23:47
je veut faire un program c qui calcule la différence entre deux date valide par exemple

1er date 31/12/2009
2eme date 30/11/2009 les deux dates sont valides
la difference 31 jours

par contre si on tape 31/02/2009 cette date est invalide car fevrier atteint que 28 ou 29 si lannée est bisextille
donc la date est invalide
0
pacorabanix
27 oct. 2009 à 23:53
Première étape concevoir le programme.

Que doit savoir faire ton programme ?

Ex :

Il doit d'abord vérifier si la date et valide.

Ensuite il doit calculer un écart de jours.

Ce sont deux choses différentes.

Que doit-il savoir faire pour faire le premier point ? (en détail)

Que doit-il faire dans le second ? (en détail)


Si tu as du mal à répondre dis-toi : "Ok, on me file une date (un nombre de jour, un nombre pour le mois, et un nomrbe pour une année). Qu'est ce que je dois regarder (en détail et étape par étape) pour savoir si on m'arnaque ou pas ".

Et un truc du même genre pour le deuxième point.

Marque les étapes sur une feuile de papier, ça sera le début de tes algorithmes.
0
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009
28 oct. 2009 à 00:09
1er etape : saisir les deux dates on utilisant 6 variables j1,j2,m1,m2,a1,a2
lire le premier nb de jour j1 puis le mois m1 et lannée a1 de meme pour la 2eme date


2eme etape : verifier si les dates valides ou non
si il ya un nbr de jour <1 ou >31 ou 30 pour certain mois
si le mois depase >12 ou <1
noubliez pas que les mois ont un nombre de jours different comme janvier 31 et fevrier 28 ou 29 et avril 30 ...etc

3eme etape : calculer l'ecart entre les deux dates par jour

NB: pour l'affichage
donnez le nbr de jour 1: (j1)
donnez le mois 1: (m1)
donnez l'annee 1: (a1)

donnez le nbr de jour 2: (j2)
donnez le mois 2: (m2)
donnez l'annee 2: (a2)

dates non valide {si les dates ne sont pas valide si non}

la difference : 3624 jour


juste un exemple d'affichage...
@@@@@@@@@@@@@@@
0
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009
29 oct. 2009 à 22:32
salut j ai trouvé une solution sa marche pour certaines dates mais il y a un petit problème aidez moi pour le

corriger,


***est ce que un switch double sa marche ou non

switch (m,m1)
case ......................................
0
pacorabanix
29 oct. 2009 à 22:44
non malheureusement... :( il va falloir imbriquer des switchs et des ifs...

remaruqe que si qqchose se répète tu peux en faire une fonction séparée. ex :

une fonction "boolean estBissextile(int annee)"
si l'année est un multiple de 4 alors elle est bissextile (c-à-d si annee modulo 4==0)

une fonction "int NombreDeJoursSelonMois(int mois, int annee)"
celle-ce, à l'aide d'un switch, décide selon le mois si ça donne 31 ou 30 jours.
atttention, elle doit ausi, pour le cas particulier du mois de février, appeler la fonction estBissextile sur l'année pour décider si elle renvoie 28 ou 29.


Ensuite ces fonctions peuvent t'aider à trouver une date valide,
et aussi t'aider pour compter les jours d'écart.
En effet, pour ce calcul tu as besoin de "parcourir tous les jours" du départ jusqu'à la fin, et compter combien il y en a à l'aide d'un compteur. Et tu auras une boucle pour les années, une pour les mois, une pour les jours. Celle pour les jours devra s'arreter à 28, 29, 30 ou 31 et donc fera appel à ta fonction "NombreDeJoursSelonMois" à chaque itération.

voilà je ne peux pas t'aider plus je pense :)
0
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009
29 oct. 2009 à 22:47
@ c'est la solution incorrecte que j'ai trouvé @


#include<stdio.h>
int main (void)
{
int j,j1,m,m1,a,a1,d1,d2,s1,s2,aux1,aux2;
int test=0;
printf("entrer le jour de la date1\n") ;
scanf("%d",&j);
printf("entrer le mois de la date1\n") ;
scanf("%d",&m);
printf("entrer l'année de la date1\n") ;
scanf("%d",&a);
printf("entrer le jour de la date2\n") ;
scanf("%d",&j1);
printf("entrer le mois de la date2\n") ;
scanf("%d",&m1);
printf("entrer l'année de la date2\n") ;
scanf("%d",&a1);
if ((a%4==0) || (a1%4==0))
test=1;
if (((m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12 || m1==1 || m1==3 || m1==5 || m1==7 || m1==8 || m1==10 || m1==12) && ((j<1||j>31) || (j1<1||j1>31))) || ((m==4 || m==6 || m==9 || m==11 || m1==4 || m1==6 || m1==9 || m1==11) && ((j<1 || j1>30) || (j1<1 || j1>30))) || ((test==0) && (m==2 || m1==2) && ((j<0 || j>29) || (j1<0 ||j1>29))) || ((test==1) && ((m==2) || (m1==2)) && ((j<0) || (j>28) || ((j1<0) || (j1>28)))))
printf("date invalide");
else
{
{
switch(m)
{
case 1: aux1=j;break;
case 2: aux1=j+28; break;
case 3: aux1=j+59; break;
case 4: aux1=j+89; break ;
case 5: aux1=j+120; break;
case 6: aux1=j+150; break;
case 7: aux1=j+181; break;
case 8: aux1=j+212; break;
case 9: aux1=j+242; break;
case 10: aux1=j+273; break;
case 11: aux1=j+303; break;
case 12: aux1=j+334; break;
}
s1=(a*365);
d1=s1+aux1;
}
{
switch(m1)
{
case 1: aux2=j1; break;
case 2: aux2=j1+28; break;
case 3: aux2=j1+59; break;
case 4: aux2=j1+89; break ;
case 5: aux2=j1+120; break;
case 6: aux2=j1+150; break;
case 7: aux2=j1+181; break;
case 8: aux2=j1+212; break;
case 9: aux2=j1+242; break;
case 10: aux2=j1+273; break;
case 11: aux2=j1+303; break;
case 12: aux2=j1+334; break;
}
s2=(a1*365);
d2=s2+aux2;
}
{
if(d1<d2)
printf("la difference entre les deux date est: %7.3f",d2-d1);
else if(d1>d2)
printf("la difference entre les deux date est: %7.3f",d1-d2);
else
printf("les deux dates sont egaux");
}
}
return(0);
}
0

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

Posez votre question
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009
29 oct. 2009 à 22:52
je suis obligé d'utiliser sauf que (if ) ou (switch)
si tu veut corrige la solution que j'ai demandé ... merci d'avance
0
pacorabanix
30 oct. 2009 à 01:22
le code que tu as donné ne compile même pas...

vérifies déjà le nombre de tes accolades !

Tu ne devrais pas avoir besoin d'un forum pour ça le compilateur te le dis.

Ensuite tu en mets beaucoup trop, à de nombreux endroits elles sont complètement inutiles.

Ton code est long, donc utilises les balises < code > (bouton à coté de gras italique souligné etc..)

ça donne ça :

#include<stdio.h>
int main (void){
    int j,j1,m,m1,a,a1,d1,d2,s1,s2,aux1,aux2;
    int test=0;
    printf("entrer le jour de la date1\n") ;
    scanf("%d",&j);
    printf("entrer le mois de la date1\n") ;
    scanf("%d",&m);
    printf("entrer l'année de la date1\n") ;
    scanf("%d",&a);
    printf("entrer le jour de la date2\n") ;
    scanf("%d",&j1);
    printf("entrer le mois de la date2\n") ;
    scanf("%d",&m1);
    printf("entrer l'année de la date2\n") ;
    scanf("%d",&a1);
    
    if ((a%4==0) || (a1%4==0))
        test=1;
    if (((m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12 || m1==1 || m1==3 || m1==5 || m1==7 || m1==8 || m1==10 || m1==12) && ((j<1||j>31) || (j1<1||j1>31))) || ((m==4 || m==6 || m==9 || m==11 || m1==4 || m1==6 || m1==9 || m1==11) && ((j<1 || j1>30) || (j1<1 || j1>30))) || ((test==0) && (m==2 || m1==2) && ((j<0 || j>29) || (j1<0 ||j1>29))) || ((test==1) && ((m==2) || (m1==2)) && ((j<0) || (j>28) || ((j1<0) || (j1>28)))))
        printf("date invalide");
    else {
        {
            switch(m) {
                case 1: aux1=j;break;
                case 2: aux1=j+28; break;
                case 3: aux1=j+59; break;
                case 4: aux1=j+89; break ;
                case 5: aux1=j+120; break;
                case 6: aux1=j+150; break;
                case 7: aux1=j+181; break;
                case 8: aux1=j+212; break;
                case 9: aux1=j+242; break;
                case 10: aux1=j+273; break;
                case 11: aux1=j+303; break;
                case 12: aux1=j+334; break;
            }
            s1=(a*365);
            d1=s1+aux1;
        }
        
        {
            switch(m1) {
                case 1: aux2=j1; break;
                case 2: aux2=j1+28; break;
                case 3: aux2=j1+59; break;
                case 4: aux2=j1+89; break ;
                case 5: aux2=j1+120; break;
                case 6: aux2=j1+150; break;
                case 7: aux2=j1+181; break;
                case 8: aux2=j1+212; break;
                case 9: aux2=j1+242; break;
                case 10: aux2=j1+273; break;
                case 11: aux2=j1+303; break;
                case 12: aux2=j1+334; break;
            }
            s2=(a1*365);
            d2=s2+aux2;
        }
        
        {
            if(d1<d2)
                printf("la difference entre les deux date est: %7.3f",d2-d1);
            else if(d1>d2)
                printf("la difference entre les deux date est: %7.3f",d1-d2);
            else
                printf("les deux dates sont egaux");
        }
    }
    
    return(0);
    }
}




Maintenant une dernière chose aussi : tu es sûr et certain que tu ne peux même pas décomposer ton code en plusieurs petites fonctions ? C'est très dur à lire et à s'y retrouver là.
0
pacorabanix > pacorabanix
30 oct. 2009 à 01:23
et tu vois où les accolades sont inutiles ?
0
pacorabanix > pacorabanix
30 oct. 2009 à 01:43
une petite remarque :

soit cohérent dans tes notations, j'ai perdu pas mal de temps à lire car à un moment tu fais :
j, m, a pour la date 1; j1, m1, a1 pour la date 2
et après
aux1 et s1 pour la date 1; aux2 et s2 pour la date 2.

Ce n'est pas le problème principal c'est vrai, mais pourtant comme tu es en train de le remarquer on passe beaucoup de temps à corriger son code, plus qu'à l'écrire au départ. Alors si tu veux pouvoir t'y retrouver toi même il faut avoir une bonne présentation, y compris dans les noms des variables.

De plus, il faut commenter ton code.



Et là où tu testes si les combinaisons mois/jours sont valides c'est juste complètement ilisible.

Utilises plutot un switch :
drapeauErreur=0;
//détermination du jour valable selon le mois
switch (mois) {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
  jourMax=31;
  break;

  case 4:
  case 6:
  case 9:
  case 11:
  jourMax=30;

  case 2:
  if (aBisext==0)
    jourMax=29;
  else
    jourMax=28;
}

// test du jour valable ou non
if (j<1 || j>jourMax)
    drapeauErreur=1;
    printf("Jour du premier mois invalide");
  }
// on fait en sorte de quitter après les tests si la variable drapeau vaut 1.

// (... autres tests pour les jours/mois/année ...)

if (drapeauErreur==1) {
  printf("Le programme ne peut continuer car une des dates est invalide");
  return 0;
}
//(...)



voilà, tu vois j'ai mis un truc en gras aussi. Ce genre de précision peut t'aider beaucoup à débugger !
0
pacorabanix > pacorabanix
30 oct. 2009 à 01:45
et enfin : pourquoi, même si ce n'est pas le problème je sais, utilises tu " %7.3f " dans ton printf pour afficher un résultat qui est censé être entier ???
0
xmen1919 Messages postés 8 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 31 octobre 2009
30 oct. 2009 à 19:22
merci beaucoup pour votre aide; je suis désolé ;j'ai trouvé une solution mais elle est trop longue,sayé j'ai résolu mon problème;merci une autre fois
voila la nouvelle solution:

#include<stdio.h>
#include<conio.h>
int main()
{
int DIFF,j1,m1,a1,j2,m2,a2;
printf("donner le jour du premier date");
scanf("%d",&j1);
printf("donner le mois du premier date");
scanf("%d",&m1);
printf("donner l'année du premier date");
scanf("%d",&a1);
printf("donner le jour du deuxieme date");
scanf("%d",&j2);
printf("donner le mois du deuxieme date");

scanf("%d",&m2);
printf("donner l'année du deuxieme date");
scanf("%d",&a2);
switch(m1)
{
case 1:case 3:case 5:case 7:case 8 :case 10:case 12:
if (j1>0&&j1<=31)
printf("La date 1 est valide");
else
printf("la date 1 est invalide");

break;
case 4:case 6:case 9:case 11:
if(j1>0&&j1<=30)
printf("La date 1 est valide");
else
printf("la date 1 est invalide");
break;
case 2:
if(a1%4==0)
if(j1>0&&j1<=29)
printf("la date 1 est valide");
else
printf("la date 1 est invalide");
else
if(j1>0&&j1<=28)
printf("la date 1 est valide");
else
printf("la date 1 est invalide");
break;
}

switch(m2)
{
case 1:case 3:case 5:case 7:case 8 :case 10:case 12:
if (j2>0&&j2<=31)
printf("\nla date 2 est valide");
else
printf("\nla date 2 est invalide");

break;
case 4:case 6:case 9:case 11:
if(j2>0&&j2<=30)
printf("\nla date 2 est valide");
else
printf("\nla date 2 est invalide");
break;
case 2:
if(a2%4==0)
if(j2>0&&j2<=29)
printf("\nla date 2 est valide");
else
printf("\nla date 2 est invalide");
else
if(j2>0&&j2<=28)
printf("\nla date 2 est valide");
else
printf("\nla date 2 est invalide");
break;
}
if(a1%4==0&&a2%4==0)
{
switch(m1,m2)
{
case 1:case 3:case 5:case 7:case 8 :case 10:case 12:
DIFF=(j1+(m1*31)+(a1*366))-(j2+(m2*31)+(a2*366));
printf("\nla difference est: %d",DIFF);
break;
case 4:case 6:case 9:case 11:
DIFF=(j1+(m1*30)+(a1*366))-(j2+(m2*30)+(a2*366));
printf("\nla difference est: %d",DIFF);
break;
case 2:
DIFF=(j1+(m1*29)+(a1*366))-(j2+(m2*29)+(a2*366));
printf("\nla difference est: %d",DIFF);
break;
}
}
else
{
switch(m1,m2)
{
case 1:case 3:case 5:case 7:case 8 :case 10:case 12:
DIFF=(j1+(m1*31)+(a1*365))-(j2+(m2*31)+(a2*365));
printf("\nla difference entre les deux dates est %d",DIFF);
break;
case 4:case 6:case 9:case 11:
DIFF=(j1+(m1*30)+(a1*365))-(j2+(m2*30)+(a2*365));
printf("\nla difference entre les deux dates est %d",DIFF);
break;
case 2:
DIFF=(j1+(m1*28)+(a1*365))-(j2+(m2*28)+(a2*365));
printf("\nla difference entre les deux dates est %d",DIFF);
break;
}
}
return(0);
}
0