【C语言实现简易ATM】上个C语言程序设计课,我成产品经理了?

简介: 一、工作前的准备⭐1、需求概述1.产品类型:简易ATM自助取款机2.产品背景:本产品旨在满足人们财产存取等需求,为人们提供更加方便的服务3.设计目的:ATM自助取款机的设计意图是为了方便人们更加合理妥善地管理自己的财产,确保个人财产的安全,提高人们的生活质量。

⭐一、工作前的准备

⭐1、需求概述

1.产品类型:简易ATM自助取款机

2.产品背景:本产品旨在满足人们财产存取等需求,为人们提供更加方便的服务

3.设计目的:ATM自助取款机的设计意图是为了方便人们更加合理妥善地管理自己的财产,确保个人财产的安全,提高人们的生活质量。

⭐2、功能概述

1.登入:需要输入用户的账号密码,账号密码正确才可以进入ATM系统

2.存款:存取用户想要存取的金额,并修改txt文档中的数据

3.取款:取出用户想要取出的金额,并修改txt文档中的数据

4.查询:查询用户的财产信息

5.修改密码:修改用户的个人密码(只有在登入成功后才可进行)

6.转账:用户对其他用户进行金额的转账,并修改各自在文档中的数据信息

7.语音播报:在运行程序后进行语音播报(欢迎使用本ATM自助取款机)

8.弹窗:弹出一个广告页面,点击窗口右上角即可关闭(暂不完善)

9.开户:注册一个全新的本ATM系统中的账号

10.销户:删除该用户需要销毁账号在txt文档中的数据

11.忘记密码:用户忘记密码时可通过一系列个人密保等找回密码

12.流水记录:记录用户账号存款、取款、转账等操作

⭐二、代码实现

⭐1、结构体的定义

struct LoginData {
    char user[MAX_USER_LEN]; //用户的账号
    char pass[MAX_PASS_LEN]; //用户的密码
    double balance; //用户的余额
};

⭐2、主函数

#include "atmdemo.h"
#include <stdio.h>
#include <cstdlib>
int main() {
    //speak();
    printf("*********************************\n");
    printf("*****欢迎来到ATM银行取款系统*****\n");
    printf("*********************************\n");
    int choose;
    while (true) {
        printf("1.登录\t2.注册\n");
        printf("3.忘记密码 4.退出\n");
        printf("请选择你需要进行的业务:\n");
        scanf("%d",&choose);
        getchar();
        switch (choose) {
            case 1:
                login();
                break;
            case 2:
                enroll();
                break;
            case 3:
                forgotpassword();
                break;
            case 4:
                printf("退出成功\n");
                exit(0);
            default:
                printf("非法输入,请重新输入:\n");
                break;
        }
    }
}

⭐3、功能函数

⭐01、用户登入

登入:用户需要输入账号和密码进行登入,只有当账号密码都正确时才能登入成功。登入时有三次机会,每次输入错误减少一次机会并提示剩余几次机会,若三次输入都错误用户将无法再次进行登入且显示登入失败。

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
struct LoginData Account;
bool check_account(char name[MAX_USER_LEN], char pass[MAX_PASS_LEN]);
void login() {
    FILE* fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    if(fp==NULL){
        printf("该系统没有用户,请注册\n");
        return;
    }
    fclose(fp);
    char user_name[MAX_USER_LEN];
    char user_pass[MAX_PASS_LEN];
    int count=0;
    while (true) {
        printf("请输入用户名:\n");
        scanf("%s",user_name);
        printf("请输入密码:\n");
        scanf("%s",user_pass);
        bool flag=check_account(user_name,user_pass);
        if(flag == false) {
            if(count==2){
                printf("登陆失败!!!\n");
                return;
            }
            count++;
            printf("用户名或密码错误,还剩");
            printf("%d",3-count);
            printf("次机会,请重新输入\n");
        } else{
            break;
        }
    }
    printf("登录成功\n");
    mnue(Account);
}
bool check_account(char name[MAX_USER_LEN], char pass[MAX_PASS_LEN]) {
    FILE* fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    char stored_user[MAX_USER_LEN];
    char stored_pass[MAX_PASS_LEN];
    double stored_balance;
    while (fscanf(fp, "%s %s %lf", stored_user, stored_pass, &stored_balance) == 3) {
        if (strcmp(name, stored_user) == 0 && strcmp(pass, stored_pass) == 0) {
            strcpy(Account.user,stored_user);
            strcpy(Account.pass,stored_pass);
            Account.balance=stored_balance;
            fclose(fp);
            return true;
        }
    }
    fclose(fp);
    return false;
}

