c语言全功能ATM机代码
时间: 2023-08-12 18:53:03 浏览: 72
以下是一个更完整的C语言ATM机代码示例,包括了更多的功能和用户验证:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ACCOUNTS 10
#define MAX_NAME_LENGTH 50
#define PIN_LENGTH 4
typedef struct {
char name[MAX_NAME_LENGTH];
int accountNumber;
int balance;
char pin[PIN_LENGTH+1];
} Account;
Account accounts[MAX_ACCOUNTS];
int numAccounts = 0;
int loadAccounts() {
FILE* fp = fopen("accounts.txt", "r");
if (!fp) {
printf("Error: could not open accounts file.\n");
return 0;
}
char line[100];
while (fgets(line, sizeof(line), fp)) {
char* name = strtok(line, ",");
char* accountNumberStr = strtok(NULL, ",");
char* balanceStr = strtok(NULL, ",");
char* pin = strtok(NULL, ",");
Account account;
strncpy(account.name, name, MAX_NAME_LENGTH);
account.accountNumber = atoi(accountNumberStr);
account.balance = atoi(balanceStr);
strncpy(account.pin, pin, PIN_LENGTH+1);
accounts[numAccounts++] = account;
}
fclose(fp);
return 1;
}
int saveAccounts() {
FILE* fp = fopen("accounts.txt", "w");
if (!fp) {
printf("Error: could not open accounts file.\n");
return 0;
}
for (int i = 0; i < numAccounts; i++) {
fprintf(fp, "%s,%d,%d,%s\n", accounts[i].name, accounts[i].accountNumber, accounts[i].balance, accounts[i].pin);
}
fclose(fp);
return 1;
}
Account* getAccountByNumber(int accountNumber) {
for (int i = 0; i < numAccounts; i++) {
if (accounts[i].accountNumber == accountNumber) {
return &accounts[i];
}
}
return NULL;
}
void printAccount(Account* account) {
printf("Name: %s\n", account->name);
printf("Account Number: %d\n", account->accountNumber);
printf("Balance: %d\n", account->balance);
}
int authenticate(Account* account) {
char pin[PIN_LENGTH+1];
printf("Enter your PIN: ");
scanf("%s", pin);
if (strcmp(pin, account->pin) == 0) {
printf("Authentication successful.\n");
return 1;
} else {
printf("Authentication failed. Incorrect PIN.\n");
return 0;
}
}
void checkBalance(Account* account) {
printf("Your balance is %d\n", account->balance);
}
void deposit(Account* account) {
int amount;
printf("Enter the amount to deposit: ");
scanf("%d", &amount);
account->balance += amount;
printf("Deposit successful. Your new balance is %d\n", account->balance);
}
void withdraw(Account* account) {
int amount;
printf("Enter the amount to withdraw: ");
scanf("%d", &amount);
if (amount > account->balance) {
printf("Withdrawal failed. Insufficient balance.\n");
} else {
account->balance -= amount;
printf("Withdrawal successful. Your new balance is %d\n", account->balance);
}
}
void transfer(Account* account) {
int targetAccountNumber, amount;
printf("Enter the target account number: ");
scanf("%d", &targetAccountNumber);
Account* targetAccount = getAccountByNumber(targetAccountNumber);
if (!targetAccount) {
printf("Transfer failed. Target account not found.\n");
return;
}
printf("Enter the amount to transfer: ");
scanf("%d", &amount);
if (amount > account->balance) {
printf("Transfer failed. Insufficient balance.\n");
} else {
account->balance -= amount;
targetAccount->balance += amount;
printf("Transfer successful. Your new balance is %d\n", account->balance);
}
}
void changePin(Account* account) {
char newPin[PIN_LENGTH+1];
printf("Enter your new PIN: ");
scanf("%s", newPin);
strncpy(account->pin, newPin, PIN_LENGTH+1);
printf("PIN changed successfully.\n");
}
int main() {
if (!loadAccounts()) {
return 1;
}
int option, accountNumber;
while (1) {
printf("Welcome to the ATM machine!\n");
printf("Please enter your account number (or -1 to exit): ");
scanf("%d", &accountNumber);
if (accountNumber == -1) {
break;
}
Account* account = getAccountByNumber(accountNumber);
if (!account) {
printf("Account not found.\n");
continue;
}
if (!authenticate(account)) {
continue;
}
while (1) {
printf("Please select an option:\n");
printf("1. Check Balance\n");
printf("2. Deposit\n");
printf("3. Withdraw\n");
printf("4. Transfer\n");
printf("5. Change PIN\n");
printf("6. Exit\n");
scanf("%d", &option);
switch(option) {
case 1:
checkBalance(account);
break;
case 2:
deposit(account);
break;
case 3:
withdraw(account);
break;
case 4:
transfer(account);
break;
case 5:
changePin(account);
break;
case 6:
printf("Thank you for using the ATM machine!\n");
saveAccounts();
return 0;
default:
printf("Invalid option. Please try again.\n");
}
}
}
return 0;
}
```
该代码使用了结构体来存储账户信息,并将其保存在accounts.txt文件中。代码中包括了更多的功能,如转账和更改PIN码。在每次用户验证和交易后,代码会将账户信息保存回文件中。