ATM管理系统

博客編輯 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478
作业目标 编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
1)开户,销户
2)查询账户余额
3)存款
4)取款
5)转账(一个账户转到另一个账户)等...
学号 3180701234

1.ATM功能实现

1.用户存款
2.用户取款
3.用户转账
4.查看余额
5.修改密码
6.退出登录

2.代码如下

1.头文件函数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define N 20
void Initial();				//初始化界面
void BuildUser();			 //管理员新建用户
int UserLogin();				//用户登陆界面
void AdminLogin();				//管理员登陆界面
void Menu(int n);			  //主界菜单
void ChangePassword();			   //密码修改
typedef struct User			      //用户数据结构体
{
    char UserID[N];              //用户ID
    char Name[N];                  //姓名
    char UserPassword[N];		   //用户密码
	float money;				      //用户当前余额
	char time[N];					  //用户最后一次使用系统时间
}USERDATA;
typedef struct D				  //用户操作日志结构体
{
	char id[N];
	char o;
	char money;
	char balance;
	char tim[N];
}PDATA;
float MoneySave(struct User *p);				//存款函数
float DrawMoney(struct User *p);				//取款函数
float Trans(struct User *p);					//转账函数
void Balance();									//查看余额
USERDATA userdata[500];
int main()
{
    system("cls");						//清屏
	system("title ATM终端模拟系统");
	system("color 0b");
	Initial();
	//printf("调试");
	return 0;
}

2.初始化界面

void Initial()
{
	system("cls");
	int a,ret,b;
	do{                      //错误输入非1或2,重新输入
 
	printf("\n\n\n                                                \n");
	printf("                          欢迎使用 ATM 终端服务系统\n\n");
	printf("                -------------------------------------------------    \n\n");
	printf("                   请输入您的选择 :\n\n");
	printf("                -------------------------------------------------   \n\n");
	//printf("        _________________________________________________\n");
	printf("                                1 用户登录                   \n\n\n");
	//printf("        _________________________________________________\n");
	printf("                                2 前台服务                   \n\n\n");
	printf("                                3 退出系统                   \n\n\n");
	printf("                -------------------------------------------------\n");
	printf("\t\t\t\t\t\t\t");
	system("date /t");
	printf("\t\t\t\t\t\t\t");
	system("time  /t");
	do{                     //实现检错,错误输入重新输
	   //printf("                      重新输入您的选择 :\n");
	   printf("                ------------");
	   scanf("%d",&a);
	   switch(a)             //初始选项 非1,2重新输入。
	   {
	    case 1: b=1;break;
		case 2: b=1;break;
		case 3: exit(0);break;
		default:
		    printf("                                    ");
		    printf("错误输入,请重试。\n");break;
	   }
	   getchar();
	}while(b!=1);
	if(a==1)
	{
		ret=UserLogin();            //用户登录
		Menu(ret);					//菜单
        ret=1;
	}
	else if(a==2)
	{
		system("cls");        //清屏
        AdminLogin();
        ret=1;
	}
	}while(ret!=1);
}

3.用户登录界面

int UserLogin()
{
	char a[N],b[N];
	FILE *fp;
 
		if((fp=fopen("iddata.txt","a+"))==NULL)    //打开文件
	{
		printf("打开失败\n");
		exit(0);
	}
	int i=0,j,k=0,s;
	do{
		 fscanf(fp,"%s%s%s%f",&userdata[i].Name,&userdata[i].UserID,&userdata[i].UserPassword,&userdata[i].money);//将文件中的数据读入内存
		 i++;
	}while(!feof(fp));						//判断是否到文件结尾
	fclose(fp);								//关闭文件
	system("cls");
	printf("\n\n\n\n\n                   请输入用户账号:");
	//printf("                                    ");
    gets(a);
    printf("\n\n                   请输入用户密码:");
    //printf("                                    ");
    gets(b);
	for(j=0;j<i;j++)
	{
		if(strcmp(a,userdata[j].UserID)==0)
		{
		    for(k=0;k<2;k++)
            {
                if(strcmp(b,userdata[j].UserPassword)==0)			//比较用户账户密码是否输入正确
				return j;
                else
                {
                    printf("\n\t\t   ");
                    printf("密码错误请重新输入:");
                    gets(b);
                }
            }
            printf("\n\n\t\t   ");
            printf("密码已输入错误三次,即将退出程序。\n");
            printf("                                    ");
            getch();
            Initial();     // 返回初始界面
        }
	}
	printf("\n\n\n\t\t   查无该用户,请检查后重新输入。\n");
	getch();
	UserLogin();
}

