#include #include #include #include #include #include // Coduri returnate de program: // -0 - iesire normala // -1 - banca.dat nu poate fi gasit // -2 - inregistrarea nu poate fi gasita in fisier. // -3 - fatal error for file operations #define NMAX_CONT 100 // Numarul maxim admix de cifre pentru un cont #define NMAX_NUME_TITULAR 100 // Numarul maxim de caractere ce poate fi stocat in campul corespunzator // numelui titularului. Numarul maxim admis de caractere pentru numele // titularului contului respectiv. #define NMAX_VALUTE 2 // Numarul maxim admis de valute #define NMAX_PAROLA 100 // Numarul maxim admis de caractere pentru parola #define DOBANDA (14/100) typedef struct { char titular[NMAX_NUME_TITULAR], numar[NMAX_CONT]; // Nu se folosesc pointeri in acest caz pentru ca atunci cand se face // copierea unui obiect pe stiva s-ar copia numai // pointeri. In momentul in care se iese dintr-o procedura // se va apela un destructor care ar distruge // datele obiectului original (mai precis continutul variabilelor titular si // numar). Ori este posibil ca in aceste zone de memorie (cele indicate de // "titular" si "nume" - ca pointeri) sa fie inca date utile. unsigned long int sold; unsigned valuta; } Inregistrare; class ContBancar { // Datele trebuie protejate de accesul direct din exterior // Accesul la date se va face controlat, numai prin metodele // membre ale clasei. private: Inregistrare Continut; // Datele nucleu continute de obiect void InitializareMemorieObiect(); // Se ocupa de alocarea variabilelor continute in obiect // Completed void StergereMemorieObiect(); // Se ocupa de dealocarea variabilelor continute in obiect // Completed public: ContBancar(); // Constructor simplu (vid) folosit pentru obiectele temporare (de exemplu la // operatorii supraincarcati). ContBancar(const char *, const char *, const unsigned long int, const unsigned); // Constructor din date elementare // Completed ContBancar(const int); // Constructor care foloseste intrarea de la consola ContBancar(const char *); // Parametrul constructorului are in aceaste situatii si rolul // de a selecta varianta dorita de constructor (cu intrare de la consola, // respectiv cu intrare din fisier). ContBancar operator =(ContBancar); ContBancar operator +=(ContBancar); ContBancar operator +=(unsigned long int); ContBancar operator -=(unsigned long int); friend ostream &operator << (ostream &, ContBancar &); // Completed friend istream &operator >> (istream &stream, ContBancar &); // Completed // Ultimii doi operatori (cei de instrare/iesire, "<<" si ">>" care sunt // supraincarcati) trebuie declarati ca "friend" pentru a avea acces la // datele instantei acestei clase (date care sunt private). // Acesta este modul tipic de supraincarcare a operatorilor "<<" si ">>" // in C++. void depun(unsigned long int); void retrag(unsigned long int); unsigned long int spune_total(); ~ContBancar(); }; void ContBancar::depun(unsigned long int x) { Continut.sold+=x; } void ContBancar::retrag(unsigned long int x) { Continut.sold-=x; if (Continut.sold<0) Continut.sold=0; } unsigned long int ContBancar::spune_total() { unsigned long int total=0; ifstream banca("banca.dat", ios::binary | ios::in); while (!banca.eof()) { ContBancar tmp; banca.read((unsigned char *)&tmp, sizeof(Inregistrare)); total+=tmp.Continut.sold; } banca.close(); return total; } ContBancar::ContBancar() { this->InitializareMemorieObiect(); } ContBancar::ContBancar(const char *titular, const char *numar, const unsigned long int sold, const unsigned valuta) // Constructorul din date elementare // Completed { this->InitializareMemorieObiect(); ostrstream iesire_titular(Continut.titular, NMAX_NUME_TITULAR); ostrstream iesire_numar(Continut.numar, NMAX_CONT); // Se utilizeaza acestea pentru a evita folosirea unor apeluri specifice // pentru limbajul C (cum ar fi de exemplu strcpy(), memcpy(), malloc(), // calloc(), free() etc. // In intregul program se va evita folosirea unor functii specifice // limbajului C. Continut.sold=sold; Continut.valuta=valuta; iesire_titular< end string (null char) i. e. '\0' } ContBancar::ContBancar(const int i) // Constructor folosind intrarea de la consola // Password reading without echo remained. { // char parola[NMAX_PAROLA]; this->InitializareMemorieObiect(); cout<<"Numele este: "; cin.get(Continut.titular, NMAX_NUME_TITULAR+1); cout<<"Numarul contului este: "; cin>>Continut.numar; // cout<<"Parola este: "; // cin.get(parola, NMAX_PAROLA+1); cout<<"Soldul este: "; cin>>Continut.sold; cout<<"Valuta folosita (0-"<>Continut.valuta; } ContBancar::ContBancar(const char *numar) // Completed { register int gasit=0; Inregistrare tmp; ifstream banca("banca.dat", ios::in | ios::binary); if (!banca) { cerr<<"Fisierul \"banca.dat\" nu exista... Voi parasi aplicatia acum..." < constructor"<InitializareMemorieObiect(); Continut.valuta=tmp.valuta; Continut.sold=tmp.sold; ostrstream iesire_titular(Continut.titular, NMAX_NUME_TITULAR); ostrstream iesire_numar(Continut.numar, NMAX_CONT); iesire_titular<Continut.sold) { cerr<<"Eroare in operatorul \"-=\""<> (istream &stream, ContBancar &cont) // Completed { cout<<"Numele este: "; stream.get(cont.Continut.titular, NMAX_NUME_TITULAR+1); cout<<"Numarul contului este: "; stream>>cont.Continut.numar; cout<<"Soldul este: "; stream>>cont.Continut.sold; cout<<"Valuta folosita (0-"<>cont.Continut.valuta; return stream; } ContBancar::~ContBancar() // Completed { // Intai salvarea continutului obiectului in fisier. // Daca "banca.dat" nu exista atunci va fi creata daca este posibil. // Daca nu este gasita o inregistrare cu acelasi numar de cont atunci // se adauga o noua inregistrare la sfarsitul fisierului. Daca este gasita // o inregistrare cu acelasi numar de cont atunci programil se pozitioneaza // pe acea inregistrare si o actualizeaza. register int gasit=0, count=0, stare_fisier=0; Inregistrare tmp; fstream banca("banca.dat", ios::binary | ios::in | ios::out); if (!banca) { cerr<<"Fisierul \"banca.dat\" nu exista si nu il pot genera... \ Voi parasi aplicatia acum..."< destructor"<StergereMemorieObiect(); cout<<"Destructorul a fost apelat."<>". // cout<<"Obiectul *oInstanta1 -----> Introduceti datele: "<>*oInstanta1; // // Atentie: nu se foloseste pointer-ul, ci instanta spre care indica acesta // cout<<"Continutul obiectului *oInstanta1 este: "<>*oInstanta2; // cout<<"Contul modificat este: "<<*oInstanta2<spune_total()<