个人作业三-ATM管理系统

一、作业信息

这个作业属于哪个课程 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
这个作业要求在哪里 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478
这个作业的目标 编写一个ATM管理系统
学号 3180701322

二.题目要求

编写一个ATM管理系统,语言不限,要求应包括以下主要功能:

(1)开户,销户

(2)查询账户余额

(3)存款

(4)取款

(5)转账(一个账户转到另一个账户)等...

三、代码提交与运行截图
1、代码部分:
头文件:

#include <stdio.h>
#include<stdlib.h> //itoa所需要的库函数
#include <string.h>
#include <ctype.h>
#include <conio.h>

函数声明:

void Deposit();
void Withdraw();//取款
void ChangePWD();//改密
void Cancellation();//销户
void Sleep();//挂失
void Recovery();//解挂
void TransferAccount();//转账
void CreateAccount();//开户
void Qurey();//查询
void creatAccNum(int );

取款:

void Withdraw()//取款
{
    int site;
    double uMoney;
    if((site = verifyAll())!= -1)//身份验证
    {
        printf("请输入取款金额:");
        scanf("%lf",&uMoney);
        if(uMoney<balance[site])
        {
            balance[site] -=uMoney;
            printf("已取款%0.2lf元\n余额为%0.2lf元\n",uMoney,balance[site]);
        }
        else
            printf("余额不足!");
    }
}

存款:

void Deposit()//存款
{
    int site;
    double uMoney;
    if((site = verifyAll())!= -1)//身份验证
    {
            printf("请输入存款金额:");
            scanf("%lf",&uMoney);
            balance[site] +=uMoney;
            printf("已存款%0.2lf元\n余额为%0.2lf元\n",uMoney,balance[site]);
    }
}

开户:

void CreateAccount()//开户
{
    if(uActual == topNum)
    {
        printf("系统存储已达上线,不能开户");
        return;
    }
    printf("正在开户中……\n");
    printf("系统生成账号为:");
    creatAccNum(uActual);//生成账号
    printf("请输入姓名:");
    scanf("%s",nameGroup[uActual]);//存入用户名
    if(createPWd(uActual)==1)//创建密码并校验
    {
        printf("请输入存款金额:");
        scanf("%lf",&balance[uActual]);
        printf("您已经存入%lf元",balance[uActual]);
        users[uActual][1]=0;//写入状态代号为正常,0表示
        uActual++;
    }
    else
        {
            printf("返回系统选项\n");
        }
}

销户:

void Cancellation()//销户
{
 
    int site;//查找位置
    if((site = verifyAll())!= -1)
    {
        printf("你的账户余额为%0.2lf元\n",balance[site]);
        printf("是否销户Y/N:");
        if(tolower(getchar())=='y')//tolower()函数将字母转化为小写,非字母不做处理
        {
            users[site][1]=2;//销户
            printf("销户成功\n");
        }
        else
        {
            printf("销户失败\n");
        }
    }
    else
    {
        printf("\n失败\n");
    }
    return;
}

银行界面:

int BankMenu()//银行界面
{
    int Choice;//选择业务办理选项
    do
    {
        printf("\n\n");
        printf("  +---------------------------------+\n");
        printf("  +           办理业务选项          +\n");
        printf("  +---------------------------------+\n");
        printf("  +   1.存款    2.取款    3.改密    +\n");
        printf("  +                                 +\n");
        printf("  +   4.销户    5.开户    6.挂失    +\n");
        printf("  +                                 +\n");
        printf("  +   7.解挂    8.转账    9.查询    +\n");
        printf("  +                                 +\n");
        printf("  +   0.退出系统                    +\n");
        printf("  +---------------------------------+\n");
        printf("\n");
        printf("输入所需办理的业务序号:");
        scanf("%d",&Choice);
        fflush(stdin);
        if(Choice<=9&&Choice>=0)
            break;
        else
            printf("请输入1~9的选项");
    }while(1);
    return Choice;
}

源代码:

#include <stdio.h>
#include<stdlib.h> //itoa所需要的库函数
#include <string.h>
#include <ctype.h>
#include <conio.h>
 
