#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ACCOUNTS 100
#define MAX_NAME_LEN 50
#define MAX_TYPE_LEN 20
#define MAX_HISTORY 5
struct Transaction {
char type[MAX_TYPE_LEN];
float amount;
};
struct Account {
int acc_num;
char name[MAX_NAME_LEN];
float balance;
struct Transaction history[MAX_HISTORY];
int hist_count;
};
struct Bank {
struct Account accounts[MAX_ACCOUNTS];
int num_accounts;
};
// Global bank instance
struct Bank bank;
// File name for persistence
#define FILENAME "accounts.dat"
// Function to save all accounts to file
int save_accounts() {
printf("Error: Cannot open file for writing. Data not saved.\n"); return 0; // Failure
}
// Write number of accounts first
// Write each account
for (int i = 0; i < bank.num_accounts; i++) {
}
printf("Accounts saved successfully.\n"); return 1; // Success
}
// Function to load accounts from file
int load_accounts() {
printf("No existing accounts file found. Initializing with predefined accounts.\n"); // Initialize with 3 predefined accounts
bank.num_accounts = 3;
bank.accounts[0] = (struct Account){1001, "Alice Johnson", 1000.00f, {{0}}, 0};
bank.accounts[1] = (struct Account){1002, "Bob Smith", 2000.00f, {{0}}, 0};
bank.accounts[2] = (struct Account){1003, "Charlie Brown", 1500.00f, {{0}}, 0};
save_accounts(); // Save initial accounts
return 1;
}
// Read number of accounts
if (bank.num_accounts > MAX_ACCOUNTS || bank.num_accounts < 0) {
printf("Error: Invalid account count in file. Initializing fresh.\n"); return load_accounts(); // Recursive init
}
// Read each account
for (int i = 0; i < bank.num_accounts; i++) {
printf("Error: Failed to read account %d from file.\n", i
+ 1); return 0; // Failure
}
}
printf("Accounts loaded successfully (%d accounts).\n", bank
.num_accounts
); return 1; // Success
}
// Function to add a transaction to history (shifts if full)
void add_transaction(struct Account *acc, const char *typ, float amt) {
if (acc->hist_count < MAX_HISTORY) {
strcpy(acc->history[acc->hist_count].type, typ);
acc->history[acc->hist_count].amount = amt;
acc->hist_count++;
} else {
// Shift to remove oldest
for (int i = 0; i < MAX_HISTORY - 1; i++) {
acc->history[i] = acc->history[i + 1];
}
// Add new at end
strcpy(acc->history[MAX_HISTORY - 1].type, typ);
acc->history[MAX_HISTORY - 1].amount = amt;
}
}
// Function to display mini statement
void display_mini_statement(struct Account *acc) {
printf("\n=== Mini Statement ===\n"); printf("Account Holder: %s\n", acc
->name); printf("Account Number: %d\n", acc
->acc_num); printf("Current Balance: $%.2f\n", acc
->balance);
if (acc->hist_count == 0) {
printf("No transactions yet.\n"); } else {
printf("Last %d Transactions (Newest to Oldest):\n", acc
->hist_count); for (int i = acc->hist_count - 1; i >= 0; i--) {
printf("%s: $%.2f\n", acc
->history[i
].type
, acc
->history[i
].amount
); }
}
printf("======================\n\n"); }
// Function to find account by number (returns pointer or NULL)
struct Account *find_account(int acc_num) {
for (int i = 0; i < bank.num_accounts; i++) {
if (bank.accounts[i].acc_num == acc_num) {
return &bank.accounts[i];
}
}
return NULL;
}
// Function to create new account
void create_account() {
if (bank.num_accounts >= MAX_ACCOUNTS) {
printf("Error: Maximum accounts reached. Cannot create new account.\n\n"); return;
}
struct Account new_acc;
printf("Enter Account Number: "); if (scanf("%d", &new_acc.acc_num) != 1) {
printf("Invalid input. Account creation failed.\n\n"); while (getchar() != '\n'); // Clear buffer
return;
}
// Check for duplicate
if (find_account(new_acc.acc_num) != NULL) {
printf("Error: Account number already exists.\n\n"); return;
}
printf("Enter Account Holder Name: "); scanf(" %[^\n]", new_acc.name); // Read name with spaces
printf("Enter Initial Balance: $"); if (scanf("%f", &new_acc.balance) != 1 || new_acc.balance < 0) {
printf("Invalid balance. Must be non-negative.\n\n"); while (getchar() != '\n');
return;
}
new_acc.hist_count = 0; // No history yet
// Add to bank
bank.accounts[bank.num_accounts] = new_acc;
bank.num_accounts++;
printf("Account created successfully!\n\n"); save_accounts();
}
// Transaction menu for a specific account
void transaction_menu(struct Account *acc) {
int choice;
do {
printf("=== Transaction Menu (Account: %d - %s) ===\n", acc
->acc_num, acc
->name); printf("3. Mini Statement\n"); printf("4. Back to Main Menu\n"); printf("Enter your choice: "); if (scanf("%d", &choice) != 1) {
printf("Invalid choice.\n\n"); while (getchar() != '\n');
continue;
}
switch (choice) {
case 1: {
float amount;
printf("Enter deposit amount: $"); if (scanf("%f", &amount) == 1 && amount > 0) {
acc->balance += amount;
add_transaction(acc, "Deposit", amount);
printf("Deposit successful! New balance: $%.2f\n\n", acc
->balance); save_accounts();
} else {
printf("Invalid amount. Must be greater than 0.\n\n"); while (getchar() != '\n');
}
break;
}
case 2: {
float amount;
printf("Enter withdrawal amount: $"); if (scanf("%f", &amount) == 1 && amount > 0) {
if (amount <= acc->balance) {
acc->balance -= amount;
add_transaction(acc, "Withdrawal", amount);
printf("Withdrawal successful! New balance: $%.2f\n\n", acc
->balance); save_accounts();
} else {
printf("Insufficient funds. Current balance: $%.2f\n\n", acc
->balance); }
} else {
printf("Invalid amount. Must be greater than 0.\n\n"); while (getchar() != '\n');
}
break;
}
case 3: {
display_mini_statement(acc);
break;
}
case 4:
printf("Returning to main menu...\n\n"); break;
default:
printf("Invalid choice. Please try again.\n\n"); }
} while (choice != 4);
}
// Main function
int main() {
// Load accounts
if (!load_accounts()) {
printf("Failed to load accounts. Exiting.\n"); return 1;
}
printf("Welcome to the File-Based Banking System\n"); printf("Predefined Accounts (if new): 1001 (Alice, $1000), 1002 (Bob, $2000), 1003 (Charlie, $1500)\n\n");
int choice;
while (1) {
printf("=== Main Menu ===\n"); printf("1. Create New Account\n"); printf("2. Access Existing Account\n"); printf("Enter your choice: "); if (scanf("%d", &choice) != 1) {
printf("Invalid choice.\n\n"); while (getchar() != '\n');
continue;
}
switch (choice) {
case 1:
create_account();
break;
case 2: {
int acc_num;
printf("Enter Account Number: "); if (scanf("%d", &acc_num) != 1) {
printf("Invalid account number.\n\n"); while (getchar() != '\n');
break;
}
struct Account *acc = find_account(acc_num);
if (acc == NULL) {
printf("Account not found. Create it first?\n\n"); } else {
printf("Welcome, %s! Your current balance: $%.2f\n\n", acc
->name, acc
->balance); transaction_menu(acc);
}
break;
}
case 3:
printf("Saving and exiting...\n"); save_accounts();
printf("Thank you for using the Banking System. Goodbye!\n"); return 0;
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBNQVhfQUNDT1VOVFMgMTAwCiNkZWZpbmUgTUFYX05BTUVfTEVOIDUwCiNkZWZpbmUgTUFYX1RZUEVfTEVOIDIwCiNkZWZpbmUgTUFYX0hJU1RPUlkgNQoKc3RydWN0IFRyYW5zYWN0aW9uIHsKICAgIGNoYXIgdHlwZVtNQVhfVFlQRV9MRU5dOwogICAgZmxvYXQgYW1vdW50Owp9OwoKc3RydWN0IEFjY291bnQgewogICAgaW50IGFjY19udW07CiAgICBjaGFyIG5hbWVbTUFYX05BTUVfTEVOXTsKICAgIGZsb2F0IGJhbGFuY2U7CiAgICBzdHJ1Y3QgVHJhbnNhY3Rpb24gaGlzdG9yeVtNQVhfSElTVE9SWV07CiAgICBpbnQgaGlzdF9jb3VudDsKfTsKCnN0cnVjdCBCYW5rIHsKICAgIHN0cnVjdCBBY2NvdW50IGFjY291bnRzW01BWF9BQ0NPVU5UU107CiAgICBpbnQgbnVtX2FjY291bnRzOwp9OwoKLy8gR2xvYmFsIGJhbmsgaW5zdGFuY2UKc3RydWN0IEJhbmsgYmFuazsKCi8vIEZpbGUgbmFtZSBmb3IgcGVyc2lzdGVuY2UKI2RlZmluZSBGSUxFTkFNRSAiYWNjb3VudHMuZGF0IgoKLy8gRnVuY3Rpb24gdG8gc2F2ZSBhbGwgYWNjb3VudHMgdG8gZmlsZQppbnQgc2F2ZV9hY2NvdW50cygpIHsKICAgIEZJTEUgKmZpbGUgPSBmb3BlbihGSUxFTkFNRSwgIndiIik7CiAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJFcnJvcjogQ2Fubm90IG9wZW4gZmlsZSBmb3Igd3JpdGluZy4gRGF0YSBub3Qgc2F2ZWQuXG4iKTsKICAgICAgICByZXR1cm4gMDsgIC8vIEZhaWx1cmUKICAgIH0KICAgIAogICAgLy8gV3JpdGUgbnVtYmVyIG9mIGFjY291bnRzIGZpcnN0CiAgICBmd3JpdGUoJmJhbmsubnVtX2FjY291bnRzLCBzaXplb2YoaW50KSwgMSwgZmlsZSk7CiAgICAKICAgIC8vIFdyaXRlIGVhY2ggYWNjb3VudAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYW5rLm51bV9hY2NvdW50czsgaSsrKSB7CiAgICAgICAgZndyaXRlKCZiYW5rLmFjY291bnRzW2ldLCBzaXplb2Yoc3RydWN0IEFjY291bnQpLCAxLCBmaWxlKTsKICAgIH0KICAgIAogICAgZmNsb3NlKGZpbGUpOwogICAgcHJpbnRmKCJBY2NvdW50cyBzYXZlZCBzdWNjZXNzZnVsbHkuXG4iKTsKICAgIHJldHVybiAxOyAgLy8gU3VjY2Vzcwp9CgovLyBGdW5jdGlvbiB0byBsb2FkIGFjY291bnRzIGZyb20gZmlsZQppbnQgbG9hZF9hY2NvdW50cygpIHsKICAgIEZJTEUgKmZpbGUgPSBmb3BlbihGSUxFTkFNRSwgInJiIik7CiAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJObyBleGlzdGluZyBhY2NvdW50cyBmaWxlIGZvdW5kLiBJbml0aWFsaXppbmcgd2l0aCBwcmVkZWZpbmVkIGFjY291bnRzLlxuIik7CiAgICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIDMgcHJlZGVmaW5lZCBhY2NvdW50cwogICAgICAgIGJhbmsubnVtX2FjY291bnRzID0gMzsKICAgICAgICBiYW5rLmFjY291bnRzWzBdID0gKHN0cnVjdCBBY2NvdW50KXsxMDAxLCAiQWxpY2UgSm9obnNvbiIsIDEwMDAuMDBmLCB7ezB9fSwgMH07CiAgICAgICAgYmFuay5hY2NvdW50c1sxXSA9IChzdHJ1Y3QgQWNjb3VudCl7MTAwMiwgIkJvYiBTbWl0aCIsIDIwMDAuMDBmLCB7ezB9fSwgMH07CiAgICAgICAgYmFuay5hY2NvdW50c1syXSA9IChzdHJ1Y3QgQWNjb3VudCl7MTAwMywgIkNoYXJsaWUgQnJvd24iLCAxNTAwLjAwZiwge3swfX0sIDB9OwogICAgICAgIHNhdmVfYWNjb3VudHMoKTsgIC8vIFNhdmUgaW5pdGlhbCBhY2NvdW50cwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgCiAgICAvLyBSZWFkIG51bWJlciBvZiBhY2NvdW50cwogICAgZnJlYWQoJmJhbmsubnVtX2FjY291bnRzLCBzaXplb2YoaW50KSwgMSwgZmlsZSk7CiAgICBpZiAoYmFuay5udW1fYWNjb3VudHMgPiBNQVhfQUNDT1VOVFMgfHwgYmFuay5udW1fYWNjb3VudHMgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJFcnJvcjogSW52YWxpZCBhY2NvdW50IGNvdW50IGluIGZpbGUuIEluaXRpYWxpemluZyBmcmVzaC5cbiIpOwogICAgICAgIGZjbG9zZShmaWxlKTsKICAgICAgICByZXR1cm4gbG9hZF9hY2NvdW50cygpOyAgLy8gUmVjdXJzaXZlIGluaXQKICAgIH0KICAgIAogICAgLy8gUmVhZCBlYWNoIGFjY291bnQKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFuay5udW1fYWNjb3VudHM7IGkrKykgewogICAgICAgIGlmIChmcmVhZCgmYmFuay5hY2NvdW50c1tpXSwgc2l6ZW9mKHN0cnVjdCBBY2NvdW50KSwgMSwgZmlsZSkgIT0gMSkgewogICAgICAgICAgICBwcmludGYoIkVycm9yOiBGYWlsZWQgdG8gcmVhZCBhY2NvdW50ICVkIGZyb20gZmlsZS5cbiIsIGkgKyAxKTsKICAgICAgICAgICAgZmNsb3NlKGZpbGUpOwogICAgICAgICAgICByZXR1cm4gMDsgIC8vIEZhaWx1cmUKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZjbG9zZShmaWxlKTsKICAgIHByaW50ZigiQWNjb3VudHMgbG9hZGVkIHN1Y2Nlc3NmdWxseSAoJWQgYWNjb3VudHMpLlxuIiwgYmFuay5udW1fYWNjb3VudHMpOwogICAgcmV0dXJuIDE7ICAvLyBTdWNjZXNzCn0KCi8vIEZ1bmN0aW9uIHRvIGFkZCBhIHRyYW5zYWN0aW9uIHRvIGhpc3RvcnkgKHNoaWZ0cyBpZiBmdWxsKQp2b2lkIGFkZF90cmFuc2FjdGlvbihzdHJ1Y3QgQWNjb3VudCAqYWNjLCBjb25zdCBjaGFyICp0eXAsIGZsb2F0IGFtdCkgewogICAgaWYgKGFjYy0+aGlzdF9jb3VudCA8IE1BWF9ISVNUT1JZKSB7CiAgICAgICAgc3RyY3B5KGFjYy0+aGlzdG9yeVthY2MtPmhpc3RfY291bnRdLnR5cGUsIHR5cCk7CiAgICAgICAgYWNjLT5oaXN0b3J5W2FjYy0+aGlzdF9jb3VudF0uYW1vdW50ID0gYW10OwogICAgICAgIGFjYy0+aGlzdF9jb3VudCsrOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBTaGlmdCB0byByZW1vdmUgb2xkZXN0CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSElTVE9SWSAtIDE7IGkrKykgewogICAgICAgICAgICBhY2MtPmhpc3RvcnlbaV0gPSBhY2MtPmhpc3RvcnlbaSArIDFdOwogICAgICAgIH0KICAgICAgICAvLyBBZGQgbmV3IGF0IGVuZAogICAgICAgIHN0cmNweShhY2MtPmhpc3RvcnlbTUFYX0hJU1RPUlkgLSAxXS50eXBlLCB0eXApOwogICAgICAgIGFjYy0+aGlzdG9yeVtNQVhfSElTVE9SWSAtIDFdLmFtb3VudCA9IGFtdDsKICAgIH0KfQoKLy8gRnVuY3Rpb24gdG8gZGlzcGxheSBtaW5pIHN0YXRlbWVudAp2b2lkIGRpc3BsYXlfbWluaV9zdGF0ZW1lbnQoc3RydWN0IEFjY291bnQgKmFjYykgewogICAgcHJpbnRmKCJcbj09PSBNaW5pIFN0YXRlbWVudCA9PT1cbiIpOwogICAgcHJpbnRmKCJBY2NvdW50IEhvbGRlcjogJXNcbiIsIGFjYy0+bmFtZSk7CiAgICBwcmludGYoIkFjY291bnQgTnVtYmVyOiAlZFxuIiwgYWNjLT5hY2NfbnVtKTsKICAgIHByaW50ZigiQ3VycmVudCBCYWxhbmNlOiAkJS4yZlxuIiwgYWNjLT5iYWxhbmNlKTsKICAgIAogICAgaWYgKGFjYy0+aGlzdF9jb3VudCA9PSAwKSB7CiAgICAgICAgcHJpbnRmKCJObyB0cmFuc2FjdGlvbnMgeWV0LlxuIik7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50ZigiTGFzdCAlZCBUcmFuc2FjdGlvbnMgKE5ld2VzdCB0byBPbGRlc3QpOlxuIiwgYWNjLT5oaXN0X2NvdW50KTsKICAgICAgICBmb3IgKGludCBpID0gYWNjLT5oaXN0X2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgcHJpbnRmKCIlczogJCUuMmZcbiIsIGFjYy0+aGlzdG9yeVtpXS50eXBlLCBhY2MtPmhpc3RvcnlbaV0uYW1vdW50KTsKICAgICAgICB9CiAgICB9CiAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT1cblxuIik7Cn0KCi8vIEZ1bmN0aW9uIHRvIGZpbmQgYWNjb3VudCBieSBudW1iZXIgKHJldHVybnMgcG9pbnRlciBvciBOVUxMKQpzdHJ1Y3QgQWNjb3VudCAqZmluZF9hY2NvdW50KGludCBhY2NfbnVtKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhbmsubnVtX2FjY291bnRzOyBpKyspIHsKICAgICAgICBpZiAoYmFuay5hY2NvdW50c1tpXS5hY2NfbnVtID09IGFjY19udW0pIHsKICAgICAgICAgICAgcmV0dXJuICZiYW5rLmFjY291bnRzW2ldOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgovLyBGdW5jdGlvbiB0byBjcmVhdGUgbmV3IGFjY291bnQKdm9pZCBjcmVhdGVfYWNjb3VudCgpIHsKICAgIGlmIChiYW5rLm51bV9hY2NvdW50cyA+PSBNQVhfQUNDT1VOVFMpIHsKICAgICAgICBwcmludGYoIkVycm9yOiBNYXhpbXVtIGFjY291bnRzIHJlYWNoZWQuIENhbm5vdCBjcmVhdGUgbmV3IGFjY291bnQuXG5cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgc3RydWN0IEFjY291bnQgbmV3X2FjYzsKICAgIHByaW50ZigiRW50ZXIgQWNjb3VudCBOdW1iZXI6ICIpOwogICAgaWYgKHNjYW5mKCIlZCIsICZuZXdfYWNjLmFjY19udW0pICE9IDEpIHsKICAgICAgICBwcmludGYoIkludmFsaWQgaW5wdXQuIEFjY291bnQgY3JlYXRpb24gZmFpbGVkLlxuXG4iKTsKICAgICAgICB3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOyAgLy8gQ2xlYXIgYnVmZmVyCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlCiAgICBpZiAoZmluZF9hY2NvdW50KG5ld19hY2MuYWNjX251bSkgIT0gTlVMTCkgewogICAgICAgIHByaW50ZigiRXJyb3I6IEFjY291bnQgbnVtYmVyIGFscmVhZHkgZXhpc3RzLlxuXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIHByaW50ZigiRW50ZXIgQWNjb3VudCBIb2xkZXIgTmFtZTogIik7CiAgICBzY2FuZigiICVbXlxuXSIsIG5ld19hY2MubmFtZSk7ICAvLyBSZWFkIG5hbWUgd2l0aCBzcGFjZXMKICAgIHByaW50ZigiRW50ZXIgSW5pdGlhbCBCYWxhbmNlOiAkIik7CiAgICBpZiAoc2NhbmYoIiVmIiwgJm5ld19hY2MuYmFsYW5jZSkgIT0gMSB8fCBuZXdfYWNjLmJhbGFuY2UgPCAwKSB7CiAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGJhbGFuY2UuIE11c3QgYmUgbm9uLW5lZ2F0aXZlLlxuXG4iKTsKICAgICAgICB3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIAogICAgbmV3X2FjYy5oaXN0X2NvdW50ID0gMDsgIC8vIE5vIGhpc3RvcnkgeWV0CiAgICAKICAgIC8vIEFkZCB0byBiYW5rCiAgICBiYW5rLmFjY291bnRzW2JhbmsubnVtX2FjY291bnRzXSA9IG5ld19hY2M7CiAgICBiYW5rLm51bV9hY2NvdW50cysrOwogICAgCiAgICBwcmludGYoIkFjY291bnQgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXG5cbiIpOwogICAgc2F2ZV9hY2NvdW50cygpOwp9CgovLyBUcmFuc2FjdGlvbiBtZW51IGZvciBhIHNwZWNpZmljIGFjY291bnQKdm9pZCB0cmFuc2FjdGlvbl9tZW51KHN0cnVjdCBBY2NvdW50ICphY2MpIHsKICAgIGludCBjaG9pY2U7CiAgICBkbyB7CiAgICAgICAgcHJpbnRmKCI9PT0gVHJhbnNhY3Rpb24gTWVudSAoQWNjb3VudDogJWQgLSAlcykgPT09XG4iLCBhY2MtPmFjY19udW0sIGFjYy0+bmFtZSk7CiAgICAgICAgcHJpbnRmKCIxLiBEZXBvc2l0XG4iKTsKICAgICAgICBwcmludGYoIjIuIFdpdGhkcmF3YWxcbiIpOwogICAgICAgIHByaW50ZigiMy4gTWluaSBTdGF0ZW1lbnRcbiIpOwogICAgICAgIHByaW50ZigiNC4gQmFjayB0byBNYWluIE1lbnVcbiIpOwogICAgICAgIHByaW50ZigiRW50ZXIgeW91ciBjaG9pY2U6ICIpOwogICAgICAgIGlmIChzY2FuZigiJWQiLCAmY2hvaWNlKSAhPSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBjaG9pY2UuXG5cbiIpOwogICAgICAgICAgICB3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc3dpdGNoIChjaG9pY2UpIHsKICAgICAgICAgICAgY2FzZSAxOiB7CiAgICAgICAgICAgICAgICBmbG9hdCBhbW91bnQ7CiAgICAgICAgICAgICAgICBwcmludGYoIkVudGVyIGRlcG9zaXQgYW1vdW50OiAkIik7CiAgICAgICAgICAgICAgICBpZiAoc2NhbmYoIiVmIiwgJmFtb3VudCkgPT0gMSAmJiBhbW91bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgYWNjLT5iYWxhbmNlICs9IGFtb3VudDsKICAgICAgICAgICAgICAgICAgICBhZGRfdHJhbnNhY3Rpb24oYWNjLCAiRGVwb3NpdCIsIGFtb3VudCk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJEZXBvc2l0IHN1Y2Nlc3NmdWwhIE5ldyBiYWxhbmNlOiAkJS4yZlxuXG4iLCBhY2MtPmJhbGFuY2UpOwogICAgICAgICAgICAgICAgICAgIHNhdmVfYWNjb3VudHMoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGFtb3VudC4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMC5cblxuIik7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGdldGNoYXIoKSAhPSAnXG4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMjogewogICAgICAgICAgICAgICAgZmxvYXQgYW1vdW50OwogICAgICAgICAgICAgICAgcHJpbnRmKCJFbnRlciB3aXRoZHJhd2FsIGFtb3VudDogJCIpOwogICAgICAgICAgICAgICAgaWYgKHNjYW5mKCIlZiIsICZhbW91bnQpID09IDEgJiYgYW1vdW50ID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChhbW91bnQgPD0gYWNjLT5iYWxhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjYy0+YmFsYW5jZSAtPSBhbW91bnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZF90cmFuc2FjdGlvbihhY2MsICJXaXRoZHJhd2FsIiwgYW1vdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJXaXRoZHJhd2FsIHN1Y2Nlc3NmdWwhIE5ldyBiYWxhbmNlOiAkJS4yZlxuXG4iLCBhY2MtPmJhbGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICBzYXZlX2FjY291bnRzKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJbnN1ZmZpY2llbnQgZnVuZHMuIEN1cnJlbnQgYmFsYW5jZTogJCUuMmZcblxuIiwgYWNjLT5iYWxhbmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBhbW91bnQuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAuXG5cbiIpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChnZXRjaGFyKCkgIT0gJ1xuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDM6IHsKICAgICAgICAgICAgICAgIGRpc3BsYXlfbWluaV9zdGF0ZW1lbnQoYWNjKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHByaW50ZigiUmV0dXJuaW5nIHRvIG1haW4gbWVudS4uLlxuXG4iKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGNob2ljZS4gUGxlYXNlIHRyeSBhZ2Fpbi5cblxuIik7CiAgICAgICAgfQogICAgfSB3aGlsZSAoY2hvaWNlICE9IDQpOwp9CgovLyBNYWluIGZ1bmN0aW9uCmludCBtYWluKCkgewogICAgLy8gTG9hZCBhY2NvdW50cwogICAgaWYgKCFsb2FkX2FjY291bnRzKCkpIHsKICAgICAgICBwcmludGYoIkZhaWxlZCB0byBsb2FkIGFjY291bnRzLiBFeGl0aW5nLlxuIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgIHByaW50ZigiV2VsY29tZSB0byB0aGUgRmlsZS1CYXNlZCBCYW5raW5nIFN5c3RlbVxuIik7CiAgICBwcmludGYoIlByZWRlZmluZWQgQWNjb3VudHMgKGlmIG5ldyk6IDEwMDEgKEFsaWNlLCAkMTAwMCksIDEwMDIgKEJvYiwgJDIwMDApLCAxMDAzIChDaGFybGllLCAkMTUwMClcblxuIik7CiAgICAKICAgIGludCBjaG9pY2U7CiAgICB3aGlsZSAoMSkgewogICAgICAgIHByaW50ZigiPT09IE1haW4gTWVudSA9PT1cbiIpOwogICAgICAgIHByaW50ZigiMS4gQ3JlYXRlIE5ldyBBY2NvdW50XG4iKTsKICAgICAgICBwcmludGYoIjIuIEFjY2VzcyBFeGlzdGluZyBBY2NvdW50XG4iKTsKICAgICAgICBwcmludGYoIjMuIEV4aXRcbiIpOwogICAgICAgIHByaW50ZigiRW50ZXIgeW91ciBjaG9pY2U6ICIpOwogICAgICAgIGlmIChzY2FuZigiJWQiLCAmY2hvaWNlKSAhPSAxKSB7CiAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBjaG9pY2UuXG5cbiIpOwogICAgICAgICAgICB3aGlsZSAoZ2V0Y2hhcigpICE9ICdcbicpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc3dpdGNoIChjaG9pY2UpIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgY3JlYXRlX2FjY291bnQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6IHsKICAgICAgICAgICAgICAgIGludCBhY2NfbnVtOwogICAgICAgICAgICAgICAgcHJpbnRmKCJFbnRlciBBY2NvdW50IE51bWJlcjogIik7CiAgICAgICAgICAgICAgICBpZiAoc2NhbmYoIiVkIiwgJmFjY19udW0pICE9IDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgYWNjb3VudCBudW1iZXIuXG5cbiIpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChnZXRjaGFyKCkgIT0gJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBY2NvdW50ICphY2MgPSBmaW5kX2FjY291bnQoYWNjX251bSk7CiAgICAgICAgICAgICAgICBpZiAoYWNjID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIkFjY291bnQgbm90IGZvdW5kLiBDcmVhdGUgaXQgZmlyc3Q/XG5cbiIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIldlbGNvbWUsICVzISBZb3VyIGN1cnJlbnQgYmFsYW5jZTogJCUuMmZcblxuIiwgYWNjLT5uYW1lLCBhY2MtPmJhbGFuY2UpOwogICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uX21lbnUoYWNjKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIHByaW50ZigiU2F2aW5nIGFuZCBleGl0aW5nLi4uXG4iKTsKICAgICAgICAgICAgICAgIHNhdmVfYWNjb3VudHMoKTsKICAgICAgICAgICAgICAgIHByaW50ZigiVGhhbmsgeW91IGZvciB1c2luZyB0aGUgQmFua2luZyBTeXN0ZW0uIEdvb2RieWUhXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIAogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0K
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ACCOUNTS 100
#define MAX_NAME_LEN 50
#define MAX_TYPE_LEN 20
#define MAX_HISTORY 5
struct Transaction {
char type[MAX_TYPE_LEN];
float amount;
};
struct Account {
int acc_num;
char name[MAX_NAME_LEN];
float balance;
struct Transaction history[MAX_HISTORY];
int hist_count;
};
struct Bank {
struct Account accounts[MAX_ACCOUNTS];
int num_accounts;
};
// Global bank instance
struct Bank bank;
// File name for persistence
#define FILENAME "accounts.dat"
// Function to save all accounts to file
int save_accounts() {
FILE *file = fopen(FILENAME, "wb");
if (file == NULL) {
printf("Error: Cannot open file for writing. Data not saved.\n");
return 0; // Failure
}
// Write number of accounts first
fwrite(&bank.num_accounts, sizeof(int), 1, file);
// Write each account
for (int i = 0; i < bank.num_accounts; i++) {
fwrite(&bank.accounts[i], sizeof(struct Account), 1, file);
}
fclose(file);
printf("Accounts saved successfully.\n");
return 1; // Success
}
// Function to load accounts from file
int load_accounts() {
FILE *file = fopen(FILENAME, "rb");
if (file == NULL) {
printf("No existing accounts file found. Initializing with predefined accounts.\n");
// Initialize with 3 predefined accounts
bank.num_accounts = 3;
bank.accounts[0] = (struct Account){1001, "Alice Johnson", 1000.00f, {{0}}, 0};
bank.accounts[1] = (struct Account){1002, "Bob Smith", 2000.00f, {{0}}, 0};
bank.accounts[2] = (struct Account){1003, "Charlie Brown", 1500.00f, {{0}}, 0};
save_accounts(); // Save initial accounts
return 1;
}
// Read number of accounts
fread(&bank.num_accounts, sizeof(int), 1, file);
if (bank.num_accounts > MAX_ACCOUNTS || bank.num_accounts < 0) {
printf("Error: Invalid account count in file. Initializing fresh.\n");
fclose(file);
return load_accounts(); // Recursive init
}
// Read each account
for (int i = 0; i < bank.num_accounts; i++) {
if (fread(&bank.accounts[i], sizeof(struct Account), 1, file) != 1) {
printf("Error: Failed to read account %d from file.\n", i + 1);
fclose(file);
return 0; // Failure
}
}
fclose(file);
printf("Accounts loaded successfully (%d accounts).\n", bank.num_accounts);
return 1; // Success
}
// Function to add a transaction to history (shifts if full)
void add_transaction(struct Account *acc, const char *typ, float amt) {
if (acc->hist_count < MAX_HISTORY) {
strcpy(acc->history[acc->hist_count].type, typ);
acc->history[acc->hist_count].amount = amt;
acc->hist_count++;
} else {
// Shift to remove oldest
for (int i = 0; i < MAX_HISTORY - 1; i++) {
acc->history[i] = acc->history[i + 1];
}
// Add new at end
strcpy(acc->history[MAX_HISTORY - 1].type, typ);
acc->history[MAX_HISTORY - 1].amount = amt;
}
}
// Function to display mini statement
void display_mini_statement(struct Account *acc) {
printf("\n=== Mini Statement ===\n");
printf("Account Holder: %s\n", acc->name);
printf("Account Number: %d\n", acc->acc_num);
printf("Current Balance: $%.2f\n", acc->balance);
if (acc->hist_count == 0) {
printf("No transactions yet.\n");
} else {
printf("Last %d Transactions (Newest to Oldest):\n", acc->hist_count);
for (int i = acc->hist_count - 1; i >= 0; i--) {
printf("%s: $%.2f\n", acc->history[i].type, acc->history[i].amount);
}
}
printf("======================\n\n");
}
// Function to find account by number (returns pointer or NULL)
struct Account *find_account(int acc_num) {
for (int i = 0; i < bank.num_accounts; i++) {
if (bank.accounts[i].acc_num == acc_num) {
return &bank.accounts[i];
}
}
return NULL;
}
// Function to create new account
void create_account() {
if (bank.num_accounts >= MAX_ACCOUNTS) {
printf("Error: Maximum accounts reached. Cannot create new account.\n\n");
return;
}
struct Account new_acc;
printf("Enter Account Number: ");
if (scanf("%d", &new_acc.acc_num) != 1) {
printf("Invalid input. Account creation failed.\n\n");
while (getchar() != '\n'); // Clear buffer
return;
}
// Check for duplicate
if (find_account(new_acc.acc_num) != NULL) {
printf("Error: Account number already exists.\n\n");
return;
}
printf("Enter Account Holder Name: ");
scanf(" %[^\n]", new_acc.name); // Read name with spaces
printf("Enter Initial Balance: $");
if (scanf("%f", &new_acc.balance) != 1 || new_acc.balance < 0) {
printf("Invalid balance. Must be non-negative.\n\n");
while (getchar() != '\n');
return;
}
new_acc.hist_count = 0; // No history yet
// Add to bank
bank.accounts[bank.num_accounts] = new_acc;
bank.num_accounts++;
printf("Account created successfully!\n\n");
save_accounts();
}
// Transaction menu for a specific account
void transaction_menu(struct Account *acc) {
int choice;
do {
printf("=== Transaction Menu (Account: %d - %s) ===\n", acc->acc_num, acc->name);
printf("1. Deposit\n");
printf("2. Withdrawal\n");
printf("3. Mini Statement\n");
printf("4. Back to Main Menu\n");
printf("Enter your choice: ");
if (scanf("%d", &choice) != 1) {
printf("Invalid choice.\n\n");
while (getchar() != '\n');
continue;
}
switch (choice) {
case 1: {
float amount;
printf("Enter deposit amount: $");
if (scanf("%f", &amount) == 1 && amount > 0) {
acc->balance += amount;
add_transaction(acc, "Deposit", amount);
printf("Deposit successful! New balance: $%.2f\n\n", acc->balance);
save_accounts();
} else {
printf("Invalid amount. Must be greater than 0.\n\n");
while (getchar() != '\n');
}
break;
}
case 2: {
float amount;
printf("Enter withdrawal amount: $");
if (scanf("%f", &amount) == 1 && amount > 0) {
if (amount <= acc->balance) {
acc->balance -= amount;
add_transaction(acc, "Withdrawal", amount);
printf("Withdrawal successful! New balance: $%.2f\n\n", acc->balance);
save_accounts();
} else {
printf("Insufficient funds. Current balance: $%.2f\n\n", acc->balance);
}
} else {
printf("Invalid amount. Must be greater than 0.\n\n");
while (getchar() != '\n');
}
break;
}
case 3: {
display_mini_statement(acc);
break;
}
case 4:
printf("Returning to main menu...\n\n");
break;
default:
printf("Invalid choice. Please try again.\n\n");
}
} while (choice != 4);
}
// Main function
int main() {
// Load accounts
if (!load_accounts()) {
printf("Failed to load accounts. Exiting.\n");
return 1;
}
printf("Welcome to the File-Based Banking System\n");
printf("Predefined Accounts (if new): 1001 (Alice, $1000), 1002 (Bob, $2000), 1003 (Charlie, $1500)\n\n");
int choice;
while (1) {
printf("=== Main Menu ===\n");
printf("1. Create New Account\n");
printf("2. Access Existing Account\n");
printf("3. Exit\n");
printf("Enter your choice: ");
if (scanf("%d", &choice) != 1) {
printf("Invalid choice.\n\n");
while (getchar() != '\n');
continue;
}
switch (choice) {
case 1:
create_account();
break;
case 2: {
int acc_num;
printf("Enter Account Number: ");
if (scanf("%d", &acc_num) != 1) {
printf("Invalid account number.\n\n");
while (getchar() != '\n');
break;
}
struct Account *acc = find_account(acc_num);
if (acc == NULL) {
printf("Account not found. Create it first?\n\n");
} else {
printf("Welcome, %s! Your current balance: $%.2f\n\n", acc->name, acc->balance);
transaction_menu(acc);
}
break;
}
case 3:
printf("Saving and exiting...\n");
save_accounts();
printf("Thank you for using the Banking System. Goodbye!\n");
return 0;
}
}
return 0;
}