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

news2024/11/15 5:59:35

博主简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。
博主主页:@陈童学哦
所属专栏:C语言程序设计实验项目
如果本文对你有所帮助的话,还希望可以点赞👍收藏📂支持一下哦!

在这里插入图片描述

前言:Hello各位小伙伴们你们好呀!事情是这个样子的,前几天我们的C语言程序设计基础课要做一个ATM自助取款机的项目,而我们的的程序设计老师对我们的要求向来是比较严格的,而这次她给出的难题就是让我们各个程序小组中的全部组员各司其职,每个人从产品经理、架构师、程序猿、测试员中选择一个岗位并且清楚自己所担任职位的职责,然后按要求完成自己需要完成的任务,最终将所有部分整合做成一个PPT然后上课的时候为各位”甲方“介绍自己产品。听起来是不是很酷呢?但如果我说我们那节课上了整整三个小时呢?是不是更酷啦哈哈! 😄 😄 😄

接下来就看下面咯!!!!!!!!!

📢📢📢ATM自助取款机

  • ⭐一、工作前的准备
    • ⭐1、需求概述
    • ⭐2、功能概述
  • ⭐二、代码实现
    • ⭐1、结构体的定义
    • ⭐2、主函数
    • ⭐3、功能函数
      • ⭐01、用户登入
      • ⭐02、用户存款
      • ⭐03、用户取款
      • ⭐04、用户查询
      • ⭐05、修改密码
      • ⭐06、用户转账
      • ⭐07、语音播报
      • ⭐08、用户注册
      • ⭐09、用户注销
      • ⭐10、忘记密码
      • ⭐11、流水记录
    • ⭐项目自定义头文件
  • ⭐三、写在最后

⭐一、工作前的准备

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

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