#define topNum 2000 //系统最多容纳用户数目
int uActual;//实际人数
char AccName[topNum][9];//账户名
int users[topNum][2];//密码、状态,0行不存放
char nameGroup[topNum][10];//用户姓名,0行不存放
double balance[topNum];//账户余额,0行不存放
 
 
int iPWD();
void uExpotrData();//导出数据
void uImportData();//写入数据
void Work();//办理
int BankMenu();//银行界面
void Deposit();
void Withdraw();//取款
void ChangePWD();//改密
void Cancellation();//销户
void Sleep();//挂失
void Recovery();//解挂
void TransferAccount();//转账
void CreateAccount();//开户
void Qurey();//查询
void creatAccNum(int );
int createPWd(int );
int seek(char []);//账户判断
int see(char []);//账号查询
int verifyAll();
int verifyPAD(int Num);//密码验证
int inputPWD();
int main()
{
    printf("+------------------+\n");
    printf("+ 欢迎来到CSDN银行 +\n");
    printf("+------------------+\n");
    if(iPWD())//业务员密码验证
    {
        uExpotrData();//从文件导出数据
        Work();//业务办理
        uImportData();//写入数据到文件
    }
    return 0;
}
 
int iPWD()//密码登录
{
    int right = 0;
    int iTry = 3;
    int i ;
    char ch;
    char inputPsss[20];//输入账户密码
    char sNameFile[20];//文件保存业务员登录名称名
    char sPassFile[20];//业务员登录密码
    char inputName[20];//输入业务员登录名称
    FILE *fp;
    if((fp = fopen("Worker.txt","r"))==NULL)
    {
        printf("Cannot open file!");
        exit(0);
    }
    fscanf(fp,"%s %s",sNameFile,sPassFile);
    fclose(fp);
 
    do{
            i = 0;
            printf("请输入业务员用户名:");
            scanf("%s",inputName);
            printf("\n请输入登录密码:");
            while((ch=getch())!= '\r')
            {
                inputPsss[i++] = ch;
                putchar('*');
            }
            inputPsss[i] = '\0';
            fflush(stdin);
            printf("\n");
            if(strcmp(inputName,sNameFile)==0 && strcmp(inputPsss,sPassFile)==0)
            {
                right = 1;
                break;
            }
            else
            {
                iTry--;
                if(iTry > 0)
                {
                    printf("输入密码错误%d次,请重新输入\n",4-iTry);
                }
                else
                {
                    printf("密码输入已达3次,退出系统\n");
                }
            }
    }while(iTry);
    return right;
}
 
/*功能:从文件中读取储户数据*/
void uExpotrData()//导入数据
{
    int i=0;
    FILE *fp;
    if((fp = fopen("account.txt","r")) == NULL)
    {
        printf("File cannot open!\n");
        exit(0);
    }
    if(feof(fp))
    {
        uActual = 0;
    }
    else
    {
        //密码、状态、用户姓名、账号、余额写入
        while(fscanf(fp,"%d %d %s %s %lf",&users[i][0],&users[i][1],nameGroup[i],AccName[i],&balance[i]) != EOF)
            i++;
        fclose(fp);
        uActual = i;
    }
}
 
/*功能:将用户数据保存到文件中*/
void uImportData()//写入数据
{
    int i=0;
    FILE *fp;
    if((fp = fopen("account.txt","w")) == NULL)
    {
        printf("File cannot open!\n");
        exit(0);
    }
    //密码、状态、用户名、账号、余额写入
    for(i=0;i<uActual;i++)
        fprintf(fp,"%d %d %s %s %.2lf\n",users[i][0],users[i][1],nameGroup[i],AccName[i],balance[i]);
    fclose(fp);
}
 

