博客班级 | 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 |
实验小结
通过此次实验我发现我有许许多多的不足点,首先文件部分掌握不够,链表掌握的也不是很好,通过各种途径学习才完成本次实验,希望在日后的学习中可以做到更好