4.管理员登录

void AdminLogin()
{
    char adminID[N]="1",adminPassword[N]="1";//管理员id 和 密码
    char a[N],b[N];
    int i=0,j=0,s;
   /* FILE *fp;
    if((fp=fopen("admin.txt","r"))==NULL)
    {
        printf("Failure to open admin.txt!\n");
        exit(0);
    }
    fscanf(fp,"%s%s",adminID,adminPassword);   //将管理员的ID和Password从文件中读入内存
    fclose(fp);*/
	do{
    printf("\n\t\t\t请输入管理员账号:");
    gets(a);
    printf("\n\t\t\t请输入管理员密码:");
    gets(b);
    if(strcmp(a,adminID)==0)                                //判断管理员账号是否相同
    {
        if(strcmp(b,adminPassword)==0)
		{
			printf("\n\t\t\t登陆成功,请按任意键开始录入用户。\n");
			getch();
			system("cls");
			BuildUser();
			printf("\n\t\t\t录入完成,退出程序");
			exit(0);
		}
		else
		{
			printf("\n\t\t\t密码错误,请重新输入。\n");     //判断管理员账号密码是否正确
			s=1;
		}
 
    }
	else
	{
		printf("\n\t\t\t账号密码不匹配,请重试。\n");
		s=1;
	}
	if(s==1)
	{
		getch();
		system("cls");
	}
	}while(s==1);
}

5.主界菜单

void Menu(int n)
{
    FILE *fp,*fp1;
    time_t timep;
    time(&timep);                //取当前系统时间
    int i=0,o;float money=0;
    if((fp=fopen("iddata.txt","a+"))==NULL)
	{
		printf("\n\t\t\t打开失败\n");
		exit(0);
	}
	do{
		 fscanf(fp,"%s%s%s%f",&userdata[i].Name,&userdata[i].UserID,&userdata[i].UserPassword,&userdata[i].money);
		 i++;
	}while(!feof(fp));                                                   //printf("调试");
    fclose(fp);
    char path[30]="H:\\1\\ATM\\private_record\\",suffix[]=".txt";
    strcat(path,userdata[n].UserID);
    strcat(path,suffix);
    if((fp1=fopen(path,"r+"))==NULL)
	{
	    fp1=fopen(path,"w+");
	    fprintf(fp1,"%-20s%-10s%-10s%-10s% 10s\n","账号","操作","金额","余额","时间");
	}
	else fp=fopen(path,"a+");
	//money=0;
	do{
	system("cls");
	printf("\n\n\t\t   ");
	//printf("              ------------             \n\n");
	printf("\t\t");
	printf("请选择您的操作:\n\n");
	printf("\t\t   ");
	printf("-----------------------------------------\n");
    printf("\n\t\t   ");
	printf("               1.用户存款               \n");
	printf("\n\t\t   ");
	printf("               2.用户取款               \n");
	printf("\n\t\t   ");
	printf("               3.用户转账               \n");
	printf("\n\t\t   ");
	printf("               4.查看余额               \n");
	printf("\n\t\t   ");
	printf("               5.修改密码               \n");
	printf("\n\t\t   ");
	printf("               6.退出登录               \n\n");
	printf("\t\t   ");
	printf("=========================================\n");
	printf("\t\t   ");
	printf("------------");
    scanf("%d",&o);
    switch(o)
    {
        case 1:system("cls");money=MoneySave(&userdata[n]);break;      //1.用户存款
		case 2:system("cls");money=DrawMoney(&userdata[n]);break;      // 2.用户取款
		case 3:system("cls");money=Trans(&userdata[n]);break;           // 3.用户转账
		case 4:printf("                                    ");
		    printf("你的当前余额为:%.2fRMB。\n",userdata[n].money);//用户转账
		    printf("                                                         ");
			 printf("请按键返回。");getch();break;
		case 5:ChangePassword();break;								//修改密码
		case 6:printf("                                    ");
		    printf("欢迎下次使用,谢谢。\n");getch();break;          // 退出程序
    }
	time(&timep);  //获取系统时间
	if(o!=4&&o!=5&&money!=0)
	{
		if(o==6)
			money=0;
	   fprintf(fp1,"%-20s%-10d%-10.2f%-10.2f%10s\n",userdata[n].UserID,o,money,userdata[n].money,ctime(&timep));
 
	}
	}while(o!=6);
	fclose(fp1);
	if(o==6)
	main();
}