void Work()//办理
{
    int uChoice;
    if(uActual == 0)
    {
        printf("系统未存储用户数据,需办理开户\n");
        printf("是否开户:Y/N\n");
        if(tolower(getchar())=='y')//tolower()函数将字母转化为小写,非字母不做处理
        {
            CreateAccount();//开户
        }
        else
        {
            printf("退出系统");
            exit(0);
        }
    }
    do{
        uChoice = BankMenu();//界面菜单选择
        switch(uChoice)
        {
        case 1:
            Deposit();//存款
            break;
        case 2:
            Withdraw();//取款
            break;
        case 3:
            ChangePWD();//改密
            break;
        case 4:
            Cancellation();//销户
            break;
        case 5:
            CreateAccount();//开户
            break;
        case 6:
            Sleep();//挂失
            break;
        case 7:
            Recovery();//解挂
            break;
        case 8:
            TransferAccount();//转账
            break;
        case 9:
            Qurey();//查询
            break;
        case 0:
            printf("欢迎下次光临!\n");//退出
            break;
        default:
            printf("请输入选项中的0~9选项序号:");
            break;
        }
    }while(uChoice);
}
 
/*功能:显示菜单并由业务员选择返回值:用户选择的功能,范围0-9*/
int BankMenu()//银行界面
{
    int Choice;//选择业务办理选项
    do
    {
        printf("\n\n");
        printf("  +---------------------------------+\n");
        printf("  +           办理业务选项          +\n");
        printf("  +---------------------------------+\n");
        printf("  +   1.存款    2.取款    3.改密    +\n");
        printf("  +                                 +\n");
        printf("  +   4.销户    5.开户    6.挂失    +\n");
        printf("  +                                 +\n");
        printf("  +   7.解挂    8.转账    9.查询    +\n");
        printf("  +                                 +\n");
        printf("  +   0.退出系统                    +\n");
        printf("  +---------------------------------+\n");
        printf("\n");
        printf("输入所需办理的业务序号:");
        scanf("%d",&Choice);
        fflush(stdin);
        if(Choice<=9&&Choice>=0)
            break;
        else
            printf("请输入1~9的选项");
    }while(1);
    return Choice;
}
 
/*功能:存款   说明:需要保证账户存在,且处于正常状态*/
void Deposit()//存款
{
    int site;
    double uMoney;
    if((site = verifyAll())!= -1)//身份验证
    {
            printf("请输入存款金额:");
            scanf("%lf",&uMoney);
            balance[site] +=uMoney;
            printf("已存款%0.2lf元\n余额为%0.2lf元\n",uMoney,balance[site]);
    }
}
 
/*功能:取款   说明:需要保证账户存在,且处于正常状态,另外,余额要足够取*/
void Withdraw()//取款
{
    int site;
    double uMoney;
    if((site = verifyAll())!= -1)//身份验证
    {
        printf("请输入取款金额:");
        scanf("%lf",&uMoney);
        if(uMoney<balance[site])
        {
            balance[site] -=uMoney;
            printf("已取款%0.2lf元\n余额为%0.2lf元\n",uMoney,balance[site]);
        }
        else
            printf("余额不足!");
    }
}
 
/*功能:改密码*/
void ChangePWD()//改密
{
    int site;//查找位置
    if((site = verifyAll())!= -1)//账号查询,并返回位置
    {
        if(createPWd(site))
            printf("修改成功!");
        else
            printf("修改失败");
    }
    else
    {
        printf("修改失败\n");
    }
 
}
 
/*功能:注销账户   说明:找到账户,并将其状态改为2-注销即可。注销前应该检查余额,应该先取款再注销*/
void Cancellation()//销户
{
 
    int site;//查找位置
    if((site = verifyAll())!= -1)
    {
        printf("你的账户余额为%0.2lf元\n",balance[site]);
        printf("是否销户Y/N:");
        if(tolower(getchar())=='y')//tolower()函数将字母转化为小写,非字母不做处理
        {
            users[site][1]=2;//销户
            printf("销户成功\n");
        }
        else
        {
            printf("销户失败\n");
        }
    }
    else
    {
        printf("\n失败\n");
    }
    return;
}
 
