Encore un probleme en C++ :( Tgrx, come on ;-) - Programmation
Marsh Posté le 13-06-2001 à 12:10:15
Ah oui, d'ailleurs j'avais corrige l'erreur dans la version que je t'ai envoyee hier.
C'est juste que quand tu debordes au niveau des mois, (m>12), tu fais a=a+1, ce qui est bien, mais ensuite il faut reinitialiser m avec 1, et non pas faire m=m-1
Parce qu'apres decembre, c'est janvier et pas novembre
Marsh Posté le 13-06-2001 à 12:11:27
tgrx a écrit a écrit : Ah oui, d'ailleurs j'avais corrige l'erreur dans la version que je t'ai envoyee hier. C'est juste que quand tu debordes au niveau des mois, (m>12), tu fais a=a+1, ce qui est bien, mais ensuite il faut reinitialiser m avec 1, et non pas faire m=m-1 Parce qu'apres decembre, c'est janvier et pas novembre |
MOI
Chui trop con
Marsh Posté le 13-06-2001 à 12:05:04
Bon, voila, j'ai suivi tes conseils, j'essaie de nettoyer un peu, et je viens de tomber sur un autre bug !
Quand je met 31/12/2000 et paiement différé, si je met 30 jours, je dois payer le 31/12/2001 et si je met 90... 31/12/2003
Le bug est dans la fonction ajout, mais je c pas trop ou :
ptre la :
while (nbj>nj[m])
{
nbj=nbj-nj[m];
m=m+1;
if (m>12)
{
a=a+1;
m=m-1;
}
}
HELPPPPP
//bibliotheque
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
//declarations des fonctions
int mois(char*, int&);
int jour(char*, int&);
int an(char*, int &);
int cal(int,int,int);
char *ajout(int, char t[]);
//variables
int choix1, choix2, choix3, i, j, k , l, m, a, nbj, exxit, pause;
char valeur[20], resu[20],c;
//tableaux d'affichage des infos possibles ligne 7
char* typ_paye[6] = {"chŠque","traite", "billet … ordre" , "espŠces" , "virement bancaire" , "relev‚ bancaire"};
char* tdelai[4] = {"comptant","dans 30 jours", "dans 60 jours" ,"dans 90 jours"};
char* quantieme[6] = {"au 5 du mois" , "au 10 du mois", "au 20 du mois" ,"au 25 du mois", "au dernier jour du mois" , "au meme quantieme que la facture"};
int delai[4]={0,30,60,90};
void main ()
{
//menu du paiement
exxit=0;
cout<<"bonjour, bienvenue dans le programme.";
cout<<"\nEntrer une date sous la forme JJ/MM/AAAA\n\t";
cin >> valeur;
jour (valeur, l);
mois (valeur,m);
an (valeur,a);
//verifications
if(l!=-1)
cout<<"\nVoici le jour : "<<l;
else
{
cout<<"**** Il y a une erreur sur le jour ***\n";
exxit=1;
};
if(m!=-1)
cout<<"\nVoici le mois : "<<m;
else
{
cout<<"**** Il y a une erreur sur le mois ***\n";
exxit=1;
};
if(a!=-1)
cout<<"\nVoici l'ann‚e : "<<a;
else
{
cout<<"**** Il y a une erreur sur l'ann‚e ***\n";
exxit=1;
};
// verification : si erreur, fin du programme.
if(exxit==1)
{
cout<<"\n\tFin du programme : Vous avez entr‚ une date erronn‚e ...";
cin>>pause;
exit(0);
};
do // tant que choix<>0 a 6 alors afficher menu de type paiement
{
cout<< "\nVeuillez choisir le type de paiment : \n";
cout<<"\t0 - chŠque\n";
cout<<"\t1 - traite\n";
cout<<"\t2 - billet … ordre\n";
cout<<"\t3 - espŠces\n";
cout<<"\t4 - virement bancaire\n";
cout<<"\t5 - relev‚ bancaire\n";
cout<<"\t6 - quitter\n";
cin>>choix1;
cout<<"\n";
}
while (choix1<0 ||choix1>6);
if (choix1==6) // on quitte l'application
{
cout<<"\n\tVous avez choisi de quitter le programme ....";
cout<<"\n\tA bient“t !";
exit(0);
};
do //tant que choix2<>0 a 3, afficher menu echéance de paiement
{
cout<<"\nVeuillez choisir le type de paiement : "<<"\n";
cout<<"\t0 - comptant\n";
cout<<"\t1 - 30 jours\n";
cout<<"\t2 - 60 jours\n";
cout<<"\t3 - 90 jours\n";
cin>>choix2;
cout<<"\n";
}
while (choix2<0 ||choix2>3);
//Menu du choix au quantieme
do // tant que choix3<> 0 a 5, afficher menu type de quantieme
{
cout<< "Veuillez choisir le quantiŠme : \n";
cout<<"\t0 - au 5 du mois\n";
cout<<"\t1 - au 10 du mois\n";
cout<<"\t2 - au 20 du mois\n";
cout<<"\t3 - au 25 du mois\n";
cout<<"\t4 - au dernier jour du mois\n";
cout<<"\t5 - au mˆme quantiŠme que de la facture\n";
cin>>choix3;
cout<<"\n";
}
while (choix3<0 ||choix3>5);
//affichage des reponses de l'utilisateur
cout<<"Vous avez choisi de payer en "<<typ_paye[choix1];
cout<<"\n";
cout<<"Vous preferez payer "<<tdelai[choix2];
cout<<"\n";
cout<<"Vous payerez "<<quantieme [choix3];
cout<<"\n";
cout<<"\n";
strcpy(resu,ajout(delai[choix2],valeur)); // copie de la chaine ajout dans resu
cout<<"AprŠs calcul, vous devrez payer le :"<<resu<<"\n";
cout<<"\n";
cout<<"\n";
cal(l,m,a);
}
int jour(char*d, int &j)
{
int nj[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //nombre de jours par mois
int i, k, m, a, r;
//analyse de la chaine de caractere JJ/MM/AA pour retourner le jour
i=d[0] - 48;
k=d[1] - 48;
j=i*10 + k;
mois(d,m);
an(d,a);
r=a%4;
if(m==2&&r==0)nj[1]=29; //verification année bisextille : fevrier 29 jours
if(j>nj[m-1])j=-1; // erreur
return 0;
}
int mois(char*d, int &j)
{
int i, k;
//analyse de la chaine de caractere JJ/MM/AA pour retourner le mois
i=d[3]-48;
k=d[4]-48;
j=i*10 + k;
if(j<1||j>12)j=-1; //erreur
return 0;
}
int an(char *d, int &j)
{
int i, k,l,m;
//analyse de la chaine de caractere JJ/MM/AA pour retourner l'année
i=d[6] - 48;
k=d[7] - 48;
l=d[8] - 48;
m=d[9] - 48;
j=i*1000 + k*100 +l*10+m;
if(j<=1980|| j>2010) j=-1; //erreur
return 0;
}
char *ajout(int nbj , char valeur[]) // ajoute le nombre de jour nécessaire
{
char resu[20];
int j;
int nj[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
jour(valeur, j);
mois(valeur,m);
an(valeur,a);
nbj = nbj + j;
while (nbj>nj[m])
{
nbj=nbj-nj[m];
m=m+1;
if (m>12)
{
a=a+1;
m=m-1;
}
}
resu[0] = nbj/10 + 48;
resu[1] = nbj%10 + 48;
resu[2] ='/';
resu[3] = m/10 + 48;
resu[4] = m%10 + 48;
resu[5] ='/';
resu[6] = a/1000 + 48;
resu[7] = (a%1000)/100 + 48;
resu[8] = ((a%1000)%100)/10 + 48;
resu[9] = ((a%1000)%100)%10 + 48;
resu[10] = ' ';
return resu;
}
int cal(int jour,int mois,int annee) //creation du calendrier
{
int mat[5][7];
int r,nb1,nb2,j,i,k=1;
int nj[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char* tabjour[7]={"D","L","M","M","J","V","S"};
int t[]={0,0,31,59,90,120,151,181,212,243,273,304,334,365};
nb1=(annee-1)*365+(annee-1)/4-(annee-1)/100+(annee-1)/400;
nb2=t[mois]+jour;
for(i=0;i<5;i++)
{
for(j=0;j<7;j++)
mat[i][j]=0;
}
if(mois>2)
{
r=annee%4;
if(r==0) nb2=nb2+1;
};
r=(nb1+nb2)%7;
cout<<"\n";
int debut = ((jour-r)-1)%7 - 6;
for(i=0;i<5;i++)
{
for(j=0;j<7;j++)
{
if(i==0 && (debut+j<1)) mat[i][j]=0;
else
{
if (k<nj[mois]+1)
{
mat[i][j]=k;
k++;
}
}
}
}
for(i=0;i<7;i++)
cout<<tabjour[i]<<"\t";
cout<<"\n"<<"\n";
for(i=0;i<5;i++)
{
for(j=0;j<7;j++)
cout<<mat[i][j]<<"\t";
cout<<"\n";
}
cin >> k;
return 0;
}