C++ : Trouver le Bug ! Un cado a gagner !!

C++ : Trouver le Bug ! Un cado a gagner !! - Programmation

Marsh Posté le 12-06-2001 à 16:53:53    

Voila, j'en ai marre, je trouve pas l'erreur, et g trop besoin ke ca marche.
J'offre un cado a celui ki trouve la solution :  
le probleme : le calendrier généré en fin de programme ne fonctionne pas. Par exemple : pour le 12/06/2001, il dira Mercredi, alors, que ca tombe un Lundi.
 
VOila le programme :
 
 
 
//********************************************************************************
//
//              APPLICATION PROFESSIONEL 1 - 2ieme Année BTS
//
//
//********************************************************************************
 
 
//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[13] = {"chŠque","traite", "billet … ordre" , "espŠces" , "virement bancaire" , "relev‚ bancaire"};
char* tdelai[13] = {"comptant","dans 30 jours", "dans 60 jours" ,"dans 90 jours"};
char* quantieme[13] = {"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
 
        {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)
  {
  cout<<"\n\tVous avez choisi de quitter le programme ....";
                cout<<"\n\tA bient“t !";
  exit(0);
 };
 
 do
 {
 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
 
 {
        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 des menus
 
 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));
        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};
  int i, k, m, a, r;
  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;
  if(j>nj[m-1])j=-1;
 return 0;
 }
 
 int mois(char*d, int &j)
 {
  int i, k;
  i=d[3]-48;
  k=d[4]-48;
  j=i*10 + k;
  if(j<1||j>12)j=-1;
 return 0;
 }
 
 int an(char *d, int &j)
  {
   int i, k,l,m;
   
   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;
   
  return 0;
  }
 char *ajout(int nbj , char valeur[])
 {  
  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)
 {
  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";
   
  for(i=0;i<5;i++)
  {
   for(j=0;j<7;j++)
   { if(i==0 && j<r) mat[i][j]=0;
   else
   {
      if (k<nj[mois]+1)
      {
    mat[i][j]=k;
      k++;
      }
   }
   }
        }
 
 for(i=0;i<7;i++)
 // if (tabjour[i]==0);
 //  cout<<".";
 // else
  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;
 
 }

 

[edit]--Message édité par fabd--[/edit]

Reply

Marsh Posté le 12-06-2001 à 16:53:53   

Reply

Marsh Posté le 12-06-2001 à 17:03:20    

J'ai pas trouve le bug, mais deja dans ta fonction ajout, tu renvoies l'adresse d'une variable locale 'resu'... tres mauvais.

Reply

Marsh Posté le 12-06-2001 à 17:06:11    

donc remplacer

Code :
  1. char resu[20];


par

Code :
  1. char* resu= new char[20];

Reply

Marsh Posté le 12-06-2001 à 17:07:34    

tgrx a écrit a écrit :

donc remplacer

Code :
  1. char resu[20];


par

Code :
  1. char* resu= new char[20];






 
et penser au delete...
 
Par contre sais tu que on peut mettre des commentaires pour aider a la relecture :D

Reply

Marsh Posté le 12-06-2001 à 17:14:02    

Ti voudrai pas me traduire au passage ? :D

Reply

Marsh Posté le 12-06-2001 à 17:23:12    

Pfffou.... c'est pas pour etre mechant mais... c'est super mal ecrit, quasi impossible a relire... :sweat:

Reply

Marsh Posté le 12-06-2001 à 17:24:09    

Bon j'en suis pas sur mais je crois qu'il y a un zéro en trop dans l'initialisation de ton tableau t[] de la fonction cal(...)
enfin si j'ai bien compris l'utilité de ce tableau.
 
Voilà
@+
Archangel
 
PS: si c'est bien ça le bug ben pour le cadeau un million de francs en liquide serait là le bienvenu et en petite coupures avec les numéros de séries qui ne suivent pas je vérifierai.


---------------
J'suis timide - Prêt à mourir, mais pas à vivre - Je suis vraiement très fatigué ... - more than meets the eye
Reply

Marsh Posté le 12-06-2001 à 17:31:56    

J'appel la banque si ca marche

Reply

Marsh Posté le 12-06-2001 à 17:34:43    

fabd> ta formule pour trouver le jour est correcte, c'est ta fonction d'affichage qui fait n'importe quoi... je te donne la version correcte dans 5 minutes... et ton tableau des jours est bon aussi...

Reply

Marsh Posté le 12-06-2001 à 17:35:46    

Non, ce n'est pas ca.
 
 
Merci tgrx :jap:

Reply

Marsh Posté le 12-06-2001 à 17:35:46   

Reply

Marsh Posté le 12-06-2001 à 17:37:24    

Adieu gentil million  :cry:


---------------
J'suis timide - Prêt à mourir, mais pas à vivre - Je suis vraiement très fatigué ... - more than meets the eye
Reply

Marsh Posté le 12-06-2001 à 17:45:43    

Voici ce que tu dois remplacer a l'interieur de la fonction cal... en fait ta fonction precedente faisait varier le calendrier avec le jour courant (on n'avait pas le meme calendrier de juin 2001 pour le 01/06/2001 et le 02/06/2001).
 