⭐02、用户存款

存款:用户输入自己需要存取的金额,若存取金额小于等于0,显示非法输入,否则将用户需要存取的金额在原有金额上进行相加,并且更新txt文档中该用户的信息。

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
bool deposit(struct LoginData loginData, double amount) {
    if (amount <= 0) {
        printf("非法输入,请重新输入\n");
        return false;
    } else {
        FILE *fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
        FILE *temp = fopen("D:\\Users\\AdolBook\\Desktop\\temp.txt", "w");
        char file_user[MAX_USER_LEN];
        char file_pass[MAX_PASS_LEN];
        double file_balance;
        double temp_balance;
        while (fscanf(fp, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
            if (strcmp(loginData.user, file_user) == 0 && strcmp(loginData.pass, file_pass) == 0) {
                temp_balance = file_balance + amount;
                fprintf(temp, "%s %s %.2lf\n", loginData.user, loginData.pass, temp_balance);
            } else {
                fprintf(temp, "%s %s %.2lf\n", file_user, file_pass, file_balance);
            }
        }
        fclose(fp);
        fclose(temp);
        remove("D:\\Users\\AdolBook\\Desktop\\login_data.txt");
        rename("D:\\Users\\AdolBook\\Desktop\\temp.txt", "D:\\Users\\AdolBook\\Desktop\\login_data.txt");
        printf("存款成功,账户余额为: %.2lf\n", temp_balance);
        char type[20]="deposit";
        char c='+';
        FILE *fr = fopen("D:\\Users\\AdolBook\\Desktop\\transaction_history.txt", "a");
        fprintf(fr,"%s %s %c %.2lf\n",loginData.user,type,c,amount);
        fclose(fr);
        return true;
    }
}

⭐03、用户取款

取款:用户输入自己需要取出的金额,若取出的金额小于等于0,显示非法输入,若取出的金额大于该用户所拥有的金额,显示余额不足,请重新输入。否则的话在用户原有的金额上减去取出的金额,并且更新txt文档中该用户的信息。

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
bool withdraw(struct LoginData loginData, double amount) {
    if (amount <= 0) {
        printf("非法输入,请重新输入\n");
        return false;
    } else if (amount > loginData.balance) {
        printf("余额不足,请重新输入\n");
        return false;
    } else {
        FILE *fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
        FILE *temp = fopen("D:\\Users\\AdolBook\\Desktop\\temp.txt", "w");
        char file_user[MAX_USER_LEN];
        char file_pass[MAX_PASS_LEN];
        double file_balance;
        double temp_balance;
        while (fscanf(fp, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
            if (strcmp(loginData.user, file_user) == 0 && strcmp(loginData.pass, file_pass) == 0) {
                temp_balance = file_balance - amount;
                fprintf(temp, "%s %s %.2lf\n", loginData.user, loginData.pass, temp_balance);
            } else {
                fprintf(temp, "%s %s %.2lf\n", file_user, file_pass, file_balance);
            }
        }
        fclose(fp);
        fclose(temp);
        remove("D:\\Users\\AdolBook\\Desktop\\login_data.txt");
        rename("D:\\Users\\AdolBook\\Desktop\\temp.txt", "D:\\Users\\AdolBook\\Desktop\\login_data.txt");
        printf("取款成功,账户余额为:%.2lf\n", temp_balance);
        char type[20]="withdraw";
        char c='-';
        FILE *fr = fopen("D:\\Users\\AdolBook\\Desktop\\transaction_history.txt", "a");
        fprintf(fr,"%s %s %c %.2lf\n",loginData.user,type,c,amount);
        fclose(fr);
        return true;
    }
}

⭐04、用户查询

查询:打开txt文档在里面查询该用户所拥有的财产并向该用户展示出来

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
void check(struct LoginData loginData) {
    FILE* fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    char check_user[MAX_USER_LEN];
    char check_pass[MAX_PASS_LEN];
    double check_balance;
    while (fscanf(fp, "%s %s %lf", check_user, check_pass, &check_balance) == 3) {
        if (strcmp(loginData.user, check_user) == 0) {
            printf("查询成功,您的余额为 %.2lf\n", check_balance);
            break;
        }
    }
    fclose(fp);
}

⭐05、修改密码

修改密码:先输入该用户现在的密码,然后输入需要修改的新密码,输入新密码后要求再次输入新密码以确认(密码要求为6位数)

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
void changePassword(struct LoginData loginData) {
    printf("请输入新密码\n");
    char change_pass[MAX_PASS_LEN];
    scanf("%s", change_pass);
    FILE* fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    FILE* temp = fopen("D:\\Users\\AdolBook\\Desktop\\temp.txt", "w");
    char file_user[MAX_USER_LEN];
    char file_pass[MAX_PASS_LEN];
    double file_balance;
    while (fscanf(fp, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
        if (strcmp(loginData.user, file_user) == 0 && strcmp(loginData.pass, file_pass) == 0) {
            fprintf(temp, "%s %s %.2lf\n", loginData.user, change_pass, loginData.balance);
        }
        else {
            fprintf(temp, "%s %s %.2lf\n", file_user, file_pass, file_balance);
        }
    }
    fclose(fp);
    fclose(temp);
    remove("D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    rename("D:\\Users\\AdolBook\\Desktop\\temp.txt", "D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    printf("修改密码成功\n");
}

⭐06、用户转账

转账:当前用户输入需要转账的用户账号,若被转账的用户账号不存在,显示该账户不存在,否则的话输入需要转账的金额,若转账金额大于当前用户所拥有的金额,显示余额不足,反之则向被转账的用户进行转账,当前用户的金额在原有金额上减去转出去的金额,被转账的用户在原有的金额上加上转过去的那笔钱。双方的用户信息都需要在文档中进行更新。

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
bool transferaccounts(struct LoginData loginData, char transfer_name[]) {
    FILE *fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    FILE *temp = fopen("D:\\Users\\AdolBook\\Desktop\\temp.txt", "w");
    char file_user[MAX_USER_LEN];
    char file_pass[MAX_PASS_LEN];
    double file_balance;
    char transfer_pass[MAX_USER_LEN];
    double balance;
    bool found = false;
    while (fscanf(fp, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
        if (strcmp(transfer_name, file_user) == 0) {
            found = true;
            strcpy(transfer_pass, file_pass);
            balance = file_balance;
            fprintf(temp, "%s %s %.2lf\n", file_user, file_pass, file_balance);
        } else {
            fprintf(temp, "%s %s %.2lf\n", file_user, file_pass, file_balance);
        }
    }
    fclose(fp);
    fclose(temp);
    remove("D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    rename("D:\\Users\\AdolBook\\Desktop\\temp.txt", "D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    if (!found) {
        printf("账户不存在\n");
        return false;
    }
    printf("请输入转账金额\n");
    double transfer_balance;
    scanf("%lf", &transfer_balance);
    if (transfer_balance > loginData.balance) {
        printf("您的余额不足\n");
        return false;
    }
    fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    temp = fopen("D:\\Users\\AdolBook\\Desktop\\temp.txt", "w");
    while (fscanf(fp, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
        if (strcmp(loginData.user, file_user) == 0 && strcmp(loginData.pass, file_pass) == 0) {
            fprintf(temp, "%s %s %.2lf\n", loginData.user, loginData.pass, file_balance - transfer_balance);
        } else if (strcmp(transfer_name, file_user) == 0) {
            fprintf(temp, "%s %s %.2lf\n", transfer_name, transfer_pass, transfer_balance + balance);
        } else {
            fprintf(temp, "%s %s %.2lf\n", file_user, file_pass, file_balance);
        }
    }
    fclose(fp);
    fclose(temp);
    remove("D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    rename("D:\\Users\\AdolBook\\Desktop\\temp.txt", "D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    printf("转账成功\n");
    char type[20]="transfer";
    char c1='+';
    char c2='-';
    FILE *fr = fopen("D:\\Users\\AdolBook\\Desktop\\transaction_history.txt", "a");
    fprintf(fr,"%s %s %c %.2lf\n",loginData.user,type,c2,transfer_balance);
    fprintf(fr,"%s %s %c %.2lf\n",transfer_name,type,c1,transfer_balance);
    fclose(fr);
    return true;
}

⭐07、语音播报

语音播报:在运行ATM系统后自动播报一段语音,并且在次基础上设置一下系统页面(颜色、标题)

#include"atmdemo.h"
#include<stdio.h>
#include<stdlib.h>
void showStyle()
{
  //system("color f3");
  system("title 哈哈语音播报系统");
}
char userData[10000] = "欢迎使用22计软6班程序一组的ATM自助取款机";
void speak()
{
    //界面设定 
  showStyle();
  //生产vbs文件
  FILE* fp = fopen("voice.vbs", "w");
  //写入CreteObject("SAPI.SpVoice"),Speak("用户输入的内容");
  fprintf(fp, "CreateObject(\"SAPI.SpVoice\").Speak(\"%s\")", "欢迎使用二二计软6班程序一组的ATM自助取款机");
  fclose(fp);
  system("voice.vbs"); //语音读取vbs文件
  //system("del voice.vbs"); //删除vbs文件
  system("pause");
}

⭐08、用户注册

注册:如若当前用户没有账号的话可立即注册一个,注册时首先需要输入一个自定义账号,然后自己设定一个私密密码,该密码的长度为6位,注册成功后该用户注册的该账号相关信息将存入txt文档中,且初始余额为0。

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
bool check_username(char name[MAX_USER_LEN]);
bool check_pass(char pass[MAX_PASS_LEN]);
bool againcheck_pass(char pass[MAX_PASS_LEN], char pass1[MAX_PASS_LEN]);
bool checkPhone(char num[11]);
bool checkCode(int code, int code1);
void enroll(void){
    printf("-------------------------\n");
    printf("-----欢迎来到注册界面----\n");
    printf("-------------------------\n");
    FILE* fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "a");
    char user_name[MAX_USER_LEN];
    char user_pass[MAX_PASS_LEN];
    char again_pass[MAX_PASS_LEN];
    double user_balance=0;
    printf("请输入用户名:(按0退出)\n");
    while (true) {
        scanf("%s", user_name);
        if(strcmp(user_name,"0")==0){
            return;
        }
        bool flag1 = check_username(user_name);
        if (flag1 == false) {
            printf("用户名已存在,请重新输入:(按0退出)\n");
            continue;
        }else {
            printf("请输入密码:(密码应为6为数字)\n");
            scanf("%s",user_pass);
            bool flag2=check_pass(user_pass);
            if(flag2 == false){
                printf("密码格式错误,请重新操作。\n");
                continue;
            }else{
                printf("请再次输入密码:\n");
                scanf("%s",again_pass);
                bool flag3=againcheck_pass(user_pass,again_pass);
                if(flag3 == false){
                    printf("两次密码不一致,请重新操作。\n");
                    continue;
                } else{
                    fprintf(fp,"%s %s %.2lf\n",user_name,user_pass,user_balance);
                    printf("注册成功。\n");
                    break;
                }
            }
        }
    }
    fclose(fp);
    printf("请绑定您的手机号码\n");
    char phoneNum[11];
    while (true) {
        scanf("%s", phoneNum);
        bool flag = checkPhone(phoneNum);
        if (!flag) {
            printf("电话号码格式错误,请重新输入\n");
            continue;
        } else {
            break;
        }
    }
    while (true) {
        int RandCode=getRandomCode();
        printf("%d\n",RandCode);
        int inRandCode;
        printf("请输入验证码\n");
        scanf("%d",&inRandCode);
        bool flag=checkCode(RandCode,inRandCode);
        if(!flag){
            printf("验证码错误,请重新输入\n");
            continue;
        } else{
            break;
        }
    }
    FILE* basic = fopen("D:\\Users\\AdolBook\\Desktop\\basic_data.txt", "a");
    fprintf(basic,"%s %s\n",user_name,phoneNum);
    printf("绑定成功\n");
    fclose(basic);
}
bool checkCode(int code, int code1) {
    if(code==code1){
        return true;
    } else {
        return false;
    }
}
bool checkPhone(char num[11]) {
    if(strlen(num)!=11){
        return false;
    } else {
        return true;
    }
}
bool againcheck_pass(char pass[6], char pass1[6]) {
    if(strcmp(pass,pass1)==0){
        return true;
    } else{
        return false;
    }
}
bool check_pass(char pass[6]) {
    if(strlen(pass)!=6){
        return false;
    }else{
        for(int i=0;i< strlen(pass);i++){
            if(pass[i]<'0'||pass[i]>'9'){
                return false;
            }
        }
    }
    return true;
}
bool check_username(char name[MAX_USER_LEN]) {
    FILE* fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    char checkuser[MAX_USER_LEN];
    char checkpass[MAX_PASS_LEN];
    double checkbalance;
    while (fscanf(fp, "%s %s %lf", checkuser, checkpass, &checkbalance) == 3) {
        if (strcmp(name, checkuser) == 0) {
            fclose(fp);
            return false;
        }
    }
    fclose(fp);
    return true;
}

⭐09、用户注销

注销:如果当前用户不想要某个账号时可对账号进行销户处理,即将该账号进行销毁,销户时需先进行身份验证,首先要输入电话号码,电话号码正确后再输入验证码,验证码正确后才可成功销户。

#include "atmdemo.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
bool checkPhone(char phone[12], char account[20]);
void cancellation(char account[20]) {
    char check_phone[12];
    printf("注销前需验证身份,请输入手机号码(按0退出)\n");
    while (true) {
        scanf("%s", check_phone);
        if (strcmp(check_phone, "0") == 0) {
            printf("退出成功\n");
            return;
        }
        bool flag1 = checkPhone(check_phone, account);
        if (!flag1) {
            printf("电话号码错误,请重新输入\n");
            continue;
        } else {
            break;
        }
    }
    while (true) {
        int RandCode = getRandomCode();
        int inRandCode;
        printf("%04d\n", RandCode);
        printf("请输入验证码\n");
        scanf("%d", &inRandCode);
        if (RandCode == inRandCode) {
            break;
        } else {
            printf("验证码错误\n");
            continue;
        }
    }
    char file_user[20];
    char file_pass[20];
    char file_phone[12];
    double file_balance;
    FILE *fp = fopen("D:\\Users\\AdolBook\\Desktop\\basic_data.txt", "r");
    FILE *temp = fopen("D:\\Users\\AdolBook\\Desktop\\temp_data.txt", "w");
    while (fscanf(fp, "%s %s", file_user, file_phone) == 2) {
        if (strcmp(account, file_user) == 0) {
            continue;
        } else {
            fprintf(temp, "%s %s\n", file_user, file_phone);
        }
    }
    fclose(fp);
    fclose(temp);
    remove("D:\\Users\\AdolBook\\Desktop\\basic_data.txt");
    rename("D:\\Users\\AdolBook\\Desktop\\temp_data.txt", "D:\\Users\\AdolBook\\Desktop\\basic_data.txt");
    FILE *fp1 = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    FILE *temp1 = fopen("D:\\Users\\AdolBook\\Desktop\\temp1_data.txt", "w");
    while (fscanf(fp1, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
        if (strcmp(account, file_user) == 0) {
            continue;
        } else {
            fprintf(temp1, "%s %s %.2lf\n", file_user, file_pass, file_balance);
        }
    }
    fclose(fp1);
    fclose(temp1);
    remove("D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    rename("D:\\Users\\AdolBook\\Desktop\\temp1_data.txt", "D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    printf("注销成功\n");
    exit(0);
}
bool checkPhone(char phone[12], char account[20]) {
    char file_user[MAX_USER_LEN];
    char file_phone[12];
    FILE *fo = fopen("D:\\Users\\AdolBook\\Desktop\\basic_data.txt", "r");
    while (fscanf(fo, "%s %s", file_user, file_phone) == 2) {
        if (strcmp(file_user, account) == 0 && strcmp(file_phone, phone) == 0) {
            return true;
        }
    }
    fclose(fo);
    return false;
}

验证码功能的实现代码:

#include "atmdemo.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int getRandomCode() {
    int Code;
    srand(time(NULL));
    Code = rand() % 10000;
    return Code;
}

⭐10、忘记密码

忘记密码:当前用户忘记账号密码时可选择忘记密码选项,首先需要输入用户账号,然后输入该用户账号绑定的手机号,然后通过该账号绑定的手机号发送的验证码才可进行密码的修改,修改密码时先输入新密码,然后再次输入密码来确认,密码格式必须为6位数,,且前后两次密码必须相同。以上步骤均正确后才可成功修改密码。

#include "atmdemo.h"
#include <stdio.h>
#include <string.h>
bool checkPass(char pass[6]);
bool againcheck(char pass[6], char again[6]);
bool CheckCode(int code1, int code2);
void forgotpassword() {
    char user_name[MAX_USER_LEN];
    char file_user[MAX_USER_LEN];
    char file_pass[MAX_PASS_LEN];
    double file_balance;
    char file_phone[12];
    char phoneNum[12];
    printf("请输入用户名\n");
    scanf("%s", user_name);
    bool flag1 = false;
    FILE *fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    while (fscanf(fp, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
        if (strcmp(user_name, file_user) == 0) {
            flag1 = true;
            break;
        }
    }
    fclose(fp);
    if (!flag1) {
        printf("该账户不存在\n");
        return;
    }
    bool flag2 = false;
    int count=0;
    printf("请输入电话号码\n");
    FILE *fo = fopen("D:\\Users\\AdolBook\\Desktop\\basic_data.txt", "r");
    while (true) {
        scanf("%s", phoneNum);
        while (fscanf(fo, "%s %s", file_user, file_phone) == 2) {
            if (strcmp(file_user,user_name)==0 && strcmp(file_phone, phoneNum) == 0) {
                flag2 = true;
                break;
            }
        }
        if (flag2 == false) {
            if(count==2){
                return;
            }
            count++;
            printf("电话号码错误,请重新输入\n");
            continue;
        } else {
            break;
        }
    }
    fclose(fo);
    while (true) {
        int RandCode = getRandomCode();
        int inRandCode;
        printf("%04d\n",RandCode);
        printf("请输入验证码\n");
        scanf("%d", &inRandCode);
        bool flag3 = CheckCode(RandCode, inRandCode);
        if (!flag3) {
            printf("验证码错误,请重新输入\n");
            continue;
        } else {
            break;
        }
    }
    char pass[MAX_PASS_LEN];
    char again[MAX_PASS_LEN];
    while (true) {
        printf("请输入新密码(应为6为数字)\n");
        scanf("%s", pass);
        bool flag1 = checkPass(pass);
        if(!flag1){
            printf("密码格式错误\n");
            continue;
        } else {
            printf("请再次输入密码\n");
            scanf("%s",again);
            bool flag2=againcheck(pass,again);
            if(!flag2){
                printf("两次密码不一致\n");
                continue;
            } else {
                break;
            }
        }
    }
    fp = fopen("D:\\Users\\AdolBook\\Desktop\\login_data.txt", "r");
    FILE *temp = fopen("D:\\Users\\AdolBook\\Desktop\\temp.txt", "w");
    while (fscanf(fp, "%s %s %lf", file_user, file_pass, &file_balance) == 3) {
        if (strcmp(user_name, file_user) == 0 ) {
            fprintf(temp, "%s %s %.2lf\n", file_user, pass, file_balance);
        } else {
            fprintf(temp, "%s %s %.2lf\n", file_user, file_pass, file_balance);
        }
    }
    fclose(fp);
    fclose(temp);
    remove("D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    rename("D:\\Users\\AdolBook\\Desktop\\temp.txt", "D:\\Users\\AdolBook\\Desktop\\login_data.txt");
    printf("密码修改成功\n");
}
bool CheckCode(int code1, int code2) {
    if(code1==code2){
        return true;
    } else {
        return false;
    }
}
bool againcheck(char pass[6], char again[6]) {
    if(strcmp(pass,again)==0){
        return true;
    } else {
        return false;
    }
}
bool checkPass(char pass[6]) {
    if(strlen(pass)!=6){
        return false;
    }else{
        return true;
    }
}

⭐11、流水记录

流水记录:根据当前用户的账号回溯其帐号的交易记录,每次进行的交易操作都会被存取到一个txt文档中,进行流水记录查询时就会将该账号存取在该txt文档中的交易过程一一展示出来。

#include "atmdemo.h"
#include "stdio.h"
#include "string.h"
void QueryStatements(char account[20]) {
    char file_user[MAX_USER_LEN];
    char file_type[MAX_PASS_LEN];
    double file_balance;
    char file_c;
    FILE *fp = fopen("D:\\Users\\AdolBook\\Desktop\\transaction_history.txt", "r");
    while (fscanf(fp, "%s %s %c %lf", file_user, file_type, &file_c, &file_balance) == 4) {
        if (strcmp(account, file_user) == 0) {
            printf("%s %s %c %.2lf\n", file_user, file_type, file_c, file_balance);
        }
    }
    fclose(fp);
}

⭐项目自定义头文件

这个简易ATM的实现时通过将各个功能函数封装在每个cpp文件中,然后通过自定义头文件在主函数中调用实现的。

#ifndef WORK_ATMDEMO_H
#define WORK_ATMDEMO_H
#include "stdio.h"
#include "stdlib.h"
#define MAX_USER_LEN 20
#define MAX_PASS_LEN 20
struct LoginData {
    char user[MAX_USER_LEN];
    char pass[MAX_PASS_LEN];
    double balance;
};
void login();
bool withdraw(struct LoginData loginData, double amount);
bool deposit(struct LoginData loginData, double amount);
void check(struct LoginData loginData);
void changePassword(struct LoginData loginData);
bool transferaccounts(struct LoginData loginData, char transfer_name[]);
void enroll(void);
void forgotpassword();
void mnue(struct LoginData);
int getRandomCode();
void speak();
void QueryStatements(char account[20]);
void cancellation(char account[20]);
#endif //WORK_ATMDEMO_H

⭐三、写在最后

OK本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们可以不要吝惜手里的三连哦!感谢你们的支持,你们的支持就是我创作最大的动力哦!❤️❤️❤️

💕 回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。

相关文章
|
4月前
|
C语言
C语言程序设计核心详解 第四章&&第五章 选择结构程序设计&&循环结构程序设计
本章节介绍了C语言中的选择结构,包括关系表达式、逻辑表达式及其运算符的优先级,并通过示例详细解释了 `if` 语句的不同形式和 `switch` 语句的使用方法。此外,还概述了循环结构,包括 `while`、`do-while` 和 `for` 循环,并解释了 `break` 和 `continue` 控制语句的功能。最后,提供了两道例题以加深理解。
111 7
|
4月前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
4月前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
4月前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
|
4月前
|
存储 算法 C语言
C语言程序设计核心详解 第一章:数制及转换与ASCII码
本专栏旨在夯实C语言基础,涵盖基础知识与进阶内容,助力解决自命题考试和考研问题,为数据结构与算法设计奠定坚实基础。内容包括数制及其转换、ASCII码、内存管理、机器码等,重点讲解二进制、八进制、十六进制的概念与转换方法,并介绍C语言的结构、数据类型和标识符规范。
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
161 4
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
108 4
|
4月前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
4月前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
7月前
|
机器学习/深度学习 移动开发 人工智能
C语言程序设计例题
C语言程序设计50例