C语言实现ATM自动取款机系统:从建项目到功能代码详解

蓝鲸
蓝鲸
发布时间:2026-10-15| 3人浏览过
原创

本文详细解析如何使用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自动取款机系统的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。