6.管理员新建用户

void BuildUser()
{
	printf("\n\t\t\t开始录入用户:\n");
	USERDATA userdata;
	int i=0;FILE *fp;    //判断是否继续录入,如果继续按1,否则按2
	char ch;
		if((fp=fopen("iddata.txt","a+"))==NULL)
    {
        printf("Failure to open admin.txt!\n");
        exit(0);
    }
	do{
		system("cls");
		printf("\n\t\t\t继续录入用户:\n");
		printf("\n\t\t\t请输入用户姓名:");
		gets(userdata.Name);
		printf("\n\t\t\t请输入用户卡号:");
		gets(userdata.UserID);
		printf("\n\t\t\t请输入用户密码:");
		gets(userdata.UserPassword);
		printf("\n\t\t\t请输入用户当前金额:");
		scanf("%f",&userdata.money);
		fprintf(fp,"%-10s%-10s%-10s%-10.2f\n",userdata.Name,userdata.UserID,userdata.UserPassword,userdata.money);  //见录入数据保存到文件中
		system("cls");
		printf("\n\t\t\t录入成功。\n\t\t\t继续录入请按 1 \n\t\t\t结束录入并推出登陆请按 2\n");
		printf("\t\t\t----");
	 	scanf("%d",&i);
		ch=getchar();
		}while(i==1);
		fclose(fp);
		if(i==2) main();
}

7.存款函数

float MoneySave(struct User *p)
{
    float money;
    printf("\t\t\t");
    printf("请输入您的存款金额:");
	do{
		scanf("%f",&money);
		if((int)money%50!=0){             //判断存款金额是否是50的倍数
                printf("\t\t\t");
		printf("对不起,只能识别面值为50或100的钞票。\n\n\t\t\t请重新开始你的存款:");}
	}while((int)money%50!=0);
	p->money+=money;
	printf("\t\t\t");
	printf("成功存入%.2f元,请按任意返回继续操作。\n",money);
	printf("                                    ");
	getch();
	return money;
}

8.取款函数

float DrawMoney(struct User *p)
{
	float money;
	int s=0;
	printf("\n\t\t\t请输入您的取款金额:");  //取款
	do{
		scanf("%f",&money);
		if(money>p->money)
		{
			printf("\n\t\t\t您卡里没有辣么多钱了\n");
			printf("\n\t\t\t按任意键返回,查询余额。");
			getch();
			return 0;
		}
		if(money>2500)
		{
            printf("\n\t\t\t一次最多可以取2500元,请重新输入取款金额:");//一次最多不能取超过2500元
		}
		if((int)money%50!=0)
		{
			printf("\n\t\t\t只能取出面值为50或100的RMB。\n\n\t\t\t请再次输入您的取款金额:");
		}
	}while(money>2500||(int)money%50!=0);
	p->money-=money;
	printf("\n\t\t\t成功取出%.2f元。请按任意键返回上层。\n",money);
	getch();
	return -money;
}

