#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NAME 50
#define ACCOUNTS_FILE "accounts.dat"
typedef struct {
int accountNo;
char name[MAX_NAME];
char accountType;
double balance;
int isActive;
} Account;
int getNextAccountNo() {
FILE *fp = fopen(ACCOUNTS_FILE, "rb");
if (!fp) return 1001;
Account acc;
int maxNo = 1000;
while (fread(&acc, sizeof(Account), 1, fp) == 1) {
if (acc.accountNo > maxNo) maxNo = acc.accountNo;
}
fclose(fp);
return maxNo + 1;
}
Account* findAccount(int accountNo) {
static Account acc;
FILE *fp = fopen(ACCOUNTS_FILE, "rb");
if (!fp) return NULL;
while (fread(&acc, sizeof(Account), 1, fp) == 1) {
if (acc.accountNo == accountNo && acc.isActive) {
fclose(fp);
return &acc;
}
}
fclose(fp);
return NULL;
}
void updateAccount(Account *updated) {
FILE *fp = fopen(ACCOUNTS_FILE, "rb+");
if (!fp) return;
Account acc;
while (fread(&acc, sizeof(Account), 1, fp) == 1) {
if (acc.accountNo == updated->accountNo) {
fseek(fp, -(long)sizeof(Account), SEEK_CUR);
fwrite(updated, sizeof(Account), 1, fp);
break;
}
}
fclose(fp);
}
void createAccount() {
Account acc;
acc.accountNo = getNextAccountNo();
acc.isActive = 1;
printf("\n--- Create New Account ---\n");
getchar();
printf("Enter Account Holder Name: ");
fgets(acc.name, MAX_NAME, stdin);
acc.name[strcspn(acc.name, "\n")] = '\0';
printf("Account Type (S-Savings / C-Current): ");
scanf(" %c", &acc.accountType);
double minBalance = (acc.accountType == 'C') ? 5000.0 : 1000.0;
printf("Enter Initial Deposit (min %.0f): ", minBalance);
scanf("%lf", &acc.balance);
if (acc.balance < minBalance) {
printf("Minimum balance requirement not met!\n");
return;
}
FILE *fp = fopen(ACCOUNTS_FILE, "ab");
fwrite(&acc, sizeof(Account), 1, fp);
fclose(fp);
printf("\nAccount Created Successfully!\n");
printf("Your Account Number: %d\n", acc.accountNo);
printf("Account Holder: %s\n", acc.name);
printf("Balance: %.2f\n", acc.balance);
}
void deposit() {
int accNo;
double amount;
printf("\nEnter Account Number: ");
scanf("%d", &accNo);
Account *acc = findAccount(accNo);
if (!acc) { printf("Account not found!\n"); return; }
printf("Account Holder: %s\n", acc->name);
printf("Current Balance: %.2f\n", acc->balance);
printf("Enter Deposit Amount: ");
scanf("%lf", &amount);
if (amount <= 0) { printf("Invalid amount!\n"); return; }
acc->balance += amount;
updateAccount(acc);
printf("Deposit Successful!\n");
printf("New Balance: %.2f\n", acc->balance);
}
void withdraw() {
int accNo;
double amount;
printf("\nEnter Account Number: ");
scanf("%d", &accNo);
Account *acc = findAccount(accNo);
if (!acc) { printf("Account not found!\n"); return; }
printf("Account Holder: %s\n", acc->name);
printf("Current Balance: %.2f\n", acc->balance);
double minBalance = (acc->accountType == 'C') ? 5000.0 : 1000.0;
printf("Enter Withdrawal Amount: ");
scanf("%lf", &amount);
if (amount <= 0) { printf("Invalid amount!\n"); return; }
if (acc->balance - amount < minBalance) {
printf("Insufficient funds! Minimum balance: %.0f\n", minBalance);
return;
}
acc->balance -= amount;
updateAccount(acc);
printf("Withdrawal Successful!\n");
printf("New Balance: %.2f\n", acc->balance);
}
void checkBalance() {
int accNo;
printf("\nEnter Account Number: ");
scanf("%d", &accNo);
Account *acc = findAccount(accNo);
if (!acc) { printf("Account not found!\n"); return; }
printf("\n--- Account Details ---\n");
printf("Account No: %d\n", acc->accountNo);
printf("Holder Name: %s\n", acc->name);
printf("Account Type: %s\n", acc->accountType == 'S' ? "Savings" : "Current");
printf("Balance: %.2f\n", acc->balance);
}
void displayAll() {
FILE *fp = fopen(ACCOUNTS_FILE, "rb");
if (!fp) { printf("No accounts found.\n"); return; }
Account acc;
printf("\n%-8s %-25s %-8s %-12s %-8s\n",
"Acc No", "Name", "Type", "Balance", "Status");
printf("-----------------------------------------------------------\n");
while (fread(&acc, sizeof(Account), 1, fp) == 1) {
printf("%-8d %-25s %-8s %-12.2f %-8s\n",
acc.accountNo, acc.name,
acc.accountType == 'S' ? "Savings" : "Current",
acc.balance,
acc.isActive ? "Active" : "Closed");
}
fclose(fp);
}
void transfer() {
int fromAcc, toAcc;
double amount;
printf("\nEnter Source Account: ");
scanf("%d", &fromAcc);
printf("Enter Destination Account: ");
scanf("%d", &toAcc);
if (fromAcc == toAcc) { printf("Cannot transfer to same account!\n"); return; }
Account *from = findAccount(fromAcc);
if (!from) { printf("Source account not found!\n"); return; }
Account fromCopy = *from;
Account *to = findAccount(toAcc);
if (!to) { printf("Destination account not found!\n"); return; }
printf("From: %s (Balance: %.2f)\n", fromCopy.name, fromCopy.balance);
printf("To: %s\n", to->name);
printf("Enter Amount: ");
scanf("%lf", &amount);
double minBal = (fromCopy.accountType == 'C') ? 5000.0 : 1000.0;
if (fromCopy.balance - amount < minBal) {
printf("Insufficient funds!\n");
return;
}
fromCopy.balance -= amount;
to->balance += amount;
updateAccount(&fromCopy);
updateAccount(to);
printf("Transfer Successful! Transferred %.2f\n", amount);
}
void deleteAccount() {
int accNo;
printf("\nEnter Account Number to close: ");
scanf("%d", &accNo);
Account *acc = findAccount(accNo);
if (!acc) { printf("Account not found!\n"); return; }
printf("Are you sure you want to close account of %s? (y/n): ", acc->name);
char confirm;
scanf(" %c", &confirm);
if (confirm == 'y' || confirm == 'Y') {
acc->isActive = 0;
updateAccount(acc);
printf("Account closed. Final balance %.2f will be returned.\n", acc->balance);
}
}
int main() {
int choice;
while (1) {
printf("\n============================================\n");
printf(" BANK MANAGEMENT SYSTEM\n");
printf("============================================\n");
printf("1. Create Account\n");
printf("2. Deposit Money\n");
printf("3. Withdraw Money\n");
printf("4. Check Balance\n");
printf("5. View All Accounts\n");
printf("6. Transfer Money\n");
printf("7. Close Account\n");
printf("8. Exit\n");
printf("============================================\n");
printf("Enter choice: ");
scanf("%d", &choice);
switch (choice) {
case 1: createAccount(); break;
case 2: deposit(); break;
case 3: withdraw(); break;
case 4: checkBalance(); break;
case 5: displayAll(); break;
case 6: transfer(); break;
case 7: deleteAccount(); break;
case 8: printf("Thank you for banking with us!\n"); return 0;
default: printf("Invalid choice!\n");
}
}
}