Encore un probleme en C++ :( Tgrx, come on ;-)

Encore un probleme en C++ :( Tgrx, come on ;-) - Programmation

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 :o
 
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 :cry:  
//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;  
}

Reply

Marsh Posté le 13-06-2001 à 12:05:04   

Reply

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 :)

Reply

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  :gun:  :gun:  :gun:  
 
Chui trop con :cry:

Reply

Marsh Posté le 13-06-2001 à 12:13:22    

Ca l'air d'aller :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed