个人作业三-ATM管理系统

一、作业信息

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

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

(1)开户,销户

(2)查询账户余额

(3)存款

(4)取款

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

二.代码提交

#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;
}
 
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\n");
	printf("                                1 用户登录                   \n\n");
	printf("                _________________________________________________\n\n");
	printf("                                2 前台服务                   \n\n");
    printf("                _________________________________________________\n\n");
	printf("                                3 退出系统                   \n\n");
	printf("                -------------------------------------------------\n\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);
}
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();
}

管理员界面

void AdminLogin()
{
    char adminID[N]="1",adminPassword[N]="1";//管理员id 和 密码
    char a[N],b[N];
    int i=0,j=0,s;
  
	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);
}

用户界面

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();
}

管理界面

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();
}

存款

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;
}

取款

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;
}

转账

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;
	}
}

修改密码

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();
}

运行截图
管理界面截图

管理员界面截图


用户登录界面

三.个人小结
文件使用特别不熟练,需要自己多加练习,学会如何将链表数据写入文件,以及如何将文件数据读入链表。

(psp表格)

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