Code :
  1. int debut = ((jour-r)-1)%7 - 6;
  2.   for(i=0;i<5;i++)
  3.     {
  4.       for(j=0;j<7;j++)
  5. { if(i==0 && (debut+j<1)) mat[i][j]=0;
  6. else
  7.   {
  8.     if (k<nj[mois]+1)
  9.       {
  10.  mat[i][j]=k;
  11.  k++;
  12.       }
  13.   }
  14. }
  15.     }


 
 
Et maintenant, je veux le cadeau :D

Reply

Marsh Posté le 12-06-2001 à 17:49:46    

Eh, kestion, je le met ou ce bout de code ??
Je supprime toute la fonction Cal en ne laissant kes les tablo ?
 
 
Je c, chui nul :D

Reply

Marsh Posté le 12-06-2001 à 17:50:12    

Dit tgrx tu veux pas partager le million :love:


---------------
J'suis timide - Prêt à mourir, mais pas à vivre - Je suis vraiement très fatigué ... - more than meets the eye
Reply

Marsh Posté le 12-06-2001 à 17:52:27    

archangel> euh... NAN :p
 
fabd>
 

Code :
  1. int cal(int jour,int mois,int annee)
  2. {
  3.   int mat[5][7];
  4.   int r,nb1,nb2,j,i,k=1;
  5.   int nj[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  6.   char* tabjour[7]={"D","L","M","M","J","V","S"};
  7.   int t[]={0,0,31,59,90,120,151,181,212,243,273,304,334,365};
  8.  
  9.   nb1=(annee-1)*365+(annee-1)/4-(annee-1)/100+(annee-1)/400;
  10.   nb2=t[mois]+jour;
  11.   for(i=0;i<5;i++)
  12.     {
  13.       for(j=0;j<7;j++)
  14. mat[i][j]=0;
  15.     }     
  16.  
  17.  
  18.   if(mois>2)
  19.     {
  20.       r=annee%4;
  21.       if(r==0) nb2=nb2+1;
  22.     };
  23.   r=(nb1+nb2)%7;
  24.   cout<<"\n";
  25.  
  26.   int debut = ((jour-r)-1)%7 - 6;
  27.   for(i=0;i<5;i++)
  28.     {
  29.       for(j=0;j<7;j++)
  30. { if(i==0 && (debut+j<1)) mat[i][j]=0;
  31. else
  32.   {
  33.     if (k<nj[mois]+1)
  34.       {
  35.  mat[i][j]=k;
  36.  k++;
  37.       }
  38.   }
  39. }
  40.     }
  41.  
  42.   for(i=0;i<7;i++)
  43.     // if (tabjour[i]==0);  
  44.     //  cout<<".";  
  45.     // else  
  46.     cout<<tabjour[i]<<"\t";
  47.   cout<<"\n"<<"\n";
  48.   for(i=0;i<5;i++)
  49.     {
  50.       for(j=0;j<7;j++)
  51. cout<<mat[i][j]<<"\t";
  52.       cout<<"\n";
  53.     }
  54.   cin >> k;
  55.   return 0;
  56. }

Reply

Marsh Posté le 12-06-2001 à 17:53:36    

fabd > a propos, "APPLICATION PROFESSIONEL", ca prend 2 n, 2 l et un e... :D

Reply

Marsh Posté le 12-06-2001 à 17:54:43    

Trgx, je t :love:  
 
Attends, je relance un coup pour voir si g pas rever :D

Reply

Marsh Posté le 12-06-2001 à 17:55:56    

fabd> c'est tgrx, pas trgx :benetton:

Reply

Marsh Posté le 12-06-2001 à 17:56:14    

Arf, j'avais pas vu ke tu avais poster la fonction entiere, c pour ca ke j été etonné de l'avoir bien placé du 1er coup :D
 
Dernier essai :)

Reply

Marsh Posté le 12-06-2001 à 17:57:26    

tgrx a écrit a écrit :

fabd> c'est tgrx, pas trgx :benetton:




 
 
 :love:  :love:  :love:  :love:  
 
Bon, keske je peux t'offrir ? :hello:  
(le million, c si g 20/20 a l'oral :D)

Reply

Marsh Posté le 12-06-2001 à 17:58:53    

Chaipo, de toute facon je suis pas en France en ce moment... ca va etre dur :D
 
Pour ton oral, ils s'appellent comment tes profs (pour que tu puisses avoir un 20/20... :p) ??

Reply

Marsh Posté le 12-06-2001 à 18:00:43    

Ben chai po, c mon oral de BTS :p

Reply

Marsh Posté le 12-06-2001 à 18:03:27    

D'ailleurs si t'as rien a faire, retouche ton code avant ton oral, parce que la il est vraiment crado... organise tes donnees, ajoute des commentaires, autrement tes examinateurs vont tirer la tronche...

Reply

Marsh Posté le 12-06-2001 à 18:04:54    

C clair, c ce ke je comptai faire une foi ce probleme résolu.
encore merci :hello:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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