博客班级 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11478
作业目标 编写一个ATM系统语言不限
学号 3180701114

一.题目要求

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

(1)开户,销户

(2)查询账户余额

(3)存款

(4)取款

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

允许网上查询参考,但请注意不要直接抄袭,可以理解看懂别人的代码,再自己编写

二.代码提交

(1)提交你的源代码在博客上,请注意不要整体粘贴上来就结束了,最好把你的代码分模块提交,相应模块给出完整解释,主要代码给出注释,要注意代码书写规范,养成好习惯

(2)请把你的程序主要运行界面一同贴上来

代码部分

头文件

#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");
	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);
}

打开文件

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;
   /* 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);
}

主菜单界面


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 计划 300 360
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 360 360
Development 开发 20 15
Analysis 需求分析(包括学习新技术) 30 30
Design Spec 生成设计文档 40 30
Design Review 设计复审 30 30
Coding Standard 代码规范 20 15
Design 具体设计 20 10
Coding 具体编码 100 120
Code Review 代码复审 10 20
Test 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 20 20
Test Report 测试报告 20 15
Size Measurement 计算工作量 20 10
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 20 20

实验小结

通过此次实验我发现我有许许多多的不足点,首先文件部分掌握不够,链表掌握的也不是很好,通过各种途径学习才完成本次实验,希望在日后的学习中可以做到更好