9.转账函数

float Trans(struct User *p)
{
	FILE *fp;
	char a[N];
	float money;
	printf("\n\t\t\t请输入您要转账的同行账户:");
re:
	scanf(" %s",a);
	char path[30]="G:\\1\\ATM\\private_record\\",suffix[]=".txt";
    strcat(path,a);
    strcat(path,suffix);
	if((fp=fopen(path,"r+"))==NULL)
	{
	    fp=fopen(path,"w+");
	    printf("\n\t\t\t该账户不存在,请重新输入转账账户:");
		goto re;
	}
	else
	{
		printf("\n\t\t\t请输入转账金额:");
		scanf("%f",&money);
		while(money>p->money||money<=0)
		{
			if(money>p->money)
            {
			printf("\n\t\t\t您卡里没有辣么多钱了\n");
			printf("\n\t\t\t请先按键查询余额后重新确认转账金额。");
			printf("\t\t   ");
			getch();return 0;
			break;
            }
		}
		p->money-=money;
		printf("\n\t\t\t成功转入目标账户%.2f元,按任意键返回上层\n",money);
		fclose(fp);
		printf("                                    ");
		getch();
		return -money;
	}
}

10.修改密码

void ChangePassword()
{
	char str1[7],str2[7];
	do{
		printf("\n\t\t\t请输入新的密码,密码为6位:");
		scanf("%s",str1);
		printf("\n\t\t\t请再输入一次:");
		scanf("%s",str2);
		if(strcmp(str1,str2)!=0)
        {
            printf("\n\t\t\t你输入的密码有误,请重新输入一遍:");
        }
 
	}while(strcmp(str1,str2)!=0);
	printf("\n\t\t\t密码修改成功,请选择其他操作。");
	getch();
}

3.运行结果





4.个人小结

1.PSP表格

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 240 100
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 800 400
Development 开发 366 200
Analysis 需求分析(包括学习新技术) 180 140
Design Spec 生成设计文档 150 120
Design Review 设计复审 120 60
Coding Standard 代码规范 70 60
Design 具体设计 35 20
Coding 具体编码 540 240
Code Review 代码复审 100 60
Test 测试(自我测试,修改代码,提交修改) 180 120
Reporting 报告 80 60
Test Report 测试报告 30 20
Size Measurement 计算工作量 30 10
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 60 30
合计 2181 1640
2.个人小结
(1)收获

在做本次实验报告,有在网上寻求资源,帮助,解决不会的地点。从开时到完成,整个过程用时一个星期,全是自己动手,想如何设计程序,遇到问题百度。

本次实验报告把所学的C语言大部分都用上,对C语言程序设计有很大的帮助和提高和自己都C语言熟悉度。在运用C语言编程有所提高

(2)用到的知识

数据类型;

if语句,switch语句,for语句;

函数的声明,定义,调用;

库函数的运用;

结构体;

(3)不足

1.在C语言运用

缺少对文件的运用,造成模拟ATM机的一部分功能不完整!本实验如果运用文件存储用户信息,访问信息在真正模拟ATM机更接近。

(4)程序改进

1.实现了ATM基本的功能输入密码登录,查询余额,转账,修改密码,取款和存款。相比ATM机的功能,在取款,存款,转账金额方面应该给用户一个选择金额的功能和金额的限制!

2.数据存储存在不足,访问人数有限!从文件中读取用户信息。

3.缺少记录用户操作的时间和记录取款,转账金额;

4.输入登录密码时,操作总数一天不能超过3次,超过需要进行的操作!如果输入有问题一个提醒。

5.转账的账号如果为自己的账号,应该提醒;

posted on 2020-11-19 00:38  卑微的小小灿  阅读(301)  评论(0)    收藏  举报

导航