用c语言写一个功能强大的atm取款机程序
时间: 2023-11-27 21:04:29 浏览: 83
C语言编写的ATM取款机程序
4星 · 用户满意度95%
要实现一个功能强大的ATM取款机程序,需要涉及很多方面的知识和技能,包括C语言编程、数据结构与算法、操作系统、计算机网络、数据库等等。
以下是一个简单的ATM取款机程序的C语言代码,它实现了基本的用户登录、账户查询、取款、存款、转账等功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_USER_NUM 100 // 最大用户数
#define MAX_NAME_LEN 20 // 姓名最大长度
#define MAX_PWD_LEN 20 // 密码最大长度
#define MAX_ACC_NUM 1000 // 最大账户数
#define MAX_ACC_BALANCE 1000000 // 账户最大余额
// 用户信息结构体
typedef struct user_info {
int id; // 用户ID
char name[MAX_NAME_LEN]; // 姓名
char pwd[MAX_PWD_LEN]; // 密码
} user_info_t;
// 账户信息结构体
typedef struct account_info {
int id; // 账户ID
int user_id; // 用户ID
int balance; // 余额
} account_info_t;
// 用户列表
user_info_t user_list[MAX_USER_NUM];
int user_num = 0;
// 账户列表
account_info_t acc_list[MAX_ACC_NUM];
int acc_num = 0;
// 当前登录用户ID
int cur_user_id = -1;
// 查找用户ID
int find_user_id(char *name, char *pwd) {
for (int i = 0; i < user_num; i++) {
if (strcmp(user_list[i].name, name) == 0 && strcmp(user_list[i].pwd, pwd) == 0) {
return user_list[i].id;
}
}
return -1;
}
// 查找账户ID
int find_acc_id(int user_id) {
for (int i = 0; i < acc_num; i++) {
if (acc_list[i].user_id == user_id) {
return acc_list[i].id;
}
}
return -1;
}
// 查询余额
void query_balance() {
if (cur_user_id == -1) {
printf("请先登录\n");
return;
}
int acc_id = find_acc_id(cur_user_id);
if (acc_id == -1) {
printf("未开户\n");
return;
}
printf("余额:%d\n", acc_list[acc_id].balance);
}
// 取款
void withdraw() {
if (cur_user_id == -1) {
printf("请先登录\n");
return;
}
int acc_id = find_acc_id(cur_user_id);
if (acc_id == -1) {
printf("未开户\n");
return;
}
int amount;
printf("请输入取款金额:");
scanf("%d", &amount);
if (amount <= 0) {
printf("金额必须大于0\n");
return;
}
if (amount > acc_list[acc_id].balance) {
printf("余额不足\n");
return;
}
acc_list[acc_id].balance -= amount;
printf("取款成功,余额:%d\n", acc_list[acc_id].balance);
}
// 存款
void deposit() {
if (cur_user_id == -1) {
printf("请先登录\n");
return;
}
int acc_id = find_acc_id(cur_user_id);
if (acc_id == -1) {
printf("未开户\n");
return;
}
int amount;
printf("请输入存款金额:");
scanf("%d", &amount);
if (amount <= 0) {
printf("金额必须大于0\n");
return;
}
if (acc_list[acc_id].balance + amount > MAX_ACC_BALANCE) {
printf("超出账户余额上限\n");
return;
}
acc_list[acc_id].balance += amount;
printf("存款成功,余额:%d\n", acc_list[acc_id].balance);
}
// 转账
void transfer() {
if (cur_user_id == -1) {
printf("请先登录\n");
return;
}
int acc_id = find_acc_id(cur_user_id);
if (acc_id == -1) {
printf("未开户\n");
return;
}
int dst_acc_id;
printf("请输入目标账户ID:");
scanf("%d", &dst_acc_id);
if (dst_acc_id <= 0 || dst_acc_id > acc_num) {
printf("无效的目标账户ID\n");
return;
}
if (acc_list[dst_acc_id - 1].user_id == cur_user_id) {
printf("不能转账给自己\n");
return;
}
int amount;
printf("请输入转账金额:");
scanf("%d", &amount);
if (amount <= 0) {
printf("金额必须大于0\n");
return;
}
if (amount > acc_list[acc_id].balance) {
printf("余额不足\n");
return;
}
acc_list[acc_id].balance -= amount;
acc_list[dst_acc_id - 1].balance += amount;
printf("转账成功,余额:%d\n", acc_list[acc_id].balance);
}
// 注册
void register_user() {
char name[MAX_NAME_LEN];
char pwd[MAX_PWD_LEN];
printf("请输入姓名:");
scanf("%s", name);
printf("请输入密码:");
scanf("%s", pwd);
for (int i = 0; i < user_num; i++) {
if (strcmp(user_list[i].name, name) == 0) {
printf("用户名已存在\n");
return;
}
}
if (user_num >= MAX_USER_NUM) {
printf("用户数已达上限\n");
return;
}
user_info_t user;
user.id = user_num + 1;
strcpy(user.name, name);
strcpy(user.pwd, pwd);
user_list[user_num] = user;
acc_list[acc_num].id = acc_num + 1;
acc_list[acc_num].user_id = user_num + 1;
acc_list[acc_num].balance = 0;
acc_num++;
user_num++;
printf("注册成功,您的账户ID是%d\n", user.id);
}
// 登录
void login() {
if (cur_user_id != -1) {
printf("您已经登录\n");
return;
}
char name[MAX_NAME_LEN];
char pwd[MAX_PWD_LEN];
printf("请输入姓名:");
scanf("%s", name);
printf("请输入密码:");
scanf("%s", pwd);
int user_id = find_user_id(name, pwd);
if (user_id == -1) {
printf("用户名或密码错误\n");
return;
}
cur_user_id = user_id;
printf("登录成功\n");
}
// 退出
void quit() {
if (cur_user_id == -1) {
printf("您还没有登录\n");
return;
}
cur_user_id = -1;
printf("退出成功\n");
}
// 显示菜单
void show_menu() {
printf("----------------------------\n");
printf("1. 查询余额\n");
printf("2. 取款\n");
printf("3. 存款\n");
printf("4. 转账\n");
printf("5. 注册\n");
printf("6. 登录\n");
printf("7. 退出\n");
printf("----------------------------\n");
}
int main() {
while (true) {
show_menu();
int choice;
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
query_balance();
break;
case 2:
withdraw();
break;
case 3:
deposit();
break;
case 4:
transfer();
break;
case 5:
register_user();
break;
case 6:
login();
break;
case 7:
quit();
exit(0);
default:
printf("无效的操作\n");
break;
}
}
return 0;
}
```
这个程序只是一个简单的ATM取款机程序,还有很多需要完善的地方,例如输入验证、错误处理、日志记录等等。如果要开发一个真正的商用级别的ATM取款机系统,需要更加细致深入的设计与开发。
阅读全文