Bonjour, j'ai écris le code d'un petit programme qui est censé calculer le lendemain d'une date préalablement rentrée au clavier, mais voilà lors de l'exécution du programme tout se passe bien sauf que si je rentre une fin d'année (exemple: 31/12/2006) la fonction me renvoie 1/13/2006.
J'ai relus plusieurs fois mon code et je ne vois toujours pas ce qui cloche:
#include <stdio.h> #include <stdlib.h>
// retourne 1 si l'anne est bissextile et 0 si c'est le contraire int bissextile(int an) { if(an%400==0)return1; if(an%100==0)return0; if(an%4==0)return1; return0; }
// retourne la longueur du mois selon le mois et l'année int longueur_mois(int m,int a) { switch(m) { case1: return31; case2: if(bissextile(a)) return29; else return28; case3: return31; case4: return30; case5: return31; case6: return30; case7: return31; case8: return31; case9: return30; case10: return31; case11: return30; case12: return31; default: return0; } }
// retourne 0 si la date n'est pas valide et 1 dans le cas contraire int est_valide(int j, int m, int a) { if(((j > 0) && (j <= longueur_mois(m,a)) && ((m > 0) && (m < 13)))) return1; else return0; }
// renvoi vrai si la date est une fin de mois int fin_mois(int j, int m, int a) { if(j == longueur_mois(m,a)) return1; }
// renvoi vrai si la date est une fin d'année int fin_annee(int j, int m, int a) { if((m == 12) && (j == fin_mois(j,m,a))) return1; }
void lendemain(int j,int m,int a) { int j2=j; int m2=m; int a2=a;
// retourne 1 si l'anne est bissextile et 0 si c'est le contraire int bissextile (int a) { if(a % 400 == 0) return1;
if(a % 100 ==0) return0;
if(a % 4 == 0) return1;
return0; }
// retourne la longueur du mois selon le mois et l'année int longueur_mois (int m, int a) { switch(m) { case1: return31; case2: if(bissextile(a)) return29; else return28; case3: return31; case4: return30; case5: return31; case6: return30; case7: return31; case8: return31; case9: return30; case10: return31; case11: return30; case12: return31; default: return0; } }
void lendemain (int j, int m, int a) { if(j > 0 && j < longueur_mois (m, a) && m > 0 && m <= 12)
j++;
else {
j = 1;
if(m == 12) {
m = 1;
a++; }
else
m++; }
printf("La date du lendemain est: %d/%d/%d \n", j, m, a); }
En gors le probleme venait de ton test de validite, de ton incrementation d'annee et de mois, et de tes declaration de variable, j'ai oter queqlue fonction et quelques variable complketement inutile.
Bonjour, j'ai écris le code d'un petit programme qui est censé calculer le lendemain d'une date préalablement rentrée au clavier, mais voilà lors de l'exécution du programme tout se passe bien sauf que si je rentre une fin d'année (exemple: 31/12/2006) la fonction me renvoie 1/13/2006.
Les effets ravageurs d'un usage abusif de return et d'une mauvaise indentation. On fini par écrire des fonctions qui non pas de return dans certains cas.
// renvoi vrai si la date est une fin de mois int fin_mois (int j, int m, int a) { if(j == longueur_mois (m, a)) return1; }
// renvoi vrai si la date est une fin d'année int fin_annee (int j, int m, int a) { if((m == 12) && (j == fin_mois (j, m, a))) return1; }
Heureusement, un bon compilateur bien reglé s'en aperçoit...
Project : Forums
Compiler : GNU GCC Compiler (called directly)
Directory : C:\dev\forums2\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c: In function `fin_mois':
main.c:67: warning: control reaches end of non-void function
main.c: In function `fin_annee':
main.c:74: warning: control reaches end of non-void function
Linking console executable: C:\dev\forums2\console.exe
Process terminated with status 0 (0 minutes, 4 seconds)
0 errors, 2 warnings
Eh bien mes fonctions fin_mois et fin_annee ne comportent qu'un return chacunes, je ne comprends pas ce qui cloche ?
Il y a des cas où il n'y a pas de return du tout, donc la valeur retournée est indéfinie. Ca invoque un comportement indéfini, ce qui est un bug gravissime.
Quand je dis "un return par fonction", ça veut dire que return est la dernière instruction :
int f(des_parametres) { int xxx = 0;
/* tout ce qu'on veut sauf return */
return xxx; }
Ecrit toutes tes fonctions sur ce modèle et tu n'auras plus jamais ce problème.
J'ai modifié mon code ainsi mais rien y fait, en principe ça devrait marcher:
#include <stdio.h> #include <stdlib.h>
// retourne vrai si l'année entrée est bissextile et faux pour le contraire int bissextile(int an) { if(an%400==0)return1; if(an%100==0)return0; if(an%4==0)return1; return0; }
// retourne la longueur du mois en fonction du mois et de l'année int longueur_mois(int m,int a) { switch(m) { case1: return31; case2: if(bissextile(a)) return29; else return28; case3: return31; case4: return30; case5: return31; case6: return30; case7: return31; case8: return31; case9: return30; case10: return31; case11: return30; case12: return31; default: return0; } }
// renvoi vrai si la date est une fin d'année int fin_annee(int j, int m, int a) { int vof; if(j==longueur_mois(m,a) && m==12)
vof=1; else
vof=0; return vof; }
// renvoi vrai si la date est une fin de mois int fin_mois(int j,int m,int a) { int vof; if(j=longueur_mois(m,a))
vof=1; else
vof=0; return vof; }
int est_valide(int j, int m, int a) { int vof; if((j>0 && j<=longueur_mois(m,a)) && (m>0 && m<13))
vof=1; else
vof=0; return vof; }
void lendemain(int j, int m, int a) { int j2,m2,a2; if(est_valide(j,m,a)) { if(fin_annee(j,m,a)) {j2=1;m2=1;a2=a+1;} elseif(fin_mois(j,m,a)) {j2=1;m2=m+1;a2=a;} else {j2=j+1;m2=m;a2=a;}
printf("%d/%d/%d",j2,m2,a2); } else printf("Cette date n'est pas valide !"); }
// fonction de test void essai() { int j,m,a; printf("Donner le jour: ");
scanf("%d",&j); printf("Donner le mois: ");
scanf("%d",&m); printf("Donner l'annee: ");
scanf("%d",&a);
lendemain(j,m,a); }
int main(int argc, char *argv[]) {
essai();
return0; }
ps: merci pour ceux qui m'ont proposé d'autres solutions mais je veux integrer toutes les fonctions présentes car j'en aurai besoin par la suite.
Essay de reprendre mon code, tu recrer les 2 fonctions que j'ai oter et les variables que j'ai oter aussi, je les avait oter car avec ce que tu nous avez dit elles etaient inutiles.
Bonsoir tout le monde, on me demande d'ecrire un programme qui permet à un utilisateur de saisir une date (jour, mois, année) . Le programme teste si la date est valide. J'ai déclaré le jour, le mois et l'année mais je ne comprends pas le reste
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Bonhomme !! | Jeu de plateforme : Prototype.