Gestion de compte(primitif)

Contenu du snippet

C'est en gros mon premier programme que je peux utiliser.(je débute en c++)Il cree des fichier .bank dans lesquels on peut saisir ses lignes de compte,et calcule automatiquement le nouveau solde a partir des operations effectuées.Il utilise surtout les entrees/sorties sur disque dur, et les moyens pas tres esthétiques que g inventés pr trier et recupérer des informations dans des fichiers puis les afficher a l'ecran.Persuader de la faiblesse de mon code je le soumet a vos critiques dans l'espoir de progresser.J'amerai notemment pouvoir supprimer des lignes dans un fichier, et trouver un moyen de formater autrement les données que je rentre.

Source / Exemple :


#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <fstream>
#include <string.h>
#include <sstream>
using namespace std;

void menu_1(void);
void menu_2(void);
void recup_ligne(void);
void cut_ligne(const string &,BOOL);
void modification_compte(void);
void quit(int);
float recup_solde(void);
float trans_str(const string &);                   //transforme une chaine de caractere en un float
void creer_nouv_compte (void );
void acces_compte(void);
int appel_erreur (int);
float recup;                                       
string nom_compte_courant;         

int main()
{
    menu_1();
    quit(1);
    return 0;
}
    
void menu_1()                                              
{
     int choix;
     cout << "MENU  :                 \n";
     cout << "1-Creer nouveau compte  \n"; 
     cout << "2-Acces compte existant \n";
     cout << "3-Quit \n";
     cout << "CHOIX : "; cin >> choix;
     switch(choix)
     {
        case 1 :
             creer_nouv_compte();
        case 2 :
             acces_compte();
        case 3 :
             quit(1); 
        default: quit(1);        
     }
}     
     
     
    
void menu_2()
{
     int choix;
     cout << "MENU  : \n";
     cout << "1-Consultation de solde \n"; 
     cout << "2-Modifications \n";
     cout << "3-Retour \n";
     cout << "4-Quit\n";
     cout << "CHOIX : "; cin >> choix;
     
     switch(choix)
     {
        case 1 :
             recup_ligne();
        case 2 :
             modification_compte();
        case 3 :
             cout << "\n";
             menu_1();     
        case 4 :
             quit(2); 
        default: quit(2);        
     }
     
      
}

void creer_nouv_compte()
{
     string ch1, ch2 (".bank"), nom, separator = "*";       //l'extension ".bank" est rajoutee au nom
     cout << "nom du compte : "; cin >> ch1;
     nom = ch1 + ch2;
     
     ofstream fichier (nom.c_str(), ios_base::app); 
     if (fichier) 
     {
         cout << "Compte cree!!! \n";
         fichier.close();
     
         ofstream fichier ("INDEX.bank", ios_base::app);      //ouvre un fichier index ou st stockes les noms des comptes existants
         if (fichier)
         {
             fichier << nom << separator;
             fichier.close();
         }
         else
         {
             appel_erreur (1);
             cout << "\n";
             menu_1();
         }                
         cout << "\n";        
         menu_1();
     }
     else
     {
         appel_erreur (1);
         cout << "\n";
         menu_1();
     }                 
}
     
void acces_compte()                                                                    //liste les comptes crees et permet d'y acceder.
{
     int no_line = 0, choix;
     string tbl_line[10], line;
     ifstream fichier ("INDEX.bank");
     if (fichier)
     {
                 cout << "\n";
                 while ( getline ( fichier, line, '*') )                              //cut tous les '*' et stock danss line
                 {
                        tbl_line [no_line] = line; no_line++;
                        cout << no_line << "->" << line << endl;
                 }
                 
                 cout << "No du compte a consulter?:  ";
                 if (cin >> choix) 
                 {        
                     if (choix <= no_line)
                     {
                         nom_compte_courant = tbl_line[ choix - 1];                     //recupere le nom du compte a ouvrir "choix - 1 " car les tableaux commencent a 0 et la liste affichee a 1.
                         fichier.close(); 
                         cout << "\n";
                         menu_2(); 
                     }
                     else 
                     { 
                          cout << "\n";
                          cout << "ERREUR: COMPTE INEXISTANT\n" ;
                          cout << "\n";
                          menu_1();
                     }        
                 }
                 else
                 {
                     appel_erreur (2);
                     cout << "\n";
                     menu_2();
                 }    
                    
     }
     else 
     {
     appel_erreur (1);
     cout << "\n";
     menu_1();
     }
}     
     
     
     