🍁🍁🍁那么我们下期再见!拜拜ヾ(•ω•`)o
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年京东618满300减50是全品类吗?满减叠卷怎么用?

2023年京东618满300减50是全品类吗?满减叠卷怎么用? 京东平台上有着比较多的卖家开店&#xff0c;在对店铺进行运营的过程中&#xff0c;很多卖家都会参与平台的一些活动&#xff0c;这样能够有效的将产品推广出去&#xff0c;对于618大促活动也是属于其中活动之一&#xff0…

代码随想录第52天

1.最长递增子序列 接下来&#xff0c;我们依然用动规五部曲来详细分析一波&#xff1a; dp[i]的定义 本题中&#xff0c;正确定义dp数组的含义十分重要。 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 为什么一定表示 “以nums[i]结尾的最长递增子序” &…

软考A计划-电子商务设计师-专业英语

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

高压侧电流检测电路及仿真

高压侧电流检测电路仿真 电路图如下 主要设计思想&#xff0c;通过两组电阻将高压侧的共模电压降到运放&#xff08;此处也可以使用单电源运放&#xff09;的工作电压范围内。然后在进行二次放大。主要放大倍数取决于第二级放大侧电阻比值。因此如果需要减小功耗&#xff0c;可…

JAVA数组基础

目录 一、使用方式 1-动态初始化 ①先声明数组 ② 创建数组 ③分配方式 二、使用方式 2-静态初始化&#xff08;直接在声明的同时初始化{ } &#xff09; 三、数组使用注意事项和细节 四、数组两种初始化方式都是将内存空间分配到堆上面的 一、使用方式 1-动态初始化 …

助力金融科技创新 同创永益受邀参加2023 INNO CHINA中国产业创新大会

2023 INNO CHINA中国产业创新大会-金融科技创新论坛于2023年5月10日在北京大学中关村新园召开。本次金融科技创新论坛由北大创新评论主办&#xff0c;同创永益受邀参加。来自银行、保险、证券等金融行业的多位专家、学者齐聚大会现场&#xff0c;共同探讨金融科技发展新趋势、金…

复合型人才

一、为什么需要复合型人才 在社会的大环境影响下&#xff0c;不同行业所展现的交叉属性越来越强&#xff0c;因此单一型人才已经不满足当前的企业需求&#xff0c;复合型人才逐渐成为市场上的主流&#xff1a;即不仅要“精”通&#xff0c;更要“全”面。 人才需求是由市场的…

长尾词挖掘,如何选择精准的长尾词优化?

长尾词的挖掘也是一门大学问&#xff0c;它存在多种不同的方法。最常用的方法是把关键词直接放搜索引擎的搜索框搜索和使用长尾词挖掘工具这两种。 以运动水壶为例。 关键词直接放搜索引擎的搜索框搜索&#xff0c;结果如下&#xff1a; 使用长尾词挖掘工具&#xff0c;…

【C++笔记总结】面向对象编程——封装 |C++

文章目录 前言一、类的封装1.1、公有&#xff0c;私有&#xff0c;保护1.2、类的定义和类的实现相分离1.3、构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数1.4、静态数据成员和静态成员函数1.5、友元函数&#xff0c;友元类 二、类的实现——对象2.1、对象的静态分配&a…

【SpringCloud——Elasticsearch(中)】

一、DSL查询语法以及整合JAVA代码使用 以下操作案例均基于上篇的hotel索引库及其数据进行。 1、查询基本语法 GET /indexName/_search {"query": {"查询类型":{"查询条件":"条件值"}} } 2、查询所有 2.1、DSL语句 #查询所有 GET …

Java并发编程面试题——线程池

目录 1.什么是线程池&#xff1f;有什么优缺点&#xff1f;2.创建线程池的方式有哪些&#xff1f;2.1.通过 Executor 框架的工具类 Executors 来创建不同类型的线程池2.2.使用 ThreadPoolExecutor 类自定义线程池2.3.注意事项 3.自定义线程池时有哪些参数&#xff1f;它们各有说…

笔试强训 Day 7

选择题&#xff1a; 1.在&#xff08;&#xff09;情况下适宜采用 inline 定义内联函数 A 函数体含有循环语句 B 函数体含有递归语句C 函数代码少、频繁调用 D 函数代码多&#xff0c;不常调用 复习一下内联函数 在编译阶段&#xff0c;会将内联函数展开 —— 将函数调用替换成…

四、若依(前后端分离)项目构建docker 镜像

若依(前后端分离&#xff09;项目构建docker 镜像 1. 构建好ruoyi-admin.jar包&#xff0c;上传到服务器项目目录下 2. 创建conf目录将若依项目&#xff08;Spring boot &#xff09;配置文件修改好&#xff0c;上传存入conf目录 注意&#xff1a;这里的地址不能写127.0.0.1和…

ur5在gazebo中仿真的官方源码浅析

一 复现 好久之前初学rosgazebo机械臂仿真的时候总有些懵&#xff0c;用的是ur5机械臂&#xff0c;现在回过头来看好像看懂了一些&#xff0c;故重新理清了一下功能包的逻辑&#xff0c;方便查阅。 官方源码 本文参考 ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo…

chatgpt赋能python:Python列表从后往前遍历

Python列表从后往前遍历 作为一门广泛应用于数据科学、机器学习和Web开发的高级编程语言&#xff0c;Python为开发人员和科学家们提供了很多便利。在Python里面&#xff0c;列表是一种非常常见的数据结构&#xff0c;它允许开发人员存储和处理多个元素。但是&#xff0c;有时候…

5款提高工作效率的无广告软件

今天推荐一些可以大幅度提升办公效率的小软件&#xff0c;安全无毒&#xff0c;下载简单&#xff0c;最重要的是没有广告&#xff01; 1.照片处理——Darktable Darktable是一款用于处理和管理数码照片的工具。它可以让你对RAW格式的照片进行非破坏性的编辑,并提供多种模块和…

Nginx 启动成功无法访问网页

查看是否有Nginx进程 ps -ef | grep nginx 如下图有三个进程就是启动成功了 端口 因为Nginx我配置的是80端口&#xff0c;所以只要检查80端口是否开放即可 netstat -lnt | grep 80tcp: 这表示所显示的连接是基于TCP协议的。0.0.0.0:80: 这是本地监听的IP地址和端口号。在这…

Zabbix5通过脚本自定义Nginx监控

1、客户端配置 1.1、nginx开启nginx status 使用 zabbix 监控 nginx&#xff0c;首先 nginx 需要配置 ngx_status&#xff0c;nginx.conf加入以下配置&#xff0c;并重启Nginx或reload location /ngx_status { stub_status on; access_log off; #allow 127.0.0.1; #deny all…

C语言---初识结构体

1、结构体的声明 1.1、结构的基础知识 结构是一些值得集合&#xff0c;这些值称为成员变量。结构的每一个成员可以是不同类型的变量。 char、short、int、long、long、float、double是内置类型。 比如说&#xff0c;我们想要描述单一的成绩&#xff0c;身高我们直接用int类型就…

FPGA时序约束--基础理论篇

FPGA开发过程中&#xff0c;离不开时序约束&#xff0c;那么时序约束是什么&#xff1f;简单点说&#xff0c;FPGA芯片中的逻辑电路&#xff0c;从输入到输出所需要的时间&#xff0c;这个时间必须在设定的时钟周期内完成&#xff0c;更详细一点&#xff0c;即需要满足建立和保…