一、作业信息
|博客班级|AHPU-软件工程导论-计算机18级 (安徽工程大学 - 计算机与信息学院)
|----|----|----|
| 作业要求|ATM管理系统|
|作业目标|练习编程能力|
| 学号| 3180701335|
二、题目要求
编写一个ATM管理系统,语言不限,要求应包括以下主要功能:
(1)开户,销户
(2)查询账户余额
(3)存款
(4)取款
(5)转账(一个账户转到另一个账户)等...
允许网上查询参考,但请注意不要直接抄袭,可以理解看懂别人的代码,再自己编写
三、代码提交
头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)/*将4966警报置为失效*/
#define CNUM 100
结构体
struct Customer/*账户的结构体*/
{
char account[16];/*用户账号*/
char name[9];/*用户姓名*/
char password[7];/*账户密码*/
char IDnumber[19];/*用户身份证号*/
float yue;/*账户余额*/
};
typedef struct
{
char account[16];/*交易的账号*/
char Ttime[50];/*交易时间*/
char type[5];/*交易类型*/
float Tmoney;/*交易金额*/
float Tyue;/*交易后的余额*/
} Transaction;/*交易记录的结构体*/
Transaction T[1000];/*定义交易记录的结构体数组,可以保存1000条交易记录*/
struct Customer C[100];/*定义账户的结构体数组,可以注册100个账户*/
int Cnum = 0;/*账户序号*/
int Tnum = 0; /*交易序号*/
int Dxiabiao = 0;/*当前登录的账户下标*/
函数
int menu(); /*声明主菜单函数*/
void help(); /*声明帮助函数*/
void zhuce(); /*声明注册函数*/
void denglu();/*声明登录函数*/
void load(); /*声明装载数据函数*/
void save(); /*声明保存数据函数*/
int denglu_menu(); /*声明登录菜单函数*/
void credit(); /*声明存款函数*/
void debit(); /*声明取款函数*/
void quary(); /*声明查询函数*/
void print(); /*声明打印函数*/
void updatepassword(); /*声明修改密码函数*/
int quary_menu();/*声明查询菜单函数*/
void quary_yue();/*声明查询余额函数*/
void quary_mingxi(); /*声明查询明细函数*/
void quary_credit();/*声明查询存款函数*/
void quary_debit(); /*声明查询取款函数*/
主函数
/**************************主函数***********************************/
void main()
{
system("color 3F");/*设置背景颜色为蓝色*/
printf("
****************************************************
");
printf("
*****欢迎使用ATM终端机!*****
");
printf("
****************************************************
");
system("pause");/*暂停功能*/
system("cls");/*清屏*/
for (;;)/*空循环语句*/
{
switch (menu()) /*主菜单选择判断*/
{
case 1:zhuce(); break;/*调用注册函数*/
case 2:denglu(); break;/*调用登录函数*/
case 3:load(); break;/*调用加载数据的函数*/
case 4:save(); break;/*调用保存数据的函数*/
case 5:help(); break;/*调用帮助函数*/
case 0:printf(" 欢迎使用ATM终端机管理系统。谢谢!
");
system("pause");
exit(0);/*结束程序*/
}
}
}
主菜单
/*********************定义主菜单函数*******************************/
int menu()
{
char c;
do
{
system("cls"); /*每次选择运行前清屏*/
printf("
**************************
");
printf(" **主菜单**
"); /*主菜单选择*/
printf(" **************************
");
printf(" --------------------------
");
printf(" **1. 注册**
");
printf(" **2. 登录**
");
printf(" **3. 加载数据**
");
printf(" **4. 保存数据**
");
printf(" **5. 系统帮助**
");
printf(" **0. 退出**
");
printf(" --------------------------
");
printf(" **************************
");
printf(" 请作出选择(0-5):");
c = getchar(); /*读入选择*/
} while (c < '0' || c>'5');
return(c - '0'); /*c变为空后返回重新选择*/
}
帮助函数
/***********************定义帮助函数*******************************/
void help()
{
system("cls");
printf("
******************************
");
printf("
*欢迎使用ATM机帮助功能*
");
printf("
*1.如有记录,先用加载功能*
");
printf("
*2.注册记得要保存数据*
");
printf("
*3.登录后可选择功能存款、取*
");
printf("
*款打印票据或查询*
");
printf("
*4.登录后可查询账户余额*
");
printf("
*注:一切操作切勿忘记保存*
");
printf("
******************************
");
system("pause");
}
注册
/********************定义注册函数***********************/
void zhuce()
{
int baiwei, shiwei, gewei, len;/*定义账号的后三位*/
char password2[7];/*注册时第二次输入的密码*/
int j = 0;
strcpy(C[Cnum].account, "123456543210");/*复制账号的前12位*/
baiwei = Cnum / 100;
shiwei = Cnum / 10 % 10;
gewei = Cnum % 10;
C[Cnum].account[12] = baiwei + '0';
C[Cnum].account[13] = shiwei + '0';
C[Cnum].account[14] = gewei + '0';
C[Cnum].account[15] = ' ';
system("cls");/*运行前清屏*/
printf("
注册————ZHUCE
");
printf(" 请输入姓名:");
scanf("%s", C[Cnum].name);
do
{
printf(" 请输入6位数密码:");
scanf("%s", C[Cnum].password);
len = strlen(C[Cnum].password);
if (len != 6)/*判断密码是否为6位*/
{
printf(" 您的密码不是6位数!
");
system("pause");
return;
}
//此处用字符串长度函数来判断密码的位数
printf(" 请再次输入密码:");
scanf("%s", password2);
if (strcmp(C[Cnum].password, password2) != 0)/*判断两次密码输入是否相同*/
{
j++;
printf("
您的密码输入错误!您还有%d次机会输入密码!
", 3 - j);
}
if (j == 3)/*密码输入错误不得超过三次*/
{
system("pause");
return;
}
} while (strcmp(C[Cnum].password, password2) != 0);
do
{
printf(" 请输入身份证号:");
scanf("%s", C[Cnum].IDnumber);
len = strlen(C[Cnum].IDnumber);
if (len != 18 && len != 15)/*判断身份证号位数是否为15位或18 位*/
printf(" 身份证号错误!请输入15位或18位身份证号!
");
} while (len != 18 && len != 15);
printf("
请输入存入金额:");
scanf("%f", &C[Cnum].yue);
if ((int)C[Cnum].yue % 50 != 0)/*存款金额必须为50的整数倍*/
{
printf(" 本机只接受50元或100元面值的存款!
");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Cnum].account);/**/
strcpy(T[Tnum].type,"存储");/*复制交易类型*/
T[Tnum].Tmoney = C[Cnum].yue;/*第一次交易的账户余额值赋给交易经额的值*/
T[Tnum].Tyue = C[Dxiabiao].yue;/*第一次交易的账户余额值赋给交易余额的值*/
printf("
开户成功!
");
system("pause");/*暂停功能*/
printf("
账号 交易类型 交易金额 余额
");/*输出账户第一次交易的数据清单*/
printf("%s", C[Cnum].account);
printf(" %s", T[Tnum].type);
printf(" %.2f", C[Cnum].yue);
printf(" %.2f", C[Cnum].yue);
printf("
");
Cnum++;/*账户序号加一*/
Tnum++;/*交易序号加一*/
Dxiabiao++;
system("pause");/*暂停*/
}
登录
/********************定义登录函数**************************/
void denglu()
{
char account[16], password[7];/*登录时输入的账号和密码*/
int i = 0, j = 0;
system("cls");/*清屏*/
printf("
登录————DENGLU
");/*进入登录得功能界面*/
printf(" 输入账号:");
scanf("%s", account);/*输入账号*/
for (i = 0; i < Cnum; i++)/*在已注册的账号中依次寻找该账号*/
if (strcmp(account, C[i].account) == 0)
{
Dxiabiao = i;/*若找到,则跳出循环*/
break;
}
if (i == Cnum)/*注册的账号中没输入的账号*/
{
printf("
当前账号不存在!
");
system("pause");
return;
}
do
{
printf("
输入密码:");
scanf("%s", password);
if (strcmp(password, C[i].password) != 0)
{
j++;
printf(" 您的密码输入错误!您还有%d次机会输入密码!
", 3 - j);
}
if (j == 3)/*密码输入错误不得超过三次*/
{
printf("
此卡已被锁定,请到工作人员处解锁。
");
system("pause");
return;
}
} while (strcmp(password, C[i].password) != 0);
for (;;)/*空循环语句*/
{
switch (denglu_menu()) /***登陆界面选择判断***/
{
case 1:credit(); break;/*调用存款函数*/
case 2:debit(); break;/*调用取款函数*/
case 3:quary(); break;/*调用查询函数*/
case 4:updatepassword(); break;/*调用修改密码函数*/
case 5:print(); break; /*调用打印函数*/
case 0:return;/*返回上一级菜单界面*/
}
}
}
加载函数
/********************定义登录函数**************************/
void denglu()
{
char account[16], password[7];/*登录时输入的账号和密码*/
int i = 0, j = 0;
system("cls");/*清屏*/
printf("
登录————DENGLU
");/*进入登录得功能界面*/
printf(" 输入账号:");
scanf("%s", account);/*输入账号*/
for (i = 0; i < Cnum; i++)/*在已注册的账号中依次寻找该账号*/
if (strcmp(account, C[i].account) == 0)
{
Dxiabiao = i;/*若找到,则跳出循环*/
break;
}
if (i == Cnum)/*注册的账号中没输入的账号*/
{
printf("
当前账号不存在!
");
system("pause");
return;
}
do
{
printf("
输入密码:");
scanf("%s", password);
if (strcmp(password, C[i].password) != 0)
{
j++;
printf(" 您的密码输入错误!您还有%d次机会输入密码!
", 3 - j);
}
if (j == 3)/*密码输入错误不得超过三次*/
{
printf("
此卡已被锁定,请到工作人员处解锁。
");
system("pause");
return;
}
} while (strcmp(password, C[i].password) != 0);
for (;;)/*空循环语句*/
{
switch (denglu_menu()) /***登陆界面选择判断***/
{
case 1:credit(); break;/*调用存款函数*/
case 2:debit(); break;/*调用取款函数*/
case 3:quary(); break;/*调用查询函数*/
case 4:updatepassword(); break;/*调用修改密码函数*/
case 5:print(); break; /*调用打印函数*/
case 0:return;/*返回上一级菜单界面*/
}
}
}
保存函数
/***********************定义保存数据函数**************************/
void save()
{
FILE* fp;/*文件指针*/
int i;
char Fname[13];
printf(" 请输入文件名(输入格式为:文件名.txt):");
scanf("%s", Fname);/*输入要保存的文件名*/
if ((fp = fopen(Fname, "w")) == NULL)
{
printf("
无法打开文件!
");
system("pause");
return;
}
fprintf(fp, "%d
", Cnum);
fprintf(fp, "账号 姓名 密码 身份证号 余额
");
for (i = 0; i < Cnum; i++)/*把账户信息依次输出到指定文件*/
fprintf(fp, "%-16s%-9s%-7s%-19s%-12.2f
",
C[i].account, C[i].name, C[i].password, C[i].IDnumber, C[i].yue);
fprintf(fp, "%d
", Tnum);
fprintf(fp, "账号 交易类型 交易金额 交易余额
");
for (i = 0; i < Tnum; i++)/*把交易记录的信息依次输出到指定文件*/
fprintf(fp, "%-16s %-5s %-12.2f %-12.2f
",
T[i].account, T[i].type, T[i].Tmoney, T[i].Tyue);
fclose(fp);/*关闭文件*/
printf("
保存成功!
");
system("pause");
}
登录函数
/**********************定义登录菜单函数**************************/
int denglu_menu()
{
char c;
do
{
system("cls"); /*每次选择运行前清屏*/
printf("
*********欢迎进入 登录界面!*********
"); /*登录界面菜单选择*/
printf(" * 1. 存款
");
printf(" * 2. 取款
");
printf(" * 3. 查询
");
printf(" * 4. 修改密码
");
printf(" * 5. 打印票据
");
printf(" * 0. 返回
");
printf(" *****************************************
");
printf(" 请作出选择(0-5):");
c = getchar(); /*读入选择*/
} while (c < '0' || c>'5');
return(c - '0'); /*c变为空后返回重新选择*/
}
打印函数
/**********************定义打印函数******************************/
void print()
{
FILE* file;
int i;
if ((file = fopen("票据.txt", "w")) == NULL)
{
printf(" 无法打开该文件!");
system("pause");
return;
}
fprintf(file, "**********************************
");
for (i = 0; i < Tnum; i++)
if (strcmp(T[i].account, C[Dxiabiao].account) == 0)
{
fprintf(file, "** 交易类型:");
fprintf(file, " %s
", T[i].type);
fprintf(file, "** 交易金额:");
fprintf(file, " %.2f
", T[i].Tmoney);
fprintf(file, "** 交易余额:");
fprintf(file, " %.2f
", T[i].Tyue);
fprintf(file, "** 您的账号:");
fprintf(file, " %s
", T[i].account);
}
fprintf(file, "**********************************
");
fclose(file);/*关闭文件*/
printf(" 打印成功!
");
system("pause");
}
存款函数
/*************************定义存款函数***********************/
void credit()
{
float money;/*输入的存款金额*/
system("cls");/*清屏*/
printf("
存款————credit
");/*进入存款功能界面*/
printf(" 本机只接收50元或100元币值人民币!
");/*提示信息*/
printf("
请输入存款金额:");
scanf("%f", &money);/*输入存款金额*/
if ((int)money % 50 != 0 || money <= 0)/*存款金额必须为50的整数倍且为正数*/
{
printf("
请输入面值为50或100的存款金额!请勿输入负数或0!
");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Dxiabiao].account);/*把当前登录账号复制给交易记录里的账号*/
strcpy(T[Tnum].type, "存款");/*复制交易类型*/
T[Tnum].Tmoney = money;/*把存款金额赋给交易金额*/
C[Dxiabiao].yue += T[Tnum].Tmoney;/*计算存款后的账户余额*/
T[Tnum].Tyue = C[Dxiabiao].yue;/*交易后的余额等于账户余额*/
printf("
存款成功!");
system("pause");
printf("
账号 交易类型 交易金额 交易余额
");//输出账户存款交易的数据清单
printf("%s", T[Tnum].account);
printf(" %s", T[Tnum].type);
printf(" %.2f", T[Tnum].Tmoney);
printf(" %.2f", T[Tnum].Tyue);
printf("
");
Tnum++;/*交易序号加一*/
system("pause");
}
取款
/***********************定义取款函数**************************/
void debit()
{
float money;/*定义取款金额*/
system("cls");/*清屏*/
printf("
取款————debit
");/*进入取款功能界面*/
printf(" 本机只可取50或100元币值人民币!
");
printf("
请输入取款金额:");
scanf("%f", &money); /*输入取款金额*/
if (money > C[Dxiabiao].yue)/*账户余额是否足够取款*/
{
printf("
您的余额不足!
");
system("pause");
return;
}
if ((int)money % 50 != 0 || money <= 0)/*取款金额必须为50的整数倍且为正数*/
{
printf("
请输入面值为50或100的存款金额!请勿输入负数或0!
");
system("pause");
return;
}
strcpy(T[Tnum].account, C[Dxiabiao].account);/*把当前登录账号复制给交易记录里的账号*/
strcpy(T[Tnum].type, "取款");/*复制交易类型*/
T[Tnum].Tmoney = money;/*取款金额值赋给交易金额*/
C[Dxiabiao].yue -= T[Tnum].Tmoney;/*计算取款后的账户余额*/
T[Tnum].Tyue = C[Dxiabiao].yue;/*取款后余额等于账户余额*/
printf("
取款成功!
");
system("pause");
printf("
账号 交易类型 交易金额 交易余额
");//输出账户和交易的数据清单
printf("%s", T[Tnum].account);
printf(" %s", T[Tnum].type);
printf(" %.2f", T[Tnum].Tmoney);
printf(" %.2f", T[Tnum].Tyue);
printf("
");
Tnum++;/*交易序号加一*/
system("pause");
}
修改密码
/****************************定义修改密码函数****************************/
void updatepassword()
{
char password[7], newpassword1[7], newpassword2[7];
int j = 0;
printf("
请输入原来的密码:");
scanf("%s", password);/*输入旧密码*/
if (strcmp(password, C[Dxiabiao].password) != 0)/*判断旧密码正确与否*/
{
printf("
您的密码输入错误!
");
system("pause");
return;
}
do
{
printf("
请输入新密码:");
scanf("%s", newpassword1);
printf("
请再一次输入新密码:");/*输入两次新密码*/
scanf("%s", newpassword2);
if (strcmp(newpassword1, newpassword2) != 0)/*判断输入的两次新密码是否相等*/
{
j++;
printf("
您的密码输入错误!您还有%d次机会输入密码!
", 3 - j);
}
if (j == 3)/*新密码输入错误不得超过三次*/
{
printf("密码修改未成功!
");
system("pause");
return;
}
} while (strcmp(newpassword1, newpassword2) != 0);
strcpy(C[Dxiabiao].password, newpassword1);/*拷贝新密码到账户信息里*/
printf("
您的密码修改成功!
");
system("pause");
return;
}
查询
/**********************定义查询函数****************************************/
void quary()
{
for (;;)/*空循环语句*/
{
switch (quary_menu()) /*查询界面选择判断*/
{
case 1:quary_yue(); break;/*调用查询余额函数*/
case 2:quary_mingxi(); break; /*调用查询明细函数*/
case 3:quary_credit(); break; /*调用查询存款函数*/
case 4:quary_debit(); break;/*调用查询取款函数*/
case 0:return;
}
}
}
/*************************定义查询菜单函数**********************************/
int quary_menu()
{
char c;
do
{
system("cls"); /*每次选择运行前清屏*/
printf("
*********欢迎进入 查询界面!*********
"); /*查询界面菜单选择*/
printf(" *| 1. 查询余额 |
");
printf(" *| 2. 查询明细 |
");
printf(" *| 3. 查询存款 |
");
printf(" *| 4. 查询取款 |
");
printf(" *| 0. 返回 |
");
printf(" *****************************************
");
printf(" 请作出选择(0-4):");
c = getchar(); /*读入选择*/
} while (c < '0' || c>'4');
return(c - '0'); /*c变为空后返回重新选择*/
}
/**************************定义查询余额函数**********************************/
void quary_yue()
{
printf("
这是查询余额功能
");
printf(" 您的账户余额为:%.2f
", C[Dxiabiao].yue);/*输出账户余额*/
system("pause");
}
/*************************定义查询明细函数***********************************/
void quary_mingxi()
{
int i;
system("cls");/*清屏*/
printf("
查询明细————quary MINGXI
");/*进入查询明细界面*/
printf("
您的账号:%s", C[Dxiabiao].account);
printf("
交易类型 交易金额 交易余额
");//输出账户和交易的数据清单
for (i = 0; i < Tnum; i++)
if (strcmp(T[i].account, C[Dxiabiao].account) == 0)
{
printf(" %s", T[i].type);
printf(" %.2f", T[i].Tmoney);
printf(" %.2f", T[i].Tyue);
printf("
");
}
system("pause");
}
/**************************定义查询存款函数***********************************/
void quary_credit()
{
int i;
system("cls");
printf("
查询存款————quary credit
");
printf("
您的账号:%s", C[Dxiabiao].account);
printf("
交易类型 交易金额 交易余额
");//输出账户和交易的数据清单
for (i = 0; i < Tnum; i++)
if (strcmp(T[i].account, C[Dxiabiao].account) == 0 && strcmp(T[i].type, "存款") == 0)
{
printf(" %s", T[i].type);
printf(" %.2f", T[i].Tmoney);
printf(" %.2f", T[i].Tyue);
printf("
");
}
system("pause");
}
/**************************定义查询取款函数***********************************/
void quary_debit()
{
int i;
system("cls");
printf("
查询取款————quary debit
");
printf("
您的账号:%s", C[Dxiabiao].account);
printf("
交易类型 交易金额 交易余额
");//输出账户和交易的数据清单
for (i = 0; i < Tnum; i++)/*输出存款记录*/
if (strcmp(T[i].account, C[Dxiabiao].account) == 0 && strcmp(T[i].type, "取款") == 0)
{
printf("%s", T[i].type);
printf(" %.2f", T[i].Tmoney);
printf(" %.2f", T[i].Tyue);
}
printf("
");
system("pause");
}
运行截图
四、个人小结
1.psp表格
psp2.1 | 任务内容 | 计划完成需要的时间(min)| 实际完成需要的时间(min) |
- | :-: | :-: | :-: | -:
Planing |计划 |200 |400 |
Estimate |估计这个任务需要多少时间,
并规划大致工作步骤 |500 | 300 |
Development |开发| 200| 200|
Analysis |需求分析(包括学习新技能)|150|100|
Design Spec|生成设计文档|15|25|
Design Review|设计审核|20|10|
Coding Standard|代码规范|10|15|
Design|具体设计|50|60|
Coding|具体编码|500|400|
Code Review|代码复核|30|20|
Test|测试(自我测试,修改代码
提交修改)|50|50|
Reporting|报告|30|30|
Test Report|测试报告|25|40|
Size Measurement|计算工作量|30|25|
Postmortem & Process
Improvement|事后总结,并提出过程修改计划|30|25|
2、个人小结
对于我个人来说,如果在编程过程中没有与文件相关的知识来说相对编程的过程会轻松些,如果有与文件相关的函数或调用会感觉到很麻烦且费事。经过这次编程让我体会到对于C语言中任然有不够熟练的部分,因此还需要继续学习,不能因为感觉自己掌握了,会了就不去学习了。