/*功能:开户*/
void CreateAccount()//开户
{
    if(uActual == topNum)
    {
        printf("系统存储已达上线,不能开户");
        return;
    }
    printf("正在开户中……\n");
    printf("系统生成账号为:");
    creatAccNum(uActual);//生成账号
    printf("请输入姓名:");
    scanf("%s",nameGroup[uActual]);//存入用户名
    if(createPWd(uActual)==1)//创建密码并校验
    {
        printf("请输入存款金额:");
        scanf("%lf",&balance[uActual]);
        printf("您已经存入%lf元",balance[uActual]);
        users[uActual][1]=0;//写入状态代号为正常,0表示
        uActual++;
    }
    else
        {
            printf("返回系统选项\n");
        }
}
 

/*功能:挂失账户*/
void Sleep()//挂失
{
    int site;
    if((site = verifyAll())!= -1)//身份验证
    {
        if(users[site][1]==0)//
        {
            users[site][1]=1;
            printf("\n挂失成功\n");
        }
        else if(users[site][1]==1)
            printf("\n该账已经挂失\n");
        else
            printf("\n该账户已经销户\n");
    }
}
 
/*功能:解除挂失*/
void Recovery()//解挂
{
    char Acc_u[20];//账号
    int site;//查找位置
    printf("请输入账号:");
    gets(Acc_u);
    site = see(Acc_u);
    if(site!= -1)
    {
        printf("账户名为:%s\n",nameGroup[site]);
        if(verifyPAD(site))
        {
            if(users[site][1]==1)//
            {
                users[site][1]=0;
                printf("\n解挂成功\n");
            }
            else if(users[site][1]==0)
                printf("\n该账户未挂失\n");
            else
                printf("\n该账户已经销户\n");
        }
    }
 
}
 
/*功能:转账    说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够*/
void TransferAccount()//转账
{
    int site;
    int Num;
    double uMoney;
    char str[20];//存储输入账号数字
    if((site = verifyAll())!= -1)//身份验证
    {
        printf("请输入需要转入的账户:");
        gets(str);//标准输入设备读字符串函数
        fflush(stdin);
        if((Num = seek(str))!= -1)//
        {
            printf("请输入转账金额");
            scanf("%lf",&uMoney);
            if(uMoney < balance[site])
            {
                balance[site] -= uMoney;
                balance[Num] +=uMoney;
                printf("转账成功\n账户余额为%lf",balance[site]);
            }
            else
            {
                printf("余额不足");
            }
        }
 
    }
    return;
}
 
/*功能:查询账户   说明:显示账户信息*/
void Qurey()//查询
{
    int site;
    if((site = verifyAll( ))!= -1)//身份验证
    {
        printf("账户余额为%lf",balance[site]);
    }
}
 

void creatAccNum(int num)//根据实际人数自动生成账号
{
    int n;
    char s[20];//将num以字符形式保存
    char N[20]="CSDN";
    itoa(num,s,10); // itoa(int,char,要转换的十进制数)
    strrev(s);//数组倒置
    n=strlen(s);//长度
    while(n<4)
    {
        s[n]='0';
        n++;
    }
    s[n]='\0';
    strrev(s);
    strcat(N,s);//数字连接
    printf("%s\n",N);
    strcpy(AccName[num],N);//拷贝到用户账户里面
    return;
}
 
/*功能:对新密码进行核对   说明:第一次有输入的密码与第二次输入的密码进行比较,如果密码相同则返回1表示设置成功,否者返回0*/
int createPWd(int Num)//创建密码并校验
{
    int uPass1;//第一次输入要更改的密码
    int uPass2;//第二次输入要更改的密码
    printf("\n创建密码:");
    uPass1 = inputPWD();
    printf("\n请重新输入密码:");
    //fflush(stdin);
    uPass2 = inputPWD();
        if(uPass1==uPass2)
        {
            users[Num][0]=uPass1;//写入密码
            printf("\n创建密码完成\n");
            return 1;
        }
        else
        {
            printf("\n密码不一致!\n");
        }
        return 0;
}
/*功能:对账户进行身份验证   说明:分别验证账户,密码,当验证成功返回序号下标,账户验证失败返回-1*/
int verifyAll()
{
    char str[20];//存储输入账号数字
	int site;
    printf("请输入账号:");
    gets(str);//标准输入设备读字符串函数
    fflush(stdin);
    
    if((site =seek(str))!= -1)//账户验证
    {
        if(verifyPAD(site)!= -1)//密码验证
            {
                printf("\n成功\n");
            }
        else
            site = -1;
    }
    else
        printf("\n失败\n");
    return site;
}
 