int appel_erreur(int erreur)
{
    if (erreur == 1)
    {
               cerr << "ERREUR: ACCES FICHIER IMPOSSIBLE";
    }
    if (erreur == 2)
    {
               cerr << "ERREUR: SAISIE INCORECTE";
    }                              
}     

     
void recup_ligne()                                               //recupere les lignes de compte et les affiche
{
    string ligne; 
    ifstream fichier( nom_compte_courant.c_str() );             //le nom du fichier a lire doit etre de type const *char

    if ( fichier )                                                            
    {   
        cout << "DATE" << setw(19) << "CREDIT" << setw(13) << "DEBIT" << setw(13) << "SOLDE" << setw(25) << "COMMENTAIRE" << endl;                                                                                                              
        while ( getline( fichier, ligne, '%' ) )
        {
               cut_ligne(ligne,0);                               //coupe la chaine ligne et l'affiche par morceaux
        }   
        fichier.close(); 
    }     
                                                                 // cette boucle s'arrête dès qu'une erreur de lecture survient 
    else
    {
        appel_erreur (1);
        quit(2);
    }
    cout << endl;
    menu_2();
}
    
    
void modification_compte()                                                        //permet de creer des nouvelles lignes de compte 
{
     float solde;
     string separator = "*",fl = "%", date, credit, debit, commentaire;
     cout << "\n\n" << "DATE? (  /  /  ) : ";cin >> date;
     cout <<  "credit? : ";cin >> credit;
     cout <<  "debit? : "; cin >> debit;
     cout << "commentaire?: (Pas plus de 20!)"; cin >> commentaire;
     solde = recup_solde();                                                         //recuper l'ancien solde et calcule le nouveau avec le debit et le credit
     
     solde = solde +trans_str(credit);
     solde = solde - trans_str(debit);                                    
     
     
     
     ofstream file (nom_compte_courant.c_str() , ios_base::app);
     if (file)
     {
         file << date << separator << credit << separator << debit << separator << solde << separator << commentaire << fl;
         file.close();
     }
     else
     {
         appel_erreur (1);
         quit(2);
     }
     cout << "\n";
     menu_2();
}

float recup_solde()
{
      string ligne;
      string tbl_ligne[2];
      float solde;
      int compteur = 0, i = 0;
      
      ifstream fichier (nom_compte_courant.c_str() );
      if ( fichier )
      {
          while ( getline( fichier, ligne, '%' ) ) {tbl_ligne[i] = ligne; i++; compteur++; cout << "\n"; }      //recupere la derniere ligne du fichier
          fichier.close();
      } 
      else
      {
          appel_erreur (1);
          quit(2);
      }       
      
      if ((ligne == "") && (compteur == 0))                                                                  //si rien ds fichier requete du solde initial
      {
          cout << "Solde initial?:  "; cin >> solde;
          return solde; 
      }   
      else 
      { 
          cut_ligne(tbl_ligne[i-1], 1);                                                                      //coupe la chaine et extrait le solde (BOOL = 1)
          return recup;
      }
}

float trans_str( const string & str)                                                                           //transforme une string en float
{
      istringstream iss( str );
      float nombre;
      iss >> nombre;
      return nombre;
}

void cut_ligne(const string & str, BOOL B)                                                                      //cut str
{
     string tbl_mot[10], mot;
     int i = 0;
    
        istringstream iss( str );
        while (getline( iss, mot, '*' ) )                          //coupe la chaine tous les * et stock les coupes ds tbl_mot
        {
              tbl_mot[i] = mot; 
              i++ ; 
        }
        
     if (B == 0)
     {   
        cout << tbl_mot[0] << setw(15) << tbl_mot[1] << setw(13) << tbl_mot[2] << setw(13) << tbl_mot[3] << setw(25) << tbl_mot[4] << endl;
     }
     if (B == 1)
     {
         recup = trans_str(tbl_mot[3]);                                          //la fonction recup_solde retourne recup qui est une variable locale
     }
}

         
            
void quit(int param)
{ 
     string reponse;
     cerr << "\n" << "Quitter? O/N :\n"; cin >> reponse;
     if (reponse == "o" || reponse == "O") {
     exit(0); } 
     if (reponse == "n" || reponse == "N")
     {
                 cout << endl; 
                 if (param == 1)
                 {
                     menu_1();
                 }
                 else
                 {
                     menu_2();
                 }
     }
                          
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.