//**************************************************************************************************************// // This code has been written by TutorialsArt.com // Distribution of the code is permitted if and only if you do not delete these lines. //**************************************************************************************************************// //**************************************************************** //INCLUDES HEADER FILES //**************************************************************** #include <iostream .h> #include <fstream .h> #include <process .h> #include <string .h> #include <stdio .h> #include <ctype .h> #include <conio .h> #include <dos .h> #include <stdlib .h> #include <iomanip .h> #include <graphics .h> typedef char option[15]; const int ROW = 10,COL = 10; int scan; // To hold the special characters for moving the prompt in menu int ascii; //**************************************************************** // To display the main menu options //**************************************************************** option Option_a[]= { "New_Account", "List_of_Accounts", "Ind_Account", "Daily_Trans", "Monthly_Report", "Edit_Account", "Exit"}; // Displays the modify menu options option Option_b[] = { "Modify Account", "Close Cls_account", "Quit" }; // Function used to do screening class Cls_main_menu { int i,done; public: void normalvideo(int x,int y,char *str); void reversevideo(int x,int y,char *str); void box(int x1,int y1,int x2,int y2); char menu(); void control_menu(); char e_menu(); void edit_menu(); void help(void); }; //**************************************************************** /* Class member functions for drawing boxes */ //**************************************************************** class Cls_shape { public: void line_hor(int, int, int, char); void line_ver(int, int, int, char); void box(int, int, int, int, char); }; // Class contains the Cls_initial deposit of customers class Cls_initial { public: void add_to_file(int, char t_name[30], char t_address[30], float); // For Cls_initial deposits in customers Cls_account void display_list(void); // Displaying customers Cls_account list void delete_account(int); // Deleting customers Cls_account void update_balance(int, char t_name[30], char t_address[30], float); // For updating the customer Cls_account void modify(void); // To modify the customer Cls_account information int last_accno(void); // To know the last Cls_account number int found_account(int); // To found the Cls_account is in "INITIAL.dat" or not char *return_name(int); // Function for validation entry of customer name char *return_address(int); // Function for validation entry of customer address float give_balance(int); // To print the balance amount of a particular customer int recordno(int); void display(int); // To display the customer Cls_account private: void modify_account(int, char t_name[30], char t_address[30]); // Function to modify the customer Cls_account int accno; char name[30], address[30]; float balance; }; // Class contains the customers daily transaction entry class Cls_account { public: void new_account(void); // Function to create a new Cls_account void close_account(void); // Function to close an Cls_account void display_account(void);// Function to display the accounts void transaction(void); // To display the transaction process void clear(int, int); // Function to perform a clear screen function void month_report(void); // Function to list monthly transaction report private: void add_to_file(int,int,int,int,char,char t_type[10],float,float,float); // Function to add transaction records void delete_account(int); // Function to delete a transaction record int no_of_days(int, int, int, int, int, int); // Function to find the total days float calculate_interest(int, float); // Function for calculating interest of an Cls_account void display(int); // Function to display a transaction Cls_account void box_for_display(int); // Function for displaying box int accno; char type[10]; // Account type as Cheque or Cash int dd, mm, yy; // To store the system date/ Enter date char tran; // As the Cls_account type is Deposit or Withdraw float interest, amount, balance; }; // Function to displays all the menu prompt messages from the pointer array of // option Option_a[] void Cls_main_menu::normalvideo(int x,int y,char *str) { gotoxy(x,y); cprintf("%s",str); } // Function to move the cursor on the menu prompt with a reverse video color void Cls_main_menu::reversevideo(int x,int y,char *str) { textcolor(5+143); textbackground(WHITE); gotoxy(x,y); cprintf("%s",str); textcolor(GREEN); textbackground(BLACK); } void Cls_main_menu::box(int x1,int y1,int x2,int y2) { for(int col=x1;col<x2 ;col++) { gotoxy(col,y1); cprintf("%c",196); gotoxy(col,y2); cprintf("%c",196); } for(int row=y1;row<y2;row++) { gotoxy(x1,row); cprintf("%c",179); gotoxy(x2,row); cprintf("%c",179); } gotoxy(x1,y1); cprintf("%c",218); gotoxy(x1,y2); cprintf("%c",192); gotoxy(x2,y1); cprintf("%c",191); gotoxy(x2,y2); cprintf("%c",217); } char Cls_main_menu::menu() { clrscr(); textcolor(22); box(20, 6, 65, 20); box(18, 4, 67, 22); textcolor(5+143); gotoxy(36, 5); textbackground(BLUE); cprintf("B A N K I N G"); textbackground(BLACK); textcolor(22); for(i = 1; i < 7; i++) normalvideo(32, i+10, Option_a[i]); reversevideo(32, 10, Option_a[0]); i = done = 0; _setcursortype(_NOCURSOR); do { int key = getch(); switch (key) { case 00: key = getch(); switch (key) { case 72: normalvideo(32, i+10, Option_a[i]); i--; if (i == -1) i = 6; reversevideo(32,i+10,Option_a[i]); break; case 80: normalvideo(32, i+10, Option_a[i]); i++; if (i == 7) i = 0; reversevideo(32, i+10, Option_a[i]); break; } break; case 13: done = 1; } } while (!done); _setcursortype(_NOCURSOR); return(i+49); } // The function Cls_main_menu() is used to display the main menu of banking system void Cls_main_menu::control_menu() { char choice; Cls_account Option_a; do { choice = menu(); clrscr(); switch (choice) { case '1': _setcursortype(_NORMALCURSOR); box(3, 1, 75, 24); box(5, 2, 73, 23); Option_a.new_account(); // New Cls_account member function break; case '2': box(3, 1, 75, 24); box(5, 2, 73, 23); Cls_initial ini; ini.display_list(); // Global list of Cls_account function break; case '3': box(3, 1, 75, 24); box(5, 2, 73, 23); _setcursortype(_NORMALCURSOR); Option_a.display_account(); // Displaying individual accounts all transactions break; case '4': box(3, 1, 75, 24); box(5, 2, 73, 23); Cls_account Option_a; _setcursortype(_NORMALCURSOR); Option_a.transaction(); // Daily transaction for individual Cls_account break; case '5': box(3, 1, 75, 24); box(5, 2, 73, 23); _setcursortype(_NORMALCURSOR); Option_a.month_report(); // Monthly report for any Cls_account break; case '6': box(3, 1, 75, 24); box(5, 2, 73, 23); gotoxy(10,10); edit_menu();// Sub menu for modifying or deleting any Cls_account break; case '7' :exit(0); } } while (choice != 6); } // This function is used to return the cursor position to the edit menu // function where the menu prompt will valid char Cls_main_menu::e_menu() { clrscr(); textcolor(22); box(25,6,60,15); box(23,4,62,17); textcolor(5+143); gotoxy(34,5); textbackground(GREEN); cprintf("E D I T - M E N U"); textcolor(22); textbackground(BLACK); for (i = 1;i < 3; i++) normalvideo(32, i+10, Option_b[i]); reversevideo(32, 10, Option_b[0]); i = done = 0; _setcursortype(_NOCURSOR); do { int key = getch(); switch (key) { case 00: key = getch(); switch (key) { case 72: normalvideo(32, i+10, Option_b[i]); i--; if (i == -1) i = 2; reversevideo(32, i+10, Option_b[i]); break; case 80: normalvideo(32, i+10, Option_b[i]); i++; if (i == 3) i=0; reversevideo(32, i+10, Option_b[i]); break; } break; case 13: done = 1; } }while (!done); _setcursortype(_NOCURSOR); return(i+49); } /* Function for edit menu with Cls_account modification and close */ void Cls_main_menu::edit_menu() { char choice; Cls_account Option_a; do { choice = e_menu(); clrscr(); switch (choice) { case '1': box(3, 1, 75, 24); box(5, 2, 73, 23); Cls_initial ini; _setcursortype(_NORMALCURSOR); ini.modify(); break; case '2': box(3, 1, 75, 24); box(5, 2, 73, 23); Cls_account Option_a; _setcursortype(_NORMALCURSOR); Option_a.close_account(); break; case '3': return; } } while (choice != 6); } /* Function to draw horizontal line */ void Cls_shape::line_hor(int column1, int column2, int row, char c) { for (column1; column1 <= column2; column1++) { gotoxy(column1, row); cout << c; } } /* Function to draw vertical line */ void Cls_shape::line_ver(int row1, int row2, int column, char c) { for (row1; row1 <= row2; row1++) { gotoxy(column, row1); cout << c; } } /* function for drawing box */ void Cls_shape::box(int column1, int row1, int column2, int row2, char c) { char ch = 218; char c1, c2, c3, c4; char l1 = 196, l2 = 179; if (c == ch) { c1 = 218; c2 = 191; c3 = 217; c4 = 217; l1 = 196; l2 = 179; } else { c1 = c; c2 = c; c3 = c; c4 = c; l1 = c; c2 = c; } gotoxy(column1, row1); cout << c1; gotoxy(column2, row1); cout << c2; gotoxy(column1, row2); cout << c3; gotoxy(column2, row2); cout << c4; column1++; column2--; line_hor(column1, column2, row1, l1); //Horizontal line line_hor(column1, column2, row2, l1); column1--; column2++; row1++; row2--; line_ver(row1, row2, column1, l2); // Vertical line line_ver(row1, row2, column2, l2); } /* Function to display help about this project */ void Cls_main_menu::help(void) { clrscr(); setbkcolor(7); settextstyle(7,HORIZ_DIR,4); outtextxy(70,20,"Welcome to Banking System"); settextstyle(2,HORIZ_DIR,5); outtextxy(60,100,"You can keep record of daily banking transaction"); delay(2); outtextxy(60,130,"This program is capable of holding any no. of A/c"); delay(2); outtextxy(60,160,"-In first option you can open new A/c"); delay(2); outtextxy(60,190,"-In second option you can see the list of all A/c's"); delay(2); outtextxy(60,220,"-In third option you can see all trans. of ind. A/c"); delay(2); outtextxy(60,250,"-In fourth optiion you can do banking transactions"); delay(2); outtextxy(60,280,"(Deposit/Withdraw)"); delay(2); outtextxy(60,310,"-In fifth opt. you can take monthly ind. A/c report"); delay(2); outtextxy(60,340,"-In sixth opt. you can modify or delete any Cls_account"); delay(2); outtextxy(60,370,"Note-:Opening amount should not less that Rs. 500/-"); delay(2); outtextxy(60,400,"-And last option is Quit (Exit to Window)"); delay(2); settextstyle(7,HORIZ_DIR,4); outtextxy(80,420,"Press any key to continue..."); getch(); } /* Function for modifying the existing accounts */ void Cls_initial::modify(void) { clrscr(); int j; char t_acc[10]; int t, t_accno; gotoxy(17, 1); cout << "<0>=Exit"; gotoxy(5,5); cout < < "Enter the Cls_account no. "; gets(t_acc); t = atoi(t_acc); t_accno = t; if (t_accno == 0) return; clrscr(); if (!found_account(t_accno)) { gotoxy(5, 5); cout << "\7Account not found"; getch(); return; } gotoxy(71, 1); cout << "<0>=Exit"; textbackground(WHITE); gotoxy(3, 3); for (j = 1; j< = 76; j++) cprintf(" "); textbackground(BLACK); textcolor(BLACK+BLINK); textbackground(WHITE); gotoxy(30, 3); cprintf("Modify Account Screen"); textcolor(LIGHTGRAY); textbackground(BLACK); int d1, m1, y1; struct date d; // For extracting system date getdate(&d); d1 = d.da_day; m1 = d.da_mon; y1 = d.da_year; gotoxy(4, 2); cout << "Date: " << d1 << "/" << m1 << "/" << y1; char ch; display(t_accno); Cls_account Option_a; do { Option_a.clear(5, 13); gotoxy(5, 13); cout << "Modify this Cls_account <y/n>: "; ch = getche(); if (ch == '0') return; ch = toupper(ch); }while (ch != 'N' && ch != 'Y'); if (ch == 'N') return; int modified = 0, valid; char t_name[30], t_address[30]; gotoxy(5, 15); cout < < "Name : "; gotoxy(5, 16); cout << "Address : "; do { Option_a.clear(15, 15); Option_a.clear(5, 23); gotoxy(5, 23); cout << "Enter Name or Press Enter for No Change"; valid = 1; gotoxy(15, 15); gets(t_name); strupr(t_name); if (t_name[0] == '0') return; if (strlen(t_name) > 25) { valid = 0; gotoxy(5, 23); cprintf("\7Name should not greater than 25"); getch(); } } while (!valid); do { Option_a.clear(15, 16); Option_a.clear(5, 23); gotoxy(5, 23); cout < < "Enter Address or press enter for no Change"; valid = 1; gotoxy(15, 16); gets(t_address); strupr(t_address); if (t_address[0] == '0') return; if (strlen(t_address) > 25) { valid = 0; gotoxy(5, 23); cprintf("\7Address should not greater than 25"); getch(); } }while (!valid); if (strlen(t_address) > 0) modified = 1; if (!modified) return; // clears the screen at 23rd row and from 5th column Option_a.clear(5,23); do { Option_a.clear(5, 23); gotoxy(5, 18); cout < < "Do you want to save Changes <Y/N>: "; ch = getche(); if (ch == '0') return; ch = toupper(ch); }while (ch != 'N' && ch != 'Y'); if (ch == 'N') return; // Passes the parameter to add in data file modify_account(t_accno, t_name, t_address); gotoxy(5, 21); cout < < "\7Record modified"; gotoxy(5, 23); cout << "Press any key to continue..."; getch(); } /* Function for displaying an Cls_account when modified */ void Cls_initial::display(int t_accno) { fstream file; file.open("INITIAL.dat", ios::in); file.seekg(0, ios::beg); // Displays the record contents matching with t_accno from // INITIAL.dat data file while (file.read((char *)this, sizeof(Cls_initial))) { if (t_accno == accno) { gotoxy(8, 5); cout << "Account no. " << accno; gotoxy(10, 8); cout << "Name : "; puts(name); gotoxy(10, 9); cout << "Address : "; puts(address); gotoxy(10, 10); cout << "Balance : " << setw(15) // setwidth << setprecision(2) // set position of decimal point << setiosflags(ios::left) // set left justified output << setiosflags(ios::showpoint) // always show decimal point << setiosflags(ios::fixed)<< balance;// set fixed notation for display break; } } file.close(); } /* Function for updating the modified Cls_account into INITIAL.dat file */ void Cls_initial::modify_account(int t_accno,char t_name[30],char t_address[30]) { int recno; recno = recordno(t_accno); fstream file; file.open("INITIAL.dat", ios::out|ios::ate); strcpy(name, t_name); strcpy(address, t_address); int location; // finds the position in data file location = (recno-1) * sizeof(Cls_initial); file.seekp(location); // Overwrites the modified record into INITIAL.dat data file file.write((char *)this, sizeof(Cls_initial)); file.close(); return; } /* Function to find the last Cls_account number */ int Cls_initial::last_accno(void) { fstream file; file.open("INITIAL.dat", ios::in); file.seekg(0, ios::beg); int count = 0; // Founds the last Cls_account no. while (file.read((char *)this, sizeof(Cls_initial))) count = accno; file.close(); return count; } //This function add_to_file() is used to create new/fresh record in data file void Cls_initial::add_to_file(int t_accno,char t_name[30],char t_address[30],float t_balance) { accno = t_accno; strcpy(name, t_name); strcpy(address, t_address); balance = t_balance; fstream file; // Appends new Cls_account record with the balance into INITIAL.dat data file file.open("INITIAL.dat", ios::out|ios::app); file.write((char *)this, sizeof(Cls_initial)); file.close(); } // Function for deleting a Cls_account from INITIAL.dat file void Cls_initial::delete_account(int t_accno) { fstream file; file.open("INITIAL.dat", ios::in); fstream temp; temp.open("TEMP.dat", ios::out); file.seekg(0,ios::beg); // Uses a copy method to delete the Cls_account from INTITAL.dat data file while (!file.eof()) { file.read((char *)this, sizeof(Cls_initial)); if (file.eof()) break; if (accno != t_accno) temp.write((char *)this, sizeof(Cls_initial)); } file.close(); temp.close(); file.open("INITIAL.dat", ios::out); temp.open("TEMP.dat", ios::in); temp.seekg(0, ios::beg); // Copy the TEMP.dat contents into INTITAL.dat data file while (!temp.eof()) { temp.read((char *)this, sizeof(Cls_initial)); if (temp.eof()) break; if (accno != t_accno) file.write((char *)this, sizeof(Cls_initial)); } file.close(); temp.close(); } // Function for adding Cls_account details of daily tranaction into BANKING.dat file void Cls_account::add_to_file(int t_accno,int d1,int m1,int y1,char t_tran,char t_type[10],float t_interest,float t_amount,float t_balance) { fstream file; file.open("BANKING.dat", ios::app); accno = t_accno; getch(); dd = d1; mm = m1; yy = y1; tran = t_tran; strcpy(type, t_type); interest = t_interest; amount = t_amount; balance = t_balance; // Appends the transaction record into BANKING.dat data file file.write((char *)this, sizeof(Cls_account)); file.close(); } /* Function for deleting an Cls_account from BANKING.dat file. */ void Cls_account::delete_account(int t_accno) { fstream file; file.open("BANKING.dat", ios::in); // Open to read records fstream temp; temp.open("TEMP.dat", ios::out); // Open to write records file.seekg(0, ios::beg); // Positioned from begining of the file // Uses the copy method for deleting the transaction record from // BANKING.dat data file while (!file.eof()) { file.read((char *)this, sizeof(Cls_account)); if (file.eof()) break; if (accno != t_accno) temp.write((char *)this, sizeof(Cls_account)); } file.close(); temp.close(); file.open("BANKING.dat", ios::out); temp.open("TEMP.dat", ios::in); temp.seekg(0, ios::beg); // Uses copy method to transfer the record from TEMP.dat file to // BANKING.dat data file while (!temp.eof()) { temp.read((char *)this, sizeof(Cls_account)); if (temp.eof()) break; if (accno != t_accno) file.write((char *)this, sizeof(Cls_account)); } file.close(); temp.close(); } /* Function for displaying an Cls_account from "INITIAL.dat". */ void Cls_initial::display_list(void) { clrscr(); int flag; float t_bal = 0.0; fstream file; gotoxy(25,2); cout << "Accounts List in Bank"; gotoxy(25, 3); cout << "====================="; int d1, m1, y1; struct date d; // For extracting system date getdate(&d); d1 = d.da_day; m1 = d.da_mon; y1 = d.da_year; gotoxy(62, 3); cout << "Date: " << d1 << "/" << m1 << "/" << y1; gotoxy(1, 4); for (int j = 1; j <= 79; j++) cout << "="; gotoxy(1, 5); cout << "Accno#"; gotoxy(10,5); cout << "Name"; gotoxy(30,5); cout << "Address"; gotoxy(65,5); cout << "Balance"; gotoxy(1, 6); for (j = 1; j <= 79; j++) cout << "="; file.open("INITIAL.dat", ios::in); file.seekg(0,ios::beg); int row = 7; // Reads all the records to display on the screen while (file.read((char *)this, sizeof(Cls_initial))) { flag = 0; delay(2); gotoxy(3, row); cout << accno; gotoxy(10, row); puts(name); gotoxy(30, row); puts(address); gotoxy(65, row); cout <<setw(15)<<setprecision(2)<<setiosflags(ios::left) <<setiosflags(ios::showpoint)<<setiosflags(ios::fixed)<<balance; t_bal = t_bal + balance; row++; if (row > 23) { flag = 1; row = 6; gotoxy(4, 24); cout < < "Press any key to continue.... "; getch(); clrscr(); } } gotoxy(1, row); for (j = 1; j <= 79; j++) cout << "="; row++; gotoxy(3, row); cout << "Total Balance in Bank is : "; gotoxy(65, row); cout <<setw(15)<<setprecision(2)<<setiosflags(ios::left) <<setiosflags(ios::showpoint)<<setiosflags(ios::fixed)<<t_bal; file.close(); if (!flag) { gotoxy(4, 24); cout << "Press any key to continue..."; getch(); } } /* Function for clearing specified row and column. */ void Cls_account::clear(int col, int row) { for (int j = col; j <= 79; j++) { gotoxy(j, row); cout << " "; } } /* Function to found an Cls_account for display Cls_account function. */ int Cls_initial::found_account(int t_accno) { fstream file; file.open("INITIAL.dat", ios::in); file.seekg(0, ios::beg); int found = 0; // Searches the specified record in INITIAL.dat data file while (file.read((char *)this, sizeof(Cls_initial))) { if (accno == t_accno) { found = 1; break; } } file.close(); return found; } /* Function for return name of the Cls_account holder from INITIAL.dat. */ char *Cls_initial::return_name(int t_accno) { fstream file; file.open("INITIAL.dat", ios::in); file.seekg(0, ios::beg); char t_name[30]; // Return the name to display at report screen if found while (file.read((char *)this, sizeof(Cls_initial))) { if (accno == t_accno) { strcpy(t_name, name); break; } } file.close(); return t_name; } /* Function for return address of the Cls_account holder from INITIAL.dat. */ char *Cls_initial::return_address(int t_accno) { fstream file; file.open("INITIAL.dat", ios::in); file.seekg(0, ios::beg); char t_address[30]; // Return the address to display at report screen if found while (file.read((char *)this, sizeof(Cls_initial))) { if (accno == t_accno) { strcpy(t_address, address); break; } } file.close(); return t_address; } /* Function for display Cls_account details */ void Cls_account::box_for_display(int t_accno) { int d1, m1, y1; struct date d; getdate(&d); d1 = d.da_day; m1 = d.da_mon; y1 = d.da_year; gotoxy(63, 2); cout << "Date: " << d1 << "/" << m1 << "/" << y1; gotoxy(4, 2); cout << "Account No. " << t_accno; Cls_initial ini; char t_name[30]; strcpy(t_name, ini.return_name(t_accno)); char t_address[30]; strcpy(t_address, ini.return_address(t_accno)); gotoxy(25, 2); cout << t_name; gotoxy(25, 3); cout << t_address; gotoxy(4, 5); cout << "Global Report of Account"; textbackground(WHITE); textcolor(BLACK); textbackground(WHITE); gotoxy(1, 6); for (int i = 1; i <=79; i++) cout << "="; gotoxy(4, 7); cprintf("Date Particular Deposit Withdraw Balance"); gotoxy(1, 8); for (i = 1; i <=79; i++) cout << "="; textcolor(LIGHTGRAY); textbackground(BLACK); } /* Function for display an Cls_account from BANKING.dat file. */ void Cls_account::display_account(void) { clrscr(); char t_acc[10]; int j; int tamt = 0, damt = 0, wamt = 0; int t, t_accno; gotoxy(71, 1); cout << "<0>=Exit"; gotoxy(5, 5); cout < < "Enter Cls_account no. "; gets(t_acc); t = atoi(t_acc); t_accno = t; if (t_accno == 0) return; clrscr(); Cls_initial ini; if (!ini.found_account(t_accno)) { gotoxy(5, 5); cout << "\7Account not found"; getch(); return; } // Display the heading from this function box_for_display(t_accno); int row = 9, flag; fstream file; file.open("BANKING.dat", ios::in); while (file.read((char *)this, sizeof(Cls_account))) { if (accno == t_accno) { flag = 0; delay(2); gotoxy(4, row); cout << dd << "-" << mm << "-" << yy; gotoxy(16, row); puts(type); if (tran == 'D') { damt = damt + amount; tamt = tamt + amount; gotoxy(30, row); } else { wamt = wamt + amount; tamt = tamt - amount; gotoxy(42, row); } cout << setw(15)<< setprecision(2)<< setiosflags(ios::left) << setiosflags(ios::showpoint)<< setiosflags(ios::fixed)<< amount; gotoxy(66, row); cout << setw(15)<< setprecision(2)<< setiosflags(ios::left) << setiosflags(ios::showpoint)<< setiosflags(ios::fixed)<<balance; row++; if (row > 23) { flag = 1; row = 7; gotoxy(4, 24); cout < < "Press any key to continue"; getch(); clrscr(); box_for_display(t_accno); } } } file.close(); gotoxy(1, row); for (j = 1; j <= 79; j++) cout << "="; row++; gotoxy(4, row); cout << "Total-->:"; gotoxy(30, row); cout < < setw(15)<< setprecision(2)<< setiosflags(ios::left) << setiosflags(ios::showpoint)<< setiosflags(ios::fixed)<< damt; gotoxy(42, row); cout << setw(15)<< setprecision(2)<< setiosflags(ios::left) << setiosflags(ios::showpoint)<< setiosflags(ios::fixed)<< wamt; gotoxy(66, row); cout << setw(15)<< setprecision(2)<< setiosflags(ios::left) << setiosflags(ios::showpoint)<< setiosflags(ios::fixed)<< tamt; if (!flag) { gotoxy(4, 24); cout << "Press any key to continue..."; getch(); } } /* Function to list monthWise transaction report. */ void Cls_account::month_report(void) { int dd1, mm1, yy1; clrscr(); gotoxy(10, 5); cout << "Enter any date of a month "; gotoxy(38, 5); cin >> dd1; gotoxy(40, 5); cout < < "-"; gotoxy(41, 5); cin >> mm1; gotoxy(43, 5); cout < < "-"; gotoxy(44, 5); cin >> yy1; clrscr(); char t_acc[10]; int j; int tamt = 0, damt = 0, wamt = 0; int t, t_accno; gotoxy(71, 1); cout < < "<0>=Exit"; gotoxy(5, 5); cout < < "Enter Cls_account no. "; gets(t_acc); t = atoi(t_acc); t_accno = t; if (t_accno == 0) return; clrscr(); Cls_initial ini; if (!ini.found_account(t_accno)) { gotoxy(5, 5); cout << "\7Account not found"; getch(); return; } box_for_display(t_accno); gotoxy(4, 5); cout << "Statement Month: " << dd1 << "/" << mm1 << "/" << yy1; getch(); int row = 9, flag; fstream file; file.open("BANKING.dat", ios::in); float pre_balance = 0.0; // Previous balance amount // The loop finds the last months balance while (file.read((char *)this, sizeof(Cls_account))) { //Checks the Cls_account no. and till the previous month and till current year if((accno == t_accno) && ((mm < mm1 && yy <= yy1) || (mm1 < mm && yy < yy1))) { pre_balance = balance; } } file.close(); file.open("BANKING.dat", ios::in); gotoxy(54, row); cout<<"B/F .... " <<setw(15)<<setprecision(2)<<setiosflags(ios::left) <<setiosflags(ios::showpoint)<<setiosflags(ios::fixed)<<pre_balance; row++; // The loop displays the current months transaction after previous month while (file.read((char *)this, sizeof(Cls_account))) { if ((accno == t_accno) && (mm1 == mm && yy1 <= yy)) { flag = 0; delay(2); gotoxy(4, row); cout << dd << "-" << mm << "-" << yy; gotoxy(16, row); puts(type); if (tran == 'D') { damt = damt + amount; tamt = tamt + amount; gotoxy(30, row); } else { wamt = wamt + amount; tamt = tamt - amount; gotoxy(42, row); } cout <<setw(15)<<setprecision(2)<<setiosflags(ios::left) <<setiosflags(ios::showpoint)<<setiosflags(ios::fixed)<<amount; gotoxy(66, row); cout <<setw(15)<<setprecision(2)<<setiosflags(ios::left) <<setiosflags(ios::showpoint)<<setiosflags(ios::fixed)<<balance; row++; // If row increases 23 then the next screen continues if (row > 23) { flag = 1; row = 7; gotoxy(4, 24); cout < < "Press any key to continue"; getch(); clrscr(); box_for_display(t_accno); } } } file.close(); gotoxy(1, row); for (j = 1; j <= 79; j++) cout << "="; row++; gotoxy(4, row); cout << "Total-->:"; gotoxy(30, row); // Deposited amount cout < < setw(15) // setwidth << setprecision(2) // set position of decimal point << setiosflags(ios::left) // set left justified output << setiosflags(ios::showpoint)// always show decimal point << setiosflags(ios::fixed) // set fixed notation for display << damt; gotoxy(42, row); // Withdraw amount cout << setw(15)<< setprecision(2)<< setiosflags(ios::left) << setiosflags(ios::showpoint)<<setiosflags(ios::fixed)<< wamt; gotoxy(66, row); tamt = tamt + pre_balance; // Balance amount cout << setw(15)<< setprecision(2)<< setiosflags(ios::left) << setiosflags(ios::showpoint)<< setiosflags(ios::fixed)<< tamt; if (!flag) { gotoxy(4, 24); cout << "Press any key to continue..."; getch(); } } /* Function for creating new Cls_account for new customer. */ void Cls_account::new_account(void) { char ch; int i, valid; clrscr(); Cls_initial ini; Cls_shape s; s.box(2, 1, 79, 25, 218); s.box(25, 2, 54, 4, 219); gotoxy(65, 2); cout << "<0>=Exit"; gotoxy(3,3); for (i = 1; i< = 76; i++) cprintf(" "); textbackground(BLACK); textcolor(BLACK+BLINK); textbackground(WHITE); gotoxy(30, 3); cprintf("Open New Account"); textcolor(LIGHTGRAY); textbackground(BLACK); int d1, m1, y1; struct date d; // For extracting system date getdate(&d); d1 = d.da_day; m1 = d.da_mon; y1 = d.da_year; int t_accno; t_accno = ini.last_accno(); t_accno++; //Appends and deletes false record to create primary position in data files if (t_accno == 1) { ini.add_to_file(t_accno, "abc", "xyz", 1.1); ini.delete_account(t_accno); cout << "Press xxxxxxx"; getch(); add_to_file(t_accno, 1, 1, 1997, 'D', "INITIAL", 1.1, 1.1, 1.1); delete_account(t_accno); } char t_name[30], t[10], t_address[30]; float t_bal = 0.0, t_balance = 0.0; gotoxy(5, 6); cout << "Date: " << d1 << '/' << m1 << '/' << y1; gotoxy(5, 8); cout << "Account No # " << t_accno; gotoxy(5, 10); cout << "Name : "; gotoxy(5, 11); cout << "Address : "; gotoxy(5, 12); cout << "Name of verifying Person : "; gotoxy(5, 14); cout << "Initial Deposit : "; do { clear(15, 10); clear(5, 23); gotoxy(5, 23); cout << "Enter Name of the Person"; valid = 1; gotoxy(15, 10); gets(t_name); strupr(t_name); if (t_name[0] == '0') return; if (strlen(t_name) == 0 || strlen(t_name) > 25) { valid = 0; gotoxy(5, 23); cprintf("\7Name should not greater than 25"); getch(); } }while (!valid); do { clear(25, 15); clear(5, 23); gotoxy(5, 23); cout < < "Enter Address of the Person "; valid = 1; gotoxy(15, 11); gets(t_address); strupr(t_address); if (t_address[0] == '0') return; if (strlen(t_address) == 0 || strlen(t_address) > 25) { valid = 0; gotoxy(5, 23); cprintf("\7Address should not greater than 25"); getch(); } }while (!valid); do { char vari[30]; clear(13, 12); clear(5, 23); gotoxy(5, 23); cout < < "Enter name of the verifying Person "; valid = 1; gotoxy(31, 12); gets(vari); strupr(vari); if (vari[0] == '0') return; if (strlen(vari) == 0 || strlen(vari) > 25) { valid = 0; gotoxy(5, 23); cprintf("Should not blank or greater than 25"); getch(); } }while (!valid); do { clear(13, 12); clear(5, 23); gotoxy(5, 23); cout < < "Enter Cls_initial amount to be deposit "; valid = 1; gotoxy(23, 14); gets(t); t_bal = atof(t); t_balance = t_bal; if (t[0] == '0') { valid = 0; gotoxy(5, 23); cprintf("\7Should not less than 500"); getch(); } }while (!valid); clear(5, 23); do { clear(5, 17); valid = 1; gotoxy(5, 17); cout << "Do you want to save the record <Y/N>: "; ch = getche(); if (ch == '0') return; ch = toupper(ch); }while (ch != 'N' && ch != 'Y'); if (ch == 'N') return; float t_amount, t_interest; t_amount = t_balance; t_interest = 0.0; char t_tran, t_type[10]; t_tran = 'D'; strcpy(t_type, "INITIAL"); //Appends records contents into both INITIAL.dat and BANKING.dat data files ini.add_to_file(t_accno, t_name, t_address, t_balance); add_to_file(t_accno, d1, m1, y1, t_tran, t_type, t_interest, t_amount, t_balance); } /* Function for returning balance amount of an Cls_account. */ float Cls_initial::give_balance(int t_accno) { fstream file; file.open("INITIAL.dat", ios::in); file.seekg(0, ios::beg); float t_balance; // Gives the last balance of an individual Cls_account while (file.read((char *)this, sizeof(Cls_initial))) { if (accno == t_accno) { t_balance = balance; break; } } file.close(); return t_balance; } /* Function for returning the record no. for updating balance */ int Cls_initial::recordno(int t_accno) { fstream file; file.open("INITIAL.dat", ios::in); file.seekg(0, ios::beg); int count = 0; // Finds the record position in INITIAL.dat data file while (file.read((char *)this, sizeof(Cls_initial))) { count++; if (t_accno == accno) break; } file.close(); return count; } /* Function for updating the balance for the given Cls_account no. */ void Cls_initial::update_balance(int t_accno,char t_name[30],char t_address[30],float t_balance) { int recno; recno = recordno(t_accno); fstream file; file.open("INITIAL.dat", ios::out|ios::ate); strcpy(name, t_name); strcpy(address, t_address); balance = t_balance; int location; location = (recno-1) * sizeof(Cls_initial); // Find the location in file file.seekp(location); // Searches the insertion position in data file // Updates the balance amount in INITIAL.dat data file file.write((char *)this, sizeof(Cls_initial)); file.close(); } /* Function to return no. days between two dates. */ int Cls_account::no_of_days(int d1, int m1, int y1, int d2, int m2, int y2) { static int month[] = {31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30}; int days = 0; while (d1 != d2 || m1 != m2 || y1 != y2) { days++; d1++; if (d1 > month[m1-1]) { d1 = 1; m1++; } if (m1 > m2) { m1 = 1; y1++; } } return days; } /* Function for calculates interest */ float Cls_account::calculate_interest(int t_accno, float t_balance) { fstream file; file.open("BANKING.dat", ios::in); file.seekg(0, ios::beg); int d1, m1, y1, days; while (file.read((char *)this, sizeof(Cls_account))) { if (accno == t_accno) { d1 = dd; m1 = mm; y1 = yy; break; } } int d2, m2, y2; struct date d; getdate(&d); d2 = d.da_day; m2 = d.da_mon; y2 = d.da_year; float t_interest = 0.0; if((y2 < y1) || (y2==y1 && m2 < m1) || (y2==y1 && m2 == m1) && (d2 < d1)) return t_interest; days = no_of_days(d1, m1, y1, d2, m2, y2); int months = 0; if (days > 30) { months = days / 30; t_interest = ((t_balance*2)/100 * months); } file.close(); return t_interest; } /* Function for making daily transaction (Deposit 'D'/Withdraw 'W'. */ void Cls_account::transaction(void) { clrscr(); char t_acc[10]; int t, t_accno, valid; gotoxy(71,1); cout < < "<0>=Exit"; gotoxy(5, 5); cout < < "Enter the Cls_account no. "; gets(t_acc); t = atoi(t_acc); t_accno = t; if (t_accno == 0) return; clrscr(); Cls_initial ini; if (!ini.found_account(t_accno)) { gotoxy(5, 5); cout << "\7Account not found"; getch(); return; } gotoxy(71, 1); cout << "<0>=Exit"; gotoxy(3, 3); for (int i = 1; i < = 76; i++) cprintf(" "); textbackground(BLACK); textcolor(BLACK+BLINK); textbackground(WHITE); gotoxy(29, 3); cprintf ("Transaction in Account"); textcolor(LIGHTGRAY); textbackground(BLACK); int d1, m1, y1; struct date d; getdate(&d); d1 = d.da_day; m1 = d.da_mon; y1 = d.da_year; gotoxy(5, 6); cout << "Date: " << d1 << "/" << m1 << "/" << y1; gotoxy(5, 8); cout << "Accnount no. " << t_accno; char t_name[30]; char t_address[30]; float t_balance; strcpy(t_name, ini.return_name(t_accno)); strcpy(t_address, ini.return_address(t_accno)); t_balance = ini.give_balance(t_accno); gotoxy(27, 11); cout << "Name : " << t_name; gotoxy(27, 12); cout << "Address : " << t_address; gotoxy(5, 15); cout<<"Last balance Rs. "<< setw(15)<< setprecision(2) <<setiosflags(ios::left)<<setiosflags(ios::showpoint) <<setiosflags(ios::fixed)<<t_balance; char t_tran, t_type[10], tm[10]; float t_amount, t_amt; do { clear(5, 10); valid = 1; gotoxy(5, 10); cout << "Deposit or Withdraw (D/W) : "; t_tran = getch(); if (t_tran == '0') return; t_tran = toupper(t_tran); }while (t_tran != 'D' && t_tran != 'W'); do { clear(5, 19); clear(5, 23); gotoxy(5, 23); cout << "Enter Transaction by Cash or Cheque "; valid = 1; gotoxy(5, 19); cout << "Cash/Cheque : "; gets(t_type); strupr(t_type); if (t_type[0] == '0') return; if (strcmp(t_type, "CASH") && strcmp(t_type, "CHEQUE")) { valid = 0; gotoxy(5, 23); cprintf("\7Enter correctly"); getch(); } }while (!valid); do { clear(5, 21); clear(5, 23); gotoxy(5, 23); cout << "Enter Amount for Transaction "; valid = 1; gotoxy(5, 21); cout << "Amount Rs. "; gets(tm); t_amt = atof(tm); t_amount = t_amt; if (tm[0] == '0') return; if ((t_tran == 'W' && t_amount > t_balance) || (t_amount < 1)) { valid = 0; gotoxy(5, 23); cprintf("\7Invalid Data entered"); getch(); } }while (!valid); char ch; clear(5, 23); do { clear(20, 23); valid = 1; gotoxy(40, 20); cout << "Save Transaction <Y/N> : "; ch = getche(); if (ch == '0') return; ch = toupper(ch); }while (ch != 'N' && ch != 'Y'); if (ch == 'N') return; float t_interest; t_interest = calculate_interest(t_accno, t_balance); if (t_tran == 'D') t_balance = t_balance + t_amount + t_interest; else t_balance = (t_balance - t_amount) + t_interest; // Modified records are updated in data bases. ini.update_balance(t_accno, t_name, t_address, t_balance); add_to_file(t_accno,d1,m1,y1,t_tran,t_type,t_interest,t_amount,t_balance); } /* Function for closing any Cls_account after inputing Cls_account number. */ void Cls_account::close_account(void) { clrscr(); char t_acc[10]; int t, t_accno; gotoxy(71, 1); cout < < "<0>=Exit"; gotoxy(5, 5); cout < < "Enter the Cls_account no. "; gets(t_acc); t = atoi(t_acc); t_accno = t; if (t_accno == 0) return; clrscr(); Cls_initial ini; if (!ini.found_account(t_accno)) { gotoxy(5, 5); cout << "\7Account not found "; getch(); return; } gotoxy(71, 1); cout << "<0>=Exit"; gotoxy(3, 3); textbackground(WHITE); for (int i = 1; i < = 76; i++) cprintf(" "); textbackground(BLACK); textcolor(BLACK+BLINK); textbackground(WHITE); gotoxy(30, 3); cprintf("Close Cls_account screen"); textcolor(LIGHTGRAY); textbackground(BLACK); int d1, m1, y1; struct date d; getdate(&d); d1 = d.da_day; m1 = d.da_mon; y1 = d.da_year; gotoxy(5, 6); cout << "Date: " << d1 << "/" << m1 << "/" << y1; char ch; ini. display(t_accno); do { clear(5, 15); gotoxy(5, 15); cout << "Close this Cls_account <y/n> "; ch = getche(); if (ch == '0') return; ch = toupper(ch); }while (ch != 'N' && ch != 'Y'); if (ch == 'N') return; // Function calls to delete the existing Cls_account no. ini.delete_account(t_accno); delete_account(t_accno); gotoxy(5, 20); cout < < "\7Account Deleted"; gotoxy(5, 23); cout << "Press any key to continue..."; getch(); } // Main program logic which control the class members and member functions. void main(void) { Cls_main_menu m_menu; int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); m_menu.help(); closegraph(); m_menu.control_menu(); }