/*功能:对输入账户进行验证*/
int seek(char str[])//账户判断
{
    int judge=-1;
    int Num=0;
    if((Num = see(str))!= -1)//: 将一个串与另一个比较, 不管大小写,
    {
        if(users[Num][1]==0)//
        {
            printf("姓名:%s\n",nameGroup[Num]);
            judge = Num;//账户序号返回
        }
        else if(users[Num][1]==1)
        {
            printf("该账户已经挂失\n");
        }
        else
        {
            printf("该账户已经销户");
        }
    }
    else
    {
        printf("该账户不存在");
    }
    return judge;
}
 
/*功能:根据账号查询用户,返回用户的下标*/
int see(char str[])//账号查询
{
    int ptr;//存放strnicmp函数返回值
    int i;
    char N[]="CSDN";//账号前缀
    int digit;//长度
    int judge=-1;
    int Num = 0;//将数字字符转换为数字
    digit = strlen(str);//统计长度
    ptr = strnicmp(str,N,4);//
    if(digit == 8&&ptr == 0)
    {
        for(i=4;i<8;i++)
            if(isdigit(str[i]))//检查其参数是否为十进制数字字符
                Num = Num*10+(str[i]-'0');
    }
    else
    {
        if(digit != 8)
            printf("账号位数出错\n");
        if(ptr !=0)
            printf("账号请以CSDN开头\n");
    }
    if(strcmpi(str,AccName[Num])==0)//: 将一个串与另一个比较, 不管大小写,
        {
            printf("查找成功\n");
            judge = Num;
        }
    else
        printf("查找失败\n");
    return judge;
}
/*功能:密码进行验证  功能:当输入密码,如果与原设置密码一致则返回数组下标序号,否则返回-1*/
int verifyPAD(int Num)//密码验证
{
    int Pass_u;
    int judge=0;
    printf("请输入密码:");
    Pass_u = inputPWD();
    if(Pass_u == users[Num][0])
        judge = Num;//返回存在的序号
    else
    {
        printf("\n密码错误\n");
 
    }
    return judge;
}
 
/*功能:输入密码*/
int inputPWD()//密码创建
{
    int i;
    char ch;//接受字符型密码
    int uPass=0;//字符型密码转换为数字
    do
    {
        for(i=0;i<6;i++)
        {
            ch=getch();
            printf("*");
            if(isdigit(ch))//检查输入是否为十进制数字字符
                uPass=uPass*10+(ch - '0');
            else
            {
                uPass=0;
                break;
            }
        }
        fflush(stdin);
        if(uPass == 0)
        {
            printf("\n");
            printf("密码仅能够为数字\n");
            printf("请重新输入密码\n\n");
        }
        else
        {
            break;
        }
    }while(1);
 
    return uPass;
}

2、运行截图

四、个人小结
该系统要实现的功能较多,可能还要涉及对文件的应用。所以实现该系统难度还是挺大的,而自身能力不足,完成起来很吃力。所以要在以后的学习中多多弥补自己的不足。
(psp表格)

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 30 25
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 5
Development 开发 135 150
Analysis 需求分析(包括学习新技术) 20 40
Design Spec 生成设计文档 10 15
Design Review 设计复审 10 10
Coding Standard 代码规范 10 10
Design 具体设计 30 40
Coding 具体编码 40 90
Code Review 代码复审 9 10
Test 测试(自我测试,修改代码,提交修改) 20 45
Reporting 报告 10 20
Test Report 测试报告 5 5
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 10 10
posted @ 2020-11-18 20:51  何欢hh  阅读(113)  评论(0编辑  收藏  举报