*项目名称:储蓄综合业务平台
*项目完成人:刘镇
* Copyright (c) 2012, 烟台大学计算机学院学生
* All rights reserved.
* 完成日期: 2012 年 1 月 4日
* 版 本 号: 2.002
* 对项目描述部分及心得:
/*1、需求分析:。。。
/*2、概要设计:。。。
/*3、详细设计:。。。
/*4、编码实现:
bank.h:
void welcome(); //显示欢迎信息
void mainmenu(); //系统主菜单
void openAnAccount(); //开户
void closeAnAccount(); //销户
void deposit(); //存款
void withdraw(); //取款
void query(); //查询
int findAnAccount(int accNumber); //查找一个账户在数组中的位置
void dispAnAccount(int i); //显示一个账户的信息
int createAccNumber(); //生成账号
int checkInput(int flag, char *cheakStr); //检查输入的用户名、密码、存入金额、是否合法
void queryall(); //显示所有账户
void getaccName(char accName[]); //得到录入的户名
void getaccPWD(char accPWD[]); //得到录入的密码
double getcash(int); //得到录入金额
int getaccNumber(int flag); //得到录入账号
#define N_MAXREC_NO 100 //文件最大行数
#define MAXLINE 256 //行最大长度
struct record
{
int accNumber; //账号
char accName[9]; //户名
char accPWD[7]; //密码
double balance; //余额
char flag[2]; //销户标志
};
typedef struct record RECORD; //类型定义
RECORD rs[N_MAXREC_NO];
int maxAccount = -1;
bank.cpp:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string>
#include<conio.h>
#include"bank.h"
main()
{
char userName[9];
char userPWD[7];
int i;
welcome();
for(i = 0; i < 3; i++)
{
printf( "\n" );
printf( "请输入您用的用户名:" );
scanf( "%s", userName);
fflush( stdin );
printf("\n请输入您的密码:");
scanf("%s", userPWD);
fflush( stdin );
if((strcmp(userName, "admin" ) == 0) && (strcmp(userPWD, "admin") == 0))
{
mainmenu();
}
else
{
if(i < 2)
{
printf("用户名或密码输入错误,请重新输入!");
}
else
{
printf("连续输错用户名或密码,退出系统!");
}
}
}
}
void welcome() //欢迎界面
{
printf("+--------------------------------------+\n");
printf("| |\n");
printf("| 欢迎使用储蓄综合业务平台 |\n");
printf("| |\n");
printf("+--------------------------------------+\n");
}
void mainmenu()
{
int choice;
choice = -1;
do
{
printf("\n");
printf("+---------------------------------+\n");
printf("| 存款 请按 1 开户 请按 4 |\n");
printf("| 取款 请按 2 销户 请按 5 |\n");
printf("| 查询 请按 3 退出 请按 0 |\n");
printf("+---------------------------------+\n");
printf("请输入您的选择:");
scanf("%d", &choice);
fflush(stdin);
switch(choice)
{
case 0:
exit(0);
case 1:
deposit();
break;
case 2:
withdraw();
break;
case 3:
query();
break;
case 4:
openAnAccount();
break;
case 5:
closeAnAccount();
break;
case 6:
queryall();
break;
default:
printf("\n无效选项!");
break;
}
}while(choice != 0);
}
//开户功能:
void openAnAccount()
{
int accNumber; //账户
char accName[9]; //户名
char accPWD[7]; //密码
double cash; //存入金额
accNumber = 0;
memset(accName, 0, sizeof(accName));
memset(accPWD, 0, sizeof(accPWD));
cash = 0;
accNumber = createAccNumber(); //生成账号
getaccName(accName); //获得账户名称
getaccPWD(accPWD); //获得账户密码
cash = getcash(0); //获取存入金额
maxAccount++;
rs[maxAccount].accNumber = accNumber;
strcpy(rs[maxAccount].accName, accName);
strcpy(rs[maxAccount].accPWD, accPWD);
rs[maxAccount].balance = cash;
strcpy(rs[maxAccount].flag, "0");
dispAnAccount(maxAccount); //显示账户信息
printf("开户成功!按任意键返回主菜单...");
getch();
return;
}
void dispAnAccount(int i) //显示用户信息
{
printf("+-------------------------------------------------+\n");
printf("| %-5s | %-8s | %-6s | %-12s | %4s |\n","账号","户名", "密码", "余额", "状态");
printf("+-------+----------+--------+--------------+------+\n");
printf("| %5d | %-8s | %-6s | %12.2f | %4s |\n", rs[i].accNumber, rs[i].accName, rs
[i].accPWD, rs[i].balance, atoi(rs[i].flag)?"销户":"正常");
printf("+-------------------------------------------------+\n");
}
int createAccNumber() //自动生成账号
{
if(maxAccount == -1)
{
return 10001; //账号从此开始
}
else
{
return rs[maxAccount].accNumber + 1;
}
}
void getaccName(char accName[]) //获取账户名称
{
char caccName[100]; //户名
int i = 1;
while(i)
{
memset(caccName, 0, sizeof(caccName));
printf("\n");
printf("请输入储户户名:");
scanf("%s", caccName);
fflush(stdin);
if(checkInput(0, caccName))
{
printf("超过位的最大户名长度!\n");
continue;
}
i = 0;
}
memcpy(accName, caccName, 9);
}
void getaccPWD(char accPWD[]) //获取帐户密码
{
char caccPWD[100]; //密码
int i = 1;
while(i)
{
memset(caccPWD, 0, sizeof(caccPWD));
printf("\n");
printf("请输入储户密码:");
scanf("%s", caccPWD);
fflush(stdin);
if(checkInput(1, caccPWD))
{
printf("超过位的最大密码长度!\n");
continue;
}
i = 0;
}
memcpy(accPWD, caccPWD, 7);
}
double getcash(int flag) //获取金额
{
char ccash[100]; //金额
double dcash;
int i = 1;
while(i)
{
memset(ccash, 0, sizeof(ccash));
dcash = 0;
printf("\n");
switch(flag)
{
case 0:
printf("请输入存入金额:");
break;
case 1:
printf("请输入取款金额:");
break;
}
scanf("%lf", &dcash);
fflush(stdin);
sprintf(ccash, "%12.2f", dcash);
if(checkInput(2, ccash))
{
printf("登入的金额超过位的最大存入(取出)金额长度!\n");
continue;
}
if(dcash <= 0)
{
printf("输入金额为0或负数!输入无效!\n");
continue;
}
i = 0;
}
return dcash;
}
int checkInput(int flag, char *checkStr) //核对输入的帐户信息是否规范
{
switch(flag)
{
case 0: //检查户名是否超过最大长度
{
if(strlen(checkStr) > 8)
{
return 1;
}
break;
}
case 1: //检查密码是否超过最大长度
{
if(strlen(checkStr) > 6)
{
return 1;
}
break;
}
case 2: //检查存入金额是否超过最大长度
{
if(strlen(checkStr) > 12)
{
return 1;
}
break;
}
default:
return 0;
}
return 0;
}
//存款功能:
void deposit() //显示帐户信息,并检查账户是否已注销
{
int accNumber;
int accountPosition;
double cash;
accNumber = 0;
accountPosition = -1; //表示未找到
cash = 0;
accNumber = getaccNumber(0); //获取存款账号
accountPosition = findAnAccount(accNumber); //查找该帐户
if(accountPosition == -1)
{
printf("查无此帐户,按任意键返回...");
getch();
return;
}
dispAnAccount(accountPosition); //显示帐户信息
if(strcmp(rs[accountPosition].flag, "0") != 0)
{
printf("该帐户已经注销,不能存款!按任意键返回...");
getch();
return;
}
cash = getcash(0);
rs[accountPosition].balance = rs[accountPosition].balance + cash;
dispAnAccount(accountPosition);
printf("存款成功!按任意键返回...");
getch();
}
int getaccNumber(int flag) //获取账号
{
int iaccNumber; //账号
iaccNumber = 0;
printf("\n");
switch(flag)
{
case 0:
printf("请输入要存款的账号:");
break;
case 1:
printf("请输入要取款的账号:");
break;
case 2:
printf("请输入要销户的账号:");
break;
case 3:
printf("请输入要查询的账号:");
break;
}
scanf("%d", &iaccNumber);
fflush(stdin);
return iaccNumber;
}
int findAnAccount(int accNumber) //查找帐户
{
int accountPosition; //帐户在数组中的位置
//int i;
accountPosition = -1;
//for(i = 0; i <= maxAccount; i++)
//{
// if(rs[i].accNumber == accNumber)
// {
// accountPosition = i;
// break;
// }
//}
if(accNumber >= 10001 && accNumber <= rs[maxAccount].accNumber )
{
accountPosition = accNumber -10001;
}
return accountPosition;
}
//取款功能:
void withdraw()
{
int accNumber;
int accountPosition;
double cash;
char accPWD[7];
accNumber = 0;
accountPosition = -1; //未找到
cash = 0;
memset(accPWD,0,sizeof(accPWD)); //初始化
accNumber = getaccNumber(1); //获取取款账号
getaccPWD(accPWD); //获取取款密码
accountPosition = findAnAccount(accNumber); //查找该帐户
if(accountPosition == -1)
{
printf("查无此帐户,按任意键退出...");
getch();
return;
}
if(strcmp(rs[accountPosition].flag, "0") != 0)
{
printf("该帐户已经注销,不能取款!按任意键返回...");
getch();
return;
}
if(strcmp(rs[accountPosition].accPWD, accPWD) != 0)
{
printf("\n密码不正确!按任意键返回...");
getch();
return;
}
dispAnAccount(accountPosition); //显示帐户信息
cash = getcash(1);
if(cash > rs[accountPosition].balance)
{
printf("\n帐户余额不足!按任意键返回...");
getch();
return;
}
rs[accountPosition].balance = rs[accountPosition].balance - cash;
dispAnAccount(accountPosition);
printf("取款成功!按任意键返回...");
getch();
}
//查询功能:
void query()
{
int accNumber;
char accPWD[7];
int accountPosition;
accountPosition = -1;
accNumber = 0;
memset(accPWD, 0, sizeof(accPWD));
accNumber = getaccNumber(3);
getaccPWD(accPWD);
accountPosition = findAnAccount(accNumber);
if(accountPosition == -1)
{
printf("查无此帐户,按任意键返回...");
getch();
return;
}
if(strcmp(rs[accountPosition].accPWD, accPWD) != 0)
{
printf("\n密码不正确!按任意键返回...");
getch();
return;
}
if(strcmp(rs[accountPosition].flag, "0") != 0)
{
printf("\n该帐户已经销户!按任意键返回...");
getch();
return;
}
dispAnAccount(accountPosition); //显示帐户信息
printf("\n查询成功!按任意键返回...");
getch();
return;
}
//销户功能:
void closeAnAccount()
{
int accNumber;
char accPWD[7];
char userAnswer;
int accountPosition;
accountPosition = -1;
accNumber = 0;
memset(accPWD, 0, sizeof(accPWD));
accNumber = getaccNumber(2); //获取要销户的账号
getaccPWD(accPWD); //获取要销户密码
accountPosition = findAnAccount(accNumber); //查找该帐户
if(accountPosition == -1)
{
printf("查无此帐户,按任意键返回...");
getch();
return;
}
dispAnAccount(accountPosition);
if(strcmp(rs[accountPosition].accPWD, accPWD) != 0)
{
printf("\n密码不正确!按任意键返回...");
getch();
return;
}
if(strcmp(rs[accountPosition].flag, "0") != 0)
{
printf("该帐户已经销户,不能再次销户,按任意键返回...");
getch();
return;
}
printf("确认将帐户 %d 销户吗? [1:销户 | 其他:不销户]",rs[accountPosition].accNumber);
scanf("%c", &userAnswer);
fflush(stdin);
if(userAnswer == '1')
{
strcpy(rs[accountPosition].flag, "1");
rs[accountPosition].balance = 0;
dispAnAccount(accountPosition);
printf("销户成功!按任意键返回...");
getch();
return;
}
printf("用户取消销户!按任意键返回...");
getch();
return;
}
void queryall()
{
int i;
if(maxAccount == -1)
{
printf("不存在用户!按任意键返回...");
getch();
return;
}
for(i = 0; i <= maxAccount; i++)
{
dispAnAccount(i);
}
printf("按任意键返回...");
getch();
return;
}
/*5、测试:
/*6、心得经验:
通过项目的初次尝试,在软件工程理论指导下,对于专业知识又有了更深层理解,明白对于专业素质的培养是极其重要的,有好的职业素养,才会在大的项目中保持清醒的头脑,否则,便会陷入自己所设下的陷阱中,并很难以发现。通过做项目,进一步熟悉了一个完整的项目应该有的具体流程,在每一个流程中应该具体什么,并且将这一阶段一来学到的c++知识如数组,结构体,函数及自定义函数,循环判断结构等加以组合运用,对原来理解有误的地方也能通过在对代码的反复阅读中加以修正,使自己有了些许提高。
团队合作在此次项目中虽然并不太明显,但再将各自任务组合后加调试,如果没有小组合作,很难将程序调试很好,而经过大家的测试后,不仅是自己对自己编写的内容有了了解,而且通过组内交流,大家对程序的总体认识有进一步加深。
在知识方面,以前在课本中见到过的在本项目中多有涵盖,而在整体组合运用时,体会到整体意识的重要,在编写时,如果只考虑一部分,一小段函数,很难解决问题,但将问题拆分开,对小部分功能暂时不考虑,只是构建总体框架,而编写完成后,在进一步加工每一部分。
最后想讲的重要收获是:在理解并有清晰思路的前提下编写比迅速编写而实际并不太理解的编写更有效率和效果,因此在做之前,能画一下流程图是很有必要的。