C语言实现ATM自动取款机系统:从建项目到功能代码详解
本文详细解析如何使用C语言在Visual Studio环境中从零构建一个具备完整交互流程的ATM自动取款机模拟系统,重点讲解账户验证、资金管理及状态切换的代码实现。
开发准备与项目创建
本示例基于 C 语言标准库函数与控制台界面,使用 Visual Studio 2019 作为集成开发环境。项目设计目标是通过模块化函数调用,模拟真实 ATM 机的登录验证、业务处理及返回机制。
第1步:创建空项目
启动 Visual Studio 2019,新建项目时选择“控制台应用程序(Windows)”,并勾选“空项目”以手动管理文件结构。配置项目名称与本地保存路径:
进入解决方案资源管理器,右键点击源文件目录,依次添加头文件 ATM.h 和源文件 ATM.c:
核心变量定义与主循环架构
在开始编写具体业务逻辑前,需在头文件中定义全局状态变量。这些变量将贯穿整个程序的运行周期,确保数据在各函数间共享。
#pragma once #include <stdio.h> // 包含相应的头文件 #include <stdlib.h>
在源文件 ATM.c 中初始化全局账号(CODE)与初始余额(balance),并在 main 函数中建立永不退出的主循环框架:
long int CODE = 123456; // 登入密码
long int balance = 10000; // 存款的数目
int main()
{
system("color 3E");
while (1)
{
EnterAccount();
}
return 0;
}第一阶段:登录页面与安全验证
这一阶段的核心是确保只有合法用户才能进入主菜单。包括输入账号校验、三次密码容错机制以及退出系统的控制。
第2步:设计登录页显示与账号输入
首先输出欢迎界面,并通过用户的选择决定走向。若选择登录,则提示输入卡号;若卡号不匹配预设值,要求重输;若正确,则流转至密码输入环节。
void EnterAccount()
{
system("cls");
printf("*********************************\n");
printf("* 欢迎使用 ATM 自动服务系统 *\n");
printf("* 1.登入 2.退出 *\n");
printf("*********************************\n");
long int user;
int select;
printf("请选择功能:");
scanf("%d", &select);
if (select == 1)
{
printf("请输入卡号:");
scanf("%d", &user);
if (user != 123456) // 假设固定账号为 123456
{
printf(" 账户不存在,请从新输入!!!\n");
system("pause");
EnterAccount(); // 递归或跳转回主页重试
}
else
{
EnterPassword(); // 进入密码验证流程
}
}
else // 选择退出
{
system("cls");
printf("********************************\n");
printf("* 欢迎您的再次使用 *\n");
printf("* 按任意键将退出ATM系统!!!*\n");
printf("********************************\n");
system("pause");
exit(0);
}
}程序运行后的登录引导界面如下所示:
第3步:密码输入验证与容错限制
为了防止暴力破解,设计了最多三次错误尝试的限制。若三次均未通过,则强制返回登录页;若成功则进入系统主菜单。
void EnterPassword()
{
long int code;
int temp = 3;
printf("********************************\n");
printf("* 请输入密码 *\n");
printf("********************************\n");
printf("请输入密码:");
scanf("%d", &code);
while (code != CODE)
{
temp--;
if (temp == 0)
{
printf("********************************\n");
printf("* 您已经 3 次输入密码 *\n");
printf("* 按任意键将返回登入系统!!!*\n");
printf("********************************\n");
system("pause");
EnterAccount();
}
printf("********************************\n");
printf("* 密码错误,请重新输入 *\n");
printf("* 您还有 %d 次机会 *\n", temp);
printf("********************************\n");
printf("请输入密码:");
scanf("%d", &code);
}
Menu(); // 验证通过,跳转主菜单
}登录成功后显示的欢迎页面:
第二阶段:主菜单与业务模块入口
当身份验证通过后,系统将展示包含“修改密码、查询余额、取款、存款、返回登录”五个选项的主操作面板。该模块采用 switch-case 结构进行路由分发。
void Menu()
{
int select = 0;
system("cls");
printf("********************************\n");
printf("* 欢迎来到ATM自动取款系统 *\n");
printf("* 请选择一下业务 *\n");
printf("* 1.修改密码 *\n");
printf("* 2.查询余额 *\n");
printf("* 3.取款 *\n");
printf("* 4.存款 *\n");
printf("* 5.返回 *\n");
printf("********************************\n");
printf("请选择功能:");
scanf("%d", &select);
switch (select)
{
case 1:
pwModify();
break;
case 2:
balanceQuery();
break;
case 3:
moneyTakeOut();
break;
case 4:
moneySave();
break;
case 5:
returnEnter();
break;
default:
printf("error\n");
break;
}
}不同输入状态下界面的反馈:
第三阶段:功能实现 - 修改密码
修改密码功能需要极高的安全性。流程包括:旧密码校验、新密码输入、二次确认、长度及复杂度检查。任何环节失败均需重新执行该步骤。
void pwModify()
{
long int mm1, mm2, mm3;
char temp;
system("cls");
printf(" 密码修改 \n");
printf("输入旧密码:\n");
scanf("%d", &mm1);
// 校验旧密码
while (mm1 != CODE)
{
printf("旧密码错误\n请重新输入!!!\n");
system("pause");
printf("旧密码:");
scanf("%d", &mm1);
}
printf("\n输入新密码: ");
scanf("%d", &mm2);
if (mm1 == mm2)
{
printf("\n输入的新密码与旧密码一样!!!\n重新输入新密码\n");
printf("\n输入新密码: ");
scanf("%d", &mm2);
}
printf("\n确认新密码:");
scanf("%d", &mm3);
if (mm2 != mm3) // 验证输入的一致性
{
printf("确认密码不一致\n请重新输入!!!\n");
system("pause");
pwModify();
}
// 基础安全校验:长度与简单性
if (mm2 < 100000) // 防止输入的密码过于短
{
printf("密码必须大于或等于6位数\n请重新输入!!!\n");
system("pause");
pwModify();
}
temp = (char)mm2 % 111111;
if (temp == 0) // 防止输入的密码过于简单
{
printf("密码过于简单\n请重新输入!!!\n");
system("pause");
pwModify();
}
CODE = mm2; // 更新全局变量密码
system("cls");
printf(" 修改密码操作成功 \n");
printf(" 按任意键返回主页面\n");
system("pause");
Menu(); // 返回系统的主页面
}操作过程中的各类提示信息:
第四阶段:功能实现 - 余额、存取款逻辑
第4步:余额查询
直接读取全局余额变量并格式化输出,无需复杂判断。
void balanceQuery()
{
system("cls");
printf(" 您的余额为 \n");
printf(" %d元 \n", balance);
printf(" 按任意键返回主页面\n");
system("pause");
Menu();
}查询结果展示:
第5步:取款操作与资金校验
取款需分两步走:先让用户选择预设金额或自定义输入,再调用校验函数。校验逻辑涵盖单笔上限及当前余额是否充足。
void moneyTakeOut()
{
long int temp;
int select = 0;
system("cls");
printf("********************************\n");
printf("* 请选择您要取款的金额 *\n");
printf("* 1.100 2.200 *\n");
printf("* 3.500 4.800 *\n");
printf("* 5.1000 6.其它 *\n");
printf("* *\n");
printf("* 7.返回 8.返回 *\n");
printf("********************************\n");
printf(" 请输入选择序号:");
scanf("%d", &select);
switch (select)
{
case 1:
takeOutJudge(100);
break;
case 2:
takeOutJudge(200);
break;
case 3:
takeOutJudge(500);
break;
case 4:
takeOutJudge(800);
break;
case 5:
takeOutJudge(1000);
break;
case 6:
printf(" 请输入您要取款的金额:");
scanf("%d", &temp);
takeOutJudge(temp);
break;
case 7:
Menu();
break;
}
}
void takeOutJudge(int takeOutMoney)
{
if (takeOutMoney > balance)
{
printf(" 余额不足! \n");
printf(" 请重新操作 \n");
printf(" 按任意键返回主页面\n");
system("pause");
Menu();
}
if (takeOutMoney > 500000) // 单笔限制5万
{
printf(" 每次取款不能超过 50000 元 \n");
printf(" 请重新操作 \n");
printf(" 按任意键返回主页面\n");
system("pause");
Menu();
}
balance = balance - takeOutMoney;
printf(" 取款操作成功 \n");
printf(" 按任意键返回主页面\n");
system("pause");
Menu();
}系统对余额变动及超限操作的反应:
第6步:存款操作
存款仅涉及输入正数并累加余额。关键在于拦截非法的负数输入。
void moneySave()
{
long int tempMoney;
system("cls");
printf("请输入存放的人民币:");
scanf("%d", &tempMoney);
while (tempMoney < 0)
{
printf("输入的存款数据不能为负数!!!\n");
printf("请重新输入存放的人民币:");
scanf("%d", &tempMoney);
}
balance = balance + tempMoney;
printf(" 存款操作成功 \n");
printf(" 按任意键返回主页面\n");
system("pause");
Menu();
}存款录入成功的画面反馈:
第五阶段:系统退出与注销
当用户主动选择返回登录页或退出系统时,触发相应的重置或关闭流程。返回登录页会清空当前会话界面并重启验证链。
void returnEnter()
{
system("cls");
printf("********************************\n");
printf("* 欢迎您的再次使用 *\n");
printf("* 按任意键将返回登入页面!!!*\n");
printf("********************************\n");
system("pause");
EnterAccount();
}返回页面的过渡动画效果:
总结
本文通过拆解 AT M 机的六大核心功能,演示了 C 语言中条件分支、循环控制以及模块化编程的实际应用。这种结构清晰的代码编写方式,非常适合编程入门者深入理解程序的数据流向与状态管理。
以上就是C语言实现ATM自动取款机系统的详细内容,更多关于C语言ATM自动取款机系统的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









